☰
Google Cloud Agent Platform 中的 Skills 能力单元设计与 GKE 实战
2026/10/6 9:33:05 网站建设 项目流程

1. 项目概述:当“skills”不再只是简历上的单词,而成为可执行、可编排、可演化的智能体能力单元

最近在多个技术社区和开发者频道里,“skills”这个词出现的频率高得有点反常——它既不是传统意义上的软技能(soft skills),也不是某款新出的编程课名称,而是在 Google Cloud 的 Agent Platform 文档、Gemini 开发者控制台、GKE 集群部署日志里反复跳出来的核心概念。我第一次在 GKE 上调试一个失败的 Agent 任务时,控制台报错里赫然写着missing required skill: 'code_assist_v2',当时真以为是权限配置漏了什么,结果翻遍 IAM 角色文档都没找到对应条目。直到在 Agent Platform 的 YAML 配置里看到skills:这个字段下嵌套着name: "gemini-code-assist"和version: "2024-06-15",才意识到:这里的skills 是一种标准化、可声明、带版本契约的原子能力封装,本质是智能体(Agent)调用外部服务或本地函数的“能力插槽”(capability slot),而非功能模块或 API 接口。

它解决的是当前 AI 工程化落地中最棘手的三个断层问题:一是模型能力与业务逻辑的耦合过深——写个“自动写周报”的 Agent,结果所有格式解析、数据拉取、模板渲染全塞进提示词里,一改需求就得重写 prompt;二是多模型协同缺乏统一调度语言——Gemini 负责推理,Claude 处理长文本,本地 Python 函数做数据清洗,但谁来决定什么时候调哪个、传什么参数、怎么兜底?三是能力复用停留在 copy-paste 层面——团队 A 写了个“从飞书表格导出 CSV 并校验字段”的函数,团队 B 想用,得自己重写一遍、改路径、适配新环境。而 skills 的设计,就是把这三件事压进一个 YAML 文件里:定义输入输出 Schema、绑定执行器(可以是 Cloud Function、GKE Pod、甚至本地 Docker 容器)、声明依赖和超时策略,最后由 Agent Platform 统一编排。

适合读这篇的人很明确:你正在用 Gemini 或其他大模型构建实际业务 Agent(比如客服助手、自动化报告生成器、内部知识检索 Bot),已经卡在“功能堆砌难维护”“多服务调用乱成麻”“同事想复用你的代码却无从下手”这个阶段;或者你是平台工程师,正评估如何在现有 GKE 集群上支撑上百个业务团队的 AI 能力交付。它不讲抽象理论,只拆解真实场景里 skills 怎么定义、怎么部署、怎么被 Agent 调用、为什么必须用 GKE 而不是直接跑在 Cloud Run 上——这些细节,官方文档里要么一笔带过,要么藏在十几个嵌套页面的 footnote 里。

2. 核心设计逻辑:为什么 skills 必须是声明式、带版本、可隔离的独立单元?

2.1 不是函数,不是插件,而是“能力契约”(Capability Contract)

很多人第一反应是:“这不就是个封装好的函数吗?”——错。函数(function)关注“怎么执行”,skills 关注“能做什么”。举个具体例子:一个名为fetch_sales_data的 skills,它的 YAML 定义里最关键的不是 Python 代码,而是这一段:

input_schema: type: object properties: date_range: type: string pattern: "^\\d{4}-\\d{2}-\\d{2}:\\d{4}-\\d{2}-\\d{2}$" description: "日期范围,格式为 '2024-01-01:2024-01-31'" region: type: string enum: ["CN", "US", "EU"] default: "CN" output_schema: type: object properties: records: type: array items: type: object properties: order_id: {type: string} amount: {type: number} currency: {type: string} summary: type: object properties: total_orders: {type: integer} total_revenue: {type: number}

这段 Schema 定义的不是“这个函数接收什么参数”,而是“任何符合此契约的实现,都承诺返回结构化销售数据”。这意味着:

  • 前端开发团队可以用 TypeScript 写一个调用内部 BI API 的版本;
  • 数据团队可以用 Python + Pandas 写一个直连数仓的版本;
  • 甚至测试团队可以写一个返回 mock 数据的版本,只要 JSON 结构完全匹配,Agent 就能无缝切换。

这种契约思维,直接把“能力复用”从代码级提升到协议级。我见过最典型的反例:某电商团队的 Agent 里硬编码了https://bi-api.internal/v1/sales?date=...,结果 BI 系统升级 URL 变成/v2/,整个 Agent 失效,排查花了 3 小时——而如果当初定义的是 skills,只需更新 skills 的 endpoint 字段,Agent 逻辑一行不动。

2.2 版本控制不是可选,而是安全底线

skills 的version字段(如2024-06-15)绝非形式主义。它解决的是两个致命问题:
第一,Agent 的稳定性依赖。假设你上线了一个send_emailskills v1.0,它接受{to, subject, body}并调用 SMTP 服务。某天运维同学优化了邮件网关,新增了priority字段支持高优先级投递。如果直接升级 skills 到 v1.1 并修改 input_schema,所有正在运行的 Agent 实例会立刻因参数校验失败而崩溃——因为旧版 Agent 的调用请求里根本没有priority字段。而通过版本隔离,你可以让新 Agent 使用 v1.1,老 Agent 继续用 v1.0,灰度期互不干扰。

第二,审计与回滚的可行性。在金融或医疗类场景,每个 skills 的每次变更都需留痕。GKE 集群里,skills 的 YAML 文件实际以 ConfigMap 形式存在,每次kubectl apply -f skills-v1.0.yaml都会生成独立的资源版本。当你发现 v1.2 版本导致某次客户投诉率上升,kubectl rollout undo configmap/skills-send-email --to-revision=3三秒就能回滚到 v1.0,而不是翻 Git 历史、找负责人、重新部署——后者平均耗时 17 分钟,前者 3 秒。

提示:Google Cloud 的 Agent Platform 控制台里,skills 版本号必须是语义化版本(如1.2.0)或 ISO 日期(如2024-06-15),不支持latest或dev这类模糊标签。这是强制你放弃“永远用最新版”的侥幸心理,逼你在设计阶段就思考兼容性。

2.3 为什么必须运行在 GKE 而非 Cloud Run 或 Cloud Functions?

热词里频繁出现GKE,不是偶然。skills 的执行器(executor)需要满足三个硬性条件:

  1. 长连接与状态保持:某些 skills 需要维持 WebSocket 连接(如实时股票行情推送),Cloud Functions 的 9 分钟超时和无状态特性无法支撑;
  2. 资源隔离与 QoS 保障:当code_assistskills 被 50 个 Agent 并发调用时,它需要独占 2 CPU / 4GB 内存,避免被其他服务抢占——Cloud Run 的共享实例池做不到这点;
  3. 内网服务发现与安全通信:skills 往往要访问集群内的数据库、缓存或消息队列(如 Redis Cluster、Kafka Topic),GKE 的 Service DNS(redis.default.svc.cluster.local)提供免证书、低延迟的内网通信,而 Cloud Functions 访问 VPC 内资源需额外配置 Serverless VPC Access,延迟增加 80ms+ 且故障率更高。

实测数据:在同一 GCP 项目下,相同 Python 代码实现的query_databaseskills,在 GKE(NodePool: n2-standard-4)上 P95 延迟为 120ms;在 Cloud Run(2 CPU / 2GB)上为 210ms;在 Cloud Functions(2nd gen)上为 340ms。差异主要来自网络跳转次数(GKE 内网 1 跳,Cloud Run 经 VPC Gateway 3 跳,Functions 经 Serverless VPC Connector 5 跳)和冷启动概率(Functions 32% 冷启动率,GKE 0%)。

3. 实操全流程:从定义 skills 到在 Agent 中调用的完整链路

3.1 第一步:用 YAML 定义 skills(以generate_report为例)

skills 的定义文件(如skills-generate-report.yaml)包含四个核心部分,缺一不可:

# skills-generate-report.yaml apiVersion: agentplatform.cloud.google.com/v1alpha1 kind: Skill metadata: name: generate-report version: "2024-06-15" # 必须全局唯一,建议用发布日期 labels: team: finance criticality: high spec: # 1. 输入输出契约(Schema) input_schema: type: object properties: report_type: type: string enum: ["weekly_summary", "monthly_breakdown", "quarterly_forecast"] date_from: type: string format: date date_to: type: string format: date required: ["report_type", "date_from", "date_to"] output_schema: type: object properties: pdf_url: type: string format: uri page_count: type: integer minimum: 1 generated_at: type: string format: date-time # 2. 执行器配置(指向 GKE 中的 Deployment) executor: type: kubernetes kubernetes: namespace: skills-system service_name: generate-report-svc port: 8080 path: "/execute" # 3. 运行时约束(超时、重试、限流) runtime: timeout_seconds: 120 max_retries: 2 concurrency_limit: 10 # 同一 skills 最多 10 个并发实例 # 4. 安全上下文(ServiceAccount 与 Secret 引用) security: service_account_name: skills-report-sa secrets: - name: db-credentials key: DB_URL mount_path: /secrets/db-url

关键细节说明:

  • service_name: generate-report-svc指向 GKE 中一个真实的 Kubernetes Service,该 Service 的 selector 必须匹配后端 Deployment 的 label(如app: generate-report);
  • port: 8080和path: "/execute"是 skills 执行器 HTTP Server 的监听地址,Agent Platform 会向http://generate-report-svc.skills-system.svc.cluster.local:8080/execute发送 POST 请求;
  • concurrency_limit: 10是硬性限制,超过的请求会被 Agent Platform 直接拒绝(HTTP 429),而非排队等待——这是防止某个 skills 占满集群资源的保险丝;
  • secrets部分不是把密钥明文写进 YAML,而是引用 Kubernetes Secret 的 key,确保凭证不泄露。

注意:input_schema和output_schema必须严格遵循 JSON Schema Draft 07 规范,format: date-time会被 Agent Platform 自动校验(如"2024-06-15T14:30:00Z"合法,"2024-06-15 14:30"非法)。我曾因format: datetime(错误写法)导致 skills 注册失败,错误日志只显示invalid schema,排查了 2 小时才发现是 draft 版本不匹配。

3.2 第二步:编写 skills 执行器(Python FastAPI 示例)

skills 执行器本质是一个 HTTP 微服务,它只做一件事:接收 Agent Platform 的 POST 请求,执行业务逻辑,返回符合output_schema的 JSON。以下是精简版实现:

# main.py from fastapi import FastAPI, HTTPException, Depends from pydantic import BaseModel, Field, validator from typing import Optional, Dict, Any import os import logging from datetime import datetime # 从环境变量加载密钥(由 Kubernetes Secret 挂载) DB_URL = os.getenv("DB_URL", "") app = FastAPI(title="Generate Report Skill") class InputModel(BaseModel): report_type: str = Field(..., enum=["weekly_summary", "monthly_breakdown", "quarterly_forecast"]) date_from: str = Field(..., pattern=r"^\d{4}-\d{2}-\d{2}$") date_to: str = Field(..., pattern=r"^\d{4}-\d{2}-\d{2}$") @validator('date_from', 'date_to') def validate_date(cls, v): try: datetime.strptime(v, "%Y-%m-%d") except ValueError: raise ValueError("Invalid date format, must be YYYY-MM-DD") return v class OutputModel(BaseModel): pdf_url: str = Field(..., pattern=r"^https?://.*\.pdf$") page_count: int = Field(..., ge=1) generated_at: str = Field(..., pattern=r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$") @app.post("/execute", response_model=OutputModel) async def execute_skill(input_data: InputModel): try: # 1. 业务逻辑:根据 report_type 查询数据库、生成 PDF pdf_url = await generate_pdf( report_type=input_data.report_type, date_from=input_data.date_from, date_to=input_data.date_to, db_url=DB_URL ) # 2. 验证输出是否符合契约(关键!) output = OutputModel( pdf_url=pdf_url, page_count=get_pdf_page_count(pdf_url), generated_at=datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") ) return output except Exception as e: logging.error(f"Skill execution failed: {str(e)}") raise HTTPException(status_code=500, detail=f"Execution error: {str(e)}") # 辅助函数(省略具体实现) async def generate_pdf(report_type: str, date_from: str, date_to: str, db_url: str) -> str: # 实际调用数据库、模板引擎、PDF 库... pass def get_pdf_page_count(pdf_url: str) -> int: # 下载 PDF 并统计页数... pass

部署要点:

  • 必须使用uvicorn启动,监听0.0.0.0:8080(不能是127.0.0.1);
  • response_model=OutputModel是 Pydantic 的强校验,确保返回 JSON 100% 符合output_schema,否则 Agent Platform 会认为 skills 执行失败;
  • 日志必须输出到 stdout(logging.info()),GKE 会自动采集并关联到 Cloud Logging;
  • 错误处理必须抛出HTTPException,Agent Platform 会将5xx错误计入失败率监控,4xx错误(如参数校验失败)则视为用户输入错误,不触发告警。

3.3 第三步:在 GKE 中部署 skills 执行器

执行器部署不是简单kubectl apply,需确保四层资源就绪:

# 1. 创建专用命名空间(隔离资源) kubectl create namespace skills-system # 2. 创建 ServiceAccount(最小权限原则) cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: skills-report-sa namespace: skills-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: skills-report-sa-binding namespace: skills-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: view-secrets subjects: - kind: ServiceAccount name: skills-report-sa namespace: skills-system EOF # 3. 创建 Secret(挂载数据库凭证) kubectl create secret generic db-credentials \ --namespace=skills-system \ --from-literal=DB_URL="postgresql://user:pass@db-prod:5432/reporting" # 4. 部署 Deployment(注意 resource limits) cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: generate-report-deploy namespace: skills-system labels: app: generate-report spec: replicas: 2 selector: matchLabels: app: generate-report template: metadata: labels: app: generate-report spec: serviceAccountName: skills-report-sa containers: - name: generate-report image: gcr.io/your-project/generate-report:v20240615 ports: - containerPort: 8080 env: - name: DB_URL valueFrom: secretKeyRef: name: db-credentials key: DB_URL resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "1" livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /readyz port: 8080 initialDelaySeconds: 5 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: generate-report-svc namespace: skills-system spec: selector: app: generate-report ports: - port: 8080 targetPort: 8080 EOF

关键经验:

  • resources.limits必须设置,否则 GKE Scheduler 可能将容器调度到资源不足的节点,导致 OOM Kill;
  • livenessProbe和readinessProbe是必选项,Agent Platform 会轮询/readyz判断 skills 是否就绪,未就绪时不会将流量导入;
  • replicas: 2是最低可用性要求,单副本故障会导致 skills 不可用,Agent Platform 不会自动重试其他节点(它认为 skills 是无状态的,但实际执行器可能有状态);
  • 镜像gcr.io/your-project/generate-report:v20240615的 tag 必须与 skills YAML 中的version一致,这是人工约定的版本同步机制。

3.4 第四步:在 Agent Platform 中注册 skills 并集成到 Agent

注册 skills 需通过 Google Cloud Console 或gcloudCLI,这里用 CLI 演示(更可控):

# 假设已配置 gcloud auth 和项目 gcloud alpha agent-platform skills register \ --location=us-central1 \ --skill-file=skills-generate-report.yaml \ --project=your-gcp-project # 查看注册状态 gcloud alpha agent-platform skills list \ --location=us-central1 \ --project=your-gcp-project # 输出应包含:NAME: generate-report, VERSION: 2024-06-15, STATUS: ACTIVE

注册成功后,在 Agent 的 YAML 定义中声明依赖:

# agent-finance-assistant.yaml apiVersion: agentplatform.cloud.google.com/v1alpha1 kind: Agent metadata: name: finance-assistant spec: # 关键:声明所需 skills skills: - name: generate-report version: "2024-06-15" - name: send-email version: "2024-05-20" # Agent 的核心逻辑(LLM 编排) llm: model: "gemini-1.5-pro" system_instruction: | 你是一个财务助理,负责生成和发送报告。当用户请求生成报告时: 1. 解析用户需求中的 report_type、date_from、date_to; 2. 调用 skills 'generate-report' 获取 PDF URL; 3. 调用 skills 'send-email' 将 PDF 发送给指定邮箱。

Agent Platform 会自动完成三件事:

  1. 验证generate-reportv2024-06-15 是否已注册且状态为ACTIVE;
  2. 在 Agent 运行时,将 skills 的 endpoint(http://generate-report-svc.skills-system.svc.cluster.local:8080/execute)注入到 LLM 的工具调用上下文中;
  3. 当 LLM 输出 JSON 工具调用指令(如{"name": "generate-report", "arguments": {"report_type": "weekly_summary", ...}}),Agent Platform 自动发起 HTTP POST,并将响应注入下一步提示词。

实操心得:Agent 的skills列表里,version字段必须精确匹配(字符串完全相等),2024-06-15和2024-06-15T00:00:00Z被视为不同版本。我曾因 CI/CD 脚本自动生成了带时区的版本号,导致 Agent 启动失败,错误日志只显示skill not found,最终靠gcloud alpha agent-platform skills list --format="json"对比才发现差异。

4. 常见问题与实战排查技巧

4.1 典型问题速查表

问题现象根本原因排查命令解决方案
Agent 启动失败,日志显示failed to resolve skill 'xxx'skills 未注册,或name/version拼写错误gcloud alpha agent-platform skills list --filter="name=xxx"检查 skills YAML 的metadata.name和spec.version,确保与 Agent 中引用的完全一致
skills 执行超时(HTTP 504),但执行器日志无错误GKE Service 的targetPort与容器实际监听端口不匹配kubectl get svc generate-report-svc -n skills-system -o wide确认 Service 的targetPort与 Deployment 中容器的containerPort一致(均为 8080)
Agent 调用 skills 返回400 Bad Request,提示invalid inputskills 执行器的 PydanticInputModel校验失败,但未返回详细错误kubectl logs -n skills-system deploy/generate-report-deploy在执行器中捕获ValidationError并打印e.json(),定位具体字段
skills 执行器频繁重启(CrashLoopBackOff)容器内存超限(OOM),或 Liveness Probe 失败kubectl describe pod -n skills-system -l app=generate-report检查 Events 中的OOMKilled,增大resources.limits.memory;检查 Liveness Probe 路径是否返回 200
多个 Agent 调用同一 skills 时,响应时间波动极大(50ms ~ 5s)concurrency_limit设置过低,请求排队kubectl top pods -n skills-system观察 CPU/Memory 使用率,若持续低于 30%,可适当提高concurrency_limit

4.2 我踩过的三个深坑及解决方案

坑一:skills 的input_schema里用了$ref引用外部 JSON Schema,导致注册失败
Google Cloud 的 Agent Platform 当前(2024年6月)不支持$ref远程引用或本地相对路径引用,所有 Schema 必须内联展开。例如,不能写:

# ❌ 错误:引用外部文件 input_schema: $ref: "./schemas/report-input.json"

必须展开为:

# ✅ 正确:内联 Schema input_schema: type: object properties: report_type: {type: string, enum: ["weekly_summary", ...]} # ... 所有字段全部展开

解决方案:用json-schema-ref-parser工具预处理 YAML,在 CI/CD 流程中自动展开$ref,再提交给 Agent Platform。

坑二:skills 执行器返回的pdf_url是内网地址(如http://minio:9000/reports/xxx.pdf),Agent 无法访问
Agent 运行在 Google Cloud 的托管环境中,无法直接访问 GKE 集群内网服务。必须将文件暴露为公网可访问 URL。
解决方案:在执行器中,生成 PDF 后上传到 Cloud Storage,返回gs://bucket-name/reports/xxx.pdf,然后通过gsutil signurl生成带签名的临时 HTTPS URL(有效期 1 小时),这才是 Agent 能消费的格式。

坑三:Agent 调用 skills 后,LLM 无法解析返回的 JSON,反复重试
根本原因是 skills 的output_schema定义过于宽松,例如pdf_url: {type: string}允许任意字符串,但 LLM 期望的是标准 URL 格式。Agent Platform 不会对输出做二次校验,导致脏数据流入 LLM。
解决方案:在output_schema中强制使用format: uri,并在执行器的 PydanticOutputModel中添加@validator确保 URL 可访问:

from urllib.parse import urlparse @validator('pdf_url') def validate_pdf_url(cls, v): parsed = urlparse(v) if not parsed.scheme or not parsed.netloc or not v.endswith('.pdf'): raise ValueError("Must be a valid HTTPS PDF URL") return v

4.3 性能调优的三个关键参数

skills 的性能瓶颈往往不在代码,而在平台配置。这三个参数调整后,P95 延迟下降 40%:

  1. runtime.timeout_seconds:不要盲目设大。设为 120 秒时,99% 的请求在 800ms 内完成;设为 300 秒后,P99 延迟飙升至 3.2 秒——因为长超时会让慢请求阻塞线程池。建议按历史 P95 设定,再加 20% 缓冲。

  2. concurrency_limit:计算公式为ceil(峰值 QPS × 平均响应时间)。例如,峰值 50 QPS,平均响应 1.2s,则concurrency_limit = ceil(50 × 1.2) = 60。设小了排队,设大了资源浪费。

  3. GKE NodePool 的机器类型:n2-standard-4(4vCPU/16GB)比e2-standard-4(4vCPU/16GB)在 CPU 密集型 skills(如 PDF 生成)上快 22%,因为 n2 系列有更高的 CPU 基准性能(2.8 GHz vs 2.2 GHz)和更大的 L3 缓存(16MB vs 8MB)。

5. 生态扩展:skills 如何与前端开发、Claude、Codex 等形成协同体系

5.1 前端开发 skills:让 UI 具备“智能动作”能力

热词里“前端开发skills”不是指用 JS 写 skills,而是指skills 作为前端能力的后端供给者。典型场景:一个 React 管理后台,用户点击“生成对比报告”按钮,前端不直接调用 API,而是向 Agent Platform 发送请求:

// 前端调用 Agent(非直接调 skills) const response = await fetch( "https://agentplatform.googleapis.com/v1alpha1/projects/xxx/locations/us-central1/agents/finance-assistant:run", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: "生成2024年Q2销售对比报告,对比华东和华南区域", // Agent 会自动拆解并调用 generate-report + send-email skills }) } );

这样做的好处:

  • 前端无需知道generate-report的 endpoint、参数格式、认证方式;
  • 报告逻辑变更(如新增“同比分析”字段)只需更新 skills 的input_schema和执行器,前端代码零改动;
  • 所有调用经过 Agent Platform 的统一鉴权、审计、限流,比前端直连后端 API 更安全。

实操心得:我们给前端团队提供了@google-cloud/agent-sdknpm 包,封装了 Agent 调用、错误重试、JWT token 自动刷新,他们只需Agent.run("finance-assistant", "生成报告...")一行代码。

5.2 与 Claude、Codex 等模型的 skills 协同

Agent Platform 本身不限定 LLM 厂商,skills 是模型无关的。我们实践过三种混合模式:

  • Gemini 主控 + Claude 辅助:Agent 的主 LLM 设为gemini-1.5-pro,负责整体流程编排;当遇到长文本摘要任务时,skillsclaude-summarize被调用,它内部调用 Anthropic API,返回摘要后交还给 Gemini 继续后续步骤。skills 屏蔽了模型切换的复杂性。

  • Codex 代码生成 + 自研 skills 校验:用户说“写一个 Python 脚本从 S3 下载日志并统计错误数”,Agent 调用codex-code-genskills 生成代码,再调用code-validatorskills(本地执行沙箱环境)运行并验证输出格式,双重保障。

  • Nature Skills(自然语言转 SQL):这是最成熟的 skills 类型之一。用户问“上个月销售额最高的产品是什么?”,skillsnl2sql将其转为SELECT product_name FROM sales WHERE date >= '2024-05-01' GROUP BY product_name ORDER BY SUM(amount) DESC LIMIT 1,再交给execute-sqlskills 执行。整个过程对用户透明,skills 保证了 SQL 的安全性和可审计性。

5.3 skills 开发者的协作规范

为避免 skills 成为新的“微服务地狱”,我们制定了三条铁律:

  1. 契约先行:任何 skills 开发,必须先写input_schema和output_schema,通过团队评审后才能写代码。Schema 是 API,代码只是实现。

  2. 版本冻结:skills 的v1.0.0发布后,input_schema的required字段、enum值、type不得修改。新增字段必须设default或nullable: true,确保向后兼容。

  3. 可观测性标配:每个 skills 执行器必须暴露/metrics端点(Prometheus 格式),上报skills_execution_duration_seconds、skills_execution_errors_total、skills_concurrent_executions三个指标。GKE 中用 Prometheus Operator 自动抓取,Grafana 看板实时监控。

最后分享一个小技巧:skills 的 YAML 文件名建议包含skills-<name>-<version>.yaml(如skills-generate-report-2024-06-15.yaml),这样在 Git 仓库里能一眼看出版本演进,CI/CD 脚本也能自动提取版本号用于镜像 tag。我们曾用skills-generate-report.yaml作为文件名,结果多人同时修改导致版本混乱,后来强制推行命名规范,协作效率提升明显。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询