Skip to main content
ツールと拡張機能

Skills

このページの「メインセッション」は query()(または Python の QoderSDKClient)が直接駆動するセッションを指し、Agent ツールで委任されるサブ Agent と対比されます。両者の関係は サブ Agent を参照してください。 options.skills はメインセッションの skill コンテキストと Skill ツールの呼び出しポリシーを制御します。文字列リストを渡すと、SDK はメインセッションの skill allowlist を発行し、各項目を Skill(name) にコンパイルしてツール許可リスト(allowedTools / allowed_tools)とマージします。'all' を渡すと発見済みのすべての skill を呼び出せ、メインセッションのコンテキストは追加でフィルタされません。

SDK は内蔵 skills をロードしない

SDK は CLI 起動時に常に --disable-builtin-skills を追加するため、セッションは CLI 出荷時の組み込み skill 群(simplify、debug、security-review、quest、batch、agent-creator、hook-config、mcp-config、skill-creator など)を取得しません。発見リスト(TypeScript の initializationResult().skills、Python の get_server_info()['skills'])にも source: 'built-in' のエントリは現れず、モデルのシステムプロンプトからも見えません。 これは SDK の固定動作で、オプトインのスイッチはありません。CLI 内蔵 skill の機能が必要な場合は、plugin / ユーザーディレクトリ / プロジェクトディレクトリのいずれかに自前で SKILL.md を用意するか、SDK を使わずに CLI を直接実行してください。 セッションは以下のソースから提供される skills を引き続き利用できます:
  • plugin skills:options.plugins でロードし、プラグイン修飾名(plugin:skill)でアドレスします。
  • ユーザー / プロジェクト skills:setting sources オプションで user / project / local を明示的に有効化すると発見されます。
  • Agent プリロード skills:options.agents[name].skills で宣言し、対象のサブ Agent のみに作用します。
このセッションでどの skills が発見されたかを確実に知るには、実行時に発見リストを読み取ってください。コードに集合をハードコードしないでください。

CLI デフォルトポリシーの使用

skills を渡さない場合、SDK は追加の Skill allowlist を注入せず、CLI 自身のポリシーに完全に委ねます。組み込み skill は無効化済みのため、setting sources / plugins のないセッションでは発見リストは空になります。
import { query } from '@qoder-ai/qoder-agent-sdk';

const q = query({
  prompt: 'Analyze the test coverage of this project',
  options: {
    cwd: '/path/to/project',
  },
});

発見済みの全 skills を有効化

const q = query({
  prompt: 'Use an appropriate skill to perform a code review',
  options: {
    cwd: '/path/to/project',
    settingSources: ['project'],
    skills: 'all',
  },
});
skills に 'all' を指定すると、Skill ツールは CLI が現在発見しているすべての skill を呼び出せます(ソースは setting sources / plugins で決まり、組み込みはもう含まれません)。

指定した skills のみ有効化

const q = query({
  prompt: 'Use the review skill to inspect recent changes',
  options: {
    cwd: '/path/to/project',
    settingSources: ['project'],
    skills: ['review'],
  },
});
文字列リストを渡すと、一致する skill だけがメインモデルの skill 一覧に表示され、Skill ツールから呼び出せます。項目には通常名とプラグイン修飾名の両方を使用できます。空リスト [] を渡すと、メインセッションではすべての skill が非表示になり、Skill ツールからの呼び出しも拒否されます。 このリストは CLI の発見結果を変えません。列挙されていない skill も発見リストに現れることがあります。

プラグイン内 skill の有効化

プラグイン内の skill はプラグイン修飾名 plugin:skill を使用します。プラグインのロード方法については Plugins ドキュメント を参照してください。
const q = query({
  prompt: 'Use the echo skill provided by the plugin to handle this input',
  options: {
    plugins: [{ type: 'local', path: '/path/to/sdk-test-plugin' }],
    skills: ['sdk-test-plugin:sdk-echo'],
  },
});

明示的なツールホワイトリストとのマージ

const q = query({
  prompt: 'Read the source and use the review skill to produce a list of issues',
  options: {
    cwd: '/path/to/project',
    settingSources: ['project'],
    allowedTools: ['Read', 'Grep'],
    skills: ['review'],
  },
});
上記の設定は最終的に、列挙した読み取り / 検索ツールと Skill(review) を許可します。SDK はマージと重複排除を行い、同名エントリを重複して書き込みません。

発見済み skills を非表示にする

文字列リスト形式の options.skills はメインセッションのモデルコンテキストをフィルタし Skill ツール呼び出しを制限しますが、発見リストの発見結果は変えません。plugin / ユーザー / プロジェクトの skill を発見リストからも消したい場合は、settings.skillOverrides を使ってください。
const q = query({
  prompt: 'Handle this task',
  options: {
    plugins: [{ type: 'local', path: '/path/to/sdk-test-plugin' }],
    settings: {
      skillOverrides: {
        'sdk-test-plugin:sdk-echo': 'off',
      },
    },
  },
});
  • 'off':完全に非表示。発見リストにもモデルのシステムプロンプトにも現れず、Skill ツール呼び出しも拒否されます。
  • その他の値:'on'(デフォルト)、'name-only'(名前のみ表示、説明は非表示)、'user-invocable-only'(モデルからは見えないが、ユーザーは /name でトリガー可能)。
  • 影響範囲:SDK から見える全ソース(plugin、user、project など)がこの override を尊重します。CLI 内蔵 skill はすでに --disable-builtin-skills で遮断されているため、override を書いても作用対象がありません。
  • キーの命名規則:プラグイン skill はプラグイン修飾名 plugin:skill を使用、非プラグイン skill は修飾なしの名前を使用。両方の形式を同時に記述可能で、マッチング時は完全名で先にヒットし、ヒットしない場合は修飾なしの名前にフォールバックします。
options.skills はメインセッションのモデルコンテキストを隠せますが、発見リストはフィルタしません。発見リストからも隠す場合は skillOverrides: { name: 'off' } を使ってください。

ユーザーが選択した Skills を単一メッセージで有効化

Skill ピッカーを表示する TypeScript ホストは、ユーザーの選択をストリーミング SDKUserMessage に付加できます。CLI はそのメッセージを処理する前に、直接のユーザー意図として Skill を有効化します。モデルが Skill ツールの呼び出しを判断する必要はありません。
TypeScript
import { query, type SDKUserMessage } from '@qoder-ai/qoder-agent-sdk';

async function* messages(): AsyncGenerator<SDKUserMessage> {
  yield {
    type: 'user',
    message: {
      role: 'user',
      content: [{ type: 'text', text: 'この変更をレビューし、説明は簡潔にしてください。' }],
    },
    parent_tool_use_id: null,
    client_composed: true,
    selected_skills: [
      { name: 'review' },
      { name: 'explain', arguments: '--concise' },
    ],
  };
}

const q = query({
  prompt: messages(),
  options: {
    cwd: '/path/to/project',
    settingSources: ['project'],
  },
});
selected_skills はこのメッセージだけに作用し、セッション全体の options.skills によるモデル可視性と Skill ツールポリシーは変更しません。ユーザーの直接選択は別経路で処理されるため、選択した Skill を options.skills のリストに含める必要はありません。各要素には発見済み Skill の名前と任意の生の arguments を指定します。複数の選択は、対応するユーザーテキストより前に順番に有効化されます。選択対象は有効かつユーザー呼び出し可能で、インライン有効化に対応する Skill である必要があります。無効、未発見、fork context、workflow の Skill は拒否されます。disable-model-invocation: true が阻止するのはモデル起点の Skill ツール呼び出しだけであり、ユーザーの明示的な選択は阻止しません。 ホスト UI が slash command の意図をすでに解決済みの場合は、client_composed: true を設定します。この場合、先頭が / のテキストは通常の入力として保持され、CLI command として再解釈されません。CLI にテキスト内の slash command を引き続き解釈させる場合は、selected_skills があるという理由だけでこのフィールドを設定しないでください。 空でない selected_skills には、selected_skills_v1 を宣言する CLI が必要です。古い CLI では、選択を黙って破棄する代わりに SDK が UnsupportedCliCapabilityError で入力を拒否します。このメッセージ単位 API は現在 TypeScript SDK 専用です。

現在のセッションで発見された skills の取得

初期化結果には、CLI がこのセッションで発見した完全な skill リストが含まれ、文字列リスト形式の options.skills によるフィルタは受けません。ホスト UI で「発見済み skills」を表示する用途に適しており、メインセッションの現在呼び出し可能なリストとしては使えません。Python では query() は単発ストリームで簡便なクエリ API がないため、QoderSDKClient でハンドシェイク後に読み取ってください。
const q = query({
  prompt: 'Do not execute any task yet',
  options: {
    cwd: '/path/to/project',
    settingSources: ['project'],
    skills: 'all',
  },
});

const init = await q.initializationResult();
console.log(init.skills?.map((skill) => skill.name));
文字列リスト形式の skills はメインセッションのコンテキストとツール可視性を制御しますが、セキュリティ境界ではありません。未指定の skill はモデルの skill 一覧に表示されず、Skill ツールからも呼び出せませんが、そのファイルはディスク上に残り、通常のファイルツールでアクセスされる可能性があります。

実行中の Query で Skills を更新する

TypeScript の Query の実行中に Skill がインストール、削除、または変更された場合は、セッションを再起動せずに接続済み CLI を再スキャンできます。
const { skills } = await q.reloadSkills();
renderSkills(skills);
skills は、表示可能でユーザーが呼び出せる Skills の完全な置換スナップショットです。以前に描画した Skill リストへマージせず、これで置き換えてください。レスポンスには Skill 以外の plugin command は意図的に含まれません。reloadSkills() には CLI capability の reload_skills_v1 が必要で、未対応の CLI では UnsupportedCliCapabilityError で reject されます。これは Skills だけを再スキャンします。ほかの plugin リソースも更新するには q.reloadPlugins() を使ってください。 command カタログは Skills より広い範囲を含みます。command UI を最新に保つには、Query を継続して消費し、system/commands_changed を受け取るたびにローカルの command カタログを丸ごと置き換えます。その後 q.supportedCommands() は同じ最新の完全スナップショットを返します。このイベントは変更元を示さないため、それだけで Skill のインストールを判別することはできません。TypeScript SDK はこのイベントを自動的に協商します。JSONL プロセスを直接統合する場合は、初期化リクエストで supportsCommandsChanged: true を設定し、各モデル結果の後もメッセージの読み取りを続ける必要があります。 Python SDK には現在、同等の実行時更新 API はありません。初期化後の発見リストは get_server_info()['skills'] から取得できます。

カスタム Agent への Skills プリロード

options.agents でカスタムサブ Agent を定義する場合、Agent 定義内で skills を宣言できます。メインセッションが Agent ツールを呼び出すと、サブ Agent は指定された skill を持って実行されます。
const q = query({
  prompt: 'Dispatch a helper agent that uses the sdk-agent-marker skill to return the marker',
  options: {
    cwd: '/path/to/project',
    allowedTools: ['Agent'],
    agents: {
      'sdk-skill-helper': {
        description: 'Invoke when the sdk-agent-marker skill is needed.',
        prompt: 'You are a helper agent that only reads and runs the specified skill.',
        skills: ['sdk-agent-marker'],
        maxTurns: 2,
      },
    },
  },
});
この種の skills はその Agent のコンテキストにのみ影響し、メインセッションで同名 skill を有効化することにはなりません——メインセッションのツール許可リストはこの変更の影響を受けません。

Options クイックリファレンス

フィールド(TypeScript / Python)説明
skills / skillsリストはメインセッションの skill コンテキストと呼び出しを制限。[] で全無効。'all' で発見済みの全 skills を有効化
agents / agentsカスタム Agent。Agent 定義内で独立した skills プリロードリストを宣言可能
allowedTools / allowed_toolsツール許可リスト。skills からコンパイルされた Skill(...) エントリとマージ・重複排除される
settingSources / setting_sourcesCLI がユーザー / プロジェクトディレクトリの skills をスキャンするかを決定(デフォルト空 = サンドボックス)
plugins / pluginsプラグインをロード。プラグイン内の skills が発見集合に入る
settings にはいくつかの skill 関連フィールドもあり、SDK はすべて透過的に渡しますが、実際の効果は CLI バージョンが実装しているかどうかに依存します:
フィールド作用
skillOverridesskill 名ごとに 'on' | 'name-only' | 'user-invocable-only' | 'off' を設定;plugin、user、project などのソースがこの override を尊重
skillListingMaxDescCharsskill listing 内の各説明の文字数上限。SDK はそのまま渡し、デフォルト値は CLI バージョンに依存します
skillListingBudgetFractionskill listing に割り当てるコンテキストウィンドウの比率。SDK はそのまま渡し、デフォルト値は CLI バージョンに依存します

戻り値リファレンス

type SDKControlInitializeResponse = {
  skills?: Array<{ name: string; description?: string; source?: string }>;
  // ...also returns commands / agents / models and similar fields
};
ここでは skill 関連フィールドのみ示します。完全な型は SDK References を参照してください。Python のストリーミング SystemMessage(subtype="init").data["skills"] は skill 名のリストであり、このメタデータ付き発見リストとは別の構造です。

ベストプラクティス

  • skills は必要に応じて有効化:'all' は開発とデバッグ向け。エンドユーザー向けプロダクトでは通常、明示的なリストを渡すべきです。
  • CLI 組み込み skill の動作が欲しければ自前で再現:SDK は simplify / security-review などをセッションに注入しません。必要なら plugin または setting sources の範囲で自前の SKILL.md を提供してください。
  • skills をサンドボックスとして扱わない:セキュリティ境界はツールの許可/拒否リスト、権限コールバック、権限モード、サンドボックスの組み合わせで制御すべきです。
  • UI に適したスナップショットを使う:initializationResult().skills / get_server_info()['skills'] は初期の発見リストであり、メインセッションで現在呼び出せる一覧ではありません。TypeScript では、実行中の Skill UI を q.reloadSkills().skills で置き換え、command UI を commands_changed で更新します。
  • サブ Agent の skills は個別に管理:メインセッションの options.skills とは2つの独立したリストであり、相互に上書きしません。

現在の制限事項

  • --disable-slash-commands は CLI がすべての slash-command skill を一括無効化する機能ですが、SDK は現在ファーストクラスの option を公開していません。非公開の透過経路への依存は推奨しません。
  • settings.skillListingMaxDescChars、settings.skillListingBudgetFraction は SDK が透過的に渡す listing 予算制御フィールドです。現在の qodercli ではまだ listing 予算制御が実装されていないため、渡してもエラーにはなりませんが、挙動も変わりません。
  • 実行時の Skill 更新は現在 TypeScript 専用です。Python SDK には client.supported_skills() の便利メソッドがないため、get_server_info()['skills'] から初期化時の発見リストを読み取ってください。
Skills - Qoder