Nodaro ドキュメント
ドキュメントノードリファレンスモデルAI エージェント(MCP)開発者向けセルフホスティングリサーチ
REST API

エラー

Nodaro API のエラーは、HTTP ステータスと変更されないコードを 1 つのエンベロープで返します。各コードの意味、再試行すべきエラー、失敗したジョブが理由を伝える方法を説明します。

Nodaro API のエラーは、どれも HTTP ステータスと、変更されない code を含む 1 つの JSON エンベロープを返します。そのため、クライアントはメッセージを解析せずに、コードで処理を分岐できます。失敗には 2 種類あります。呼び出し自体が拒否されて何も開始されないリクエストエラーと、開始した生成が後から失敗し、その理由をジョブで報告するジョブの失敗です。

エラーエンベロープ

{ "error": { "code": "rate_limited", "message": "Too many requests. Max 30 per minute." } }
  • code は、変更されない識別子(スラッグ)です。処理の分岐には、この値を使います。
  • message は、人が読むためのテキストです。変わることがあるので、この値で照合しないでください。
  • エラーによっては、フィールドが追加されます。追加されるフィールドは、以下の各コードに記載しています。ほとんどは error の中に入りますが、already_running では executionId が error と同じ階層に置かれます。また、実行前の利用枠のチェックに失敗した場合は、required と remaining がトップレベルに入ります。

唯一の例外は OAuth のトークンエンドポイントで、OAuth の形式で応答します。たとえば { "error": "invalid_grant", "error_description": "…" } のような形式です。OAuth アプリを参照してください。

再試行すべきエラー

ステータス対処
5xx通常は一時的なエラーです。指数バックオフで再試行します。
429待ってから、バックオフしながら再試行します。たとえば、5 秒、10 秒、20 秒と待つ時間を延ばします。Retry-After ヘッダーがある場合は、その値に従ってください。
402クレジットを追加するか、ワークスペースの管理者に予算を依頼してから、再試行します。
その他の 4xxまずリクエストを修正します。同じリクエストは、再び失敗します。

次の 3 つのサーバーエラーには、注意が必要です。

  • 503 price_not_configured は、再試行しても成功しません。このデプロイ環境の運用者が料金を設定するまで、そのモデルには料金がないためです。
  • 非同期の構造化出力 LLM ルートでの 503 provider_unavailable は、言語モデルの呼び出しを nodaro.ai に送るセルフホスティング環境では、恒久的なエラーです。
  • SNS への投稿では、503 publish_retryable は何も投稿されていないことを示し、同じリクエストを安全に再送できます。一方、500 publish_failed は結果が不明であることを示し、再送すると二重に投稿されるおそれがあります。

エラーコード

400 Bad Request

コード意味
validation_errorリクエストボディの形式の誤り、不正な UUID、無効なフィールド、形式が正しくないカーソルのいずれかです。
limit_reached有効か無効かにかかわらず、API トークンがすでに 10 個あります。先に 1 つ削除してください。
invalid_workflowトークンの workflowIds に含まれる値が、個人スペースにあるワークフローではありません。
token_workspace_mismatch1 つのワークスペースに紐付いたトークンが、別のワークスペースを指定する X-Nodaro-Workspace ヘッダーとともに送られました。
locked_field実行で、外部と通信するノードの送信先または取得元を変更しようとしました。実行で変更できないものを参照してください。
image_requiredテキストから動画を作れないモデルで、開始フレームを指定せずに POST /v1/generate-video を呼び出しました。代わりにリファレンスを使えるかどうかは、メッセージに示されます。
sequence_execution_required実行に、スタジオプロダクション API で生成する必要があるスタジオプロダクションのノードが含まれています。
not_workspace_scopedワークスペースに属していないワークフローの visibility を変更しました。
advanced_mode_unsupported直接呼び出しの経路がないモデルで、advancedMode: true を指定しました。

401 Unauthorized

コード意味
unauthorizedトークンが指定されていないか、無効、期限切れ、または取り消し済みです。

402 Payment Required

これらのコードは、Nodaro Cloud と、課金を行うデプロイ環境から返されます。

コード追加フィールド意味
insufficient_creditsrequired、balanceアカウントのクレジットが足りません。1 つの請求アカウントが全員分を支払うデプロイ環境では、デプロイ環境のプールが空であることを意味します。その場合、エラーには required が含まれますが、balance は含まれません。また、クレジットを追加できるのは請求アカウントだけです。
insufficient_app_credits公開アプリの実行で、アカウントのクレジットが足りません。
budget_exceededワークスペースが支払う処理で、ワークスペースの予算では実行をまかなえません。ワークスペースの管理者に追加を依頼してください。
member_cap_exceededワークスペースが支払う処理で、そのワークスペースでの自分の利用上限に達しました。
user_allowance_exceededrequired、remainingユーザーごとの利用枠を適用している、1 つの請求アカウントが全員分を支払うデプロイ環境で、自分の利用枠では実行をまかなえません。利用枠を引き上げられるのは、請求アカウントだけです。
instance_cap_reached接続済みのセルフホスティング環境の OAuth トークンで、その環境が、接続元のアカウントに設定された月間上限を使い切りました。接続済みのインスタンスで、上限を引き上げるか解除してください。

403 Forbidden

コード追加フィールド意味
forbiddenトークンで扱えるワークフローの範囲にこのワークフローが含まれていないか、このルートにはログイン済みのセッションが必要です。認証を参照してください。
insufficient_scopemissingScopeOAuth トークンに、ルートに必要なスコープがありません。より広いスコープを指定して、ユーザーにもう一度同意画面を通ってもらってください。
in_app_onlyこのルートは、ワークフロー Copilot など、Nodaro の Web アプリ専用です。
edition_requiredrequired_editionこのルートには、より上位のエディションが必要です。パイプラインの分岐には cloud、API トークンの管理には business が必要です。
not_a_memberX-Nodaro-Workspace ヘッダーが、自分がアクティブなメンバーではないワークスペースを指定しています。
member_suspendedワークスペースでの自分のメンバーシップが停止されています。
personal_space_disabled組織の設定により、ワークスペースの中でしか作成できません。ワークスペースのヘッダーを送ってください。
project_create_not_allowedプロジェクトを作成できるのは、ワークスペースの管理者だけです。
workspace_archivedワークフローの共有など、アーカイブ済みのワークスペースへの書き込みです。そこで新たに作成しようとした場合は、代わりに 409 が返ります。
not_permittedこのワークフローを移動する権限がないか、その場所に移動する権限がありません。
sso_requiredデプロイ環境がログインを自身の ID プロバイダーに限定しており、このセッションのアカウントは、その ID プロバイダーを通じて作成されていません。トークンには影響しません。
subscription_required従量課金のアカウントが、Web エディターからクレジットを使おうとしました。従量課金のクレジットは API、SDK、CLI、MCP で使えるため、トークンでの呼び出しがこのコードを受け取ることはありません。
api_tokens_payer_only1 つの請求アカウントが全員分を支払うデプロイ環境では、API トークンを作成できるのは、その請求アカウントだけです。
payer_balance_jwt_onlyそのようなデプロイ環境で、請求アカウントがトークンを使ってプールの残高を読み取りました。残高を読み取れるのは、請求アカウント自身のブラウザーセッションだけです。
payer_requiredデプロイ環境の請求用のルートが、請求アカウントのブラウザーセッション以外から呼び出されました。

404 Not Found

コード意味
not_foundリソースが存在しないか、あなたには見えません。ID から存在の有無がわからないように、どちらの場合も意図的に同じレスポンスを返します。
workspace_not_foundワークスペースが支払う処理で、存在しないワークスペースが指定されました。

409 Conflict

コード追加フィールド意味
already_runningexecutionIdこのワークフローは、すでに実行中です。代わりに、その実行をポーリングしてください。
workflow_conflictcurrentVersion、currentUpdatedAt、currentRecord送ったバージョンの後に、ワークフローが変更されました。currentRecord に変更をマージして、もう一度保存してください。
workspace_archivedアーカイブ済みのワークスペースで作成しようとしたか、そこへ移動しようとしました。
workspace_has_no_default_projectワークスペースでの作成でプロジェクトが指定されておらず、そのワークスペースにはデフォルトのプロジェクトもありません。プロジェクトを指定してください。
move_blocked課題のために作成されたものなので、移動できません。
production_capability_required汎用のワークフロー保存で、専用の API で扱う必要があるスタジオプロダクションを変更しようとしました。
retained_image_in_use削除すると保護された画像が消えてしまうか、プロダクションにまだその画像を使っているジョブがあります。先にそれらのジョブを完了させるか、キャンセルしてください。

413、422、429

ステータスコード意味
413アカウントがストレージの上限を超えています。SDK は、limitBytes 付きの StorageExceededError をスローします。
422job_blockedデプロイ環境のジョブポリシーが、実行前に生成を拒否しました。ジョブは作成されず、何も課金されていません。message をそのままユーザーに表示し、同じリクエストを再試行しないでください。
422upload_blockedデプロイ環境のアップロードポリシーが、保存前にファイルを拒否しました。message をそのまま表示してください。
429rate_limited個人用 API トークンの、トークンごとの制限です。
429rate_limit_exceededそれ以外の制限です。アドレスごと、ルートごとの制限や、公開アプリの 1 日あたりの実行回数の制限が該当します。
429too_many_downloadsすでに 4 件の動画のインポートが実行中です。

422 のコードは、そのようなポリシーを登録したデプロイ環境でのみ発生します。429 のコードについては、レート制限を参照してください。

500、503

ステータスコード意味
500internal_errorサーバーエラー、またはサーバーが依存するサービスの障害です。バックオフしながら再試行してください。
503price_not_configuredこのデプロイ環境では、リクエストしたモデルに料金が設定されていません。誤った金額で課金しないよう、サーバーはリクエストを拒否します。再試行しても解決しません。
503rate_limit_unavailableクレジットを消費するルートが、レート制限を確認できませんでした。しばらくしてから再試行してください。
503provider_unavailableモデルのプロバイダーが利用できません。
503billing_unavailableこのインスタンスでは、使用量の報告をまだ利用できません。

ジョブが後から失敗した場合

リクエストが成功しても、作成されたジョブが失敗することがあります。その場合、ジョブには error_message が含まれ、2 種類の失敗では、構造化された error_hint も含まれます。

  • モデルの安全フィルターがリクエストをブロックした場合は、{ "kind": "safety-block", "class": "copyright" | "likeness" | "safety", "retried": boolean, "suggestedProvider"?: string } です。
  • デプロイ環境のポリシーがリクエストを拒否した場合は、{ "kind": "policy-block", "policyId": string, "reason": string, "hookPoint": "request" | "result" } です。

どちらの場合もクレジットは必ず返還され、そのことはジョブの credit_status で確認できます。各フィールドの意味と、別のモデルを試すべき場合については、ジョブが失敗した理由を参照してください。

SDK でのエラー

@nodaro/sdk は、失敗したレスポンスごとに型付きのエラーをスローします。最も具体的なクラスから順に捕捉してください。

クラスステータス追加フィールド
UnauthorizedError401
ForbiddenError403コードが insufficient_scope の場合は missingScope
NotFoundError404
InsufficientCreditsError402required、available
StorageExceededError413limitBytes
WorkflowConflictError409currentVersion、currentUpdatedAt、currentRecord。スタジオの production_busy の競合にも使われます。
RateLimitedError429
JobBlockedError422
StudioOpError4xxopIndex:スタジオのバッチのうち、拒否された操作の位置
NodaroErrorすべて基底クラス:code、status、message
import {
  NodaroError,
  ForbiddenError,
  InsufficientCreditsError,
  RateLimitedError,
} from '@nodaro/sdk'

try {
  await client.workflows.run(workflowId)
} catch (err) {
  if (err instanceof InsufficientCreditsError) {
    showPaywall({ required: err.required, available: err.available })
  } else if (err instanceof ForbiddenError && err.missingScope) {
    requestConsent([err.missingScope])
  } else if (err instanceof RateLimitedError) {
    await new Promise((r) => setTimeout(r, 5_000))
  } else if (err instanceof NodaroError) {
    console.error(`API error ${err.status} (${err.code}): ${err.message}`)
  } else {
    throw err // a network failure, not an API error
  }
}

ポーリング用のヘルパーは、JobFailedError や JobTimeoutError など、独自のエラーも追加します。単体のノードを実行するを参照してください。

CLI でのエラー

終了コード意味
0成功です。
1認証の失敗、リソースが見つからない、引数の誤り、ネットワークエラーのいずれかです。
2--watch が終了し、実行は失敗しました。
3ジョブがレビューのために保留されたため、--watch が停止しました。失敗ではありません。後で確認してください。
130--watch が終了し、実行はキャンセルされました。

--json を付けると、CLI はコード 2、3、130 を使わずに、ペイロードを出力して正常終了します。そのため、.status を自分で確認してください。

よくある質問

最終更新

目次