Vai al contenuto

Riferimento API

Autenticazione, endpoint, streaming, reasoning ed errori sulla superficie OpenAI, API native Anthropic e matrice di compatibilità per endpoint.

Autenticazione

Ogni richiesta a /v1/* si autentica con una chiave virtuale nell'header Authorization: Bearer. Genera le chiavi nella Console; il segreto viene mostrato una volta e ne viene memorizzato solo l'hash. Una chiave autentica un workload. Il workload gestisce limiti, budget, modelli consentiti e deroghe; le richieste restano soggette alla policy dell'organizzazione.

Una richiesta il cui modello non è nella lista di consentiti non vuota del workload viene rifiutata con un 403 permission_error sigillato prima che venga inoltrato alcunché; il rifiuto stesso finisce nella catena di audit.

Generare una chiave di produzione richiede un indirizzo email verificato.

Credenziali del workload: gestisci le chiavi API e le impostazioni di accesso.
Credenziali del workload: gestisci le chiavi API e le impostazioni di accesso.Interfaccia in inglese · dati dimostrativi illustrativi. Apri l’immagine a dimensione intera.
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

Endpoint

Sluis espone la superficie compatibile OpenAI qui sotto, oltre ai percorsi nativi Anthropic descritti più avanti. Gli endpoint senza un handler di prima classe vengono inoltrati alla lettera al provider instradato, streaming incluso, così gli upstream compatibili OpenAI mantengono piena fedeltà. Un browser che apre un percorso che l’API non serve, come l’host API senza percorso, viene reindirizzato a questa documentazione; i client API ricevono comunque un semplice 404.

EndpointScopo
POST /v1/chat/completionsChat completions, la superficie principale: instradamento, protezione dei dati, caching, streaming.
POST /v1/completionsText completions legacy.
POST /v1/embeddingsEmbedding.
POST /v1/moderationsClassificazione di moderazione.
POST /v1/responsesL'API Responses di OpenAI.
POST /v1/systemoneNative System One typed decisions, not OpenAI chat messages.
POST /v1/ocrOCR di documenti (Mistral, o completamente locale con il modello sluis/ocr) · fatturato a pagina. Con la policy dlp_documents attiva, i documenti inline vengono anonimizzati prima di uscire.
POST /v1/documents/anonymizeAnonimizzazione di documenti · i PII diventano «MERGE_TAG», le immagini vengono sfocate · fatturato per pagina/immagine.
POST /v1/documents/anonymize/jobsJob di anonimizzazione asincroni · accoda documenti grandi, controlla lo stato e scarica il risultato con un URL firmato a tempo senza chiave API.
GET /v1/modelsI modelli che la tua policy e le tue credenziali possono davvero raggiungere, niente di ipotetico.
GET /v1/models/{id}I metadati di un modello.
POST /v1/audio/*Trascrizione, traduzione, voce · inoltrato al provider instradato.
POST /v1/images/*Generazione e modifica di immagini · inoltrato. mistral/image-generation fa eccezione: Mistral offre la generazione di immagini solo tramite il suo connettore agent, quindi il gateway traduce la richiesta OpenAI e risponde in b64_json, fatturato per immagine.
POST /v1/video/generationsGenerazione di video · inoltrato.
/v1/filesOperazioni sui file · inoltrato con la chiave propria della tua organizzazione (BYOK o provider personalizzato), mai con chiavi gestite.
POST /v1/messagesIngresso nativo Anthropic Messages · punta qualsiasi tool con SDK Anthropic verso Sluis; qualsiasi modello connesso.
POST /v1/messages/count_tokensStima locale dei token per la gestione del contesto dell'SDK Anthropic; non viene inviato nulla.
GET /anthropic/v1/modelsDiscovery nativa dei modelli Anthropic · list e get nella forma Anthropic, dal catalogo in-process. Su /v1/models la stessa forma è scelta dall'header anthropic-version.
HEAD /api/helloSonda di riscaldamento per i client dell'SDK Anthropic come Claude Code · 200 con corpo vuoto.
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 con un modello selezionato e una richiesta di esempio completata.
Playground con un modello selezionato e una richiesta di esempio completata.Interfaccia in inglese · dati dimostrativi illustrativi. Apri l’immagine a dimensione intera.

Ogni body JSON qui sopra può portare anche l'estensione della gateway sluis.remove, che nomina i termini da pseudonimizzare nel prompt prima dell'invio. Viene rimossa prima che la richiesta lasci la gateway; vedi il riferimento Protezione dei dati.

# 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: carica un documento da anonimizzare.
Playground Documents: carica un documento da anonimizzare.Interfaccia in inglese · dati dimostrativi illustrativi. Apri l’immagine a dimensione intera.

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.

Documenti in input

Allega un PDF, un documento Word, un'immagine o un file di testo a una richiesta chat come parte di contenuto "type": "file" con una URL file_data in base64. Qualsiasi modello instradato la accetta: i provider che capiscono nativamente le parti file le ricevono invariate, e per tutti gli altri il gateway converte il documento prima dell'invio. I riferimenti file_id lato provider non vengono risolti; includi i byte come file_data.

I modelli con visione ricevono ogni pagina del PDF renderizzata come parte image_url (budget di 48 pagine per richiesta, condiviso tra tutti i documenti allegati); i modelli senza input immagine ricevono il testo estraibile del documento inserito come testo del prompt, che la scansione di protezione dei dati copre poi come ogni altro testo. I documenti più lunghi o pesanti vanno su /v1/ocr. Con la policy dlp_documents attiva, il documento viene anonimizzato o rifiutato prima che qualcosa lasci il gateway. Se è disattivata e la modalità DLP dell'organizzazione è protettiva (tokenize, mask o block), i documenti che viaggerebbero come immagini non ispezionabili vengono rifiutati; con allow_log passano con un marcatore esplicito di non analizzato nel registro di 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

Imposta stream: true e la risposta arriva come server-sent events: ogni frame è un delta chat.completion.chunk e lo stream termina con data: [DONE]. Gli stream non vengono mai bufferizzati nel gateway: lo attraversano in tee, e il sigillo di audit e la misurazione avvengono anche se il client si disconnette in anticipo.

Richiedi stream_options.include_usage e il frame finale porta l'uso esatto dei token, gli stessi numeri che il gateway misura e fattura.

Dopo 15 secondi senza frame il gateway scrive una riga di commento SSE (: keepalive) tra gli eventi, così i proxy con timeout di inattività tengono aperta la connessione mentre un modello ragiona; i client SSE la ignorano. Gli stream portano Cache-Control: no-cache e X-Accel-Buffering: no. Quando una replica del gateway si riavvia continua a servire gli stream aperti fino a cinque minuti; uno stream ancora aperto dopo termina con un evento di errore con codice server_restarting, quindi riprova la richiesta.

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="")

Ragionamento

Passa il parametro OpenAI reasoning_effort (minimal | low | medium | high) su qualsiasi modello capace di ragionamento. Sluis lo traduce per provider (il thinking level di Gemini, l'adaptive thinking effort di Claude) e lo omette dove un modello lo rifiuterebbe, così un solo parametro funziona su tutto il catalogo.

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 dei prompt

I prefissi di prompt ripetuti — un lungo system prompt, le definizioni degli strumenti, una conversazione che cresce — possono essere messi in cache dal provider: costano meno e rispondono prima. Sluis parla i marcatori standard del settore: blocchi cache_control in stile Anthropic (con TTL opzionale di 5m o 1h) e il parametro di primo livello prompt_cache_key di OpenAI. Inviali in una sola forma; Sluis li traduce o li rimuove in base al provider, così la stessa richiesta funziona su tutto il catalogo.

ProviderComportamento della cache dei prompt
AnthropicBreakpoint cache_control espliciti su blocchi di sistema, contenuto dei messaggi e definizioni degli strumenti, con TTL di 5m o 1h. Letture e scritture di cache sono riportate separatamente.
Bedrockcache_control viene tradotto in blocchi cachePoint di Converse in system, messages e toolConfig: stessa richiesta, nessuna riscrittura da parte tua.
OpenAI · AzureCache automatica sui prefissi lunghi. I marcatori vengono rimossi; un prompt_cache_key opzionale è inoltrato tale e quale per mantenere l'affinità di cache.
Gemini · VertexCon i modelli Gemini la cache è implicita dentro il provider: niente da inviare, e la quota di token in cache riportata viene ribaltata sul tuo consumo. Claude su Vertex accetta cache_control esplicito, TTL compreso, esattamente come su Anthropic.
xAI · DeepSeek · Mistral · Qwen · Moonshot · ZhipuAutomatica dove il provider la offre. I marcatori espliciti vengono ripuliti, così una richiesta scritta per Claude non viene mai rifiutata qui.
Scaleway · customScaleway non ha cache dei prompt lato provider: lì le direttive vengono ripulite e la leva è la cache delle risposte del gateway. Un endpoint personalizzato riceve entrambe le direttive intatte: quel comportamento è contratto dell'operatore.

La cache dei prompt esplicita è opt-in a livello di organizzazione e disattivata per default: un prefisso in cache è un dato a riposo presso il provider — prima filtrato dal DLP di Sluis, ma conservato fuori da Sluis per il TTL della cache. Attivala in Console → Protezione dei dati. Alcuni provider (OpenAI, Gemini, xAI, DeepSeek) mettono comunque in cache automaticamente nella propria infrastruttura; l'interruttore governa solo ciò che Sluis inoltra esplicitamente (cache_control, cachePoint, prompt_cache_key), non il comportamento interno del provider. Senza una chiave propria per un provider, le chiamate usano una credenziale Sluis condivisa con altre organizzazioni: su OpenAI e Azure Sluis sostituisce il tuo prompt_cache_key con uno derivato dalla tua organizzazione, e su tutti gli altri provider i contatori dei token in cache nel tuo consumo mostrano 0. La fatturazione applica comunque lo sconto di cache reale.

Le letture dalla cache sono fatturate alla tariffa ridotta del provider; le scritture in cache in stile Anthropic aggiungono il sovrapprezzo di scrittura del provider alla tariffa di input. Entrambe sono visibili per chiamata nel drawer di audit e sommate in Utilizzo e budget. Con una chiave gestita da Sluis, una richiesta che seleziona un sovrapprezzo che Sluis non può misurare — un ttl di cache_control diverso da 5m dove il provider lo applica (Anthropic, Bedrock, Claude su Vertex), un service_tier diverso da auto, default, flex o standard_only, o la beta a contesto lungo di Anthropic (context-1m) — viene rifiutata con 400 prima di qualsiasi invio; la tua chiave del provider inoltra tutti e tre invariati.

Codici di errore

Gli errori usano l'envelope di errore di OpenAI; il valore error.type rispecchia lo stato HTTP, così la gestione degli errori del tuo SDK continua a funzionare invariata.

CodiceQuando
400 invalid_request_errorCorpo della richiesta o parametri malformati.
400 invalid_request_errorId del modello senza prefisso del provider. Ogni id richiamabile è provider/model, ad es. mistral/mistral-large-latest; il body riporta: model must be provider-prefixed.
400 invalid_request_errorLa richiesta porta l'header x-sluis-dlp, rimosso. Le deroghe per richiesta sono state sostituite dagli option overrides per workload; configurali in Console → Workload.
401 authentication_errorChiave API mancante o sconosciuta.
402 insufficient_quotaNessun piano attivo o budget raggiunto. Attiva un piano o alza il budget; la richiesta non raggiunge mai un provider.
403 permission_errorLa chiave non ha il permesso, ad esempio il modello non è nella sua lista di consentiti.
422 invalid_request_errorRifiutata prima dell'inoltro, ad esempio la protezione dei dati in modalità block ha trovato corrispondenza nella richiesta.
422 document_too_large_to_scanUn documento è troppo grande per il percorso che ha preso: una pagina che supera il tetto di pixel di rendering anche alla risoluzione minima di scansione, o un file oltre il tetto di byte dell'estrazione del testo. Le pagine di grande formato (disegni A0/A1) vengono renderizzate ridotte automaticamente; il codice dedicato consente al client di rimpicciolire o dividere il documento e rinviarlo.
429 rate_limit_errorRate limit raggiunto. Applicato al gateway; la richiesta non raggiunge mai un provider.
403 permission_errorBloccata dalla policy di residenza: nessuna giurisdizione consentita serve la richiesta. Il body include il motivo.
403 scope_violationRifiutata dal controllo del perimetro del workload in modalità block: la chiamata esce dal perimetro definito per quel workload. Il messaggio riporta il motivo del controllo e la richiesta non raggiunge mai un provider.
503 pdf_renderer_unavailableUn PDF inline doveva essere inviato come immagini di pagina perché il modello instradato accetta input immagine, ma questo deployment non ha un renderer PDF. Viene rifiutato anziché risolto in silenzio dal testo estratto, che scarterebbe tutto ciò che un disegno o una scansione mostrano.
503 scope_guard_unavailableIl controllo del perimetro del workload è in modalità block ma non è riuscito a esprimere un verdetto, quindi la chiamata viene rifiutata invece di passare. Riprova con backoff.
503 auth_unavailableLa pasarela no pudo leer su almacén de claves y por tanto no pudo verificar la clave. La clave no se considera inválida; reintente con espera creciente y respete Retry-After.
504 api_errorIl provider non ha risposto entro il tempo di risposta del workload: 300 secondi salvo che il workload imposti da 10 a 600, meno se la richiesta invia x-sluis-upstream-timeout. error.sluis.cause è timeout. Il gateway non ha ripetuto la chiamata perché il provider potrebbe ancora elaborarla; accorcia il prompt o chiedi un tempo più lungo prima di reinviarla.
5xx api_errorErrore del provider upstream dopo i retry; il circuit breaker devia il traffico attorno ai provider non integri. Il body riporta il messaggio del provider stesso insieme a un oggetto error.sluis che indica la causa e ogni tentativo eseguito, con il suo stato upstream o errore di trasporto e la sua durata.
{
  "error": {
    "message": "model must be provider-prefixed, e.g. mistral/mistral-large-latest",
    "type": "invalid_request_error",
    "param": null,
    "code": "invalid_request"
  }
}

Anthropic Messages API

Sluis parla nativamente l'Anthropic Messages API. Punta Claude Code o qualsiasi SDK Anthropic sul gateway e chiama POST /v1/messages: la richiesta viene tradotta nella forma interna, attraversa esattamente la stessa pipeline Inspect → Route → Seal → Meter di ogni altra chiamata e torna tradotta nel formato Anthropic, streaming incluso. /anthropic/v1/messages è il percorso con prefisso, non ambiguo, verso lo stesso handler.

Autenticazione

Invia la tua chiave Sluis nell'header x-api-key di Anthropic oppure nel consueto header Authorization: Bearer; entrambi sono accettati. L'header anthropic-version viene letto ma non è mai obbligatorio, e ne viene validata solo la forma. Il parsing è deliberatamente aperto: campi del body sconosciuti, tipi di blocco sconosciuti, valori anthropic-beta sconosciuti e la query ?beta=true che invia Claude Code sono tollerati invece di essere rifiutati. I flag beta viaggiano byte per byte verso gli upstream della famiglia Anthropic e sono ignorati altrove.

Endpoint

EndpointScopo
POST /v1/messagesMessages, in buffer o in streaming · prompt di sistema come stringa o blocchi, tool e risultati dei tool (compresi i risultati di errore e i blocchi immagine al loro interno), immagini, blocchi documento, blocchi thinking e redacted_thinking della cronologia e marcatori cache_control su ogni posizione memorizzabile in cache.
POST /v1/messages/count_tokensStima locale dei token per la gestione del contesto nell'SDK: non viene inviato, conservato né contabilizzato nulla.
GET /v1/models · GET /v1/models/{id}Discovery nativa dei modelli nella forma Anthropic (data, has_more, first_id, last_id, display_name, created_at, cursori before_id/after_id/limit nei limiti del possibile), servita dal catalogo in-process senza toccare il database. Sul percorso radice questa forma è scelta dall'header anthropic-version — senza di esso ottieni la forma OpenAI; sotto /anthropic vale sempre. Gli id restano id provider/model richiamabili in Sluis e created_at è un segnaposto fisso, perché il catalogo non conosce la data di rilascio dei singoli modelli.
HEAD /api/helloLa sonda di riscaldamento che Claude Code invia prima di una sessione · solo HEAD, risposta 200 con corpo vuoto.

Instradamento del modello

Il formato di trasporto non limita mai il modello: l'ingresso è un codec e l'id del modello decide la rotta. Un id nudo come claude-sonnet-5 si risolve tramite il provider predefinito di questo ingresso — anthropic se la tua organizzazione non lo punta altrove, per esempio vertex per Claude nell'UE — dopo di che il gate di residenza decide comunque se quel target può servire la richiesta. Fissa un target esplicitamente con un id prefissato dal provider (vertex/claude-opus-4-8) oppure passa un alias sluis/*: uno strumento sull'SDK Anthropic gira allora su qualsiasi provider collegato, dentro la tua policy.

Streaming

Con "stream": true la risposta è l'intera grammatica di eventi Anthropic: message_start con il conteggio reale dei token di input, content_block_start / content_block_delta / content_block_stop per ogni blocco, message_delta con l'uso cumulativo compresi i token di lettura e creazione della cache, poi message_stop. Il testo arriva come text_delta, gli argomenti dei tool come input_json_delta e il ragionamento come thinking_delta più signature_delta quando il provider instradato li ha prodotti. Un evento ping segue message_start e si ripete dopo circa 15 secondi di silenzio dell'upstream, così un turno di ragionamento lungo non fa mai scattare il watchdog del client, e un guasto a metà stream viene ricodificato come evento error invece di uno stream troncato. stop_sequence riporta la sequenza corrispondente quando la risposta arriva da un provider della famiglia Anthropic, altrimenti è null.

# 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

Errori

Ogni errore su questi percorsi usa la busta di Anthropic — un "type": "error" di primo livello con il tipo di errore del fornitore (invalid_request_error, authentication_error, billing_error, permission_error, not_found_error, conflict_error, request_too_large, rate_limit_error, api_error, overloaded_error) — compresi i rifiuti che non raggiungono mai un modello, come una chiave sconosciuta o un blocco della protezione dati. L'id di richiesta del gateway è sulla risposta come header request-id e nel campo request_id del body, ed è lo stesso id che identifica la chiamata nella traccia di 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 campo della richiesta viene rifiutato invece di essere inoltrato: mcp_servers restituisce 400 invalid_request_error. Un modello che chiama direttamente un server MCP esterno starebbe fuori dal gate di Sluis, quindi registra il server nella Console e usa il gateway MCP su /v1/mcp, dove ogni chiamata a un tool è ispezionata, instradata, sigillata e contabilizzata.

Matrice di compatibilità

Ciò che gli ingressi nativi coprono oggi, endpoint per endpoint. Questa tabella è la dichiarazione: quello che qui non risulta supportato è in roadmap, rifiutato di proposito o appartiene a un'altra superficie di prodotto — mai sottinteso.

AnthropicStatoNote
POST /v1/messages✓ nativoIn buffer e in streaming, tool, immagini, blocchi documento, round-trip del thinking e marcatori di cache dei prompt.
POST /v1/messages/count_tokens✓ stima localeRisposta locale; non viene inviato nulla.
GET /v1/models · /v1/models/{id}✓ nativoForma nativa di list e get dal catalogo in-process; negoziata dall'header sul percorso radice, sempre attiva sotto /anthropic.
HEAD /api/hello✓La sonda di riscaldamento di Claude Code, solo HEAD.
Message Batches✗ roadmapLe Message Batches non sono implementate; oggi il lavoro in batch gira come normali chiamate live.
Files✗ roadmapL'API Files non è collegata; i blocchi documento inline e file_data coprono il percorso comune.
mcp_servers✗ rifiutatoRifiutato con 400 invece di essere inoltrato — registra il server e chiama il gateway MCP di Sluis su /v1/mcp.
Skills · Agents · Admin✗ fuori perimetroSkills, agenti gestiti e le API di amministrazione, uso e costi sono un'altra superficie di prodotto, non compatibilità di inferenza.

Instradamento tra protocolli. I campi specifici di un fornitore sopravvivono finché la richiesta atterra su un provider che parla lo stesso protocollo: una richiesta Anthropic servita da un provider della famiglia Anthropic conserva i blocchi thinking, i marcatori di cache, i flag beta e la stop_sequence corrispondente. Instradata verso un altro protocollo, quei campi cadono al dispatch — mai un rifiuto all'ingresso — e la riga di audit registra sia il formato di trasporto sia il provider risolto, così ogni perdita è attribuibile. I valori opachi non vengono mai riscritti: le firme del thinking e i payload redacted_thinking sono inoltrati alla lettera o non del tutto, ed è anche il motivo per cui un blocco thinking parcheggiato che la scansione di protezione dati segnala viene scartato invece di essere mascherato — un blocco riscritto porterebbe una firma non valida.