query() はデフォルトでバンドル済みの qodercli をローカルで起動します。options.experimental_cloud_agent を渡すと SDK は Qoder Cloud Agent ランタイムに切り替わります — agent と session は Qoder Cloud のコンテナ内で実行され、ローカルプロセスはリクエスト送信と SSE イベントストリームの消費だけを担当します。
ステータス:experimental / unstable。API 形状はマイナーバージョン間で変化する可能性があります。安定化されていないフィールドを本番のコードパスで依存しないでください。
使うべきタイミング
- qodercli、バンドル済みバイナリ、ローカルランタイムを管理したくない
- 同じ agent インスタンスをマシン間で長期間再利用したい(agent は Cloud に永続化される)
- session のコンテキストを Cloud に置いて、複数のプロセス / ホストから再開したい
mcp_servers / settings / hooks / plugins / ローカル permissions / checkpoint — は Cloud ランタイムではサポートされません。これらを渡すと同期的にエラーが投げられます。
前提条件
- Personal Access Token (PAT):qoder.com/account/integrations で生成。詳細は SDK 認証 を参照。Cloud ランタイムは
access_token()/access_token_from_env()のみを受け付けます。qodercli_auth()/job_token()を渡すと同期的にエラーになります。 - Cloud
environment_id:session 作成時に必須。Qoder コンソールまたは管理 API から取得します。
初回呼び出し:agent 作成 + session 作成
最も一般的なエントリパス — 新しい Cloud Agent を作成し、すぐにその session を開いて prompt を実行します:ResultMessage から session_id を取得します — 後続のターンでこれを使って同じ session を再開します(マルチターン:session の再開 を参照)。
ビルトインツールの許可リスト
tools[].enabled_tools で現在サポートされているもの:bash、write、glob、web_fetch、read、edit、grep、web_search。tools を省略すると agent はツールを持ちません。
session へのファイルマウント
Files API でアップロードしたファイルをsession.create.resources で session コンテナにマウントできます:
既存 agent の再利用
すでにagent.id がある場合(コンソール経由または前回の呼び出しで取得)、agent: {"id": ...} を渡し create は省略します:
マルチターン:session の再開
初回ターンからsession_id を得たら、次の呼び出しは**session: {"id": ...} のみ**を渡します — agent は含めないでください。session は既に agent を束縛しており、両方を渡すと同期的にエラーになります。
session_id さえあれば再開できます。
QoderSDKClient でのマルチターン会話
QoderSDKClient はより高レベルの Cloud session 管理を提供します — connect() で Cloud session を作成/解決し、後続の query() はターンごとに再利用します。session_id を手動で追跡する必要はありません:
注意:Cloud ランタイムはclient.set_model()、client.reload_plugins()、MCP OAuth などのローカル CLI 制御メソッドをサポートしません。呼び出すとValueErrorが投げられます。
SSE イベントの消費
Cloud ランタイムは SSE 経由で session のイベントストリームをプッシュバックします。SDK は各イベントをCloudAgentEventMessage メッセージとしてラップします:
CloudAgentEventMessage フィールド):
| フィールド | 説明 |
|---|---|
event | Cloud イベント名(例:user.message、agent.message、session.status_idle) |
id | SSE ストリーム内のイベント ID。replay の起点として使える |
data | Cloud イベント payload(turn_id などのフィールドを含む) |
uuid | SDK が内部生成する一意 ID。重複排除に使用 |
session_id | このイベントが属する Cloud session ID |
履歴イベントの replay 隔離
既存 session を再開する際、SSE はまず履歴ターンのイベントを replay します。SDK はturn_id で隔離します — 現在のターンの session.status_idle のみが ResultMessage 終端をトリガーし、履歴イベントが query を早期終了させることはありません。
SSE チューニング
互換性:afterId/deltaFlushIntervalMs(camelCase)もランタイムで受け付けられます。
異常終了
現在ターンが終端イベントに達する前に SSE が切断された場合、SDK はエラーResultMessage を合成します(subtype != 'success'、is_error=True)。呼び出し側は統一的に処理できます。
ResultMessage 終端
| フィールド | 説明 |
|---|---|
subtype | "success" または各種エラー subtype |
is_error | boolean。異常終了かどうか |
session_id | Cloud session ID(create 分岐時は SDK が回填) |
result | このターンの agent テキスト返答(複数 text block は連結される) |
usage / model_usage / total_cost_usd | 現在ターンの span.model_request_end.usage から回填 |
制約サマリ
agentとsessionのid/createはそれぞれ相互排他。- 既存
session["id"]を渡すとき、agentは渡してはなりません。 session["create"]にはenvironment_idを明示的に渡す必要があります。- Cloud ランタイムはローカル CLI 専用のトップレベル option を拒否します:
model、agent、mcp_servers、settings、hooks、plugins、permission_modeなど。渡すと同期的にエラーが投げられます。 - Cloud ランタイムは
QoderSDKClient.set_model()、reload_plugins()、MCP OAuth などをサポートしません。async for消費とclose()のみが保証されます。
エラーコード
| 例外クラス | 発生条件 |
|---|---|
CloudAgentUnsupportedAuthError | 非 PAT 認証(qodercli_auth() / job_token() など)が使用された |
CloudAgentApiError | Cloud OpenAPI が non-2xx を返したか、SSE チャネルが異常終了した |
関連ドキュメント
- SDK 認証 — PAT の取得と環境変数
- マルチターン会話 — ローカルランタイム下のマルチターン
- SDK References —
QoderAgentOptions.experimental_cloud_agentとCloudAgentEventMessageの完全フィールド