能否将StructuredTool与任意Agent(如ZeroShotAgent)配合使用?
解决LangChain中StructuredTool与Agent的兼容性问题
针对你遇到的StructuredTool无法直接传入ZeroShotAgent等接受Tool[]类型参数的Agent的问题,有以下几种可行方案:
1. 类型断言快速绕过类型检查
如果你的StructuredTool在运行时已经具备Tool的核心接口(name、description、call方法),可以直接用TypeScript类型断言强制转换,快速解决类型不兼容问题:
export class SupabaseToolkit extends Toolkit { tools: Tool[]; cli: SupabaseClient dialect = "supabase" constructor(cli: SupabaseClient) { super() this.cli = cli this.tools = [ new QuerySupabaseTool(cli), new ListTablesSupabaseTool(cli), new ListFieldsSupabaseTool(cli), // 类型断言转换 new QuerySpecificFieldSupabaseTool(cli) as Tool, ] } }
2. 手动包装StructuredTool为标准Tool
如果需要更严谨的适配,可通过Tool.fromFunction将结构化工具的逻辑包装为标准Tool,同时处理输入字符串到结构化参数的解析:
import { Tool } from "langchain/tools"; import { StructuredTool } from "langchain/tools/structured"; // 定义通用包装函数 function wrapStructuredTool(structuredTool: StructuredTool): Tool { return Tool.fromFunction({ name: structuredTool.name, description: structuredTool.description, func: async (input: string) => { // 将Agent传递的字符串输入解析为结构化参数(通常为JSON格式) const params = JSON.parse(input); return structuredTool.call(params); }, }); } export class SupabaseToolkit extends Toolkit { tools: Tool[]; cli: SupabaseClient dialect = "supabase" constructor(cli: SupabaseClient) { super() this.cli = cli this.tools = [ new QuerySupabaseTool(cli), new ListTablesSupabaseTool(cli), new ListFieldsSupabaseTool(cli), // 使用包装后的工具 wrapStructuredTool(new QuerySpecificFieldSupabaseTool(cli)), ] } }
3. 更换为原生支持结构化工具的Agent
ZeroShotAgent这类传统Agent设计更偏向单输入工具,推荐换用OpenAIFunctionsAgent这类原生支持多输入结构化工具的Agent类型,无需额外转换即可直接使用StructuredTool:
import { OpenAIFunctionsAgent } from "langchain/agents"; import { ChatOpenAI } from "langchain/chat_models/openai"; // 初始化大模型 const llm = new ChatOpenAI({ modelName: "gpt-3.5-turbo-16k" }); // 初始化你的Toolkit const toolkit = new SupabaseToolkit(supabaseClient); // 创建支持结构化工具的Agent const agent = OpenAIFunctionsAgent.fromLLMAndTools(llm, toolkit.tools);
内容的提问来源于stack exchange,提问作者dbustosp
相关产品推荐
相关产品推荐

