Übersicht
GoModel akzeptiert zusätzlich zu seiner OpenAI-kompatiblen API den Request-Dialekt der Anthropic Messages API unterPOST /v1/messages. Clients und SDKs, die das
Anthropic-Format sprechen, können unverändert auf GoModel zeigen.
Der Request wird beim Eingang in den kanonischen Chat-Typ von GoModel übersetzt und
durchläuft dieselbe Pipeline wie /v1/chat/completions — virtuelle Modelle,
Workflow-Richtlinien, Budgets, Failover, der Response-Cache, Nutzungs- und
Kostenerfassung sowie Audit-Logging greifen also alle. Da jeder Provider Chat
Completion implementiert, lässt sich ein Request im Anthropic-Format zu jedem
konfigurierten Provider routen (OpenAI, Gemini, Bedrock und weitere), nicht nur zu
Anthropic.
Das unterscheidet sich von der Passthrough-API:
/p/anthropic/v1/messages leitet die Bytes unverändert ausschließlich an den
Anthropic-Upstream weiter, während der verwaltete Endpunkt /v1/messages überallhin
routet und vollständig verwaltet ist.
Native Weiterleitung an Anthropic
Wenn ein/v1/messages-Request zu einem Anthropic-Provider aufgelöst wird,
überspringt GoModel den Übersetzungs-Roundtrip und leitet den ursprünglichen
Request-Body unverändert weiter (nur das Feld model wird umgeschrieben, wenn ein
Alias zu einem anderen Namen aufgelöst wurde). Anschließend wird die
provider-native Response bzw. der SSE-Stream unverändert zurückgegeben. So bleibt
alles erhalten, was die kanonische Übersetzung nicht abbilden kann —
cache_control-Breakpoints, Signaturen von Thinking-Blöcken, anthropic-beta-Header
—, worauf Coding-Agents wie Claude Code angewiesen sind. Rate-Limits, Budgets,
Audit-Logging und Nutzungserfassung gelten weiterhin, sowohl für Streaming- als
auch für Nicht-Streaming-Responses.
Die native Weiterleitung erfolgt automatisch. Requests fallen auf die
Übersetzungs-Pipeline zurück, sobald ein Feature beteiligt ist, das auf dem
kanonischen Request arbeitet: Request-Patching durch Guardrails, der Response-Cache
oder Failover-Routing. Requests, die zu einem Nicht-Anthropic-Provider aufgelöst
werden, werden immer übersetzt.
Da der Body unverändert weitergeleitet wird, gilt auf diesem Weg keine der
Einschränkungen der Übersetzung: Server-Tool-Verlauf
(server_tool_use, web_search_tool_result, …), Container-Uploads und alle anderen
Blöcke, die der kanonische Request nicht abbilden kann, erreichen Anthropic
unverändert.
Unterstützte Endpunkte
Message Batches
/v1/messages/batches teilt sich die native Batch-Pipeline des Gateways mit der
OpenAI-kompatiblen Route /v1/batches — beide sind Dialekt-Ansichten derselben
Ressource. Batch-IDs sind zwischen den beiden Dialekten austauschbar
(msgbatch_<uuid> hier, batch_<uuid> dort). Alle Requests eines Batches müssen zu
einem einzigen Provider aufgelöst werden; custom_id-Werte pro Eintrag sind
erforderlich und müssen eindeutig sein.
Provider, deren Batch-API dateibasiert ist (OpenAI-kompatibel), erhalten
Inline-Requests als automatisch hochgeladene JSONL-Eingabedatei. request_counts
bildet die aggregierten Zählwerte des Providers ab: Während ein Batch läuft, werden
unfertige Requests als processing gemeldet; nach dem Ende wird der Rest dem
Batch-Ergebnis zugeordnet (canceled, expired oder errored).
Authentifizierung
Beide Arten der Übergabe von Zugangsdaten funktionieren, sodass die offiziellen Anthropic-SDKs direkt einsetzbar sind:Authorization: Bearer <key>— das primäre Schema von GoModel.x-api-key: <key>— der Anthropic-native Header, der als Fallback akzeptiert wird, wenn keinAuthorization-Header vorhanden ist.
Beispiel
type: "message",
content-Blöcke, stop_reason, usage). Fehler verwenden den Anthropic-Fehler-Envelope
({"type": "error", "error": {...}}). max_tokens ist erforderlich, wie in der
Anthropic-API. Der Content-Filter eines Providers wird als stop_reason: "refusal"
gemeldet. Fällt der Provider mitten im Stream aus, endet der Stream mit einem
error-Event, das die eigene Meldung des Providers enthält.
usage folgt für jeden Provider der Anthropic-Semantik: input_tokens schließt
gecachte Tokens aus, die separat als cache_read_input_tokens und
cache_creation_input_tokens gemeldet werden. Bei OpenAI-kompatiblen Providern,
deren prompt_tokens gecachte Tokens einschließt, verschiebt GoModel
cached_tokens und cache_write_tokens in diese Felder, sodass die drei Werte in
Summe den gesamten Prompt ergeben.
Streaming-Responses geben die Anthropic-SSE-Event-Sequenz aus (message_start,
content_block_start/content_block_delta/content_block_stop, message_delta,
message_stop).
Kostenerfassung und Audit-Logs
/v1/messages-Requests werden genauso erfasst und auditiert wie die
OpenAI-kompatiblen Routen. Die Kosten werden anhand des Providers berechnet, der
den Request tatsächlich bedient hat, und die Nutzung wird unter dem Endpunkt
/v1/messages erfasst, sodass sie im Dashboard gefiltert werden kann.
Einschränkungen
Diese Einschränkungen gelten für die übersetzte Pipeline — Requests, die zu einem Nicht-Anthropic-Provider geroutet werden, oder zu Anthropic, wenn Guardrails, Response-Cache oder Failover aktiv sind. Requests, die nativ an Anthropic weitergeleitet werden, bleiben Byte für Byte erhalten – abgesehen vom Wertmodel, wenn ein Alias zu einem anderen
Namen aufgelöst wurde –, und nichts des Folgenden trifft auf sie zu.
/v1/messages übersetzt über den kanonischen Chat-Typ von GoModel.
Anthropic-spezifische Features ohne kanonische Entsprechung bleiben nicht
durchgängig erhalten:
cache_controlbleibt beim Routing zu Anthropic am Request, an System- und Content-Blöcken, an Custom Tools und im Tool-Use-/Tool-Result-Verlauf erhalten.{"role": "system"}-Nachrichten innerhalb vonmessagesbehalten ihre Position undcache_control-Breakpoints, wenn sie zu einem Modell der Familie Claude 4.8+/5 geroutet werden (Claude Code hängt System-Reminder auf diese Weise an, und sein Prompt-Caching ist darauf angewiesen, dass sie an Ort und Stelle bleiben). Bei älteren Claude-Modellen, die diese Rolle ablehnen, wird ihr Text stattdessen in den System-Prompt auf oberster Ebene verschoben.thinking- undredacted_thinking-Blöcke werden in beide Richtungen unverändert übertragen, einschließlich Signaturen: Responses enthalten die von Anthropic ausgestelltesignature(beim Streaming alssignature_delta), und ein zurückgesendeter Assistant-Turn wird unverändert wiedergegeben, sodass Konversationen mit aktiviertem Thinking und Tool-Use-Schleifen korrekt weiterlaufen. Andere Provider sehen diese Blöcke nie.- Reasoning von einem Provider, der es nicht signiert (DeepSeek, Fireworks, …),
wird als
thinking-Block mitsignature: ""zurückgegeben — das Feld ist im Anthropic-Schema erforderlich, und der leere Wert zeigt an, dass das Reasoning unsigniert ist. Senden Sie den Turn unverändert zurück: Der Block wird an diesen Provider wie jeder andere wiedergegeben. Anthropic akzeptiert nur Signaturen, die es selbst erzeugt hat; daher wird ein unsignierter Block aus einem Turn entfernt, bevor dieser Claude erreicht (der Rest des Turns wird unverändert gesendet). tool_result.is_errorbleibt beim Routing zu Anthropic erhalten. Andere Provider haben kein entsprechendes Flag und erhalten nur den Inhalt des Ergebnisses.tool_use.extra_contenttransportiert den Replay-Zustand eines anderen Providers, etwa eine Gemini-3-Thought-Signature, zurück zu diesem Provider. GoModel setzt es an dentool_use-Blöcken, die es zurückgibt; senden Sie es unverändert zurück. Siehe Extra Content, Thinking-Blöcke und Thought Signatures.- Server-/integrierte Tools (Websuche, Codeausführung, …) und ihre
Verlaufsblöcke (
server_tool_use,web_search_tool_result, …) werden mit einem eindeutigen400abgelehnt; nur Custom Tools (typefehlt oder ist"custom") werden übersetzt. Die Tool-Suche ist die Ausnahme (siehe verzögertes Laden von Tools unten). top_kwird verworfen — es gibt keine portable OpenAI-kompatible Entsprechung, und Provider der OpenAI-Familie lehnen unbekannte Request-Felder ab.temperatureundtop_pwerden weitergeleitet.- Bilder und Dokumente in
tool_result-Blöcken (Screenshots, von einem Tool gelesene Bild- und PDF-Dateien — Claude Code gibt sie auf diese Weise zurück) werden beim Routing zu Anthropic als nativeimage- unddocument-Blöcke weitergeleitet. OpenAI erhält sie über seine Responses API, in der das Modell sie sehen kann (siehe Über Responses bediente OpenAI-Requests). Andere Provider erhalten nur den Textanteil des Tool-Ergebnisses. document-Blöcke (PDF, Klartext, URL oderfile_id-Quellen der Files API) werden in den OpenAI-artigen Content-Teilfileübersetzt (file_datafür Inline-Inhalte,file_urlfür Remote-URLs,file_idfür Uploads). Anthropic erhält das Dokument nativ mit seinemtitlezurück; Gemini erhält nur Inline-Daten; OpenAI-kompatible Provider erhalten denfile-Teil unverändert. Bei OpenAI erhält ein PDF ohne Titel einen Dateinamen (document.pdf), und URL-Dokumente laufen über die Responses API. Ein Klartext-Dokument in einem Request, der bei Chat Completions bleibt, wird als Text gesendet (mit seinemtitleals Überschrift), weil dort nur PDF-Dateidaten akzeptiert werden; bei einem Request, der über die Responses API bedient wird – etwa einem mit einem Textdokument in einemtool_result–, bleibt es eine Datei. Zitiereinstellungen undcontextwerden verworfen. Die Custom-Content-Variante (source.type: "content") wird zu Text herabgestuft.search_result-Blöcke werden zu Text herabgestuft (Titel, Quell-URL und Inhalt); Zitiermetadaten werden verworfen.- Verzögertes Laden von Tools wird akzeptiert. Ein mit
defer_loading: truemarkiertes Tool ist ein gewöhnliches Custom Tool, dessen Schema die API bei Bedarf lädt; die Markierung hat keine kanonische Entsprechung und wird verworfen, sodass das Tool wie jedes andere gesendet wird. Einetool_reference(der Treffer der Tool-Suche) wird zum Tool-Namen als Text herabgestuft, weil kein Provider hinter der übersetzten Pipeline Tool-Schemas per Referenz lädt. Eine Konversation, in der die serverseitige Tool-Suche von Anthropic lief, kann auf einem anderen Modell fortgesetzt werden: Das Tool-Such-Tool wird verworfen, da jedes verzögert geladene Tool bereits vollständig gesendet wird, und sein Verlauf (server_tool_useundtool_search_tool_result) wird zu Text herabgestuft, der die Suche und die gefundenen Tools benennt. Dadurch kann Claude Code mitENABLE_TOOL_SEARCHüber das Gateway mit einem Nicht-Anthropic-Modell laufen. - Andere Content-Blöcke (
container_upload, …) werden mit einem eindeutigen400-Fehler abgelehnt, statt stillschweigend verworfen zu werden. stop_sequenceswerden bei jedem Provider berücksichtigt. Provider, die die getroffene Sequenz nativ melden (Anthropic), liefern den vollständigen Vertrag zurück:stop_reason: "stop_sequence"plus den Wertstop_sequence; dasselbe gilt für OpenAI-Reasoning-Modelle (GPT-5 und neuer, o-Serie), bei denen GoModel die Ausgabe selbst abschneidet, weil OpenAIstopfür sie ablehnt. Andere Modelle der OpenAI-Familie vermischen Treffer des Stop-Parameters mit natürlichen Stopps infinish_reason, sodass Completions dortstop_reason: "end_turn"melden (die Ausgabe wird trotzdem korrekt abgeschnitten).output_config:effortlegt den Reasoning-Effort fest (mit Vorrang vor dem austhinkingabgeleiteten), undformat(oder das ältereoutput_formatauf oberster Ebene) wird zu Structured Output mit JSON-Schema — strikt, wenn das Schema die Regeln des Strict-Modus von OpenAI erfüllt (additionalProperties: false, jede Eigenschaft erforderlich und keineallOf-,not- oder bedingten Schlüsselwörter). Andere Schemas werden mitstrict: falsegesendet: Sie lenken die Ausgabe, garantieren sie aber nicht. Ein anderes Format alsjson_schemawird mit einem400abgelehnt.thinkingwird bei einem Nicht-Anthropic-Modell zu einem Reasoning-Effort (Budget unter 10000 Tokens:low, unter 20000:medium, sonsthigh; adaptiv:medium), gesendet im jeweils eigenen Feld des Providers:reasoning_effortbei OpenAI, Groq, Fireworks und xAI. Modelle, die das Feld ablehnen (OpenAIgpt-4*, Groq-Modelle außer gpt-oss und qwen3, xAIs-non-reasoning,grok-build,grok-2undgrok-3außergrok-3-mini), erhalten den Request ohne das Feld statt eines Fehlers. Reasoning kommt alsthinking-Blöcke zurück, unabhängig davon, welches Feld der Provider dafür verwendet (reasoning_contentoderreasoning).count_tokensist exakt, wenn der Provider des Modells Tokens selbst zählen kann: Anthropic-Modelle werden über Anthropics eigenencount_tokens-Endpunkt gezählt. Der weitergeleitete Request enthält das aufgelöste Modell (ein Alias wird zuerst aufgelöst) und nur die Felder, die dieser Endpunkt akzeptiert:messages,system,tools,tool_choice,thinking,cache_controlundoutput_config;max_tokens,stream,metadataund die Sampling-Parameter werden weggelassen, weil Anthropic sie dort ablehnt. OpenAI-Modelle werden über OpenAIs Endpunkt/v1/responses/input_tokensfür den Request gezählt, so wie GoModel ihn senden wird. Bei GPT-5 und neuer entspricht die Zählung dem abgerechneten Input (auf ein Token genau): Für einen Request, den Chat Completions mit Tools bedient, wird die feste Tools-Präambel addiert, die dort abgerechnet wird. Bei älteren Modellfamilien kann ein solcher Request einige Tokens unter dem abgerechneten Input liegen (6 beigpt-4o-mini). Guardrails laufen bei einer Zählung nicht; wenn der Workflow des Requests Prompt-Guardrails hat, wird der Prompt daher nie zum Zählen an einen Provider gesendet, und die Schätzung antwortet (Guardrails nur für Responses bzw. Streams behalten exakte Zählungen). Für alle anderen Provider und immer dann, wenn dieser Aufruf fehlschlägt, antwortet das Gateway mit einer Schätzung, die Text danach gewichtet, wie dicht er tokenisiert (Fließtext, Code und JSON, CJK, Emoji), Framing pro Nachricht und pro Tool sowie den Tool-Use-System-Prompt hinzurechnet und Bilder nach ihrer Pixelfläche bepreist. Bei gewöhnlichem Agent-Traffic liegt die Schätzung innerhalb von etwa zehn Prozent einer tokenizer-exakten Zählung; rohes Base64 in Text wird weiterhin zu niedrig gezählt, und ein Bild, dessen Größe nicht gelesen werden kann, wird mit der größten Größe berechnet, die der Provider beibehält. Dieselbe Schätzung befülltusage.input_tokensim Streaming-Eventmessage_start; die maßgeblichen Werte kommen im abschließenden Eventmessage_delta, das SDK-Akkumulatoren bevorzugen.
/p/anthropic/v1/messages.
Die Designbegründung und die Abwägungen finden Sie in
ADR-0007.