query() はデフォルトでローカルに bundled qodercli を起動します。cloud agent オプション(TypeScript の options.experimentalCloudAgent、Python の options.experimental_cloud_agent)を渡すと、SDK は Qoder Cloud Agent runtime に切り替わります——agent と session は Qoder Cloud コンテナで動き、ローカルはリクエスト送信と SSE イベントストリームの消費だけを担います。
ステータス:experimental / unstable。API 形状はマイナーバージョン間で変化する可能性があります。安定化されていないフィールドを本番のコードパスで依存しないでください。
使うべきタイミング
- qodercli、バンドル済みバイナリ、ローカルランタイムを管理したくない
- 同じ agent インスタンスをマシン間で長期間再利用したい(agent は Cloud に永続化される)
- session のコンテキストを Cloud に置いて、複数のプロセス / ホストから再開したい
settings / hooks / plugins / ローカル permissions / checkpoint など——は Cloud runtime ではサポートされず、渡すと同期的にエラーになります。
前提条件
- Personal Access Token (PAT):qoder.com/account/integrations で生成します。詳細は SDK 認証。Cloud runtime は access token 認証(
accessToken()/accessTokenFromEnv()、Python はaccess_token()/access_token_from_env())のみを受け付け、ローカルログイン状態や job token を渡すと同期的にエラーになります。 - Cloud
environment_id:session 作成時に必須。Qoder コンソールまたは管理 API から取得します。
初回呼び出し:agent 作成 + session 作成
最も一般的なエントリパス — 新しい Cloud Agent を作成し、すぐにその session を開いて prompt を実行します:
session_id を取得します——以降のターンはそれでこの 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 によるマルチターン会話(Python)
Python の QoderSDKClient はより高レベルの Cloud session 管理を提供します——connect() が Cloud session を作成/解決し、以降の query() がターンごとに再利用します。session_id の手動追跡は不要です:
注意:Cloud ランタイムはclient.set_model()、client.reload_plugins()、MCP OAuth などのローカル CLI 制御メソッドをサポートしません。呼び出すとValueErrorが投げられます。
SSE イベントの消費
Cloud runtime は SSE で session のイベントストリームを送り返します。SDK は各イベントを cloud agent イベントメッセージ(TypeScript は cloud_agent_event、Python は CloudAgentEventMessage)にラップします:
| フィールド | 説明 |
|---|---|
event | Cloud イベント名(例:user.message、agent.message、session.status_idle) |
id | SSE ストリーム内のイベント ID。replay の起点として使える |
data | Cloud イベント payload(turn_id などのフィールドを含む) |
uuid(Python) | SDK 内部生成の一意 ID。重複排除に使用 |
session_id | このイベントが属する Cloud session ID |
履歴イベントの replay 隔離
既存 session を再利用すると、SSE はまず過去ターンのイベントをリプレイします——SDK は turn_id で分離します:現在のターンの session.status_idle だけが result 終端をトリガーし、過去のイベントで query が早期終了することはありません。
SSE チューニング
互換性:Python ではafterId/deltaFlushIntervalMs(camelCase)も受け付けられ、ランタイムが自動認識します。
異常終了
現在のターンが終端に達する前に SSE が切断された場合、SDK はエラー result(subtype != 'success'、is_error: true)を合成し、上位層で統一的に処理できるようにします。
終端状態:result の内容
| フィールド | 説明 |
|---|---|
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が排他です(TypeScript は union 型で強制)。- 既存
session.idを渡すとき、agentは渡してはなりません。 session.createにはenvironment_idを明示的に渡す必要があります。- Cloud runtime はローカル CLI のトップレベル option をサポートしません:
model、agent、MCP servers、settings、hooks、plugins、権限モードなどを渡すと同期的にエラーになります。 - Cloud runtime はモデル切り替え、プラグインリロード、MCP OAuth などのランタイム制御メソッドをサポートしません。許されるのはメッセージの反復消費とセッションのクローズ(TypeScript の
q.close()、Python のclient.disconnect())だけです。
エラーコード
| TypeScript code / Python 例外クラス | トリガー条件 |
|---|---|
cloud_agent_auth_requires_access_token / CloudAgentUnsupportedAuthError | ローカルログイン状態 / job token などの非 PAT 認証を使用 |
cloud_agent_api_error / CloudAgentApiError | Cloud OpenAPI が非 2xx を返す、または SSE チャンネル異常 |
関連ドキュメント
- SDK 認証 — PAT の取得と環境変数
- 入力モード — ローカル SDK の単一メッセージ入力とストリーミング入力
- API References — cloud agent オプションとイベントメッセージの完全なフィールド