跳到主要内容

Skill-Runner 部署与配置

什么是 Skill-Runner?

Skill-Runner 是一个独立的 Agent 技能执行服务。Zotero Agents 通过 HTTP API 与 Skill-Runner 通信,提交技能请求并获取结果。它支持多种 AI Agent CLI 作为后端引擎,可以部署为独立的 Docker 容器或本地服务。

🏆 推荐优先级:如果你的本机已有支持 ACP 协议的 Agent 工具(Codex、OpenCode、Claude Code 等),请优先使用 ACP 后端,零额外配置。Skill-Runner 适合需要后台常驻服务或局域网共享的场景。

部署模式

推荐:Docker 常驻部署

Docker 部署的 Skill-Runner 作为独立常驻服务运行,不受 Zotero 启停影响——关闭 Zotero 后任务继续后台执行,下次启动 Zotero 时可以恢复或直接获取已完成的结果。

适合:

  • 需要长时间运行的任务(Topic Synthesis、批量文献分析等)
  • 局域网内多设备共享同一个 Skill-Runner 实例
  • 有 Docker 使用经验的用户
version: "3"
services:
skill-runner:
image: leike0813/skill-runner:latest
ports:
- "9813:9813"
- "17681:17681"
volumes:
- ./skills:/app/skills
- skillrunner_cache:/opt/cache
- ./data:/app/data
environment:
- SKILL_RUNNER_DATA_DIR=/app/data
- UI_BASIC_AUTH_ENABLED=false

volumes:
skillrunner_cache:
mkdir -p data skills
docker compose up -d --build

启动后:

  • API 服务http://localhost:9813/v1
  • 管理 UIhttp://localhost:9813/ui

Docker 直接运行

docker run --rm -p 9813:9813 -p 17681:17681 \
-v "$(pwd)/skills:/app/skills" \
-v skillrunner_cache:/opt/cache \
-v "$(pwd)/data:/app/data" \
leike0813/skill-runner:latest

端口说明:

端口用途
9813HTTP API + 管理 UI
17681浏览器内联引擎终端(需 ttyd)

生产环境配置

对于公开部署,建议启用 UI Basic Auth:

docker run --rm -p 9813:9813 \
-v "$(pwd)/skills:/app/skills" \
-e UI_BASIC_AUTH_ENABLED=true \
-e UI_BASIC_AUTH_USERNAME=admin \
-e UI_BASIC_AUTH_PASSWORD=your-password \
leike0813/skill-runner:latest

建议配合 HTTPS 反向代理(如 Nginx)使用。

应急:一键部署本地模式

⚠️ 此模式仅适合完全不了解如何安装 Agent 工具、也不会使用 Docker 的用户。如果你具备安装 Agent CLI 或 Docker 的能力,请优先选择 ACP 后端 或上方的 Docker 部署。

一键部署的 Skill-Runner 随 Zotero 插件自动启停——关闭 Zotero 即终止所有正在执行的任务,无法后台运行。任务中断后需要重新提交。

部署步骤:

  1. 打开 Zotero → 设置 → Zotero Agents
  2. 找到 SkillRunner Local Backend 区域
  3. 点击 一键部署(如果尚未安装)
    • 插件自动从 GitHub Release 下载最新版本
    • 安装到插件数据目录
    • 完成后状态变为"已安装"
  4. 点击 启动
    • 默认地址:http://127.0.0.1:29813
    • 如果端口被占用,自动尝试后续 10 个端口

操作按钮说明:

按钮功能
部署下载并安装 Skill-Runner 运行时
启动启动本地 Skill-Runner 进程
停止停止正在运行的 Skill-Runner 进程
卸载移除已安装的运行时文件
打开管理 UI在侧边栏中打开 Skill-Runner 内置 Web 管理界面
打开技能文件夹打开存放技能文件的目录
刷新模型缓存刷新后端模型列表缓存
打开调试控制台查看后端日志输出

远程模式

连接到远程或云托管的 Skill-Runner 实例。

⚠️ 安全提示:当前版本未对远程连接做额外的安全保护(如 TLS、API 密钥验证等),仅依赖 Bearer Token 认证。不推荐在非局域网环境中开放远程连接。局域网内部署时建议配合防火墙限制访问来源。

配置步骤:

  1. 打开 工具 → 后端管理器
  2. 切换到 SkillRunner Tab
  3. 点击 添加 SkillRunner
  4. 填写:
    • 显示名称:友好的名称
    • Base URL:远程实例地址(如 http://192.168.1.100:9813
    • 认证方式:选择 bearer 并填写 认证令牌(如果后端需要认证)
    • 超时时间:请求超时(可选)
  5. 点击右下角 保存

本地部署(无 Docker)

快速部署脚本

# Linux / macOS
./scripts/deploy_local.sh

# Windows (PowerShell)
.\scripts\deploy_local.ps1

前提条件:uvNode.jsnpmttyd 为可选。

控制 CLI

# 查看状态
./scripts/skill-runnerctl status --mode local --json

# 启动
./scripts/skill-runnerctl up --mode local --json

# 停止
./scripts/skill-runnerctl down --mode local --json

本地模式默认参数:

  • Linux/macOS$HOME/.local/share/skill-runner
  • Windows%LOCALAPPDATA%\SkillRunner
  • 端口29813(备用 29813-29823
  • 绑定:仅 127.0.0.1

发布安装程序

# Linux / macOS
./scripts/skill-runner-install.sh --version v0.4.3

# Windows (PowerShell)
.\scripts\skill-runner-install.ps1 -Version v0.4.3

脚本自动下载 skill-runner-<version>.tar.gz + .sha256,安装前验证 SHA256 完整性。

引擎系统

Skill-Runner 支持多种 AI Agent CLI 作为执行引擎,并提供统一的适配层。

支持的引擎

引擎包名
Codex@openai/codex
Gemini CLI@google/gemini-cli
OpenCodeopencode-ai
Claude Code@anthropic-ai/claude-code
Qwen@qwen-code/qwen-cli

配置优先级

引擎配置从四层合并(低→高):

  1. 引擎默认值:引擎适配器内置的默认配置
  2. 技能推荐值:技能包 assets/<engine>_config.* 中的推荐配置
  3. 用户选项:API 请求体中的参数
  4. 强制配置:引擎适配器的强制配置(不可覆盖)

引擎认证

方式说明推荐度
OAuth 代理通过管理 UI 完成 OAuth,凭据自动存储⭐ 推荐
CLI 委托使用引擎内置的本地登录流程备选
内联 TUI浏览器中的引擎终端(需 ttyd)用于调试
导入凭证文件通过 UI 上传凭据文件备选
容器 CLI 登录通过 docker exec 直接运行 CLI 登录用于容器环境

管理 UI

内置 Web 管理界面提供对 Skill-Runner 的完整运维能力。

访问地址:http://localhost:<port>/ui

功能说明
技能浏览器查看已安装的技能,检查包结构和文件内容
引擎管理监控引擎状态、触发升级、查看各引擎日志
模型目录浏览和管理引擎模型快照
内联 TUI在浏览器中直接启动引擎终端(需 ttyd)
设置日志级别、数据保留期、最大目录大小等

REST API 概览

核心执行端点

# 列出可用技能
curl http://localhost:9813/v1/skills

# 创建作业(执行技能)
curl -X POST http://localhost:9813/v1/jobs \
-H "Content-Type: application/json" \
-d '{
"skill_id": "my-skill",
"engine": "gemini",
"parameter": { "language": "zh-CN" },
"model": "gemini-3-pro-preview"
}'

# 获取结果
curl http://localhost:9813/v1/jobs/<request_id>/result

# 取消作业
curl -X POST http://localhost:9813/v1/jobs/<request_id>/cancel

实时监听(SSE)

两个 SSE 通道用于实时观察执行过程:

通道端点用途
ChatGET /v1/jobs/{id}/chat?cursor=N聊天气泡流
EventsGET /v1/jobs/{id}/events?cursor=N完整协议事件流

两个通道都支持基于游标的断线重连。

管理 API

稳定的 JSON 管理端点,适合前端集成:

端点用途
GET /v1/management/skills技能摘要
GET /v1/management/engines引擎状态
GET /v1/management/runs运行历史(分页)
GET /v1/management/runs/{id}/chat对话 SSE 流
POST /v1/management/runs/{id}/reply向交互式技能提交回复
POST /v1/management/runs/{id}/cancel取消运行

本地运行时租约 API

本地运行模式使用基于租约的生命周期管理:

端点用途
POST /v1/local-runtime/lease/acquire获取租约
POST /v1/local-runtime/lease/heartbeat续租(TTL: 60s)
POST /v1/local-runtime/lease/release释放租约

租约过期时本地运行时会自动终止。

技能包管理

持久安装

# 上传技能包 zip
curl -X POST http://localhost:9813/v1/skill-packages/install \
-H "Content-Type: multipart/form-data" \
-F "file=@my-skill.zip"

服务端校验规则:

  • 包必须包含顶层目录
  • 必须有 SKILL.md + assets/runner.json
  • 必须有三个 schema 文件(input / parameter / output)
  • 目录名 == runner.json.id == SKILL.md frontmatter name(身份一致性)
  • 更新必须严格升版

临时运行(免安装)

# 创建临时运行
curl -X POST http://localhost:9813/v1/temp-skill-runs \
-H "Content-Type: application/json" \
-d '{ "engine": "gemini", "parameter": {} }'

# 上传技能包并启动
curl -X POST http://localhost:9813/v1/temp-skill-runs/<id>/upload \
-F "skill_package=@my-skill.zip"

临时运行在终态后自动清理。

执行生命周期

一个典型的技能执行包含以下阶段:

1. 设置与上传
└── 客户端提交 POST /v1/jobs
└── 可选上传输入文件

2. 编排
└── 加载技能清单
└── 验证参数 schema
└── 检查引擎兼容性
└── 应用并发限制

3. 引擎适配
└── 准备环境(复制技能包)
└── 解析输入文件
└── 通过 Jinja2 模板构建提示
└── 设置运行目录信任

4. 执行
└── 引擎 CLI 作为子进程启动
└── 隔离工作目录
└── stdout/stderr 实时流式传输

5. 完成
└── 输出验证(针对 output.schema.json)
└── 解析制品文件
└── 生成 Bundle(zip + 清单)
└── 状态设为 succeeded / failed / canceled

运行失败时,调试 Bundle 包含完整日志和诊断文件。

数据目录结构

data/
├── runs/<run_id>/ # 运行工作区
│ ├── .state/state.json # 运行状态
│ ├── .audit/ # 审计日志
│ ├── result/result.json # 最终结构化输出
│ ├── artifacts/ # 技能生成的文件
│ └── bundle/ # 打包结果(zip + 清单)
├── requests/<request_id>/ # 请求阶段数据
│ ├── uploads/ # 上传的输入文件
│ └── request.json # 原始请求参数
├── logs/ # 应用日志(按天轮转)
└── system_settings.json # UI 可编辑的系统设置

环境变量参考

变量说明默认值
SKILL_RUNNER_DATA_DIR运行数据目录./data
SKILL_RUNNER_AGENT_HOMEAgent 隔离配置主目录auto
SKILL_RUNNER_RUNTIME_MODE运行模式:local / containerauto
UI_BASIC_AUTH_ENABLED启用 UI Basic Authfalse
UI_BASIC_AUTH_USERNAMEBasic Auth 用户名
UI_BASIC_AUTH_PASSWORDBasic Auth 密码

运行状态说明

状态说明
unknown初始状态,尚未检测
starting正在启动
running正常运行
stopped已停止
degraded运行异常
reconciling_after_heartbeat_fail心跳检测失败,正在恢复

端口说明

  • 默认端口:29813(插件本地区域)
  • 独立部署 API 端口:9813
  • 回退范围:连续 10 个端口(29813-29822)
  • 心跳间隔:20 秒
  • 自动启动检测:每 15 秒检查一次

日志

日志写入 data/logs/skill_runner.log(按天轮转)。可以通过管理 UI 的设置页面配置日志级别、保留期和最大目录大小。

容器启动时还会生成结构化的引导诊断日志到 ${SKILL_RUNNER_DATA_DIR}/logs/bootstrap.logagent_bootstrap_report.json

下一步