Voraussetzungen

  • Python 3.10+
  • claude-code-sdk von PyPI
  • Node.js 18+
  • @anthropic-ai/claude-code von NPM

Um den Python SDK-Quellcode anzuzeigen, siehe das claude-code-sdk Repository.

Für interaktive Entwicklung verwenden Sie IPython: pip install ipython

Installation

Installieren Sie claude-code-sdk von PyPI und @anthropic-ai/claude-code von NPM:

pip install claude-code-sdk
npm install -g @anthropic-ai/claude-code  # Erforderliche Abhängigkeit

(Optional) Installieren Sie IPython für interaktive Entwicklung:

pip install ipython

Schnellstart

Erstellen Sie Ihren ersten Agenten:

# legal-agent.py
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def main():
    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            system_prompt="Sie sind ein Rechtsassistent. Identifizieren Sie Risiken und schlagen Sie Verbesserungen vor.",
            max_turns=2
        )
    ) as client:
        # Senden Sie die Anfrage
        await client.query(
            "Überprüfen Sie diese Vertragsklausel auf potenzielle Probleme: 'Die Partei stimmt unbegrenzter Haftung zu...'"
        )

        # Streamen Sie die Antwort
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                # Drucken Sie Streaming-Inhalte, während sie ankommen
                for block in message.content:
                    if hasattr(block, 'text'):
                        print(block.text, end='', flush=True)

if __name__ == "__main__":
    asyncio.run(main())

Speichern Sie den obigen Code als legal-agent.py und führen Sie dann aus:

python legal-agent.py

Für IPython/Jupyter-Notebooks können Sie den Code direkt in einer Zelle ausführen:

await main()

Die Python-Beispiele auf dieser Seite verwenden asyncio, aber Sie können auch anyio verwenden.

Grundlegende Verwendung

Das Python SDK bietet zwei primäre Schnittstellen:

1. Die ClaudeSDKClient-Klasse (empfohlen)

Am besten für Streaming-Antworten, mehrstufige Gespräche und interaktive Anwendungen:

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def main():
    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            system_prompt="Sie sind ein Performance-Ingenieur",
            allowed_tools=["Bash", "Read", "WebSearch"],
            max_turns=5
        )
    ) as client:
        await client.query("Analysieren Sie die Systemleistung")

        # Stream-Antworten
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'text'):
                        print(block.text, end='', flush=True)

# Als Skript ausführen
asyncio.run(main())

# Oder in IPython/Jupyter: await main()

2. Die query-Funktion

Für einfache, einmalige Anfragen:

from claude_code_sdk import query, ClaudeCodeOptions

async for message in query(
    prompt="Analysieren Sie die Systemleistung",
    options=ClaudeCodeOptions(system_prompt="Sie sind ein Performance-Ingenieur")
):
    if type(message).__name__ == "ResultMessage":
        print(message.result)

Konfigurationsoptionen

Das Python SDK akzeptiert alle Argumente, die von der Befehlszeile unterstützt werden, über die ClaudeCodeOptions-Klasse.

ClaudeCodeOptions-Parameter

from claude_code_sdk import ClaudeCodeOptions

options = ClaudeCodeOptions(
    # Kernkonfiguration
    system_prompt="Sie sind ein hilfreicher Assistent",
    append_system_prompt="Zusätzliche Systemanweisungen",
    max_turns=5,
    model="claude-3-5-sonnet-20241022",
    max_thinking_tokens=8000,
    
    # Tool-Management
    allowed_tools=["Bash", "Read", "Write"],
    disallowed_tools=["WebSearch"],
    
    # Session-Management
    continue_conversation=False,
    resume="session-uuid",
    
    # Umgebung
    cwd="/pfad/zum/arbeitsverzeichnis",
    add_dirs=["/zusätzliches/kontext/verzeichnis"],
    settings="/pfad/zu/settings.json",
    
    # Berechtigungen
    permission_mode="acceptEdits",  # "default", "acceptEdits", "plan", "bypassPermissions"
    permission_prompt_tool_name="mcp__approval_tool",
    
    # MCP-Integration
    mcp_servers={
        "my_server": {
            "command": "npx",
            "args": ["-y", "@modelcontextprotocol/server-example"],
            "env": {"API_KEY": "ihr-schlüssel"}
        }
    },
    
    # Erweitert
    extra_args={"--verbose": None, "--custom-flag": "wert"}
)

Parameter-Details

  • system_prompt: str | None - Benutzerdefinierter System-Prompt, der die Rolle des Agenten definiert
  • append_system_prompt: str | None - Zusätzlicher Text, der an den System-Prompt angehängt wird
  • max_turns: int | None - Maximale Gesprächsrunden (unbegrenzt wenn None)
  • model: str | None - Spezifisches Claude-Modell zu verwenden
  • max_thinking_tokens: int - Maximale Token für Claudes Denkprozess (Standard: 8000)
  • allowed_tools: list[str] - Tools, die speziell zur Verwendung erlaubt sind
  • disallowed_tools: list[str] - Tools, die nicht verwendet werden sollten
  • continue_conversation: bool - Neuestes Gespräch fortsetzen (Standard: False)
  • resume: str | None - Session-UUID zum Fortsetzen eines bestimmten Gesprächs
  • cwd: str | Path | None - Arbeitsverzeichnis für die Session
  • add_dirs: list[str | Path] - Zusätzliche Verzeichnisse, die in den Kontext einbezogen werden sollen
  • settings: str | None - Pfad zur Einstellungsdatei oder Einstellungs-JSON-String
  • permission_mode: str | None - Berechtigungsbehandlungsmodus
  • permission_prompt_tool_name: str | None - Benutzerdefinierter Berechtigungs-Prompt-Tool-Name
  • mcp_servers: dict | str | Path - MCP-Server-Konfigurationen
  • extra_args: dict[str, str | None] - Beliebige CLI-Flags an die zugrunde liegende Claude Code CLI übergeben

Berechtigungsmodi

  • "default": CLI fordert bei gefährlichen Tools zur Eingabe auf (Standardverhalten)
  • "acceptEdits": Dateibearbeitungen automatisch ohne Nachfrage akzeptieren
  • "plan": Planmodus - analysieren ohne Änderungen vorzunehmen
  • "bypassPermissions": Alle Tools ohne Nachfrage erlauben (mit Vorsicht verwenden)

Erweiterte Konfigurationsbeispiel

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def advanced_agent():
    """Beispiel, das erweiterte Konfigurationsoptionen zeigt"""
    
    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            # Benutzerdefiniertes Arbeitsverzeichnis und zusätzlicher Kontext
            cwd="/projekt/root",
            add_dirs=["/geteilte/libs", "/gemeinsame/utils"],
            
            # Modell- und Denkkonfiguration
            model="claude-3-5-sonnet-20241022",
            max_thinking_tokens=12000,
            
            # Erweiterte Tool-Kontrolle
            allowed_tools=["Read", "Write", "Bash", "Grep"],
            disallowed_tools=["WebSearch", "Bash(rm*)"],
            
            # Benutzerdefinierte Einstellungen und CLI-Argumente
            settings='{"editor": "vim", "theme": "dark"}',
            extra_args={
                "--verbose": None,
                "--timeout": "300"
            }
        )
    ) as client:
        await client.query("Analysieren Sie die Codebase-Struktur")
        
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'text'):
                        print(block.text, end='', flush=True)

asyncio.run(advanced_agent())

Strukturierte Nachrichten und Bildeingaben

Das SDK unterstützt die Übergabe strukturierter Nachrichten und Bildeingaben:

from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async with ClaudeSDKClient() as client:
    # Textnachricht
    await client.query("Analysieren Sie diesen Code auf Sicherheitsprobleme")

    # Nachricht mit Bildverweis (Bild wird von Claudes Read-Tool gelesen)
    await client.query("Erklären Sie, was in screenshot.png gezeigt wird")

    # Mehrere Nachrichten in Folge
    messages = [
        "Analysieren Sie zuerst das Architekturdiagramm in diagram.png",
        "Schlagen Sie nun Verbesserungen basierend auf dem Diagramm vor",
        "Generieren Sie schließlich Implementierungscode"
    ]

    for msg in messages:
        await client.query(msg)
        async for response in client.receive_response():
            # Verarbeiten Sie jede Antwort
            pass

# Das SDK behandelt Bilddateien über Claudes eingebautes Read-Tool
# Unterstützte Formate: PNG, JPG, PDF und andere gängige Formate

Mehrstufige Gespräche

Methode 1: Verwendung von ClaudeSDKClient für persistente Gespräche

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions, query

# Methode 1: Verwendung von ClaudeSDKClient für persistente Gespräche
async def multi_turn_conversation():
    async with ClaudeSDKClient() as client:
        # Erste Anfrage
        await client.query("Lassen Sie uns das Zahlungsmodul refaktorieren")
        async for msg in client.receive_response():
            # Erste Antwort verarbeiten
            pass

        # In derselben Session fortfahren
        await client.query("Fügen Sie nun umfassende Fehlerbehandlung hinzu")
        async for msg in client.receive_response():
            # Fortsetzung verarbeiten
            pass

        # Der Gesprächskontext wird durchgehend beibehalten

# Methode 2: Verwendung der query-Funktion mit Session-Management
async def resume_session():
    # Neuestes Gespräch fortsetzen
    async for message in query(
        prompt="Refaktorieren Sie dies nun für bessere Leistung",
        options=ClaudeCodeOptions(continue_conversation=True)
    ):
        if type(message).__name__ == "ResultMessage":
            print(message.result)

    # Spezifische Session fortsetzen
    async for message in query(
        prompt="Aktualisieren Sie die Tests",
        options=ClaudeCodeOptions(
            resume="550e8400-e29b-41d4-a716-446655440000",
            max_turns=3
        )
    ):
        if type(message).__name__ == "ResultMessage":
            print(message.result)

# Führen Sie die Beispiele aus
asyncio.run(multi_turn_conversation())

Benutzerdefinierte System-Prompts

System-Prompts definieren die Rolle, Expertise und das Verhalten Ihres Agenten:

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def specialized_agents():
    # SRE-Incident-Response-Agent mit Streaming
    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            system_prompt="Sie sind ein SRE-Experte. Diagnostizieren Sie Probleme systematisch und bieten Sie umsetzbare Lösungen.",
            max_turns=3
        )
    ) as sre_agent:
        await sre_agent.query("API ist ausgefallen, untersuchen Sie")

        # Streamen Sie den Diagnoseprozess
        async for message in sre_agent.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'text'):
                        print(block.text, end='', flush=True)

    # Rechtsüberprüfungsagent mit benutzerdefiniertem Prompt
    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            append_system_prompt="Schließen Sie immer umfassende Fehlerbehandlung und Unit-Tests ein.",
            max_turns=2
        )
    ) as dev_agent:
        await dev_agent.query("Refaktorieren Sie diese Funktion")

        # Vollständige Antwort sammeln
        full_response = []
        async for message in dev_agent.receive_response():
            if type(message).__name__ == "ResultMessage":
                print(message.result)

asyncio.run(specialized_agents())

Benutzerdefinierte Tools über MCP

Das Model Context Protocol (MCP) ermöglicht es Ihnen, Ihren Agenten benutzerdefinierte Tools und Fähigkeiten zu geben:

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def mcp_enabled_agent():
    # Rechtsagent mit Dokumentenzugriff und Streaming
    # Hinweis: Konfigurieren Sie Ihre MCP-Server nach Bedarf
    mcp_servers = {
        # Beispielkonfiguration - auskommentieren und nach Bedarf konfigurieren:
        # "docusign": {
        #     "command": "npx",
        #     "args": ["-y", "@modelcontextprotocol/server-docusign"],
        #     "env": {"API_KEY": "ihr-schlüssel"}
        # }
    }

    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            mcp_servers=mcp_servers,
            allowed_tools=["mcp__docusign", "mcp__compliance_db"],
            system_prompt="Sie sind ein Unternehmensanwalt, der sich auf Vertragsüberprüfung spezialisiert hat.",
            max_turns=4
        )
    ) as client:
        await client.query("Überprüfen Sie diesen Vertrag auf Compliance-Risiken")

        # Überwachen Sie Tool-Verwendung und Antworten
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'type'):
                        if block.type == 'tool_use':
                            print(f"\n[Tool verwenden: {block.name}]\n")
                        elif hasattr(block, 'text'):
                            print(block.text, end='', flush=True)
                    elif hasattr(block, 'text'):
                        print(block.text, end='', flush=True)

            if type(message).__name__ == "ResultMessage":
                print(f"\n\nÜberprüfung abgeschlossen. Gesamtkosten: ${message.total_cost_usd:.4f}")

asyncio.run(mcp_enabled_agent())

Benutzerdefiniertes Berechtigungs-Prompt-Tool

Implementieren Sie benutzerdefinierte Berechtigungsbehandlung für Tool-Aufrufe:

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def use_permission_prompt():
    """Beispiel für die Verwendung eines benutzerdefinierten Berechtigungs-Prompt-Tools"""

    # MCP-Server-Konfiguration
    mcp_servers = {
        # Beispielkonfiguration - auskommentieren und nach Bedarf konfigurieren:
        # "security": {
        #     "command": "npx",
        #     "args": ["-y", "@modelcontextprotocol/server-security"],
        #     "env": {"API_KEY": "ihr-schlüssel"}
        # }
    }

    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            permission_prompt_tool_name="mcp__security__approval_prompt",  # Geändert von permission_prompt_tool
            mcp_servers=mcp_servers,
            allowed_tools=["Read", "Grep"],
            disallowed_tools=["Bash(rm*)", "Write"],
            system_prompt="Sie sind ein Sicherheitsprüfer"
        )
    ) as client:
        await client.query("Analysieren und beheben Sie die Sicherheitsprobleme")

        # Überwachen Sie Tool-Verwendung und Berechtigungen
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'type'):  # Hinzugefügte Überprüfung für 'type'-Attribut
                        if block.type == 'tool_use':
                            print(f"[Tool: {block.name}] ", end='')
                    if hasattr(block, 'text'):
                        print(block.text, end='', flush=True)

            # Überprüfen Sie auf Berechtigungsverweigerungen in Fehlermeldungen
            if type(message).__name__ == "ErrorMessage":
                if hasattr(message, 'error') and "Permission denied" in str(message.error):
                    print(f"\n⚠️ Berechtigung verweigert: {message.error}")

# Beispiel MCP-Server-Implementierung (Python)
# Dies wäre in Ihrem MCP-Server-Code
async def approval_prompt(tool_name: str, input: dict, tool_use_id: str = None):
    """Benutzerdefinierter Berechtigungs-Prompt-Handler"""
    # Ihre benutzerdefinierte Logik hier
    if "allow" in str(input):
        return json.dumps({
            "behavior": "allow",
            "updatedInput": input
        })
    else:
        return json.dumps({
            "behavior": "deny",
            "message": f"Berechtigung verweigert für {tool_name}"
        })

asyncio.run(use_permission_prompt())

Ausgabeformate

Textausgabe mit Streaming

# Standard-Textausgabe mit Streaming
async with ClaudeSDKClient() as client:
    await client.query("Erklären Sie die Datei src/components/Header.tsx")

    # Streamen Sie Text, während er ankommt
    async for message in client.receive_response():
        if hasattr(message, 'content'):
            for block in message.content:
                if hasattr(block, 'text'):
                    print(block.text, end='', flush=True)
                    # Ausgabe streamt in Echtzeit: Dies ist eine React-Komponente, die zeigt...

JSON-Ausgabe mit Metadaten

# Sammeln Sie alle Nachrichten mit Metadaten
async with ClaudeSDKClient() as client:
    await client.query("Wie funktioniert die Datenschicht?")

    messages = []
    result_data = None

    async for message in client.receive_messages():
        messages.append(message)

        # Ergebnisnachricht mit Metadaten erfassen
        if type(message).__name__ == "ResultMessage":
            result_data = {
                "result": message.result,
                "cost": message.total_cost_usd,
                "duration": message.duration_ms,
                "num_turns": message.num_turns,
                "session_id": message.session_id
            }
            break

    print(result_data)

Eingabeformate

import asyncio
from claude_code_sdk import ClaudeSDKClient

async def process_inputs():
    async with ClaudeSDKClient() as client:
        # Texteingabe
        await client.query("Erklären Sie diesen Code")
        async for message in client.receive_response():
            # Streaming-Antwort verarbeiten
            pass

        # Bildeingabe (Claude wird automatisch das Read-Tool verwenden)
        await client.query("Was ist in diesem Diagramm? screenshot.png")
        async for message in client.receive_response():
            # Bildanalyse verarbeiten
            pass

        # Mehrere Eingaben mit gemischtem Inhalt
        inputs = [
            "Analysieren Sie die Architektur in diagram.png",
            "Vergleichen Sie sie mit bewährten Praktiken",
            "Generieren Sie eine verbesserte Version"
        ]

        for prompt in inputs:
            await client.query(prompt)
            async for message in client.receive_response():
                # Jede Antwort verarbeiten
                pass

asyncio.run(process_inputs())

Agenten-Integrationsbeispiele

SRE-Incident-Response-Agent

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def investigate_incident(incident_description: str, severity: str = "medium"):
    """Automatisierter Incident-Response-Agent mit Echtzeit-Streaming"""

    # MCP-Server-Konfiguration für Überwachungstools
    mcp_servers = {
        # Beispielkonfiguration - auskommentieren und nach Bedarf konfigurieren:
        # "datadog": {
        #     "command": "npx",
        #     "args": ["-y", "@modelcontextprotocol/server-datadog"],
        #     "env": {"API_KEY": "ihr-datadog-schlüssel", "APP_KEY": "ihr-app-schlüssel"}
        # }
    }

    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            system_prompt="Sie sind ein SRE-Experte. Diagnostizieren Sie Probleme systematisch und bieten Sie umsetzbare Lösungen.",
            max_turns=6,
            allowed_tools=["Bash", "Read", "WebSearch", "mcp__datadog"],
            mcp_servers=mcp_servers
        )
    ) as client:
        # Senden Sie die Incident-Details
        prompt = f"Incident: {incident_description} (Schweregrad: {severity})"
        print(f"🚨 Untersuche: {prompt}\n")
        await client.query(prompt)

        # Streamen Sie den Untersuchungsprozess
        investigation_log = []
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'type'):
                        if block.type == 'tool_use':
                            print(f"[{block.name}] ", end='')
                    if hasattr(block, 'text'):
                        text = block.text
                        print(text, end='', flush=True)
                        investigation_log.append(text)

            # Endergebnis erfassen
            if type(message).__name__ == "ResultMessage":
                return {
                    'analysis': ''.join(investigation_log),
                    'cost': message.total_cost_usd,
                    'duration_ms': message.duration_ms
                }

# Verwendung
result = await investigate_incident("Payment API gibt 500-Fehler zurück", "high")
print(f"\n\nUntersuchung abgeschlossen. Kosten: ${result['cost']:.4f}")

Automatisierte Sicherheitsüberprüfung

import subprocess
import asyncio
import json
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def audit_pr(pr_number: int):
    """Sicherheitsprüfungsagent für Pull Requests mit Streaming-Feedback"""
    # PR-Diff abrufen
    pr_diff = subprocess.check_output(
        ["gh", "pr", "diff", str(pr_number)],
        text=True
    )

    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            system_prompt="Sie sind ein Sicherheitsingenieur. Überprüfen Sie diese PR auf Schwachstellen, unsichere Muster und Compliance-Probleme.",
            max_turns=3,
            allowed_tools=["Read", "Grep", "WebSearch"]
        )
    ) as client:
        print(f"🔍 Prüfe PR #{pr_number}\n")
        await client.query(pr_diff)

        findings = []
        async for message in client.receive_response():
            if hasattr(message, 'content'):
                for block in message.content:
                    if hasattr(block, 'text'):
                        # Streamen Sie Befunde, während sie entdeckt werden
                        print(block.text, end='', flush=True)
                        findings.append(block.text)

            if type(message).__name__ == "ResultMessage":
                return {
                    'pr_number': pr_number,
                    'findings': ''.join(findings),
                    'metadata': {
                        'cost': message.total_cost_usd,
                        'duration': message.duration_ms,
                        'severity': 'high' if 'vulnerability' in ''.join(findings).lower() else 'medium'
                    }
                }

# Verwendung
report = await audit_pr(123)
print(f"\n\nPrüfung abgeschlossen. Schweregrad: {report['metadata']['severity']}")
print(json.dumps(report, indent=2))

Mehrstufiger Rechtsassistent

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

async def legal_review():
    """Rechtsdokumentüberprüfung mit persistenter Session und Streaming"""

    async with ClaudeSDKClient(
        options=ClaudeCodeOptions(
            system_prompt="Sie sind ein Unternehmensanwalt. Bieten Sie detaillierte Rechtsanalysen.",
            max_turns=2
        )
    ) as client:
        # Mehrstufige Überprüfung in derselben Session
        steps = [
            "Überprüfen Sie contract.pdf auf Haftungsklauseln",
            "Überprüfen Sie die Einhaltung der DSGVO-Anforderungen",
            "Erstellen Sie eine Zusammenfassung der Risiken für die Geschäftsführung"
        ]

        review_results = []

        for step in steps:
            print(f"\n📋 {step}\n")
            await client.query(step)

            step_result = []
            async for message in client.receive_response():
                if hasattr(message, 'content'):
                    for block in message.content:
                        if hasattr(block, 'text'):
                            text = block.text
                            print(text, end='', flush=True)
                            step_result.append(text)

                if type(message).__name__ == "ResultMessage":
                    review_results.append({
                        'step': step,
                        'analysis': ''.join(step_result),
                        'cost': message.total_cost_usd
                    })

        # Zusammenfassung
        total_cost = sum(r['cost'] for r in review_results)
        print(f"\n\n✅ Rechtsüberprüfung abgeschlossen. Gesamtkosten: ${total_cost:.4f}")
        return review_results

# Verwendung
results = await legal_review()

Python-spezifische bewährte Praktiken

Schlüsselmuster

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

# Verwenden Sie immer Kontext-Manager
async with ClaudeSDKClient() as client:
    await client.query("Analysieren Sie diesen Code")
    async for msg in client.receive_response():
        # Streaming-Nachrichten verarbeiten
        pass

# Führen Sie mehrere Agenten gleichzeitig aus
async with ClaudeSDKClient() as reviewer, ClaudeSDKClient() as tester:
    await asyncio.gather(
        reviewer.query("Überprüfen Sie main.py"),
        tester.query("Schreiben Sie Tests für main.py")
    )

# Fehlerbehandlung
from claude_code_sdk import CLINotFoundError, ProcessError

try:
    async with ClaudeSDKClient() as client:
        # Ihr Code hier
        pass
except CLINotFoundError:
    print("CLI installieren: npm install -g @anthropic-ai/claude-code")
except ProcessError as e:
    print(f"Prozessfehler: {e}")

# Vollständige Antwort mit Metadaten sammeln
async def get_response(client, prompt):
    await client.query(prompt)
    text = []
    async for msg in client.receive_response():
        if hasattr(msg, 'content'):
            for block in msg.content:
                if hasattr(block, 'text'):
                    text.append(block.text)
        if type(msg).__name__ == "ResultMessage":
            return {'text': ''.join(text), 'cost': msg.total_cost_usd}

IPython/Jupyter-Tipps

# In Jupyter verwenden Sie await direkt in Zellen
client = ClaudeSDKClient()
await client.connect()
await client.query("Analysieren Sie data.csv")
async for msg in client.receive_response():
    print(msg)
await client.disconnect()

# Erstellen Sie wiederverwendbare Hilfsfunktionen
async def stream_print(client, prompt):
    await client.query(prompt)
    async for msg in client.receive_response():
        if hasattr(msg, 'content'):
            for block in msg.content:
                if hasattr(block, 'text'):
                    print(block.text, end='', flush=True)

Verwandte Ressourcen