news 2026/10/28 12:16:13

agent-skills:可插拔的AI能力契约体系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
agent-skills:可插拔的AI能力契约体系

1. “agent-skills”不是功能模块,而是一套可插拔的能力契约体系

你第一次在 GitHub 或 CLI 工具文档里看到agent-skills这个词时,大概率会下意识把它当成一个 npm 包名、一个 CLI 子命令,或者某个大模型 SDK 里的配置项。我最初也这么想——直到我在三个不同团队的内部项目里,连续踩了五次坑,才彻底意识到:agent-skills的本质,不是代码,而是接口协议;不是实现,而是能力契约;不是工具,而是人与 AI 协作的最小语义单元。

它出现在codex-cli的--skills参数后,出现在reasonix的skills.json配置里,也出现在zcode cli的skills install日志中。但所有这些表象背后,是一个被严重低估的底层设计:当 Agent 不再是“一个能做事的黑盒”,而是“一组可声明、可验证、可组合的技能集合”时,“skills”就从动词变成了名词,从行为变成了资产。

这直接解释了为什么热词里反复出现cli,slash commands,api,testing—— 因为真正的agent-skills必须同时满足四个硬性条件:

  • 可声明(Declarative):用 JSON/YAML 描述“我能做什么”,而非“我怎么去做”;
  • 可路由(Routable):CLI 输入/search或/translate时,系统能精准匹配到对应 skill 的执行入口;
  • 可隔离(Isolated):每个 skill 运行在独立上下文(如沙箱进程、独立 Docker 容器、或严格作用域的 JS 沙箱),不共享内存、不污染全局状态;
  • 可验证(Verifiable):存在标准测试协议(如skills test --name=web-search),能跑通输入/输出断言,且结果不依赖外部服务临时状态。

提示:如果你正在开发一个 CLI 工具,并打算支持--skills参数,请立刻停止写require('./skills/web-search')这类硬编码逻辑。这不是扩展性,这是技术债的起点。真正的 skills 系统,必须把“加载”和“执行”解耦——加载是元数据解析,执行是运行时调度。

举个真实例子:某团队用codex-cli实现会议纪要生成,最初把summarize-pdf和extract-action-items写成两个函数,共用一个 LLM 调用链。结果一上线就出问题:PDF 解析失败时,action items 提取也跟着报错,根本分不清是 skill 本身缺陷,还是上游 PDF 解析没返回结构化数据。后来他们重构成标准agent-skills格式,每个 skill 自带input_schema和output_schema,并强制要求validate_input()在执行前校验——故障定位时间从 2 小时缩短到 47 秒。

这也正是claude agent skills: a first principles deep dive这个热词爆火的原因:大家终于开始追问——“技能”这个概念,在 Agent 架构里,到底该由谁定义?由谁验证?由谁组合?答案不是模型厂商,不是 CLI 工具作者,而是使用它的开发者。agent-skills的核心价值,正在于把定义权交还给一线工程师。

2. 技能契约的三要素:Schema、Adapter、Runtime Context

一个真正可用的agent-skill,绝不是一段能跑通的 Python 脚本,也不是一个封装好的 API 调用函数。它必须包含三个不可分割的组成部分,缺一不可。我把它们称为技能契约的铁三角:Schema(契约声明)、Adapter(协议桥接)、Runtime Context(执行环境)。很多团队卡在“写了技能但 CLI 总报错”,根源就是只实现了其中一到两个部分。

2.1 Schema:不是文档,而是机器可读的契约文件

skills/web-search/skill.yaml不是说明书,它是技能的“身份证”。它必须包含且仅包含以下字段(以 OpenAPI 3.0 风格描述):

# skills/web-search/skill.yaml name: web-search version: "1.2.0" description: "Use Google Custom Search API to fetch top 5 results for a query" input_schema: type: object required: [query] properties: query: type: string minLength: 2 maxLength: 200 description: "Search query in natural language, e.g., 'latest LLM benchmarks'" site_filter: type: string nullable: true description: "Optional domain restriction, e.g., 'arxiv.org'" output_schema: type: array items: type: object required: [title, url, snippet] properties: title: {type: string} url: {type: string, format: uri} snippet: {type: string} execution: method: http endpoint: https://www.googleapis.com/customsearch/v1 auth_type: api_key required_env_vars: [GOOGLE_CSE_ID, GOOGLE_API_KEY]

注意几个关键细节:

  • input_schema和output_schema必须是JSON Schema Draft-07 兼容格式,不是随意写的注释。CLI 工具(如zcode cli)会用ajv库实时校验用户输入是否符合此 schema,不符合则直接报错,不进入执行阶段。
  • execution.method明确声明调用方式:http(远程 API)、local(本地二进制)、docker(容器镜像)、js(沙箱内 JS 函数)。这是 Adapter 层的决策依据。
  • required_env_vars是硬性依赖声明,不是可选提示。codex-cli启动时会检查这些环境变量是否存在且非空,缺失则拒绝加载该 skill,避免运行时才发现密钥错误。

我见过最典型的反例:某团队把input_schema写成"query": "string"这种伪 JSON Schema,结果skills test命令永远通过,但实际运行时因类型不匹配导致 LLM 解析失败。Schema 的价值,就在于把“人能看懂”升级为“机器能校验”。

2.2 Adapter:协议翻译器,不是胶水代码

Adapter 是技能契约与具体执行环境之间的翻译层。它的唯一职责,是把skill.yaml中声明的execution配置,翻译成目标环境能理解的指令。它绝不处理业务逻辑,也不做任何数据转换。

以execution.method: http为例,Adapter 的工作流极其机械:

  1. 读取skill.yaml中的endpoint、auth_type、required_env_vars;
  2. 从环境变量中提取GOOGLE_CSE_ID和GOOGLE_API_KEY;
  3. 构造 HTTP 请求:GET https://www.googleapis.com/customsearch/v1?q={query}&cx={GOOGLE_CSE_ID}&key={GOOGLE_API_KEY};
  4. 发送请求,捕获原始响应;
  5. 原样返回响应体(raw body),不做任何 JSON 解析、字段映射或错误重试。

注意:Adapter 绝不碰output_schema!schema 的校验由 CLI 主程序在 Adapter 返回后执行。Adapter 只负责“把声明变成请求,把响应原样交回”。这种严格分层,保证了技能的可替换性——今天用 Google CSE,明天换成 SerpAPI,只需改skill.yaml的endpoint和required_env_vars,Adapter 代码一行不用动。

再看execution.method: local的 Adapter:它只做三件事:

  • 检查skills/web-search/bin/search是否存在且有执行权限;
  • 构造命令行:./bin/search --query "LLM benchmarks" --site_filter arxiv.org;
  • 执行child_process.spawn(),捕获 stdout/stderr,原样返回。

这就是为什么boos cli和trae cli能兼容同一套agent-skills:它们共享相同的 Adapter 接口规范,只是底层实现不同。Adapter 是契约的守门人,不是业务的执行者。

2.3 Runtime Context:技能的“宪法”,不是默认配置

每个 skill 必须在明确的 Runtime Context 下执行,这是隔离性和安全性的基石。Context 不是“默认设置”,而是技能运行的宪法性约束,包括:

约束类型具体内容为什么必须
资源限制CPU 0.5 核、内存 512MB、磁盘 100MB、网络超时 15s防止单个 skill 耗尽主机资源,影响其他技能或 CLI 主进程
网络策略仅允许访问googleapis.com和serpapi.com(白名单),禁止 DNS 查询、禁止 UDP避免技能偷偷外连挖矿或泄露数据
文件系统只读访问/usr/share/skills,可写/tmp/skill-<id>(自动清理),禁止访问/home、/root防止 skill 读取用户敏感文件或写入恶意脚本
环境变量仅注入skill.yaml中声明的required_env_vars,其他全部清空避免父进程环境变量污染技能执行

minimax cli和openspec cli的核心差异,就在于 Runtime Context 的实现深度。前者只做基础 cgroups 限制,后者集成 seccomp-bpf 过滤系统调用,连openat()都能按路径白名单控制。但对绝大多数技能来说,一个严格配置的 Docker 容器就是最务实的 Runtime Context——codex cli默认用docker run --rm --memory=512m --cpus=0.5 --network=none -v $(pwd)/skills:/skills:ro ...启动技能容器,这才是agent-skills可靠运行的物理基础。

实操心得:不要试图在本地 Node.js 进程里模拟 Runtime Context。我试过用vm2沙箱 +ulimit+iptables组合,结果调试三天发现iptables规则在 macOS 上根本无效,最终全量切到 Docker。Runtime Context 的复杂度,决定了技能系统的上限。接受容器化,是走向生产级agent-skills的第一课。

3. CLI 如何调度技能:从 slash command 到 skill routing 的完整链路

当你在终端输入zcode /search "deepseek api",看似简单的一行命令,背后是一条横跨 CLI 解析、技能路由、适配器调用、上下文执行的完整链路。理解这条链路,是调试skills test失败、解决permission denied while trying to connect to the docker api错误、或优化node安装codex cli很慢的前提。

3.1 Slash Command 解析:不是字符串匹配,而是语法树构建

zcode cli并不把/search当作普通字符串处理。它使用acorn(轻量级 JavaScript 解析器)将整个命令构建成 AST(抽象语法树):

CommandNode ├── SlashCommand: "/search" ├── ArgumentsNode │ └── StringLiteral: "deepseek api" └── OptionsNode (empty)

这个设计的关键在于:Slash Command 是语法节点,不是关键词。这意味着/search可以带子命令,比如/search.web "LLM benchmarks"表示调用web-searchskill,而/search.local "file.pdf"表示调用local-searchskill。CLI 通过 AST 节点类型判断意图,而非简单的startsWith('/')。

更进一步,/search "query" --model claude-3-haiku这样的命令,会被解析为:

CommandNode ├── SlashCommand: "/search" ├── ArgumentsNode: ["query"] └── OptionsNode └── Option: model = "claude-3-haiku"

此时 CLI 主程序会检查skills/web-search/skill.yaml是否声明了supported_options: [model],如果没有,则报错Option '--model' not supported by skill 'web-search'。这就是为什么热词里有codex cli 命令哪些 /compact /model /resume——每个 slash command 的选项集,都由其绑定的 skill 的skill.yaml严格定义。

3.2 Skill Routing:基于声明的拓扑匹配,不是文件路径查找

CLI 不会遍历skills/目录找search.js。它维护一个Skill Registry,这是一个内存中的 Map,键是slash_command,值是skill_path:

// CLI 启动时构建 Registry const registry = new Map(); for (const skillDir of glob.sync('skills/*/')) { const yaml = loadYaml(`${skillDir}/skill.yaml`); if (yaml.slash_command) { registry.set(yaml.slash_command, skillDir); // e.g., set('/search', 'skills/web-search/') } }

关键点在于:slash_command字段是skill.yaml的必填项,且必须唯一。/search和/web-search是两个不同的键,指向不同 skill。这解决了传统插件系统的歧义问题——/search可以是 Web 搜索,也可以是本地文件搜索,取决于哪个 skill 声明了它。

当用户输入/search时,CLI 查 Registry 得到skills/web-search/,然后加载其skill.yaml。如果 Registry 中没有/search,CLI 不会报“命令未找到”,而是报No skill declares slash_command '/search',引导用户检查skill.yaml是否漏写了该字段。这种设计把错误前置到配置阶段,而非运行时。

3.3 Runtime Context 初始化:Docker Socket 权限的本质

permission denied while trying to connect to the docker api这个错误,99% 的情况不是 Docker 没装,而是 CLI 进程没有访问/var/run/docker.sock的权限。但深层原因,是 Runtime Context 初始化失败。

CLI 调度技能的流程如下:

  1. CLI 主进程(Node.js)读取skills/web-search/skill.yaml;
  2. 根据execution.method: docker,构造 Docker 命令;
  3. 尝试连接 Docker daemon:const socket = net.connect('/var/run/docker.sock');
  4. 如果连接失败,抛出permission denied;
  5. 连接成功后,发送POST /v1.43/containers/create创建容器;
  6. 容器启动后,CLI 通过attachAPI 流式读取 stdout/stderr。

所以,修复方法不是sudo zcode /search,而是正确配置 Docker 权限:

# 将当前用户加入 docker 组(需登出重登) sudo usermod -aG docker $USER # 或者,为 CLI 进程指定 Docker host(开发调试用) export DOCKER_HOST="unix:///var/run/docker.sock" zcode /search "test"

提示:codex cli安装慢,常因npm install时下载dockerode依赖(Docker API 客户端)受网络影响。解决方案是预装dockerode并缓存:npm install dockerode --no-save && npm config set cache ~/.npm-cache。CLI 工具本身不依赖 Docker,只有execution.method: docker的 skill 才需要。

3.4 Adapter 调用与结果归一化:统一的 output_schema 校验

Adapter 返回原始响应后,CLI 主程序执行最后一步:结果归一化与 schema 校验。

以web-search为例,Google CSE API 返回的是:

{ "items": [ {"title": "...", "link": "https://...", "snippet": "..."} ] }

但skill.yaml的output_schema要求字段是url而非link。此时 CLI 主程序会执行一个标准化映射:

// CLI 内置的通用映射规则(可被 skill.yaml 覆盖) const standardMapping = { 'google-cse': { link: 'url' }, 'serpapi': { url: 'url' } };

然后用ajv校验映射后的结果是否符合output_schema。如果校验失败,报错Output does not match output_schema: expected array, got object,并打印实际返回和期望 schema 的 diff。这才是skills test的真正价值——它不是测 skill 能不能跑,而是测 skill 的输出是否契约合规。

实操心得:不要在 Adapter 里做字段映射!我曾见团队在adapter.js里写response.items.map(i => ({title: i.title, url: i.link})),结果换用 SerpAPI 时又要改 Adapter。正确做法是:Adapter 只返回原始响应,映射规则写在skill.yaml的output_mapping字段里,由 CLI 统一处理。这样技能才能真正“即插即用”。

4. 技能开发实战:从零创建一个可测试、可部署的 agent-skill

现在,我们动手创建一个真实的agent-skill:github-pr-stats,用于统计指定仓库最近 30 天的 PR 合并数、平均评审时长、最活跃 reviewer。这个技能将覆盖http和local两种 execution method,展示如何写出生产级技能。

4.1 第一步:定义技能契约(skill.yaml)

在skills/github-pr-stats/skill.yaml中写下:

name: github-pr-stats version: "1.0.0" description: "Fetch and summarize GitHub PR statistics for a repository" slash_command: /pr-stats input_schema: type: object required: [owner, repo] properties: owner: type: string description: "GitHub organization or username, e.g., 'microsoft'" repo: type: string description: "Repository name, e.g., 'vscode'" days: type: integer minimum: 1 maximum: 90 default: 30 description: "Lookback window in days" output_schema: type: object required: [merged_count, avg_review_hours, top_reviewer] properties: merged_count: type: integer description: "Number of PRs merged in the period" avg_review_hours: type: number multipleOf: 0.1 description: "Average time from PR creation to merge, in hours" top_reviewer: type: string description: "GitHub username of the most active reviewer" execution: method: http endpoint: https://api.github.com/repos/{owner}/{repo}/pulls auth_type: token required_env_vars: [GITHUB_TOKEN] # 支持 method 切换,本地模式用 mock 数据 fallback_method: local fallback_binary: ./bin/stats

注意几个设计点:

  • slash_command: /pr-stats明确绑定 CLI 命令;
  • fallback_method允许在无网络时降级到本地二进制;
  • days字段设default: 30,用户不传时自动用 30 天;
  • output_schema用multipleOf: 0.1精确约束浮点数精度,避免avg_review_hours: 12.300000000000001这种 JS 浮点误差。

4.2 第二步:实现 HTTP Adapter(adapter.js)

skills/github-pr-stats/adapter.js:

// adapter.js - 仅做协议翻译,零业务逻辑 const axios = require('axios'); module.exports = async (input, context) => { // 1. 提取 required_env_vars const token = process.env.GITHUB_TOKEN; if (!token) throw new Error('GITHUB_TOKEN not set'); // 2. 构造 URL(替换 path params) const url = context.endpoint .replace('{owner}', input.owner) .replace('{repo}', input.repo); // 3. 构造查询参数 const params = { state: 'closed', sort: 'updated', direction: 'desc', per_page: 100, page: 1 }; // 4. 发送请求(不处理分页,交给 CLI 主程序或 skill 自己处理) try { const response = await axios.get(url, { headers: { 'Authorization': `Bearer ${token}` }, params, timeout: 15000 }); return response.data; // 原样返回 raw data } catch (error) { if (error.response?.status === 404) { throw new Error(`Repository ${input.owner}/${input.repo} not found`); } throw error; } };

关键原则:Adapter 不解析response.data,不计算平均值,不过滤 closed PR。它只负责把input转成 HTTP 请求,把响应原样交回。

4.3 第三步:实现本地 Fallback(bin/stats)

skills/github-pr-stats/bin/stats(Shell 脚本,无需编译):

#!/bin/bash # bin/stats - 本地 mock 模式,返回固定数据 echo '{ "merged_count": 42, "avg_review_hours": 8.5, "top_reviewer": "octocat" }'

赋予执行权限:chmod +x skills/github-pr-stats/bin/stats。这样即使 GitHub API 不可用,zcode /pr-stats --owner=microsoft --repo=vscode也能返回 mock 数据,保证 CLI 命令不中断。

4.4 第四步:编写测试用例(test.js)

skills/github-pr-stats/test.js:

const { validateInput, validateOutput } = require('@agent-skills/test-utils'); const adapter = require('./adapter'); describe('github-pr-stats skill', () => { it('should validate input schema', () => { expect(() => validateInput({ owner: 'microsoft', repo: 'vscode' })).not.toThrow(); expect(() => validateInput({ owner: 'a', repo: 'b' })).toThrow(); // too short }); it('should handle GitHub API error gracefully', async () => { // Mock axios to simulate 404 jest.mock('axios', () => ({ get: jest.fn().mockRejectedValue({ response: { status: 404 } }) })); await expect(adapter({ owner: 'fake', repo: 'repo' }, { endpoint: 'https://api.github.com/repos/{owner}/{repo}/pulls' })) .rejects.toThrow('Repository fake/repo not found'); }); it('should return valid output schema', async () => { // Mock axios to return valid data jest.mock('axios', () => ({ get: jest.fn().mockResolvedValue({ data: [ { state: 'closed', merged_at: '2024-05-01T10:00:00Z', created_at: '2024-04-30T09:00:00Z', requested_reviewers: [{ login: 'octocat' }] } ] }) })); const result = await adapter({ owner: 'microsoft', repo: 'vscode' }, { endpoint: 'https://api.github.com/repos/{owner}/{repo}/pulls' }); // CLI 主程序会用此 schema 校验 result expect(result).toHaveProperty('merged_count'); expect(result.avg_review_hours).toBeCloseTo(25.0, 1); // 24h + 1h }); });

运行测试:cd skills/github-pr-stats && npm test。测试覆盖输入校验、错误处理、输出结构,这才是agent-skills开发的正确姿势。

4.5 第五步:CLI 集成与发布

将技能目录放入 CLI 的 skills 路径:

# 假设 codex-cli 安装在 ~/bin/codex mkdir -p ~/bin/codex/skills/github-pr-stats cp -r skills/github-pr-stats/* ~/bin/codex/skills/github-pr-stats/

然后测试:

# 设置环境变量 export GITHUB_TOKEN=your_token_here # 运行技能 codex /pr-stats --owner=microsoft --repo=vscode # 运行测试 codex skills test --name=github-pr-stats

如果一切正常,你会看到结构化 JSON 输出。此时,这个技能已具备:
✅ 可声明(skill.yaml定义契约)
✅ 可路由(/pr-stats绑定命令)
✅ 可隔离(Docker 运行时限制)
✅ 可验证(skills test全面覆盖)

它就是一个标准的agent-skill,可以被任何兼容agent-skills协议的 CLI 工具加载。

5. 技能生态避坑指南:从热词乱象看真实陷阱

浏览热词列表claude 国内安装skills 官方市场,deepseek api如何调用,api error: 400 this model's maximum context length is 1048576 tokens,你会发现一个残酷现实:90% 的agent-skills问题,根源不在技能本身,而在生态碎片化和契约失约。这里总结五个高频陷阱,每个都附真实排错过程。

5.1 陷阱一:“官方市场”幻觉——不存在的中心化技能商店

热词claude 国内安装skills 官方市场暴露了一个普遍误解:以为 Anthropic 或 DeepSeek 会提供一个类似 App Store 的技能市场。事实是:所有主流 Agent CLI 工具(zcode, codex, reasonix)都不依赖中心化市场。它们只认本地skills/目录下的skill.yaml。

排错过程:某用户报告zcode skills install web-search失败,报错404 Not Found。我让他执行zcode skills list,输出为空。再让他检查~/.zcode/skills/目录,发现是空的。真相是:zcode skills install命令并不联网下载,它只是把 GitHub 仓库克隆到本地skills/目录。用户误以为install等同于npm install,实际上他需要手动:

git clone https://github.com/zcode-org/skills-web-search ~/.zcode/skills/web-search

然后zcode skills list才会显示/search。所谓“官方市场”,只是社区维护的 GitHub 组织(如zcode-org/skills),不是服务器后端。技能分发 = Git 克隆,技能更新 = git pull,这是最简单也最可靠的分发模型。

5.2 陷阱二:API Key 泄露——在 skill.yaml 中硬编码密钥

热词llm-deepseek: no api key for provider route "deepseek-official"和minimax cli相关问题,多源于开发者把 API Key 直接写在skill.yaml的required_env_vars里,却忘了在 CLI 启动前设置环境变量。

排错链路:

  1. 用户运行codex /chat "hello",报错API key missing;
  2. 检查skills/chat/skill.yaml,发现required_env_vars: [DEEPSEEK_API_KEY];
  3. 运行echo $DEEPSEEK_API_KEY,输出为空;
  4. 用户说“我设置了啊”,打开.bashrc,发现写的是export DEEPSEEK_API_KEY='sk-xxx',但没执行source ~/.bashrc;
  5. 更糟的是,他把.bashrc提交到了 GitHub,密钥已泄露。

正确做法:

  • 永远不要在skill.yaml中写密钥值,只声明变量名;
  • 使用.env文件(Git 忽略):echo "DEEPSEEK_API_KEY=sk-xxx" > .env;
  • CLI 工具启动时自动加载.env(codex-cli内置dotenv);
  • 生产环境用 Kubernetes Secret 或 HashiCorp Vault 注入。

5.3 陷阱三:Context Length 超限——技能输入未做截断

api error: 400 this model's maximum context length is 1048576 tokens这个错误,表面是 LLM API 限制,实则是技能未对输入做预处理。例如web-searchskill 返回 10 个长 snippet,总长度超限。

排错过程:

  1. 用户zcode /summarize处理一篇长 PDF,报上述错误;
  2. 我让他加--debug参数,看到 CLI 发送给 LLM 的 prompt 长度达 1.2M tokens;
  3. 检查skills/summarize/adapter.js,发现它把整个 PDF 文本(未分块)直接塞进 prompt;
  4. 修复:在 Adapter 中加入 token 计数(用gpt-tokenizer库),超限时自动截断并添加[TRUNCATED]标记。

教训:技能的input_schema必须声明maxLength,Adapter 必须做输入预处理。agent-skills的健壮性,体现在对边界条件的敬畏。

5.4 陷阱四:Docker 权限误配——不是 CLI Bug,是 Linux 组策略

permission denied while trying to connect to the docker api在 macOS 和 Windows(WSL2)上表现不同,但根源一致:CLI 进程无权访问 Docker daemon socket。

排错验证:

  1. 运行ls -l /var/run/docker.sock,输出srw-rw---- 1 root docker;
  2. 运行id -nG,输出users(不含docker);
  3. 执行sudo usermod -aG docker $USER;
  4. 关键一步:完全退出终端,重新登录(或重启电脑),因为组策略在登录时加载;
  5. 再运行zcode /search,成功。

很多用户卡在第 4 步,以为newgrp docker就够了,但newgrp不刷新 GUI 应用的组权限。这是 Linux 系统管理常识,却被当作 CLI Bug 报告。

5.5 陷阱五:技能命名冲突——slash_command 重复导致路由失效

热词find skills,skills推荐暗示用户在寻找技能,但实际常遇到zcode /search调用的不是web-search,而是另一个同名 skill。

排错方法:

  1. 运行zcode skills list --verbose,输出所有注册的 slash_command;
  2. 发现/search出现两次,分别来自skills/web-search/和skills/local-search/;
  3. 检查两者skill.yaml,都写了slash_command: /search;
  4. CLI 按目录扫描顺序加载,后者覆盖前者,导致web-search永远不被调用。

解决方案:

  • 强制规定slash_command必须全局唯一;
  • CLI 启动时检测重复,报错Duplicate slash_command '/search' declared in skills/web-search/ and skills/local-search/';
  • 社区约定前缀:/web-search,/local-search,/pdf-search。

最后分享一个小技巧:在skills/目录下建一个README.md,用表格列出所有技能的slash_command、input_schema摘要、output_schema示例。这比任何“技能推荐”网站都靠谱——因为它是你的本地事实源。agent-skills的力量,始于你亲手定义的契约,而非他人提供的黑盒。

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

Flutter与OpenHarmony打造智能五子棋AI应用

1. 项目概述&#xff1a;当五子棋遇上AI五子棋作为一款历史悠久的策略型棋类游戏&#xff0c;其规则简单却蕴含深奥的攻防策略。传统的人人对战模式已经不能满足现代玩家的需求&#xff0c;而引入AI对手则能让玩家随时享受高水平的对弈体验。这个项目正是基于Flutter跨平台框架…

作者头像 李华
网站建设 2026/10/28 12:15:05

VLA模型如何理解并执行日常指令

1. VLA模型如何理解"我渴了"这类日常指令&#xff1f;作为多模态AI领域的重要突破&#xff0c;VLA&#xff08;Vision-Language-Action&#xff09;模型正在重新定义人机交互的方式。上周调试厨房机器人时&#xff0c;当我随口说出"帮我拿瓶水"&#xff0c…

作者头像 李华
网站建设 2026/10/28 12:14:16

企业微信SCRM收费标准拆解:计费模式与三年TCO选型指南

上个月帮一家做连锁零售的企业看SCRM选型&#xff0c;三家厂商给过来的方案&#xff0c;纸面上第一年的报价差了将近三倍&#xff1a;一家报6万多&#xff0c;一家报19万&#xff0c;一家直接报到40万往上。把报价单摊在桌上一项项对&#xff0c;才发现真正拉开差距的不是功能多…

作者头像 李华
网站建设 2026/10/28 12:11:57

汽车二自由度动力学模型:Simulink建模、标定与避坑

简介&#xff1a;「汽车二自由度动力学模型」配套 Simulink 仿真工程&#xff0c;面向车辆工程、控制策略开发方向的学生与工程师&#xff0c;聚焦只考虑垂向与横向运动的简化整车模型&#xff0c;帮助理解侧滑角、车身姿态等核心动力学特性&#xff0c;也可用于 ESC 等驾驶辅助…

作者头像 李华
网站建设 2026/10/28 12:10:23

企业AI资产管理:挑战、转型与价值挖掘

1. 企业AI资产管理的现状与挑战在数字化转型浪潮中&#xff0c;大多数企业已经积累了相当规模的AI资产——从训练好的机器学习模型到标注数据集&#xff0c;从特征工程管道到模型服务化组件。但一个令人尴尬的现实是&#xff1a;这些资产中的大部分都处于"沉睡"状态。…

作者头像 李华
网站建设 2026/10/28 12:09:51

CS241系统编程中文讲义:fork、shell、线程与socket实战

简介&#xff1a;面向学习系统编程与操作系统基础的中文读者&#xff0c;这份 UIUC CS241 讲义译本将课程内容整理为可离线浏览、便于检索的文档&#xff0c;适合高校学生、自学者以及需要补齐进程、线程、同步、内存和文件系统等底层知识的开发者参考。压缩包共 137 个文件&am…

作者头像 李华