文章目录
-
- 1. MetaGPT = 0.5.2 版本的坑
-
- 1.1 坑一:cannot import name "ActionNode" from "metagpt.actions.action"
- 1.2 坑二:simple_fill 没有参数 schema
- 1.3 坑三:ActionNode一直在循环执行,
- 2. 升级成 MetaGPT GitHub最新源码(2024-01-16)之后的坑
-
- 2.1 坑一:no attribute '_rc'
- 2.2 坑二:no attribute '_states'
- 2.3 坑三:'gpt-4-1106-preview' does not exist or you do not have access to it
- 2.4 坑四:A non-annotated attribute was detected: 'input_num = 0'
上篇文章 【AI的未来 - AI Agent系列】【MetaGPT】4. ActionNode从理论到实战 中我们学习了MetaGPT中ActionNode的理论和基本用法,跑通了一个简单程序。
原理和代码实现都很简单,但是谁知道当时我遇到了多少坑… 本文带你看看我在上文中遇到的坑,希望能帮到你!
下面说下我遇到的坑:
1. MetaGPT = 0.5.2 版本的坑
听信了官方教程中的MetaGPT版本推荐,我之前的学习和实战都使用了0.5.2版本,所以一开始,ActionNode的学习也使用的此版本。
1.1 坑一:cannot import name “ActionNode” from “metagpt.actions.action”
- 不知道为什么0.5.2版本无法从"metagpt.actions.action"导入ActionNode,看源码中,action_nodes.py是存在的
- 解决方案:改为从 metagpt.actions.action_node 导入 ActionNode
# from metagpt.actions.action import Action, ActionNode from metagpt.actions.action import Action from metagpt.actions.action_node import ActionNode
1.2 坑二:simple_fill 没有参数 schema
- 查看0.5.2版本的源码,simple_fill 的输入参数还叫 ‘to’,不叫 ‘schema’
- 解决方案:schema 改为 to
# child = await i.simple_fill(schema=schema, mode=mode) child = await i.simple_fill(to=schema, mode=mode)
1.3 坑三:ActionNode一直在循环执行,
如下图:一直在输出,这个都是ActionNode内的打印。
这个坑,是在ActionNode中循环,退不到我的代码中,所以我无从下手解决。促使了我升级到最新github代码… 后来我在高版本中遇到类似问题,好像是因为结果校验不通过,触发了重试。
2. 升级成 MetaGPT GitHub最新源码(2024-01-16)之后的坑
2.1 坑一:no attribute ‘_rc’
- 从0.6版本开始,_rc这种成员变量都换成了不带下划线的:‘rc’
- 解决方案:将 ‘_rc’ 全部换成 ‘rc’
2.2 坑二:no attribute ‘_states’
- 解决方法同’rc’,将’_states’ 改为 ‘states’
2.3 坑三:‘gpt-4-1106-preview’ does not exist or you do not have access to it
- 原因:前面讲过,MetaGPT读取配置的顺序:key.yaml > config.yaml > 环境变量。当我升级到github最新代码,源码编译后,源码中存在了config.yaml文件,里面默认的配置是gpt4。MetaGPT默认使用了config.yaml,我的环境变量便被忽略了。
- 解决方案:在config.yaml中设置自己的配置。或者新建一个key.yaml来写自己的配置
2.4 坑四:A non-annotated attribute was detected: ‘input_num = 0’
这个是因为升级0.6版本后,0.6版本的校验更加严格,这类内的成员变量必须显式声明类型,否则会报错。
- 解决方案
class SimplePrint(Action): input_num: int = 0 ######## <------ 加上这一句,显式声明变量类型 def __init__(self, name="SimplePrint", input_num:int=0): super().__init__() self.input_num = input_num
还有几个坑忘记截图了… 不过上面也基本够了,应该能帮你省不少事儿~~~