Skills Framework (日本語)
Agent Skills と Omni Skills
Section titled “Agent Skills と Omni Skills”OmniRoute には、明確に異なりながら相互補完的な 2 つのスキルシステムがあります。
| 観点 | Omni Skills(本ドキュメント) | Agent Skills |
|---|---|---|
| 目的 | LLM ツールの注入 + サンドボックス化された実行 | 外部エージェントが検出して利用するための SKILL.md カタログ |
| 信頼できる情報源 | src/lib/skills/ + マーケットプレイス |
src/lib/agentSkills/ + skills/ ディレクトリ |
| ランタイムモード | 送信リクエストに注入され、ツール呼び出しイベント時に実行 | 静的 Markdown カタログ + REST/MCP/A2A 検出エンドポイント |
| 利用者 | OmniRoute 自体(コンボルーティング、受信 LLM 呼び出し) | 外部エージェント、MCP クライアント、A2A オーケストレーター |
| 数 | 可変(マーケットプレイスに依存) | 45 件のカタログエントリ(API 23 件 + CLI 21 件 + 設定 1 件) |
| 形式 | ツールスキーマ + ハンドラーを持つ SkillDefinition |
SKILL.md フロントマター + Markdown 本文 |
| 検出 | /api/skills/* REST + omniroute_skills_* MCP ツール |
/api/agent-skills/* REST + omniroute_agent_skills_* MCP ツール + A2A list-capabilities |
Omni Skills は実行エンジンです。LLM がツールを呼び出した際に OmniRoute が「何を実行できるか」を定義します。
Agent Skills はドキュメントカタログです。外部エージェントに対し、OmniRoute の REST API と CLI を「どのように使用するか」を説明します。構造化された SKILL.md ファイルは、エージェントのプロンプトに直接取り込めます。
Agent Skills のカタログ、ジェネレーター、MCP ツール、および A2A スキルについては、docs/frameworks/AGENT-SKILLS.md を参照してください。
スキルのソース
Section titled “スキルのソース”同じレジストリ内に、次の 3 つのスキルソースが共存します。
- 組み込みスキル(
src/lib/skills/builtins.ts)— OmniRoute に同梱されています。一般的なユースケースをカバーします。file_read,file_write—<DATA_DIR>/skills/workspaces/<hashed-key>/配下にある API キーごとのサンドボックスワークスペースhttp_request—guard: "public-only"を指定したsafeOutboundFetch経由の送信 HTTP リクエストweb_search— キャッシュ機能を備えた差し替え可能な検索プロバイダー(executeWebSearch)eval_code— Docker でサンドボックス化されたnodeまたはpythonの実行execute_command— Docker でサンドボックス化されたシェルコマンドbrowser— Playwright ベースのスキャフォールディング。デフォルトでは無効(builtin/browser.ts)
- SkillsMP(OmniRoute マーケットプレイス)—
https://skillsmp.com/api/v1/skills/searchから取得されます。Settings でskillsmpApiKeyを設定する必要があります。 - SkillsSH(
skills.shコミュニティカタログ)—https://skills.sh/api/searchから取得されます。認証は不要です。SKILL.md の内容は GitHub raw から取得されます。
単一の「アクティブプロバイダー」によって、ダッシュボードがどのカタログからインストールするかが制御されます(src/lib/skills/providerSettings.ts)。Settings → Memory & Skills で切り替えます。デフォルトは skillsmp です。
スキルの識別
Section titled “スキルの識別”スキルは、メモリ内レジストリ(src/lib/skills/registry.ts)で name@version をキーとして管理されます。バージョンは semver(^\d+\.\d+\.\d+$)でなければなりません。resolveVersion() は、^、~、>、>=、<、<=、==、および完全一致制約を解釈します。
スキルモード
Section titled “スキルモード”各スキルには、いつ注入されるかを制御するランタイムモードがあります。
| モード | 動作 |
|---|---|
on |
常にツール定義として注入される |
off |
注入されず、実行もされない |
auto |
受信リクエストに対してスコアリングされ、スコアが AUTO_MIN_SCORE(デフォルトは 3)以上の場合にのみ注入される |
auto は、マーケットプレイスからインストールされたスキルのデフォルトです。enabled=true と mode="off" の組み合わせは、「登録済みだが非アクティブ」を意味します。レガシーカラムを介して enabled を切り替えると mode も更新されるため、古いコードパスとの整合性が維持されます(src/app/api/skills/[id]/route.ts)。
ステータス(実行)
Section titled “ステータス(実行)”スキルの実行は、次のステータスとともに skill_executions テーブルで追跡されます(src/lib/skills/types.ts)。
enum SkillStatus { PENDING = "pending", RUNNING = "running", SUCCESS = "success", ERROR = "error", TIMEOUT = "timeout",}レジストリキャッシュ
Section titled “レジストリキャッシュ”SkillRegistry は、60 秒の TTL キャッシュを持つシングルトンです(registry.ts:14)。loadFromDatabase() は冪等であり、pendingLoad を介して同時呼び出しを重複排除します。書き込み操作(register/unregister/unregisterById)が行われると、キャッシュは無効化されます。バージョンを検索するには、getSkillVersions(name) および resolveVersion(name, constraint) を使用します。
プロバイダー対応の注入
Section titled “プロバイダー対応の注入”src/lib/skills/injection.ts の injectSkills() は、登録済みスキルをプロバイダー固有のツール定義へ変換するエントリーポイントです。
- OpenAI —
{ type: "function", function: { name, description, parameters } } - Anthropic —
{ name, description, input_schema } - Google (Gemini) —
{ name, description, parameters }
ツール名は name@version としてエンコードされるため、モデルがツールを呼び出した際に、ハンドラーが適切なバージョンを選択できます。
AUTO スコアリング
Section titled “AUTO スコアリング”mode="auto" の場合、各スキル候補はリクエストコンテキストに対してスコアリングされます(injection.ts の scoreAutoSkill())。
| シグナル | ポイント |
|---|---|
| スキル名がコンテキスト内にそのまま出現する | +6 |
| 名前の各トークンがコンテキストのトークンと一致する | +2 |
| 各タグの部分文字列がコンテキストと一致する | +3 |
| 説明の各トークンがコンテキストと一致する | +1 |
| バックグラウンド理由が名前のトークンと一致する | トークンごとに +2 |
| バックグラウンド理由がタグと一致する | トークンごとに +2 |
| タグ内のプロバイダーヒントがリクエストのプロバイダーと一致する | +2 / −2 |
score >= AUTO_MIN_SCORE = 3 を満たすスキルのうち、上位 AUTO_MAX_SKILLS = 5 件が挿入されます。同点の場合は、installCount の降順、次に名前のアルファベット順で順位が決まります(injection.ts:225-235)。
ツール呼び出しのインターセプト
Section titled “ツール呼び出しのインターセプト”src/lib/skills/interception.ts の handleToolCallExecution() は、アップストリームがツール呼び出しレスポンスを返した後、チャットハンドラーによって呼び出されます。
extractToolCalls()がプロバイダー固有の形式(OpenAI のtool_calls/ Responses のfunction_call、Anthropic のtool_use、Gemini のfunctionCalls)を読み取ります。- 組み込みツールのエイリアス(例:
omniroute_web_search→web_search)が最初に解決されます。組み込みハンドラーはインラインで実行されます。 - それ以外はすべて、
skillExecutor.execute(name@version, args, { apiKeyId, sessionId })を介してルーティングされます。 - 結果は必要に応じて、
tool_results、function_call_output項目、または Anthropic のtool_resultブロックとしてレスポンスに組み込まれます。
実行コンテキスト内の customSkillExecutionEnabled を false に設定すると、組み込みのインターセプトのみを許可できます(ユーザー定義ハンドラーを明示的に無効化するリクエストパスで使用されます)。
Docker サンドボックス
Section titled “Docker サンドボックス”組み込みではないコードパス(eval_code、execute_command)は、SandboxRunner(src/lib/skills/sandbox.ts)を介して Docker 内で実行されます。各コンテナは以下の設定で起動されます。
--rm --network none|bridge --cap-drop ALL--security-opt no-new-privileges --pids-limit 100--cpus <cpuLimit/1000> --memory <memoryLimit>m--tmpfs /tmp:rw,noexec,nosuid,size=64m--tmpfs /workspace:rw,noexec,nosuid,size=64m--read-only (readOnly=true の場合)デフォルト(SandboxRunner.DEFAULT_CONFIG):
| フィールド | デフォルト | 注記 |
|---|---|---|
cpuLimit |
100 (= 0.1 CPU) | --cpus に渡す前に 1000 で除算 |
memoryLimit |
256 MB | ハードリミット |
timeout |
30000 ms | SIGTERM + docker kill によるソフトキル |
networkEnabled |
false |
--network none になる |
readOnly |
true |
ルート FS は読み取り専用。/tmp と /workspace は tmpfs |
シャットダウン用に SandboxRunner.kill(id) と killAll() が公開されています。実行中のコンテナは runningContainers: Map<string, ChildProcess> で追跡されます。
サンドボックス環境変数
Section titled “サンドボックス環境変数”src/lib/skills/builtins.ts 内の process.env を介して設定されます。
| 環境変数 | デフォルト | 目的 |
|---|---|---|
SKILLS_MAX_FILE_BYTES |
1048576 (1 MB) |
file_read と file_write の上限 |
SKILLS_MAX_HTTP_RESPONSE_BYTES |
256000 |
http_request のレスポンス本文の上限 |
SKILLS_MAX_SANDBOX_OUTPUT_CHARS |
100000 |
呼び出し元に返される stdout/stderr の上限 |
SKILLS_SANDBOX_TIMEOUT_MS |
10000 |
サンドボックス化されたコマンドのデフォルトタイムアウト。上限は 60 s |
SKILLS_SANDBOX_NETWORK_ENABLED |
false |
外向き通信のマスターゲート。呼び出しごとのオプトインを許可するには 1 または true に設定 |
SKILLS_ALLOWED_SANDBOX_IMAGES |
(以下を参照) | Docker イメージのカンマ区切り許可リスト |
デフォルトで許可されるイメージ:alpine:3.20、node:22-alpine、python:3.12-alpine。SKILLS_ALLOWED_SANDBOX_IMAGES による追加分はデフォルトとマージされ、未知のイメージは normalizeImage() によって拒否されます。
注:独立した
SKILLS_EXECUTION_TIMEOUT_MS環境変数はありません。サンドボックス外のハンドラーのタイムアウトはSkillExecutor(executor.ts:13)内で 30 s にハードコードされていますが、実行時にskillExecutor.setTimeout(ms)で上書きできます。
ワークスペースの分離
Section titled “ワークスペースの分離”file_read と file_write は、すべてのパスを API キーごとのワークスペース <DATA_DIR>/skills/workspaces/<sha256(apiKeyId).slice(0,24)>/ を基準として解決します。パストラバーサル(..)および禁止セグメント(.env、.git、.ssh、.omniroute、.codex、secrets)は、ディスク I/O が行われる前に拒否されます。
HTTP の堅牢化
Section titled “HTTP の堅牢化”http_request(builtins.ts:257):
- メソッドの許可リスト:
GET, HEAD, POST, PUT, PATCH, DELETE - ブロックされる外向きヘッダー:
host, connection, content-length, cookie, set-cookie, authorization, proxy-authorization - リダイレクトは無効(
allowRedirect: false) guard: "public-only"を指定したsafeOutboundFetch経由でルーティング(プライベート/ループバック範囲をブロック)- レスポンスは
SKILLS_MAX_HTTP_RESPONSE_BYTESで切り詰められ、クライアントにはtruncated: trueが返される
ハイブリッドエグゼキューター(プレビュー)
Section titled “ハイブリッドエグゼキューター(プレビュー)”src/lib/skills/hybrid.ts は、呼び出しごとに direct(プロセス内)実行と sandbox 実行のどちらを使用するかを決定し、タイムアウト/メモリエラー発生時には autoUpgrade による再試行を行う HybridExecutor を定義しています。組み込まれている directExecutor / sandboxRunner の実装はスタブです(executeDirect、executeInSandbox はプレースホルダーオブジェクトを返します)。このモジュールは構築途中のコントラクトとして扱ってください。実際の実行は、引き続き skillExecutor + SandboxRunner を通じて行われます。
スキーマは、次の2つのマイグレーションにあります。
src/lib/db/migrations/016_create_skills.sql— 基本となるskillsおよびskill_executionsテーブルを作成し、(api_key_id, name)と(skill_id, status, created_at)にインデックスを設定します。src/lib/db/migrations/027_skill_mode_and_metadata.sql—skillsにmode、source_provider、tags(JSON)、install_countを追加します。
skill_executions.status はデータベースレベルで制約されています:CHECK(status IN ('pending', 'running', 'success', 'error', 'timeout'))。
REST API
Section titled “REST API”すべてのエンドポイントは src/app/api/skills/ 配下にあります。管理エンドポイント(/api/skills、/api/skills/[id]、/api/skills/install)には、requireManagementAuth() による管理認証が必要です。マーケットプレイス/インストールフローでは、より軽量な isAuthenticated()(セッションまたはAPIキー)を使用します。
| エンドポイント | メソッド | 目的 |
| ——————————— | —— | ———————————————————————— | — | ———————— | –––– | —————— |
| /api/skills | GET | 登録済みスキルを一覧表示します。?q=、?mode=on | off | auto、?source=skillsmp | skillssh | local、ページネーションをサポートします |
| /api/skills/[id] | PUT | enabled または mode を更新します |
| /api/skills/[id] | DELETE | IDで登録を解除します |
| /api/skills/install | POST | カスタムスキル(ハンドラーコード + スキーマ)をインストールします |
| /api/skills/marketplace | GET | SkillsMPカタログを検索します(q が空の場合は人気のデフォルト項目を返します) |
| /api/skills/marketplace/install | POST | SkillsMPスキルをインストールします(アクティブなプロバイダーが skillsmp である必要があります) |
| /api/skills/skillssh | GET | skills.shカタログを検索します(?q=&limit=、上限100件) |
| /api/skills/skillssh/install | POST | skills.shスキルをインストールします(アクティブなプロバイダーが skillssh である必要があります) |
| /api/skills/executions | GET | ページネーション付きの実行履歴(?apiKeyId=) |
| /api/skills/executions | POST | 登録済みスキルをアドホックに実行します |
POST /api/skills/executions エンドポイントは、settings.skillsEnabled === false の場合、HTTP 503 と { error: "Skills execution is disabled..." } を返します(executor.ts:42-45)。オペレーターは、Settings → AI からマスタースイッチを切り替えられます。
例:カスタムスキルをインストールする
Section titled “例:カスタムスキルをインストールする”curl -X POST http://localhost:20128/api/skills/install \ -H "Authorization: Bearer $OMNIROUTE_MGMT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "reverse-text", "version": "1.0.0", "description": "Reverses a string", "schema": { "input": { "type": "object", "properties": { "text": { "type": "string" } }, "required": ["text"] }, "output": { "type": "object", "properties": { "reversed": { "type": "string" } } } }, "handlerCode": "echo-handler", "apiKeyId": "your-api-key-id" }'handlerCode 文字列は、実行可能コードではなく、ハンドラー名のルックアップです。エグゼキューターは、skillExecutor.registerHandler(name, fn)(executor.ts:25)を介してこれをマッピングします。マーケットプレイスからのインストールでは、SKILL.mdのテキストをドキュメントとしてこのフィールドに保存し、モデルが生成したツール呼び出しを通じて実行をルーティングします。ユーザーが任意に提供したソースがevalされることはありません。
MCP ツール
Section titled “MCP ツール”4 つの MCP ツールがスキル機能をラップしています(open-sse/mcp-server/tools/skillTools.ts)。これらは MCP サーバーの起動時に自動登録されます。
| ツール | 説明 |
|---|---|
omniroute_skills_list |
スキルを一覧表示します。オプションのフィルター: apiKeyId、name、enabled |
omniroute_skills_enable |
skillId を指定してスキルを有効化または無効化します |
omniroute_skills_execute |
入力ペイロードを使用してスキルを実行します |
omniroute_skills_executions |
最近の実行履歴(デフォルト 50 件、最大 100 件) |
トランスポートの設定とスコープの割り当てについては、MCP-SERVER.mdを参照してください。
A2A 統合
Section titled “A2A 統合”src/lib/skills/a2a.ts は、memory_aware_routing A2A スキル記述子と registerA2ASkill(registry) ヘルパーをエクスポートします。カスタム A2A スキルは src/lib/a2a/skills/ に配置され、A2A_SKILL_HANDLERS(src/lib/a2a/taskExecution.ts)を介してディスパッチされます。タスクのライフサイクル全体については、A2A-SERVER.mdを参照してください。
新しい組み込みスキルの追加
Section titled “新しい組み込みスキルの追加”- ハンドラーを定義します。
src/lib/skills/builtins.ts(またはsrc/lib/skills/builtin/配下の同階層ファイル)に追加します。シグネチャ:(input, { apiKeyId, sessionId }) => Promise<output>。 - サンドボックス化されたコードパスですか?
sandboxRunner.run(image, command, env, sandboxConfig({...}))を呼び出します。許可リストに対してnormalizeImage()を使用します。 - ファイルシステムパスですか? ディスクにアクセスする前に、必ず
resolveWorkspacePath(input, context)を通します。 - ネットワーク呼び出しですか?
guard: "public-only"を指定してsafeOutboundFetchを使用し、sanitizeHeaders()でヘッダーをサニタイズします。 - 登録するには、
builtinSkillsにエントリを追加します(または起動時にregisterBrowserSkill(executor)形式で呼び出します)。 - 組み込みツールのエイリアスを接続します(任意)。上流モデルが異なる名前を出力する場合は、
BUILTIN_TOOL_ALIASES(interception.ts:23)に追加します。 - テストは
src/lib/skills/__tests__/に追加します(Vitest)。
カスタム(非組み込み)スキルの追加
Section titled “カスタム(非組み込み)スキルの追加”- プロセスの起動時にハンドラーを登録します。
skillExecutor.registerHandler("my-handler", async (input, ctx) => { ... });
POST /api/skills/installを介してスキルを挿入します(handlerCodeフィールドは登録済みのハンドラー名と一致する必要があります)。PUT /api/skills/[id]を介してmodeをonまたはautoに切り替えます。
運用上のヒント
Section titled “運用上のヒント”- マスタースイッチ:
settings.skillsEnabled = falseにすると、すべての実行がブロックされ、/api/skills/executionsは HTTP503を返します。レジストリの読み込みは継続されます。 - 外向き通信の制限: 完全にエアギャップされたサンドボックスを維持するには、
SKILLS_SANDBOX_NETWORK_ENABLEDを未設定(デフォルト)のままにします。呼び出しごとのnetworkEnabled: trueでも、マスターゲートが有効である必要があります。 - 特定イメージの許可: 許可リストを拡張するには、
SKILLS_ALLOWED_SANDBOX_IMAGES="myorg/sandbox:1.0,node:22-alpine"を設定します。 - 実行の監査:
/dashboard/skills/executionsとomniroute_skills_executionsは、どちらもskill_executionsをクエリします。成功した実行にはdurationMs、失敗した実行にはerrorMessageが含まれます。 - キャッシュの無効化: DB を手動で編集した後は
skillRegistry.invalidateCache()を呼び出します。それ以外の場合は 60 秒待ちます。 - 匿名ワークスペース:
apiKeyIdが空の場合、すべての呼び出しは同じ"anonymous"ワークスペースにハッシュされます。共有を考慮するコードでは、常に実際のキーを渡す必要があります。
実行ライフサイクル (v3.8.16+)
Section titled “実行ライフサイクル (v3.8.16+)”SkillExecutor (src/lib/skills/executor.ts) は、すべてのスキル呼び出しを管理するシングルトンです。そのライフサイクルを理解することは、タイムアウト、再試行、実行状態をデバッグするうえで重要です。
5段階のライフサイクル
Section titled “5段階のライフサイクル” execute() が呼び出される │ ▼ ┌─────────────┐ │ PENDING │ ← キューに登録済み、まだ開始されていない(DB行を作成) └──────┬──────┘ │ ハンドラーを開始 ▼ ┌─────────────┐ │ RUNNING │ ← タイムアウト付きでハンドラーを呼び出し └──────┬──────┘ │ ┌────┴────┬──────────┬──────────┐ │ │ │ │ ▼ ▼ ▼ ▼ SUCCESS ERROR TIMEOUT (他の経路はなし — 親によって強制終了) │ │ │ └────┬────┴──────────┘ │ ▼ ステータス、出力、durationMs でDB行を更新デフォルト設定
Section titled “デフォルト設定”| 設定 | デフォルト値 | 設定方法 |
|---|---|---|
timeout |
30000 (30秒) |
skillExecutor.setTimeout(ms) |
maxRetries |
3 |
skillExecutor.setMaxRetries(count) |
重要: executor はシングルトンです。
setTimeout()を呼び出すと、それ以降のすべての呼び出しにグローバルに影響します。スキルごとのタイムアウトは現在サポートされていません。スキルごとに異なるタイムアウトが必要な場合は、別々のプロセスを起動するか、executor をフォークしてください。
ステータス値
Section titled “ステータス値”src/lib/skills/types.ts より:
enum SkillStatus { PENDING = "pending", // キューに登録済み、まだ開始されていない RUNNING = "running", // ハンドラーが呼び出された SUCCESS = "success", // ハンドラーが有効な出力を返した ERROR = "error", // ハンドラーが例外をスローした TIMEOUT = "timeout", // executor のタイムアウト時間を超過した}注記:
TIMEOUTステータスは enum で定義されていますが、現在の executor 実装では実際にはDBに書き込まれません。タイムアウトは、メッセージ"Skill execution timed out"を伴うERRORとして表面化します。このステータス enum は将来の使用のために予約されています。
import { skillExecutor } from "omniroute/skills/executor";
// IDで特定の実行を取得const exec = skillExecutor.getExecution("exec-uuid-123");if (exec) { console.log(`${exec.skillName}: ${exec.status} in ${exec.durationMs}ms`);}
// APIキーの最近の実行を一覧表示const recent = skillExecutor.listExecutions("api-key-id", 50, 0);for (const e of recent) { console.log(`${e.skillName} → ${e.status} (${e.durationMs}ms)`);}
// 実行総数を取得const total = skillExecutor.countExecutions("api-key-id");再試行の動作
Section titled “再試行の動作”maxRetries 設定は保存されますが、現在 executor の execute() メソッドでは使用されていません。実行されるのは1回の試行のみです。maxRetries の値は、将来の実装と、この値を読み取る必要があるフックのために公開されています。
現時点では、再試行はスキルハンドラー内で実装する必要があります。組み込み
スキルは executor に対して登録されます(例: src/lib/skills/builtin/ 内の
registerBuiltinSkills(executor) / registerBrowserSkill(executor))。登録する
ハンドラーは、それ自体の再試行ループで処理をラップできます。
// スキルハンドラー内async function handler(input, ctx) { const maxRetries = 3; let lastError: Error | null = null;
for (let attempt = 1; attempt <= maxRetries; attempt++) { try { return await fetchSomething(input); } catch (err) { lastError = err as Error; if (attempt < maxRetries) { await new Promise((r) => setTimeout(r, 1000 * attempt)); } } } throw lastError;}SkillMode の詳細
Section titled “SkillMode の詳細”SkillMode enum(src/lib/skills/types.ts)は、スキルがいつ、どのように呼び出されるかを制御します。
enum SkillMode { AUTO = "auto", // スキルをいつ呼び出すかを LLM が判断 MANUAL = "manual", // ユーザーからの明示的なリクエストによってのみ呼び出される HYBRID = "hybrid", // AUTO スコアリング + 手動オーバーライド}注: コードベースでは
SkillMode(AUTO/MANUAL/HYBRID)が定義されていますが、Skill.modeフィールドは別の形式("on" | "off" | "auto")を使用します。これらは関連していますが、同一ではありません。SkillModeはエグゼキューターのポリシー用であり、Skill.modeはスキルごとの有効化設定用です。
各モードを使用する場面
Section titled “各モードを使用する場面”| モード | LLM の動作 | ユースケース |
|---|---|---|
AUTO |
必要と判断した場合、LLM はスキルを呼び出せる | 汎用スキル(ファイルの読み取り、HTTP リクエスト) |
MANUAL |
LLM はスキルを呼び出せず、明示的な executeSkill API 呼び出しによってのみ実行される |
機密性の高い操作(データベースへの書き込み、支払い処理) |
HYBRID |
LLM はスキルを提案できるが、ユーザーによる確認が必要 | 副作用はあるものの危険ではないスキル |
AUTO スコアリング
Section titled “AUTO スコアリング”AUTO モードが有効な場合、各候補スキルは
src/lib/skills/injection.ts の scoreAutoSkill() によってリクエストの
コンテキストに対してスコアリングされます。これは加算式の整数ポイントシステム
(スキル名の一致、名前・タグ・説明のトークン重複、バックグラウンド理由のヒント、
プロバイダーヒントのボーナス/ペナルティ)です。score >= AUTO_MIN_SCORE = 3 を
満たす上位 AUTO_MAX_SKILLS = 5 個のスキルが呼び出し可能なツールとして注入され、
同点の場合は installCount、次に名前の順で決定されます。完全なポイント表については、
このドキュメントの前半にある
ツールスキーマ生成 → AUTO スコアリングを参照してください。
浮動小数点数の 0.6 のようなしきい値や、registry.ts でのスコアリングはありません。
組み込みスキルカタログ
Section titled “組み込みスキルカタログ”OmniRoute には、src/lib/skills/builtin/ に厳選された組み込みスキルのセットが付属しています。最も一般的なものは次のとおりです。
ブラウザー自動化スキル
Section titled “ブラウザー自動化スキル”ブラウザースキル(src/lib/skills/builtin/browser.ts)は、Playwright/Puppeteer を介したヘッドレスブラウザー自動化を提供します。実装済みですが、デフォルトのスキルカタログには含まれていません。使用するには、ブラウザー拡張プラグインを別途インストールしてください。
// 設定で有効化const config: SkillConfig = { enabled: true, mode: SkillMode.MANUAL, // 常に明示的な呼び出しを要求 allowedSkills: ["browser"], timeout: 60000, // ページ読み込み用に 60 秒 maxRetries: 1,};その他の組み込みカテゴリー
Section titled “その他の組み込みカテゴリー”| カテゴリー | スキル | モード |
|---|---|---|
| ファイル I/O | file_read, file_write |
AUTO |
| HTTP | http_request |
AUTO |
| 検索 | web_search |
AUTO |
| コード実行 | eval_code(サンドボックス化された JavaScript/Python) |
HYBRID |
| システム | execute_command(サンドボックス化された CLI 実行) |
MANUAL |
カスタムスキルの追加
Section titled “カスタムスキルの追加”プラグインシステムを介してカスタムスキルを追加する方法については、プラグイン SDK とスキルの統合を参照してください。
- MCP-SERVER.md — MCPツールの登録とトランスポート
- A2A-SERVER.md — A2Aタスクのライフサイクルとスキルのディスパッチ
- USER_GUIDE.md — ユーザー向け概要
- ARCHITECTURE.md — リクエストパイプラインとコンポーネントマップ
- ソース:
src/lib/skills/、src/app/api/skills/、open-sse/mcp-server/tools/skillTools.ts - テスト:
src/lib/skills/__tests__/integration.test.ts
HagiCode
HagiCode は構造化ワークフロー、マルチエージェント実行、Hero Dungeon ビューを備えたエージェント型コーディングワークスペースです。
よりスマートで速く、楽しいエージェント型ワークフローで、使いやすいソフトウェアを形にします。

- Smart構造化ワークフローは意図をアイデアから変更のリリースまで実行可能な道筋にします。
- Efficientマルチエージェントのワークフローで調査、実装、レビューを並行して進めます。
- FunHero Dungeon により長時間のコーディングを視覚的で協力的な体験にします。