--- title: 技能系统 created: 2026-04-13 updated: 2026-05-15 type: entity tags: [skill, agent] sources: [packages/backend/src/modules/netaclaw/service/skill_loader.ts, packages/backend/src/modules/netaclaw/service/skill_installer.ts, packages/backend/src/modules/netaclaw/service/skill_registry.ts, packages/backend/src/modules/netaclaw/service/skill_config.ts, packages/backend/src/modules/netaclaw/service/skill_secret.ts, packages/backend/src/modules/netaclaw/service/skill_executor.ts, packages/backend/src/modules/netaclaw/tools/builtin/read_skill.ts, packages/backend/src/modules/netaclaw/tools/builtin/execute_skill.ts, packages/backend/src/modules/netaclaw/controller/admin/skill.ts] --- # 技能系统 Skill 是 Agent 的可插拔能力扩展,以 `SKILL.md` 为主入口,支持本地、GitHub、ZIP 三种安装方式。2026-04-27 后系统从单纯 prompt skill 扩展为 prompt / compute-entry / compute-toolkit 三分类:加载器负责扫描解析,安装器管理生命周期,注册表追踪指纹和来源,配置/密钥/执行器负责运行时能力,ToolResolver 负责把 `read_skill`、`read_skill_file`、`skill_manage` 和 `execute_skill` 注入 Agent。 ## 关键文件 | 文件 | 职责 | |------|------| | `service/skill_loader.ts` | 扫描 skills/ 目录,解析 SKILL.md,条件过滤,构建 prompt | | `service/skill_installer.ts` | GitHub 克隆、ZIP 解压、依赖安装(Node/UV)、卸载、更新检查 | | `service/skill_registry.ts` | .skillhub/ 锁文件、SHA256 指纹、来源元数据管理 | | `service/skill_config.ts` | 解析 `skill.config.yaml`,推导 prompt / compute-entry / compute-toolkit 分类 | | `service/skill_secret.ts` | AES-256-GCM 加密保存 skill scoped secrets,并解析 env | | `service/skill_executor.ts` | 执行 compute-entry skill,使用 stdin/stdout JSON 协议 | | `service/tool_resolver.ts` | 构建 `` prompt,并按 Agent 配置注入 Skill 工具 | | `tools/builtin/read_skill.ts` | Agent 工具:读取 SKILL.md 完整内容 + 附属文件索引 | | `tools/builtin/read_skill_file.ts` | Agent 工具:读取 Skill 附属文件(references/ 等) | | `tools/builtin/skill_manage.ts` | Agent 工具:创建/编辑/删除 Skill | | `tools/builtin/execute_skill.ts` | Agent 工具:执行 compute-entry skill | | `controller/admin/skill.ts` | REST API:CRUD + 安装/卸载/更新/上传/检查更新 | ## SKILL.md 格式 ```yaml --- name: skill-name # 必填,唯一标识 description: 描述 # 必填 version: 1.0.0 # 可选 metadata: skillType: llm|compute|multimodal emoji: "🔧" tags: [标签] conditions: requires_tools: ["bash"] # 需要这些工具才激活 fallback_for_tools: ["selenium"] # 作为这些工具的替代 install: - kind: node package: "@package/name" - kind: uv package: "package>=1.0.0" --- # Markdown 内容(Agent 读取后遵循的指令) ``` ## Skill Runtime 分类 详见 [[skill-runtime]]。当前分类不是旧 `skillType` 的替代,而是运行方式维度: | 分类 | 判定 | 运行方式 | | --- | --- | --- | | `prompt` | 无 `skill.config.yaml` | Agent 用 `read_skill` 读取指令并遵循 | | `compute-entry` | config 有 `entrypoint` | Agent 用 `execute_skill` 输入 JSON,执行器返回 JSON | | `compute-toolkit` | config 有 `runtime` 但无 `entrypoint` | Agent 读取指令和 references 后,用 `bash` 执行脚本 | `minimax-pdf`、`minimax-docx`、`minimax-xlsx` 属于文档处理 skill,详见 [[document-skills]]。2026-05-07 后又新增了 [[vehicle-damage-skill]]、`netabrowser-cli` 和 `patchwright-cli`,分别覆盖车辆视频旧伤检测、国内反风控浏览器自动化和国外反爬场景。2026-05-15 新增 `data-analyst-mysql` prompt skill,用于在 `mysql_list_sources`、`mysql_schema`、`mysql_query` 可用时引导 Agent 做只读 MySQL 智能问数;完整的数据源、SQL guard 和审计边界见 [[mysql-data-source]]。 ## 安装方式 | 方式 | 接口 | 说明 | |------|------|------| | GitHub | `POST /admin/netaclaw/skill/install` | git clone → 验证 SKILL.md → 计算指纹 → 写入 origin | | ZIP 上传 | `POST /admin/netaclaw/skill/uploadInstall` | 解压 → 路径穿越防护 → 同上 | | 本地 | 直接放入 `skills/` 目录 | 启动时自动扫描 | | Agent 创建 | `POST /admin/netaclaw/skill/create` | Agent 运行时通过 skill_manage 工具自主创建 | ## 文件结构 ``` skills/ ├── {skillName}/ │ ├── SKILL.md # Skill 定义(必须) │ ├── skill.config.yaml # 运行时、依赖、env、references(可选) │ └── references/ # 附属文件(可选,Agent 通过 read_skill_file 按需读取) │ ├── guide.md │ └── examples/ └── .skillhub/ ├── lock.json # 全局锁文件(version + fingerprint + installedAt) └── origins/ └── {skillName}.json # 来源元数据(source/url/branch/commitHash) ``` ## Skill 加载流程 ``` 启动 → scanSkills() 扫描 skills/ 目录(上限 200 个) → 读取每个子目录的 SKILL.md(上限 256KB) → parseSkillMd() 解析 YAML frontmatter + Markdown 内容 → validateSkillName() 记录命名规范和目录名不一致诊断 → skill_config.loadConfig() 解析 skill.config.yaml → collectFiles() 递归收集附属文件列表 → 过滤 skill.config.yaml / requirements.txt / package.json 等基础设施文件 → 存入内存 Map → 同步到 netaclaw_skill 数据库表 ``` 扫描期间还会收集 `NAME_INVALID`、`NAME_MISMATCH`、`NAME_COLLISION`、`DESC_MISSING`、`CONFIG_PARSE_ERROR`、`VENV_MISSING`、`ENV_NOT_CONFIGURED` 等诊断,供 `/admin/netaclaw/skill/diagnostics` 和前端技能页展示。 ## 条件激活 `filterByConditions(builtinToolNames)` 根据当前可用工具过滤 Skill: - `requires_tools: ["bash"]` — 只有当 bash 工具可用时才激活 - `fallback_for_tools: ["selenium"]` — 当 selenium 不可用时作为替代激活 ## 上下文构建 当前主路径由 `tool_resolver.ts` 收敛: 1. 根据 Agent 配置的 `skills` 列表过滤。 2. 调用 `buildSkillsPrompt()` 生成 `` XML 索引(上限 30,000 字符),并带上 skill 分类。 3. 注入 `read_skill`、`read_skill_file`、`skill_manage`。 4. 当 Agent 选择了 compute-entry skill 时,额外注入 `execute_skill`。 旧 `skill_context.ts` 仍保留兼容,但不再是理解当前 Skill 工具注入的主入口。 ## 密钥与配置 API `netaclaw_skill` 现在新增运行时配置字段: - `secrets`: AES-256-GCM 加密的 JSON。 - `envSchema`: 环境变量声明。 管理端接口: - `GET /admin/netaclaw/skill/envSchema?name=...` - `POST /admin/netaclaw/skill/secrets` - `GET /admin/netaclaw/skill/diagnostics` 前端 `skill-detail.vue` 的详情抽屉已分为“基本信息 / 配置 / 诊断”三块,`skills.vue` 顶部会显示诊断横幅。 ## 安全限制 - `MAX_SKILLS = 200`、`MAX_SKILL_FILE_BYTES = 256KB`、`MAX_SKILLS_PROMPT_CHARS = 30,000` - ZIP 安装:`MAX_ZIP_SIZE = 50MB`、`MAX_SINGLE_FILE = 1MB` - GitHub URL 正则校验、路径穿越防护(realpath + startsWith) - skill 名称要求小写字母、数字和连字符,且需要与目录名一致;不合规项会记录诊断。 - compute-entry 子进程只继承白名单环境变量,再叠加 skill scoped env,避免主系统敏感变量泄漏。 ## 相关页面 - [[netaclaw-module]] — 所属模块 - [[agent-runtime]] — 运行时加载 Skill 上下文 - [[tool-system]] — read_skill / read_skill_file / skill_manage 工具 - [[mysql-data-source]] — data-analyst-mysql 使用的 MySQL 问数工具和数据源配置 - [[skill-runtime]] — Skill 运行时、密钥、分类和执行器 - [[document-skills]] — PDF / DOCX / XLSX 文档处理 skill - [[vehicle-damage-skill]] — 汽车环车视频旧伤检测 skill - [[netabrowser-runtime]] — netabrowser-cli / patchwright-cli 浏览器自动化 skill 的运行后端 - [[crew-orchestration]] — Crew 主/子 Agent 均可加载 Skill