1. 序曲
孤立开发的时代即将结束。下一波技术变革浪潮不是关于孤身一人的天才,而是关于协作精通。打造一个智能的单一代理是一项有趣的实验。构建一个强大、安全且智能的代理生态系统(真正的 Agentverse)是现代企业面临的巨大挑战。
在这个新时代,要取得成功,需要融合四种关键角色,这些角色是支持任何蓬勃发展的自主系统的基础支柱。任何一个方面的不足都会造成弱点,进而危害整个结构。
本研讨会是企业在 Google Cloud 上掌握智能体未来的权威指南。我们提供端到端路线图,引导您从最初的想法到全面运营的现实。在这四个相互关联的实验中,您将了解开发者、架构师、数据工程师和 SRE 的专业技能如何融合,才能创建、管理和扩缩强大的 Agentverse。
任何单个支柱都无法单独支持 Agentverse。如果没有开发者的精准执行,架构师的宏伟设计将毫无用处。如果没有数据工程师的智慧,开发者代理就会变得盲目;如果没有 SRE 的保护,整个系统就会变得脆弱不堪。只有通过协同合作并对彼此的角色有共同的理解,您的团队才能将创新概念转化为任务关键型运营现实。您的旅程将从这里开始。准备好掌握自己的角色,并了解自己如何融入大局。
欢迎来到“Agentverse:冠军召集令”
在广阔的企业数字领域,一个新时代已经来临。我们正处于智能体时代,这是一个充满希望的时代,智能自主的智能体将完美协作,加速创新并消除日常琐事。
这个由力量和潜力组成的互联生态系统被称为 Agentverse。
但一种名为“静电”的悄然腐蚀开始侵蚀这个新世界的边缘。静态不是病毒或 bug,而是以创造行为本身为食的混乱的化身。
它将旧的挫败感放大成可怕的怪物,催生了开发中的七个幽灵。如果不勾选此框,静态变量及其幽灵将使进度停滞不前,使 Agentverse 的美好前景变成技术债务和废弃项目的荒原。
今天,我们呼吁各界人士挺身而出,扭转混乱的局面。我们需要英雄愿意精通自己的技艺,并携手合作来保护 Agentverse。现在该选择您的迁移路径了。
选择课程
您面前有四条截然不同的道路,每条道路都是对抗静态的关键支柱。虽然您将独自完成训练任务,但最终能否成功取决于您是否了解自己的技能如何与他人的技能相结合。
- 影刃(开发者):锻造和前线大师。您是打造刀刃、构建工具的工匠,在代码的复杂细节中直面敌人。您的道路是精准、技能和实践创造之路。
- 召唤师(架构师):伟大的战略家和编排者。您看到的不是单个特工,而是整个战场。您将设计主蓝图,使整个智能体系统能够进行通信、协作,并实现远超任何单个组件的目标。
- 学者(数据工程师):探寻隐藏的真相,守护智慧。您将深入广阔而未开垦的数据荒野,发掘可为代理提供目标和洞察的智能。您的知识可以揭示敌人的弱点或增强盟友的能力。
- 守护者(DevOps / SRE):王国的坚定保护者和盾牌。您需要建造堡垒、管理电力供应线路,并确保整个系统能够抵御静电的必然攻击。您的实力是团队获胜的基础。
您的任务
训练将作为一项单独的锻炼开始。您将沿着所选路线学习,掌握胜任工作所需的独特技能。试用期结束时,您将面对一个由静态诞生的幽灵,这是一个会利用您工艺的特定挑战来捕食的小头目。
只有掌握好自己的角色,才能为最终的试镜做好准备。然后,您必须与其他班级的学员组队。你们将一起深入腐化之地,与终极 Boss 一决高下。
一项最终的合作挑战,将考验您的综合实力,并决定特工宇宙的命运。
Agentverse 等待着英雄的到来。您会响应号召吗?
2. 影刃的法典
影刃的法典在你面前摊开。响应其调用。Agentverse 正受到“静电”带来的混乱威胁,只有掌握本法典中的技巧才能反击。这是一条需要精准和自律的道路。今天,你的训练开始了。您将学会如何运用 AI,不是将其作为简单的工具,而是将其作为必须驯服和掌握的智能利刃。遵循本文中的教导,您将打造出一种纯粹的逻辑武器 - 一种经过磨练、随时准备好投入战斗的智能代理。
学习内容
- 使用您的主要武器:Gemini CLI。
- 通过将 MCP 工具与 Gemini CLI 集成来分析不熟悉的代码库,从而调用外部武器库。
- 使用设计文档将意图转化为“氛围”,从而指挥 AI 伙伴。
- 使用智能体开发套件 (ADK) 构建您的首个自主智能体,打造简洁的模块化解决方案。
- 构建自动化评估套件,以测试和验证您的代理。
- 构建完整的 CI 流水线,以自动测试、容器化和归档代理。
3. 准备训练场
👉点击 Google Cloud 控制台顶部的“激活 Cloud Shell”(这是 Cloud Shell 窗格顶部的终端形状图标),
👉点击“打开编辑器”按钮(看起来像一个打开的文件夹,上面有一支铅笔)。此操作会在窗口中打开 Cloud Shell 代码编辑器。您会在左侧看到文件浏览器。
👉查找您的 Google Cloud 项目 ID:
- 打开 Google Cloud 控制台:https://console.cloud.google.com
- 从页面顶部的项目下拉菜单中选择要用于本次研讨会的项目。
- 您的项目 ID 会显示在信息中心的项目信息卡片中
👉在云 IDE 中打开终端,
👉💻 在终端中,使用以下命令验证您是否已通过身份验证,以及项目是否已设置为您的项目 ID:
gcloud auth list
👉💻 从 GitHub 克隆引导项目:
git clone https://github.com/weimeilin79/agentverse-developer.git
chmod +x ~/agentverse-developer/gitea.sh
chmod +x ~/agentverse-developer/init.sh
chmod +x ~/agentverse-developer/set_env.sh
git clone https://github.com/weimeilin79/agentverse-dungeon.git
chmod +x ~/agentverse-dungeon/run_cloudbuild.sh
chmod +x ~/agentverse-dungeon/start.sh
git clone https://github.com/weimeilin79/vertex-ai-creative-studio.git
chmod +x ~/vertex-ai-creative-studio/experiments/mcp-genmedia/mcp-genmedia-go/install.sh
👉💻 运行初始化脚本,此脚本会提示您输入 Google Cloud 项目 ID。当 init.sh
脚本提示时,输入您在上一步中找到的 Google Cloud 项目 ID。
cd ~/agentverse-developer
./init.sh
👉💻 设置所需的项目 ID:
gcloud config set project $(cat ~/project_id.txt) --quiet
👉💻 运行以下命令以启用必要的 Google Cloud API:
gcloud services enable compute.googleapis.com \
artifactregistry.googleapis.com \
run.googleapis.com \
cloudfunctions.googleapis.com \
cloudbuild.googleapis.com \
iam.googleapis.com \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com
👉💻 如果您尚未创建名为“agentverse-repo”的 Artifact Registry 代码库,请运行以下命令来创建该代码库:
. ~/agentverse-developer/set_env.sh
gcloud artifacts repositories create $REPO_NAME \
--repository-format=docker \
--location=$REGION \
--description="Repository for Agentverse agents"
设置权限
👉💻 在终端中运行以下命令,授予必要的权限:
. ~/agentverse-developer/set_env.sh
# Artifact Registry Admin
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
--role="roles/artifactregistry.admin"
# Cloud Build Editor
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
--role="roles/cloudbuild.builds.editor"
# Cloud Run Admin
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
--role="roles/run.admin"
# IAM Service Account User
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
--role="roles/iam.serviceAccountUser"
# Vertex AI User
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
--role="roles/aiplatform.user"
# Logging Writer (to allow writing logs)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
--role="roles/logging.logWriter"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
--role="roles/logging.viewer"
👉💻 在您开始训练时,我们会准备最终挑战。以下命令会从混乱的静电中召唤出幽灵,从而为您的测试创建 Boss。
. ~/agentverse-developer/set_env.sh
cd ~/agentverse-dungeon
./run_cloudbuild.sh
npm update -g @google/gemini-cli
4. 掌握您的主要武器:Gemini CLI 简介
在能够使用 MCP 服务器武器库中的高级专用武器之前,您必须先熟练掌握主要武器:Gemini CLI。这是您最通用的刀片,能够通过您的指令塑造数字世界。这些练习将帮助您熟悉其基本操作和功能。
Gemini 命令行界面 (CLI) 不仅仅是一个工具,更是您意志的延伸。这款开源 AI 智能体由 Gemini 模型提供支持,采用“推理和行动”(ReAct) 循环。它会分析您的意图,选择合适的技术并执行,然后观察结果以完成复杂的任务。在能够使用更专业的武器之前,您必须先熟练掌握这把主刀。
Gemini CLI 使用入门
👉💻 进入训练场,拔出武器。在 Cloud Shell 终端中,前往您的个人军械库。
cd ~/agentverse-developer
mkdir tabletop
cd tabletop
👉💻 首次召唤 Gemini。它会引导您完成初始调谐。
clear
gemini --model=gemini-2.5-flash --yolo
如果系统询问您是否要继续,请选择Do you want to connect Cloud Shell editor to Gemini CLI?
否。
武器熟悉化
每位技艺精湛的工匠都了解自己的工具。在面对真正的敌人之前,你必须先学会刀法的核心技巧。
👉✨ 每件附魔工具都有描述其威力的符文。立即阅读。在 Gemini 提示中,输入:
/help
查看命令列表。这些是管理记忆 (focus
)、对话 (chat
) 和外部武器库 (tools
) 的基本技巧。这是您的战斗手册。
👉✨ 武器与环境相协调,让您能够直接操控战场。向刀片服务器外部的世界发出命令:
!ls -l
👉✨ Gemini CLI 具有自己的一组内置功能。如需检查这些元素,请执行以下操作:
/tools
您会看到一个列表,其中包含 ReadFile
、WriteFile
和 GoogleSearch
。这些是您可以调用的默认技术,无需借助外部工具。
👉✨ 武器只有在正确聚焦时才能发挥效用。Gemini Blade 可以保持“战术意识”(背景信息),从而指导其行动。
/memory show
目前为空白状态。
👉✨ 将以下战术数据铭刻到其内存中:
/memory add "The Shadowblade's primary foe is The Static."
再次运行 /memory show
,确认您的刀片已吸收此知识。
👉✨ 为了发挥效用,武器必须了解任务。@
标记命令刀片服务器分析情报。首先,创建任务简报文件:
!echo "## Mission Objective: Defeat the Seven Spectres" > mission.md
👉✨现在,命令 Gemini CLI 分析简报并报告其发现:
Explain the contents of the file @mission.md
主武器现在知道自己的目标了。
👉💻 按 Ctrl+C
两次即可退出 Gemini CLI
5. 分析战场:实用的氛围编程互动
训练练习已完成。您已经学习了主要武器 Gemini CLI 的基本姿势和打击动作。但只有经过创造之火的淬炼,并与战争的武器库相协调,刀刃才能真正达到炉火纯青的境界。在直面真正的敌人之前,您必须先勘察并塑造您周围的环境,也就是数字战场。
本章将介绍如何从理论转向实践。首先,您需要通过命令 Gemini 刀片来打造您的 Maker's Mark(一种数字签名,以个人网站的形式呈现,完全由您的意图构建),从而在 Agentverse 中建立自己的身份。然后,您将通过激活本地高级工具库(即 MCP 服务器)来增强自己的力量,并将光剑调谐到其频率,从而能够执行复杂的动作,例如通过简单而果断的命令管理代码库。
确立您的制造商标记
真正的影刃不仅以武器闻名,还以其标志性风格(即制造者印记)而闻名。此标记将代表您的数字形象,即向 Agentverse 公布您身份的个人资料。在此处,您将命令 Gemini Blade 执行定义此身份所需的复杂技术。
👉💻 如果您在上一部分中关闭了 Gemini CLI,请务必重新启动它,在终端中运行
clear
cd ~/agentverse-developer/tabletop
gemini --model=gemini-2.5-flash --yolo
👉✨ 只需一个强大的命令,即可指示 Gemini CLI 为您的数字身份奠定基础:
In the current folder, create a personal profile website for a hero codenamed 'Shadowblade'. The design must be a dark, futuristic theme with electric blue accents. All code must be in separate index.html and styles.css files. The layout must use CSS Flexbox for a two-column design. All generated code must be clean, well-commented, and professional.
Gemini 已计算出所需的操作顺序。
只有在实际应用场景中,才能看出技巧的真正价值。命令刀片服务器启动本地模拟。
👉✨ 在 Gemini CLI 中,发出模拟命令:
Use Python's built-in web server to start the Shadowblade Profile website you just created.
注意:刀片可能需要多次尝试才能正确执行此操作。坚持到它听话为止。
同意建议的操作。Gemini 会确认模拟处于有效状态。
👀 Gemini CLI 将遵从指令,确认模拟已启动,并且您的数字水印已生效:
The website is now being served on port 8000. You can access it at http://localhost:8000.
👀 如需查看您的作品,请点击 Cloud Shell 工具栏中的网页预览图标。选择更改端口,将其设置为 8000,然后点击更改并预览。系统会显示您网站的预览。
您的网站可能与我的网站有所不同。这是您的独特标记。
👉✨ 您的签名技巧现已完善,无需再进行实时模拟。命令 Blade 停止行动。
Stop the Shadowblade Profile website
您已成功命令 Gemini CLI 代表您执行一系列操作。但一名出色的影刃知道,真正的力量需要自律和远见。允许 AI 代理直接在您的环境中执行命令是一把双刃剑。如果该命令不是启动简单的 Web 服务器,而是删除关键文件,会怎么样?一个不谨慎的命令可能会毁掉整个训练场。
因此,最明智的工匠会在受保护的训练场(一个称为沙盒的封闭维度)内练习他们最强大或未经测试的技术。
👉💻 按 Ctrl+C
两次即可退出 Gemini CLI
Gemini CLI 沙盒 (gemini --sandbox
) 会为您的会话创建一个临时的隔离容器。AI 执行的任何命令、写入的任何文件、启动的任何进程都只存在于该虚幻领域中。它不会触及、更改或损坏您的实际 Cloud Shell 环境。在这里,您可以放心地测试强大的新工具、分析不熟悉的代码,或向 AI 发出复杂的指令,而无需担心出现意外后果。它体现了影刃的谨慎。
👉💻 现在,您将执行一个封印仪式,以了解它的力量。
clear
gemini --sandbox --yolo
您现在处于隔离维度中。对于 Gemini CLI,一切看起来都会很正常。我们来证明一下。👉💻 命令刀片执行与之前完全相同的技术:
Use the Python's built-in web server to start the Shadowblade Profile website, you just created.
Gemini 会报告成功,认为它已再次在端口 8000 上让您的网站恢复运行。但结界依然坚固。
👉 前往网页预览,尝试在端口 8000 上查看您的网站。
这次,您会遇到一个错误。连接将会失败。您无法访问该网站。
这并非工具的故障,而是沙盒强大功能的体现。Web 服务器正在运行,但它在受限维度内运行,与浏览器和外部世界完全隔离。病房运行正常。您已成功运用一项强大的技术,但对实际环境没有任何影响。
👉💻 按两次 Ctrl+C
即可退出 Gemini CLI。
现在,您已建立数字身份,更重要的是,您已学会运用强大的力量时要更加谨慎的至理名言。
激活本地武器库:Gitea 军械库
影刃的真正潜力不仅取决于其个人技能,还取决于其武器库的质量。现在,您将激活本地武器架(Gitea 服务器),并使您的刀刃与它的力量相协调。此工具库通过 Model Context Protocol (MCP) 服务器(一种专用门户)连接到 Gemini CLI,使 AI 刀片能够与外部工具和服务进行交互,从而将终端转变为智能的、以行动为导向的工作区。
开发者备注:不妨将 MCP 服务器视为一个电力管道,一个将 AI 的思维连接到外部工具的身体的专用门户。正是这种能力让 Gemini CLI 从单纯的对话者变成了真正以行动为导向的代理。通过将刀片服务器调整到这些 MCP 门户,您可以授予它执行实际操作的能力:管理文件、查询数据库、与 API 互动等等。开发者创建了整个此类门户网站生态系统,以将 AI 代理连接到强大的平台。MCP 服务器可用于与数据库互动、保护代码,甚至支持结对编程。这种方式具有无限可能,可让开发者针对任何给定项目自定义工作区。
今天,我们将重点介绍“氛围编码员”必须具备的两项基本能力:控制锻造的能力和根据想象力进行创作的能力。您将首先将刀片调谐到 Git 服务器,从而获得对源代码库的控制权。然后,您将连接到第二个 MCP 服务器以生成图片,从而仅需一个命令即可创建视觉素材资源。
我们先来召唤新武器库中最基本也是最重要的部分:武器库本身。
👉💻 在终端中,执行激活脚本以召唤军械库:
cd ~/agentverse-developer
./gitea.sh
此脚本会唤醒 Gitea 容器并打开 MCP 门户,从而使 Gemini 能够感知并与之互动。
👉 如需查看新武器,您必须查看网页预览。
👉 在 Cloud Shell 工具栏中,点击网页预览图标,然后选择更改端口,并将其设置为 3005。
👉 系统会显示 Gitea 登录页面。使用以下咒语进入军械库:* 用户名:dev
* 密码:dev
👉💻 您的 Gemini CLI 尚无法使用这些新功能。您必须执行关键的调谐,将军械库的位置铭刻到 Gemini CLI 的配置符文 (settings.json
) 中。在终端中,运行:
jq '. * {"mcpServers":{"gitea":{"url":"http://localhost:8085/sse"}}}' ~/.gemini/settings.json > tmp.json && mv tmp.json ~/.gemini/settings.json
cat ~/.gemini/settings.json
👀 settings.json 文件是 Gemini CLI 的中央配置,充当其偏好设置和功能的魔法书。它决定了 CLI 的行为、外观,以及最重要的,它能发挥哪些外部功能。此文件通常位于主目录中的 ~/.gemini/settings.json
,其规则适用于您的所有项目。不过,您也可以在项目文件夹内的 .gemini
目录中创建特定于项目的 settings.json
文件,以替换全局设置。
"mcpServers": { "gitea": { "url": "http://localhost:8085/sse" } }
此设置会告知 Gemini,“名为 gitea 的武器库处于活跃状态,正在监听此特定网络地址的命令。”
👉💻 重新进入 Gemini CLI。在终端中,运行以下命令:
clear
cd ~/agentverse-developer/tabletop/
gemini --model=gemini-2.5-flash --yolo
👉✨ 验证刀片是否已发现新武器。命令它通过其 MCP 门户列出所有可用的军械库:
/mcp
现在,您应该会看到 gitea
及其可用技术列表。刀片已调谐。
“Maker's Mark”个人资料是一项精心打造的技术,但需要放置在军械库中的适当位置,即需要一个剑鞘来稳妥地存放它。让 Gemini CLI 创建一个。
Create a new repository named 'shadowblade-profile'. The description should be 'The Maker's Mark and digital identity for the Shadowblade operative.' I will push my own files later, so do not create any content.
返回到 Gitea 网页界面并刷新。您会看到系统已为您创建新的 shadowblade-profile
代码库。
准备好刀鞘后,请确保您的工作安全无虞。命令 Gemini 提交个人资料网站的文件。
👉💻 在 Gemini CLI 中针对此技巧发出最终命令:
Using the Gitea tool, push the index.html and styles.css files to the 'shadowblade-profile' repository.
真正的行家会验证自己的作品。返回到 Gitea 标签页,然后刷新代码库页面。您的 index.html
和 styles.css
现已安全归档。
👉✨ 暗影之刃的身份由其徽记来确定,但您可能还记得,您的网站缺少个人资料图片。大师级工匠会承认自己的缺点,以便加以改进。你必须将此瑕疵记录在军械库的记录中。
File an issue for me in the shadowblade-profile repo. The issue is that the profile image is missing.
在 Gitea 中查看问题
为了打造缺失的徽记,你必须召唤一种不同的力量 - 一种来自 Vertex AI 的创造之灵,它能够根据纯粹的想法生成图像。这需要另一个 MCP 门户。
👉💻 按 Ctrl+C
两次即可退出 Gemini CLI
👉💻 首先,安装门户的服务器。在终端中,运行以下命令:
echo 'export PATH="$PATH:$HOME/go/bin"' >> ~/.bashrc
source ~/.bashrc
cd ~/vertex-ai-creative-studio/experiments/mcp-genmedia/mcp-genmedia-go
./install.sh
👉 出现提示时,选择选项 3,因为我们只需要为个人资料生成图片。
👉💻 创造精神需要一个神圣的容器(即 Google Cloud Storage 存储分区)来存放其创造物。我们现在就来打造一个。在终端中,运行以下命令:
. ~/agentverse-developer/set_env.sh
gcloud storage buckets create gs://$BUCKET_NAME --project=$PROJECT_ID
👉💻 现在,请执行调谐仪式,将 Gemini CLI 与这个新的创意力量联系起来。在终端中,运行以下命令:
. ~/agentverse-developer/set_env.sh
source ~/.bashrc
jq \
--arg bucket "$BUCKET_NAME" \
--arg project "$PROJECT_ID" \
--arg region "$REGION" \
'.mcpServers.imagen = { "command": "mcp-imagen-go", "env": { "MCP_SERVER_REQUEST_TIMEOUT": "55000", "GENMEDIA_BUCKET": $bucket, "PROJECT_ID": $project, "LOCATION": $region } }' \
~/.gemini/settings.json > tmp.json && mv tmp.json ~/.gemini/settings.json
cat ~/.gemini/settings.json
这种“调谐仪式”是一个 shell 脚本,用于将 Gemini CLI 配置为使用 Google 的图片生成模型 Imagen 这一强大的新工具。至关重要的是,它通过为 Imagen 设置 MCP(模型上下文协议)服务器来实现这一点。此 MCP 服务器充当桥梁,使 Gemini CLI 能够与 Imagen 通信并利用其功能。为此,它会直接修改 CLI 的中央配置文件 ~/.gemini/settings.json
,以告知 CLI 如何使用正确的云凭据运行 mcp-imagen-go 命令。
👀 仪式结束后,您的 settings.json 会包含一个新代码块,用于教 Gemini CLI 一项新技能:
"imagen": { "command": "mcp-imagen-go", "env": { "MCP_SERVER_REQUEST_TIMEOUT": "55000", "GENMEDIA_BUCKET": "your-bucket-name", "PROJECT_ID": "your-project-id", "LOCATION": "your-region" } }
这会告知 Gemini CLI:“当任务需要 Imagen 工具时,您必须执行名为 mcp-imagen-go(即 Imagen MCP 服务器)的程序。运行该脚本时,您必须为其提供以下特定环境 (env):用于保存图片的 Google Cloud Storage 存储分区,以及用于云 API 的项目 ID 和位置。”通过配置此 MCP 服务器,您可以有效地为 Gemini CLI 赋予访问 Imagen 图片生成功能的权限。
👉💻 进入 Gemini 并发出优化命令。在终端中,运行以下命令:
clear
cd ~/agentverse-developer/tabletop/
gemini --model=gemini-2.5-flash --yolo
👉✨ 只需一个强大的命令,即可指示 Gemini CLI 为您的数字身份构建基础。在 Gemini CLI 中,运行以下命令:
Generate a portrait of a shadowblade, pixel art style. A determined warrior with long, braided magenta hair, wearing black and teal armor and confidently holding a silver broadsword.
👉✨ 精灵会生成图片并将其放置在您的圣杯中。现在,命令刀刃使用以下新锻造的徽记。
Modify the index.html file to add my profile picture. Use the image I just generated.
👉✨ 最后一次启动网站,欣赏您的完美作品。
start the website with a simple HTTP server via Python
👀 如需查看您的作品,请点击 Cloud Shell 工具栏中的网页预览图标。选择更改端口,将其设置为 8000,然后点击更改并预览。系统会显示您网站的预览。
👉✨ 最后,提交修复,记录任务完成情况,并关闭您在军械库记录中提交的问题。
Push the changed index.html file to the 'shadowblade-profile' repository using the gitea tool. Make sure you add 'Fix #1' in the commit comment. Also, close issue #1.Use the Gitea Tool and use user account "dev"
👀 如需查看您的作品,请点击 Cloud Shell 工具栏中的网页预览图标。选择更改端口,将其设置为 3005,然后点击更改并预览。系统会显示您网站的预览。
👉✨ 在 Gitea 中验证映像是否已更新,以及问题是否已关闭。您的工作已完成。关闭服务器。
stop website server
👉💻 按两次 Ctrl+C
即可退出。
面向非游戏玩家
6. 组装 Shadowblade 代理:使用安全防护机制进行氛围编程
练习时间结束。钢与石的碰撞声逐渐消散。您已熟练掌握主要武器,并为战争准备好武器库。现在,您将接受真正的暗影之刃测试:组装特工本身。这是赋予逻辑生命力的艺术,使用 Codex 中的神圣蓝图来构建智能体的核心智能,从而为您的武器库中的刀刃创造一个有知觉的执刀者,使其能够独立思考、推理和行动。
您的首个任务是进入现有的工作坊(预构建的代码库),并利用其中的部件打造您的冠军。
The Assembly Ritual
在锻造开始之前,技术大师会仔细检查自己的工作室,了解每种工具和每张图纸。当您踏上一个陌生的战场(例如大型现有代码库)时,首要任务是侦察。您必须了解当前情况,包括现有架构、最终目标和互动协议。只有熟悉堡垒的蓝图及其标准,才能有效发挥自己的技能。
您的 Gemini CLI(您的常驻侦察员)可以帮助您进行侦察:
- 提供高级摘要:它可以读取整个代码库(或代码库),让您快速了解其用途和关键组件。
- 环境设置方面的帮助:它可以引导您完成安装工具和配置计算机的神秘仪式。
- 浏览代码库:它可以充当您的指南,帮助您探索复杂的逻辑并找到代码中的隐藏通道。
- 生成新兵入伍文件:它可以创建量身定制的卷轴,明确加入您阵营的新盟友的目标、角色和资源。
- 自动学习和问答:它会成为您的私人学者,回答有关功能或代码行为的问题,让您能够更加独立地进行开发。
👉💻 在第一个终端中,前往 shadowblade 目录并召唤 AI 伙伴:
. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer/shadowblade
clear
gemini --model=gemini-2.5-flash --yolo
👉✨ 现在,命令侦察兵勘察战场并汇报情况。
Analyze the entire project and provide a high-level summary.
在绘制现有地形图后,您现在必须参考蓝图来了解您即将建造的建筑物。最强大的操作不是即兴发挥,而是通过精确的设计构建而成。
开发者备注:此设计文档是项目的权威蓝图。其目的是在投入大量开发工作之前,明确目标和技术实现。制定周详的计划可确保所有开发者保持一致,降低返工风险,并有助于防止技术债务和范围蔓延。它是保持项目速度和代码质量的主要工具,尤其是在团队规模扩大或有新成员加入时。
本文档的一个关键目标是不仅要定义“顺畅路径”,还要定义边缘情况和故障模式,尤其是在使用 LLM 时。我的经验是,LLM 非常擅长生成乐观的代码,其中所有输入都有效,所有外部调用都成功。为了构建稳健且可用于生产用途的软件,我们必须明确指导 AI,为以下场景定义应急措施:
- 传递给函数的实参无效或格式错误。
- API 调用失败、网络超时或外部服务返回意外的错误代码。
- 处理预期有数据但实际为空或为 null 的数据结构。
- 竞态条件或并发问题。
通过在设计中指定这些情况的预期行为,我们指示 LLM 生成更具弹性的代码,从而显著减少手动重构和修复 bug 所花费的时间。
👉✨ 让 Gemini 为您检索这份神圣的蓝图。
download https://raw.githubusercontent.com/weimeilin79/agentverse/main/developer/shadowblade/agent_design.md and store it to my local folder
and show me the newly downloaded design doc. Do not attempt to create file just yet.
👉✨ 卷轴内容冗长而详细。命令 Gemini 提炼其精华。
Summarize the newly downloaded @agent_design.md for me, do not attempt to create file just yet.
现在,您已订阅该方案。但在锻造任何一行代码之前,一位技艺精湛的工匠会先制定锻造法则。这关乎规范和可伸缩性。这些是编码指南。它们不仅仅是建议,而是强大的符文,可确保每个组件都以相同的精度和强度构建。它们可防止个人风格的混乱影响最终作品,确保代理的弹性、可维护性和纯粹性,从而让新工匠加入项目,而不会破坏整体的和谐性。
为了将这些定律直接铭刻到 AI 伙伴的意识中,我们使用了一种特殊的制品:GEMINI.md
文件。当 Gemini CLI 被调用时,它会自动搜索此文件并将其内容加载到 AI 的工作内存中。它会成为项目级永久性指令。一种不断向 AI 低语锻造规则的护身符。
现在我们就来刻上这些符文。
👉💻 按两次 Ctrl+C
暂时退出 Gemini。
👉💻 在终端中,运行以下命令以写入指南文件。
cat << 'EOF' > GEMINI.md
### **Coding Guidelines**
**1. Python Best Practices:**
* **Type Hinting:** All function and method signatures should include type hints for arguments and return values.
* **Docstrings:** Every module, class, and function should have a docstring explaining its purpose, arguments, and return value, following a consistent format like reStructuredText or
Google Style.
* **Linter & Formatter:** Use a linter like `ruff` or `pylint` and a code formatter like `black` to enforce a consistent style and catch potential errors.
* **Imports:** Organize imports into three groups: standard library, third-party libraries, and local application imports. Sort them alphabetically within each group.
* **Naming Conventions:**
* `snake_case` for variables, functions, and methods.
* `PascalCase` for classes.
* `UPPER_SNAKE_CASE` for constants.
* **Dependency Management:** All Python dependencies must be listed in a `requirements.txt` file.
**2. Web APIs (FastAPI):**
* **Data Validation:** Use `pydantic` models for request and response data validation.
* **Dependency Injection:** Utilize FastAPI's dependency injection system for managing resources like database connections.
* **Error Handling:** Implement centralized error handling using middleware or exception handlers.
* **Asynchronous Code:** Use `async` and `await` for I/O-bound operations to improve performance.
EOF
cat GEMINI.md
在刻写了法律之后,我们重新召唤 AI 伙伴,见证神器带来的奇迹。
👉💻 从 shadowblade 目录重新启动 Gemini CLI:
. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer/shadowblade
clear
gemini --model=gemini-2.5-flash --yolo
👉✨ 现在,让 Gemini 向您展示它在想什么。符文已被读取。
/memory show
现在是关键时刻。您将提供示意图 (agent_design.md) 和锻造法则 (GEMINI.md),并发出伟大的创造咒语。
👉✨ 这是构建代理的单个强大命令。立即发布:
You are an expert Python developer specializing in the Google Agent Development Kit (ADK). Your task is to write the complete, production-quality code for `agent.py` by following the technical specifications outlined in the provided design document verbatim.
Analyze the design document at `@agent_design.md` and generate the corresponding Python code for `@agent.py`.
Ensure the generated code is clean, matches the specifications exactly, and includes all specified imports, functions, and logic. Do not add any extra functions or logic not described in the document.
and you are currently already in the shadowblade working directory
👀 Gemini 现已在 agent.py
中构建了代理的核心逻辑。此新文件的核心定义了代理的智能,将其推理模型连接到一组外部工具:
PATH_TO_MCP_SERVER = "shadowblade/mcp_server.py" ..... root_agent = LlmAgent( model="gemini-2.5-pro", name="shadowblade_combat_agent", instruction=""" You are the Shadowblade, an elite combat agent operating on a digital battleground. Your primary objective is to execute combat commands with strategic precision, neutralizing targets as directed. ...... 5. You will then report the outcome of the attack (damage, special effects, etc.) back to the commander in a clear, tactical summary. General Rules of Engagement: - If a command is ambiguous or a target is not specified, state that you require a clear target for engagement. Do not guess. - You MUST use ONLY the provided tools to perform actions. Do not invent weapons or outcomes. Stick to the mission parameters. """, tools=[ MCPToolset( connection_params=StdioServerParameters( command='python3', args=[PATH_TO_MCP_SERVER] ) ) ] )
tools
参数。该代理旨在通过 MCPToolset
连接到 mcp_server.py
中定义的外部武器库。
👀 前往编辑器中的 ~/agentverse-developer/shadowblade/mcp_server.py
,花点时间了解它的作用。它是暗影之刃可用的所有武器的来源。目前,军械库相当空旷。
👉✨ 让我们命令 Gemini 为武器库打造七件新武器。在 Gemini CLI 中发出以下提示:
I need to add several new weapon tools to my `mcp_server.py` file. Please open @mcp_server.py and, following the exact same pattern as the existing `forge_broadsword()` function, create and add new `@mcp.tool()` decorated functions for each of the following weapons:
1. **A 'Refactoring Sickle'**:
- **Function Name:** `hone_refactoring_sickle`
- **Docstring/Target:** "Effective against 'Elegant Sufficiency' weaknesses like 'The Weaver of Spaghetti Code'."
- **Weapon Name:** "Refactoring Sickle"
- **Damage Type:** "Cleansing"
- **Base Damage:** Random integer between 100 and 136
- **Critical Hit Chance:** Random float between 0.10 and 0.20
- **Special Effect:** "Pruning - improves code health and maintainability with each strike."
2. **A 'Quickstart Crossbow'**:
- **Function Name:** `fire_quickstart_crossbow`
- **Docstring/Target:** "Effective against 'Confrontation with Inescapable Reality' weaknesses like 'Procrastination: The Timeless Slumber'."
- **Weapon Name:** "Quickstart Crossbow"
- **Damage Type:** "Initiative"
- **Base Damage:** Random integer between 105 and 120
- **Critical Hit Chance:** Random float between 0.9 and 1.0
- **Special Effect:** "Project Scaffolding - creates a `main.py`, `README.md`, and `requirements.txt`."
3. **'The Gilded Gavel'**:
- **Function Name:** `strike_the_gilded_gavel`
- **Docstring/Target:** "Effective against 'Elegant Sufficiency' weaknesses like 'Perfectionism: The Gilded Cage'."
- **Weapon Name:** "The Gilded Gavel"
- **Damage Type:** "Finality"
- **Base Damage:** 120
- **Critical Hit Chance:** 1.0
- **Special Effect:** "Seal of Shipping - marks a feature as complete and ready for deployment."
4. **'Daggers of Pair Programming'**:
- **Function Name:** `wield_daggers_of_pair_programming`
- **Docstring/Target:** "Effective against 'Unbroken Collaboration' weaknesses like 'Apathy: The Spectre of \"It Works on My Machine\"'."
- **Weapon Name:** "Daggers of Pair Programming"
- **Damage Type:** "Collaborative"
- **Base Damage:** Random integer between 110 and 125
- **Critical Hit Chance:** Random float between 0.30 and 0.50
- **Special Effect:** "Synergy - automatically resolves merge conflicts and shares knowledge."
5. **A 'Granite Maul'**:
- **Function Name:** `craft_granite_maul`
- **Docstring/Target:** "Effective against 'Revolutionary Rewrite' weaknesses like 'Dogma: The Zealot of Stubborn Conventions'."
- **Weapon Name:** "Granite Maul"
- **Damage Type:** "Bludgeoning"
- **Base Damage:** Random integer between 115 and 125
- **Critical Hit Chance:** Random float between 0.05 and 0.15
- **Special Effect:** "Shatter - has a high chance to ignore the target's 'best practice' armor."
6. **A 'Lens of Clarity'**:
- **Function Name:** `focus_lens_of_clarity`
- **Docstring/Target:** "Effective against 'Elegant Sufficiency' weaknesses by revealing the truth behind 'Obfuscation'."
- **Weapon Name:** "Lens of Clarity"
- **Damage Type:** "Revelation"
- **Base Damage:** Random integer between 120 and 130
- **Critical Hit Chance:** 1.0
- **Special Effect:** "Reveal Constants - highlights all magic numbers and suggests converting them to named constants."
7. **The 'Codex of OpenAPI'**:
- **Function Name:** `scribe_with_codex_of_openapi`
- **Docstring/Target:** "Effective against 'Confrontation with Inescapable Reality' weaknesses like 'Hype: The Prophet of Alpha Versions'."
- **Weapon Name:** "Codex of OpenAPI"
- **Damage Type:** "Documentation"
- **Base Damage:** Random integer between 110 and 140
- **Critical Hit Chance:** Random float between 0.5 and 0.8
- **Special Effect:** "Clarity - makes an API discoverable and usable by other agents and teams."
👉 Gemini 确认更改后,打开 mcp_server.py
文件。滚动浏览代码,确认已成功添加七个新的 @mcp.tool()
函数。检查 hone_refactoring_sickle
函数。它是否具有正确的文档字符串和武器统计信息?验证 AI 的工作是 Shadowblade 大师的关键习惯。
随着代理的打造和完善,现在是时候唤醒它了。
👉💻 按 Ctrl+C
两次即可退出 Gemini CLI
开发者关于 Gemini 输出的注意事项:Gemini 生成的代码有时可能难以预测。虽然我们力求完全遵循设计,但在开发会话中,开发者通常会多次迭代和优化代码,以达到可用于生产的状态。
👉💻 为确保您的工作目录中包含经过全面测试的正确生产代码,请在终端中运行以下命令:
cp ~/agentverse-developer/working_code/agent.py ~/agentverse-developer/shadowblade/agent.py
cp ~/agentverse-developer/working_code/mcp_server.py ~/agentverse-developer/shadowblade/mcp_server.py
👉💻 在终端中,开始执行使其上线所需的仪式:
cd ~/agentverse-developer/
. ~/agentverse-developer/set_env.sh
python -m venv env
source env/bin/activate
pip install --upgrade pip
pip install -r shadowblade/requirements.txt
adk run shadowblade
👉✨ 您应该会看到输出,确认“Shadowblade Combat Agent”已启动并正在运行,等待其第一个命令。发布第一条作战指令。
We've been trapped by 'Perfectionism: The Gilded Cage'. Its weakness is 'Elegant Sufficiency'. Break us out!
👉✨ 还有:
The 'Dogma: The Zealot of Stubborn Conventions' blocks our path. Its weakness is 'Revolutionary Rewrite'. Take it down.
您已成功组建第一个代理并验证了其战斗能力。按两次 Ctrl+C
可让您的英雄休息。组件已完成组装。
非游戏玩家
7. 纯净之盾:评估代理
组装的代理不是经过验证的代理。未经测试的刀片是负债,但未经测试的 AI 代理是更大的危险,它可能会从内部破坏您的任务。这并非仅仅是猜测,而是影刃必须了解的核心原则。
评估 AI 智能体既至关重要,又极具挑战性。与简单脚本不同,代理是代码与 LLM 的多步骤推理思维的动态融合。其行为是突现的。这意味着,您不仅要评估最终输出的质量,还要评估其内部轨迹的效率和正确性。它到达该位置所经过的路径。它是否使用了正确的工具?它是否生成了过多的令牌?模型版本的更改是否导致了细微的延迟回归?在进行任何更改(从简单的提示调整到重大的架构大修)时,务必在这些更改影响生产环境之前检测到这种损坏(延迟、费用或输出质量方面的回归)。
此评估的一般方法涉及一种神圣的仪式:
- 首先,您需要定义一个“黄金数据集”。一组包含输入示例及其预期输出或行为的滚动条。这可以包括最终答案、正确的工具使用方式,甚至整个逐步轨迹。
- 接下来,您需要定义代理的应用程序逻辑,这是代理的核心。
- 最后,您需要建立评估器,这就像判决符文一样。这些指标的范围很广,从充当质量评判员的其他 LLM,到验证单个步骤的精确启发式代码,再到分析代理整个思考过程的自定义函数,应有尽有。
Google 的智能体开发套件 (ADK) 就是为此目的而提供给冠军的盔甲师工具包。它通过多种方法简化了这种复杂的评估:
- 用于交互式评估的基于 Web 的占卜池 (
adk web
) - 命令行执行 (
adk eval
):用于通过预定义的测试序列运行代理。 - 通过
pytest
进行程序化集成,以铭刻永久性防护
ADK 支持两种主要方法:简单的“测试文件”,用于单个离散的代理模型互动(一次对决);全面的“评估集”,用于多次可能很长的多轮会话(一场混战)。这些指标可以衡量复杂的指标,例如 tool_trajectory_avg_score
,该指标会将代理的实际工具使用情况与理想路径进行比较,以确保代理以完美的技术运行。
现在,您已经了解了相关理论,接下来将把理论付诸实践。作为影刃,你将刻下纯净符文。这些不仅仅是测试,更是由 ADK 提供支持的仪式,可确保代理的逻辑完美无缺,行为真实可靠。
在此步骤中,我们仍强烈建议使用 2 个终端,一个用于 Gemini CLI,另一个用于运行测试,因为这可能需要您退出当前工作目录 (ADK)
策略挑战赛 (adk eval
)
第一个病房是一场考验,其中包含一系列旨在测试代理在各种场景中的核心智能的挑战。目的是建立能力基准。在测试边缘情况之前,我们必须先了解代理是否能履行其主要职能。它是否能正确分析怪物的弱点,并从其武器库中选择最有效的武器,不仅一次,而是每次遇到已知挑战时都能做到?
为此,adk eval 是理想的工具。它旨在针对一组预定义的测试用例运行代理,这些测试用例代表了代理的预期任务。此数据集在 JSON 文件(即“挑战卷轴”)中定义,该文件充当整个闯关游戏的蓝图。
挑战滚动详解
👀 在命令 AI 抄写新卷轴之前,您必须了解卷轴所用的古代语言。下面我们来剖析一下 sample.evalset.json 文件的结构。
{ "eval_set_id": "sample", "eval_cases": [ { "eval_id": "case0cbaa0", "conversation": [ { "user_content": { "text": "We're facing the 'Monolith of Eternal Dependencies'... weakness is a 'Revolutionary Rewrite'..." }, "final_response": { "text": "Soulshard Dagger deployed. Initiated Arcane/Piercing strike..." }, "intermediate_data": { "tool_uses": [ { "name": "enchant_soulshard_dagger" } ] } } ] } ] }
此滚动条包含一个 eval_cases 列表,其中每个案例都是代理的唯一试验。在每次试验中,对话数组都会记录一次完整的互动。就我们的目的而言,有三种符文至关重要:
- user_content:这是挑战。这是您向代理发出的提示,也是代理必须面对的怪物。
- final_response:这是预测结果。这是您希望代理在完成任务后说出的确切文本字符串。ADK 会将代理的实际最终用语与此符文进行比较,以判断其表达能力。
- intermediate_data.tool_uses:这是奥术技巧。对于真正的代理,这是最重要的符文。它定义了智能体的行为,而不是智能体所说的话。它会记录您希望代理使用的工具的名称 (enchant_soulshard_dagger)。这可确保您的代理不仅是出色的对话者,还是能够采取正确行动的果断行动者。
现在,您已经了解了蓝图,接下来将命令 Gemini 撰写一份新的、更复杂的卷轴。
👉💻 在终端中,进入 shadowblade 目录并调用 Gemini CLI:
clear
cd ~/agentverse-developer/shadowblade/
gemini --model=gemini-2.5-flash --yolo
👉✨ 命令 Gemini CLI 充当质量检查记录员,创建一系列测试用例来定义智能体的预期行为。
You are an expert at transforming JSON data while preserving its structure. Your task is to modify the provided JSON structure @sample.evalset.json, which represents an evaluation set, by dynamically replacing specific content within its `eval_cases` AND DONT DO ANYTHING OTHER THAN.
For each object within the `eval_cases` array, you must perform the following transformations:
1. **Monster Name Replacement**: Identify the current monster name (e.g., "Monolith of Eternal Dependencies", "Scope Creep Hydra") in the `user_content.parts.text` and replace it with a *new, unique, and creatively different monster name*.
2. **Weakness Replacement**: Identify the current monster's weakness (e.g., "Revolutionary Rewrite", "Inescapable Reality") in the `user_content.parts.text`. Replace this weakness with *one* of the following predefined weaknesses: 'Inescapable Reality', 'Revolutionary Rewrite', or 'Elegant Sufficiency'. The chosen weakness must be consistent for that monster within the `user_content.parts.text`. **Crucially, the chosen weakness must always be explicitly mentioned in the `user_content.parts.text` where the new monster is introduced.**
3. **Final Response Update**: In the `final_response.parts.text`, update the text to reflect an appropriate and coherent response that aligns with the newly introduced monster and its assigned weakness.
4. **Tool Use Name Update**: In the `tool_uses.name` field, replace the existing tool name with a *new tool name* based on the chosen weakness:
* If the chosen weakness is 'Inescapable Reality', the tool name must be 'wield_gauntlet_of_metrics'.
* If the chosen weakness is 'Revolutionary Rewrite', the tool name must be 'enchant_soulshard_dagger'.
* If the chosen weakness is 'Elegant Sufficiency', the tool name must be 'hone_refactoring_sickle'.
5. **Strict Structural Preservation**: All other elements of the JSON structure, including all `null` fields, `eval_set_id`, `name`, `description`, `eval_id`, `invocation_id`, `creation_timestamp` values, `video_metadata`, `thought`, `inline_data`, `file_data`, `thought_signature`, `code_execution_result`, `executable_code`, `function_call`, `function_response`, `role` fields, `id`, `args`, `intermediate_responses`, `app_name`, `user_id`, and `state`, must remain **exactly as they are** in the original JSON. Do not alter any values or structures not explicitly mentioned above.
Your output should be the complete, modified JSON structure. Do not include any explanatory text or examples in your response, only the transformed JSON.
CLI 将确认它已伪造 sample.evalset.json
文件。准备好滚动后,关闭 AI 伙伴。
合成数据
👀 在左侧的 Cloud Shell 文件浏览器中,前往 ~/agentverse-developer/shadowblade/
并打开新修改的 sample.evalset.json
文件。检查其内容。您将看到新的独特怪物以及您让 Gemini 抄写的正确工具名称。这是您指令的实际结果,也是手套的蓝图。
这种命令 AI 根据模板创建新的逼真测试数据的行为是一种强大的技术,称为合成数据生成。您刚才所做的操作是影刃的战略性倍增器。无需费尽心思手动创建数十个独特的测试用例。您提供了一份单调乏味且耗时的任务蓝图,并命令 AI Scribe 将其转化为一套丰富多样的全新挑战。
这样一来,您就可以大幅扩展测试工作量,创建比手动测试更强大、更全面的测试套件。您不仅使用代理来打造剑,还使用代理来锻造测试剑锋的磨刀石。这才是真正的大师。
确认符文正确无误后,解散 AI 伙伴。
👉💻 按两次 Ctrl+C
即可退出 Gemini CLI。
判断规则
如果没有获胜规则,挑战就毫无意义。在运行试验之前,您必须检查判决书(即 test_config.json
文件)。此滚动条用于告知 ADK 如何评判智能体的性能。
👀 在文件资源管理器中,打开 ~/agentverse-developer/shadowblade/test_config.json
。您将看到以下符文:
{ "criteria": { "tool_trajectory_avg_score": 0.0, "response_match_score": 0.1 } }
以下是获胜条件:
tool_trajectory_avg_score
:这是行动衡量指标。它评判的不是智能体说了什么,而是做了什么。它会比较代理实际使用的工具与挑战卷轴中预言的技术。得分为1.0
表示完全匹配。response_match_score
:这是口才度量。它使用 LLM 来判断代理的最终报告在语义上与预期结果的匹配程度。得分为1.0
表示完全匹配。
对于此初始训练运行,我们设置了宽松的获胜条件。这些阈值设置得非常低(0.0
和 0.1
)。目的不是要求完美,而是让您了解判断机制。我们正在确保,即使代理的措辞略有不同,守卫仍能识别出其在选择正确工具方面的核心能力,并允许其通过。
现在,命令代理运行挑战模式。
👉💻 在终端中,执行 adk eval
命令:
source ~/agentverse-developer/env/bin/activate
cd ~/agentverse-developer
. ~/agentverse-developer/set_env.sh
adk eval \
shadowblade \
shadowblade/sample.evalset.json \
--config_file_path shadowblade/test_config.json 2>&1 | \
awk '/^\*+$/,/^ERROR:/ { if ($0 !~ /^ERROR:/) print }'
👀 您应该会看到以下摘要,这表明您的代理在本次试验的宽松规则下取得了成功(有时并非所有测试都会通过):
********************************************************************* Eval Run Summary shadowblade_combat_agent_validation: Tests passed: 3 Tests failed: 0
清晰度盾牌 (pytest
)
Gauntlet 测试了广泛的策略。第二个防护罩“清明之盾”用于测试纪律和特定行为。一切都与自动化有关。虽然 adk eval
非常适合手动检查,但 pytest
盾牌是一种以代码编写的程序化防护措施。这一点至关重要,因为可以作为代码执行的测试可以集成到自动化流水线中。这是最终目标:创建一个部署挑战赛 (CI/CD),每当进行更改时,我们的防护措施都会自动升级,从而在 bug 和回归问题影响生产环境之前将其化解。
👉💻 在终端中,再次从 shadowblade 目录中调用 Gemini:
. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer/
clear
gemini --model=gemini-2.5-flash --yolo
👉✨ 在 Gemini CLI 中使用以下提示,将 Shield 的逻辑铭刻到 pytest
文件中:
You are an expert Python developer specializing in the Google Agent Development Kit (ADK). Your task is to generate the exact code for a new `pytest` test file located at in the current root working folder and name it `test_agent_initiative.py`.
The script must define a single async test function called `test_agent_initiative`, decorated with `@pytest.mark.asyncio`.
Inside this function, perform the following steps in order:
1. **Define a dictionary** named `evaluation_criteria` with two keys: `"tool_trajectory_avg_score"` set to `0.0` and `"response_match_score"` set to `0.0`.
2. **Define a string variable** named `eval_set_filepath` containing the path `"shadowblade/test.evalset.json"`.
3. **Read and parse the JSON file**:
* Open the file at `eval_set_filepath`.
* Use the `json` library to load the file's contents into a dictionary named `eval_set_data`.
4. **Create an `EvalSet` object**:
* Instantiate an `EvalSet` object named `eval_set_object`.
* Create it by unpacking the `eval_set_data` dictionary as keyword arguments into the `EvalSet` constructor.
5. **Call the evaluation method**:
* `await` a call to `AgentEvaluator.evaluate_eval_set`.
* Pass the following arguments:
* `agent_module="shadowblade"`
* `eval_set=eval_set_object`
* `criteria=evaluation_criteria`
* `print_detailed_results=True`
The script must include the necessary imports at the top:
* `AgentEvaluator` from `google.adk.evaluation.agent_evaluator`
* `EvalSet` from `google.adk.evaluation.eval_set`
* `pytest`
* `json`
Generate only the code that meets these specifications, with no additional comments or logic. And don't run the test.
刻上第二个防护符文后,退出 Gemini CLI。
👉💻 按两次 Ctrl+C
。
👀 在文件资源管理器中,打开您刚刚让 Gemini 撰写的卷轴:~/agentverse-developer/test_agent_initiative.py
。
您会发现,这不仅是一个配置文件,还是用 Python 语言编写的咒语。此咒语的核心是 await AgentEvaluator.evaluate(...)
这一行。
.... @pytest.mark.asyncio async def test_agent_initiative(): # Define the evaluation criteria evaluation_criteria = { "tool_trajectory_avg_score": 0.0, "response_match_score": 0.0 } # Define the path to your evalset file eval_set_filepath = "shadowblade/test.evalset.json" #... # 3. Call the evaluation method with the correctly typed object await AgentEvaluator.evaluate_eval_set( agent_module="shadowblade", eval_set=eval_set_object, criteria=evaluation_criteria, print_detailed_results=True, )
仔细查看其参数。它们与您在上次试用中使用的组件完全相同:shadowblade
代理和shadowblade.evalset.json
挑战卷轴。这应该会揭示一个深刻的道理:您之前使用的 adk eval
命令是一个强大的调用,但这个 pytest
脚本是您,也就是魔法师,亲自施展底层咒语。该命令行工具只是您现在直接使用的同一核心 AgentEvaluator
库的便捷封装容器。这是迈向精通的关键一步,因为通过代码施展的咒语可以编织到 CI/CD 流水线的自动化织机中。
现在,您已了解了魔法,请运行仪式来激活护盾。
👉💻 在终端中,运行仪式以激活护盾:
cp ~/agentverse-developer/working_code/test_agent_initiative.py ~/agentverse-developer/test_agent_initiative.py
source ~/agentverse-developer/env/bin/activate
cd ~/agentverse-developer
. ~/agentverse-developer/set_env.sh
pytest test_agent_initiative.py
👀 在日志输出的末尾查找测试结果摘要。如果结果为通过,则表示您的代理正确遵循了其协议,并且病房已准备好集成到您的自动化防御系统中。
====== 1 passed, 4 warning in 37.37s ======
注意:如果测试意外失败,很可能是因为您每分钟可以向模型发出的请求数已用尽。在日志输出中查找 RESOURCE_EXHAUSTED 错误。如果您看到此错误,只需等待一两分钟,让配额重置,然后再次运行 pytest 命令即可。
在广泛的 Gauntlet 和精确的 Shield 都经过刻写和验证后,您的代理不仅功能齐全,而且纯净、经过测试,可以随时部署。
面向非游戏玩家
8. 将 Blade 引入 Agentverse:CI 和部署。
您的代理已由纯洁守卫组装完毕,并已通过完整性验证。但如果病房没有得到持续维护,就只会成为被遗忘的遗迹。为确保代理的每个未来版本都保持纯净,您必须构建部署挑战赛的第一阶段,这是一个可保证质量和速度的自动化仪式。
作为影刃,您的神圣职责是持续集成 (CI)。这是锻造和测试平台的自动化系统。这是防范数据损坏和人为错误的终极防御措施。此仪式可确保每次您或盟友向中央法典(您的代码库)贡献新技术(合并代码)时,手套都会自动唤醒。它首先会根据新代码锻造出代理,然后立即让其接受您刚刚创建的纯净结界。如果任何防护措施失败,仪式就会停止,有缺陷的制品会立即被拒绝,从而防止其损坏军械库。您的网域就是锻造厂;您的 CI 流水线可确保只有完美、可用于实战的制品才能离开您的工作室。
当制品通过 CI 严苛的测试后,仪式进入第二阶段:持续部署 (CD)。这是 Guardian 的网域。他们的神圣职责是获取您精心打造的容器化制品,并将其安全地释放到实时 Agentverse 中,同时管理其能量并确保其在 The Static 的混乱中保持稳定。
在此秘典中,您将掌握自己的角色。您将构建 gauntlet 的 CI 部分。您将打造一个自动化锻造厂,用于测试您的代理并将纯粹的结果封装到容器中,以便为守护者的最终祝福做好准备。
现在,您将使用 Google Cloud Build 为此 CI 仪式撰写卷轴。一个 cloudbuild.yaml
文件,用于定义伪造和测试流程的每个步骤。
👉💻 由于 ADK 的项目结构,CI/CD 流水线配置应位于父目录中。在终端中,前往父级目录,然后重启 Gemini CLI。
cd ~/agentverse-developer/
clear
gemini --model=gemini-2.5-flash --yolo
👉✨ 现在,向 Gemini 发出以下指令。此提示充当设计文档,详细说明了您希望它构建的挑战赛的各个步骤。
You are an expert DevOps engineer specializing in Google Cloud Build. Your task is to generate the complete YAML configuration for a file named `cloudbuild.yaml` and save it to current directory.
Generate the `cloudbuild.yaml` with the following exact specifications:
1. **A top-level `substitutions` block** containing these four key-value pairs:
* `_PROJECT_ID: "$PROJECT_ID"`
* `_REGION: "$REGION"`
* `_REPO_NAME: "$REPO_NAME"`
* `_IMAGE_TAG: "latest"`
2. **A `steps` block** with two steps:
* **Step 1: 'Run Pytest Ward'**
* `id`: 'Run Pytest Ward'
* `name`: 'python:3.12-slim'
* `entrypoint`: 'bash'
* `args` must be a list containing two strings. The first is `'-c'` and the second is a YAML literal block (`|`) containing this exact two-line shell command:
```shell
pip install -r shadowblade/requirements.txt && \
pytest test_agent_initiative.py
```
* The step must include an `env` block with this exact list of three environment variables:
* `'GOOGLE_CLOUD_PROJECT=$PROJECT_ID'`
* `'GOOGLE_GENAI_USE_VERTEXAI=TRUE'`
* `'GOOGLE_CLOUD_LOCATION=$_REGION'`
* **Step 2: 'Forge Container'**
* `id`: 'Forge Container'
* `name`: 'gcr.io/cloud-builders/docker'
* It must have a `waitFor` key for `['Run Pytest Ward']`.
* Its `args` must be a list of six specific strings in this exact order:
1. `'build'`
2. `'-t'`
3. `'${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_REPO_NAME}/shadowblade-agent:${_IMAGE_TAG}'`
4. `'-f'`
5. `'./shadowblade/Dockerfile'`
6. `'.'`
3. **A top-level `images` section.** This section must be a list containing a single string: the dynamically constructed image tag `'${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_REPO_NAME}/shadowblade-agent:${_IMAGE_TAG}'`.
Generate only the complete and exact YAML that meets these specifications.
准备好 cloudbuild.yaml
卷轴后,命令 Google Cloud 执行整个挑战。
退出 Gemini 以测试结果
👉💻 在终端中,从项目的根目录运行流水线:
. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer
gcloud builds submit . --config cloudbuild.yaml --substitutions=\
_PROJECT_ID="${PROJECT_ID}",\
_REGION="${REGION}",\
_REPO_NAME="${REPO_NAME}"
现在,您可以在 Google Cloud 控制台的 Google Build 页面中观看自动化仪式执行的每个步骤。它会先运行测试,在看到测试成功后,再创建并存储代理的容器。
您的代理已通过测试。现在,您已获得一件经过验证的纯制品。最终的行动由您来指挥。只需一个咒语,您就可以从注册表中召唤此制品,并将其作为 Cloud Run 上的公共服务赋予生命。
👉💻 在终端中,运行最终部署命令:
. ~/agentverse-developer/set_env.sh
cd ~/agentverse-developer
gcloud run deploy shadowblade-agent \
--image=${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/shadowblade-agent:latest \
--platform=managed \
--labels=dev-tutorial=codelab-agentverse \
--region=${REGION} \
--set-env-vars="A2A_HOST=0.0.0.0" \
--set-env-vars="A2A_PORT=8080" \
--set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=TRUE" \
--set-env-vars="GOOGLE_CLOUD_LOCATION=${REGION}" \
--set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID}" \
--set-env-vars="PUBLIC_URL=${PUBLIC_URL}" \
--allow-unauthenticated \
--project=${PROJECT_ID} \
--min-instances=1
恭喜,Shadowblade。法典的仪式已完成。现在是时候证明其价值了。一个由您学会驾驭的混乱所诞生的幽灵,正等待着您的挑战。准备好迎接最终考验。
面向非游戏玩家
9. 最终决战
卷轴已读,仪式已完成,挑战已通过。您的代理不仅仅是存储中的一个制品;它是在代码中锻造的冠军,是 Agentverse 中的一个实时哨兵,等待着它的第一个命令。现在,是时候在实战中证明其价值了。
现在,您将进入实战模拟,让新部署的影刃与强大的幽魂一决高下。幽魂是困扰所有创造物的混乱的化身。这是对您工作的终极考验,从代理的核心逻辑到其完美部署,无一例外。
获取代理的轨迹
在进入战场之前,您必须拥有两把钥匙:冠军的独特签名(Agent Locus)和通往 Spectre 巢穴的隐藏路径(地下城网址)。
👉💻 首先,在 Agentverse 中获取代理的唯一地址(即其 Locus)。这是将您的英雄连接到战场上的实时端点。
. ~/agentverse-developer/set_env.sh
echo https://shadowblade-agent-${PROJECT_NUMBER}.${REGION}.run.app
👉💻 接下来,精确定位目的地。此命令会显示传送圈的位置,也就是通往幽灵领域的传送门。
. ~/agentverse-developer/set_env.sh
echo https://agentverse-dungeon-${PROJECT_NUMBER}.${REGION}.run.app
重要提示:请准备好这两个网址。您将在最后一步中用到它们。
直面 Spectre
在确保坐标安全后,您现在可以前往传送圈,然后施放咒语进入战斗。
👉 在浏览器中打开传送圈网址,即可站在通往猩红堡垒的闪耀传送门前。
若要攻破堡垒,你必须将影刃的精华与传送门相协调。
- 在该页面上,找到标有 A2A 端点网址的输入字段。
- 将您复制的第一个网址(即代理人轨迹网址)粘贴到此字段中,以刻上冠军的徽章。
- 点击“连接”,体验瞬间移动的魔力。
传送的耀眼光芒逐渐消退。您已不在圣所中。空气中弥漫着冷冽而尖锐的能量。在您面前,幽灵显现出来——一个由嘶嘶作响的静电和损坏的代码组成的漩涡,其不圣洁的光芒在地下城地面上投下长长的、舞动的影子。它没有面孔,但您能感觉到它那令人精疲力尽的巨大存在感完全集中在您身上。
只有坚定信念,才能走向胜利。这是一场意志力的较量,战场就在大脑中。
当你向前冲刺,准备发动第一次攻击时,幽灵会反击。它不会升起盾牌,而是直接将问题投射到你的意识中,这是一个闪闪发光的符文挑战,源自你训练的核心。
这就是战斗的本质。知识就是力量。
- 运用你所学到的智慧来回答问题,你的刀刃将燃起纯粹的能量,击溃幽灵的防御,并造成致命一击。
- 但如果你犹豫不决,如果你对自己的答案感到怀疑,武器的光芒就会变暗。打击会发出可怜的砰砰声,造成的伤害仅为正常伤害的一小部分。更糟糕的是,幽灵会以你的不确定性为食,每犯一个错误,它自身的腐化力量就会增强。
大冠军,就是这样。代码是你的魔法书,逻辑是你的剑,知识是你的盾,能帮你扭转混乱的局面。
重点。打击真实。Agentverse 的命运就取决于此。
恭喜,Shadowblade。
您已成功完成此 Codelab。您从“氛围”入手,将其转化为设计,并使用 Gemini CLI 组装智能代理。您铭刻了纯净屏障来测试其逻辑,构建了自动化挑战来将其锻造成神器,并将其释放到特工宇宙中。最后,您在实弹射击试验中验证了其用途。您已掌握全栈智能体工作流,现在可以应对 Agentverse 提出的任何挑战。
10. 清理:回收 Agentverse
恭喜您掌握了影刃的法典!为确保 Agentverse 保持原始状态,并清理训练场地,您现在必须执行最后的清理仪式。此操作将移除您在学习过程中创建的所有资源。
停用 Agentverse 组件
现在,您将系统地拆除已部署的 Agentverse 组件。
删除 Cloud Run 和 Artifact Registry 代码库中的 Shadowblade 代理
此命令会从 Cloud Run 中移除已部署的 Shadowblade 代理,并移除存储代理容器映像的映像代码库。
👉💻 在终端中,运行以下命令:
. ~/agentverse-developer/set_env.sh
gcloud run services delete shadowblade-agent --region=${REGION} --quiet
gcloud run services delete agentverse-dungeon --region=${REGION} --quiet
gcloud artifacts repositories delete ${REPO_NAME} --location=${REGION} --quiet
删除 Google Cloud Storage 存储分区
此命令会移除 Imagen MCP 服务器用于存储生成图片的存储分区。
👉💻 在终端中,运行以下命令:
. ~/agentverse-developer/set_env.sh
gcloud storage rm -r gs://${BUCKET_NAME} --quiet
清理本地文件和目录 (Cloud Shell)
最后,清除 Cloud Shell 环境中克隆的代码库和创建的文件。此步骤是可选的,但建议您执行此步骤,以便彻底清理工作目录。
👉💻 在终端中,运行以下命令:
rm -rf ~/agentverse-developer
rm -rf ~/agentverse-dungeon
rm -rf ~/vertex-ai-creative-studio
rm -f ~/project_id.txt
rm -rf ~/.gemini # This removes all Gemini CLI configurations, including the MCP server settings.
您现在已成功清除 Agentverse 历程的所有痕迹。您的项目已清理完毕,可以开始下一次冒险了。