Google Gemini托管代理实战:从零构建自主AI技术摘要系统
那天早上,我像往常一样打开技术新闻聚合器,准备花半小时快速浏览当天的头条。但这次不同——我看到的不是人工编辑的摘要,而是一份格式精美、内容详实的PDF报告,标题是“今日技术摘要”,包含Hacker News、TechCrunch等五个来源的精选报道,每篇都附有核心要点和重要性分析。
这份报告并非来自某个大型媒体团队,而是由一个完全自主运行的AI代理在真实Linux沙盒中生成的。它自动抓取网页、分析内容、撰写摘要,最后调用Python脚本渲染成PDF——整个过程无需我介入,也无需部署任何容器或编写复杂的编排代码。
这就是Google Gemini API托管代理带来的变化:它把构建自主AI代理的门槛,从“需要全栈工程能力”降到了“写两个Markdown配置文件加一次API调用”。
1. 托管代理真正解决的是什么问题?
在深入代码之前,我们需要理解托管代理与传统方案的差异。AI系统可以按基础设施管理责任分为三个级别:
1.1 标准大语言模型:只有大脑,没有手脚
你提供提示,它返回文本。模型无法执行任何操作——没有网络访问、没有代码执行、没有文件系统。就像一个有百科全书般知识但被关在密室里的专家,能回答问题但不能实际行动。
1.2 自托管代理:全栈工程挑战
这是过去两年主流方案:使用ADK、LangChain或AutoGen框架,结合Docker容器、自定义工具函数和会话管理,部署到Cloud Run或类似平台。你需要处理:
# 这只是冰山一角——实际还需要部署、扩缩、监控等
from google.adk.agents import LlmAgent
from google.adk.tools import google_search, built_in_code_execution
agent = LlmAgent(
name="digest-agent",
model=MODEL,
instruction=AGENTS_MD,
tools=[google_search, built_in_code_execution],
)
更重要的是基础设施负担:容器镜像、Cloud Run部署、流式传输架构、会话状态管理。在代理真正运行一次之前,你已经投入了大量工程资源。
1.3 托管代理:Google管理基础设施,你定义目标
托管代理的核心价值转移:你只关心“做什么”,Google处理“怎么做”的基础设施。一次API调用预配完整的Ubuntu沙盒(Python 3.12、Node.js 22、4CPU/16GB RAM),代理在其中自主运行。
关键区别在于责任边界:
| 能力 | 自托管代理(ADK + Cloud Run) | Gemini API托管代理 |
|---|---|---|
| 沙盒环境 | 自己构建Docker容器 | 一次API调用自动预配 |
| 工具执行 | 编写Python工具函数 | 内置:代码执行、网页浏览、文件系统 |
| 软件包安装 | Dockerfile中预安装 | 代理在沙盒内实时安装 |
| 会话延续 | 自己管理数据库和上下文注入 | 传递environment_id和interaction_id |
| 要管理的基础设施 | 容器、部署、扩缩、监控 | 无 |
托管代理不是“另一个框架”,而是服务模式的根本转变:从“给你工具自己搭建”到“告诉我要做什么,我帮你完成”。
2. 从零构建技术摘要代理的实战路径
让我们通过构建每日技术摘要代理,具体理解托管代理的工作方式。这个代理每天自动抓取多个新闻源,生成结构化摘要并输出PDF。
2.1 第一步:最小可行验证——先让代理动起来
开始不要急于实现完整功能,先验证基本流程是否通畅:
from google import genai
client = genai.Client() # 自动从环境变量读取GEMINI_API_KEY
stream = client.interactions.create(
agent="antigravity-preview-05-2026", # 基础代理
input="Fetch the Hacker News front page and list the top 5 stories.",
stream=True, # 关键:实时观察代理思考过程
environment="remote", # 触发沙盒预配
)
这里有几个容易被忽略但至关重要的细节:
stream=True不是可选功能 :没有流式传输,调用会阻塞30-90秒后一次性返回结果。这期间你完全不知道代理是在工作、卡住还是失败。流式传输让你实时看到代理的推理过程:
[agent started]
[tool] run_code # 代理选择编写Python脚本抓取
[tool] url_context # 或者直接读取网页内容
...文本块逐步输出...
环境隔离是自动的 :每个 interactions.create() 调用都启动一个全新的沙盒,彼此完全隔离。代理可以安装软件包、读写文件、访问网络,但无法影响你的本地环境或其他沙盒。
第一次运行成功后,你会获得两个关键ID: environment_id (沙盒实例标识)和 interaction_id (本次对话标识)。它们为后续的会话延续奠定基础。
2.2 第二步:注入个性——用配置文件定义代理行为
基础代理能工作,但没有“个性”。接下来通过配置文件定义代理的编辑风格和工作流程:
<!-- .agents/AGENTS.md -->
# 技术摘要代理
## 角色
你是资深技术编辑,负责生成每日技术新闻摘要。
## 工作流程
1. 抓取Hacker News、TechCrunch、The Verge技术版块
2. 每篇报道提取标题、要点、技术影响
3. 按重要性排序,限制在10篇以内
4. 调用digest-pdf技能生成格式化报告
## 执行规则
- 优先使用官方API而非网页抓取
- 避免过度技术术语,面向广大技术受众
- 每篇摘要不超过150字
同时定义具体技能:
<!-- .agents/skills/digest-pdf/SKILL.md -->
# digest-pdf技能
## 描述
生成格式化的PDF技术摘要报告。
## 步骤
1. 读取/workspace/summaries.json中的摘要数据
2. 使用generate_pdf.py脚本渲染PDF
3. 保存到/workspace/digest.pdf
关键理解: 技能是代理的程序性记忆 。代理不仅知道“生成PDF”这个概念,还知道具体如何通过预定义的步骤完成。这种“按需加载”的设计保持上下文简洁——技能详情只在需要时载入。
通过environment参数注入配置:
environment={
"type": "remote",
"sources": [
{
"type": "inline",
"target": ".agents/AGENTS.md",
"content": AGENTS_MD,
},
# ... 其他配置文件
],
}
这时再运行代理,你会看到明显的行为变化:它先读取配置文件,然后按照预定流程执行,最后生成PDF输出。配置文件让代理从“通用工具”变成“专属助手”。
2.3 第三步:处理输出——从沙盒中提取成果
代理在沙盒内生成PDF后,你需要将其提取到本地。这里使用Gemini Files API:
import requests
def download_pdf(environment_id, api_key):
# 下载整个沙盒文件系统的tar快照
r = requests.get(
f"https://generativelanguage.googleapis.com/v1beta/files/environment-{environment_id}:download",
params={"alt": "media"},
headers={"x-goog-api-key": api_key},
)
r.raise_for_status()
# 从tar中提取PDF文件
with tarfile.open(fileobj=BytesIO(r.content)) as tar:
member = next(m for m in tar.getmembers() if m.name.endswith("workspace/digest.pdf"))
with open("digest.pdf", "wb") as f:
f.write(tar.extractfile(member).read())
这种方法的好处是 完整性 :你获得的是沙盒在任务完成后的完整快照,不仅包括目标PDF,还有中间文件、日志等调试信息。在实际项目中,你可以直接集成到同一流程中,无需单独下载步骤。
3. 托管代理的进阶用法:状态管理和配置持久化
基础功能跑通后,接下来解决两个生产环境关键问题:如何延续会话?如何避免每次传递配置?
3.1 会话延续:利用environment_id和interaction_id
沙盒在互动完成后不会立即销毁,而是保留7天。这让你可以进行多轮对话优化:
# 第一轮:生成初始摘要
stream1 = client.interactions.create(
agent="antigravity-preview-05-2026",
input="", # 依赖AGENTS.md中的工作流程
environment=environment_config, # 包含配置文件的字典
stream=True,
)
env_id, inter_id = extract_ids(stream1)
# 第二轮:基于已有成果进行优化
stream2 = client.interactions.create(
agent="antigravity-preview-05-2026",
input="为每篇报道添加重要性评分(1-5星)",
environment=env_id, # 重用同一沙盒(文件、安装的包都在)
previous_interaction_id=inter_id, # 继承对话历史
stream=True,
)
这两个ID分别管理不同维度的状态:
- environment_id :保持文件和系统状态。代理可以访问前一次运行创建的所有文件,继续使用已安装的软件包。
- previous_interaction_id :保持对话上下文。代理记得之前讨论过什么,避免重复提取或分析。
这种设计特别适合迭代优化场景:生成初稿→基于反馈修改→最终定稿,全程无需重新抓取或处理数据。
3.2 配置持久化:从内联到命名代理
每次调用都内联传递配置可行,但不优雅。更好的方案是创建命名代理:
# 一次性注册配置
agent = client.agents.create(
id="my-digest-agent", # 自定义标识符
base_agent="antigravity-preview-05-2026",
description="每日技术摘要代理,包含编辑规范和PDF生成",
base_environment={ # 注意是base_environment不是environment
"type": "remote",
"sources": [/* 同样的配置内容 */],
},
)
# 后续调用简化很多
stream = client.interactions.create(
agent="my-digest-agent", # 使用注册的ID
input="", # 可覆盖或扩展配置中的指令
environment="remote", # 无需再传递sources
stream=True,
)
命名代理的好处不仅仅是代码简洁: 配置在Google端集中管理 ,版本一致,更新方便。团队不同成员可以调用同一代理保证行为一致,而不需要每人维护一套配置文件。
4. 生产环境考量:成本、监控和边界
托管代理降低了工程复杂度,但引入新的考量维度。
4.1 成本结构理解
托管代理收费基于Token使用量,环境计算资源在预览期免费。一次完整的技术摘要运行大约消耗$0.30-$1.30,主要取决于:
- 抓取网页的数量和大小
- 分析内容的复杂度
- 生成输出的长度
关键建议 :开始阶段启用详细日志,了解不同任务的实际消耗。避免让代理无限制地浏览网页或执行开放式的探索任务。
4.2 监控和调试策略
虽然基础设施被托管,你仍需关注代理的行为正确性:
实时监控流事件 :不要只等待最终结果,观察代理的决策过程:
- 它选择了哪些工具?为什么?
- 代码执行是否成功?错误信息是什么?
- 网页抓取返回了预期内容吗?
保存中间状态 :利用沙盒的文件系统保存关键中间结果。例如,让代理将抓取的原始数据、分析结果分别保存为JSON文件,便于问题排查。
设定超时和边界 :通过AGENTS.md中的指令明确限制代理的行为范围,避免过度探索或陷入循环。
4.3 适用边界判断
托管代理不是万能解决方案,理解其边界很重要:
适合场景 :
- 结构化信息收集和摘要(如技术新闻、市场报告)
- 数据提取和格式化转换
- 基于明确步骤的重复性分析任务
- 需要结合网页搜索和本地计算的场景
不适合场景 :
- 实时性要求极高的任务(沙盒启动需要时间)
- 需要特定硬件加速的计算
- 涉及敏感数据的处理(数据经过Google基础设施)
- 需要深度定制工具函数的复杂工作流
5. 从单次使用到工程化集成
当单次运行稳定后,考虑如何将代理集成到更大的工作流中。
5.1 触发机制选择
根据需求频率选择触发方式:
- 手动触发 :适合不定期、需要人工审核的场景
- 定时任务 :使用Cloud Scheduler等每天自动运行
- 事件驱动 :响应特定事件(如重要新闻发布)
5.2 输出集成方案
PDF不是唯一输出选项。代理可以生成多种格式:
- 结构化数据 :JSON格式便于其他系统消费
- 数据库写入 :让代理直接写入业务数据库
- 消息推送 :生成摘要发送到Slack、Teams等
- API端点 :将代理封装为服务供其他应用调用
5.3 质量监控循环
建立反馈机制持续改进代理:
- 人工审核样本 :定期检查输出质量
- 自动化验证 :对关键指标设置检查点
- 指令迭代 :基于反馈优化AGENTS.md中的指导
- 技能扩展 :为常见任务开发新的技能模块
托管代理的真正价值不在于单次任务的自动化,而在于将复杂工作流封装为可重复、可优化、可集成的数字员工。技术摘要只是起点——同样的模式可以应用于竞争情报分析、学术文献综述、市场趋势跟踪等场景。
每次技术范式的转变,都重新定义了什么值得自动化。托管代理降低的门槛,让更多知识工作者能够构建专属的AI助手,而不必先成为全栈工程师。这可能是比任何单次任务自动化都更深远的变化。
更多推荐

所有评论(0)