Qoder Cloud Agents CN API は、共通のエンベロープでエラーを返します。各エラーレスポンスには、プログラムによる処理とデバッグに適した構造化フィールドが含まれています。
エラーエンベロープ
すべてのエラーレスポンスは、次の JSON 構造に従います。
",
"message": "",
"param": ""
}
}{
"type": "error",
"error": {
"type": "
フィールドの説明
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
| string | はい | 常に |
|
| string | はい | エラータイプの識別子 | |
| string | はい | 人間が読める形式のエラー説明 | |
| string | いいえ | エラーの原因となったリクエストパラメーター名 |
エラータイプ
| HTTP ステータス | 説明 | |
|---|---|---|
| 400 | リクエストパラメーターが無効または欠落しています | |
| 401 | 認証に失敗しました。トークンが欠落しているか、無効です | |
| 403 | 認証されていますが、リソースに対して認可されていません | |
| 404 | 対象リソースが存在しません | |
| 409 | リソースの状態の競合 (例:重複作成) | |
| 500 | 内部サーバーエラー |
エラータイプの詳細
400 — invalid_request_error
リクエストのフォーマットまたはパラメーターが無効です。
一般的なトリガー:
- 必須フィールド (例:
name) の欠落 - フィールドタイプの不一致 (文字列が期待される箇所に数値が指定されている場合など)
- ボディが 4 MB の制限を超えている
- 不正な形式の JSON
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "Missing required field: name",
"param": "name"
}
}
# 実行例:name フィールドの欠落
curl -X POST https://api.qoder.com.cn/api/v1/cloud/agents \
-H "Authorization: Bearer $QODER_PAT" \
-H "Content-Type: application/json" \
-d '{}'
401 — authentication_error
認証に失敗しました。
一般的なトリガー:
Authorizationヘッダーの欠落- 不正な形式の PAT
- PAT の有効期限切れまたは失効
- ベアラートークンの代わりに
x-api-keyが使用されている
{
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key or token."
}
}
# 実行例:無効なトークン
curl -s https://api.qoder.com.cn/api/v1/cloud/agents \
-H "Authorization: Bearer pt-invalid-token"
403 — permission_error
認証済みですが、認可されていません。
一般的なトリガー:
- PAT が対象のエージェントにアクセスできない (異なるユーザーまたは組織)
- PAT のスコープにこの操作が含まれていない
- アーカイブされロックされたリソースを操作しようとしている
{
"type": "error",
"error": {
"type": "permission_error",
"message": "You do not have permission to access this agent."
}
}
# 実行例:他のユーザーのエージェントへのアクセス
curl -s https://api.qoder.com.cn/api/v1/cloud/agents/agent_other_user_123 \
-H "Authorization: Bearer $QODER_PAT"
404 — not_found_error
対象リソースが存在しません。
一般的なトリガー:
- エージェント、セッション、または環境の ID が存在しない
- リソースが削除されている
- URL パスのタイプミス
{
"type": "error",
"error": {
"type": "not_found_error",
"message": "Agent not found: agent_nonexistent_123"
}
}
# 実行例:存在しないエージェント
curl -s https://api.qoder.com.cn/api/v1/cloud/agents/agent_nonexistent_123 \
-H "Authorization: Bearer $QODER_PAT"
409 — conflict_error
リソースの状態が競合しているため、操作を実行できません。
一般的なトリガー:
- 同じべき等キーが、異なるリクエストボディで再利用された場合
- 終了したセッションを操作しようとしている
- 一意の名前を持つリソースを重複して作成しようとしている
{
"type": "error",
"error": {
"type": "conflict_error",
"message": "A request with this idempotency key has already been processed with different parameters."
}
}
500 — api_error
内部サーバーエラー。
一般的なトリガー:
- サービスが一時的に利用できない
- 内部コンポーネントの障害
- データベース接続のタイムアウト
{
"type": "error",
"error": {
"type": "api_error",
"message": "An internal error occurred. Please try again later."
}
}
説明 500 エラーについては、エクスポネンシャルバックオフ (例:1 s → 2 s → 4 s) でリトライしてください。
エラー処理のベストプラクティス
- HTTP ステータスコードではなく、
error.typeで分岐してください。 - 診断のために
error.messageをログに記録してください。 error.paramを調べて、問題のあるフィールドを特定してください。- リクエストが変更されない限り、4xx エラーはリトライしないでください。
- 5xx エラーは、エクスポネンシャルバックオフを使用してリトライしてください (最大 3 回まで)。
# エラー処理を含むリクエスト
response=$(curl -s -w "\n%{http_code}" \
https://api.qoder.com.cn/api/v1/cloud/agents \
-H "Authorization: Bearer $QODER_PAT")
http_code=$(echo "$response" | tail -1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" -ge 400 ]; then
error_type=$(echo "$body" | python3 -c "import sys,json; print(json.load(sys.stdin)['error']['type'])")
echo "API error: $error_type"
fi