第一章:快速开始 - 你的第一个 AI Agent


本章你将学到

读完这一章,你会掌握以下内容:

  • ADK-Go 是什么,它解决了什么问题
  • ADK 的核心概念:Agent、Tool、Model、Session、Runner、Launcher
  • 如何搭建开发环境
  • 如何用不到 50 行代码创建一个能联网搜索的 AI Agent
  • 4 种运行 Agent 的方式:命令行、Web UI、REST API、Agent-to-Agent

准备好了吗?让我们开始吧。


什么是 ADK-Go

先搞清楚:什么是 Agent?

在聊 ADK 之前,我们先把 "Agent" 这个概念说清楚。

你可以把 Agent 想象成一个有脑子、有手脚的智能员工

  • 脑子 = LLM(大语言模型,比如 Gemini、GPT)。它负责"想"——理解用户说了啥、该怎么回应、下一步干啥。
  • 手脚 = 工具(Tool)。光有脑子不行,Agent 还需要"动手"——比如搜索网页、查数据库、调 API、读文件等等。
  • 记忆 = Session(会话)。一个好员工得记得之前聊了什么,不能每次都从头开始。

举个例子:你让 Agent "帮我查一下北京今天天气",它的工作流程是这样的:

用户:"帮我查一下北京今天天气"
  ↓
Agent 的脑子(LLM)理解了:用户想知道北京的天气
  ↓
Agent 的脑子决定:我需要用 Google 搜索来查一下
  ↓
Agent 的手脚(Tool):调用 Google Search,搜索 "北京今天天气"
  ↓
Agent 的脑子(LLM):把搜索结果整理成人话
  ↓
回复用户:"北京今天晴,气温 -2 到 8 度,西北风 3-4 级..."

看到了吗?Agent 不只是一个聊天机器人,它能思考行动。这就是 Agent 和普通 ChatBot 的根本区别。

那 ADK-Go 是什么?

ADK 是 Agent Development Kit 的缩写,翻译过来就是 Agent 开发工具包

ADK-Go 是 Google 官方推出的 Go 语言版 Agent 开发框架。它的定位很简单:

让你用 Go 快速构建、运行、部署 AI Agent。

你可以把 ADK-Go 理解成一个"Agent 工厂"的生产线:

你提供:脑子(模型) + 技能(工具) + 岗位说明(指令)
   ↓
ADK 帮你:组装 Agent + 管理对话 + 提供运行环境
   ↓
产出:一个能跑在命令行/Web/API/A2A 协议上的 AI Agent

不用你自己去处理 LLM 的流式响应、工具调用的解析、对话历史的管理、HTTP 服务的搭建...... 这些脏活累活 ADK 都帮你干了。你只需要关注 业务逻辑 就行。

为什么用 Go 写 Agent?

你可能会问:Python 的 Agent 框架那么多(LangChain、CrewAI、ADK-Python),为什么要用 Go?

几个实际的理由:

  1. 性能:Go 编译后是原生二进制,启动快、内存占用低。部署 Agent 服务时,同样的机器能扛更多请求。
  2. 并发:Go 的 goroutine 天生适合处理多个并发的 Agent 会话。
  3. 部署简单:编译成一个二进制文件,扔到服务器上就能跑,不用装 Python 环境。
  4. 类型安全:Go 的静态类型系统在编译期就能帮你抓住很多 bug。
  5. 你的技术栈就是 Go:如果你的后端本来就是 Go,用 ADK-Go 可以无缝集成。

当然,这不是说 Go 比 Python 更适合写 Agent,而是说 如果你是 Go 开发者,ADK-Go 给了你一个很好的选择


ADK 核心概念速览

在动手之前,我们先快速过一遍 ADK 里最重要的 6 个概念。你不需要现在就搞懂每个细节,有个印象就行,后面会一个个展开讲。

概念 对应包 一句话解释 类比
Agent agent, agent/llmagent 智能体本身,有名字、有大脑、有技能、有指令 一个有岗位职责的员工
Tool tool, tool/functiontool, tool/geminitool Agent 可以使用的工具/能力 员工的技能和工具箱
Model model, model/gemini 大语言模型,Agent 的"大脑" 员工的大脑和思维能力
Session session 一次对话的上下文,保存对话历史和状态 员工的工作笔记本
Runner runner 运行时引擎,管理 Agent 的执行流程 公司的项目管理系统
Launcher cmd/launcher 启动器,提供不同的运行方式(命令行、Web等) 公司的办公场所(办公室/远程/会议室)

它们的关系,我画了一张图:

                    +-----------------+
                    |    Launcher     |
                    | (启动器/入口)    |
                    | console/web/    |
                    | rest/a2a        |
                    +--------+--------+
                             |
                             | 创建并驱动
                             v
                    +--------+--------+
                    |     Runner      |
                    | (运行时引擎)     |
                    | 管理执行流程     |
                    +--------+--------+
                             |
                    +--------+--------+
                    |                 |
                    v                 v
           +-------+-------+ +------+-------+
           |    Agent       | |   Session    |
           | (智能体)       | | (对话会话)    |
           +-------+-------+ +--------------+
                   |
          +--------+--------+
          |                 |
          v                 v
   +------+------+  +------+------+
   |    Model    |  |    Tools    |
   | (LLM大脑)   |  | (工具/技能)  |
   +-------------+  +-------------+

简单来说就是:Launcher 启动 Runner,Runner 驱动 Agent 在 Session 中运行,Agent 用 Model 思考、用 Tools 行动。

这就像一家公司:Launcher 是办公楼,Runner 是管理系统,Agent 是员工,Model 是员工的脑子,Tools 是员工的技能,Session 是工作记录。


环境准备

1. 安装 Go

ADK-Go 需要 Go 1.22 或更高版本。

检查你的 Go 版本:

go version
# 输出类似:go version go1.22.0 darwin/arm64

如果还没装 Go,去 https://go.dev/dl/ 下载安装。

提示:项目的 go.mod 里写的是 go 1.24.4,但 Go 的向前兼容性很好, 1.22 及以上版本应该都能正常工作。建议尽量用最新版本。

2. 获取 Google API Key

ADK-Go 默认使用 Google 的 Gemini 模型。你需要一个 Google API Key。

获取步骤:

  1. 打开 Google AI Studio
  2. 登录你的 Google 账号
  3. 点击左侧菜单的 "Get API key"
  4. 创建一个新的 API Key
  5. 复制保存好这个 Key

然后设置环境变量:

# Linux / macOS
export GOOGLE_API_KEY="你的API Key"

# 建议加到 ~/.bashrc 或 ~/.zshrc 里,这样每次打开终端都能用
echo 'export GOOGLE_API_KEY="你的API Key"' >> ~/.zshrc
source ~/.zshrc
# Windows PowerShell
$env:GOOGLE_API_KEY="你的API Key"

# 或者永久设置(需要管理员权限)
[System.Environment]::SetEnvironmentVariable("GOOGLE_API_KEY", "你的API Key", "User")

安全提醒:API Key 是敏感信息,不要提交到 Git 仓库里! 如果你用 .env 文件管理环境变量,记得把 .env 加到 .gitignore 中。

3. 创建项目

# 创建项目目录
mkdir my-first-agent
cd my-first-agent

# 初始化 Go module
go mod init my-first-agent

# 安装 ADK-Go 和相关依赖
go get google.golang.org/adk
go get google.golang.org/genai

搞定!环境准备就这些,接下来正式写代码。


第一个 Agent:天气查询助手

我们要创建一个能查天气和时间的 AI Agent。它能做这些事:

  • 回答 "北京现在几点了?"
  • 回答 "上海今天天气怎么样?"
  • 拒绝回答 "帮我写一首诗"(因为不在它的职责范围内)

先贴完整代码,然后我们逐行解读:

package main

import (
    "context"
    "log"
    "os"

    "google.golang.org/genai"

    "google.golang.org/adk/agent"
    "google.golang.org/adk/agent/llmagent"
    "google.golang.org/adk/cmd/launcher"
    "google.golang.org/adk/cmd/launcher/full"
    "google.golang.org/adk/model/gemini"
    "google.golang.org/adk/tool"
    "google.golang.org/adk/tool/geminitool"
)

func main() {
    ctx := context.Background()

    // =========================================
    // 第一步:创建模型 - 这是 Agent 的"大脑"
    // =========================================
    model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{
        // 从环境变量读取 API Key
        APIKey: os.Getenv("GOOGLE_API_KEY"),
    })
    if err != nil {
        log.Fatalf("创建模型失败: %v", err)
    }

    // =========================================
    // 第二步:创建 Agent - 给它名字、大脑、指令和工具
    // =========================================
    a, err := llmagent.New(llmagent.Config{
        // Agent 的唯一标识名,在整个 Agent 树中必须唯一
        Name: "weather_time_agent",
        // Agent 的大脑,用哪个 LLM 模型来思考
        Model: model,
        // Agent 的能力描述(一句话说明它能做什么)
        Description: "回答关于城市天气和时间的问题",
        // Agent 的工作指令(相当于 System Prompt)
        Instruction: "你的唯一职责是回答关于特定城市的当前时间和天气的问题。" +
            "你必须拒绝回答与时间或天气无关的任何问题。" +
            "请用中文回答。",
        // Agent 可以使用的工具列表
        Tools: []tool.Tool{
            // Google 搜索工具 - 让 Agent 能联网搜索实时信息
            geminitool.GoogleSearch{},
        },
    })
    if err != nil {
        log.Fatalf("创建Agent失败: %v", err)
    }

    // =========================================
    // 第三步:配置启动器并运行
    // =========================================
    config := &launcher.Config{
        // AgentLoader 告诉启动器要加载哪个 Agent
        AgentLoader: agent.NewSingleLoader(a),
    }

    // 使用 full.NewLauncher() 创建一个功能最全的启动器
    // 它支持 console、web、rest、a2a 四种运行模式
    l := full.NewLauncher()

    // 根据命令行参数决定以哪种模式运行
    if err = l.Execute(ctx, config, os.Args[1:]); err != nil {
        log.Fatalf("运行失败: %v\n\n%s", err, l.CommandLineSyntax())
    }
}

是不是比想象中简单?不到 50 行有效代码,就创建了一个能联网搜索、能对话的 AI Agent。


逐行解读

让我们把代码拆开,一块一块地理解。

导入的包

import (
    "context"
    "log"
    "os"

    "google.golang.org/genai"               // Google GenAI SDK,提供模型配置等类型

    "google.golang.org/adk/agent"            // Agent 基础接口和加载器
    "google.golang.org/adk/agent/llmagent"   // LLM Agent 的具体实现
    "google.golang.org/adk/cmd/launcher"     // 启动器的配置类型
    "google.golang.org/adk/cmd/launcher/full" // 功能最全的启动器
    "google.golang.org/adk/model/gemini"     // Gemini 模型的实现
    "google.golang.org/adk/tool"             // 工具接口
    "google.golang.org/adk/tool/geminitool"  // Gemini 内置工具(如 Google 搜索)
)

ADK-Go 的包结构很清晰:

  • agent/ - Agent 相关(定义、创建、加载)
  • model/ - 模型相关(目前支持 Gemini)
  • tool/ - 工具相关(自定义函数工具、Gemini 内置工具、MCP 工具等)
  • session/ - 会话管理
  • runner/ - 运行时引擎
  • cmd/launcher/ - 各种启动器

第一步:创建模型

model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{
    APIKey: os.Getenv("GOOGLE_API_KEY"),
})

这一步是给 Agent 装上"大脑"。

  • gemini.NewModel() 创建一个 Gemini 模型实例
  • "gemini-2.5-flash" 是模型名称。Gemini 2.5 Flash 是目前速度快、价格低的选择,适合大部分场景
  • APIKey 从环境变量读取,这是调用 Gemini API 的凭证

你可以换成其他 Gemini 模型:

模型名 特点
gemini-2.5-flash 速度快,成本低,适合大部分任务
gemini-2.5-pro 能力更强,适合复杂推理任务
gemini-2.0-flash 上一代 Flash,依然好用

小知识gemini.NewModel() 返回的是 model.LLM 接口。ADK-Go 通过接口解耦了 Agent 和具体的模型实现。理论上你可以实现自己的 model.LLM 来接入其他模型(比如通 过 OpenAI 兼容 API 接入本地模型),不过目前官方只提供了 Gemini 的实现。

第二步:创建 Agent

a, err := llmagent.New(llmagent.Config{
    Name:        "weather_time_agent",
    Model:       model,
    Description: "回答关于城市天气和时间的问题",
    Instruction: "你的唯一职责是回答关于特定城市的当前时间和天气的问题。...",
    Tools:       []tool.Tool{
        geminitool.GoogleSearch{},
    },
})

这是最核心的一步,让我们逐个字段看:

Name(名字)

Name: "weather_time_agent",

Agent 的唯一标识。在整个 Agent 树中(后面会讲多 Agent 协作),每个 Agent 的名字必须唯一。名字不能是 "user",因为这个名字被保留给了用户输入。

命名建议:用小写字母加下划线,像变量名一样。比如 weather_agentcode_reviewertranslator

Model(模型/大脑)

Model: model,

把前面创建的 Gemini 模型传进去。这就是 Agent 用来"思考"的大脑。

Description(描述)

Description: "回答关于城市天气和时间的问题",

一句话描述这个 Agent 能做什么。这个描述很重要,在多 Agent 协作的场景下,LLM 会读这个描述来决定是否把任务委托给这个 Agent。所以描述要简洁且准确

Instruction(指令)

Instruction: "你的唯一职责是回答关于特定城市的当前时间和天气的问题。" +
    "你必须拒绝回答与时间或天气无关的任何问题。" +
    "请用中文回答。",

这就是我们常说的 System Prompt(系统提示词)。它定义了 Agent 的行为边界和风格。

好的 Instruction 应该包含: - 角色定位:你是谁,负责什么 - 行为边界:什么该做,什么不该做 - 输出格式:用什么语言、什么风格回答

ADK-Go 的 Instruction 还支持模板变量。你可以用 {变量名} 的语法插入 Session 状态中的值:

// 比如这样的指令,ADK 会在运行时把 {user_name} 替换成 Session 中的实际值
Instruction: "你好 {user_name},我是你的天气助手。",

这个高级功能我们后面的章节会详细讲。

Tools(工具)

Tools: []tool.Tool{
    geminitool.GoogleSearch{},
},

工具列表定义了 Agent 能使用的"技能"。这里我们只给了一个工具:Google 搜索。

geminitool.GoogleSearch{} 是 Gemini 模型内置的搜索工具。它的特别之处在于:搜索操作是在 Gemini 服务端完成的,不需要你本地执行任何代码。Agent 调用这个工具时,Gemini 会自动去搜索并返回结果。

ADK-Go 支持多种类型的工具:

工具类型 对应包 说明
Gemini 内置工具 tool/geminitool Google Search 等,服务端执行
自定义函数工具 tool/functiontool 把你的 Go 函数包装成工具
MCP 工具 tool/mcptoolset 通过 MCP 协议使用外部工具服务
Agent 工具 tool/agenttool 把另一个 Agent 当作工具使用

后面的章节我们会详细讲怎么写自定义工具。

第三步:配置启动器并运行

// 创建启动配置
config := &launcher.Config{
    AgentLoader: agent.NewSingleLoader(a),
}

// 创建启动器
l := full.NewLauncher()

// 执行
if err = l.Execute(ctx, config, os.Args[1:]); err != nil {
    log.Fatalf("运行失败: %v\n\n%s", err, l.CommandLineSyntax())
}

这部分代码做了三件事:

1. 创建 launcher.Config

launcher.Config 是启动配置。最重要的字段是 AgentLoader,它告诉启动器要加载哪个 Agent。

agent.NewSingleLoader(a) 创建一个单 Agent 加载器。如果你有多个 Agent,可以用 agent.NewMultiLoader(rootAgent, otherAgent1, otherAgent2)

Config 还有其他可选字段:

type Config struct {
    SessionService   session.Service    // 会话存储服务(默认用内存)
    ArtifactService  artifact.Service   // 文件/制品存储服务
    MemoryService    memory.Service     // 长期记忆服务
    AgentLoader      agent.Loader       // Agent 加载器(必需)
    PluginConfig     runner.PluginConfig // 插件配置
    TelemetryOptions []telemetry.Option  // 遥测配置
}

目前我们只需要 AgentLoader,其他字段后面的章节会用到。

2. 创建 full.NewLauncher()

full.NewLauncher() 返回一个"全功能启动器",它内部组合了所有可用的运行模式:

// full.NewLauncher() 的内部实现(简化版)
func NewLauncher() launcher.Launcher {
    return universal.NewLauncher(
        console.NewLauncher(),     // 命令行交互模式
        web.NewLauncher(           // Web 模式(包含多个子模式)
            api.NewLauncher(),     //   REST API
            a2a.NewLauncher(),     //   Agent-to-Agent 协议
            webui.NewLauncher(),   //   Web UI 界面
        ),
    )
}

你也可以只创建某个模式的启动器。比如只要命令行交互:

l := console.NewLauncher()

但一般来说,用 full.NewLauncher() 最方便,想用哪种模式通过命令行参数指定就行。

3. 调用 l.Execute()

l.Execute(ctx, config, os.Args[1:])

Execute() 接收三个参数: - ctx:标准的 Go context - config:前面创建的启动配置 - os.Args[1:]:命令行参数(去掉程序名本身)

启动器会根据命令行参数决定以哪种模式运行。比如 go run . console 就以命令行模式运行。


运行 Agent 的 4 种方式

现在我们把代码保存为 main.go,然后来试试不同的运行方式。

方式一:命令行交互模式(console)

go run . console

运行后你会看到一个交互式命令行,可以直接和 Agent 对话:

User -> 北京现在天气怎么样?

Agent -> 根据最新的搜索结果,北京现在的天气情况如下:
- 温度:-2°C  8°C
- 天气:晴转多云
- 风力:西北风 3-4 
...

User -> 帮我写一首诗

Agent -> 抱歉,我只能回答关于城市天气和时间的问题。写诗不在我的职责范围内。
如果你想了解某个城市的天气或时间,请随时告诉我!

User -> (按 Ctrl+C 退出)

看到了吗?Agent 严格按照我们的 Instruction 执行,不在职责范围内的请求会被拒绝。

console 模式适合开发调试,快速验证 Agent 的行为。

方式二:Web UI 模式

go run . web webui

启动后会在 http://localhost:8080 开启一个 Web 界面。打开浏览器访问,你会看到一个类似 ChatGPT 的聊天界面,可以在浏览器里和 Agent 对话。

web webui 模式适合演示和体验。当你想给别人展示你的 Agent 时,这个自带的 Web UI 非常方便。

你还可以指定端口:

go run . web -port 3000 webui

方式三:REST API 模式

go run . web api

启动一个 REST API 服务,你可以通过 HTTP 请求和 Agent 交互。

用 curl 测试一下:

# 先创建一个会话
curl -X POST http://localhost:8080/apps/weather_time_agent/users/test_user/sessions \
  -H "Content-Type: application/json"

# 假设返回的 session id 是 "session_abc123"
# 发送消息给 Agent
curl -X POST http://localhost:8080/run \
  -H "Content-Type: application/json" \
  -d '{
    "app_name": "weather_time_agent",
    "user_id": "test_user",
    "session_id": "session_abc123",
    "new_message": {
      "role": "user",
      "parts": [{"text": "上海今天天气如何?"}]
    }
  }'

web api 模式适合集成到你的应用中。你的前端(Web、App、小程序)可以通过 HTTP 请求调用 Agent。

方式四:Agent-to-Agent 模式(A2A)

go run . web a2a

这会启动一个遵循 A2A(Agent-to-Agent)协议 的服务。A2A 是一个标准化的 Agent 间通信协议,让不同的 Agent(甚至不同框架、不同语言实现的 Agent)能互相发现、互相调用。

web a2a 模式适合多 Agent 协作场景。比如你的天气 Agent 可以被另一个旅行规划 Agent 调用。

组合使用

你甚至可以同时启动多个 Web 子模式:

# 同时启动 REST API 和 Web UI
go run . web api webui

# 同时启动所有 Web 子模式
go run . web api webui a2a

运行方式速查表

命令 模式 适用场景
go run . console 命令行交互 开发调试
go run . web webui Web UI 界面 演示体验
go run . web api REST API 服务 应用集成
go run . web a2a A2A 协议服务 Agent 间协作
go run . web api webui a2a 全部 Web 模式 一次全开

ADK 架构全景图

现在让我们退后一步,看看 ADK-Go 的完整架构。理解这张图对后续的学习很有帮助。

                         用户 / 客户端
                              |
                              v
    +-----------------------------------------------------+
    |                    Launcher (启动器)                   |
    |                                                       |
    |   console     web+webui    web+api      web+a2a      |
    |   (命令行)     (Web界面)   (REST API)   (A2A协议)     |
    +-------------------------+-----------------------------+
                              |
                              | 创建 Session,转发用户消息
                              v
    +-----------------------------------------------------+
    |                    Runner (运行引擎)                   |
    |                                                       |
    |  - 管理 Agent 的执行流程                               |
    |  - 找到正确的 Agent 来处理请求                          |
    |  - 将事件保存到 Session                                |
    |  - 管理插件的生命周期                                   |
    +-------------------------+-----------------------------+
                              |
               +--------------+--------------+
               |                             |
               v                             v
    +----------+----------+       +----------+----------+
    |   Agent (智能体)     |       |  Session (会话)      |
    |                      |       |                      |
    |  Name: 唯一标识      |       |  ID: 会话标识        |
    |  Description: 描述   |       |  Events: 事件列表    |
    |  Instruction: 指令   |       |  State: 状态存储     |
    |  Model: LLM大脑      |       |                      |
    |  Tools: 工具列表     |       |  (对话历史都存在这里)  |
    |  SubAgents: 子Agent  |       |                      |
    +----------+----------+       +---------------------+
               |
      +--------+--------+
      |                  |
      v                  v
+-----+------+    +------+-------+
| Model(LLM) |    | Tools(工具)   |
|             |    |              |
| Gemini      |    | GoogleSearch |
| 2.5 Flash   |    | 自定义函数    |
| 2.5 Pro     |    | MCP工具      |
| ...         |    | Agent工具    |
+-------------+    +--------------+

数据流详解

一次完整的用户交互,数据流是这样的:

1. 用户发送消息 "北京天气怎么样?"
   |
   v
2. Launcher 接收到消息转交给 Runner
   |
   v
3. Runner  Session 中加载对话历史
   |
   v
4. Runner 找到应该处理这条消息的 Agent这里就是 weather_time_agent
   |
   v
5. Agent 运行
   a. 构建请求系统指令 + 对话历史 + 用户新消息 + 可用工具列表
   b. 发送给 ModelGemini
   c. Model 返回我要调用 google_search("北京天气")
   d. ADK 执行 Google Search 工具
   e. 搜索结果返回给 Model
   f. Model 根据搜索结果生成最终回复
   |
   v
6. Runner  Agent 的回复事件保存到 Session
   |
   v
7. Launcher 将回复返回给用户

注意第 5 步中的 c-e,这就是所谓的 工具调用循环(Tool Call Loop)。Agent 可能会连续调用多个工具,直到它认为已经收集了足够的信息来回复用户。这个过程是自动的,ADK 帮你处理了。

关于 Session

Session 是 ADK 中一个重要但容易被忽略的概念。它的作用是:

  1. 保存对话历史:每一轮用户输入和 Agent 回复都作为 Event 存在 Session 中
  2. 维护状态:你可以在 Session 中存储键值对,比如用户偏好、中间计算结果等
  3. 跨轮对话:因为有 Session,Agent 能记住之前聊了什么

默认情况下,ADK 使用内存中的 Session 存储(session.InMemoryService()),程序重启后数据就没了。在生产环境中,你可以切换到数据库存储(ADK 提供了基于 GORM 的数据库实现)或 Vertex AI 的托管服务。

这些高级用法我们在后面的章节中会详细讲到。


理解 llmagent.Config 的完整配置

我们刚才用了 llmagent.Config 最基础的字段。实际上它还有很多可选配置,这里列出一些后面会用到的:

llmagent.Config{
    // === 基础配置(我们已经用过了)===
    Name:        "agent_name",        // 必需:唯一标识
    Model:       model,               // 必需:LLM 模型
    Description: "做什么的",           // 推荐:能力描述
    Instruction: "你应该...",          // 推荐:行为指令
    Tools:       []tool.Tool{...},    // 可选:工具列表

    // === 子 Agent(多 Agent 协作时用)===
    SubAgents: []agent.Agent{...},    // 可选:子 Agent 列表

    // === 回调函数(拦截和定制行为)===
    BeforeAgentCallbacks:  []agent.BeforeAgentCallback{...},  // Agent 运行前
    AfterAgentCallbacks:   []agent.AfterAgentCallback{...},   // Agent 运行后
    BeforeModelCallbacks:  []llmagent.BeforeModelCallback{...}, // 模型调用前
    AfterModelCallbacks:   []llmagent.AfterModelCallback{...},  // 模型调用后
    BeforeToolCallbacks:   []llmagent.BeforeToolCallback{...},  // 工具调用前
    AfterToolCallbacks:    []llmagent.AfterToolCallback{...},   // 工具调用后

    // === 高级配置 ===
    GenerateContentConfig: &genai.GenerateContentConfig{
        Temperature: genai.Ptr(float32(0.7)), // 控制回答的随机性
    },
    OutputKey: "result",              // 把 Agent 输出保存到 Session 状态

    // === 全局指令(对整个 Agent 树生效)===
    GlobalInstruction: "你是一个友好的 AI 助手...",
}

别担心,这些配置你不需要现在就全搞懂。我们会在后续章节中一个一个来讲。


小结

恭喜你完成了第一章!让我们回顾一下关键知识点:

Agent 的本质

Agent = 大脑(LLM) + 手脚(Tools) + 记忆(Session) + 指令(Instruction)

它不只是一个聊天机器人,而是能思考并行动的智能体。

ADK-Go 的核心组件

Launcher  -->  Runner  -->  Agent  -->  Model + Tools
                              |
                           Session

六个核心概念:Agent、Tool、Model、Session、Runner、Launcher,各司其职。

创建 Agent 的三步

  1. 创建 Modelgemini.NewModel() - 给 Agent 一个大脑
  2. 创建 Agentllmagent.New() - 组装 Agent(名字 + 大脑 + 指令 + 工具)
  3. 启动运行full.NewLauncher().Execute() - 选择运行模式,开跑

四种运行模式

模式 命令 场景
命令行 console 开发调试
Web UI web webui 演示体验
REST API web api 应用集成
A2A web a2a Agent 协作

动手练习

学了这么多,是时候自己动手了。以下是两个练习,建议你真的去做一下——看十遍不如写一遍。

练习 1:把天气助手改成翻译助手

修改 Agent 的配置,让它变成一个中英互译助手:

  • Name: "translator_agent"
  • Description: "中英文互相翻译"
  • Instruction: 自己写一段合适的指令(提示:告诉它只做翻译,不做其他事)
  • Tools: 翻译不需要联网搜索,可以把 Tools 设为空 []tool.Tool{}

改完后用 go run . console 试试效果:

User -> Please translate: 今天天气真好
Agent -> Today's weather is really nice.

User -> 翻译:The quick brown fox jumps over the lazy dog
Agent -> 敏捷的棕色狐狸跳过了那只懒狗

User -> 帮我写一首诗
Agent -> 抱歉,我只负责中英文翻译,无法为你写诗。请给我需要翻译的内容。
参考答案(先自己试,实在不行再看)
a, err := llmagent.New(llmagent.Config{
    Name:        "translator_agent",
    Model:       model,
    Description: "中英文互相翻译",
    Instruction: "你是一个专业的中英文翻译助手。" +
        "你的唯一职责是将中文翻译成英文,或将英文翻译成中文。" +
        "你必须拒绝任何与翻译无关的请求。" +
        "翻译时请保持原文的语气和风格。" +
        "如果用户直接发送文本而没有明确说翻译,请自动判断语言并翻译成另一种语言。",
    Tools: []tool.Tool{}, // 翻译不需要工具
})

练习 2:尝试不同的运行模式

用你的 Agent(无论是天气助手还是翻译助手),依次尝试以下运行模式:

  1. go run . console - 在命令行里聊几句
  2. go run . web webui - 打开浏览器体验 Web 界面
  3. go run . web api webui - 同时开启 API 和 Web UI,用浏览器和 curl 分别测试

感受一下不同模式的区别。思考一下:在什么场景下你会选择用哪种模式?

练习 3(选做):调整模型参数

试试通过 GenerateContentConfig 调整模型的 "温度"(temperature),看看不同温度下 Agent 回答风格的变化:

a, err := llmagent.New(llmagent.Config{
    // ... 其他配置 ...
    GenerateContentConfig: &genai.GenerateContentConfig{
        // 温度范围 0.0 - 2.0
        // 低温度(0.1):回答更确定、更一致
        // 高温度(1.5):回答更有创意、更多样
        Temperature: genai.Ptr(float32(0.1)),
    },
})

分别用 0.1 和 1.5 的温度问同一个问题,对比回答的差异。


下一章预告

在下一章中,我们将学习如何创建自定义工具。Agent 光会搜索可不够,我们要让它学会更多技能——调用你自己的 Go 函数、访问数据库、调用第三方 API...... 这才是 Agent 真正强大的地方。

到时见!