OrbitWake API

Erreurs

OrbitWake utilise aujourd’hui plusieurs modèles d’erreur selon la surface : réponses JSON avec status HTTP, erreurs métier encapsulées dans Connectors, et événements SSE après ouverture d’un stream AI. Il n’existe pas encore un format d’erreur global unique pour toute l’API.

Trois couches d’erreur

CoucheExempleTraitement
HTTP / validation400, 401, 403, 404, 413, 429Lire le status puis le body JSON.
Service / provider502, 503, 504Peut justifier un retry selon le contexte.
MétierAPPROVAL_REQUIRED, ACTION_NOT_FOUNDLire les champs métier même si le transport HTTP a réussi.

Shape JSON courante

{
  "error": "Message lisible"
}

C’est le format le plus fréquent pour les erreurs de validation, authentification, autorisation et indisponibilité simple.

Ce format n’est pas universel : Connectors possède ses propres erreurs métier et GET /api/auth/session retourne actuellement { "user": null } sur 401.

Codes HTTP observés

StatusInterprétation couranteExemple
400Entrée invalide, JSON invalide, modèle/mode inconnu ou champ obligatoire manquant.Prompt is required.
401Authentification absente ou invalide.Authentication required.
403Identité connue mais accès refusé.OrbitWake AI is not available for this account.
404Ressource, conversation, projet, memory ou action absente.Project not found.
409Conflit métier ou limite d’état.Limite de projets beta atteinte.
413Payload, fichier, stockage ou contexte trop volumineux.Conversation context is too large.
429Rate limit explicite.Recherche de domaine.
500Erreur serveur non classée.Fallback interne d’un handler.
502Réponse provider techniquement inutilisable.OpenAI returned no text.
503Service/provider/configuration/budget indisponible.OrbitWake AI daily provider budget has been reached.
504Timeout provider.OpenAI timed out.

400 — Bad Request

Un 400 signifie généralement que la requête doit être corrigée avant d’être rejouée.

Exemples AI :

Unknown OrbitWake model.
Unknown OrbitWake mode.
Invalid message.
Invalid message role.
Message content cannot be empty.
System messages are managed by OrbitWake and cannot be supplied by clients.
Only user messages can contain attachments.
Invalid conversation.

Exemples Connectors :

Invalid JSON.
connectorId and actionName are required.
idempotencyKey must be a string.
approvalId must be a valid UUID.
decision must be approve or deny.

401 — Authentification

Les deux messages principaux observés sont :

Authentication required.
IDE authentication required.

Le premier concerne principalement les routes web protégées par la session OrbitWake. Le second concerne les routes IDE protégées par un Bearer token dédié.

Un retry avec le même credential invalide ne résoudra pas le problème : il faut rétablir une session valide ou refaire le pairing IDE.

403 — Authentifié mais non autorisé

Exemples :

OrbitWake AI is not available for this account.
OrbitWake IDE AI is not available for this account.
OrbitWake IDE Agent is not available for this account.
This workspace does not have active private beta access.
Private beta access has expired.

Dans Connectors, INVALID_APPROVAL est mappé vers 403 lorsque l’approval ne correspond pas à l’action exacte ou n’est plus valide.

404 — Ressource absente

Exemples confirmés :

Conversation not found.
Project not found.
Version not found.
Memory not found.
Approval not found, expired, or already decided.

La couche Projects utilise aussi 404 lorsque la private beta est entièrement désactivée : Private beta projects are not enabled.

409 — Conflit d’état

Projects utilise 409 pour des conflits métier comme :

This beta workspace is limited to N active projects.
Unable to allocate a unique project name.

Le client doit généralement modifier l’état ou la demande avant de réessayer.

413 — Payload trop volumineux

AI utilise 413 pour :

Each attachment must be 8 MB or smaller.
Attach at most 3 files to a message.
Attachments in the conversation context exceed 12 MB.
Conversation context is too large.

Projects utilise également 413 lorsqu’un fichier dépasse la limite beta ou que le stockage total du projet serait dépassé.

429 — Rate limit

La recherche de domaine peut répondre :

{
  "error": "Too many domain searches. Please try again shortly."
}

Le endpoint renvoie aussi :

X-RateLimit-Limit
X-RateLimit-Remaining
X-RateLimit-Reset
Retry-After

Le client doit respecter Retry-After plutôt que relancer immédiatement.

AI — validation et limites

Les erreurs AI de validation utilisent AiGatewayError avec un status explicite.

Exemples :

Unsupported attachment. Use PDF, PNG, JPEG, WEBP, or GIF.
Attachments currently require OrbitWake Auto or OpenAI.
Live web search currently requires OrbitWake Auto or OpenAI.
Qwen is disabled for this private test.

Le gateway peut aussi refuser une requête si un provider requis n’est pas configuré.

AI — mapping des erreurs provider

Les providers OpenAI, Anthropic et compatibles convertissent actuellement :

Erreur providerStatus OrbitWakeRetryable
4xx hors 429400Non.
429 provider503Oui.
5xx provider503Oui.
Réponse sans texte502Oui.
Timeout provider504Oui.
Erreur réseau/inconnue provider503Oui.

Le champ interne retryable sert notamment au fallback OrbitWake Auto avant émission d’un premier delta.

AI — budget provider quotidien

503
{
  "error": "OrbitWake AI daily provider budget has been reached."
}

Cette erreur n’indique pas un problème de payload ou d’authentification. Elle vient d’une limite serveur globale de coût provider.

AI — fallback 500

Si une erreur inattendue n’est pas déjà une AiGatewayError, les routes AI renvoient généralement :

500
{
  "error": "OrbitWake AI is temporarily unavailable."
}

Streaming — erreur avant ou après ouverture

Avant ouverture du SSE, le status HTTP réel est utilisé normalement.

Après ouverture du HTTP 200, une erreur devient un événement :

event: error
data: {
  "error": "Message lisible",
  "status": 503
}

Le champ status est alors logique : le status HTTP du flux reste déjà fixé à 200.

Projects — erreurs private beta

La couche Projects encapsule ses erreurs métier avec PrivateBetaError.

Exemples :

Project name is required.
Project name must be between 1 and 120 characters.
File path is invalid.
File content must be text.
Private beta projects are not enabled.
Finish workspace setup before using beta projects.
This workspace does not have active private beta access.
Private beta access has expired.
Project not found.
Version not found.

Les handlers conservent le status fourni par PrivateBetaError. Les erreurs inattendues deviennent un 500 avec un message fallback spécifique à l’opération.

Memory

Memory utilise principalement 400, 401 et 404.

Memory content is required.
Unknown memory scope.
Unknown memory category.
Project memories require a project name or key.
Title cannot be empty.
Content cannot be empty.
Memory not found.

Une exception levée pendant create/update est actuellement convertie en 400 avec le message de l’exception lorsqu’il existe.

Connectors — erreurs métier

Connectors peut répondre avec une structure :

{
  "result": {
    "success": false,
    "error": {
      "code": "ACTION_NOT_FOUND",
      "message": "...",
      "retryable": false
    }
  },
  "approval": null,
  "requestId": "uuid",
  "activity": [...]
}

Codes métier confirmés dans le bridge actuel :

CodeHTTPSignification
APPROVAL_REQUIRED202L’action attend une approbation humaine.
ACTION_NOT_FOUND404Action inconnue ou indisponible.
INVALID_APPROVAL403Approval invalide, expirée, utilisée ou non correspondante.
Autre erreur métier400Validation/exécution refusée.

Connectors — erreur serveur

Si le handler lui-même échoue :

500
{
  "error": "Connector action could not be completed."
}

Ce cas est différent d’un result.success = false métier correctement produit par le bridge.

IDE

Erreurs courantes :

IDE authentication required.
OrbitWake IDE AI is not available for this account.
OrbitWake IDE Agent is not available for this account.
Prompt is required.
No readable workspace files were supplied.
Pairing code is invalid or expired.
Invalid JSON.

Le endpoint Agent peut aussi remonter des erreurs de proposition comme :

OrbitWake did not return a valid patch proposal.
Invalid patch proposal.
OrbitWake did not propose any applicable file changes.

Domains

Les erreurs provider domaine utilisent DomainProviderError avec un status propre, par défaut 502.

Une erreur inattendue devient :

500
{
  "error": "Domain search is temporarily unavailable."
}

Le endpoint conserve ses headers de rate limit même lors des erreurs.

Health

/api/health ne transforme pas chaque composant dégradé en objet { error }. Il agrège l’état des composants.

Si un ou plusieurs checks échouent, la réponse globale utilise status: "degraded" avec HTTP 503.

Les erreurs internes de composants sont loggées côté serveur et représentées par leur état agrégé.

Quand réessayer

TypeRetry automatique ?Conseil
400 validationNon.Corriger la requête.
401Non avec le même credential.Rétablir l’authentification.
403Non en boucle.Vérifier droits, beta ou approval.
404Non sauf état éventuellement créé plus tard.Vérifier l’identifiant.
409Après changement d’état.Résoudre le conflit.
413Non identique.Réduire le payload.
429Oui après attente.Respecter Retry-After.
502/503/504Parfois.Backoff borné ; éviter les boucles agressives.

Backoff recommandé

L’API actuelle ne publie pas encore une politique de retry globale.

Pour les erreurs transitoires sans Retry-After, utilisez un backoff exponentiel borné avec jitter côté client, et limitez le nombre de tentatives.

Pour les POST mutatifs, vérifiez d’abord si l’opération possède une idempotency explicite. Connectors accepte idempotencyKey dans son body ; ce mécanisme n’est pas global à toute l’API.

Erreurs à ne pas rejouer aveuglément

  • création de projet après timeout sans vérifier si le projet existe déjà ;
  • création de memory après interruption réseau ;
  • création de checkpoint sans connaître le résultat précédent ;
  • actions Connector mutatives sans idempotency appropriée ;
  • POST ayant pu être traité côté serveur avant la perte de connexion.

Pattern client

const response = await fetch(url, options);

if (!response.ok) {
  const payload = await response.json().catch(() => ({}));
  const message =
    typeof payload.error === "string"
      ? payload.error
      : `OrbitWake request failed (${response.status})`;

  throw new Error(message);
}

const payload = await response.json();

Pour Connectors et SSE, un traitement supplémentaire est nécessaire car l’échec peut être représenté autrement qu’un simple !response.ok.

Logs et diagnostic

Lors d’un bug, capturez au minimum :

  • route et méthode ;
  • status HTTP ;
  • message d’erreur ;
  • timestamp ;
  • requestId si la surface en fournit un ;
  • mode/modèle pour AI ;
  • action Connector si concernée.
Ne loggez pas de secretsN’enregistrez pas cookies de session, tokens IDE, secrets webhook, credentials provider, mots de passe ou contenus sensibles uniquement pour diagnostiquer une erreur.

Ce qui n’est pas encore standardisé

  • pas de code d’erreur machine global sur toutes les routes ;
  • pas de requestId global ;
  • pas de champ retryable universel ;
  • pas de structure unique { error: { code, message } } ;
  • pas de politique de retry externe versionnée ;
  • pas de catalogue public exhaustif des erreurs.

Limites actuelles

Les messages et mappings décrits ici correspondent au runtime actuel. Une future API publique versionnée devra stabiliser les codes machine, les envelopes, le request tracing et la politique de retry avant d’être considérée comme contrat externe durable.

Étape suivante

La page Limites documentera les quotas, tailles maximales, contraintes de contexte, limites Projects, Memory, Connectors, IDE et rate limits vérifiés aujourd’hui.

PrécédentAPI — StreamingSuivantAPI — Limites