メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://docs.qoder.com/llms.txt

Use this file to discover all available pages before exploring further.

Functions

query()

SDK のメインエントリ関数です。到着順にメッセージをストリーミングする非同期イテレータを作成します。
async def query(
    *,
    prompt: str | AsyncIterable[dict[str, Any]],
    options: QoderAgentOptions | None = None,
) -> AsyncIterator[Message]:
    ...

Parameters

パラメータ説明
promptstr | AsyncIterable[dict[str, Any]]単一ターンの場合は文字列を渡し、マルチターンの場合は非同期イテラブルを渡します
optionsQoderAgentOptions任意のセッション構成

Return Value

AsyncIterator[Message] を返し、async for で消費します。

QoderSDKClient

クラスベースのマルチターン会話 API です。ターンをまたいでセッション状態を保持したり、モデルやパーミッションモードを動的に切り替えたりするシナリオに適しています。
client = QoderSDKClient(options=options)
await client.connect("Initial prompt.")
メソッド説明
client.query(prompt)新しいターンのユーザー入力を送信
client.receive_response()ResultMessage までメッセージを消費
client.receive_messages()セッション全体のメッセージストリームを受信するバックグラウンド非同期イテレータ
client.connect(prompt) / client.disconnect()接続を手動で管理
client.interrupt()現在の生成またはツール実行を中断
client.set_model(model)実行時にモデルを切り替え
client.set_permission_mode(mode)実行時にパーミッションモードを切り替え
client.stop_task(task_id)バックグラウンドタスクを停止
client.apply_flag_settings(settings)フラグレベルの設定を注入
client.supported_agents()現在利用可能なエージェントを一覧表示
client.get_mcp_status()すべての MCP サーバーのステータスを取得
client.set_mcp_servers(servers)MCP サーバー構成を置き換え
client.reconnect_mcp_server(name)特定の MCP サーバーを再接続
client.toggle_mcp_server(name, enabled)MCP サーバーの有効/無効を切り替え
client.get_available_models()利用可能なモデル一覧を取得

Types

QoderAgentOptions

query() および QoderSDKClient の構成オブジェクトです。Python SDK では snake_case のフィールド名を使用します。
フィールドデフォルト説明
authInternalAuthOptions | dict | NoneNone認証構成
on_auth_expiredCallable | NoneNone認証期限切れ時のコールバック。セッションごとに最大 1 回トリガーされます
toolslist[str] | ToolsPreset | NoneNoneツールセット。文字列配列を渡すと利用可能なツールを制限します。組み込みツール名は 組み込みツール一覧 を参照
allowed_toolslist[str][]ツール許可リスト。記載されたツールは事前に承認されます
disallowed_toolslist[str][]ツール拒否リスト。allowed_toolspermission_mode より優先されます
can_use_toolCanUseToolNoneカスタムツールパーミッションコールバック
permission_modePermissionModeNoneセッションパーミッションモード
allow_dangerously_skip_permissionsboolFalseパーミッションチェックのスキップを許可。permission_mode="bypassPermissions" と併用
permission_prompt_tool_namestr | NoneNoneパーミッションプロンプト用の MCP ツール名。can_use_tool と相互排他
modelstr | NoneNone使用するモデル
fallback_modelstr | NoneNoneメインモデル失敗時のフォールバックモデル
resolve_modelModelPolicyProviderNone動的モデル選択コールバック。渡すと動的コールバックモードに切り替わります。詳細は モデルポリシー を参照
resolve_model_timeout_msint500コールバックタイムアウト(ミリ秒)。resolve_model を渡した場合のみ有効
system_promptstr | SystemPromptPreset | SystemPromptFile | NoneNoneシステムプロンプト
cwdstr | Path | NoneNone作業ディレクトリ
envdict[str, str | None]{}CLI プロセスに渡す環境変数
cli_pathstr | Path | NoneNoneqodercli 実行ファイルへのパス
session_idstr | NoneNoneセッション UUID を指定
resumestr | NoneNone再開するセッション ID
continue_conversationboolFalse直近のセッションを継続
fork_sessionboolFalseresume と併用すると、新しいセッション ID にフォーク
max_turnsint | NoneNone最大会話ターン数
include_partial_messagesboolFalseStreamEvent ストリーミング断片を含める。詳細は ストリーミング出力 を参照
mcp_serversdict[str, McpServerConfig] | str | Path{}MCP サーバー構成。詳細は MCP を参照
allowed_mcp_server_nameslist[str][]利用可能な MCP サーバーを制限
strict_mcp_configboolFalse厳密な MCP 検証
hooksdict[HookEvent, list[HookMatcher]] | NoneNoneライフサイクルフック。詳細は Hooks を参照
agentsdict[str, AgentDefinition] | NoneNoneプログラム的に定義されたサブエージェント。詳細は Agents リファレンス を参照
agentstr | NoneNoneメインスレッドが使用するエージェント名。詳細は Agents リファレンス を参照
settingsstr | Path | Settings | NoneNoneインライン設定オブジェクトまたは設定ファイルパス
setting_sourceslist[SettingSource] | NoneNone読み込むファイルシステム設定
add_dirslist[str | Path][]AI がアクセス可能な追加ディレクトリ
extra_argsdict[str, str | None]{}CLI に渡す追加引数
pluginslist[SdkPluginConfig][]ローカルプラグインを読み込む。詳細は Plugins を参照
skillslist[str] | Literal["all"] | NoneNone有効化するスキル。"all" を渡すとすべて有効化
enable_file_checkpointingbool | NoneNoneファイルチェックポイントを有効化
thinkingThinkingConfig | NoneNoneThinking 構成

Authentication

from qoder_agent_sdk import access_token, access_token_from_env, qodercli_auth
ファクトリ関数説明
access_token(token)PAT を直接渡す
access_token_from_env()デフォルトの環境変数 QODER_PERSONAL_ACCESS_TOKEN から読み取る
access_token_from_env("MY_PAT")指定した環境変数から読み取る
qodercli_auth()ローカルの qodercli login セッションを再利用
便利な使い方については、SDK 認証 を参照してください。

Agents Reference

このページでは、SDK Agents に関する安定した設定項目をまとめます。入門と利用シーンについては サブエージェント利用ガイド を参照してください。

Sources of Available Agents

現在のセッションで利用可能な Agent は、複数のソースから提供される場合があります:
ソース説明
SDK 登録QoderAgentOptions.agents を介して現在のセッションに登録
CLI 組み込みqodercli 起動時に登録される組み込み Agent
ユーザー / プロジェクト設定ユーザーまたはプロジェクトの設定ディレクトリ内の Agent 定義
プラグインロード済みプラグインが提供する Agent
対話型 CLI では /agents を実行して現在検出されている Agent を確認できます。コマンドラインでは qodercli agents list を実行します。Python SDK では QoderSDKClient の接続後、client.supported_agents() を呼び出して現在のセッションで利用可能な Agent のサマリを取得できます。

QoderAgentOptions.agents

型: dict[str, AgentDefinition] | None 現在のセッションで利用可能なカスタム Agent を登録します。dict のキーは Agent 名、値はその Agent の定義です。
Agent ツールが必要: カスタムサブエージェントは、メインセッションが組み込みの Agent ツールを介して委譲する必要があるため、allowed_toolsAgent ツールを含める必要があります。
from qoder_agent_sdk import AgentDefinition, QoderAgentOptions


options = QoderAgentOptions(
    allowed_tools=["Agent"],
    agents={
        "reviewer": AgentDefinition(
            description="Reviews code quality and reports actionable findings.",
            prompt="Review the requested code and report concrete issues.",
            tools=["Read", "Grep", "Glob"],
        ),
    },
)
登録後、モデルは組み込みの Agent ツールを介してこれらのサブエージェントを呼び出せます。メインセッションは作業を委譲するため、ツールセットに Agent を含める必要があります。allowed_tools=["Agent"] は必須の事前認可形式です。tools でメインセッションの利用可能ツールを絞り込む場合も、そこに Agent を含めてください。

QoderAgentOptions.agent

型: str | None メインセッションがどの Agent のアイデンティティとして実行されるかを指定します。値は agents に登録された名前、または現在の CLI が検出した組み込み / プラグイン Agent 名です。
options = QoderAgentOptions(
    agents={
        "planner": AgentDefinition(
            description="Plans work before implementation.",
            prompt="Break work into steps, risks, and validation checks.",
            tools=["Read", "Grep", "Glob"],
        ),
    },
    agent="planner",
)
設定すると、メインセッションはその Agent の promptmodel、ツール制限を使用します。省略した場合は、デフォルトのメインセッション動作が使用されます。

AgentDefinition

カスタム Agent の定義です。Python SDK の AgentDefinition は dataclass で、フィールド名はプロトコルスタイルの camelCase を使用します。以下のフィールドは、SDK で現在カバーされ、検証済みの安定した機能です。
from dataclasses import dataclass
from typing import Any, Literal


@dataclass
class AgentDefinition:
    description: str
    prompt: str
    tools: list[str] | None = None
    disallowedTools: list[str] | None = None
    model: str | None = None
    skills: list[str] | None = None
    mcpServers: list[str | dict[str, Any]] | None = None
    initialPrompt: str | None = None
    maxTurns: int | None = None
    effort: Literal["low", "medium", "high", "max"] | None = None
    permissionMode: PermissionMode | None = None
フィールド必須説明
descriptionstrはいAgent の用途説明。モデルはこれを使って Agent を呼び出すかどうかを判断
promptstrはいAgent のシステムプロンプト
toolslist[str] | Noneいいえこの Agent のツール許可リスト
disallowedToolslist[str] | Noneいいえこの Agent のツールセットから除外するツール
modelstr | Noneいいえモデルのオーバーライド。"inherit" はメインセッションのモデルを継承
mcpServerslist[str | dict[str, Any]] | Noneいいえこの Agent が利用可能な MCP サーバー指定
skillslist[str] | NoneいいえAgent コンテキストにプリロードするスキル名
initialPromptstr | Noneいいえこの Agent をメインセッション Agent として使用する際に自動送信される最初のユーザー入力
maxTurnsint | NoneいいえAgent の最大 API ターン数
effort"low" | "medium" | "high" | "max" | Noneいいえ推論の effort レベル
permissionModePermissionMode | Noneいいえこの Agent 内のツール実行に対する権限モード
Python SDK は dataclasses.asdict() を使って AgentDefinition を initialize リクエストにシリアライズし、qodercli は現在の Agent スキーマに従ってパースします。

description

Agent がどんなタスクに適しているかを記述します。モデルがこの Agent を選択するかどうかに影響します。
description="Runs project tests, analyzes failing output, and suggests fixes."
明確なトリガーシナリオを記述してください。Helpful assistant のような広範な記述は避けてください。

prompt

Agent のシステムプロンプト。役割、制約、出力形式を定義するために使用します。
prompt="""You are a security reviewer.
Check for authentication bypass, authorization bugs, injection risks, and secret leaks.
Return findings sorted by severity."""

tools

Agent のツール許可リスト。設定すると、Agent はリストされたツールのみ使用可能です。
tools=["Read", "Grep", "Glob"]
tools を省略すると、サブエージェントのデフォルトツールセットが使用されます。サブエージェントのツールセットは、メインセッションの allowed_tools の絞り込みを継承しません。

disallowedTools

Agent のツールセットから特定のツールを除外します。
disallowedTools=["Bash", "Write"]
disallowedTools を省略すると、サブエージェントはメインセッションの disallowed_tools の絞り込みを継承しません。最終的なツールセットを明示的に把握している場合を除き、通常は toolsdisallowedTools を併用しないでください。

model

Agent のモデルを指定します。省略するとセッションのデフォルトモデルが使用されます。Python の型レベルでは str | None で、SDK はローカルで特定の文字列を制限しません。一般的なモデル階層は以下のとおりです:
階層説明適用クレジットコスト
"auto"スマートルーティング能力とコストのバランスを取り、最適なモデルをインテリジェントに選択ほとんどの日常的な開発作業。推奨デフォルト約 1.0x
"ultimate"アルティメットエキスパートレベルの深い推論と思考能力複雑なシステム設計と難しい分析約 1.6x
"performance"パフォーマンス高度な推論と高品質な出力コア実装、アーキテクチャ設計、リファクタリング約 1.1x
"efficient"エフィシェントコスト効率の良い標準的な推論基本的なコード生成、ユニットテスト、日常的な Q&A約 0.3x
"lite"ライト基本的な推論、無料で使用可能簡易検証、シンプルなロジック、簡単な質問0x
Agent では 2 つの特殊な形式もサポートしています:
説明
"inherit"メインセッションのモデルを継承。通常 supported_agents() には反映されない
完全なモデル ID現在の CLI / バックエンドがサポートするモデル ID を直接指定

mcpServers

mcpServers: list[str | dict[str, Any]] | None
この Agent が利用可能な MCP サーバーを制限または追加します。各エントリはセッションレベルのサーバー名、またはインラインのサーバー設定マッピングです。 セッションレベルの MCP サーバーを参照:
options = QoderAgentOptions(
    mcp_servers={
        "orders": {
            "command": "python",
            "args": ["servers/orders.py"],
        },
    },
    allowed_tools=["Agent"],
    agents={
        "support": AgentDefinition(
            description="Answers support questions using order tools.",
            prompt="Use order tools when needed and return a concise answer.",
            mcpServers=["orders"],
            tools=["mcp__orders__lookup_order"],
        ),
    },
)
特定の Agent 専用の MCP サーバーを設定:
AgentDefinition(
    description="Searches the internal knowledge base.",
    prompt="Search the knowledge base and cite relevant entries.",
    mcpServers=[
        {
            "kb": {
                "command": "python",
                "args": ["servers/kb.py"],
            },
        },
    ],
    tools=["mcp__kb__search"],
)
特定の MCP ツールのみ公開したい場合は、tools=["mcp__server__tool"] も併せて設定し、サーバーの全ツールを Agent に公開しないようにしてください。

skills

Agent コンテキストにプリロードするスキル名のリスト。プレーンなスキル名とプラグイン修飾名の両方をサポートします。
skills=["review", "sdk-test-plugin:sdk-echo"]
セッションレベルのスキル動作については Skills を参照してください。

initialPrompt

QoderAgentOptions.agent を通じてこの Agent がメインセッション Agent になるとき、最初のユーザー入力として自動送信されます。
initialPrompt="Start by scanning authentication and session management code."
このフィールドはメインセッション Agent でのみ有効です。Agent ツール経由でサブエージェントとして呼び出される場合は無視されます。

maxTurns

Agent の最大 API ターン数を制限します。コスト、実行時間、ループのリスクを制御するために使用します。
maxTurns=6

effort

EffortLevel = Literal["low", "medium", "high", "max"]
Agent の推論 effort レベルを制御します。effort が高いほど、複雑なレビュー、アーキテクチャ分析、リスクの高い変更に通常適していますが、レイテンシとトークン使用量が増加します。

permissionMode

この Agent 内のツール実行に対する権限モードを制御します。セッションレベルの permission_mode と同じ意味を持ちますが、スコープはこの Agent に限定されます。セッションレベルの権限チェーン、allowed_tools / disallowed_tools / can_use_tool の優先順位、例については 権限制御 を参照してください。
PermissionMode = Literal[
    "default",
    "acceptEdits",
    "plan",
    "bypassPermissions",
    "yolo",
    "dontAsk",
    "auto",
]
意味適用
"default"標準的な権限動作。ツール呼び出しは依然としてツールセット、許可 / 拒否ルール、ランタイム承認、または CLI のデフォルトポリシーを通過ほとんどのインタラクティブなサブエージェント
"acceptEdits"ファイル編集操作を自動的に受け入れる。他のセンシティブな操作は引き続き権限フローに従うワークスペースファイルの変更が承認されているサブエージェント
"bypassPermissions"権限チェックをスキップ。高リスクモード。通常は信頼された自動化またはテスト環境のみ制御された CI、一時検証、ワンオフ自動化
"yolo""bypassPermissions" の互換エイリアス。同様に権限チェックをスキップ古い設定との互換性。新規コードでは推奨されない
"plan"プランモード。先にプランを生成するのに適しており、デフォルトでは実際の変更を行わない計画、設計、レビュー、またはサブエージェントがファイルを変更すべきでないケース
"dontAsk"インタラクティブな確認をしない。事前認可されていないか、ルールで許可されていない操作は拒否非インタラクティブ環境、またはプロンプトではなく失敗すべきワークフロー
"auto"ランタイム能力が許可または拒否を自動決定確認による中断を減らしつつ、ランタイム判断を保持
権限のセマンティクスについては 権限制御 を参照してください。

AgentInfo

QoderSDKClient.supported_agents() が返す Agent サマリ。
class AgentInfo(TypedDict):
    name: str
    description: str
    model: NotRequired[str | None]
Python SDK は現在 AgentInfo という名前の TypedDict をエクスポートしていません。supported_agents() の戻り値の型は list[dict[str, Any]] です。上記の構造は、実際に返される dict の安定したフィールド規約です。
フィールド説明
namestrAgent 名
descriptionstrAgent の用途説明
modelstr | NoneAgent のモデルオーバーライド。未設定または model="inherit" の場合は通常空
from qoder_agent_sdk import AgentDefinition, QoderAgentOptions, QoderSDKClient


options = QoderAgentOptions(
    agents={
        "reviewer": AgentDefinition(
            description="Reviews code quality.",
            prompt="Review code and report findings.",
        ),
    },
)

client = QoderSDKClient(options=options)
await client.connect("List agents.")
agents = client.supported_agents()
await client.disconnect()
返されるリストには、agents で登録された Agent や、現在の CLI が検出した組み込み、プロジェクト、ユーザー、プラグインの Agent が含まれる場合があります。実際に利用可能なエントリは qodercli のバージョンと現在の設定に依存します。

Context and Invocation Boundaries

  • サブエージェントは独立したコンテキストを使用し、親セッションの完全な履歴を受け取りません。
  • 親セッションからサブエージェントに渡される主要な情報は、Agent ツールに供給されるタスクプロンプトです。
  • サブエージェントの中間ツール結果は親セッションに直接入りません。親セッションはサブエージェントの最終応答を受け取ります。
  • サブエージェントは自身のサブエージェントを生成できないため、サブエージェントの toolsAgent を含めないでください。
  • initialPromptagent で指定されたメインセッション Agent でのみ有効です。

Model Policy

query() の動的なモデル選択機能。2 つのモード: 固定モデル(resolve_model を渡さず options.model またはバックエンドのデフォルトを使用)と動的コールバック(resolve_model を渡し、すべての LLM 呼び出し前にコールバックがモデルを決定)。概念、トリガー、エラー処理の詳細は Model Policy を参照。

options.resolve_model

型: ModelPolicyProvider 動的コールバックモードのエントリーポイント。一度渡すと動的コールバックモードが有効になり、SDK は LLM リクエストごとにこのコールバックを呼び出してモデルを取得する。コールバックが返した model がそのリクエストの最終モデルであり、自動フォールバックは存在しない

options.resolve_model_timeout_ms

型: int、デフォルト 500 コールバックのタイムアウト(ミリ秒)。タイムアウトすると ModelPolicyTimeoutError がスローされ、クエリは失敗する(フォールバックなし)。resolve_model を渡したときのみ有効。

ModelPolicyProvider

コールバック関数のシグネチャ。同期でも非同期でもよい。
from typing import Awaitable, Callable

ModelPolicyProvider = Callable[
    ["ModelPolicyContext"],
    "ModelPolicyResult | Awaitable[ModelPolicyResult]",
]
トリガーシナリオは QoderModelPurpose によって区別される:
シナリオpurpose備考
メイン会話'main'ターンやツールごとに再呼び出し — セッション中に何度もトリガーされ得る
サブエージェント'subagent'サブエージェントは同じプロバイダを共有
WebFetch ツール'web_fetch'WebFetch がコンテンツを取得した後、要約用に 2 回目の LLM 呼び出しが行われる
ImageGen ツール'image_gen'画像生成モデルの選択に使用
コンテキスト圧縮'compact'圧縮開始前に、圧縮用モデルをコールバックに問い合わせる
BYOK任意modelCustomModel オブジェクトに設定するとサードパーティ LLM へルーティング
挙動上の注意:
  • コールバックは 1 セッション内で何度もトリガーされ得る(各ターン / ツール / サブタスク前に再呼び出し)。
  • コールバックが返した model がそのリクエストの最終モデルであり、SDK は再検証しない。
  • 例外をスローしたり空の model を返した場合、クエリは直ちに失敗する。Model Policy — エラー処理 を参照。

ModelPolicyContext

コールバック呼び出しのたびに渡されるコンテキスト。
class ModelPolicyContext(TypedDict, total=False):
    purpose: str  # QoderModelPurpose
    sessionId: str
    agentId: str
    turnIndex: int
    availableModels: list[ModelInfo]
フィールド必須説明
purposeQoderModelPurposeはいこの LLM 呼び出しの用途
sessionIdstrはい現在のセッション ID。セッション中のコールバック呼び出しで同じ値が渡されるため、キャッシュ / テレメトリのキーとして利用可能
agentIdstrはい呼び出しを開始した Agent の識別子
turnIndexintはい現在のターンインデックス
availableModelsModelInfo[]はいアカウントが現在リアルタイムで利用可能なモデル(CLI が get_model_policy リクエストごとにリストを送る)

QoderModelPurpose

from typing import Literal

QoderModelPurpose = Literal[
    "main",
    "plan",
    "task",
    "compact",
    "title",
    "suggestion",
    "generate",
    "hook_prompt",
    "subagent",
    "web_fetch",
    "image_gen",
    "compression",
    "utility",
]
トリガーシナリオ
'main'メイン会話の LLM 呼び出し
'subagent'サブエージェント呼び出し
'web_fetch'WebFetch ツールがトリガーする 2 回目の LLM 呼び出し
'image_gen'ImageGen ツールがトリガーする画像生成呼び出し
'compact'コンテキスト圧縮 / 要約

ModelPolicyResult

コールバックの戻り値。
class ModelPolicyResult(TypedDict, total=False):
    model: str | CustomModel
    parameters: dict[str, Any]
フィールド必須説明
modelstr | CustomModelはい文字列: モデル識別子。オブジェクト: BYOK 認証情報 + モデル識別子
parametersdict[str, Any]いいえモデルパラメータの上書き(例: temperaturemax_tokens
model の形式:
  • 文字列 — バックエンドがサポートする任意のモデル ID(auto / performance / glm51 など)。有効な値の正確な集合は client.get_available_models() がリアルタイムで返す。空でない こと。さもなくばクエリは失敗する。
  • CustomModel オブジェクト(BYOK) — SDK はオブジェクトの model フィールドをこの呼び出しのモデル識別子として抽出し、残りのフィールドを認証情報として CLI へ転送し、サードパーティ LLM へルーティングする。

CustomModel

BYOK 認証情報。resolve_model コールバック内で model フィールドにこのオブジェクトを直接設定すると、その LLM リクエストはサードパーティプロバイダへルーティングされる。
class CustomModel(TypedDict, total=False):
    provider: str
    model: str
    api_key: str
    url: str
    style: str  # "openai" | "anthropic"
フィールド必須説明
providerstrはいプロバイダキー — BYOKProviderInfo.key と一致する必要がある
modelstrはいモデル識別子 — SDK がこの呼び出しのモデル ID として抽出
api_keystrはいユーザーが提供する API キー
urlstrいいえデフォルトのベース URL を上書き
stylestrいいえ上流プロトコルスタイル。例: "openai" / "anthropic"。デフォルトは "openai"
注意:
  • provider はカタログ内の key と一致する必要がある。さもなくばバックエンド認証が失敗する。
  • api_key が誤っていると認証が失敗し、クエリは直ちに失敗する(動的コールバックモードはフォールバックしない)。
  • BYOK 呼び出しは total_cost_usd をプラットフォーム上で 0 として報告する。トークン使用量はそのまま報告され、プロバイダ側で課金される。

BYOK Catalog Types

client.list_byok_providers() が返すプロバイダ / モデルカタログ。
class SDKControlGetByokConfigResponse(TypedDict, total=False):
    providers: list[BYOKProviderInfo]


class BYOKProviderInfo(TypedDict, total=False):
    key: str
    display_name: str
    api_key_url: str
    url: str
    fields: list[BYOKFieldInfo]
    types: list[BYOKModelTypeInfo]


class BYOKFieldInfo(TypedDict, total=False):
    key: str
    display_name: str
    type: str  # e.g. "free_input"
    mandatory: bool


class BYOKModelTypeInfo(TypedDict, total=False):
    key: str
    display_name: str
    models: list[BYOKModelInfo]


class BYOKModelInfo(TypedDict, total=False):
    key: str
    display_name: str
    is_vl: bool
    is_reasoning: bool
    format: str
    max_input_tokens: int

BYOKProviderInfo

フィールド説明
keystrプロバイダキー — BYOK の CustomModel.provider に設定
display_namestr表示名
api_key_urlstrユーザーが API キーを取得する URL
urlstr推論リクエスト用のベース URL
fieldslist[BYOKFieldInfo]プロバイダがユーザーに入力を要求するフィールド一覧
typeslist[BYOKModelTypeInfo]このプロバイダ配下のモデルグループ

BYOKFieldInfo

フィールド説明
keystrフィールドキー(例: api_key
display_namestrユーザーに表示される名前
typestrフィールドタイプ(例: "free_input"
mandatorybool必須かどうか

BYOKModelTypeInfo

フィールド説明
keystrグループキー。一般的な値: cp / tp / pg(任意)
display_namestrグループ表示名
modelslist[BYOKModelInfo]グループ内のモデル

BYOKModelInfo

フィールド説明
keystrモデル ID — CustomModel.model に設定
display_namestr表示名
is_vlboolビジョン / マルチモーダル入力をサポートするか
is_reasoningbool推論モデルかどうか
formatstr上流プロトコル形式(例: openai
max_input_tokensint最大入力トークン数

ModelInfo

client.get_available_models() が返す利用可能モデルのサマリ。ModelPolicyContext.availableModels の要素型としても使用される。
class ModelInfo(TypedDict, total=False):
    value: str
    displayName: str
    isEnabled: bool
フィールド説明
valuestrモデル識別子。ModelPolicyResult.modelclient.set_model() の引数として使用可能
displayNamestr表示名
isEnabledbool | undefined現在利用可能かどうか。undefined は利用可能として扱われる

ModelPolicyTimeoutError

class ModelPolicyTimeoutError(Exception): ...
resolve_model コールバックが options.resolve_model_timeout_ms 以内に返らなかった場合に SDK がスローする。クエリは直ちに失敗し、フォールバックはない。

client.set_model()

async def set_model(self, model: str | None = None) -> None: ...
固定モデルモードにおいて実行時にモデルを切り替える。次回の LLM 呼び出しから有効。固定モデルモードでのみ有効で、動的コールバックモードで呼び出してもコールバックの結果を上書きしない。有効なモデル ID は ModelInfo.value を参照。

client.get_available_models()

async def get_available_models(self) -> list[ModelInfo]: ...
現在のアカウントが利用可能な最新のモデル一覧をリアルタイムで取得する。常に最新の結果を返し、キャッシュは行わない。一時的に取得できない場合は空配列を返す(例外はスローしない)。動的コールバックモードでは ModelPolicyContext.availableModels が同じ最新リストを既に持つため、明示的にこのメソッドを呼ぶ必要はない。

client.list_byok_providers()

async def list_byok_providers(self) -> list[BYOKProviderInfo] | None: ...
現在のアカウントで利用可能な BYOK プロバイダ / モデルカタログを配列で返す:
  • None を返す: CLI がこの API をサポートしていない(グレースフルフォールバック、例外なし)。
  • 配列を返す(空の可能性あり): 現在のアカウントで利用可能なプロバイダ一覧(空配列はアカウントが BYOK を有効化していないことを意味する)。
フィールドの意味は BYOK カタログ型 を参照。

CanUseTool

ホスト定義のカスタムツール権限承認コールバック。
from collections.abc import Awaitable, Callable
from typing import Any


CanUseTool = Callable[
    [str, dict[str, Any], ToolPermissionContext],
    Awaitable[PermissionResult],
]

ToolPermissionContext

import asyncio
from dataclasses import dataclass, field
from typing import Any


@dataclass
class ToolPermissionContext:
    signal: asyncio.Event | None = None
    suggestions: list[Any] = field(default_factory=list)
    blocked_path: str | None = None
    decision_reason: str | None = None
    decision_reason_type: str | None = None
    classifier_approvable: bool | None = None
    title: str | None = None
    display_name: str | None = None
    description: str | None = None
    tool_use_id: str | None = None
    agent_id: str | None = None
    exit_plan_mode: ExitPlanModeApprovalDetails | None = None
フィールド説明
signalasyncio.Event | Noneキャンセル時にセットされる
suggestionslist[Any]CLI からの権限更新提案
blocked_pathstr | None認可をトリガーするファイルパス(ファイル関連シナリオのみ)
decision_reasonstr | NoneCLI からの人間可読な認可理由
decision_reason_typestr | None権限理由の分類
classifier_approvablebool | None現在の呼び出しがランタイム分類器によって自動承認可能かどうか
title / display_name / descriptionstr | None実行時に生成された人間可読な認可テキスト
tool_use_idstr | Noneこのツール呼び出しの ID
agent_idstr | None呼び出しを開始したサブエージェント ID
exit_plan_modeExitPlanModeApprovalDetails | Noneプランモード終了時の承認詳細
完全な使用方法と例は Permission Control を参照。

PermissionMode

PermissionMode = Literal[
    "default",
    "acceptEdits",
    "bypassPermissions",
    "yolo",
    "plan",
    "dontAsk",
    "auto",
]
意味適用対象
"default"標準的な権限挙動。ツール呼び出しは tools、allow / deny ルール、動的承認、またはランタイムポリシーで処理多くの対話セッション
"acceptEdits"ファイル編集操作を自動承認。その他の機微な操作は通常の権限フローに従うワークスペース変更が承認済みのセッション
"bypassPermissions"権限チェックをスキップ。allow_dangerously_skip_permissions=True も併設する必要あり信頼された自動化やテスト環境
"yolo""bypassPermissions" の互換エイリアス。allow_dangerously_skip_permissions=True も併設する必要あり旧設定との互換用。新規コードでは非推奨
"plan"プランモード。まずプランを生成する用途に適し、デフォルトでは実変更を行わない計画、設計、レビュー
"dontAsk"対話的に問わず、事前認可されないかルールで許可されない操作は拒否非対話環境、またはプロンプトせず失敗させたいワークフロー
"auto"ランタイム能力が許可 / 拒否を自動決定。安全なワークスペースのファイル編集は自動許可される可能性あり確認の中断を減らしつつランタイム判断を残したい場合
権限チェーンの詳細は Permission Control を参照。

PermissionResult

CanUseTool の戻り値。
from dataclasses import dataclass
from typing import Any, Literal


@dataclass
class PermissionResultAllow:
    behavior: Literal["allow"] = "allow"
    updated_input: dict[str, Any] | None = None
    updated_permissions: list[PermissionUpdate | dict[str, Any]] | None = None
    decision_classification: PermissionDecisionClassification | None = None


@dataclass
class PermissionResultDeny:
    behavior: Literal["deny"] = "deny"
    message: str = ""
    interrupt: bool = False
    decision_classification: PermissionDecisionClassification | None = None


PermissionResult = PermissionResultAllow | PermissionResultDeny
allow.updated_input を変更すると、ツールが実際に受け取るパラメータが置き換えられる。deny.interrupt=True は拒否に加えて Agent を中断する。 can_use_tool が受け取る tool_name は完全なツール名。例: "Bash""Read""mcp__orders__lookup_order"

McpServerConfig

MCP サーバー設定。QoderAgentOptions.mcp_servers に渡す。
McpServerConfig = (
    McpStdioServerConfig
    | McpSSEServerConfig
    | McpHttpServerConfig
    | McpSdkServerConfig
)

McpStdioServerConfig

class McpStdioServerConfig(TypedDict):
    type: NotRequired[Literal["stdio"]]
    command: str
    args: NotRequired[list[str]]
    env: NotRequired[dict[str, str]]
    tools: NotRequired[list[McpServerToolPolicy]]

McpSSEServerConfig

class McpSSEServerConfig(TypedDict):
    type: Literal["sse"]
    url: str
    headers: NotRequired[dict[str, str]]
    tools: NotRequired[list[McpServerToolPolicy]]

McpHttpServerConfig

class McpHttpServerConfig(TypedDict):
    type: Literal["http"]
    url: str
    headers: NotRequired[dict[str, str]]
    tools: NotRequired[list[McpServerToolPolicy]]

McpSdkServerConfig

class McpSdkServerConfig(TypedDict):
    type: Literal["sdk"]
    name: str
    instance: McpServer
    tools: NotRequired[list[McpServerToolPolicy]]
create_sdk_mcp_server() ファクトリが返す。MCP - インプロセスサーバー を参照。

McpServerToolPolicy

class McpServerToolPolicy(TypedDict):
    name: str
    permission_policy: Literal["always_allow", "always_ask", "always_deny"]

SdkPluginConfig

ローカルプラグインを読み込む。
class SdkPluginConfig(TypedDict):
    type: Literal["local"]
    path: str
フィールド説明
type"local"現在は local のみサポート
pathstrプラグインディレクトリへの絶対または相対パス

SettingSource

どのファイルシステム設定を読み込むかを制御。
SettingSource = Literal["user", "project", "local"]
意味場所
"user"ユーザーレベルのグローバル設定~/.qoder/settings.json
"project"プロジェクト共有設定(バージョン管理対象).qoder/settings.json
"local"プロジェクトローカル設定(gitignore 対象).qoder/settings.local.json
省略時は CLI のデフォルトに従いすべてのソースが読み込まれる。[] を渡すと完全にスキップされる。

Tools Reference

このページでは、安定したツール関連 API、組み込みツール一覧、および型定義をまとめます。利用パスやシナリオについては ツール利用ガイド を参照してください。
注: Python SDK は現時点で、TypeScript SDK の BashInputFileReadInputToolInputSchemas などの組み込みツール入力 / 出力型コレクションをエクスポートしていません。実装状況は該当セクションで明示しています。

ToolConfig

TypeScript SDK は、一部の組み込みツールの挙動を設定するために options.toolConfig を提供しています:
type ToolConfig = {
  askUserQuestion?: {
    previewFormat?: "markdown" | "html";
  };
};
Python SDK は現時点で、これに相当する QoderAgentOptions.tool_config フィールドをエクスポートしていません。AskUserQuestion は引き続き、toolsallowed_toolsdisallowed_toolscan_use_tool、フックマッチャーで実行時ツール名として利用できます。

Built-in Tool List

toolsallowed_toolsdisallowed_toolscan_use_tool、フックマッチャー、および Agent ツール許可リストでは、組み込みツールは下表の実行時ツール名を使用します。
カテゴリツール名説明Python SDK の状況
コマンド実行Bashシェルコマンドを実行権限 / ツールスコープ設定で利用可能
ファイル操作Readファイル内容を読み取り権限 / ツールスコープ設定で利用可能
ファイル操作Edit文字列マッチでファイルを編集権限 / ツールスコープ設定で利用可能
ファイル操作Writeファイルの作成または上書き権限 / ツールスコープ設定で利用可能
検索Globファイル名パターンで検索権限 / ツールスコープ設定で利用可能
検索Grepコンテンツ正規表現で検索権限 / ツールスコープ設定で利用可能
ネットワークWebFetchURL の内容を取得・処理権限 / ツールスコープ設定で利用可能
ネットワークWebSearchウェブ検索権限 / ツールスコープ設定で利用可能
エージェントAgentサブエージェントを呼び出し権限 / ツールスコープ設定で利用可能
インタラクションAskUserQuestionユーザーへの質問権限 / ツールスコープ設定で利用可能
ノートブックNotebookEditノートブックセルを編集権限 / ツールスコープ設定で利用可能
バックグラウンドタスクTaskOutputバックグラウンドタスクへ出力を送信権限 / ツールスコープ設定で利用可能
バックグラウンドタスクTaskStopバックグラウンドタスクを停止権限 / ツールスコープ設定で利用可能
プラン / ワークツリーExitPlanModeプランモードを終了権限 / ツールスコープ設定で利用可能
プラン / ワークツリーEnterWorktreegit ワークツリーに入る権限 / ツールスコープ設定で利用可能
プラン / ワークツリーExitWorktreeワークツリーを抜ける権限 / ツールスコープ設定で利用可能
設定Config設定の読み書き権限 / ツールスコープ設定で利用可能
TodoTodoWriteTodo 項目を管理権限 / ツールスコープ設定で利用可能
MCP リソースListMcpResourcesMCP リソースを一覧表示権限 / ツールスコープ設定で利用可能
MCP リソースReadMcpResourceMCP リソースを読み取り権限 / ツールスコープ設定で利用可能
MCP 呼び出しMcp汎用 MCP ツール呼び出し権限 / ツールスコープ設定で利用可能
カスタム MCP ツール名は次の形式を使用します:
mcp__{serverName}__{toolName}

tool()

SDK MCP ツール定義を作成します。Python 版はデコレータ形式で、ハンドラは @tool(...) でラップされます。
from collections.abc import Awaitable, Callable
from typing import Any

from mcp.types import ToolAnnotations


def tool(
    name: str,
    description: str,
    input_schema: type | dict[str, Any],
    annotations: ToolAnnotations | None = None,
) -> Callable[[Callable[..., Awaitable[dict[str, Any]]]], SdkMcpTool[Any]]:
    ...
パラメータ必須意味現在の Qoder の挙動
namestrはい現在の MCP サーバー内でのツールの一意な識別子モデルから見えるフルツール名 mcp__{serverName}__{name} を構成。登録時に非空であることが必須
descriptionstrはいモデルに示すツール説明 — いつ使うか、何をするか、何を返すかツール一覧にそのまま渡され、モデルが正しく呼び出せるかに直接影響する。登録時に非空であることが必須
input_schematype | dict[str, Any]はいツールの入力パラメータを定義SDK が MCP 入力スキーマを生成。単純な dict、TypedDict、または完全な JSON Schema dict をサポート
annotationsToolAnnotations | Noneいいえ追加のツールメタデータSDK が annotations を MCP サーバーに登録。権限設定を置き換えるものではない
tool() 自体はツールを定義するのみで、デコレートされた async ハンドラがツール呼び出し時に実行される関数です。namedescription、ツール名の重複などの登録制約は、create_sdk_mcp_server() でツール登録時に検証されます。

input_schema

Python SDK には TypeScript SDK の AnyZodRawShape / InferShape はありません。Python 版の input_schema は次の形式をサポートします:

# Simple dict: all fields required
{"query": str, "limit": int}

# Use Annotated to add a field description
{"query": Annotated[str, "Search keywords"]}

# TypedDict: supports NotRequired
class SearchInput(TypedDict):
    query: str
    limit: NotRequired[int]

# Complete JSON Schema dict
{
    "type": "object",
    "properties": {
        "query": {"type": "string"},
        "source": {"type": "string", "enum": ["docs", "wiki"]},
    },
    "required": ["query"],
}
一般的な Python 型の変換:
Python 形式JSON Schema の意味
str{"type": "string"}
int{"type": "integer"}
float{"type": "number"}
bool{"type": "boolean"}
list[T]array、items 付き
dictobject
Annotated[T, "..."]T のスキーマに description を追加
TypedDictobject; required / NotRequired に基づいて required を生成

TypeScript-only schema helper types

TypeScript 参照型Python SDK の状況Python での同等機能
AnyZodRawShape未実装 / 未エクスポートdict[str, type]TypedDict、または完全な JSON Schema dict を使用
InferShape未実装 / 未エクスポートハンドラは args dict を受け取る。静的型付けが必要なら、ビジネス側で独自の TypedDict を宣言する
ToolExtras未実装 / 未エクスポートPython では、annotations@tool() の第 4 引数として直接渡す

SdkMcpTool

from collections.abc import Awaitable, Callable
from dataclasses import dataclass
from typing import Any, Generic, TypeVar

from mcp.types import ToolAnnotations


T = TypeVar("T")


@dataclass
class SdkMcpTool(Generic[T]):
    name: str
    description: str
    input_schema: type[T] | dict[str, Any]
    handler: Callable[..., Awaitable[dict[str, Any]]]
    annotations: ToolAnnotations | None = None
@tool() デコレータは SdkMcpTool を返します。通常は手動で構築する必要はありません。

ToolInvocationContext

import asyncio
from dataclasses import dataclass, field


@dataclass
class ToolInvocationContext:
    signal: asyncio.Event = field(default_factory=asyncio.Event)
ハンドラは 1 つまたは 2 つのパラメータを取れます:
@tool("watch", "Watch a counter.", {"max": int})
async def watch(args, extra: ToolInvocationContext):
    ...
ハンドラが第 2 の位置引数を受け取る場合、SDK は ToolInvocationContext を渡します。extra.signal は CLI が実行中のツール呼び出しをキャンセルしたときにセットされます。

ToolAnnotations

Python 版は mcp.types.ToolAnnotations を直接使用します。
from mcp.types import ToolAnnotations


ToolAnnotations(
    title="Search docs",
    readOnlyHint=True,
    destructiveHint=False,
    idempotentHint=True,
    openWorldHint=False,
    maxResultSizeChars=500_000,
)
フィールド省略可意味現在の Qoder の挙動
titlestrはいツールの人間可読タイトルMCP メタデータ。現状 Qoder で検証済みの挙動能力ではない
readOnlyHintboolはいツールが状態を変更しないことを示す観測可能な効果としては、読み取り専用ツールは同一バッチ内のツール呼び出しで並列実行の対象になる。権限スイッチではない
destructiveHintboolはいツールが破壊的な更新を行う可能性を示すリスクメタデータ。現状、許可されたツール実行を自動でブロックしない
openWorldHintboolはいツールが外部のオープンワールドと相互作用するかを示す外部対話メタデータ。現状、許可されたツール実行を自動でブロックしない
maxResultSizeCharsintはいツール結果サイズの上限を示すPython SDK は _meta["anthropic/maxResultSizeChars"] に書き込み、CLI が読み取る。これは Python で現在使用されている MCP 型拡張フィールド
これらのフィールドはメタデータとスケジューリングヒントであり、権限スイッチではありません。実行可否は依然として toolsallowed_toolsdisallowed_toolspermission_modecan_use_tool、フックによって決まります。

create_sdk_mcp_server()

SDK と同一プロセス内で動作する MCP サーバーを作成します。
from typing import Any


def create_sdk_mcp_server(
    name: str,
    version: str = "1.0.0",
    tools: list[SdkMcpTool[Any]] | None = None,
) -> McpSdkServerConfig:
    ...
パラメータデフォルト説明
name必須MCP サーバー名。mcp__{serverName}__{toolName} で使われる
version"1.0.0"サーバーのバージョン情報
toolsNoneこのサーバーに登録するツールのリスト

CreateSdkMcpServerOptions

TypeScript SDK は CreateSdkMcpServerOptions というオブジェクトパラメータを使いますが、Python SDK はこの型をエクスポートしておらず、オプションオブジェクトも使いません。Python での同等物は create_sdk_mcp_server(name, version="1.0.0", tools=None) の 3 つの関数パラメータです。

Return Value

QoderAgentOptions.mcp_servers の値として直接利用できる McpSdkServerConfig を返します。
from typing import Literal, TypedDict

from typing_extensions import NotRequired


class McpSdkServerConfig(TypedDict):
    type: Literal["sdk"]
    name: str
    instance: McpServer
    tools: NotRequired[list[McpServerToolPolicy]]

McpServerToolPolicy

class McpServerToolPolicy(TypedDict):
    name: str
    permission_policy: Literal["always_allow", "always_ask", "always_deny"]
tools ポリシーフィールドは Python 型に存在します。主に MCP サーバー設定レイヤでのツール権限ポリシーに使われます。一般的なインプロセス SDK サーバー統合では、依然として allowed_toolsdisallowed_toolspermission_modecan_use_tool、フックを通じて制御します。

CallToolResult

Python SDK は独自の CallToolResult 型をエクスポートしていません。ハンドラは dict を返し、SDK がそれを MCP の CallToolResult に変換します。
from typing import Literal, TypedDict

from typing_extensions import NotRequired


class TextToolContent(TypedDict):
    type: Literal["text"]
    text: str


class ImageToolContent(TypedDict):
    type: Literal["image"]
    data: str
    mimeType: str


class ResourceLinkToolContent(TypedDict):
    type: Literal["resource_link"]
    uri: str
    name: NotRequired[str]
    description: NotRequired[str]
    mimeType: NotRequired[str]


class EmbeddedResourceValue(TypedDict, total=False):
    uri: str
    mimeType: str
    text: str
    blob: str


class EmbeddedResourceToolContent(TypedDict):
    type: Literal["resource"]
    resource: EmbeddedResourceValue


ToolContent = (
    TextToolContent
    | ImageToolContent
    | ResourceLinkToolContent
    | EmbeddedResourceToolContent
)


class ToolHandlerResult(TypedDict):
    content: list[ToolContent]
    is_error: NotRequired[bool]

McpToolResultContent

Python SDK は現在、次のコンテンツブロックを認識します:
種類Python ハンドラ dict現在の Qoder の挙動
テキスト{"type": "text", "text": "..."}TextContent に変換
画像{"type": "image", "data": "...", "mimeType": "image/png"}ImageContent に変換
リソースリンク{"type": "resource_link", "uri": "...", "name": "...", "description": "..."}TextContent にダウングレードし、name / uri / description を連結
埋め込みテキストリソース{"type": "resource", "resource": {"text": "..."}}TextContent に変換
埋め込みバイナリリソース{"type": "resource", "resource": {"blob": "..."}}現状はスキップされ、警告がログ出力される
TS リファレンスとの相違点:
  • Python ハンドラは is_error を使い、MCP / TypeScript の isError というフィールド名ではない。SDK は内部で MCP の isError にマッピングする。
  • Python ハンドラのトップレベル _meta は現状 CallToolResult に渡されない。
  • Python の call_tool 変換ロジックは現状 audio コンテンツブロックを扱わない。MCP の型として AudioContent がインポートされていても、{"type": "audio"} を返すハンドラは未対応コンテンツの警告分岐に入る。

can_use_tool

ツール権限承認コールバックは共通型で定義されており、参照しやすさのためここに再掲します。
from collections.abc import Awaitable, Callable
from dataclasses import dataclass, field
from typing import Any, Literal


@dataclass
class ToolPermissionContext:
    signal: asyncio.Event | None = None
    suggestions: list[Any] = field(default_factory=list)
    blocked_path: str | None = None
    decision_reason: str | None = None
    decision_reason_type: str | None = None
    classifier_approvable: bool | None = None
    title: str | None = None
    display_name: str | None = None
    description: str | None = None
    tool_use_id: str | None = None
    agent_id: str | None = None
    exit_plan_mode: ExitPlanModeApprovalDetails | None = None


CanUseTool = Callable[
    [str, dict[str, Any], ToolPermissionContext],
    Awaitable[PermissionResult],
]

PermissionResult

@dataclass
class PermissionResultAllow:
    behavior: Literal["allow"] = "allow"
    updated_input: dict[str, Any] | None = None
    updated_permissions: list[PermissionUpdate | dict[str, Any]] | None = None
    decision_classification: PermissionDecisionClassification | None = None


@dataclass
class PermissionResultDeny:
    behavior: Literal["deny"] = "deny"
    message: str = ""
    interrupt: bool = False
    decision_classification: PermissionDecisionClassification | None = None


PermissionResult = PermissionResultAllow | PermissionResultDeny
can_use_tool が受け取る tool_name はフルツール名で、例えば BashReadmcp__orders__lookup_order です。

MCP Status Tool Information

Python SDK は McpToolInfoMcpToolAnnotations をエクスポートし、QoderSDKClient.get_mcp_status() が返すサーバー単位のツール情報を表現します。
from typing import TypedDict

from typing_extensions import NotRequired


class McpToolAnnotations(TypedDict, total=False):
    readOnly: bool
    destructive: bool
    openWorld: bool


class McpToolInfo(TypedDict):
    name: str
    description: NotRequired[str]
    annotations: NotRequired[McpToolAnnotations]
注意: ステータス内の annotation フィールド名は CLI が射影した readOnlydestructiveopenWorld であり、ToolAnnotations 入力の readOnlyHintdestructiveHintopenWorldHint ではありません。idempotentHint は現状ステータスのツール一覧にエコーされません。

Built-in Tool Input/Output Types

TypeScript SDK は組み込みツールの入力 / 出力構造を型レベルで提供しています。Python SDK は現状これらの TypedDict をエクスポートしておらず、ToolInputSchemas / ToolOutputSchemas のユニオン型もエクスポートしていません。注意: 下表の型名は TypeScript 参照型名であり、Python の権限設定とツール許可リストでは依然として組み込みツール一覧の実行時ツール名を使用します。
TypeScript 型Python SDK の状況
AgentInput / AgentOutput未エクスポート
BashInput / BashOutput未エクスポート
FileReadInput / FileReadOutput未エクスポート。実行時ツール名は Read のまま
FileEditInput / FileEditOutput未エクスポート。実行時ツール名は Edit のまま
FileWriteInput / FileWriteOutput未エクスポート。実行時ツール名は Write のまま
GlobInput / GlobOutput未エクスポート
GrepInput / GrepOutput未エクスポート
WebFetchInput / WebFetchOutput未エクスポート
WebSearchInput / WebSearchOutput未エクスポート
AskUserQuestionInput / AskUserQuestionOutput未エクスポート
NotebookEditInput / NotebookEditOutput未エクスポート
TaskOutputInput未エクスポート
TaskStopInput / TaskStopOutput未エクスポート
ExitPlanModeInput / ExitPlanModeOutput未エクスポート
ConfigInput / ConfigOutput未エクスポート
EnterWorktreeInput / EnterWorktreeOutput未エクスポート
ExitWorktreeInput / ExitWorktreeOutput未エクスポート
TodoWriteInput / TodoWriteOutput未エクスポート
ListMcpResourcesInput / ListMcpResourcesOutput未エクスポート
ReadMcpResourceInput未エクスポート
McpInput / McpOutput未エクスポート
ToolInputSchemas未エクスポート
ToolOutputSchemas未エクスポート
Python 側で安定して設定可能なものは組み込みツール一覧の実行時ツール名です。Python アプリケーションで組み込みツールパラメータの強い型付けが必要な場合は、ビジネス側で独自の TypedDict または dataclass を定義してください。

Hooks Reference

使い方ガイドと例については Hooks を参照してください。

Event Overview

イベントトリガー制御可能な動作
PreToolUseツール呼び出しの前ブロック / 許可 / 入力の変更
PostToolUseツールが成功した後監査 / コンテキスト注入 / 出力の上書き
PostToolUseFailureツールが失敗した後エラーハンドリング / ロギング
UserPromptSubmitユーザープロンプトが送信される前コンテキスト注入 / ブロック
SessionStartセッション開始時初期化 / コンテキスト注入
SessionEndセッション終了時クリーンアップ / ロギング
StopAI が生成を停止するとき停止をブロックして強制継続
SubagentStartサブエージェントが開始するとき観測 / ログ
SubagentStopサブエージェントが停止するとき観測 / ログ
PreCompactコンテキスト圧縮の前観測 / ログ
PostCompactコンテキスト圧縮の後観測 / ログ
CwdChanged作業ディレクトリ変更時観測 / ログ
InstructionsLoaded指示ファイルがロードされたとき観測 / ログ
FileChangedファイルが作成/変更/削除されたとき観測 / ログ
PermissionRequestパーミッションが要求されたときパーミッション要求の自動許可 / 拒否

HookEvent

登録可能な hook イベントの Union 型。
HookEvent = Literal[
    "PreToolUse",
    "PostToolUse",
    "PostToolUseFailure",
    "UserPromptSubmit",
    "SessionStart",
    "SessionEnd",
    "Stop",
    "SubagentStart",
    "SubagentStop",
    "PreCompact",
    "PostCompact",
    "CwdChanged",
    "InstructionsLoaded",
    "FileChanged",
    "PermissionRequest",
]

HookCallback

HookCallback = Callable[
    [HookInput, str | None, HookCallbackOptions],
    Awaitable[HookJSONOutput],
]

HookMatcher

@dataclass
class HookMatcher:
    hooks: list[HookCallback]
    matcher: str | None = None
    timeout: int | None = None  # seconds, default 60
フィールド説明
hookslist[HookCallback]マッチした際に実行されるコールバックのリスト
matcherstr | None任意の正規表現。tool_name でフィルタリング
timeoutint | None任意のタイムアウト(秒)。デフォルト 60

BaseHookInput

すべての hook イベントで共通の入力フィールド。
@dataclass
class BaseHookInput:
    hook_event_name: str
    session_id: str
    transcript_path: str
    cwd: str
フィールド説明
hook_event_namestrイベントタイプの識別子(例: "PreToolUse")
session_idstr現在のセッションの一意な識別子
transcript_pathstrセッションのトランスクリプトファイル(JSONL 形式)へのパス
cwdstrセッションの現在の作業ディレクトリ

HookJSONOutput

hook コールバックの戻り値の型。
@dataclass
class HookJSONOutput:
    continue_: bool | None = None       # JSON key is "continue"
    stop_reason: str | None = None      # JSON key is "stopReason"
    decision: str | None = None
    reason: str | None = None
    hook_specific_output: dict | None = None  # JSON key is "hookSpecificOutput"
フィールドデフォルト説明
continue_bool | NoneNone(True と等価)False を設定するとセッションを終了する。PreToolUsePostToolUsePostToolUseFailureUserPromptSubmitStopSubagentStop でのみ有効
stop_reasonstr | NoneNoneセッションを停止する理由(人間可読)。continue_=False と組み合わせて使う
decisionstr | NoneNone"approve" または "block""block" はツール実行をブロックする。Stop イベントでは "block" は停止をブロックして強制継続する
reasonstr | NoneNone判断の理由(モデルに表示される。Stop イベントの "block" 判断では、継続プロンプトとしてコンテキストに注入される)
hook_specific_outputdict | NoneNoneイベント固有の出力(各イベント型を参照)
Python SDK では continue_ は JSON キー "continue" に対応します(キーワード衝突回避のため)。 複数の hook が競合する decision を返した場合、"deny" / "block" が優先されます(最も厳しいルールが勝つ)。

PreToolUseHookInput

@dataclass
class PreToolUseHookInput(BaseHookInput):
    hook_event_name: Literal["PreToolUse"]
    permission_mode: str | None
    tool_name: str
    tool_input: Any
フィールド説明
permission_modestr | Noneセッションの現在のパーミッションモード
tool_namestr呼び出されるツールの名前
tool_inputAnyツールに渡されるパラメータ
hook_specific_output (hookSpecificOutput):
フィールド説明
hookEventName"PreToolUse"必ず設定する
permissionDecisionstr"allow" / "deny" / "ask" / "defer"
permissionDecisionReasonstrパーミッション判断の理由
updatedInputdict元の tool_input を置き換える変更済みのツール入力
additionalContextstrモデルの次のターンに注入される追加コンテキスト

PostToolUseHookInput

@dataclass
class PostToolUseHookInput(BaseHookInput):
    hook_event_name: Literal["PostToolUse"]
    tool_name: str
    tool_input: Any
    tool_response: Any
フィールド説明
tool_namestr呼び出されたツールの名前
tool_inputAnyツールに渡されたパラメータ
tool_responseAnyツール実行の結果
出力動作:
フィールド場所動作
hookSpecificOutput.updatedToolOutputイベント固有出力tool_response上書き。モデルには上書き後の値のみが見える
hookSpecificOutput.additionalContextイベント固有出力元の結果を変更せずに補足コンテキストを 追加
decision: "block" + reasonトップレベル出力エージェントがツール結果をさらに処理することを防ぐ
hook_specific_output (hookSpecificOutput):
フィールド説明
hookEventName"PostToolUse"必ず設定する
updatedToolOutputstrツールのレスポンス内容を上書きする
additionalContextstrツール結果と一緒に追加される追加コンテキスト
複数の hook が updatedToolOutput を設定した場合、最後の空でない値 が勝ちます。連鎖的な変換を行う場合は、1 つのコールバック内で順次処理してください。

PostToolUseFailureHookInput

@dataclass
class PostToolUseFailureHookInput(BaseHookInput):
    hook_event_name: Literal["PostToolUseFailure"]
    tool_name: str
    tool_input: Any
    error: str
    is_interrupt: bool | None
フィールド説明
tool_namestr失敗したツールの名前
tool_inputAnyツールに渡されたパラメータ
errorstrエラーメッセージ
is_interruptbool | None中断 / アボートによるものかどうか

UserPromptSubmitHookInput

@dataclass
class UserPromptSubmitHookInput(BaseHookInput):
    hook_event_name: Literal["UserPromptSubmit"]
    prompt: str
フィールド説明
promptstrユーザーが入力したテキスト
hook_specific_output (hookSpecificOutput):
フィールド説明
hookEventName"UserPromptSubmit"必ず設定する
additionalContextstrユーザープロンプトに追加されるコンテキスト

SessionStartHookInput

@dataclass
class SessionStartHookInput(BaseHookInput):
    hook_event_name: Literal["SessionStart"]
    source: str
フィールド説明
sourcestrセッション開始の理由: "startup" / "resume" / "clear" / "compact"
hook_specific_output (hookSpecificOutput):
フィールド説明
hookEventName"SessionStart"必ず設定する
additionalContextstrセッション開始時に注入されるコンテキスト

SessionEndHookInput

@dataclass
class SessionEndHookInput(BaseHookInput):
    hook_event_name: Literal["SessionEnd"]
    reason: str
フィールド説明
reasonstrセッション終了の理由: "clear" / "resume" / "logout" / "prompt_input_exit" / "other" / "bypass_permissions_disabled"

StopHookInput

@dataclass
class StopHookInput(BaseHookInput):
    hook_event_name: Literal["Stop"]
    stop_hook_active: bool
フィールド説明
stop_hook_activebool現在 Stop hook が停止をブロックしているかどうか
{"decision": "block", "reason": "..."} を返すと、AI の停止をブロックして強制継続させます。reason は継続プロンプトとしてモデルのコンテキストに注入されます。

SubagentStartHookInput

@dataclass
class SubagentStartHookInput(BaseHookInput):
    hook_event_name: Literal["SubagentStart"]
    agent_id: str
    agent_type: str
フィールド説明
agent_idstrサブエージェントインスタンスの一意な識別子
agent_typestrサブエージェントの種別 / 役割

SubagentStopHookInput

@dataclass
class SubagentStopHookInput(BaseHookInput):
    hook_event_name: Literal["SubagentStop"]
    stop_hook_active: bool
フィールド説明
stop_hook_activebool現在 Stop hook が停止をブロックしているかどうか

PreCompactHookInput

@dataclass
class PreCompactHookInput(BaseHookInput):
    hook_event_name: Literal["PreCompact"]
    trigger: str
    custom_instructions: str | None
フィールド説明
triggerstrトリガー理由: "manual" / "auto"
custom_instructionsstr | None圧縮サマリーに対するカスタム指示

PostCompactHookInput

@dataclass
class PostCompactHookInput(BaseHookInput):
    hook_event_name: Literal["PostCompact"]
    trigger: str
    compact_summary: str
フィールド説明
triggerstrトリガー理由: "manual" / "auto"
compact_summarystrコンテキスト圧縮後に生成されたサマリー

CwdChangedHookInput

@dataclass
class CwdChangedHookInput(BaseHookInput):
    hook_event_name: Literal["CwdChanged"]
    old_cwd: str
    new_cwd: str
フィールド説明
old_cwdstr変更前の作業ディレクトリ
new_cwdstr変更後の作業ディレクトリ

InstructionsLoadedHookInput

@dataclass
class InstructionsLoadedHookInput(BaseHookInput):
    hook_event_name: Literal["InstructionsLoaded"]
    load_reason: str
フィールド説明
load_reasonstrロード理由: "nested_traversal" / "path_glob_match"

FileChangedHookInput

@dataclass
class FileChangedHookInput(BaseHookInput):
    hook_event_name: Literal["FileChanged"]
    file_path: str
    event: str
フィールド説明
file_pathstr変更されたファイルのパス
eventstrファイルシステムイベント: "change" / "add" / "unlink"

PermissionRequestHookInput

@dataclass
class PermissionRequestHookInput(BaseHookInput):
    hook_event_name: Literal["PermissionRequest"]
    tool_name: str
    tool_input: Any
    permission_suggestions: list | None
フィールド説明
tool_namestrパーミッションを要求しているツール
tool_inputAnyツール入力パラメータ
permission_suggestionslist | None推奨されるパーミッションルール
hook_specific_output (hookSpecificOutput):
フィールド説明
hookEventName"PermissionRequest"必ず設定する
decisiondictパーミッション判断(下記参照)
decision は次のいずれかです:
  • 承認: {"behavior": "allow", "updatedInput": {...}, "updatedPermissions": [...]}
  • 拒否: {"behavior": "deny", "message": "..."}

Message Types

AssistantMessage

AI の完全な応答で、ターンごとに 1 回配信されます。contentTextBlockToolUseBlock のリストです。
@dataclass
class AssistantMessage:
    content: list[TextBlock | ToolUseBlock]
    parent_tool_use_id: str | None = None
    session_id: str | None = None
    uuid: str | None = None

ResultMessage

セッション全体の終了時に送られる最終メッセージです。
@dataclass
class ResultMessage:
    subtype: str  # "success" | "error_max_turns" | "error_during_execution" | ...
    duration_ms: int
    num_turns: int
    session_id: str
    total_cost_usd: float | None = None
    result: str | None = None  # only present when subtype == "success"

SystemMessage

セッションのシステムメッセージです。subtype == "init" の場合、data に初期化情報(session_id、model、tools など)が含まれます。
@dataclass
class SystemMessage:
    subtype: str  # "init" | "compact_boundary" | "status" | "mcp_status_change" | ...
    data: dict[str, Any]

StreamEvent

include_partial_messages=True が必要です。トークン単位でストリーミングされます。
@dataclass
class StreamEvent:
    uuid: str
    session_id: str
    event: dict[str, Any]  # upstream-compatible raw stream event
    parent_tool_use_id: str | None = None
event["type"] の値:
event["type"]説明
message_startメッセージ開始
content_block_startブロック開始(text / tool_use / thinking)
content_block_delta増分: text_delta / input_json_delta / thinking_delta
content_block_stopブロック終了
message_deltaメッセージレベルの状態変化(例: stop_reason)
message_stop完全なターンの終了
詳しい使い方は ストリーミング出力 を参照してください。

Content Blocks

AssistantMessage.content の要素:
@dataclass
class TextBlock:
    text: str


@dataclass
class ToolUseBlock:
    id: str
    name: str
    input: dict[str, Any]