Skip to main content
Für die Einrichtung von Anthropic genügt ein API-Key. Diese Seite existiert wegen einer Besonderheit: wie GoModel die OpenAI-typische Einstellung reasoning.effort auf die nativen Thinking- und Effort-Steuerungen von Claude abbildet, die sich je nach Modellgeneration unterscheiden.

Konfigurieren

Oder in config.yaml:
/v1/messages von Anthropic verlangt max_tokens bei jedem Request. GoModel fügt ANTHROPIC_DEFAULT_MAX_TOKENS (Standardwert 4096) ein, wenn ein Aufrufer den Wert weglässt, und hält die OpenAI-kompatible Schnittstelle damit nachsichtig.

Claude-Abonnement (OAuth-Token)

GoModel akzeptiert auch ein OAuth-Token eines Claude-Abonnements als Anthropic-Zugangsdaten. Erzeugen Sie eines mit claude setup-token (erfordert ein Claude-Abonnement – Pro, Max, Team oder Enterprise – und die Claude Code CLI) und setzen Sie es als Provider-Key:
Tokens mit dem Präfix sk-ant-oat werden automatisch erkannt: GoModel sendet sie als Authorization: Bearer mit der Beta oauth-2025-04-20 statt als x-api-key. Eine zusätzliche Konfiguration ist nicht erforderlich.
Anthropic autorisiert OAuth-Tokens von Abonnements nur für Claude-Code-Traffic. Verwenden Sie dies, um Ihr eigenes Claude Code über GoModel zu routen (siehe den Claude-Code-Leitfaden); Requests anderer Clients werden upstream mit „This credential is only authorized for use with Claude Code“ abgelehnt. Endpunkte außerhalb des Funktionsumfangs von Claude Code (etwa das Auflisten von Modellen) können ebenfalls abgelehnt werden – schlägt die Modellerkennung des Providers fehl, konfigurieren Sie die models-Liste für den Provider explizit.

Abbildung des Reasoning-Aufwands

GoModel akzeptiert das OpenAI-förmige Objekt "reasoning": {"effort": "..."} sowie die String-Form "reasoning_effort": "..." aus Chat Completions (ein nicht leeres reasoning.effort hat Vorrang, wenn beide vorhanden sind; ein leeres Objekt fällt auf die String-Form zurück) und übersetzt sie in die nativen Steuerungen von Claude. Die fünf akzeptierten Stufen sind low, medium, high, xhigh und max; Werte werden ohne Berücksichtigung der Groß-/Kleinschreibung abgeglichen, und jeder andere Wert wird auf low herabgestuft und protokolliert. Die Übersetzung hängt davon ab, ob das Modell Adaptive Thinking unterstützt.
Das adaptive Routing basiert auf einer expliziten Allowlist, nicht auf einem Versionsvergleich. Neue Modell-IDs werden als Legacy behandelt, bis sie der Liste hinzugefügt werden. Bei Modellen vor 4.7 funktioniert der Legacy-Fallback über budget_tokens weiter; Modelle ab Opus 4.7 lehnen budget_tokens grundsätzlich ab, sodass eine neue, nur adaptive Modell-ID mit einem Upstream-400 fehlschlägt, bis sie der Allowlist hinzugefügt wird.
Bei Legacy-Modellen wird der Effort-String auf ein Thinking-Budget abgebildet; max_tokens wird bei Bedarf über das Budget angehoben. xhigh und max sind rein adaptive Stufen, daher werden sie bei Legacy-Modellen auf das high-Budget begrenzt, statt max_tokens über das hinaus aufzublähen, was diese Modelle ausgeben können:
Lassen Sie reasoning weg, um Thinking beim Standardverhalten des Modells zu belassen. GoModel setzt thinking: {type: "adaptive"} nur, wenn Sie reasoning.effort (oder reasoning_effort) übergeben. Ohne diese Angabe nutzen Opus 4.6 bis 4.8 und Sonnet 4.6/5 kein Extended Thinking, während Fable 5/5.1, Mythos 5/5.1 und Opus 5 von sich aus adaptiv denken (siehe den Hinweis zum dauerhaft aktiven Thinking unten). Effort ist eine separate Steuerung, die den gesamten Token-Verbrauch (Text und Tool-Aufrufe) regelt, unabhängig davon, ob Thinking aktiv ist, und Anthropic setzt sie standardmäßig auf high, wenn nichts angegeben ist. Sie ist ein Verhaltenssignal für Tiefe und Ausführlichkeit, kein festes Budget – der tatsächliche Verbrauch variiert pro Request und ist durch max_tokens begrenzt.
Die Effort-Stufen sind upstream an Modelle gebunden: xhigh ist verfügbar bei Fable 5/5.1, Opus 5, Sonnet 5 und Opus 4.8/4.7; max bei diesen sowie Opus 4.6 und Sonnet 4.6. GoModel leitet die von Ihnen gesendete Stufe weiter; Anthropic lehnt sie mit 400 ab, wenn das Zielmodell sie nicht unterstützt. Manuelles Thinking mit budget_tokens wird ab Opus 4.7 abgelehnt, weshalb GoModel für diese Modelle Adaptive Thinking verwendet.
Bei Fable 5/5.1, Mythos 5/5.1 und Opus 5 ist Thinking immer aktiv, unabhängig davon, ob Sie reasoning senden; reasoning.effort stellt nur seine Tiefe ein. Die dafür verbrauchten Tokens werden in Chat-Completions-Responses als usage.completion_reasoning_tokens gemeldet. Der Reasoning-Text selbst wird nicht zurückgegeben, nur die Anzahl der Tokens.

Sampling-Parameter

Anthropic hat temperature und top_p bei Fable 5/5.1, Mythos 5/5.1, Opus 5, Sonnet 5 und Opus 4.8/4.7 entfernt – jeder Wert, einschließlich des OpenAI-SDK-Standards temperature: 1, wird upstream mit 400 abgelehnt. GoModel entfernt bei diesen Modellen beide Felder und protokolliert die verworfenen Werte, sodass Clients, die immer eine Temperatur senden, weiter funktionieren. Ältere Modelle erhalten sie weiterhin unverändert, mit einer unten beschriebenen Ausnahme. Anthropic behandelt temperature und top_p bei jedem Modell als gegenseitig ausschließend: Ein Request mit beiden wird mit 400 "`temperature` and `top_p` cannot both be specified for this model" abgelehnt. Da OpenAI-kompatible Clients routinemäßig beide Standardwerte ausfüllen, leitet GoModel temperature weiter und entfernt top_p (wobei der verworfene Wert protokolliert wird), wenn beide vorhanden sind. Senden Sie nur top_p, wenn Sie genau diesen Parameter steuern möchten. Unabhängig vom Modell verlangt Anthropic bei aktivem Extended Thinking temperature = 1. GoModel entfernt jeden anderen Temperaturwert (und protokolliert ihn), statt den Request scheitern zu lassen.

Structured Output

response_format funktioniert bei Anthropic-Modellen und wird auf die nativen Structured Outputs von Claude (output_config.format) abgebildet. Dasselbe gilt für text.format auf /v1/responses, das GoModel zuerst in response_format übersetzt.
Die Response ist eine gewöhnliche Chat Completion, deren message.content der JSON-Text ist, mit finish_reason: "stop" – dasselbe Format, das OpenAI zurückgibt. Streaming ist nicht betroffen: Das JSON kommt als normale Content-Deltas an. Tools und response_format können zusammen gesendet werden; Claude ruft entweder ein Tool auf (finish_reason: "tool_calls") oder antwortet mit schemakonformem JSON. Der Schema-Compiler von Anthropic ist strenger als der von OpenAI, daher passt GoModel das Schema vor dem Senden an:
  • jedes Objektschema erhält das obligatorische "additionalProperties": false, auch in jedem allOf-Zweig – Anthropic verlangt es und führt die Zweige selbst zusammen
  • reine Validierungs-Schlüsselwörter, die Anthropic nicht berücksichtigt (minimum, maximum, multipleOf, maxItems, uniqueItems, minLength, maxLength, propertyNames, not, if/then/else, …), werden entfernt
  • pattern bleibt erhalten, da Anthropic es tatsächlich durchsetzt – außer bei den Regex-Features, die seine Engine ablehnt (Lookarounds, Rückverweise, \b/\B) und die den Request mit 400 scheitern ließen; solche Patterns werden entfernt und der Verlust protokolliert
  • minItems bleibt erhalten, wenn der Wert 0 oder 1 ist – die einzigen Werte, die Anthropic akzeptiert –, und wird andernfalls entfernt
  • oneOf wird zu anyOf gelockert, und unbekannte String-format-Werte werden entfernt. Ein Schema, das oneOf und anyOf auf derselben Ebene enthält, lässt sich nicht ausdrücken – Anthropic lehnt das allOf ab, das das zweite aufnehmen würde –, daher wird oneOf entfernt und der Verlust protokolliert
  • required bleibt genau wie gesendet: Anthropic akzeptiert optionale Properties, sodass eine Property, die Sie nicht in required aufgenommen haben, optional bleibt
Verschachtelte Objekte, Arrays, enum, const, anyOf, allOf und $ref/$defs werden unverändert durchgereicht. $ref hat Grenzen, die GoModel nicht überbrücken kann, und Anthropic gibt für jede davon ein 400 mit entsprechender Angabe zurück: Verweise müssen lokal sein (#/$defs/… – eine externe URL wird abgelehnt), nicht rekursiv (eine Definition, die auf sich selbst verweist, direkt oder in einem Zyklus, wird abgelehnt) und außerhalb von allOf liegen (lösen Sie den Verweis selbst auf, bevor Sie mit allOf kombinieren).
strict wird nicht weitergeleitet – Anthropic setzt das übergebene Schema immer durch. Auch ein nicht striktes Schema wird daher durchgesetzt, abzüglich der oben aufgeführten Einschränkungen. Structured Output ist bei jedem Claude-Modell verfügbar, das GoModel derzeit erreichen kann.

Wenn der Inhalt kein schemakonformes JSON ist

Das Schema schränkt ein, was das Modell generiert, nicht wie der Turn endet. Prüfen Sie die Completion, bevor Sie message.content parsen:
  • finish_reason: "length" – die Antwort hat max_tokens erreicht, und das JSON ist mitten in einem Wert abgeschnitten. Erhöhen Sie max_tokens und versuchen Sie es erneut.
  • finish_reason: "tool_calls" – das Modell hat ein Tool aufgerufen, statt zu antworten, daher ist message.content leer.
  • finish_reason: "refusal" – Claude hat den Request abgelehnt; GoModel reicht den Ablehnungs-Stop-Reason von Anthropic unverändert durch, und es gibt kein JSON zum Parsen.
Nur finish_reason: "stop" mit nicht leerem Inhalt sollte an einen JSON-Parser übergeben werden; behandeln Sie alles andere als Fehler, statt es zu parsen.

Developer-Nachrichten und strikte Tools

developer-Nachrichten sind der neuere OpenAI-Name für system; GoModel sendet sie an Anthropic als System-Inhalt und folgt dabei denselben Platzierungsregeln wie bei system-Nachrichten. Ein Function-Tool mit "strict": true wird als striktes Anthropic-Tool weitergeleitet. Für strikte Tool-Schemas gelten dieselben Grenzen wie für Structured Output, daher passt GoModel sie nach denselben Regeln an wie unter Structured Output. Tools ohne strict behalten ihr Schema genau wie gesendet.

Erlaubte Tools

Anthropic kann einen Turn nicht auf eine Teilmenge der deklarierten Tools beschränken. Bei einer tool_choice vom Typ allowed_tools sendet GoModel nur die aufgeführten Funktionen, mit tool_choice: any, wenn der Modus required ist, und andernfalls mit auto. Bei Modellen, die keine erzwungene Tool-Nutzung akzeptieren, wird required stattdessen zu auto plus einer System-Anweisung; siehe Erzwungene Tool-Auswahl bei Fable 5.1. Eine Teilmenge, die keine deklarierte Funktion nennt, wird mit 400 abgelehnt. allowed_tools gibt es, damit ein Client in jedem Turn dieselbe Tool-Liste senden und seinen Prompt-Cache behalten kann. Eine Einschränkung ändert die upstream gesendeten Tool-Definitionen, und bei Claude-Modellen stehen diese im gecachten Präfix vor dem System-Prompt. Eine Teilmenge, die sich zwischen Turns ändert, macht den Cache daher ungültig.

Ausführlichkeit

verbosity von OpenAI (und text.verbosity auf /v1/responses) hat bei Anthropic keine Entsprechung. GoModel protokolliert den angeforderten Wert und entfernt ihn, statt den Request scheitern zu lassen. Bitten Sie stattdessen im Prompt um kürzere oder längere Antworten.

Erzwungene Tool-Auswahl bei Fable 5.1

Fable 5.1 und Mythos 5.1 akzeptieren nur tool_choice: "auto" und "none"; das Erzwingen eines Aufrufs mit "required" oder {"type": "function", ...} führt bei Anthropic zu einem 400. GoModel folgt dem von Anthropic dokumentierten Ersatz: Die Auswahl wird auf auto herabgestuft, und an den System-Prompt wird eine Anweisung angehängt – „You must respond by calling one of the provided tools.“ bei required oder „You must respond by calling the tool named <name>.“ bei einer benannten Funktion. Die Herabstufung wird protokolliert. parallel_tool_calls: false wird weiterhin berücksichtigt. Fable 5 und alle anderen Claude-Modelle behalten die erzwungene Tool-Nutzung unverändert bei.
Die Anweisung ist eine starke Vorgabe, keine feste Garantie: Das Modell kann weiterhin mit Text antworten. Wenn Sie sich auf die erzwungene Tool-Auswahl verlassen haben, um JSON zu erhalten, verwenden Sie stattdessen Structured Output.

Nativer Passthrough

Um Claude-native Request-Felder ohne OpenAI-kompatible Entsprechung zu senden (zum Beispiel eingebettete system-Einträge mitten in einer Aufgabe im messages-Array), verwenden Sie die Passthrough-Route /p/anthropic/messages, die den Body unverändert weiterleitet.
Zuletzt geändert am 24. Oktober 2026