LangChain createAgent 源码:ToolNode 与工具执行循环
《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday
你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。
上一小节最后,咱们在 AgentNode.#invokeModel() 中执行到了这里:
const response = await modelWithTools.invoke(
messages,
config
)
return response
代码路径在:
modelWithTools.invoke() 调用模型以后,返回了一条包含 Tool Call 的 AIMessage:
不过,上一节的源码只追到了模型返回这里,get_task 还没有真正执行。
因此,咱们就继续在同一个 AgentNode.ts,从 modelWithTools.invoke() 的返回值接着往下看。
baseHandler 返回 AIMessage 以后,#invokeModel() 会继续把它返回给 AgentNode.#run():
回到 #run(),对应的是下面这段代码:
const {
response,
lastAiMessage,
collectedCommands
} = await this.#invokeModel(state, config)
也给大家放张截图,省得找不到代码位置:
现在,response 中保存的就是刚才那条 AIMessage。
接下来,源码需要使用这条消息完成后半段执行逻辑
从 AgentNode.#run() 继续往下
第一步:把模型返回的 Tool Call 写入 State
咱们这次的代码案例第一次模型调用返回:
[AIMessage 1]
get_task({"taskId":"TASK-1024"}) id=call_get_task
模型集成包会把 LLM 厂商接口返回的数据整理成 AIMessage。
对于一次 Tool Call,最重要的是下面三个字段:
{
name: 'get_task',
args: { taskId: 'TASK-1024' },
id: 'call_get_task'
}
name表示模型要调用哪个 Toolargs是模型生成的参数id则是本次 Tool Call 的唯一标识。
现在,#run() 已经拿到了 #invokeModel() 返回的 response。
不过,response 不一定永
本节试读已结束
继续学习,解锁完整课程
购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。
