adk_go

12

简介

一个基于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 的响应