Sunday 的面试指南

LangChain createAgent 源码:ToolNode 与工具执行循环

《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday

你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。

上一小节最后,咱们在 AgentNode.#invokeModel() 中执行到了这里:

const response = await modelWithTools.invoke(
	messages,
	config
)

return response

代码路径在:

LangChain createAgent 源码:ToolNode 与工具执行循环 配图 1

modelWithTools.invoke() 调用模型以后,返回了一条包含 Tool Call 的 AIMessage:

LangChain createAgent 源码:ToolNode 与工具执行循环 配图 2

不过,上一节的源码只追到了模型返回这里,get_task 还没有真正执行。

因此,咱们就继续在同一个 AgentNode.ts,从 modelWithTools.invoke() 的返回值接着往下看。

baseHandler 返回 AIMessage 以后,#invokeModel() 会继续把它返回给 AgentNode.#run():

LangChain createAgent 源码:ToolNode 与工具执行循环 配图 3

回到 #run(),对应的是下面这段代码:

const {
	response,
	lastAiMessage,
	collectedCommands
} = await this.#invokeModel(state, config)

也给大家放张截图,省得找不到代码位置:

LangChain createAgent 源码:ToolNode 与工具执行循环 配图 4

现在,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 表示模型要调用哪个 Tool
  • args 是模型生成的参数
  • id 则是本次 Tool Call 的唯一标识。

现在,#run() 已经拿到了 #invokeModel() 返回的 response。

PixPin_2026-08-27_18-06-29

不过,response 不一定永

本节试读已结束

继续学习,解锁完整课程

购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。

扫码添加作者微信,备注「Agent 课程」

添加作者微信 · 购买完整课程

解锁完整课程 ¥499

《Agent 大模型 0 到 1 系统课》
扫码添加微信,备注「Agent 课程」,购买后由 Sunday 提供完整内容的学习方式。

扫码添加作者微信 LGD_Sunday,购买 499 元 Agent 课程

微信昵称:LGD_Sunday
手机上可长按保存二维码,再用微信扫一扫识别。

保存微信二维码