メインコンテンツまでスキップ

Skill-Runnerデプロイと設定

Skill-Runnerとは

Skill-Runnerは独立したエージェントスキル実行サービスである。Zotero AgentsはHTTP APIを介してSkill-Runnerと通信し、スキルリクエストの送信と結果の取得を行う。複数のAIエージェントCLIをバックエンドエンジンとしてサポートし、独立したDockerコンテナまたはローカルサービスとしてデプロイできる。

🏆 推奨優先度: マシンにACP対応のエージェントツール(Codex、OpenCode、Claude Codeなど)がすでにある場合は、まずACPバックエンドを使用されたい。追加の設定はゼロで済む。Skill-Runnerは永続的なバックグラウンドサービスやLAN共有が必要なシナリオに適している。

デプロイモード

推奨:Docker永続デプロイ

DockerデプロイのSkill-Runnerは独立した永続サービスとして動作し、Zoteroの開始/停止に影響されない。Zoteroを閉じてもタスクはバックグラウンドで実行を継続でき、次回Zoteroを起動した際に再開または完了した結果を直接取得できる。

適するケース:

  • 長時間実行タスク(トピック統合、バッチ文献分析など)
  • LAN内で複数のデバイスから単一の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
  • 管理UI: http://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など)との併用を推奨する。

緊急時:ワンクリックローカルモードデプロイ

⚠️ このモードはエージェントツールのインストール方法を知らず、Dockerも使用できないユーザーにのみ適している。エージェントCLIのインストールやDockerの使用が可能であれば、ACPバックエンドまたは上記のDockerデプロイを優先されたい。

ワンクリックデプロイのSkill-RunnerはZoteroプラグインの開始/停止に連動して自動的に起動・停止する。Zoteroを閉じると現在実行中のすべてのタスクが終了し、バックグラウンド実行はない。中断されたタスクは再送信が必要である。

デプロイ手順:

  1. Zotero → 設定 → Zotero Agentsを開く
  2. SkillRunnerローカルバックエンドセクションを探す
  3. ワンクリックデプロイをクリック(未インストールの場合)
    • プラグインがGitHub Releasesから最新版を自動的にダウンロード
    • プラグインのデータディレクトリにインストール
    • 完了するとステータスが「インストール済み」に変化する
  4. スタートをクリック
    • デフォルトアドレス:http://127.0.0.1:29813
    • ポートが占有されている場合は、次の10ポートを自動的に試行

アクションボタンの説明:

ボタン機能
デプロイSkill-Runnerランタイムをダウンロードしてインストール
スタートローカルSkill-Runnerプロセスを起動
ストップ実行中のSkill-Runnerプロセスを停止
アンインストールインストールされたランタイムファイルを削除
管理UIを開くSkill-Runner組み込みWeb管理インターフェースをサイドバーで開く
Skillsフォルダを開くSkillファイルが格納されているディレクトリを開く
モデルキャッシュを更新バックエンドモデルリストキャッシュをリフレッシュ
デバッグコンソールを開くバックエンドのログ出力を表示

リモートモード

リモートまたはクラウドホストのSkill-Runnerインスタンスに接続する。

⚠️ セキュリティに関する注意: 現バージョンではリモート接続に対する追加のセキュリティ保護(TLS、APIキー検証など)は提供されておらず、Bearer Token認証のみに依存している。LAN以外の環境でのリモート接続は推奨されない。LAN内にデプロイする場合は、ファイアウォールを使用してアクセス元を制限することを推奨する。

設定手順:

  1. **ツール → バックエンドマネージャー**を開く
  2. SkillRunnerタブに切り替える
  3. Add 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のみ

Releaseインストーラ

# 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エージェントCLIを実行エンジンとしてサポートし、統一された適応レイヤーを提供する。

サポートされているエンジン

エンジンパッケージ名
Codex@openai/codex
Gemini CLI@google/gemini-cli
OpenCodeopencode-ai
Claude Code@anthropic-ai/claude-code
Qwen@qwen-code/qwen-cli

設定の優先度

エンジン設定は4つのレイヤーからマージされる(低→高):

  1. エンジンのデフォルト: エンジンアダプタに組み込まれたデフォルト設定
  2. スキルの推奨値: スキルパッケージのassets/<engine>_config.*からの推奨設定
  3. ユーザーオプション: APIリクエストボディからのパラメータ
  4. 強制設定: エンジンアダプタからの強制設定(上書き不可)

エンジン認証

方法説明推奨度
OAuthプロキシ管理UIを通じてOAuthを完了。認証情報は自動的に保存される⭐ 推奨
CLI委譲エンジンの組み込みローカルログインフローを使用代替手段
インラインTUIブラウザ内のエンジンターミナル(ttydが必要)デバッグ用
認証情報ファイルのインポートUIを通じて認証情報ファイルをアップロード代替手段
コンテナCLIログインdocker execでCLIログインを直接実行コンテナ環境用

管理UI

組み込みWeb管理インターフェースはSkill-Runnerの完全な運用機能を提供する。

アクセスURL:http://localhost:<port>/ui

機能説明
Skillブラウザインストール済みSkillの表示、パッケージ構造とファイル内容の検査
エンジン管理エンジンステータスの監視、アップグレードのトリガー、エンジンログの表示
モデルカタログエンジンモデルスナップショットの閲覧と管理
インラインTUIブラウザ内でエンジンターミナルを直接起動(ttydが必要)
設定ログレベル、データ保持期間、最大ディレクトリサイズなど

REST API概要

コア実行エンドポイント

# 利用可能なSkillを一覧
curl http://localhost:9813/v1/skills

# ジョブを作成(Skillを実行)
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)

実行過程をリアルタイムで観察するための2つのSSEチャネルがある。

チャネルエンドポイント用途
チャットGET /v1/jobs/{id}/chat?cursor=Nチャットバブルストリーム
イベントGET /v1/jobs/{id}/events?cursor=N完全なプロトコルイベントストリーム

両チャネルともカーソルベースの再接続をサポートする。

管理API

フロントエンド統合に適した安定したJSON管理エンドポイント。

エンドポイント用途
GET /v1/management/skillsSkillのサマリー
GET /v1/management/enginesエンジンステータス
GET /v1/management/runs実行履歴(ページネーション)
GET /v1/management/runs/{id}/chat会話SSEストリーム
POST /v1/management/runs/{id}/replyインタラクティブSkillへの返信を送信
POST /v1/management/runs/{id}/cancel実行をキャンセル

ローカルランタイムリースAPI

ローカルランタイムモードはリースベースのライフサイクル管理を使用する。

エンドポイント用途
POST /v1/local-runtime/lease/acquireリースを取得
POST /v1/local-runtime/lease/heartbeatリースを更新(TTL: 60秒)
POST /v1/local-runtime/lease/releaseリースを解放

ローカルランタイムはリースの期限が切れると自動的に終了する。

Skillパッケージ管理

永続インストール

# Skillパッケージの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が必要
  • 3つのスキーマファイル(input / parameter / output)が必要
  • ディレクトリ名 == runner.json.id == SKILL.mdのfrontmatter名(同一性の整合性)
  • 更新は厳密にバージョン増加であること

一時実行(インストールなし)

# 一時実行を作成
curl -X POST http://localhost:9813/v1/temp-skill-runs \
-H "Content-Type: application/json" \
-d '{ "engine": "gemini", "parameter": {} }'

# Skillパッケージをアップロードして開始
curl -X POST http://localhost:9813/v1/temp-skill-runs/<id>/upload \
-F "skill_package=@my-skill.zip"

一時実行は終端状態に達すると自動的にクリーンアップされる。

実行ライフサイクル

典型的なスキル実行は以下のステージを含む。

1. セットアップとアップロード
└── クライアントがPOST /v1/jobsを送信
└── 入力ファイルをオプションでアップロード

2. オーケストレーション
└── Skillマニフェストをロード
└── パラメータスキーマを検証
└── エンジン互換性をチェック
└── 同時実行制限を適用

3. エンジン適応
└── 環境を準備(Skillパッケージをコピー)
└── 入力ファイルを解析
└── Jinja2テンプレートでプロンプトを構築
└── 実行ディレクトリの信頼を設定

4. 実行
└── エンジンCLIをサブプロセスとして起動
└── 分離された作業ディレクトリ
└── stdout/stderrをリアルタイムでストリーミング

5. 完了
└── 出力の検証(output.schema.jsonに対して)
└── アーティファクトファイルを解析
└── バンドルを生成(zip + マニフェスト)
└── ステータスをsucceeded / failed / canceledに設定

実行が失敗した場合、デバッグバンドルには完全なログと診断ファイルが含まれる。

データディレクトリ構造

data/
├── runs/<run_id>/ # 実行ワークスペース
│ ├── .state/state.json # 実行状態
│ ├── .audit/ # 監査ログ
│ ├── result/result.json # 最終構造化出力
│ ├── artifacts/ # Skillが生成したファイル
│ └── bundle/ # パッケージ化された結果(zip + マニフェスト)
├── requests/<request_id>/ # リクエストフェーズのデータ
│ ├── uploads/ # アップロードされた入力ファイル
│ └── request.json # 元のリクエストパラメータ
├── logs/ # アプリケーションログ(日次ローテーション)
└── system_settings.json # UIで編集可能なシステム設定

環境変数リファレンス

変数説明デフォルト
SKILL_RUNNER_DATA_DIR実行データディレクトリ./data
SKILL_RUNNER_AGENT_HOMEエージェント分離設定ホームディレクトリauto
SKILL_RUNNER_RUNTIME_MODEランタイムモード:local / containerauto
UI_BASIC_AUTH_ENABLEDUI Basic Authを有効にするfalse
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.logおよびagent_bootstrap_report.jsonに生成される。

次のステップ