Vertex AI 技能注册表
技能注册表是 Gemini Enterprise Agent Platform 构建支柱服务,用于将版本化的 SKILL.md 软件包以 zip 压缩包的形式存储在 aiplatform.googleapis.com 上。ADK-Rust 以仅消费方式与其集成:代理发现、下载并加载由中央统一管理的技能,而配置(创建、更新、删除、发布)则仍由平台工具负责。
**注意:**技能注册表 API 为 v1beta1(预览版),仅通过位于
us-central1、europe-west4和us-east5中的区域性https://{location}-aiplatform.googleapis.com端点提供。它不同于代理注册表,后者是用于对代理进行编目管理的独立 Govern 支柱服务。
设置
在 adk-skill 上启用此功能(并在 adk-cli 上启用命令所需的功能):
[dependencies]
adk-skill = { version = "2.1.0", features = ["vertex-skill-registry"] }
身份验证使用应用默认凭据(Application Default Credentials,gcloud auth application-default login)。配置来自 GOOGLE_CLOUD_PROJECT 和 GOOGLE_CLOUD_LOCATION,也可以使用显式值。
客户端执行和不执行的操作
| 操作 | 接口 |
|---|---|
| 获取技能(带有效载荷) | SkillRegistryClient::get_skill |
| 列出技能 | SkillRegistryClient::list_skills |
| 语义搜索 | SkillRegistryClient::search_skills |
| 列出 / 获取修订版本 | list_skill_revisions、get_skill_revision |
| 下载、验证、提取 | fetch_skill_content、fetch_skill_revision_content |
| 创建 / 更新 / 删除 | 尚未实现 — 平台工具负责生命周期 |
每个下载的有效载荷都会根据注册表的摘要进行 SHA-256 验证,并在使用任何字节之前,通过纵深防御式 ZIP 验证进行解压(包括条目数量、路径遍历、符号链接、重复名称、大小、压缩比和深度限制)。
将注册表技能加载到 agent 中
load_skill_index_from_registry 生成标准的 SkillIndex,因此注入、选择和协调的工作方式与文件系统技能完全相同:
use adk_skill::registry::{
RegistrySkillFilter, SkillRegistryClient, SkillRegistryConfig,
load_skill_index_from_registry, merge_skill_indexes,
};
use adk_skill::load_skill_index;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = SkillRegistryClient::new_with_adc(SkillRegistryConfig::from_env()?)?;
// Select by semantic search…
let remote = load_skill_index_from_registry(
&client,
RegistrySkillFilter::by_query("quarterly reporting").with_top_k(5),
)
.await?;
// …or by explicit names, optionally pinned to a revision.
let pinned = load_skill_index_from_registry(
&client,
RegistrySkillFilter::by_names(["report-writer"]).with_revision("3"),
)
.await?;
// Merge with project-local skills — local wins on name collision,
// matching the project-local-over-global precedence of
// load_skill_index_with_extras.
let local = load_skill_index(".")?;
let merged = merge_skill_indexes(local, remote);
println!("{} skill(s) available ({} pinned)", merged.len(), pinned.len());
Ok(())
}
基于注册表的 SkillDocuments 通过与文件系统技能相同的解析器和哈希处理构建;它们携带一个由 {resource name}/SKILL.md 组成的虚拟 path,且没有 last_modified 时间戳。
search_skills agent 工具
SkillSearchTool 向 LLM agents 提供注册表搜索功能。它是只读且并发安全的,因此可以参与并行工具调度:
use adk_skill::registry::{SkillRegistryClient, SkillRegistryConfig, SkillSearchTool};
use std::sync::Arc;
fn build_tool() -> adk_core::Result<SkillSearchTool> {
let client = SkillRegistryClient::new_with_adc(SkillRegistryConfig::from_env()?)?;
Ok(SkillSearchTool::new(Arc::new(client)))
}
输入为 {"query": string, "top_k"?: integer};输出为一个 JSON 数组,其中包含 {name, skillName, description} 对象,最佳匹配项排在最前(API 不返回分数)。
CLI
adk-rust 二进制文件在 vertex-skill-registry 特性后新增了两个只读子命令:
[dependencies]
adk-cli = { version = "2.1.0", features = ["vertex-skill-registry"] }
# Semantic search (best match first)
adk-rust skills search "quarterly reporting" --top-k 5
# Materialize a skill package under .skills/<skill-id>/
adk-rust skills pull report-writer
# Pin a revision and choose the target directory
adk-rust skills pull report-writer --revision 3 --dir vendored-skills
两个命令都会读取 --project/--location 标志,并在未提供时回退到 GOOGLE_CLOUD_PROJECT/GOOGLE_CLOUD_LOCATION。拉取的技能会放置在标准技能布局中(SKILL.md 及其 references/),因此 skills list、skills match 和 agent 技能发现机制会立即将其识别。不存在 push 命令——发布通过平台工具完成。