adk_go
简介
一个基于golang实现的,ai agent开发框架。
简单的接口
多种代理架构
方便部署
集成tools / mcp
会话持久管理,有状态对话
agent最小实现
llm模型 对gemini的支持最佳,毕竟是google的开源库
创建代理
名字
llm
描述
prompt
tools
支持console mode 和web mode
也支持A2A调用
技术要点
llm调用
可以基于modle.llm实现所有llm的调用
提供了gemini的实现
其他实现可以参考
adk-go 加入了deepseek\kimi\openai\qwen\siliconflow\zhipu等实现
llm调用tool
执行前会先检查模型是否支持tool
BeforeModelCallback
工具实现接口
name
description
isLongRunning 异步工具
工具注册
toolPreprocess
遍历工具,调用
ProcessRequest
将函数声明添加到
LLMRequest.Config.Tools
llm调用
模型返回包含
FunctionCall
的响应;
handleFunctionCalls
提取函数调用,创建
tool.Context
,调用工具的
Run
方法 将工具返回值转换为
FunctionResponse
并添加到对话历史.
llm调用mcp
基于
github.com/modelcontextprotocol/go-sdk
进行通信;
支持命令行、http内存调用
agent实现
预设
对话代理 简单对话agent
顺序代理 顺序执行子代理的流水线
loop agent 循环执行直到满足退出
parallel ganet 并发多个子代理
remote agent 使用A2A调用远程代理
自定义代理
基本上实现的跟langgraph差不多;但是并发更优秀、类型更安全、性能也更好。
记忆功能
提供了memory.Service服务
AddSession()
: 将会话内容添加到记忆存储
Search()
: 根据查询检索相关的记忆条目
通过
IncludeContents
配置控制历史包含范围 llmagent.go:279-287 :
IncludeContentsDefault
: 包含相关对话历史(默认)
IncludeContentsNone
: 仅包含当前轮次上下文
系统自动重排事件以减少冗余:
最新函数响应重排:删除函数调用和最终响应之间的所有中间事件 contents_processor.go:138-144 。
历史函数响应重排:确保每个函数调用后紧跟单个合并的响应事件 contents_processor.go:259-271 。
通过
Branch
字段隔离不同代理的对话历史 contents_processor.go:125-136 :
防止并行代理的上下文相互干扰
支持代理树中的独立对话流
ContentsRequestProcessor
自动过滤无关事件 contents_processor.go:63-90 :
跳过无内容事件
跳过认证事件
转换其他代理的响应为用户内容
通过
memory.Service
搜索相关历史信息 :
工具可通过
tool.Context.SearchMemory()
访问
减少需要包含在上下文中的历史量
启动方式
web启动
服务启动时自动创建并发布 Agent Card: a2a_test.go:95-105
Card 包含服务名称、描述、调用 URL 和能力声明
通过
/.well-known/agent-card.json
路径对外提供服务发现
URL 构建使用
apiPath = "/a2a/invoke"
作为调用端点 a2a.go:34-35
console启动
Run()
方法实现了 console 的主要逻辑 console.go:59-144 :
初始化服务:创建会话服务和 runner 实例 console.go:64-89
交互循环:读取用户输入并发送给 agent console.go:93-143
响应处理:根据流式模式处理 agent 的响应