---
title: Skill Runtime 执行体系
created: 2026-05-02
updated: 2026-05-07
type: concept
tags: [skill, runtime, agent, backend, config]
sources: [docs/superpowers/specs/2026-04-27-skill-system-evolution-design.md, packages/backend/src/modules/netaclaw/service/skill_config.ts, packages/backend/src/modules/netaclaw/service/skill_executor.ts, packages/backend/src/modules/netaclaw/service/skill_secret.ts, packages/backend/src/modules/netaclaw/tools/builtin/execute_skill.ts, packages/shared/types/skill.types.ts]
---

# Skill Runtime 执行体系

Skill Runtime 是 2026-04-27 后对 [[skill-system]] 的一次架构升级：Skill 不再只是 `SKILL.md` prompt 指令，还可以声明运行时、入口脚本、依赖、环境变量和必读 references。它把 prompt skill、compute-entry skill、compute-toolkit skill 区分开，并由 [[tool-system]] 注入不同工具执行。

## 三种分类

分类由 `service/skill_config.ts` 根据 `skill.config.yaml` 推导：

| 分类 | 判定 | Agent 使用方式 | 例子 |
| --- | --- | --- | --- |
| `prompt` | 无 `skill.config.yaml`，或 config 无 runtime/entrypoint | `read_skill` 读取完整指令 | `llm-wiki` |
| `compute-entry` | config 有 `entrypoint` | `execute_skill` 直接执行 stdin/stdout JSON 协议 | OCR/API 封装类 skill |
| `compute-toolkit` | config 有 `runtime` 但无 `entrypoint` | `read_skill` 后按指令用 `bash` 执行脚本 | `minimax-pdf`、`minimax-xlsx`、`minimax-docx` |

`buildSkillsPrompt()` 会在 `<available_skills>` 中输出 `type`，compute-entry 还会摘要 `interface.input`，让模型知道何时可以直接调用 `execute_skill`。

## skill.config.yaml

`skill.config.yaml` 当前支持：

- `runtime`: `python`、`node`、`bash`、`dotnet`
- `entrypoint`: compute-entry 的执行入口
- `timeout`: 子进程超时
- `env`: skill scoped 环境变量 schema
- `dependencies`: system/python/node/dotnet 依赖声明
- `setup`: posix/win32 安装脚本
- `interface`: 输入输出字段说明
- `references`: required / optional / routes

这些字段同步到 `packages/shared/types/skill.types.ts`，供前后端共享。

## execute_skill

`tools/builtin/execute_skill.ts` 注册 `execute_skill` 工具。`tool_resolver.ts` 只在 Agent 有 skills 且包含 compute-entry skill 时注入它，避免没有执行型 skill 的 Agent 暴露多余工具。

执行链路：

```text
LLM -> execute_skill({ name, input })
  -> SkillExecutorService.execute()
  -> SkillConfigService 读取 runtime/entrypoint/interface
  -> SkillSecretService.resolveEnv() 注入 skill scoped env
  -> spawn skill 子进程，stdin 写 JSON
  -> stdout 解析 JSON，返回工具结果
```

Python skill 需要先有 `.venv`；执行器会检查 venv 目录，缺失时返回诊断性错误。

2026-05-07 后，`execute_skill` 还支持桥接 compute-entry 子进程发出的 [[runtime-process-events]]。长耗时 Skill 可以在最终 JSON 之前持续输出阶段进度；运行时会做 payload 脱敏、采样和 JSONL 落盘。

## 密钥与环境变量

`service/skill_secret.ts` 负责 skill scoped secrets：

- `netaclaw_skill.secrets` 存 AES-256-GCM 加密后的 JSON。
- `netaclaw_skill.envSchema` 存环境变量声明。
- `resolveEnv(skillName)` 合并 env 默认值和已配置 secrets。
- `saveSecrets()` 只保存加密结果，前端不回显明文。

bash 工具还支持 `createSkillBashEnvProvider()`：当 cwd 落在某个 skill 目录内时，自动把该 skill 的 env 注入命令环境。这样 compute-toolkit 不需要把 API key 写入 prompt 或脚本参数。

## 诊断与兼容

`SkillLoaderService` 现在会收集诊断：

- `NAME_INVALID`、`NAME_MISMATCH`、`NAME_COLLISION`
- `DESC_MISSING`、`DESC_TOO_LONG`
- `CONFIG_PARSE_ERROR`
- `VENV_MISSING`
- `ENV_NOT_CONFIGURED`

`/admin/netaclaw/skill/diagnostics` 给前端技能页展示。旧的纯 prompt skill 不需要迁移；没有 config 的 skill 仍按原逻辑加载。

## 新增 compute-entry 示例

[[vehicle-damage-skill]] 是当前最典型的 compute-entry 示例：它通过 Node 脚本抽取汽车环车视频帧、调用视觉模型检测旧伤候选、定位标注、复核放大图并输出最终证据。该 Skill 同时验证了 `skill.config.yaml`、scoped env、过程事件和前端时间线展示的完整闭环。

## 相关页面

- [[skill-system]]
- [[document-skills]]
- [[vehicle-damage-skill]]
- [[runtime-process-events]]
- [[tool-system]]
- [[tool-governance]]
- [[frontend-architecture]]
