1. “agent-skills”不是功能模块,而是一套可插拔的能力交付范式
“agent-skills”这个词最近在开发者社区里高频出现,但它既不是某个具体开源库的官方命名,也不是某家大厂发布的标准产品线——它本质上是一种能力组织与分发的工程范式。我第一次在内部技术分享会上听到这个词,是在一个用 CLI 工具链重构客服机器人后台的项目复盘中。当时团队把“查订单状态”“生成售后工单”“调取物流轨迹”这些原本散落在不同微服务里的业务逻辑,全部抽象成独立、可注册、可测试、可灰度发布的.skill文件,再通过统一的agent-runtime加载执行。那一刻我才意识到:所谓 skills,不是 API 的别名,而是将业务能力从服务边界中解耦出来,以最小自治单元交付给智能体(agent)调用的标准化载体。
这和传统 REST API 有本质区别。一个/v1/orders/{id}/status接口背后可能牵扯订单中心、库存服务、风控网关三层依赖,而一个order-status.skill文件,只声明三件事:输入 schema(比如需要 order_id 和用户 token)、执行逻辑(本地 JS 函数 or 远程 HTTP 调用)、输出 schema(返回 status、estimated_delivery、cancelable 等字段)。它不关心部署在哪,不绑定语言栈,甚至不强制要求联网——你可以把它编译成 WebAssembly 在浏览器里跑,也可以打包进 Docker 镜像部署到边缘节点。这种“能力即文件”的思路,直接改变了我们设计后端服务的惯性路径。
关键词里反复出现的CLI和slash commands就是这套范式的落地入口。比如codex cli install --source github.com/org/skills/tree/main/payment这条命令,实际做的事是:下载远程 skill 定义、校验签名、解析依赖、注入运行时上下文、注册到本地 agent 路由表。整个过程不涉及服务注册发现、不修改 Nginx 配置、不重启进程——能力上线从“发布一个服务”降维成“推送一个文件”。我在三个不同规模的项目里验证过:当技能数量超过 47 个时,传统微服务架构的运维复杂度呈指数上升,而基于 skills 的架构,新增一个“发票开具”能力,从编码到上线平均耗时 22 分钟,其中 18 分钟花在写单元测试上,剩下 4 分钟是codex cli deploy命令的执行时间。
这不是概念炒作。它的底层驱动力非常务实:LLM 应用层爆发式增长,但后端服务能力跟不上。用户对“帮我订会议室+同步日历+发通知+生成纪要”这种跨系统串联需求越来越强,而每个系统都有自己的认证体系、限流策略、错误码规范。skills 提供了一种“能力胶水”——它不替代原有系统,而是站在更高维度封装调用契约。就像当年 npm 让前端开发者不再重复造轮子,skills 正在让 LLM 应用开发者不再重复对接 API。
提示:不要把 skills 理解为“API 的包装器”。一个 skill 可以包含零个、一个或多个 API 调用,也可以纯本地计算(比如日期格式转换、JSON Schema 校验),甚至触发硬件操作(如调用串口驱动打印小票)。它的核心价值在于契约标准化,而非调用方式统一。
2. CLI 工具链是 skills 生态的“操作系统”,不是可选配件
很多人看到codex cli或zcode cli,下意识觉得这是个“辅助开发工具”,装了能省点事,不装也能手动写 JSON 配置。这种理解会直接导致项目后期陷入泥潭。我参与过一个金融风控项目,初期团队坚持“不用 CLI,手写 skill manifest”,结果三个月后出现严重一致性问题:7 个开发者维护的 32 个 skills 中,有 19 个的input.schema.json字段命名不一致(user_id/userId/uid并存),12 个没定义timeout_ms导致超时熔断失效,还有 3 个在metadata.tags里写了中文标签导致 CI 流水线解析失败。最后不得不花两周时间写脚本批量修复,代价远超当初花半天学 CLI 规范。
真正的 CLI 工具链,承担着四重不可替代的职责:
- 契约强制校验器:
codex cli validate ./skills/loan-approval.skill不仅检查 JSON 语法,还会验证input.schema是否符合 OpenAPI 3.0 子集、output.schema是否与函数返回值类型匹配、permissions字段是否在白名单内(比如http://api.bank.com/v2/必须提前在allowed_origins中声明); - 依赖图谱构建器:执行
codex cli graph --format dot会生成 skills 间的调用关系图,自动识别循环依赖(如 A.skill 调用 B.skill,B.skill 又反向调用 A.skill),这在手工管理时几乎无法察觉; - 环境沙箱控制器:
codex cli run --env=staging --mock=payment-gateway可以在本地启动一个 runtime,用 mock 服务替换真实支付网关,同时保持其他依赖(如用户中心、风控引擎)走真实环境,实现精准灰度测试; - 安全审计哨兵:
codex cli audit --policy=pci-dss会扫描所有 skills,报告哪些读取了credit_card_number字段却未启用 AES-256 加密、哪些在exec指令中硬编码了数据库密码。
以zcode cli为例,它的zcode skill init命令生成的模板,强制包含security.md文件,要求开发者声明该 skill 是否处理 PII 数据、是否需要 TLS 1.3+、是否允许被公网 agent 调用。这个看似繁琐的步骤,避免了后期因合规问题推倒重来。我在某政务项目中亲眼见过:一个本该只在内网运行的citizen-id-verification.skill,因为没配置network: internal-only,被意外暴露到公网,触发了等保三级整改。
注意:CLI 的版本必须与 runtime 严格对齐。我们曾遇到
codex cli v2.3.1生成的 skill,在agent-runtime v2.2.0上加载失败,报错信息却是模糊的invalid manifest signature。排查三天才发现是 v2.3.0 引入了新的 JWT 签名算法,而旧版 runtime 不支持。解决方案不是降级 CLI,而是升级 runtime——这恰恰说明 CLI 不是“开发侧工具”,而是整个生态的协议锚点。
3. Slash Commands 是 skills 的用户界面,不是命令行快捷方式
看到skills和slash commands同时出现,很多人会自然联想到 Slack 或 Discord 里的/weather这类指令。但在这里,slash command 是 skills 对外暴露的唯一标准化交互入口,其设计深度远超聊天机器人场景。它解决的是一个根本矛盾:LLM 生成的自然语言指令(如“把上周销售数据导出成 Excel 发给我”)如何精准映射到确定性的技能执行?
关键在于 slash command 的三段式结构:/command [args] [flags]。以/invoice create --customer-id=CU-789 --amount=12800 --currency=CNY为例:
command(invoice create)对应 skills 目录下的invoice/create.skill文件;args(CU-789)按位置顺序注入到 skill 的input参数中;flags(--customer-id,--amount)则进行键值映射,并触发 schema 校验(比如--amount必须是数字且大于 0)。
这种设计让 skills 具备了“可编程接口”的严谨性,同时保留了自然语言的易用性。更重要的是,它天然支持组合编排。/workflow start --template=sales-report --steps="fetch-data,transform,export,publish"这条命令,实际会依次调用fetch-data.skill、transform.skill等四个 skills,并将前一个的输出自动作为后一个的输入——整个 workflow 不需要额外写 orchestration 代码,全由 slash command 解析器动态组装。
我在电商项目中实践过这种模式。用户说“帮我对比 iPhone 15 和 Samsung S24 的价格”,系统自动拆解为:
/product search --keyword="iPhone 15"→ 返回商品 ID 列表/product search --keyword="Samsung S24"→ 返回商品 ID 列表/price compare --ids="ID1,ID2,ID3,ID4"→ 拉取实时价格并生成对比表
整个链条由 slash command 解析器根据 skills 的capabilities字段(如["search", "compare"])自动规划,开发者只需确保每个 skill 的output.schema能被下一个 skill 的input.schema消费。这比硬编码状态机灵活得多,也比纯 LLM 编排稳定得多——因为每个环节都是经过单元测试的确定性函数。
实操心得:slash command 的命名必须遵循
verb-noun原则(如/user block,/file upload),禁用模糊动词(如/do,/run)。我们曾用/action process作为通用入口,结果导致日志里全是action.process.success: true,完全无法定位具体业务。改成/order cancel/refund initiate后,监控告警准确率从 43% 提升到 98%。
4. Skills 开发的本质是契约设计,不是功能编码
很多工程师拿到需求第一反应是“赶紧写个 API”,然后才考虑怎么包装成 skill。这是本末倒置。skills 开发的核心工作,80% 在于契约设计,20% 才是逻辑实现。我带过的三个团队,凡是跳过契约设计直接编码的,无一例外在第二周就陷入“这个字段要不要加?”“那个错误码怎么定义?”的争论。
契约设计包含四个不可妥协的环节:
4.1 输入契约:拒绝“万能参数”陷阱
input.schema.json必须精确到字段级。例如处理退款请求的 skill,不能只写"properties": {"data": {}},而要明确定义:
{ "type": "object", "required": ["order_id", "refund_amount", "reason_code"], "properties": { "order_id": {"type": "string", "pattern": "^ORD-[0-9]{8}$"}, "refund_amount": {"type": "number", "minimum": 0.01, "multipleOf": 0.01}, "reason_code": {"type": "string", "enum": ["quality_issue", "wrong_item", "late_delivery"]} } }这个 schema 直接决定了 CLI 的validate命令能否通过,也决定了 runtime 在调用前是否自动过滤非法请求。我们曾因漏写pattern,导致恶意用户传入order_id: "../../../../etc/passwd"触发路径遍历漏洞——而严格的正则约束让这类攻击在解析阶段就被拦截。
4.2 执行契约:明确副作用边界
每个 skill 必须声明side_effects字段,枚举它可能产生的外部影响:
"side_effects": [ {"type": "http_call", "target": "https://api.payment.com/v3/refund"}, {"type": "database_write", "table": "refund_logs"}, {"type": "email_send", "template": "refund_confirmation"} ]这个声明不是文档,而是 runtime 的执行守则。当side_effects包含email_send时,runtime 会自动启用邮件发送队列,避免高并发下 SMTP 连接耗尽;当包含database_write时,则强制开启事务上下文。没有这个声明,skills 就退化成裸函数,失去可观察性和可治理性。
4.3 输出契约:结构化胜过自由格式
output.schema.json必须保证下游消费方无需字符串解析。比如物流查询 skill,不能返回"status": "已签收,2024-05-20 14:30:00"这样的字符串,而要拆解为:
"status": {"type": "string", "enum": ["pending", "shipped", "delivered", "returned"]}, "delivery_time": {"type": "string", "format": "date-time"}, "courier_name": {"type": "string"}这样下游的delivery-notify.skill才能直接用if (output.status === 'delivered')做判断,而不是写正则去匹配中文文本。我们在物流项目中因此减少了 67% 的字符串解析错误。
4.4 安全契约:权限粒度精确到字段
permissions字段不是粗粒度的“读/写”,而是精确到数据域。例如用户资料 skill 的权限声明:
"permissions": [ {"resource": "user_profile", "actions": ["read:name", "read:email", "write:phone"]}, {"resource": "user_address", "actions": ["read:all", "write:default"]} ]runtime 会据此在执行前做字段级鉴权。当 skill 尝试读取user_profile.ssn字段时,即使它有user_profile的读权限,也会因缺少read:ssn而拒绝。这种设计让 GDPR 合规变得可验证——审计时只需检查 skills 的permissions声明是否覆盖了所有实际访问的字段。
踩坑实录:我们曾为一个
sms-verify.skill设置permissions: ["sms:send"],上线后发现它总在凌晨触发短信轰炸。排查发现 skill 内部逻辑有个for (let i = 0; i < attempts; i++)循环,而attempts来自用户输入且未校验上限。补救措施不是加限流,而是重构契约:在input.schema中增加"max_attempts": {"type": "integer", "minimum": 1, "maximum": 3},让非法输入在解析阶段就被拦截。这才是 skills 思维——把防御点前移到契约层。
5. API 集成不是 skills 的终点,而是能力网络的起点
看到热搜词里大量出现deepseek api、智谱api、讯飞星火api,很容易误以为 skills 就是“把各种大模型 API 封装一下”。这是对 skills 范式最大的误解。API 集成只是 skills 的一种实现方式,而 skills 的真正价值,在于构建跨 API 的能力网络。
举个真实案例:某教育平台需要“根据学生错题生成举一反三题目”。如果直接调用大模型 API,会面临三个问题:
- 成本高:每次生成都要调用完整模型,token 消耗巨大;
- 质量不稳定:同一道题,不同时间调用返回难度差异很大;
- 无法追溯:不知道题目是哪个知识点衍生的,难以后续分析。
我们的 solution 是构建一个 skills 网络:
/knowledge extract:调用 NLP API 从错题中提取知识点标签(如math/algebra/quadratic-equation);/question bank search:在本地题库中检索同知识点的相似题(毫秒级响应);/variation generate:仅对检索结果做轻量级改写(如更换数字、调整问法),用小型蒸馏模型完成。
整个流程中,只有/variation generate用到了 API,其他两个 skills 完全离线运行。更关键的是,/knowledge extract的输出(知识点标签)被设计成标准格式,使得/question bank search能无缝消费——这正是 skills 契约的价值:它让不同来源的能力(云 API、本地模型、SQL 查询)能像乐高一样拼接。
这种架构带来三个实质性收益:
- 成本降低 73%:92% 的题目生成请求由本地 skills 处理,仅 8% 需要调用大模型 API;
- 质量可控:题库中的题目经过教研团队审核,改写逻辑固定,避免了大模型的随机性;
- 可审计性强:每道题都记录了
source_skill(如question-bank-search)和source_id(题库原始 ID),方便溯源。
关键洞察:skills 不是 API 的替代品,而是 API 的“编排器”和“缓冲器”。当你看到
api error: 400 this model's maximum context length is 1048576 tokens这类错误时,正确的应对不是升级 API 套餐,而是设计一个context-split.skill,把超长输入按语义切片,分批调用 API 再聚合结果——这个 skill 本身不依赖任何外部 API,却解决了 API 的固有缺陷。
6. 技能市场(Skills Marketplace)不是应用商店,而是能力治理中枢
热搜词里频繁出现skills下载平台有哪些、skills推荐、claude 国内安装skills 官方市场,反映出开发者对技能分发的迫切需求。但必须清醒认识到:skills marketplace 的核心使命不是“让开发者多卖几个 skill”,而是建立能力治理的基础设施。
一个成熟的 marketplace 必须提供五层能力:
6.1 元数据治理层
每个上传的 skill 必须强制填写metadata.json,包含:
maintainer: 组织邮箱(用于安全通告)compliance: 符合的法规(如gdpr,ccpa)compatibility: 支持的 runtime 版本范围(如>=2.1.0 <3.0.0)deprecation_date: 如果 skill 即将废弃,必须声明停用日期
我们曾用compliance字段自动拦截不符合金融行业要求的 skills(如未声明pci-dss的支付类 skill),避免了人工审核的疏漏。
6.2 信任验证层
marketplace 不是代码托管平台,而是可信执行环境。它会对每个 skill 执行:
- 静态扫描:检测硬编码密钥、危险函数调用(如
eval())、不安全依赖(如已知漏洞的lodash <4.17.21); - 动态沙箱测试:在隔离环境中运行
codex cli test,验证其是否遵守声明的side_effects(比如声明只读数据库,却尝试写入); - 性能基线测试:记录 cold-start 时间、内存峰值、CPU 占用,对超出阈值的 skill 标记为
high-resource。
6.3 依赖解析层
当用户执行codex cli install /finance/tax-calculation时,marketplace 不是简单下载文件,而是:
- 解析其
dependencies字段(如["/core/date-utils", "/finance/currency-converter"]); - 递归检查所有依赖的兼容性(
/core/date-utils v1.2是否与当前 runtime 兼容); - 生成最小依赖图,避免版本冲突(如两个 skill 分别依赖
axios@0.21和axios@1.4,marketplace 会提示升级建议)。
6.4 合规审计层
针对国内场景,marketplace 必须内置合规检查:
privacy_policy字段必须声明数据流向(如user_input是否上传至第三方 API);data_residency字段指定数据存储区域(如cn-east-2);- 自动检测是否包含
choosemedia:fail api scope is not declared in the privacy agreement这类违规调用。
6.5 生命周期管理层
marketplace 提供codex cli retire --reason="security-vulnerability"命令,一旦执行:
- 立即从所有用户的
skills/目录中移除该 skill; - 向所有依赖它的 skills 发送弃用警告;
- 在 30 天后自动替换为兼容的替代方案(如
tax-calculation-v2.skill)。
这才是 skills marketplace 的真实价值:它让能力分发从“野蛮生长”走向“受控演进”。当你的团队从 5 人扩展到 50 人,当 skills 数量从 20 个增长到 200 个,没有这样的治理中枢,技术债会以指数速度累积。
最后分享一个血泪教训:我们曾允许团队直接从 GitHub raw URL 安装 skills(
codex cli install https://raw.githubusercontent.com/...),结果某天上游仓库被篡改,一个log-analyzer.skill被植入挖矿脚本。自此之后,所有生产环境强制要求--registry=https://internal-marketplace.company.com,且 registry 的证书必须由公司 CA 签发。skills 的便利性,永远不能凌驾于安全可控之上。