Dokumentation

Dokumentation

Claude Agent SDK

Das Agent SDK hat keine Option für eine Basis-URL: Es startet die Claude Code CLI und übergibt ihr die gesamte Umgebung. Darüber läuft das Routing, und dafür genügen zwei Variablen.

Eine Suche im SDK nach einer Option base_url ergibt nichts. Das ist keine Lücke in der Dokumentation – die Option existiert nicht. Das SDK führt die Claude Code CLI als Unterprozess aus, und die CLI liest ANTHROPIC_BASE_URL und ANTHROPIC_AUTH_TOKEN. Wenn du diese beiden Variablen setzt, werden alle Aufrufe des Agenten darüber geleitet, ohne dass du deinen Agentencode ändern musst.

# The SDK has no base_url option. The CLI it spawns reads these, and the
# SDK passes the parent environment straight through — so exporting them
# before your program starts is enough.
export ANTHROPIC_BASE_URL=https://api.kunavo.com
export ANTHROPIC_AUTH_TOKEN=sk-kn-...

# Pin models Kunavo serves: the CLI's default and its opus/sonnet aliases
# follow Anthropic's newest models, and the sonnet alias asks for Sonnet 5.5,
# which Kunavo does not serve — unpinned, those requests 404.
export ANTHROPIC_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_OPUS_MODEL=claude-opus-5-5
export ANTHROPIC_DEFAULT_SONNET_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-haiku-4-5

python my_agent.py
Der Endpunkt ist die Wurzeladresse des Dienstes – https://api.kunavo.com, ohne /v1. Anthropic-Clients fügen /v1/messages selbst an. Hier gilt dieselbe Regel, die in allen anderen Anthropic-kompatiblen Clients für Verwirrung sorgt. Sie wird auf der Seite zu ANTHROPIC_BASE_URL erklärt.

Warum die Umgebung die CLI überhaupt erreicht

Dieser Punkt verdient einen eigenen Absatz, denn er macht den Unterschied zwischen einem Trick, der vielleicht irgendwann nicht mehr funktioniert, und einer dokumentierten Eigenschaft aus, auf der du aufbauen kannst. Der Subprozess-Transport des Python-SDK erstellt die Umgebung des Kindprozesses aus der os.environ des übergeordneten Prozesses, wobei ein einzelner Schlüssel entfernt wird – CLAUDECODE, damit der Kindprozess nicht annimmt, er liefe innerhalb einer Claude Code-Sitzung. Danach werden CLAUDE_CODE_ENTRYPOINT, dann ClaudeAgentOptions.env und anschließend die SDK-Version zusammengeführt.

Daraus folgen zwei Dinge. Das zweite wird oft falsch verstanden: Alles aus deiner Shell erreicht die CLI, daher funktioniert der Export der beiden Variablen. Und options.env wird über der geerbten Umgebung zusammengeführt. Die explizite Form hat also Vorrang vor einem veralteten Export, statt diesem nachgeordnet zu sein. Der Code steht in subprocess_cli.py.

Die explizite Form und wann du darauf bestehen solltest

Exportierte Variablen funktionieren auf deinem eigenen Rechner, sind aber überall sonst anfällig: Der Endpunkt des Agenten hängt davon ab, wie der Prozess gestartet wurde. Das geht beim ersten Lauf unter einem Scheduler, in einem Container oder in einem CI-Job ohne dein Shell-Profil schief. Wenn du env im Optionsobjekt übergibst, wird das Routing Teil des Programms.

my_agent.py
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions

# The explicit form. options.env is merged ON TOP of the inherited
# environment, so this wins over whatever the shell happens to hold —
# which is what you want in anything that is not your own laptop.
options = ClaudeAgentOptions(
    env={
        "ANTHROPIC_BASE_URL": "https://api.kunavo.com",
        "ANTHROPIC_AUTH_TOKEN": "sk-kn-...",
        "ANTHROPIC_MODEL": "claude-sonnet-5",
        "ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-5-5",
        "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-5",
        "ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5",
    },
)

async with ClaudeSDKClient(options=options) as client:
    await client.query("Summarise the open TODOs in this repo")
    async for message in client.receive_response():
        print(message)

Schritt für Schritt

  1. Erstellen Sie unter /app/keys einen Schlüssel und kopieren Sie ihn — er wird nur einmal angezeigt.
  2. Lege fest, wo das Routing konfiguriert wird: exportierte Variablen für lokale Arbeit, ClaudeAgentOptions(env=…) für alles, was unbeaufsichtigt läuft.
  3. Setze ANTHROPIC_BASE_URL auf https://api.kunavo.com und ANTHROPIC_AUTH_TOKEN auf deinen sk-kn-…-Schlüssel.
  4. Setzen Sie ANTHROPIC_MODEL, ANTHROPIC_DEFAULT_OPUS_MODEL und ANTHROPIC_DEFAULT_SONNET_MODEL auf bereitgestellte IDs. Der integrierte Standard der CLI sowie die Aliase opus und sonnet folgen den neuesten Anthropic-Modellen. Ein Modell, das Kunavo nicht bereitstellt – Sonnet 5.5, das der Alias sonnet anfordert – führt zu 404.
  5. Setze optional ANTHROPIC_DEFAULT_HAIKU_MODEL, damit die von der CLI gestarteten Hintergrundaufgaben auf der günstigsten Stufe ausgeführt werden.
  6. Führe dein Programm aus. Am Agentencode musst du nichts ändern.

Welche Stufe für welche Unteraufgabe?

Ein Agent verteilt die Arbeit: Aus einer Aufgabe, die du ihm stellst, werden viele abgerechnete Anfrage-Antwort-Runden. Deshalb ist die Zuordnung der Stufen hier wichtiger als in einer Chat-App. Die Preise in USD pro 1M Tokens, Ein- und Ausgabe, stammen live aus dem Katalog.

Modell-IDKunavo: Ein- und AusgabeEinsatzbereich
claude-haiku-4-5$0.70 / $3.50Hintergrundaufgaben, die die CLI selbst startet – häufig, automatisch und leicht zu teuer
claude-sonnet-5$1.40 / $7.00Die sinnvolle Standardstufe für die eigentliche Schlussfolgerungsarbeit des Agenten
claude-opus-5$3.50 / $17.50Nur dann, wenn eine günstigere Stufe mehrere Versuche benötigt, um zum Ziel zu kommen
Die Berechnung für die letzte Zeile – wie viel schlechter eine günstigere Stufe sein darf, bevor sie nicht mehr günstiger ist – findest du unter Opus vs. Sonnet vs. Haiku. Wenn der Agent unbeaufsichtigt läuft, findest du Informationen zu den Ausgaben unter Ausführung ohne Berechtigungsabfragen.

Prüfe dies, bevor du das SDK untersuchst

Eine Anfrage klärt, ob ein Fehler am Schlüssel, am Endpunkt oder am SDK liegt. Wenn sie den Status 200 zurückgibt, funktioniert dasselbe Zugangstoken auch für die vom SDK gestartete CLI. Alles, was weiterhin nicht funktioniert, liegt dann daran, wo die Variablen gesetzt werden, und nicht an ihrem Inhalt.

# Settles whether a failure is the key, the endpoint, or the SDK.
# 200 here means the same credential works for the CLI the SDK spawns.
curl -sS https://api.kunavo.com/v1/messages \
  -H "Authorization: Bearer sk-kn-..." \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-haiku-4-5","max_tokens":16,
       "messages":[{"role":"user","content":"ping"}]}'

Referenz

Das SDK ist als Open-Source-Projekt unter anthropics/claude-agent-sdk-python verfügbar. Das hier beschriebene Verhalten der Umgebung stammt aus dem eigenen Subprozess-Transport. Der Quellcode wurde am 2026-09-04 untersucht. Das TypeScript-SDK hat dieselbe Architektur – es steuert die CLI, statt die API aufzurufen –, daher liest wieder die CLI die Routing-Variablen. In der README sind weder die Option noch das Verhalten dokumentiert. Prüfe deshalb den Optionsnamen in den Typen, bevor du dich dort auf die explizite Form verlässt. Auf Kunavos Seite steht die Messages API; weitere Clients, die auf dieselbe Weise routen, findest du im Integrations-Hub.

Häufig gestellte Fragen

Kann das Claude Agent SDK eine benutzerdefinierte Basis-URL verwenden?

Ja, aber nicht über eine SDK-Option – es gibt keinen Parameter base_url, weshalb eine Suche in der README danach nichts ergibt. Das SDK startet die Claude Code CLI als Unterprozess, und die CLI liest ANTHROPIC_BASE_URL und ANTHROPIC_AUTH_TOKEN aus. Wenn du diese beiden Variablen in der Umgebung setzt, in der dein Programm ausgeführt wird, werden alle Aufrufe des Agenten darüber geleitet, ohne dass du deinen Agentencode ändern musst.

Wie übergibt das SDK Umgebungsvariablen an die CLI?

Es übernimmt die gesamte übergeordnete Umgebung und filtert genau einen Schlüssel heraus. Beim Subprozess-Transport des Python-SDK wird die Umgebung des Kindprozesses aus der übergeordneten os.environ erstellt, wobei CLAUDECODE entfernt wird. Anschließend werden CLAUDE_CODE_ENTRYPOINT, dann ClaudeAgentOptions.env und danach die SDK-Version zusammengeführt. Daraus folgen zwei Dinge: Alles aus deiner Shell erreicht die CLI, und options.env hat Vorrang vor der Shell, weil es darübergelegt wird.

Sollte ich die Umgebung oder ClaudeAgentOptions(env=...) verwenden?

Verwende options.env überall dort, wo du nicht an deinem eigenen Laptop arbeitest. Wenn du dich auf die Umgebungsvariablen der Shell verlässt, hängt der Endpunkt des Agenten davon ab, wie der Prozess gestartet wurde. Das geht beim ersten Lauf unter einem Scheduler, in einem Container oder in einem CI-Job ohne dein Shell-Profil schief. Wenn du env explizit im Optionsobjekt übergibst, wird das Routing zu einer Eigenschaft des Programms statt seiner Umgebung. Da diese Werte mit der geerbten Umgebung zusammengeführt werden, haben sie auch Vorrang vor einem veralteten Export.

Benötigt das Agent SDK ein separates Anthropic-Konto?

Es benötigt ein Zugangstoken, das die Claude Code CLI akzeptiert; dieses muss nicht von Anthropic selbst stammen. Da das Routing über ANTHROPIC_BASE_URL und ANTHROPIC_AUTH_TOKEN erfolgt, funktioniert ein Endpunkt, der die Anthropic Messages API bereitstellt. Bei Kunavo wird dafür ein einziger Schlüssel mit dem Präfix sk-kn- für https://api.kunavo.com verwendet. Abgerechnet wird pro Token vom vorausbezahlten Guthaben statt über einen Tarifplan.

Welche Modelle sollte ein Agent-SDK-Programm verwenden?

Wählen Sie die Modellstufe passend zur Teilaufgabe, da ein Agent seine Arbeit auf mehrere Teilaufgaben verteilt. Claude Haiku 4.5 zu $0.70 / $3.50 pro 1 Mio. Token eignet sich für die Hintergrundarbeit, die die CLI selbstständig erzeugt; Claude Sonnet 5 zu $1.40 / $7.00 ist die Standardwahl für die eigentliche Arbeit; Claude Opus 5 zu $3.50 / $17.50 lohnt sich nur dort, wo eine günstigere Modellstufe mehrere Versuche benötigt. ANTHROPIC_DEFAULT_HAIKU_MODEL zusammen mit den beiden Routing-Variablen zu setzen, ist eine Zeile, die jeden Lauf günstiger macht.

Funktioniert das TypeScript Agent SDK genauso?

Es hat dieselbe Architektur: Das SDK steuert die Claude Code CLI, statt die API direkt aufzurufen. Daher liest wieder die CLI die Routing-Variablen. Diese Seite beschreibt den Mechanismus für das Python-SDK, weil dessen Quellcode untersucht wurde. Wenn du das TypeScript-SDK verwendest, prüfe den Optionsnamen in dessen eigenen Typen, bevor du dich auf die explizite Form verlässt, und verwende bis dahin die exportierten Umgebungsvariablen.

Warum filtert das SDK CLAUDECODE aus der Umgebung heraus?

Damit eine vom SDK gestartete CLI nicht annimmt, dass sie innerhalb einer übergeordneten Claude Code-Sitzung läuft. Dies ist der einzige Schlüssel, der aus der geerbten Umgebung entfernt wird. Hier ist das nur insofern relevant, als es zeigt, wie vollständig alles andere durchgereicht wird – einschließlich der beiden Routing-Variablen, von denen diese Seite abhängt.