Leem

Référence

Erreurs et limites

L'enveloppe d'erreur, les codes rencontrés, les limites de débit et de solde.

Toute erreur /v1, quelle que soit la route, prend la même forme, jamais une page HTML ni une trace :

json
{
  "error": { "type": "invalid_request", "code": "invalid_parameter", "message": "instructions must be a string of at most 20000 characters.", "param": "instructions" },
  "request_id": "req_01k6examplereq00000000000"
}

param n'apparaît que lorsqu'un champ précis est en cause. request_id est toujours présent, voir Authentification.

Types et codes rencontrés

StatuttypecodeCas
400invalid_requestinvalid_parameterUn champ a une valeur invalide (borne dépassée, format incorrect). Pour un output_schema invalide (racine non objet, plus de 32 Ko, $ref externe, boucle de $ref…), param vaut output_schema.
400invalid_requestunknown_parameterUn champ du corps n'est pas reconnu.
400invalid_requestagent_inactiveL'agent visé par le run est désactivé (active: false).
400invalid_requestwebhook_secret_missingwebhook_url fourni sans secret de signature créé au préalable.
400invalid_requestunknown_toolUn outil listé dans tools n'existe pas.
400invalid_requesttool_unavailableUn outil listé dans tools n'est pas utilisable par votre organisation maintenant.
400invalid_requestinvalid_idempotency_keyIdempotency-Key vide ou trop long.
400invalid_requestinvalid_last_event_idLast-Event-ID ou ?after= n'est pas un entier valide.
400 / 415invalid_requestempty_file, unsupported_file_type, file_unsafe, storage_quota_exceeded, upload_failedRefus d'un envoi à POST /v1/files, voir Fichiers.
413invalid_requestfile_too_largeCorps ou fichier au-delà de 20 Mo.
405invalid_requestmethod_not_allowedMéthode HTTP non supportée sur cette route.
401authenticationmissing_api_key, invalid_api_key, api_key_revoked, api_key_expiredVoir Authentification.
403permissioninsufficient_scopeLa clé n'a pas le droit requis par cette route.
403permissionorganization_lockedL'organisation est verrouillée : facture impayée, ou période d'essai terminée (choisissez une formule dans leem). Le message de l'erreur précise la cause.
403permissioninvalid_signatureLien de téléchargement de fichier invalide ou expiré.
422invalid_requestmodel_unavailableLe modèle demandé n'est pas dans votre formule (voir GET /v1/models). Le même code peut aussi apparaître dans error d'un run terminé failed, quand son modèle a quitté la formule avant son démarrage.
422invalid_requestinvalid_client_toolUne définition de client_tools est invalide (nom, description, parameters, doublon, plus de 20 outils) ; param nomme le champ. Voir Outils client.
422invalid_requestclient_tool_name_takenUn outil client porte le nom d'un outil leem (préfixe leem_ compris), ou d'un outil client déjà déclaré sur l'agent.
422invalid_requestunknown_tool_call, duplicate_tool_output, missing_tool_outputs, tool_output_too_largeRefus de POST /v1/runs/{run}/tool_outputs : un call_id n'est pas en attente, est répondu deux fois, un appel en attente n'a pas de résultat, ou un résultat dépasse 100 000 octets.
422invalid_requestoutput_schema_unsupportedUn output_schema est posé (ou le sera) sur un modèle qui ne peut pas garantir une sortie structurée : choisissez un modèle dont structured_output vaut true dans GET /v1/models. Voir Sortie structurée.
403permissionwidget_unavailablePOST /v1/widgets/{widget}/sessions : widget désactivé, aucun agent actif dans l'équipe du widget, ou option absente de la formule. Voir Widget.
409conflictfile_in_useDELETE /v1/files/{file} sur un document de connaissance : utilisez DELETE /v1/agents/{agent}/documents/{file}.
409conflictsupport_unavailableCôté widget : signalement demandé alors que le widget n'a pas d'adresse de support.
422invalid_requesttoo_many_documentsUn agent porte 20 documents de connaissance au plus.
404not_foundresource_not_foundAgent, run ou fichier introuvable, y compris celui d'une autre organisation, toujours rendu comme absent.
404not_foundroute_not_foundAucune route à ce chemin.
409conflictagent_name_takenUn agent de ce nom existe déjà dans l'organisation.
409conflictrun_not_activePOST /v1/runs/{run}/cancel sur un run déjà terminal.
409conflictrun_not_waitingPOST /v1/runs/{run}/tool_outputs sur un run qui n'est pas en requires_action.
409conflictidempotency_key_in_progress, idempotency_key_reused, idempotency_key_sensitive_replay, idempotency_key_stream_replayVoir « Idempotence » ci-dessous.
402insufficient_creditsinsufficient_creditsCrédit mensuel et crédits supplémentaires épuisés.
402billingorganization_suspendedL'organisation est suspendue (renouvellement impayé).
429rate_limittoo_many_requestsDébit de requêtes dépassé, voir ci-dessous.
429rate_limitconcurrent_runs_exceededTrop de runs actifs en même temps.
503serverstream_capacity_reachedTrop de flux SSE ouverts sur la plateforme, voir Flux d'événements (SSE).
5xxserverinternal_error, service_unavailable, http_5xxPanne côté leem. Réessayez plus tard ; persistant, contactez le support avec request_id.

Échec d'un run

Un run terminé failed porte error: {"code": "...", "message": "..."}. Le message ne contient jamais le texte brut d'un fournisseur d'IA. Le code indique la conduite à tenir :

error.codeCasQue faire
service_unavailableLe service IA est momentanément indisponible ; l'équipe leem est prévenue.Réessayer plus tard.
model_unreachableLe modèle du run est momentanément injoignable ; l'équipe leem est prévenue.Réessayer plus tard, ou choisir un autre modèle (GET /v1/models).
model_busyLe modèle est très sollicité en ce moment.Réessayer dans un instant.
free_model_quotaLe quota du modèle de test gratuit est atteint (organisations de test uniquement).Réessayer plus tard, ou choisir un autre modèle (GET /v1/models).
request_refusedLe filtre de sécurité du modèle a refusé la demande.Reformuler la demande.
context_too_longLa conversation ou les pièces jointes dépassent ce que le modèle accepte.Raccourcir les instructions ou retirer des fichiers.
run_errorUne autre erreur côté leem.Réessayer ; persistant, contacter le support avec le request_id.
model_unavailableLe modèle a quitté votre formule avant le démarrage du run.Choisir un modèle de GET /v1/models.
run_interruptedLe worker qui exécutait le run s'est arrêté.Relancer le run.
run_timeoutLe run a dépassé sa durée maximale.Relancer avec une demande plus courte.
insufficient_creditsLe crédit mensuel et les crédits supplémentaires ont été épuisés en cours de run.Acheter des crédits supplémentaires ou attendre le renouvellement mensuel, puis relancer.
agent_unavailableL'agent a été supprimé ou désactivé avant le démarrage.Réactiver l'agent ou en viser un autre.
empty_outputLe modèle n'a produit aucune réponse.Relancer, ou reformuler la demande.
tool_outputs_timeoutLe run attendait les résultats de vos outils client depuis plus de 10 minutes. Fichiers et graphiques déjà produits conservés.Relancer, et répondre plus vite à run.requires_action, voir Outils client.
output_invalidLa réponse ne respecte pas output_schema, même après une correction. output.text est conservé.Relancer, assouplir le schéma ou préciser les instructions.
output_schema_rejectedL'hébergeur du modèle refuse output_schema.Simplifier le schéma, voir Sortie structurée.
output_schema_unsupportedLe modèle n'est plus compatible avec la sortie structurée.Choisir un modèle avec structured_output à true.

Les trois derniers codes concernent les runs avec un schéma de sortie : les crédits déjà consommés restent débités ; seuls les appels de mise en forme et de correction réellement servis sont facturés, voir Sortie structurée.

Outils client

Bornes propres aux outils client : 20 par agent, 20 par run, 1 024 caractères de description, 16 384 octets de parameters, 100 000 octets par résultat de tool_outputs, et 10 minutes d'attente au plus d'un run en requires_action.

Avertissements de widget

Un run lancé par un widget peut porter, dans warnings :

  • client_tool_unreachable : le widget n'a pas d'URL de webhook, ou l'organisation pas de secret de webhook ; l'outil client server est écarté du run.
  • widget_tool_unavailable : un outil qui donnerait accès aux données leem ou à un serveur MCP est retiré du run (un widget ne les porte pas).

Les codes propres aux routes navigateur du widget (invalid_session, origin_not_allowed, user_rate_limited…) sont listés dans Widget.

Débit de requêtes

120 requêtes par minute et par clé API par défaut (peut être ajusté par organisation ou par formule). Chaque réponse d'une requête authentifiée et admise porte X-RateLimit-Limit et X-RateLimit-Remaining (pas une réponse 401 ou 429, ni le téléchargement signé GET /v1/files/{file}/content) ; au-delà, 429 too_many_requests avec un en-tête Retry-After en secondes.

Runs simultanés

5 runs actifs (queued ou running) au plus par organisation par défaut ; la limite est propre à chaque organisation (fixée par sa formule, ou ajustée pour elle). Un run en requires_action (en attente des résultats d'un outil client) n'est pas compté. Un POST /v1/runs qui dépasserait cette limite reçoit 429 concurrent_runs_exceeded avec Retry-After.

Crédit disponible

Les runs se paient en crédits, à l'usage : d'abord le crédit mensuel de la formule, puis les crédits supplémentaires. POST /v1/runs vérifie que l'organisation a encore du crédit (credit.available dans GET /v1/organization) ; sinon la requête est refusée en 402 insufficient_credits : aucun run n'est créé.

Un run lancé s'arrête automatiquement quand le crédit est épuisé : il passe en failed avec l'erreur insufficient_credits, et les fichiers et graphiques déjà produits sont conservés. Le dépassement est borné à un tour du modèle. Achetez des crédits supplémentaires depuis la page Consommation de votre espace (/parametres/consommation) ou attendez le renouvellement mensuel, puis relancez le run.

Idempotence

Tout POST /v1 accepte un en-tête Idempotency-Key (1 à 255 caractères), propre à votre organisation, conservé 24 heures :

  • Rejouer la même requête (même méthode, même chemin, même corps) sous la même clé renvoie la réponse déjà produite, avec Idempotent-Replayed: true : l'action n'est jamais refaite.
  • Rejouer un flux SSE sous la même clé (POST /v1/runs avec stream: true) rouvre un flux sur le même run, repris depuis votre Last-Event-ID.
  • Utiliser la même clé avec un corps différent est refusé (409 idempotency_key_reused).
  • Une requête encore en cours sous cette clé refuse une seconde requête concurrente (409 idempotency_key_in_progress).
  • Une réponse qui montrait un secret une seule fois (rotation du secret de webhook) n'est jamais rejouée (409 idempotency_key_sensitive_replay) : renvoyez sans Idempotency-Key pour une nouvelle tentative.
  • Une réponse 402, 409, 429 ou 5xx ne réserve jamais la clé : elle reste libre pour un nouvel essai immédiat.

Versionnement

/v1 n'ajoute que des points d'entrée et des champs ; à partir de la 1.1, rien n'en est retiré ni renommé. Un client tolérant aux champs qu'il ne connaît pas encore reste compatible sans changement de version.

Historique :

  • 1.5 (2026-11-01) : équipe d'agents du widget. Ajout facultatif : le champ agents de POST /v1/widgets/{widget}/sessions, dans le corps et dans la réponse. Sans lui, une session a accès à toute l'équipe du widget. Voir Widget.
  • 1.4 (2026-10-31) : widget et documents de connaissance. Ajouts facultatifs : GET/POST /v1/agents/{agent}/documents, DELETE /v1/agents/{agent}/documents/{file}, POST /v1/widgets/{widget}/sessions, DELETE /v1/widget_users/{id}, les champs execution et label des outils client, les avertissements client_tool_unreachable et widget_tool_unavailable, les codes too_many_documents, file_in_use et widget_unavailable. Voir Widget.
  • 1.3 (2026-10-30) : outils client. Ajouts facultatifs : client_tools (agents et runs), statut requires_action et required_action sur le run, événement SSE et webhook run.requires_action, POST /v1/runs/{run}/tool_outputs, les codes invalid_client_tool, client_tool_name_taken, run_not_waiting, unknown_tool_call, duplicate_tool_output, missing_tool_outputs, tool_output_too_large et l'erreur de run tool_outputs_timeout. Aussi : is_test sur les modèles et l'erreur de run free_model_quota (modèles de test gratuits, organisations de test uniquement). Un client qui ignore ces ajouts continue de fonctionner tant que ses agents n'en déclarent pas. Voir Outils client.
  • 1.2 (2026-10-26) : sortie structurée garantie. Ajouts facultatifs : output_schema (agents et runs), output.json et output_schema sur le run, structured_output sur les modèles, 422 output_schema_unsupported et trois codes d'échec de run. Voir Sortie structurée.
  • 1.1 (2026-10-24) : balance devient credit ; usage.cost (MGA) devient usage.credits. La règle « rien n'est retiré ni renommé » s'applique à partir de la 1.1.