Die API auf einem selbst gehosteten Server aufrufen
Richte das offizielle SDK, cURL oder die ant CLI auf deinen selbst gehosteten Server für Claude Managed Agents aus, starte eine Sitzung und lies die Antwort des Agenten. Verbinde dann eigene Worker, falls du sie brauchst.
Ein selbst gehosteter Claude Managed Agents-Server hat dieselbe API wie der gehostete Managed Agents-Dienst von Anthropic. Dein Code ruft ihn mit dem offiziellen SDK, cURL oder der ant CLI auf. Zwei Dinge ändern sich: Die „base URL“ (Basis-URL) ist die Adresse deines Servers, und der API-Key ist dein Server-API-Key anstelle eines Claude API-Keys.
Um Agenten zu erstellen und Sitzungen in einem Browser auszuführen, siehe Die Konsole auf deinem Server verwenden.
Voraussetzungen
- Ein laufender Server: Starte einen mit Erste Schritte mit selbst gehostetem Claude Managed Agents oder Auf Kubernetes bereitstellen.
- Zugriff auf den Server: Wenn jemand anderes den Server betreibt, frage nach seiner Adresse und danach, wie du dich authentifizierst. Wenn dort Single Sign-on verwendet wird, siehe Entwicklern die Anmeldung über ein Terminal ermöglichen.
- Die
antCLI: Installiere die neueste Version, wie der CLI-Schnellstart zeigt.
Deinen Client auf deinen Server ausrichten
Das SDK und die ant CLI lesen die Adresse des Servers aus ANTHROPIC_BASE_URL und den API-Key aus ANTHROPIC_API_KEY. Setze beide Variablen in einem Terminal, das du für diesen Server reservierst.
Führe für den Schnellstart-Stack diese Befehle in dem Verzeichnis aus, das deine .env-Datei enthält:
export ANTHROPIC_BASE_URL=http://127.0.0.1:8400
export ANTHROPIC_API_KEY=$(grep '^CMA_SERVER__API_KEY=' .env | cut -d= -f2)Setze unter Kubernetes die beiden Variablen, wie Eine Sitzung ausführen zeigt, und lass das dortige Port-Forwarding weiterlaufen.
In diesem Terminal erreicht jeder ant-Befehl, wie etwa ant beta:agents list, deinen Server. Führe Claude Code oder docker compose nicht in diesem Terminal aus, da sie dieselben Variablen lesen.
Eine Sitzung starten
Eine Sitzung benötigt die ID eines Agents und die ID einer Umgebung:
- Agent: Erstelle einen, wie Einen Agenten erstellen zeigt, wobei dein Client auf deinen Server ausgerichtet ist. Wenn du direkte HTTP-Anfragen sendest, ersetze
https://api.anthropic.comin der URL durch$ANTHROPIC_BASE_URL. - Umgebung: Der Schnellstart-Stack erstellt eine Umgebung namens
compose-sandbox, und die Helm-Charts erstellen eine namensdefault.ant beta:environments listgibt den Namen und die ID jeder Umgebung aus. Für deine eigenen Worker ist es die ID, die die Admin-CLI in Eigene Worker betreiben ausgegeben hat.
Lege deine beiden IDs anstelle dieser Beispiel-IDs in deiner Shell ab:
export AGENT_ID=agent_011CYm1BLqPXpQRk5khsSXrs
export ENVIRONMENT_ID=env_01595EKxaaTTGwwY3kyXdtbsDas folgende Beispiel erstellt eine Sitzung und sendet ihre erste Nachricht in derselben Anfrage:
import os
from anthropic import Anthropic
client = Anthropic()
session = client.beta.sessions.create(
agent=os.environ["AGENT_ID"],
environment_id=os.environ["ENVIRONMENT_ID"],
initial_events=[
{
"type": "user.message",
"content": [
{"type": "text", "text": "List the files in the working directory."}
],
},
],
)
print(session.id)Die Antwort enthält die ID der Sitzung, die mit sesn_ beginnt. Der Agent beginnt sofort mit der Arbeit. Seine integrierten Tools, wie bash, laufen auf einem Worker, der die Umgebung bedient.
Um die Sitzung zu beobachten, öffne die Konsole auf deinem Server in einem Browser, wähle Sessions und dann die Sitzung aus. Eine Sitzung, die du wie auf dieser Seite mit dem Server-API-Key gestartet hast, wird nur Administratoren angezeigt.
Um die Sitzung stattdessen in deinem Terminal zu verfolgen, übergib ihre ID an ant beta:sessions connect:
ant beta:sessions connect sesn_011CZkZAtmR3yMPDzynEDxu7Was eine Sitzung sonst noch kann, etwa eine Agent-Version festlegen, findest du unter Eine Session starten.
Eine Nachricht senden und die Antwort lesen
Lege die ID deiner Sitzung anstelle dieser Beispiel-ID in deiner Shell ab:
export SESSION_ID=sesn_011CZkZAtmR3yMPDzynEDxu7Warte, bis die Sitzung im Leerlauf ist, bevor du das nächste Beispiel ausführst. Das Beispiel hört auf zu lesen, wenn ein Turn endet. Wenn ein früherer Turn noch läuft, kann sein Ende das Beispiel stoppen, bevor die Antwort auf deine Nachricht eintrifft. Die Konsole und ant beta:sessions connect zeigen beide den Status der Sitzung an.
Das folgende Beispiel sendet eine Nachricht und gibt die Antwort des Agenten aus. Es öffnet zuerst den Event-Stream der Sitzung, weil ein Stream nur die Events liefert, die nach seinem Öffnen eintreffen:
import os
from anthropic import Anthropic
client = Anthropic()
session_id = os.environ["SESSION_ID"]
with client.beta.sessions.events.stream(session_id) as stream:
client.beta.sessions.events.send(
session_id,
events=[
{
"type": "user.message",
"content": [
{"type": "text", "text": "Summarize what you did in one sentence."}
],
},
],
)
for event in stream:
match event.type:
case "agent.message":
for block in event.content:
if block.type == "text":
print(block.text, end="")
case "session.error":
error_message = event.error.message if event.error else "unknown"
print(f"\n[Error: {error_message}]")
case "session.status_idle":
if event.stop_reason.type != "requires_action":
break
case "session.status_terminated":
breakNeben der Ausgabe von agent.message-Text verarbeitet die Schleife drei Events:
session.status_idle: Die Schleife endet, es sei denn, derstop_reason.typedes Events istrequires_action.session.status_terminated: Die Schleife endet.session.error: Die Schleife gibt die Meldung des Fehlers aus und liest weiter, weil der Server einen fehlgeschlagenen Modellaufruf wiederholen und den Turn abschließen kann.
requires_action bedeutet, dass die Sitzung für einen Tool-Aufruf pausiert hat. Was die Pause beendet, hängt vom Aufruf ab:
- Ein Aufruf eines benutzerdefinierten Tools oder eine Anfrage zur Bestätigung eines Tool-Aufrufs: Nur dein Code kann darauf antworten. Wenn dein Agent eines davon verwendet, siehe Tool-Aufrufe beantworten, die die Session pausieren.
- Ein Aufruf eines Tools, das ein Worker ausführt, etwa
bash: Dieser Aufruf pausiert die Sitzung normalerweise nicht. Wenn etwa 3 Minuten lang kein Worker den Aufruf übernimmt, pausiert die Sitzung, bis ein Worker das Ergebnis zurückgibt. Dein Code muss dann nichts beantworten. Halte den Stream offen, und der Turn wird fortgesetzt, wenn ein Worker den Aufruf ausführt.
Um die anderen Events zu sehen, die eine Sitzung sendet, und zu erfahren, wie du dich erneut verbindest, ohne eines zu verpassen, siehe Session-Event-Stream.
Daten in eine Sitzung hinein- und aus ihr herausbringen
Daten gelangen über das Arbeitsverzeichnis des Workers in eine Sitzung und aus ihr heraus.
Auf dem Schnellstart-Stack startet der Container jeder Sitzung mit einem leeren /workspace-Verzeichnis, abgesehen von den Klonen der Repositories der Sitzung. Standardmäßig wird der Container etwa eine Minute nach dem Ende eines Turns beendet, und Docker löscht ihn zusammen mit diesem Verzeichnis. Alles, was eine Sitzung behalten muss, muss vorher über einen Tool-Aufruf, etwa einen Upload oder einen git push, nach außen gelangen.
Ein Container wird außerdem etwa eine Stunde nach seinem Start beendet, selbst mitten in einem Turn. Keine Einstellung ändert das. Der Turn wird in einem neuen Container fortgesetzt, normalerweise nach ein oder zwei Minuten, und dein Client erhält kein Event für den Wechsel. Der Wechsel hat zwei Kosten:
- Befehle: Alles, was im alten Container läuft, stoppt. Der neue Container führt den unterbrochenen Tool-Aufruf erneut von Anfang an aus, aber nichts startet einen Befehl neu, den der Agent im Hintergrund laufen gelassen hat.
- Dateien: Das
/workspacedes neuen Containers ist wieder leer, abgesehen von frischen Klonen der Repositories der Sitzung.
Lass den Agenten in einem langen Turn seine Arbeit fortlaufend hochladen oder pushen, und vermeide Befehle, die Schaden anrichten, wenn sie zweimal ausgeführt werden.
Unter Kubernetes behält eine Sitzung einen Pod höchstens etwa eine Stunde lang, und der Turn wird auf dieselbe Weise fortgesetzt. Zwei Dinge unterscheiden sich: Der neue Pod findet die Dateien der Sitzung in /workspace, und er startet etwa 6 Minuten, nachdem der alte Pod stoppt.
Lege bei Workern, die du selbst startest, Eingabedateien im Arbeitsverzeichnis ab, bevor du die Nachricht sendest, die sie benötigt. Lies Ausgabedateien anschließend von dort.
Wenn du selbst für jede Sitzung einen Container startest, binde ein Verzeichnis, das die Eingabedateien der Sitzung enthält, als Arbeitsverzeichnis des Containers ein. Hole die Ausgabedateien von dort ab, nachdem der Container beendet wurde. Siehe Dateien für eine Sitzung bereitstellen.
Weitere Beispiele in den Leitfäden des gehosteten Dienstes finden
Die Leitfäden des gehosteten Dienstes erklären die Kernkonzepte der API und enthalten Beispiele für jede Funktion. Ihre SDK- und CLI-Beispiele rufen deinen Server auf, wenn du sie in dem Terminal ausführst, in dem ANTHROPIC_BASE_URL und ANTHROPIC_API_KEY gesetzt sind. Ihre cURL-Beispiele nennen https://api.anthropic.com, ersetze diese Adresse also durch $ANTHROPIC_BASE_URL, bevor du eines ausführst.
Für manche Funktionen benötigt dein Server zuerst eine Einstellung, oder ein Beispiel benötigt eine Änderung:
| Aufgabe | Leitfaden des gehosteten Dienstes | Auf deinem Server |
|---|---|---|
| Modell, System-Prompt und Versionen eines Agenten festlegen | Definiere deinen Agenten | Manche Felder hängen von deinem Inferenzanbieter ab. |
| Integrierte Tools auswählen oder benutzerdefinierte Tools hinzufügen | Tools | Um die Web-Tools zu verwenden, schalte sie zuerst ein, wie Web-Tools benötigen eine Servereinstellung beschreibt. Welche es gibt, hängt von deinem Inferenzanbieter ab. |
| Einen MCP-Server verbinden und sein Token speichern | MCP-Connector und Mit Vaults authentifizieren | Füge den Host des MCP-Servers zur Allowlist für MCP-Server hinzu. Speichere das Token als static_bearer-Anmeldedaten. |
| Einem Agenten Skills geben | Skills | Lade jeden Skill als einzelne Dateien hoch, da dein Server ein Zip-Archiv ablehnt. Die vorgefertigten Skills in den Beispielen jenes Leitfadens sind nicht verfügbar. |
| Speicher über Sitzungen hinweg behalten | Agentenspeicher verwenden | Wenn du deine eigenen Worker betreibst, gib ihnen ein beschreibbares /mnt/memory-Verzeichnis, wie in Speicher in selbst gehosteten Sandboxes. |
| Arbeit an andere Agenten übergeben | Multiagenten-Orchestrierung | Ersetze den multiagent_20261001-Block in den Beispielen jenes Leitfadens durch einen coordinator-Block. |
| In einem Git-Repository arbeiten | Auf GitHub zugreifen | Trage den Git-Host in den Einstellungen deines Servers ein, wie Git-Repositories benötigen einen Allowlist-Eintrag beschreibt. Der Beispiel-Agent jenes Leitfadens benötigt außerdem api.githubcopilot.com auf der Allowlist für MCP-Server. |
| Die Arbeit von einem Bewerter anhand einer Rubrik prüfen lassen | Ergebnisse definieren | Sende die Rubrik als Text. Die Files API ist nicht verfügbar, also hole Ausgabedateien aus dem Arbeitsverzeichnis ab. |
| Eine Sitzung verfolgen und ihre Tool-Aufrufe beantworten | Session-Event-Stream | Das erste Beispiel jenes Leitfadens schließt den Stream bei jeder Pause, beginne also stattdessen mit der Schleife in Eine Nachricht senden und die Antwort lesen. |
Unterschiede zum gehosteten Dienst enthält die vollständige Liste. Prüfe sie, bevor du eine bestehende Anwendung umziehst.
Eigene Worker betreiben
Der Schnellstart-Stack erstellt eine Umgebung und betreibt die Worker dieser Umgebung. Das tun auch die Helm-Charts in Auf Kubernetes bereitstellen. Wenn diese Worker alles sind, was du brauchst, überspringe diesen Abschnitt.
Du betreibst Worker wie bei selbst gehosteten Sandboxes: mit denselben ant beta:worker-Befehlen und SDK-Workern, auf die Weisen, die Selbst gehostete Worker bereitstellen zeigt. Die Ausnahme sind durch Webhooks ausgelöste Worker, da dein Server keine sendet.
Eine Umgebung und ihren Schlüssel erstellen
Erstelle mit der Admin-CLI, nicht in der Claude Console, eine Umgebung und einen „environment key“ (Umgebungsschlüssel). Die CLI, cma-server-admin, liegt in der obersten Ebene des Release-Archivs, führe den Befehl also von dort aus. Übergib für -base-url die Adresse, unter der deine Worker den Server erreichen:
- Worker auf dem Rechner, auf dem der Schnellstart-Stack läuft:
http://127.0.0.1:8400 - Worker auf einem anderen Rechner: die
https-Adresse des TLS-Proxys, den du vor den Server schaltest
Die Admin-CLI ruft den Server unter derselben Adresse auf, führe sie also auf einem Rechner aus, der diese Adresse erreichen kann.
echo "$ANTHROPIC_API_KEY" | ./cma-server-admin bootstrap \
-base-url http://127.0.0.1:8400 -name my-env -key-file -Der Befehl gibt die Einstellungen des Workers, den Befehl zum Starten eines Workers sowie die ID und das Ablaufdatum des Schlüssels aus:
export ANTHROPIC_BASE_URL='http://127.0.0.1:8400'
export ANTHROPIC_ENVIRONMENT_ID='env_...'
export ANTHROPIC_ENVIRONMENT_KEY='sk-ant-oat01-...'
# then: histchars= HISTFILE=/dev/null ant beta:worker poll --workdir /workspace
# key id: 'etok_...' expires: '...'Der Befehl zeigt den Schlüssel nur einmal an, speichere also den Schlüssel, seine ID und sein Ablaufdatum in deinem Secret-Manager. Der Schlüssel funktioniert nach 365 Tagen nicht mehr. Befolge vorher Einen Umgebungsschlüssel für deine eigenen Worker ersetzen.
Halte den Server-API-Key von den Rechnern fern, auf denen Worker laufen. Führe Worker in einem Container oder einer VM aus, die nichts enthalten, was du schützen musst. Deine weiteren Sicherheitspflichten findest du unter Deine Verantwortlichkeiten für die Sicherheit.
Ein lokales Experiment ausführen
Führe die drei export-Zeilen in der Shell aus, in der du den Worker startest. Starte den Worker dann mit diesen Befehlen, nicht mit dem ausgegebenen. Der erste Befehl erstellt das Arbeitsverzeichnis des Workers, da der Worker es nicht erstellt:
mkdir -p "$HOME/cma-workspace" "$HOME/.config/cma"
cat > "$HOME/.config/cma/worker.inputrc" <<'EOF'
$include /etc/inputrc
set disable-completion on
EOF
histchars= HISTFILE=/dev/null INPUTRC="$HOME/.config/cma/worker.inputrc" \
ant beta:worker poll --workdir "$HOME/cma-workspace"histchars, INPUTRC und HISTFILE richten die Shell hinter dem bash-Tool des Workers so ein, dass sie jeden Befehl so ausführt, wie der Agent ihn geschrieben hat:
histchars=: Die Shell behandelt!nicht als Verweis auf ihren Befehlsverlauf.INPUTRC: Die Datei schaltet die Vervollständigung aus, die sonst jedes Tabulatorzeichen in einem Befehl verbrauchen würde. Halte die Datei aus dem Arbeitsverzeichnis heraus, wo die Datei-Tools des Agenten sie überschreiben könnten.HISTFILE=/dev/null: Die Shell liest und schreibt keine Verlaufsdatei.
Verwende diesen Worker für nichts anderes. Er hält den Umgebungsschlüssel und führt die Tools jeder Sitzung in einem einzigen Prozess aus. Er klont auch nicht die Repositories einer Sitzung. Die Sitzung läuft ohne sie, und dein Client erhält keinen Fehler.
Worker in der Produktion betreiben
Für alles außer einem lokalen Experiment starte für jede Sitzung einen Container und führe darin ant beta:worker run aus, wie Eine Sandbox pro Sitzung ausführen zeigt. Gib seinem Image, was Ein eigenes Sandbox-Image erstellen auflistet, und ändere drei Dinge in diesem Setup:
- Umgebungsschlüssel: Übergib
ANTHROPIC_ENVIRONMENT_KEYnicht an den Container einer Sitzung. Der Server akzeptiert diesen Schlüssel für jede Sitzung in der Umgebung, und der Container benötigt nur Zugriff auf eine Sitzung. - Secret des Work-Items: Übergib dieses Secret anstelle des Schlüssels, weil der Server es nur für diese eine Sitzung akzeptiert. Das Secret des Arbeitselements weiterleiten zeigt, wo dein Code es empfängt. Wo jener Abschnitt
ANTHROPIC_WORK_SECRETsetzt, lege das Secret in einer Datei ab, die nur der Benutzer des Containers lesen kann. Leite das Secret zum Beispiel per Pipe an die Standardeingabe des Containers weiter und lass den Container die Datei schreiben, bevor er den Worker startet. Setze dannANTHROPIC_WORK_SECRET_FILEauf den Pfad der Datei. - Serveradresse: Setze
ANTHROPIC_BASE_URLauf eine Adresse, die der Container erreichen kann.http://127.0.0.1:8400ist keine solche Adresse.
Für einen SDK-Worker gelten zwei weitere Punkte:
- Version: Baue den Worker auf der neuesten Version des SDK auf, wie SDKs, CLI und Bibliotheken beschreibt. Der Worker dieser Version wartet auf eine Bestätigung, bevor er einen Tool-Aufruf ausführt, der sie benötigt, und führt nie einen Aufruf aus, den eine Richtlinie ablehnt. Ein Worker, der auf einer früheren Version aufbaut, führt jeden Tool-Aufruf aus, sobald er eintrifft.
- Beispiele: Die Beispiele in Den SDK-Worker innerhalb der Sandbox ausführen lesen den Umgebungsschlüssel, daher funktionieren sie hier nicht unverändert.
Ein eigenes Sandbox-Image erstellen
Ein eigenes Image benötigt diese Pakete und Einstellungen:
-
Pakete: Git 2.38 oder höher,
curl,jqund ripgrep, mit dem dasgrep-Tool des Workers sucht. -
Shell-Einstellungen:
histchars,HISTFILEundINPUTRC, wie im lokalen Experiment, sowieTERMINFO. Füge diese Zeilen in das Dockerfile ein, vor jederUSER-Zeile:ENV histchars= RUN printf '\nset disable-completion on\n' >> /etc/inputrc ENV INPUTRC=/etc/inputrc TERMINFO=/etc/terminfo HISTFILE=/dev/null RUN test -r /etc/terminfo/d/dumbTERMINFOmuss das Verzeichnis angeben, dasd/dumbenthält, die Terminalbeschreibung, die dasbashdes Workers liest. Unter Alpine mit installiertembashist das/etc/terminfo, wie gezeigt. Auf einer anderen Basis, etwa Debian oder Ubuntu, ist es/lib/terminfooder/usr/share/terminfo, je nachdem, welchesd/dumbenthält. Trage dieses Verzeichnis in derTERMINFO-Einstellung und in derRUN test-Zeile ein, die den Build stoppt, wenn die Datei fehlt.
Das Image benötigt außerdem zwei Skripte aus dem Archiv, die ausgeführt werden, bevor der Worker startet:
- Kopiere
image-build/with-repositories.shnach/usr/local/bin/cma-with-repositories. Es klont die Repositories einer Sitzung. - Kopiere
image-build/with-egress.shnach/usr/local/bin/cma-with-egress. Es richtet die Tools der Sitzung auf das Egress-Gateway aus, falls dein Server eines betreibt. - Mache beide Dateien ausführbar.
- Stelle beide dem Befehl des Workers voran, wie in
cma-with-egress cma-with-repositories ant beta:worker run .... Überspringe diesen Schritt, wenn dein Image daskubernetes/sandbox/worker.shdes Archivs ausführt, weil dieses Skript den Worker auf diese Weise startet.
Ein Worker, der ohne cma-with-repositories startet, führt die Sitzung ohne Repository aus. Dein Client erhält keinen Fehler.
Worker vom gehosteten Dienst umziehen
Wenn du bereits Worker für den gehosteten Dienst von Anthropic betreibst, können dieselben Worker stattdessen deinen Server bedienen. Tu drei Dinge:
- Übergib dem Prozess, der nach Arbeit pollt, die drei
export-Werte, die die Admin-CLI ausgegeben hat. - Starte diesen Prozess mit gesetzten
histchars,HISTFILEundINPUTRC, wie im lokalen Experiment. - Nimm die Änderungen vor, die Worker in der Produktion betreiben beschreibt, und prüfe das Image jeder Sitzung anhand von Ein eigenes Sandbox-Image erstellen.
Nächste Schritte
- Entwicklern die Anmeldung über ein Terminal ermöglichen: Richte Single Sign-on ein, damit Entwickler die
antCLI unter ihrer eigenen Identität verwenden, in einem Terminal ohneANTHROPIC_API_KEY. - Agent-Identität und Anmeldeinformationen: Lass externe Systeme deinen Agents vertrauen, und bewahre Vault-Anmeldedaten in deinem Secret-Manager auf.
- Inferenzanbieter: Sende Modellaufrufe an einen Cloud-Anbieter oder dein eigenes Modell-Gateway.
War diese Seite hilfreich?