Aller au contenu

Référence API

Authentification, endpoints, streaming, raisonnement et erreurs sur la surface OpenAI, API natives Anthropic et matrice de compatibilité par endpoint.

Authentification

Chaque requête vers /v1/* s'authentifie avec une clé virtuelle dans l'en-tête Authorization: Bearer. Générez des clés dans la Console ; le secret n'est affiché qu'une fois et seul son hash est stocké. Une clé authentifie un workload. Le workload porte les limites de débit, le budget, les modèles autorisés et les dérogations ; les requêtes restent soumises à la politique de l'organisation.

Une requête dont le modèle ne figure pas sur la liste d'autorisation non vide du workload est refusée avec un 403 permission_error scellé avant tout envoi ; le refus lui-même est inscrit dans la chaîne d'audit.

La création d'une clé de production requiert une adresse e-mail vérifiée.

Identifiants du workload : gérez les clés API et leurs paramètres d’accès.
Identifiants du workload : gérez les clés API et leurs paramètres d’accès.Interface en anglais · données de démonstration illustratives. Ouvrez l’image pour la voir en taille réelle.
curl https://api.sluis.ai/v1/models \
  -H "Authorization: Bearer $SLUIS_KEY"

# a model outside the key's allow-list never dispatches:
# → 403 permission_error · the refusal is sealed in the audit chain

Endpoints

Sluis expose la surface compatible OpenAI ci-dessous, ainsi que les chemins natifs Anthropic détaillés plus loin. Les endpoints sans gestionnaire de premier niveau sont relayés tels quels vers le fournisseur routé, streaming compris, afin que les upstreams compatibles OpenAI conservent une fidélité totale. Un navigateur qui ouvre un chemin que l’API ne sert pas, comme l’hôte API seul, est redirigé vers cette documentation ; les clients API reçoivent toujours un simple 404.

EndpointRôle
POST /v1/chat/completionsChat completions, la surface principale : routage, protection des données, mise en cache, streaming.
POST /v1/completionsText completions historiques.
POST /v1/embeddingsEmbeddings.
POST /v1/moderationsClassification de modération.
POST /v1/responsesL'API OpenAI Responses.
POST /v1/systemoneNative System One typed decisions, not OpenAI chat messages.
POST /v1/ocrOCR de documents (Mistral, ou entièrement local avec le modèle sluis/ocr) · facturé à la page. Avec la politique dlp_documents active, les documents inline sont anonymisés avant de partir.
POST /v1/documents/anonymizeAnonymisation de documents · les PII deviennent des «MERGE_TAG»s, les images sont floutées · facturé par page/image.
POST /v1/documents/anonymize/jobsJobs d'anonymisation asynchrones · déposez les gros documents, suivez le statut, récupérez le résultat via une URL signée à durée limitée sans clé API.
GET /v1/modelsLes modèles que votre politique et vos identifiants peuvent réellement atteindre, rien d'hypothétique.
GET /v1/models/{id}Les métadonnées d'un modèle.
POST /v1/audio/*Transcription, traduction, synthèse vocale · relayé vers le fournisseur routé.
POST /v1/images/*Génération et retouche d'images · relayé. mistral/image-generation fait exception : Mistral n'expose la génération d'images que via son connecteur agent, la passerelle traduit donc la requête OpenAI et répond en b64_json, facturé à l'image.
POST /v1/video/generationsGénération de vidéo · relayé.
/v1/filesOpérations sur fichiers · relayé avec la propre clé de votre organisation (BYOK ou fournisseur personnalisé), jamais avec les clés gérées.
POST /v1/messagesEntrée native Anthropic Messages · pointez n'importe quel outil SDK Anthropic vers Sluis ; tout modèle connecté.
POST /v1/messages/count_tokensEstimation locale de tokens pour la gestion de contexte du SDK Anthropic ; rien n'est envoyé.
GET /anthropic/v1/modelsDécouverte native des modèles Anthropic · list et get à la forme Anthropic, depuis le catalogue en mémoire. Sur /v1/models, l'en-tête anthropic-version sélectionne cette même forme.
HEAD /api/helloSonde de préchauffage pour les clients du SDK Anthropic comme Claude Code · 200 avec un corps vide.
curl https://api.sluis.ai/v1/chat/completions \
  -H "Authorization: Bearer $SLUIS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "mistral/mistral-large-latest",
        "messages": [{ "role": "user", "content": "Say hi" }] }'
Playground avec un modèle sélectionné et une requête d’exemple terminée.
Playground avec un modèle sélectionné et une requête d’exemple terminée.Interface en anglais · données de démonstration illustratives. Ouvrez l’image pour la voir en taille réelle.

Chaque corps JSON ci-dessus peut aussi porter l'extension gateway sluis.remove, qui nomme les termes à pseudonymiser dans le prompt avant l'envoi. Elle est retirée avant que la requête ne quitte la gateway ; voir la Référence protection des données.

# Document OCR, billed per page. Returns pages[] markdown + usage_info.pages_processed.
# model "sluis/ocr" runs the gateway's own OCR engine: fully local, no provider egress (inline data: URLs only).
curl https://api.sluis.ai/v1/ocr \
  -H "Authorization: Bearer $SLUIS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "mistral/mistral-ocr-latest", "document": { "type": "document_url", "document_url": "https://example.com/invoice.pdf" } }'
# Document anonymization, billed per page/image. PII becomes «MERGE_TAG»s; images are blurred.
curl https://api.sluis.ai/v1/documents/anonymize \
  -H "Authorization: Bearer $SLUIS_KEY" \
  -F file=@contract.docx \
  -F 'options={ "entities": ["person_name", "email", "iban"], "remove": ["Project Nightingale"], "include_mapping": true }'
Playground Documents : importez un document à anonymiser.
Playground Documents : importez un document à anonymiser.Interface en anglais · données de démonstration illustratives. Ouvrez l’image pour la voir en taille réelle.

System One typed decisions

# The router behind sluis/auto: send state only, not questions.
curl https://api.sluis.ai/v1/systemone \
  -H "Authorization: Bearer $SLUIS_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"sluis/typed/router",
       "state":{"request":"Compare these two supplier contracts clause by clause and list the risks.",
                "previous":"Here are both contracts.",
                "attachments":["contract_a.pdf (application/pdf)","contract_b.pdf (application/pdf)"]}}'
Local-pack contractBehaviour
Model idssluis/typed answers your own questions on a local open model (GLiNER2.5-Decide). sluis/typed/router is the router Sluis uses for sluis/auto, with its own calibrated questions.
sluis/typed/routerSend the text a request carries: state.request (required), and optional previous, system and attachments (a string or a list of "name (mime)" strings); a plain string is the request. It answers reasoning (noul, P(needs multi-step reasoning)), complexity (score, 0 trivial to 3 hard, with legend and probabilities per level) and task (choice over code, writing, translation, extraction, document, support, smalltalk, action). decision holds the route and demand sluis/auto would take from this text alone, or null. Files, images, JSON mode, tools, prompt size and your organisation's policy are not part of this input and can change a real sluis/auto route. answers.reasoning keeps the keys it always had; the rest is additional.
Plain sluis/typedAlways answered on Sluis infrastructure, never by an outside provider. When the local model is unavailable the call returns 503. GET /v1/models lists it only when it can answer.
TypeSafeBring your own key only; no sluis/* alias reaches it. Name the model explicitly, for example typesafe/jev-latest. The normal gate applies: it is a US provider, so your residency policy must allow US.
AvailabilityEvery answer comes from verified model weights, reported as revision. If the local model is unavailable or cannot be verified, the call fails closed with 503.
StateRequired JSON object, list (array) or string, at most 128 KiB (131072 bytes) of serialized JSON before DLP. Missing or invalid state returns 422; oversized state returns 413. The open pack reads the first 384 words.
Questionssluis/typed/router supplies its own calibrated questions: any questions field, including null or an empty object, returns 400. Plain sluis/typed requires 1 to 16 questions of type noul, choice (2 to 20 options) or score (2 to 20 levels), each with instructions; missing questions return 422, a malformed set 400, more than 64 KiB 413. The characters [ ] ( ) and backticks are removed before the model reads them, so options that then collide return 400, as does a set longer than about 1,000 tokens.
ResponseJSON with model, answers and revision (weights SHA256); sluis/typed/router adds decision. Each answer has its type, its typed value (choice, score or noul), confidence and, where the pack reports them, probabilities, legend and answer_confidence. On sluis/typed gate on answer_confidence; its probabilities are uncalibrated. No chat completion or streaming envelope.
Latencysluis/typed/router usually answers well under 200 ms; when busy it returns 503 with Retry-After: 2. Plain sluis/typed runs all questions in one CPU pass: about 2 s for a prompt-sized state, up to about 7 s for a long one, with a 10 s budget.
Data protectionTenant DLP applies locally to the state and to the questions' instructions and criteria: block refuses; tokenize or mask rewrites what the pack is shown. Per-request removal terms are honoured.
ResidencyProcessed on Sluis infrastructure with no outside provider and no upstream residency routing step.
MeteringEach successful local decision is sealed and billed per input token at €0.01 per 1M tokens; output is free. The pack reports no token count, so input is estimated at about 4 characters per token over the state and questions it was shown. Normal limits, budgets and model allow-lists still apply.
AliasesAn existing tenant alias with the same name takes precedence over the local pack.

Documents en entrée

Joignez un PDF, un document Word, une image ou un fichier texte à une requête chat comme part de contenu "type": "file" portant une URL file_data en base64. N'importe quel modèle routé l'accepte : les fournisseurs qui comprennent nativement les parts de fichier les reçoivent inchangées, et pour tous les autres la passerelle convertit le document avant l'envoi. Les références file_id côté fournisseur ne sont pas résolues ; insérez les octets en file_data.

Les modèles avec vision reçoivent chaque page du PDF rendue comme part image_url (budget de 48 pages par requête, partagé entre tous les documents joints) ; les modèles sans entrée image reçoivent le texte extractible du document inséré comme texte de prompt, que l'analyse de protection des données couvre ensuite comme tout autre texte. Les documents plus longs ou plus lourds passent par /v1/ocr. Avec la politique dlp_documents activée, le document est anonymisé ou refusé avant que quoi que ce soit ne quitte la passerelle. Si elle est désactivée et que le mode DLP de l'organisation est protecteur (tokenize, mask ou block), les documents qui voyageraient comme images non inspectables sont refusés ; en allow_log ils passent avec un marqueur explicite « non analysé » dans le journal d'audit.

# Attach a document as an OpenAI-style `file` content part. The gateway
# normalizes it for the routed provider, so this works on any model.
curl https://api.sluis.ai/v1/chat/completions \
  -H "Authorization: Bearer $SLUIS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "scaleway/gemma-4-26b-a4b-it",
        "messages": [{ "role": "user", "content": [
          { "type": "file",
            "file": { "filename": "drawing.pdf",
                      "file_data": "data:application/pdf;base64,'"$(base64 -w0 drawing.pdf)"'" } },
          { "type": "text", "text": "Which discipline does this drawing document?" }
        ] }] }'

Streaming

Définissez stream: true et la réponse arrive sous forme de server-sent events : chaque frame est un delta chat.completion.chunk et le flux se termine par data: [DONE]. Les flux ne sont jamais mis en tampon dans la passerelle : ils la traversent en dérivation, et le sceau d'audit ainsi que le comptage se produisent même si le client raccroche tôt.

Demandez stream_options.include_usage et le frame final porte l'usage exact en tokens, les mêmes chiffres que la passerelle compte et facture.

Après 15 secondes sans frame, la passerelle écrit une ligne de commentaire SSE (: keepalive) entre les événements, afin que les proxys à délai d'inactivité gardent la connexion ouverte pendant qu'un modèle réfléchit ; les clients SSE l'ignorent. Les flux portent Cache-Control: no-cache et X-Accel-Buffering: no. Quand une réplique de la passerelle redémarre, elle continue de servir les flux ouverts jusqu'à cinq minutes ; un flux encore ouvert ensuite se termine par un événement d'erreur de code server_restarting : relancez alors la requête.

stream = client.chat.completions.create(
    model="mistral/mistral-large-latest",
    messages=[{"role": "user", "content": "Write a haiku"}],
    stream=True,
    stream_options={"include_usage": True},
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

Raisonnement

Passez le paramètre OpenAI reasoning_effort (minimal | low | medium | high) sur n'importe quel modèle capable de raisonnement. Sluis le traduit selon le fournisseur (le niveau de réflexion de Gemini, l'effort de réflexion adaptatif de Claude) et l'omet là où un modèle le rejetterait, de sorte qu'un seul paramètre fonctionne sur tout le catalogue.

resp = client.chat.completions.create(
    model="vertex/claude-opus-4-8",
    messages=[{"role": "user", "content": "Prove it step by step…"}],
    reasoning_effort="high",  # minimal | low | medium | high
)

Cache de prompt

Les préfixes de prompt répétés — un long prompt système, des définitions d'outils, une conversation qui grandit — peuvent être mis en cache chez le fournisseur : moins cher, plus rapide. Sluis parle les marqueurs standards du secteur : les blocs cache_control façon Anthropic (avec un TTL optionnel de 5m ou 1h) et le paramètre de premier niveau prompt_cache_key d'OpenAI. Envoyez-les sous une seule forme ; Sluis les traduit ou les retire selon le fournisseur, donc la même requête fonctionne sur tout le catalogue.

FournisseurComportement du cache de prompt
AnthropicPoints de rupture cache_control explicites sur les blocs système, le contenu des messages et les définitions d'outils, avec un TTL de 5m ou 1h. Lectures et écritures de cache sont rapportées séparément.
Bedrockcache_control est traduit en blocs cachePoint Converse dans system, messages et toolConfig — même requête, rien à réécrire de votre côté.
OpenAI · AzureMise en cache automatique des longs préfixes. Les marqueurs sont retirés ; un prompt_cache_key optionnel est transmis tel quel pour conserver l'affinité de cache.
Gemini · VertexAvec les modèles Gemini, la mise en cache est implicite côté fournisseur — rien à envoyer, et la part de tokens en cache rapportée est répercutée dans votre usage. Claude sur Vertex accepte cache_control explicite, TTL compris, exactement comme chez Anthropic.
xAI · DeepSeek · Mistral · Qwen · Moonshot · ZhipuAutomatique là où le fournisseur le propose. Les marqueurs explicites sont assainis, une requête écrite pour Claude n'est donc jamais rejetée ici.
Scaleway · customScaleway n'a pas de cache de prompt côté fournisseur : les directives y sont assainies et le levier est le cache de réponses de la passerelle. Un endpoint personnalisé reçoit les deux directives intactes — ce comportement relève du contrat de l'opérateur.

Le cache de prompt explicite s'active au niveau de l'organisation et reste désactivé par défaut : un préfixe mis en cache est une donnée au repos chez le fournisseur — filtrée d'abord par le DLP de Sluis, mais stockée hors de Sluis pendant la durée de vie du cache. Activez-le dans la vue Protection des données de la Console. Certains fournisseurs (OpenAI, Gemini, xAI, DeepSeek) mettent de toute façon en cache automatiquement dans leur propre infrastructure ; le commutateur ne régit que ce que Sluis transmet explicitement (cache_control, cachePoint, prompt_cache_key), pas le comportement interne du fournisseur. Sans votre propre clé pour un fournisseur, les appels passent par un identifiant Sluis partagé avec d'autres organisations : chez OpenAI et Azure, Sluis remplace votre prompt_cache_key par une clé dérivée de votre organisation, et chez tous les autres fournisseurs les compteurs de tokens en cache de votre usage affichent 0. La facturation applique toujours la remise de cache réelle.

Les lectures de cache sont facturées au tarif réduit du fournisseur ; les écritures de cache façon Anthropic ajoutent le supplément d'écriture du fournisseur au tarif d'entrée. Les deux sont visibles par appel dans le tiroir d'audit et totalisées dans Usage & budget. Avec une clé gérée par Sluis, une requête qui sélectionne un supplément que Sluis ne peut pas mesurer — un ttl cache_control autre que 5m là où le fournisseur l'applique (Anthropic, Bedrock, Claude sur Vertex), un service_tier autre que auto, default, flex ou standard_only, ou la bêta long contexte d'Anthropic (context-1m) — est refusée avec 400 avant tout envoi ; votre propre clé fournisseur transmet les trois sans modification.

Codes d'erreur

Les erreurs utilisent l'enveloppe d'erreur OpenAI ; la valeur error.type reflète le statut HTTP, si bien que la gestion d'erreurs de votre SDK continue de fonctionner sans changement.

CodeQuand
400 invalid_request_errorCorps de requête ou paramètres mal formés.
400 invalid_request_errorIdentifiant de modèle sans préfixe de fournisseur. Chaque identifiant appelable est provider/model, p. ex. mistral/mistral-large-latest ; le corps indique : model must be provider-prefixed.
400 invalid_request_errorLa requête porte l'en-tête x-sluis-dlp, supprimé. Les dérogations par requête ont été remplacées par les option overrides par workload ; configurez-les dans Console → Workloads.
401 authentication_errorClé API manquante ou inconnue.
402 insufficient_quotaAucun forfait actif ou budget atteint. Activez un forfait ou relevez le budget ; la requête n'atteint jamais un fournisseur.
403 permission_errorLa clé n'a pas la permission, par exemple le modèle ne figure pas sur sa liste d'autorisation.
422 invalid_request_errorRefusée avant l'envoi, par exemple la protection des données en mode block a détecté la requête.
422 document_too_large_to_scanUn document est trop volumineux pour le chemin emprunté : une page encore au-dessus du plafond de pixels de rendu à la résolution minimale d'analyse, ou un fichier au-dessus du plafond d'octets de l'extraction de texte. Les pages grand format (plans A0/A1) sont rendues réduites automatiquement ; ce code dédié permet au client de réduire ou de scinder le document et de le renvoyer.
429 rate_limit_errorLimite de débit atteinte. Appliquée à la passerelle ; la requête n'atteint jamais un fournisseur.
403 permission_errorBloquée par la politique de résidence : aucune juridiction autorisée ne sert la requête. Le corps inclut le motif.
403 scope_violationRefusée par le garde de périmètre du workload en mode block : l’appel sort du périmètre défini pour ce workload. Le message donne la raison du garde, et la requête n’atteint jamais un fournisseur.
503 pdf_renderer_unavailableUn PDF en ligne devait être envoyé sous forme d'images de pages car le modèle routé accepte l'entrée image, mais ce déploiement n'a pas de moteur de rendu PDF. La requête est refusée plutôt que traitée en silence à partir du texte extrait, ce qui écarterait tout ce que montre un plan ou un scan.
503 scope_guard_unavailableLe garde de périmètre du workload est en mode block mais n’a pas pu rendre de verdict : l’appel est refusé plutôt que laissé passer. Réessayez avec un délai croissant.
503 auth_unavailableDe gateway kon de sleutelopslag niet lezen en de sleutel dus niet verifiëren. De sleutel is niet ongeldig verklaard; probeer opnieuw met backoff en respecteer Retry-After.
504 api_errorLe fournisseur n’a pas répondu dans le délai de réponse du workload : 300 secondes sauf si le workload fixe entre 10 et 600, moins si la requête envoie x-sluis-upstream-timeout. error.sluis.cause vaut timeout. La passerelle n’a pas rejoué l’appel, car le fournisseur peut encore le traiter ; raccourcissez le prompt ou demandez un délai plus long avant de renvoyer.
5xx api_errorDéfaillance du fournisseur en amont après plusieurs tentatives ; le disjoncteur détourne le trafic des fournisseurs défaillants. Le corps reprend le message du fournisseur lui-même, accompagné d'un objet error.sluis qui nomme la cause et chaque tentative effectuée, avec son statut amont ou son erreur de transport et sa durée.
{
  "error": {
    "message": "model must be provider-prefixed, e.g. mistral/mistral-large-latest",
    "type": "invalid_request_error",
    "param": null,
    "code": "invalid_request"
  }
}

API Anthropic Messages

Sluis parle nativement l'API Anthropic Messages. Pointez Claude Code ou n'importe quel SDK Anthropic vers la passerelle et appelez POST /v1/messages : la requête est traduite vers la forme interne, franchit exactement le même pipeline Inspect → Route → Seal → Meter que tout autre appel, puis revient traduite au format Anthropic, streaming compris. /anthropic/v1/messages est le chemin préfixé, sans ambiguïté, vers le même gestionnaire.

Authentification

Envoyez votre clé Sluis dans l'en-tête x-api-key d'Anthropic ou dans l'en-tête habituel Authorization: Bearer ; les deux sont acceptés. L'en-tête anthropic-version est lu mais jamais exigé, et seule sa forme est validée. L'analyse est délibérément ouverte : champs de corps inconnus, types de bloc de contenu inconnus, valeurs anthropic-beta inconnues et la requête ?beta=true envoyée par Claude Code sont tolérés plutôt que refusés. Les drapeaux beta voyagent octet par octet vers les upstreams de la famille Anthropic et sont ignorés partout ailleurs.

Endpoints

EndpointRôle
POST /v1/messagesMessages, en tampon ou en streaming · prompts système en chaîne ou en blocs, outils et résultats d'outils (y compris les résultats d'erreur et les blocs d'image qu'ils contiennent), images, blocs document, blocs thinking et redacted_thinking de l'historique, et marqueurs cache_control à chaque position cachable.
POST /v1/messages/count_tokensEstimation locale de tokens pour la gestion de contexte du SDK : rien n'est envoyé, conservé ni facturé.
GET /v1/models · GET /v1/models/{id}Découverte native des modèles à la forme Anthropic (data, has_more, first_id, last_id, display_name, created_at, curseurs before_id/after_id/limit au mieux), servie depuis le catalogue en mémoire sans passer par la base. Sur le chemin racine, cette forme est choisie par l'en-tête anthropic-version — sans lui, vous obtenez la forme OpenAI ; sous /anthropic elle s'applique toujours. Les ids restent des ids provider/model appelables dans Sluis, et created_at est un espace réservé fixe, car le catalogue ne connaît pas la date de sortie de chaque modèle.
HEAD /api/helloLa sonde de préchauffage que Claude Code envoie avant une session · HEAD uniquement, répondue par 200 avec un corps vide.

Routage du modèle

Le format de transport ne restreint jamais le modèle : l'entrée est un codec, et l'id du modèle décide de la route. Un id nu comme claude-sonnet-5 se résout via le fournisseur par défaut de cette entrée — anthropic sauf si votre organisation le pointe ailleurs, par exemple vertex pour Claude en UE — après quoi la porte de résidence décide toujours si cette cible peut servir la requête. Épinglez une cible explicitement avec un id préfixé par le fournisseur (vertex/claude-opus-4-8) ou passez un alias sluis/* : un outil sur le SDK Anthropic tourne alors sur n'importe quel fournisseur raccordé, dans les limites de votre politique.

Streaming

Avec "stream": true, la réponse est la grammaire d'événements Anthropic complète : message_start avec le vrai nombre de tokens d'entrée, content_block_start / content_block_delta / content_block_stop par bloc, message_delta avec l'usage cumulé, tokens de lecture et de création de cache compris, puis message_stop. Le texte arrive en text_delta, les arguments d'outil en input_json_delta et le raisonnement en thinking_delta plus signature_delta lorsque le fournisseur routé les a produits. Un événement ping suit message_start et se répète après environ 15 secondes de silence en amont, de sorte qu'un tour de réflexion long ne déclenche jamais le chien de garde du client, et une panne en cours de flux est réencodée en événement error au lieu d'un flux tronqué. stop_sequence porte la séquence trouvée lorsque la réponse vient d'un fournisseur de la famille Anthropic, et vaut null sinon.

# native Anthropic Messages — the model id owns the route, not the wire format
curl https://api.sluis.ai/v1/messages \
  -H "x-api-key: $SLUIS_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{ "model": "vertex/claude-opus-4-8",
        "max_tokens": 256,
        "system": "Be concise.",
        "messages": [{ "role": "user", "content": "Say hi" }] }'

# /anthropic/v1/messages is the unambiguous prefixed path for the same handler

Erreurs

Toute erreur sur ces chemins utilise l'enveloppe d'Anthropic — un "type": "error" de premier niveau avec le type d'erreur du fournisseur (invalid_request_error, authentication_error, billing_error, permission_error, not_found_error, conflict_error, request_too_large, rate_limit_error, api_error, overloaded_error) — y compris les refus qui n'atteignent jamais un modèle, comme une clé inconnue ou un blocage de la protection des données. L'id de requête de la passerelle figure dans l'en-tête request-id de la réponse et dans le champ request_id du corps, et c'est le même id qui identifie l'appel dans la piste d'audit.

# every failure on /v1/messages* is Anthropic-shaped — auth and
# data-protection refusals included, never an OpenAI envelope
{
  "type": "error",
  "error": {
    "type": "rate_limit_error",
    "message": "rate limit exceeded"
  },
  "request_id": "req_9f2e…"
}

Un champ de requête est refusé au lieu d'être relayé : mcp_servers renvoie 400 invalid_request_error. Un modèle qui appellerait lui-même un serveur MCP externe se situerait hors de la porte Sluis ; déclarez donc le serveur dans la Console et utilisez la passerelle MCP sur /v1/mcp, où chaque appel d'outil est inspecté, routé, scellé et facturé.

Matrice de compatibilité

Ce que les entrées natives couvrent aujourd'hui, endpoint par endpoint. Ce tableau est l'engagement : ce qui n'y figure pas comme pris en charge est sur la feuille de route, refusé volontairement ou relève d'une autre surface produit — jamais sous-entendu.

AnthropicStatutRemarques
POST /v1/messages✓ natifEn tampon et en streaming, outils, images, blocs document, aller-retour du thinking et marqueurs de cache de prompt.
POST /v1/messages/count_tokens✓ estimation localeRépondu localement ; rien n'est envoyé.
GET /v1/models · /v1/models/{id}✓ natifForme native list et get depuis le catalogue en mémoire ; négociée par en-tête sur le chemin racine, toujours active sous /anthropic.
HEAD /api/hello✓La sonde de préchauffage de Claude Code, HEAD uniquement.
Message Batches✗ feuille de routeMessage Batches n'est pas implémenté ; le travail par lots passe aujourd'hui par des appels live ordinaires.
Files✗ feuille de routeL'API Files n'est pas raccordée ; les blocs document en ligne et file_data couvrent le chemin courant.
mcp_servers✗ refuséRefusé avec 400 au lieu d'être relayé — déclarez le serveur et appelez la passerelle MCP de Sluis sur /v1/mcp.
Skills · Agents · Admin✗ hors périmètreSkills, les agents gérés et les API d'administration, d'usage et de coûts relèvent d'une autre surface produit, pas de la compatibilité d'inférence.

Routage entre protocoles. Les champs propres à un fournisseur survivent tant que la requête atterrit chez un fournisseur qui parle le même protocole : une requête Anthropic servie par un fournisseur de la famille Anthropic conserve ses blocs thinking, ses marqueurs de cache, ses drapeaux beta et la stop_sequence trouvée. Routée vers un autre protocole, ces champs tombent à l'envoi — jamais un refus à l'entrée — et la ligne d'audit consigne à la fois le format de transport et le fournisseur retenu : toute dégradation est donc attribuable. Les valeurs opaques ne sont jamais réécrites : les signatures du thinking et les charges redacted_thinking sont transmises à l'identique ou pas du tout, et c'est aussi pourquoi un bloc thinking mis de côté que l'analyse de protection des données signale est écarté plutôt que masqué — un bloc réécrit porterait une signature invalide.