使用LangChain工具时CrewAI报错:输入需为有效字典或BaseTool实例
解决CrewAI兼容LangChain DuckDuckGoSearchResults工具的ValidationError问题
问题场景
用CrewAI框架搭建AI代理团队时,尝试给researcher代理引入LangChain的DuckDuckGoSearchResults工具,运行代码后触发Pydantic的ValidationError,报错提示Input should be a valid dictionary or instance of BaseTool。
报错原因
CrewAI的Agent类对传入的tools参数有类型限制,要求必须是CrewAI自身的BaseTool子类实例,而LangChain的Tool类和CrewAI的BaseTool不属于同一继承体系,直接传入会触发类型校验失败。
解决方案
自定义一个继承自CrewAI BaseTool的包装类,将LangChain的DuckDuckGoSearchResults工具封装进去,使其符合CrewAI的工具规范。
步骤1:导入CrewAI的BaseTool
在代码开头添加导入:
from crewai_tools import BaseTool
步骤2:编写包装类
创建一个包装类,实现_run方法调用LangChain工具的运行逻辑:
class DuckDuckGoSearchCrewTool(BaseTool): name: str = "DuckDuckGo搜索工具" description: str = "使用DuckDuckGo进行互联网搜索,获取最新的公开信息,适用于查找行业趋势、技术进展等内容" def _run(self, query: str) -> str: # 调用LangChain工具的run方法 return DuckDuckGoSearchResults().run(query)
步骤3:替换工具实例
把原来的duckduckgo_search = DuckDuckGoSearchResults()替换成包装后的工具实例:
duckduckgo_search = DuckDuckGoSearchCrewTool()
修改后的完整代码
import os from crewai import Agent, Task, Crew, Process from crewai_tools import BaseTool from langchain_community.tools import DuckDuckGoSearchResults os.environ["OPENAI_API_KEY"] = 'your-api-key' os.environ["OPENAI_API_BASE"] = 'your-api-base' os.environ["OPENAI_MODEL_NAME"] ='gpt-4o' # 包装LangChain的DuckDuckGo搜索工具为CrewAI兼容的BaseTool class DuckDuckGoSearchCrewTool(BaseTool): name: str = "DuckDuckGo搜索工具" description: str = "使用DuckDuckGo进行互联网搜索,获取最新的公开信息,适用于查找AI行业趋势、技术进展等内容" def _run(self, query: str) -> str: return DuckDuckGoSearchResults().run(query) duckduckgo_search = DuckDuckGoSearchCrewTool() # 定义代理 researcher = Agent( role='高级研究分析师', goal='揭示AI和数据科学的前沿发展', backstory="""您在一家领先的科技智库工作。 您的专长在于识别新兴趋势。 您擅长剖析复杂数据并提供可行的见解。""", verbose=True, allow_delegation=False, tools=[duckduckgo_search] ) writer = Agent( role='技术内容策略师', goal='撰写引人入胜的科技进展内容', backstory="""您是一位著名的内容策略师,以深刻且引人入胜的文章而闻名。 您将复杂概念转化为引人注目的叙述。""", verbose=True, allow_delegation=True ) # 创建任务 task1 = Task( description="""对2024年AI的最新进展进行全面分析。 确定关键趋势、突破性技术和潜在行业影响。""", expected_output="完整的分析报告,以要点形式呈现", agent=researcher ) task2 = Task( description="""根据提供的见解,撰写一篇引人入胜的博客 文章,突出最重要的AI进展。 您的文章应信息丰富且易于理解,适合科技爱好者。 让它听起来酷一些,避免复杂的词汇,以免听起来像AI写的。""", expected_output="至少4段的完整博客文章", agent=writer ) # 实例化团队并执行 crew = Crew( agents=[researcher, writer], tasks=[task1, task2], verbose=True, process = Process.sequential ) result = crew.kickoff() print("######################") print(result)
验证说明
修改后,LangChain的DuckDuckGo搜索工具会被包装成CrewAI认可的BaseTool实例,通过Pydantic的类型校验,代理可以正常调用该工具完成搜索任务。
内容的提问来源于stack exchange,提问作者Timivers
相关产品推荐
相关产品推荐

