Aller au contenu principal

Référence API (OpenAPI et exemples)

English version: ../../en/guides/api-reference.md

Cette page est le point d'entrée de la référence API de la Navin Platform. Elle présente les deux API, où se trouve leur référence sur le site de documentation et dans le dépôt, comment s'authentifier, et comment fonctionnent les erreurs, les pages, les reprises et les traces. Qui : développeurs et intégrateurs.

Les deux API​

APICe qu'elle sertPréfixeIdentifiantRéférence sur le site de documentationSource de la référence
API du Control Planetenants et projets, identités et accès, agents et exécutions, modèles et passerelle LLM, connaissances, outils et MCP, gouvernance, sécurité, FinOps ; chaque écran du portail, SDK et commande CLI passe par elle/v1jeton OIDC, session du portail ou clé d'API eai_.../api/control-planedocs/api/openapi-v1.json
API du Navin Managerl'infrastructure de la plateforme : hôtes, clusters, services, haute disponibilité, sauvegardes, restaurations et reprise après sinistre/api/v1 du Navin Managerjeton d'API du manager nmt_.../api/managernavin-manager/docs/api/manager-openapi.json

Sur le site de documentation, ouvrez /api/control-plane pour l'API du Control Plane et /api/manager pour l'API du Navin Manager. Dans ce dépôt, lisez l'API du Control Plane route par route et les SDK et CLI du Navin Manager pour l'API du Navin Manager. Dans le portail, Portail développeur > Référence API pointe vers /docs, /redoc et /openapi.json de votre Control Plane et affiche sa version.

remarque

Quand la documentation est activée sur un serveur du Control Plane, le serveur sert lui-même la référence sur /redoc, la console interactive sur /docs et le contrat machine sur /openapi.json.

Sources de vérité​

Le schéma OpenAPI publié est docs/api/openapi-v1.json, généré depuis l'application FastAPI par services/control-plane/src/eai/api_openapi.py (un changement cassant est refusé). La surface des requêtes est docs/api/control-plane-v1.requests.json et la description route par route docs/api/control-plane-v1.md. Les contrats JSON Schema sont dans contracts/v1.

cd services/control-plane
.venv/bin/python -m eai.api_openapi --check
.venv/bin/python -m eai.api_surface --check

Le schéma du Navin Manager navin-manager/docs/api/manager-openapi.json est écrit depuis le serveur par tools/manager/openapi.py, et ses clients Python, TypeScript et Go en sont générés par tools/manager/gen_sdks.py.

Authentification​

Le tenant d'un appel au Control Plane vient toujours de l'identifiant, jamais du corps de la requête.

IdentifiantEn-têteAppelant type
Jeton d'accès OIDC émis par KeycloakAuthorization: Bearer <token>utilisateurs du portail, des SDK et de la CLI après connexion
Session du portail eais_... ouverte par POST /v1/auth/loginAuthorization: Bearer eais_...comptes locaux
Clé d'API eai_...X-API-Key: eai_... ou Authorization: Bearer eai_...scripts, chaînes CI, services back end
Jeton d'API du Navin Manager nmt_...Authorization: Bearer nmt_... sur l'API du Navin Managerautomatisation de l'infrastructure

Le Navin Manager accepte aussi X-NM-On-Behalf-Of: <user> d'un jeton qui détient auth:delegate ; tout autre appelant reçoit 403 on_behalf_of_forbidden.

Exemples​

Lister les contrats (GET /v1/contracts), valider un manifeste (POST /v1/contracts/{name}/validate), démarrer un run (POST /v1/agents/{agent_id}/runs) et lire ses étapes (GET /v1/runs/{run_id}/steps).

curl -H "X-API-Key: $EAI_API_KEY" https://ai.acme.example/v1/contracts
curl -X POST -H "X-API-Key: $EAI_API_KEY" -H 'Content-Type: application/json' \
-d @agent.json https://ai.acme.example/v1/contracts/agent-manifest/validate

Premiers appels​

  1. Vérifier qui vous êtes. La réponse prouve que l'identifiant fonctionne et montre le tenant, les rôles et les droits que le serveur en a tirés.

    curl -H "X-API-Key: $EAI_API_KEY" https://ai.acme.example/v1/me

    Résultat attendu : 200 avec votre principal.

    En cas d'échec : 401 unauthenticated (aucun identifiant), 401 invalid_api_key ou 401 api_key_revoked.

  2. Vérifier la version de l'API. GET /v1/meta donne la version du serveur et la version de l'API ; un client écrit pour /v1 attend v1.

    curl -H "X-API-Key: $EAI_API_KEY" https://ai.acme.example/v1/meta

    Résultat attendu : api_version vaut v1.

    En cas d'échec : une autre valeur signale que le serveur et votre client ne parlent pas la même version majeure.

  3. Lire une liste page par page. Les routes de liste renvoient {"items": [...], "next_cursor": "..."} ; envoyez limit (50 par défaut, 500 au plus) et cursor=<next_cursor> pour la page suivante, jusqu'à ce que next_cursor vaille null.

    curl -H "X-API-Key: $EAI_API_KEY" "https://ai.acme.example/v1/runs?limit=50"

    Résultat attendu : une page d'exécutions et un next_cursor.

    En cas d'échec : 400 invalid_cursor signale un curseur abîmé ; ne le décodez ni ne le fabriquez jamais.

  4. Relancer une création sans risque. Envoyez un en-tête Idempotency-Key (1 à 200 caractères) : une reprise avec la même clé et le même corps renvoie la réponse enregistrée avec Idempotency-Replayed: true. Les créations longues renvoient aussi Operation-Id et Operation-Location, suivies avec GET /v1/operations/{operation_id}.

    Résultat attendu : une seule ressource créée, quel que soit le nombre de reprises.

    En cas d'échec : 409 idempotency_conflict (même clé, autre corps) ou 409 operation_in_progress (la première requête tourne encore).

  5. Corréler un appel. Envoyez votre propre X-Request-Id et un traceparent W3C ; la réponse porte X-Request-Id, l'enveloppe d'erreur le répète et les événements d'audit portent le même identifiant de trace.

    Résultat attendu : GET /v1/audit/correlations retrouve chaque événement de la chaîne d'appels.

    En cas d'échec : un X-Request-Id avec des caractères hors lettres, chiffres et . _ : - est remplacé par un identifiant généré req_<hex>.

Erreurs​

Toute erreur suit l'enveloppe error avec code, message, message_i18n (en, fr), details et request_id ; les SDK la traduisent en erreurs typées (voir les guides SDK Python, TypeScript, Go).

{"error": {"code": "forbidden", "message": "...", "message_i18n": {"en": "...", "fr": "..."},
"details": {"required_roles": ["tenant_admin"]}, "request_id": "req_..."}}

La langue de message suit l'en-tête Accept-Language (en ou fr, en par défaut). L'API du Navin Manager garde la même enveloppe {error: {code, message, message_i18n, details}}.

Dépannage​

StatutCodeCauseCorrection
400invalid_requestvaleur invalidelisez details, corrigez la valeur
400invalid_cursorcurseur de pagination abîmérepartez de la première page
401unauthenticatedaucun identifiantenvoyez un jeton ou une clé d'API
401invalid_api_key, api_key_revokedclé fausse ou révoquéecréez ou renouvelez la clé (POST /v1/api-keys/{key_id}/rotate)
403forbiddenrôle ou droit manquantdemandez le rôle de details.required_roles
404not_foundressource absente ou dans un autre tenantvérifiez l'identifiant et l'identité utilisée
409conflict, idempotency_conflict, operation_in_progressdoublon, clé réutilisée ou conflit d'étatlisez details, relancez avec une nouvelle clé ou plus tard
413payload_too_largecorps au-delà de la limiteenvoyez au plus details.max_bytes
422validation_errorcorps ou paramètres non conformes au schémalisez details.errors (loc, msg, type)
429rate_limitedlimite de débit atteinteattendez Retry-After secondes
502authz_backend_errorle moteur d'autorisation n'a pas pu répondre (échec fermé)vérifiez OpenFGA et OPA
503service_unavailableune dépendance est arrêtéevérifiez l'état de la plateforme

Étapes suivantes​