SpyBara
Go Premium

agent-sdk/streaming-vs-single-mode.md 2026-09-08 20:00 UTC to 2026-09-09 22:58 UTC

This page contains 38 additions and 72 deletions.

2026
Wed 9 22:58

Streaming-Eingabe

Verständnis der zwei Eingabemodi für Claude Agent SDK und wann jeder verwendet wird

Übersicht

Das Claude Agent SDK unterstützt zwei unterschiedliche Eingabemodi für die Interaktion mit Agenten:

  • Streaming-Eingabemodus: eine persistente, interaktive Sitzung
  • Einzelne Nachricht-Eingabe: One-Shot-Abfragen, die Sitzungszustand und Wiederaufnahme verwenden

Der Streaming-Eingabemodus ist die bevorzugte Methode zur Verwendung des Claude Agent SDK. Er bietet vollständigen Zugriff auf die Fähigkeiten des Agenten und ermöglicht umfangreiche, interaktive Erfahrungen.

Er ermöglicht es dem Agenten, als langlebiger Prozess zu fungieren, der Benutzereingaben entgegennimmt, Unterbrechungen verarbeitet, Berechtigungsanfragen anzeigt und die Sitzungsverwaltung übernimmt.

Vorteile

Im Streaming-Eingabemodus arbeiten Sie in einer persistenten Sitzung mit diesen Fähigkeiten:

  • Bild-Uploads: Bilder direkt an Nachrichten anhängen für visuelle Analyse und Verständnis
  • Warteschlangen-Nachrichten: Mehrere Nachrichten senden, die sequenziell verarbeitet werden, mit der Möglichkeit zu unterbrechen
  • Tool-Integration: Vollständiger Zugriff auf alle Tools und benutzerdefinierten MCP-Server während der Sitzung
  • Echtzeit-Feedback: Sehen Sie Antworten, während sie generiert werden, nicht nur die endgültigen Ergebnisse
  • Kontext-Persistenz: Behalten Sie den Gesprächskontext über mehrere Umdrehungen hinweg natürlich bei

Implementierungsbeispiel

Diese Beispiele lesen ein Bild namens diagram.png aus dem Arbeitsverzeichnis. Erstellen Sie zuerst eines dort, oder ändern Sie den Dateinamen, um auf Ihr eigenes Bild zu verweisen.

import { query, type SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
import { readFile } from "fs/promises";

async function* generateMessages(): AsyncGenerator<SDKUserMessage> {
// First message
yield {
type: "user",
message: {
role: "user",
content: "Analyze this codebase for security issues"
},
parent_tool_use_id: null
};

// Wait for conditions or user input
await new Promise((resolve) => setTimeout(resolve, 2000));

// Follow-up with image
yield {
type: "user",
message: {
role: "user",
content: [
{
type: "text",
text: "Review this architecture diagram"
},
{
type: "image",
source: {
type: "base64",
media_type: "image/png",
data: await readFile("diagram.png", "base64")
}
}
]
},
parent_tool_use_id: null
};
}

// Process streaming responses
for await (const message of query({
prompt: generateMessages(),
options: {
maxTurns: 10,
allowedTools: ["Read", "Grep"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}

Wenn Sie das Beispiel ausführen, gibt die TypeScript-Version jede Antwort aus, sobald sie abgeschlossen ist. Die receive_response()-Schleife der Python-Version endet bei der ersten Ergebnismeldung, daher gibt sie die Sicherheitsanalyse aus. Um beide Antworten zu lesen, verwenden Sie ein query()- und receive_response()-Paar pro Nachricht, wie im Beispiel der Python-Referenz zum Fortsetzen einer Konversation gezeigt.

Einzelne Nachricht-Eingabe

Die Eingabe einer einzelnen Nachricht ist einfacher, aber begrenzter.

Wann sollte die Eingabe einer einzelnen Nachricht verwendet werden

Verwenden Sie die Eingabe einer einzelnen Nachricht, wenn:

  • Sie eine One-Shot-Antwort benötigen
  • Sie keine Bild-Anhänge oder Mid-Session-Kontrollmethoden benötigen
  • Sie in einer zustandslosen Umgebung arbeiten müssen, z. B. in einer Lambda-Funktion

Einschränkungen

Wenn eine Abfrage mit einem Fehler endet, z. B. error_max_turns, löst ein einzelner query()-Aufruf einen Fehler aus, der den Fehlertext nach dem Ausgeben der endgültigen Ergebnisnachricht enthält. Wickeln Sie daher die Schleife in einen Try-Block ein, wenn Ihr Code fortgesetzt werden muss. Siehe Ergebnis verarbeiten für die Ergebnis-Untertypen.

Implementierungsbeispiel

import { query } from "@anthropic-ai/claude-agent-sdk";

// Simple one-shot query
// query() throws after an error result, such as error_max_turns
try {
for await (const message of query({
prompt: "Explain the authentication flow",
options: {
maxTurns: 5,
allowedTools: ["Read", "Grep"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
} catch (error) {
console.error(`Query failed: ${error}`);
}

// Continue conversation with session management
try {
for await (const message of query({
prompt: "Now explain the authorization process",
options: {
continue: true,
maxTurns: 5
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
} catch (error) {
console.error(`Query failed: ${error}`);
}

Wenn Sie das Beispiel ausführen, gibt jede Abfrage ihren endgültigen Ergebnistext aus: zuerst die Authentifizierungserklärung, dann die Autorisierungserklärung.