SpyBara
Go Premium

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

This page contains 38 additions and 72 deletions.

2026
Thu 10 23:00

Streaming Input

Понимание двух режимов ввода для Claude Agent SDK и когда использовать каждый

Обзор

Claude Agent SDK поддерживает два различных режима ввода для взаимодействия с агентами:

  • Режим Streaming Input: постоянная интерактивная сессия
  • Single Message Input: одноразовые запросы, которые используют состояние сессии и возобновление

Режим streaming input - это предпочтительный способ использования Claude Agent SDK. Он обеспечивает полный доступ к возможностям агента и позволяет создавать богатые интерактивные впечатления.

Он позволяет агенту работать как долгоживущий процесс, который принимает пользовательский ввод, обрабатывает прерывания, выводит запросы разрешений и управляет сессией.

Преимущества

В режиме streaming input вы работаете в постоянной сессии со следующими возможностями:

  • Загрузка изображений: прикрепляйте изображения непосредственно к сообщениям для визуального анализа и понимания
  • Очередь сообщений: отправляйте несколько сообщений, которые обрабатываются последовательно, с возможностью прерывания
  • Интеграция инструментов: полный доступ ко всем инструментам и пользовательским MCP серверам во время сессии
  • Обратная связь в реальном времени: смотрите ответы по мере их создания, а не только финальные результаты
  • Сохранение контекста: сохраняйте контекст разговора между несколькими ходами естественным образом

Пример реализации

Эти примеры читают изображение с именем diagram.png из рабочей директории. Создайте его там в первую очередь или измените имя файла, чтобы указать на ваше собственное изображение.

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);
}
}

Когда вы запустите пример, версия TypeScript выводит каждый ответ по мере его завершения. Цикл receive_response() версии Python заканчивается на первом сообщении результата, поэтому он выводит анализ безопасности; чтобы прочитать оба ответа, используйте одну пару query() и receive_response() на сообщение, как показано в примере продолжения разговора в справочнике Python.

Ввод одного сообщения

Ввод одного сообщения проще, но более ограничен.

Когда использовать ввод одного сообщения

Используйте ввод одного сообщения когда:

  • Вам нужен одноразовый ответ
  • Вам не нужны вложения изображений или методы управления в середине сеанса
  • Вам нужно работать в безгосударственной среде, такой как lambda функция

Ограничения

Если запрос заканчивается результатом ошибки, например error_max_turns, один вызов query() вызывает ошибку, которая включает текст сбоя после выдачи финального сообщения результата, поэтому оберните цикл в блок try, если вашему коду нужно продолжить работу. См. Обработка результата для подтипов результатов.

Пример реализации

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}`);
}

Когда вы запустите пример, каждый запрос выведет его финальный текст результата: сначала объяснение аутентификации, затем объяснение авторизации.