Qoder Cloud Agents Go SDK のインストールと使用方法。認証、リクエスト型、ストリーミングレスポンス、ページネーション、リトライ、タイムアウトを説明します。
Qoder Cloud Agents Go SDK は型付きの Forward と Managed クライアントを提供し、
Go 1.23 以降が必要です。既存の Go Modules プロジェクトにインストールします:
個人アクセストークン(PAT)を環境変数に保存します:
Forward クライアントでテンプレートと ID を作成し、セッションを開始してメッセージを送信します:
Managed クライアントで Agent と環境を作成し、セッションを開始してメッセージを送信します。次のコードを
以降の Go コード断片は
明示的に渡した設定は環境変数より優先されます。デフォルトの PAT モードは
2 つのクライアントは同じ認証情報インスタンスとトークンキャッシュを共有します。中国サイトでは
必須フィールドは通常 Go の値を直接使用し、省略可能なスカラーは
次の関数はパラメーターのエンコードのみを示し、リクエストは送信しません:
フィールドが
リクエストのユニオン型は
単一ストリームは EOF で終了します。回復可能な切断後も購読するには、明示的に
再開可能ストリームは最後に配信されたイベントの SSE カーソルで再接続し、業務リクエストを再送しません。継続実行する場合があるため、
HTTP エラーは
エラーは
デフォルトのリトライは最大 2 回、合計で最大 3 回の試行です。本文を再読み取りでき、呼び出し元の
SDK はこれらの安全ルール内でサーバーのリトライ指示と待機時間も処理します。一部 API にはより厳しい制限があります。
デフォルト Transport のレスポンスヘッダー待機タイムアウトは 10 分です。本文読み取りは対象外で、呼び出し全体の総期限でもありません。
例では全体で最大 1 分、各試行で最大 15 秒待機し、先に到達した期限が適用されます。
自動ページネーションは必要に応じて後続ページを読み取ります:
ページ単位の処理には
ページネーターはクエリ条件とリクエスト設定を保持します。API によりカーソル形式が異なる場合があるため、返されたページが提供するページ送りメソッドを優先してください。
本文はすでに SDK が読み取った可能性があります。レスポンス JSON には解析結果の
各リクエスト試行の観測には
context によるリクエスト制御、ストリーミングレスポンスの逐次読み取り、認証・リトライ・HTTP 転送の設定に対応します。
インストール
Go 1.23 以降が必要です。既存の Go Modules プロジェクトにインストールします:
go.mod と go.sum をバージョン管理に含め、アプリケーションが使用する SDK バージョンを固定してください。
基本的な使い方
個人アクセストークン(PAT)を環境変数に保存します:
main.go に保存し、SDK をインストールしたプロジェクトで go run main.go を実行します:
package と import を省略しています。標準ライブラリ以外の convention、option、param は、それぞれモジュール内の convention、convention/option、convention/param パッケージです。例の client は設定済みの Forward クライアントです。リソース ID は現在の認証情報でアクセスできる実際の ID に置き換えてください。
詳細は Managed クイックスタートと Forward API リファレンスを参照してください。
クライアント設定
option パッケージでコンストラクターまたは個々の呼び出しに設定を渡します。同じ設定は通常、呼び出し単位の値がクライアントのデフォルトを上書きします。追加ヘッダーやミドルウェアなど累積可能なオプションは各ルールに従って結合されます。
| 設定 | Forward | Managed |
|---|---|---|
| コンストラクター | forward.NewClient | managed.NewClient |
| Base URL 環境変数 | QODER_FORWARD_BASE_URL | QODER_BASE_URL |
| Global のデフォルト URL | https://api.qoder.com/api/v1/forward | https://api.qoder.com/api/v1/cloud |
| CN の URL | https://api.qoder.com.cn/api/v1/forward | https://api.qoder.com.cn/api/v1/cloud |
QODER_ACCESS_TOKEN、次に QODER_PAT を読み取ります。クライアントは .env ファイルを自動読み込みしません。
Base URL には完全な API プレフィックスを含め、アカウント、認証情報、リソースのリージョンと一致させてください。複数 goroutine で再利用する前に設定を完了し、共有後は Options を並行変更しないでください。
認証
PAT
option.WithPAT(token) で個人アクセストークンを明示的に設定します。トークンはアプリケーションのサーバー環境に保存してください。
Service Account
QODER_SA_KEY の設定後、認証情報コンポーネントを明示的に作成します。SAT(サービスアカウントトークン)を交換・キャッシュし、後続リクエストで必要になった際に更新します:
Region: "cn" と CN Base URL の両方を使用します。Managed のみを利用する場合は qca.access scope を要求できます。権限と Managed ワークスペースの紐付けはサーバー側で設定します。
環境に QODER_SA_KEY が存在するだけでは、通常のクライアントは認証情報交換を自動的に有効にしません。SA Key は SAT の取得専用で、業務 API のアクセストークンとして直接使用できません。SA 認証が失敗しても PAT にフォールバックしません。
アプリケーションが SAT を管理する場合は option.WithAuthMode("sa") と option.WithAuthToken(token) を使用します。静的 SAT の更新はアプリケーションが行います。クライアントごとに明確な認証情報ソースを 1 つ選び、ネイティブ SA 認証情報と静的トークンの併用を避けてください。詳細は認証ドキュメントを参照してください。
リクエストとレスポンスの型
省略可能フィールド
必須フィールドは通常 Go の値を直接使用し、省略可能なスカラーは param.Opt[T] を使用します。未設定とゼロ値の明示的送信は意味が異なります:
| 記述 | JSON の動作 |
|---|---|
未設定の param.Opt[T] | フィールドを送信しない |
forward.String("") | 空文字列を送信 |
forward.Bool(false) | false を送信 |
forward.Int(0) | 0 を送信 |
param.Null[string]() | null を送信 |
omitzero 付きの nil map または slice | フィールドを送信しない |
| nil ではない空の map または slice | {} または [] を送信 |
null を受け付けるか、サーバーがその値をどう処理するかは対応する API 定義に従います。Managed も managed.String、Bool、Int など同様のヘルパーを提供します。
ユニオン型とレスポンスフィールド
リクエストのユニオン型は Of... フィールドで表現を 1 つ選び、1 つの分岐だけを設定します。レスポンスのユニオン型は、その型が提供する As... または AsAny() で具体的な分岐を読み取ります。個々のメソッドは API Reference を参照してください。
レスポンス構造の JSON メタデータで、欠落フィールド、明示的な null、通常の値を区別できます。Go のゼロ値だけでフィールドの存在を判断しないでください。元の JSON にはレスポンスモデルの RawJSON() を使用します。未モデル化フィールドはレスポンスの追加フィールド情報に保持されます。
ストリーミングレスポンス
StreamEvents で単一の SSE 接続を確立し、順にイベントを読み、終了後に Err() を確認します:
NewResumableStream を使用します:
context で購読期限を設定するか明示的にキャンセルしてください。HTTP リトライ回数は個々の接続リクエストを制御し、購読全体の再接続回数上限ではありません。
カーソルがなければ現在のイベントストリーム末尾から開始します。履歴を読むには有効な過去の再開位置を先に取得してください。自動再接続は「厳密に 1 回」の処理を保証しません。同じイベントの複数差分が同一 ID を共有する場合があるため、ID だけですべての重複フレームを破棄しないでください。イベントの意味とタスク完了条件は対応する API 定義を参照してください。
ストリームを閉じる、またはローカルの context をキャンセルしても、停止するのは現在の購読のみです。クラウドで開始済みの実行は自動停止しません。
エラー処理と Request ID
HTTP エラーは *convention.Error を使用します。ネットワーク、エンコード、デコード、コンテキストのエラーは個別に処理します:
Message、Type()、Request、Response、RawJSON() も提供します。問題調査用にステータスコード、エラーコード、Request ID を保持し、アクセストークンを含むリクエスト全体をログに出力しないでください。
リトライと冪等性
デフォルトのリトライは最大 2 回、合計で最大 3 回の試行です。本文を再読み取りでき、呼び出し元の context が有効である必要があります。
| リクエスト | デフォルトでリトライする条件 |
|---|---|
| GET、HEAD、または冪等キー付きリクエスト | 接続エラー、408、429、5xx |
| 冪等キーのないその他のリクエスト | 429 |
| 409 レスポンス | 自動リトライしない |
option.WithMaxRetries(0) で無効化するか、呼び出し単位で回数を上書きします。
冪等キーはアプリケーションが生成・保存し、リクエストパラメーターの IdempotencyKey または option.WithHeader("Idempotency-Key", key) で渡します。同じ論理操作の全リトライで同じキーを再利用し、新しい操作には新しいキーを使用します。
タイムアウトとキャンセル
デフォルト Transport のレスポンスヘッダー待機タイムアウトは 10 分です。本文読み取りは対象外で、呼び出し全体の総期限でもありません。
context で呼び出し全体を、WithRequestTimeout で各試行を制御します:
WithRequestTimeout は本文読み取りも対象とするため、長時間 SSE 購読では購読に適した期限を設定してください。
ページネーション
自動ページネーションは必要に応じて後続ページを読み取ります:
List と GetNextPage() を使用します。次のページがない場合は nil を返します:
詳細設定
元のレスポンス
WithResponseInto でステータスコードとレスポンスヘッダーを読み取ります:
RawJSON() を、デコード先を指定する場合は WithResponseBodyInto を使用します。
HTTP クライアントとリクエスト拡張
WithHTTPClient で接続プール、プロキシ、カスタム Transport を設定できます。カスタムクライアントを渡した場合、そのタイムアウトと接続プール設定はアプリケーションが管理します。
WithMiddleware を使用します。カスタム Header、Query、JSON フィールドには WithHeader、WithQuery、WithJSONSet を使用します。パラメーター構造の SetExtraFields はサーバーが対応済みで SDK が未モデル化のフィールドを渡すためのものです。認証やルーティング設定を意図せず置き換えないよう、明示的に変更が必要なフィールドだけを上書きしてください。