どちらの SDK も、ローカルの qodercli プロセスで Agent を実行します。SDK と qodercli は JSONL でメッセージと制御リクエストを交換し、qodercli がモデルサービスの呼び出しと承認済みツールの実行を担当します。
1 つのローカルランタイムセッションは、1 つの qodercli プロセスが保持します。文字列を渡す
デフォルトのローカルセッションは、次の順序で起動します。
デフォルトのプロセス Transport では、1 行につき 1 つの JSON プロトコルオブジェクトを送ります。SDK が JSON Lines(JSONL)ストリームを読み書きするため、アプリケーションはプロセス出力を直接解析せず、型付き SDK メッセージを使用してください。
プロトコルの通信には 2 つの種類があります。
qodercli は、タスクが完了するか設定された上限に達するまでモデルを繰り返し呼び出します。前の反復で得たツール結果は、次のモデルリクエストのコンテキストになります。
qodercli は、そのセッションで利用できるツールだけをモデルに提示します。
qodercli が実行中の会話状態を保持します。SDK はアプリケーションのコールバックを保持し、プロトコルオブジェクトを TypeScript または Python のメッセージ型へ変換します。
セッションが長くなると、qodercli はモデルのコンテキスト使用量を監視します。必要に応じて次のモデルリクエストの前に古い履歴を圧縮し、アプリケーションがプロンプトを再構築しなくても長いタスクを続けられるようにします。ただし、重要な情報は無制限の会話メモリに頼らず、ファイルまたは明示的なセッション状態へ保存してください。
セッションの永続化を有効にすると、qodercli は Transcript を保存し、後から再開できます。再開と Checkpoint の動作は、セッションストレージと Checkpointを参照してください。
アプリケーションは
SDK と qodercli が同じマシン上にあることは、タスク全体がローカルだけで処理されることを意味しません。
ランタイムプロトコルは共通ですが、各 SDK は言語に適したセッション API を提供します。
アーキテクチャ
query() は通常、最終結果の後にセッションを閉じます。複数ターン API は、アプリケーションが追加入力を送る間、セッションを維持します。
起動とハンドシェイク
デフォルトのローカルセッションは、次の順序で起動します。
- ランタイムを選択する。 qodercli のパスが明示されている場合はそのパスを使用します。それ以外の場合は、パッケージに同梱された互換ランタイムまたは環境内のランタイムを探します。
- SDK モードで起動する。 SDK は構造化ストリーミング入出力を有効にして qodercli を起動します。プロセスには設定された作業ディレクトリと環境が適用されます。
- 認証情報を渡す。 SDK は選択された認証方式を解決し、メッセージストリームへ認証情報を書き込まず、一時的な 1 回限りの認証ペイロードで qodercli へ渡します。
- 機能を初期化する。 最初のタスクを送る前に、SDK と qodercli は
initialize制御リクエストを交換します。この段階で SDK 側の Hooks、Agent、Skills、プロセス内 MCP サーバーを登録し、qodercli はランタイム機能と利用可能なリソースを返します。 - タスクを送信する。 初期化が成功すると、SDK は最初のユーザーメッセージを送信し、qodercli のメッセージをアプリケーションへ返し始めます。
SDK と qodercli の通信
デフォルトのプロセス Transport では、1 行につき 1 つの JSON プロトコルオブジェクトを送ります。SDK が JSON Lines(JSONL)ストリームを読み書きするため、アプリケーションはプロセス出力を直接解析せず、型付き SDK メッセージを使用してください。
- Agent メッセージは、ユーザー入力、Agent の内容、ツールの動作、進捗、最終結果を運びます。
- 制御メッセージは、初期化、中断、セッション操作、権限判断、Hooks、プロセス内 MCP 呼び出しを処理します。
request_idが各レスポンスをリクエストに対応付けるため、複数の処理が進行中でも結果を区別できます。
qodercli の Agent ループ
qodercli は、タスクが完了するか設定された上限に達するまでモデルを繰り返し呼び出します。前の反復で得たツール結果は、次のモデルリクエストのコンテキストになります。
- コンテキストを構築する。 qodercli は、タスク、会話履歴、システム指示、ワークスペース設定、利用可能なツール、関連する Hook コンテキストを組み合わせます。
- モデルへ問い合わせる。 モデル出力はストリームされます。テキストはすぐに表示でき、完成したツールリクエストは実行パイプラインへ送られます。
- 操作を許可する。 qodercli は、ツールの利用可否、許可・確認・拒否ルール、権限コールバック、ツール実行前 Hooks を適用します。拒否されたツールは実行されず、理由を示すツール結果が生成されます。
- ツールを実行する。 承認された組み込みツール、MCP ツール、サブ Agent をランタイムが実行し、結果を収集します。安全な場合、互いに独立したツール呼び出しは並行して実行できます。
- 得られた情報を使って続行する。 ツール結果を会話へ追加し、モデルは次の反復で結果を確認して次の操作を決めます。
- 完了または停止する。 ツール呼び出しがなくなり、完了 Hook が結果を受け入れると終了します。設定された制限、中断、キャンセル、エラーでも停止します。
ツール、MCP、サブ Agent
qodercli は、そのセッションで利用できるツールだけをモデルに提示します。
- 組み込みツールは、ファイルの読み取りと編集、プロジェクトの検索、コマンドの実行などのローカル操作を行います。
- MCP ツールは、外部 MCP サーバーまたは SDK アプリケーション内で動く MCP サーバーから提供できます。プロセス内サーバーの場合、qodercli は MCP 制御リクエストを SDK へ送り、SDK が登録済みサーバーを呼び出し、同じ制御チャネルでレスポンスを返します。
- サブ Agentは、独自のプロンプトとコンテキストで委任されたタスクを実行し、通常はより限定されたツールセットを使用します。最終出力はツール結果として親 Agent へ返ります。
コンテキストとセッション状態
qodercli が実行中の会話状態を保持します。SDK はアプリケーションのコールバックを保持し、プロトコルオブジェクトを TypeScript または Python のメッセージ型へ変換します。
セッションが長くなると、qodercli はモデルのコンテキスト使用量を監視します。必要に応じて次のモデルリクエストの前に古い履歴を圧縮し、アプリケーションがプロンプトを再構築しなくても長いタスクを続けられるようにします。ただし、重要な情報は無制限の会話メモリに頼らず、ファイルまたは明示的なセッション状態へ保存してください。
セッションの永続化を有効にすると、qodercli は Transcript を保存し、後から再開できます。再開と Checkpoint の動作は、セッションストレージと Checkpointを参照してください。
完了、エラー、キャンセル
アプリケーションは result を受信するか、イテレーターでエラーが発生するまで、メッセージを処理し続けてください。
- Agent ターンの成功または失敗は、最後の
resultメッセージにまとめられます。利用可能なステータスと使用量情報も含まれます。 interruptは、qodercli に実行中のターンの停止を要求します。サポートされる長時間セッションでは、停止後もセッションを利用できます。- SDK ストリームを閉じるか中止すると、Transport も閉じられます。プロセス Transport は最初に正常終了を試み、qodercli が終了しない場合は終了方法を段階的に強めます。
- プロセスの起動失敗、無効なプロトコルメッセージ、ランタイムの切断、初期化タイムアウトは、Agent の結果ではなく SDK エラーとして通知されます。
セキュリティとデータフロー
SDK と qodercli が同じマシン上にあることは、タスク全体がローカルだけで処理されることを意味しません。
- 認証情報は JSONL メッセージストリームとは別に、一時ペイロードで qodercli へ渡され、SDK によって削除されます。
- qodercli は推論に必要なタスクコンテキストをモデルサービスへ送ります。これにはプロンプト、ファイルの抜粋、ツール結果が含まれる場合があります。
- ツールは qodercli の環境で実行され、設定に応じて他のシステムの読み取り、書き込み、呼び出しを行う場合があります。
cwd、ツールの許可リスト、権限ルール、Hooks、サンドボックス、インフラストラクチャ分離は相互に補完する制御です。タスクの影響に合わせて設定してください。
TypeScript と Python のセッション API
ランタイムプロトコルは共通ですが、各 SDK は言語に適したセッション API を提供します。
| シナリオ | TypeScript | Python |
|---|---|---|
| 1 つのプロンプトと結果 | query({ prompt: string, ... }) | query(prompt=..., options=...) |
| 複数のユーザーメッセージ | 非同期メッセージイテラブルを query() へ渡す | QoderSDKClient に接続し、query() を再度呼ぶ |
| 出力の読み取り | 判別可能なメッセージ Union を for await で処理 | 型付きメッセージオブジェクトを async for で処理 |
| ランタイム制御 | 返された query ストリームのメソッド | QoderSDKClient のメソッド |
次のステップ
- クイックスタート — 最初の TypeScript または Python タスクの実行
- ストリーミング出力 — 完全なメッセージと増分イベントの処理
- 権限 — 承認とツールポリシーの設計
- ツール — Agent へのカスタムツールの提供
- SDK References — 各言語の正確な API の確認