1. 深入理解 ChatModelAgent 的核心架构
在 Eino ADK 体系中,ChatModelAgent 扮演着"思考型 Agent"的关键角色。与普通的大模型调用不同,它实现了完整的决策-执行循环机制,让 LLM 能够动态决定何时回答问题、何时调用工具、何时转交任务。
1.1 ReAct 循环的执行机制
ChatModelAgent 的核心是基于 ReAct(Reasoning and Acting)模式的循环执行引擎。这个循环包含四个关键阶段:
- 推理阶段(Reason):模型分析当前上下文,决定下一步行动
- 决策阶段(Action):模型选择具体行动(回答、调用工具或转交)
- 执行阶段(Act):系统执行选定的动作
- 观察阶段(Observation):将执行结果反馈给模型进行下一轮判断
这种机制使得 ChatModelAgent 能够处理复杂的多步骤任务,而不仅仅是生成单次响应。例如,在处理故障排查请求时,Agent 可能会:
- 先调用 runbook 查询工具获取技术文档
- 然后根据文档内容组织回答
- 如果问题复杂则转交人工处理
1.2 关键配置参数解析
ChatModelAgent 的行为由一组精细的配置参数控制,这些参数可以分为几个重要类别:
身份标识类
Name:Agent 的唯一标识符Description:用于任务转交时的匹配依据
模型控制类
Instruction:定义 Agent 的行为准则和响应风格Model:底层使用的 LLM 实例ModelRetryConfig:模型调用失败时的重试策略
工具管理类
ToolsConfig:工具调用相关配置ReturnDirectly:指定哪些工具的结果直接作为最终输出EmitInternalEvents:控制是否透传嵌套 Agent 的事件
流程控制类
MaxIterations:限制最大循环次数(默认20)OutputKey:指定结果存储的会话键名Exit:定义特殊退出工具
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ChatModelAgent 的三种协作模式
2.1 普通工具调用(Tool)
这是最基本的协作方式,适用于边界清晰的功能单元。工具需要明确定义:
- 输入参数结构
- 输出结果格式
- 功能描述(供模型判断是否调用)
典型实现示例:
go复制type CalculatorInput struct {
A float64 `json:"a"`
B float64 `json:"b"`
Op string `json:"op" jsonschema:"enum=+,enum=-,enum=*,enum=/"`
}
calculatorTool := utils.InferTool("calculator", "执行基础数学运算",
func(ctx context.Context, input *CalculatorInput) (float64, error) {
switch input.Op {
case "+": return input.A + input.B, nil
case "-": return input.A - input.B, nil
case "*": return input.A * input.B, nil
case "/":
if input.B == 0 {
return 0, errors.New("division by zero")
}
return input.A / input.B, nil
default: return 0, errors.New("unknown operator")
}
})
2.2 任务转交(Transfer)
Transfer 机制允许 Agent 将整个任务控制权移交给更适合处理的 Agent。这种模式下:
- 主 Agent 评估任务性质
- 根据子 Agent 的 Description 选择最佳接手者
- 通过 Transfer Tool 发起转交
- Runner 切换执行上下文到目标 Agent
配置示例:
go复制dispatcher := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "d
