Zum Inhalt springen

API-Referenz

Authentifizierung, Endpoints, Streaming, Reasoning und Fehler auf der OpenAI-Oberfläche, die nativen Anthropic-APIs und die Kompatibilitätsmatrix pro Endpoint.

Authentifizierung

Jede Anfrage an /v1/* authentifiziert sich mit einem virtuellen Key im Header Authorization: Bearer. Erzeugen Sie Keys in der Console; das Secret wird einmal angezeigt und nur sein Hash gespeichert. Ein Key authentifiziert einen Workload. Der Workload verwaltet Rate-Limits, Budget, erlaubte Modelle und Policy-Overrides; Anfragen unterliegen weiterhin der Organisations-Policy.

Eine Anfrage, deren Modell nicht auf der nicht leeren Allow-List des Workloads steht, wird mit einem versiegelten 403 permission_error abgewiesen, bevor irgendetwas versendet wird; die Abweisung selbst landet in der Audit-Kette.

Das Erzeugen eines Produktions-Keys erfordert eine verifizierte E-Mail-Adresse.

Workload-Zugangsdaten: Verwalten Sie API-Keys und ihre Zugriffseinstellungen.
Workload-Zugangsdaten: Verwalten Sie API-Keys und ihre Zugriffseinstellungen.Englische Oberfläche · illustrative Demodaten. Öffnen Sie das Bild in voller Größe.
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

Endpunkte

Sluis stellt die unten stehende OpenAI-kompatible Oberfläche bereit, dazu die weiter unten beschriebenen nativen Anthropic-Pfade. Endpunkte ohne First-Class-Handler werden unverändert an den gerouteten Anbieter weitergereicht, Streaming inbegriffen, sodass OpenAI-kompatible Upstreams volle Fidelität behalten. Ein Browser, der einen Pfad öffnet, den die API nicht bedient, etwa den bloßen API-Host, wird zu dieser Dokumentation weitergeleitet; API-Clients erhalten weiterhin ein schlichtes 404.

EndpunktZweck
POST /v1/chat/completionsChat Completions, die primäre Oberfläche: Routing, Datenschutz, Caching, Streaming.
POST /v1/completionsLegacy-Text-Completions.
POST /v1/embeddingsEmbeddings.
POST /v1/moderationsModerations-Klassifikation.
POST /v1/responsesDie OpenAI Responses API.
POST /v1/systemoneNative System One typed decisions, not OpenAI chat messages.
POST /v1/ocrDokument-OCR (Mistral, oder vollständig lokal mit dem Modell sluis/ocr) · pro Seite abgerechnet. Mit aktiver dlp_documents-Policy werden Inline-Dokumente vor dem Versand anonymisiert.
POST /v1/documents/anonymizeDokument-Anonymisierung · PII werden zu «MERGE_TAG»s, Bilder werden unkenntlich gemacht · pro Seite/Bild abgerechnet.
POST /v1/documents/anonymize/jobsAsynchrone Anonymisierungs-Jobs · große Dokumente einreihen, Status abfragen, Ergebnis über eine zeitlich begrenzte signierte URL ohne API-Schlüssel abholen.
GET /v1/modelsDie Modelle, die Ihre Policy und Ihre Zugangsdaten tatsächlich erreichen können, nichts Hypothetisches.
GET /v1/models/{id}Die Metadaten eines Modells.
POST /v1/audio/*Transkription, Übersetzung, Sprache · an den gerouteten Anbieter weitergereicht.
POST /v1/images/*Bildgenerierung und -bearbeitung · weitergereicht. Ausnahme ist mistral/image-generation: Mistral bietet Bildgenerierung nur über seinen Agent-Connector an, das Gateway übersetzt die OpenAI-Anfrage daher und antwortet mit b64_json, abgerechnet pro Bild.
POST /v1/video/generationsVideogenerierung · weitergereicht.
/v1/filesDateioperationen · weitergereicht mit dem eigenen Key Ihrer Organisation (BYOK oder eigener Anbieter), nie mit verwalteten Keys.
POST /v1/messagesNativer Anthropic-Messages-Ingress · richten Sie jedes Anthropic-SDK-Tool auf Sluis; jedes verbundene Modell.
POST /v1/messages/count_tokensLokale Token-Schätzung für das Kontextmanagement des Anthropic SDK; nichts wird versendet.
GET /anthropic/v1/modelsNative Anthropic-Modell-Discovery · list und get in Anthropics Form, aus dem In-Process-Katalog. Auf /v1/models wählt der anthropic-version-Header dieselbe Form.
HEAD /api/helloAufwärm-Probe für Anthropic-SDK-Clients wie Claude Code · 200 mit leerem Body.
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 mit ausgewähltem Modell und abgeschlossener Beispielanfrage.
Playground mit ausgewähltem Modell und abgeschlossener Beispielanfrage.Englische Oberfläche · illustrative Demodaten. Öffnen Sie das Bild in voller Größe.

Jeder JSON-Body oben darf zusätzlich die gateway-Erweiterung sluis.remove tragen, die Begriffe benennt, die vor dem Versand aus dem Prompt pseudonymisiert werden müssen. Sie wird entfernt, bevor die Anfrage die gateway verlässt; siehe die Datenschutz-Referenz.

# 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: Laden Sie ein Dokument zur Anonymisierung hoch.
Playground Documents: Laden Sie ein Dokument zur Anonymisierung hoch.Englische Oberfläche · illustrative Demodaten. Öffnen Sie das Bild in voller Größe.

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.

Dokumente als Eingabe

Hängen Sie ein PDF, Word-Dokument, Bild oder eine Textdatei als Content-Part "type": "file" mit einer base64-file_data-Daten-URL an eine Chat-Anfrage an. Jedes geroutete Modell akzeptiert das: Anbieter, die File-Parts nativ verstehen, erhalten sie unverändert, und für alle anderen konvertiert das Gateway das Dokument vor dem Versand. Anbieterseitige file_id-Referenzen werden nicht aufgelöst; betten Sie die Bytes als file_data ein.

Modelle mit Bildeingabe erhalten jede PDF-Seite als image_url-Part gerendert (48-Seiten-Budget pro Anfrage, geteilt über alle angehängten Dokumente); Modelle ohne Bildeingabe erhalten den extrahierbaren Text des Dokuments als Prompt-Text, den der Datenschutz-Scan dann wie jeden anderen Text abdeckt. Längere oder schwerere Dokumente gehören auf /v1/ocr. Mit aktivierter dlp_documents-Richtlinie wird das Dokument anonymisiert oder abgelehnt, bevor irgendetwas das Gateway verlässt. Ist sie aus und der DLP-Modus der Organisation schützend (tokenize, mask oder block), werden Dokumente, die als nicht inspizierbare Bilder reisen würden, abgelehnt; unter allow_log passieren sie mit einer expliziten Ungeprüft-Markierung im Audit-Protokoll.

# 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

Setzen Sie stream: true und die Antwort kommt als Server-Sent Events: jedes Frame ist ein chat.completion.chunk-Delta, und der Stream endet mit data: [DONE]. Streams werden im Gateway nie gepuffert: sie werden durchgeschleust, und Audit-Siegel und Metering erfolgen selbst dann, wenn der Client früh auflegt.

Fordern Sie stream_options.include_usage an, und das letzte Frame trägt die exakte Token-Nutzung, dieselben Zahlen, die das Gateway zählt und abrechnet.

Nach 15 Sekunden ohne Frame schreibt das Gateway zwischen den Events eine SSE-Kommentarzeile (: keepalive), damit Proxys mit Leerlauf-Timeout die Verbindung offen halten, während ein Modell nachdenkt; SSE-Clients ignorieren sie. Streams tragen Cache-Control: no-cache und X-Accel-Buffering: no. Startet eine Gateway-Replik neu, bedient sie offene Streams noch bis zu fünf Minuten; ein danach noch offener Stream endet mit einem Fehler-Event mit dem Code server_restarting, wiederholen Sie dann die Anfrage.

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

Reasoning

Übergeben Sie den OpenAI-Parameter reasoning_effort (minimal | low | medium | high) bei jedem reasoning-fähigen Modell. Sluis übersetzt ihn je Anbieter (Geminis Thinking-Level, Claudes adaptiver Thinking-Effort) und lässt ihn weg, wo ein Modell ihn ablehnen würde, sodass ein einziger Parameter über den gesamten Katalog funktioniert.

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
)

Prompt-Caching

Wiederkehrende Prompt-Präfixe — ein langer System-Prompt, Tool-Definitionen, ein wachsender Dialog — lassen sich beim Anbieter cachen: günstiger und schneller. Sluis spricht die Branchenmarker: cache_control-Blöcke à la Anthropic (mit optionaler TTL von 5m oder 1h) und OpenAIs Top-Level-Parameter prompt_cache_key. Senden Sie sie in einer Form; Sluis übersetzt oder entfernt sie je Anbieter, sodass dieselbe Anfrage im gesamten Katalog funktioniert.

AnbieterPrompt-Cache-Verhalten
AnthropicExplizite cache_control-Breakpoints auf System-Blöcken, Nachrichteninhalten und Tool-Definitionen, mit TTL 5m oder 1h. Cache-Lese- und Schreibvorgänge werden getrennt berichtet.
Bedrockcache_control wird in Converse-cachePoint-Blöcke in system, messages und toolConfig übersetzt — gleiche Anfrage, nichts umzuschreiben auf Ihrer Seite.
OpenAI · AzureAutomatisches Caching langer Präfixe. Marker werden entfernt; ein optionaler prompt_cache_key wird unverändert weitergegeben, damit Folgeaufrufe Cache-Affinität behalten.
Gemini · VertexBei Gemini-Modellen cacht der Anbieter implizit — nichts zu senden, und der berichtete Cache-Token-Anteil wird in Ihre Nutzung durchgereicht. Claude auf Vertex nimmt explizites cache_control samt TTL, genau wie bei Anthropic.
xAI · DeepSeek · Mistral · Qwen · Moonshot · ZhipuAutomatisch, wo der Anbieter es anbietet. Explizite Marker werden entfernt, sodass eine für Claude geschriebene Anfrage hier nie abgelehnt wird.
Scaleway · customScaleway hat keinen Prompt-Cache beim Anbieter: Direktiven werden dort entfernt, der Hebel ist der zuschaltbare Antwort-Cache des Gateways. Ein eigener Endpunkt erhält beide Direktiven unverändert — dieses Verhalten ist Sache des Betreibers.

Explizites Prompt-Caching ist auf Organisationsebene zuschaltbar und standardmäßig aus: ein gecachtes Präfix sind ruhende Daten beim Anbieter — zuvor von Sluis DLP-gefiltert, aber für die Cache-TTL außerhalb von Sluis gespeichert. Einschalten in der Datenschutz-Ansicht der Console. Manche Anbieter (OpenAI, Gemini, xAI, DeepSeek) cachen ohnehin automatisch in ihrer eigenen Infrastruktur; der Schalter regelt nur, was Sluis explizit weitergibt (cache_control, cachePoint, prompt_cache_key), nicht das anbieterinterne Verhalten. Ohne eigenen Schlüssel für einen Anbieter laufen Aufrufe über Sluis-Zugangsdaten, die auch andere Organisationen nutzen: Bei OpenAI und Azure setzt Sluis statt Ihres prompt_cache_key einen aus Ihrer Organisation abgeleiteten, bei allen anderen Anbietern zeigen die Cache-Token-Zähler in Ihrer Nutzung 0. Abgerechnet wird weiterhin mit dem tatsächlichen Cache-Rabatt.

Cache-Lesevorgänge werden zum rabattierten Anbietertarif abgerechnet; Cache-Schreibvorgänge à la Anthropic legen den Schreibaufschlag des Anbieters auf den Eingabetarif. Beides ist pro Aufruf im Audit-Drawer sichtbar und in Nutzung & Budget summiert. Mit einem von Sluis verwalteten Key wird eine Anfrage, die einen Aufschlag wählt, den Sluis nicht messen kann — eine cache_control-ttl außer 5m, wo der Anbieter sie beachtet (Anthropic, Bedrock, Claude auf Vertex), ein service_tier außer auto, default, flex oder standard_only oder die Long-Context-Beta von Anthropic (context-1m) —, vor jedem Versand mit 400 abgewiesen; Ihr eigener Anbieter-Key leitet alle drei unverändert weiter.

Fehlercodes

Fehler verwenden das OpenAI-Fehler-Envelope; der Wert error.type spiegelt den HTTP-Status, sodass die Fehlerbehandlung Ihres SDK unverändert weiterarbeitet.

CodeWann
400 invalid_request_errorFehlerhafter Request-Body oder Parameter.
400 invalid_request_errorModell-ID ohne Provider-Präfix. Jede aufrufbare ID ist provider/model, z. B. mistral/mistral-large-latest; der Body meldet: model must be provider-prefixed.
400 invalid_request_errorDie Anfrage trägt den entfernten x-sluis-dlp-Header. Overrides pro Anfrage wurden durch Option-Overrides pro Workload ersetzt; konfigurieren Sie sie unter Console → Workloads.
401 authentication_errorFehlender oder unbekannter API-Key.
402 insufficient_quotaKein aktiver Plan oder Budget erreicht. Aktivieren Sie einen Plan oder erhöhen Sie das Budget; die Anfrage erreicht nie einen Anbieter.
403 permission_errorDem Key fehlt die Berechtigung, etwa weil das Modell nicht auf seiner Allow-List steht.
422 invalid_request_errorVor dem Versand abgewiesen, etwa weil der Datenschutz im block-Modus die Anfrage erfasst hat.
422 document_too_large_to_scanEin Dokument ist zu groß für den gewählten Weg: eine Seite, die selbst bei der minimalen Scan-Auflösung über der Render-Pixelgrenze bleibt, oder eine Datei über der Byte-Grenze der Textextraktion. Großformatige Seiten (A0/A1-Zeichnungen) werden automatisch herunterskaliert gerendert; der dedizierte Code erlaubt dem Client, das Dokument zu verkleinern oder aufzuteilen und erneut zu senden.
429 rate_limit_errorRate-Limit erreicht. Am Gateway durchgesetzt; die Anfrage erreicht nie einen Anbieter.
403 permission_errorDurch die Residency-Policy blockiert: keine erlaubte Jurisdiktion bedient die Anfrage. Der Body enthält den Grund.
403 scope_violationVom Scope-Guard des Workloads im Modus block abgewiesen: Der Aufruf liegt außerhalb des für diesen Workload festgelegten Einsatzbereichs. Die Meldung nennt den Grund des Guards; die Anfrage erreicht nie einen Anbieter.
503 pdf_renderer_unavailableEin eingebettetes PDF hätte als Seitenbilder gesendet werden müssen, da das geroutete Modell Bildeingaben liest, aber dieses Deployment hat keinen PDF-Renderer. Die Anfrage wird abgelehnt statt stillschweigend aus extrahiertem Text beantwortet — das würde alles verwerfen, was eine Zeichnung oder ein Scan zeigt.
503 scope_guard_unavailableDer Scope-Guard des Workloads steht auf block, konnte aber kein Urteil fällen, deshalb wird der Aufruf abgewiesen statt durchgelassen. Mit Backoff erneut versuchen.
503 auth_unavailableLa passerelle n'a pas pu lire son stockage de clés et n'a donc pas pu vérifier la clé. La clé n'est pas réputée invalide ; réessayez avec un délai croissant et respectez Retry-After.
504 api_errorDer Anbieter hat nicht innerhalb der Antwortfrist des Workloads geantwortet: 300 Sekunden, sofern der Workload nicht 10 bis 600 festlegt, kürzer, wenn die Anfrage x-sluis-upstream-timeout sendet. error.sluis.cause ist timeout. Das Gateway hat den Aufruf nicht wiederholt, weil der Anbieter ihn noch ausführen kann; kürzen Sie den Prompt oder bitten Sie um eine längere Frist, bevor Sie erneut senden.
5xx api_errorAusfall des Upstream-Anbieters nach Wiederholungsversuchen; der Circuit Breaker lenkt den Traffic an fehlerhaften Anbietern vorbei. Der Body enthält die Meldung des Anbieters selbst sowie ein error.sluis-Objekt, das die Ursache und jeden Versuch nennt — mit Upstream-Status oder Transportfehler und Dauer.
{
  "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 spricht die Anthropic Messages API nativ. Richten Sie Claude Code oder ein beliebiges Anthropic-SDK auf das Gateway und rufen Sie POST /v1/messages auf: die Anfrage wird in die interne Form übersetzt, durchläuft genau dieselbe Inspect → Route → Seal → Meter-Pipeline wie jeder andere Aufruf und kommt in Anthropics Format zurück, Streaming inbegriffen. /anthropic/v1/messages ist der eindeutige Pfad mit Prefix auf denselben Handler.

Authentifizierung

Senden Sie Ihren Sluis-Key im x-api-key-Header von Anthropic oder im gewohnten Authorization: Bearer-Header; beide werden akzeptiert. Der anthropic-version-Header wird gelesen, aber nie verlangt, und nur seine Form wird geprüft. Das Parsen ist bewusst offen: unbekannte Body-Felder, unbekannte Content-Block-Typen, unbekannte anthropic-beta-Werte und die Query ?beta=true, die Claude Code mitsendet, werden toleriert statt abgewiesen. Beta-Flags reisen Byte für Byte zu Upstreams der Anthropic-Familie und werden anderswo ignoriert.

Endpoints

EndpunktZweck
POST /v1/messagesMessages, gepuffert oder streamend · System-Prompts als String oder Blöcke, Tools und Tool-Ergebnisse (auch Fehlerergebnisse und Bildblöcke darin), Bilder, Dokumentblöcke, thinking- und redacted_thinking-Blöcke aus der Historie sowie cache_control-Marker an jeder cachefähigen Position.
POST /v1/messages/count_tokensLokale Token-Schätzung für das Kontextmanagement im SDK: nichts wird versendet, aufbewahrt oder abgerechnet.
GET /v1/models · GET /v1/models/{id}Native Modell-Discovery in Anthropics Form (data, has_more, first_id, last_id, display_name, created_at, before_id/after_id/limit-Cursor nach Möglichkeit), beantwortet aus dem In-Process-Katalog ohne Datenbankweg. Auf dem Root-Pfad wählt der anthropic-version-Header diese Form — ohne ihn erhalten Sie die OpenAI-Form; unter /anthropic gilt sie immer. Die Ids bleiben die in Sluis aufrufbaren provider/model-Ids, und created_at ist ein fester Platzhalter, weil der Katalog kein Release-Datum je Modell kennt.
HEAD /api/helloDie Aufwärm-Probe, die Claude Code vor einer Sitzung sendet · nur HEAD, beantwortet mit 200 und leerem Body.

Modell-Routing

Das Wire-Format schränkt das Modell nie ein: der Ingress ist ein Codec, und die Modell-Id bestimmt die Route. Eine nackte Id wie claude-sonnet-5 löst über den Standardanbieter dieses Ingress auf — anthropic, sofern Ihre Organisation ihn nicht anders setzt, etwa vertex für Claude in der EU — danach entscheidet das Residency-Gate weiterhin, ob dieses Ziel die Anfrage bedienen darf. Pinnen Sie ein Ziel ausdrücklich mit einer anbieterpräfixierten Id (vertex/claude-opus-4-8) oder übergeben Sie einen sluis/*-Alias: ein Anthropic-SDK-Tool läuft dann auf jedem angebundenen Anbieter, innerhalb Ihrer Policy.

Streaming

Mit "stream": true ist die Antwort die vollständige Anthropic-Event-Grammatik: message_start mit der echten Zahl der Input-Tokens, content_block_start / content_block_delta / content_block_stop je Block, message_delta mit kumulativer Nutzung samt Cache-Read- und Cache-Creation-Tokens, dann message_stop. Text kommt als text_delta, Tool-Argumente als input_json_delta und Reasoning als thinking_delta plus signature_delta, wenn der geroutete Anbieter sie erzeugt hat. Ein ping-Event folgt auf message_start und wiederholt sich nach rund 15 Sekunden Stille im Upstream, sodass ein lange denkender Turn nie den Watchdog des Clients auslöst, und ein Fehler mitten im Stream wird als error-Event neu kodiert statt als abgeschnittener Stream. stop_sequence trägt die getroffene Sequenz, wenn die Antwort von einem Anbieter der Anthropic-Familie kam, und ist sonst 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

Fehler

Jeder Fehler auf diesen Pfaden nutzt Anthropics Envelope — ein "type": "error" auf oberster Ebene mit dem Fehlertyp des Anbieters (invalid_request_error, authentication_error, billing_error, permission_error, not_found_error, conflict_error, request_too_large, rate_limit_error, api_error, overloaded_error) — einschließlich der Abweisungen, die nie ein Modell erreichen, etwa ein unbekannter Key oder eine Datenschutz-Blockade. Die Request-Id des Gateways steht als request-id-Header auf der Antwort und im request_id-Feld des Bodys, und es ist dieselbe Id, unter der der Aufruf im Audit-Trail steht.

# 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…"
}

Ein Request-Feld wird abgewiesen statt weitergereicht: mcp_servers ergibt 400 invalid_request_error. Ein Modell, das selbst einen externen MCP-Server aufruft, läge außerhalb des Sluis-Gates — registrieren Sie den Server daher in der Console und nutzen Sie das MCP-Gateway unter /v1/mcp, wo jeder Tool-Aufruf geprüft, geroutet, versiegelt und abgerechnet wird.

Kompatibilitätsmatrix

Was die nativen Ingresse heute abdecken, Endpoint für Endpoint. Diese Tabelle ist die Aussage: was hier nicht als unterstützt steht, ist Roadmap, wird bewusst abgewiesen oder gehört zu einer anderen Produktoberfläche — nie stillschweigend angedeutet.

AnthropicStatusHinweise
POST /v1/messages✓ nativGepuffert und streamend, Tools, Bilder, Dokumentblöcke, Thinking-Round-Trip und Prompt-Cache-Marker.
POST /v1/messages/count_tokens✓ lokale SchätzungLokal beantwortet; nichts wird versendet.
GET /v1/models · /v1/models/{id}✓ nativNative list- und get-Form aus dem In-Process-Katalog; auf dem Root-Pfad per Header verhandelt, unter /anthropic immer.
HEAD /api/hello✓Die Aufwärm-Probe von Claude Code, nur HEAD.
Message Batches✗ RoadmapMessage Batches sind nicht implementiert; Batch-Arbeit läuft heute als gewöhnliche Live-Aufrufe.
Files✗ RoadmapDie Files-API ist nicht gebrückt; inline Dokumentblöcke und file_data decken den üblichen Weg ab.
mcp_servers✗ abgewiesenMit 400 abgewiesen statt weitergereicht — registrieren Sie den Server und rufen Sie das Sluis-MCP-Gateway unter /v1/mcp auf.
Skills · Agents · Admin✗ außerhalb des UmfangsSkills, Managed Agents und die Admin-, Nutzungs- und Kosten-APIs sind eine andere Produktoberfläche, keine Inferenz-Kompatibilität.

Routing über Protokollgrenzen. Anbietereigene Felder überleben, solange die Anfrage bei einem Anbieter landet, der dasselbe Protokoll spricht: eine Anthropic-Anfrage, die ein Anbieter der Anthropic-Familie bedient, behält ihre thinking-Blöcke, Cache-Marker, Beta-Flags und die getroffene stop_sequence. Über Protokollgrenzen geroutet, fallen diese Felder beim Versand weg — nie eine Abweisung am Ingress — und die Audit-Zeile hält sowohl das Wire-Format als auch den aufgelösten Anbieter fest, jede Einbuße ist also zuordenbar. Opake Werte werden nie umgeschrieben: Thinking-Signaturen und redacted_thinking-Payloads werden wörtlich weitergegeben oder gar nicht, und genau deshalb wird ein geparkter thinking-Block, den der Datenschutz-Scan markiert, verworfen statt maskiert — ein umgeschriebener Block trüge eine ungültige Signatur.