AGENT
在adk框架中,agent.Agent是所有Agent必须实现的基础接口
∵它定义了一个Agent的基本属性以及它的隐形逻辑
以下是核心方?
Name() string
//作用:返回该 Agent 的名称(字符串)。AgentTree 中的每个名称必须唯一且不能是 "user"��?
Description() string
//作用:返回该 Agent 的功能描述。如果系统包含多��?Agent,LLM 会依赖这段描述来决定是否将任务委托(Delegate)给��?Agent。建议保持简短明了��?
SubAgents() []Agent
//作用:返回直接归属于��?Agent 的子 Agent 列表(切片)。这定义��?Agent 的层级树结构,框架会自动设置父子关系以支持跨 Agent 路由��?
Run(InvocationContext) iter.Seq2[*session.Event, error]
//作用:定义该 Agent 的核心执行逻辑。它接收一��?InvocationContext(包含上下文、当前会话、内存、状态等),并返回一个迭代器,该迭代器会持续产出(Yield)执行过程中的事��?(*session.Event) 或报错信息��?
agent.Config -> 自定义逻辑基础的Agent
Name (string) ��?Description (string)//基础元数据��?
SubAgents ([]Agent)//子节点��?
BeforeAgentCallbacks / AfterAgentCallbacks//Agent 运行前后的生命周期钩子��?
Run (func(InvocationContext) iter.Seq2[*session.Event, error])
//这是最关键的区别。你需要在这提供自定义��?Go 函数来完全掌控它如何工作,不一定是调用大模型,也可以是纯代码逻辑(例��?API 聚合器)��?
首先,我们先创建一个大模型实例
简单示?
import (
"google.golang.org/adk/agent/llmagent"
"google.golang.org/adk/provider/googleai" // 引入 GoogleAI Provider
)
// 生成 Model 实例
myGeminiModel, err := googleai.NewModel(googleai.Config{
ModelName: "gemini-2.5-flash",
APIKey: "YOUR_GEMINI_API_KEY",
// 可以在这里配��?Temperature 等生成参��?
})
对于模型实例,基本都会有Name、APIKey、Base_URL基本参数和其他参?
而兼?openai 或其他的请求格式的可以直接使用对应的 provider ?
意思是,可以直接替换key和url,Agent并不知道也不在意底层跑的是GPT、DeepSeek或者豆包kimi
而对于EINO来说
Eino 在核心层定义了一?统一?ChatModel接口*,业务代码只与这个接口打交道,完全不知道底层具体是哪个模型。这样,业务代码只依赖抽象,不依赖具体实现,eino便实现了统一不同 LLM 提供商的接口(OpenAI、Ark、Claude 等),切换模型无需修改业务代码?
系统提示词参数:

关于构建Agent
对于LLM驱动agent
什么是“大模型驱动智能体? :
LLM 驱动 Agent(大模型驱动的智能体)本质上是一?能自主理解任务、规划步骤、调用工具并完成复杂目标的“AI 执行者?。它不再只是和你聊天的“大脑”,而是升级成了能替你干活、有“手”有“脚”的智能助手?
而大模型实例化之后,使用New创建Agent?
New方法是不同大模型框架实现 Agent 的标准创建模式,而具体的包名、方法签名和功能会因框架而异?
*常见参数如下?
Name 代理的名称(必须是非空字符串? Model必填,底层模型(比如 gemini-flash2.5)? Description 代理能力的描述,用一行简短说明即可,LLM 会根据它判断是否把任务交给这?agent Instruction / InstructionProvider系统提示词(静?动态)? GlobalInstruction / GlobalInstructionProvider 全局指令(静?动? Tools / Toolsets可调用工具集合(静?动态)? BeforeModelCallbacks / AfterModelCallbacks模型调用前后拦截(钩子)? BeforeToolCallbacks / AfterToolCallbacks工具调用前后拦截(钩子)? GenerateContentConfig 温度、token 上限等生成参数? InputSchema / OutputSchema 作为工具被调用时的输入输出约束。注意:配置 OutputSchema 后通常会限?Agent 再去调用其它工具? SubAgents ?Agent? IncludeContents 上下文控制,是否在请求中包含对话历史 DisallowTransferToParent / DisallowTransferToPeers 禁止转移到父/同级 agent
当然,也可以自己写一个Run
若是自己写一个Run?
则需要通过工作流来调用工具,相对可控但固定? 而使用LLM驱动,则可让大模型决定是否调用工?

文本处理:
参数微调(处理文本)
对于GenerateContentConfig,在ADK里只做一件事:纯粹的模型超参数微?
*做了什?*:用你的数据继续训练?改变模型权重,让模型学会新知?
genConfig := &genai.GenerateContentConfig{
MaxOutputTokens: maxOutputTokens,
Temperature: genai.Ptr[float32](acfg.temperature),
}
llmagent.New(llmagent.Config{
Name: acfg.name,
Model: m,
Description: acfg.description,
Instruction: acfg.instruction,
Tools: acfg.tools,
BeforeToolCallbacks: []llmagent.BeforeToolCallback{monitor.OnBeforeTool},
AfterToolCallbacks: []llmagent.AfterToolCallback{monitor.OnAfterTool},
GenerateContentConfig: genConfig,
})

Schema约束:
Schema约束是对数据结构和内容规则的**强制性定?*,确保数据符合预定格式、类型和关系。就像建筑图纸规定房屋结构一样,schema约束规定数据必须遵守的规则?
在部分agent中,可以让你定义InputSchema(输入契约)和OutputSchema(输出强约束)的格式与参数?
O:通过在底层将Go结构体转换为标准的JSON Schema,强制大模型必须按照这个结构输出,然后框架会自动帮你做 json.Unmarshal I:告诉 Agent(或者调用这?Agent 的其他父?Agent),我这个处理节点需要什么样的数据结构?
番外:子Agent
adk-go 采用了一种符合直觉的设计模式:“层级化路由”。adk-go 依赖大模型天然的“工具调?(Tool Calling)”能力,将子 agent 动态包装成一个tool,以此来实现agent之间的通信?
?adk-go 的代码里,无论你是哪种父子执行关系,Go 代码的写法都是完全一样的? 决定它们是“路由”、“顺序”还是“并行”的,完全取决于?Agent ?Instruction(系统提示词)和?Agent ?Description(工具描述)?提示词就是多智能体协同的控制流?
import (
"google.golang.org/adk/agent"
"google.golang.org/adk/agent/llmagent"
)
// 1. OCR 文本提取 Agent
ocrAgent, _ := llmagent.New(llmagent.Config{
Name: "OCR_Worker",
Description: "专门负责从图片中提取文本。当需要知道图片里写了什么时调用我��?,
Model: myModel,
Instruction: "你是一��?OCR 助手。解析输入的图片 URL,返回识别到的文本��?,
InputSchema: ImageInput{}, // { "image_url": "..." }
OutputSchema: OCRResult{}, // { "text": "..." }
})
// 2. 文本毒性分��?Agent
safetyAgent, _ := llmagent.New(llmagent.Config{
Name: "Safety_Worker",
Description: "专门负责分析文本是否包含违规、引战或有害内容��?,
Model: myModel,
Instruction: "你是一个安全审核员。严格判定输入的文本是否违规��?,
InputSchema: TextAnalyzeInput{}, // { "text": "..." }
OutputSchema: SafetyResult{}, // { "is_harmful": true, "reason": "..." }
})
// 3. 路由/主管 Agent
managerAgent, _ := llmagent.New(llmagent.Config{
Name: "Moderation_Manager",
Model: myModel,
// 明确告诉主管它的工作��?
Instruction: `你是多模态审核主管��?
收到图片后,请按以下步骤执行��?
1. 调用 OCR_Worker 获取图片中的文字��?
2. 将获取到的文字,传给 Safety_Worker 进行毒性分析��?
3. 综合所有的信息,生成最终的审核报告。`,
// 【魔法发生的地方��?
SubAgents: []agent.Agent{ocrAgent, safetyAgent},
OutputSchema: FinalReport{},
})
