跳转到主要内容

概述

Claude Agent SDK 支持两种不同的输入模式来与代理交互:
  • 流式输入模式(默认和推荐)- 一个持久的、交互式的会话
  • 单消息输入 - 使用会话状态和恢复的一次性查询
本指南解释了每种模式的差异、优势和用例,以帮助您为应用程序选择正确的方法。

流式输入模式(推荐)

流式输入模式是使用 Claude Agent SDK 的首选方式。它提供对代理功能的完全访问,并支持丰富的交互式体验。 它允许代理作为一个长期运行的进程运行,接收用户输入、处理中断、显示权限请求并处理会话管理。

工作原理

优势

图像上传

直接将图像附加到消息中以进行视觉分析和理解

队列消息

发送多条按顺序处理的消息,具有中断能力

工具集成

在会话期间完全访问所有工具和自定义 MCP 服务器

实时反馈

查看生成的响应,而不仅仅是最终结果

上下文持久性

自然地跨多个回合维护对话上下文

实现示例

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

单消息输入

单消息输入更简单但功能更受限。

何时使用单消息输入

在以下情况下使用单消息输入:
  • 您需要一次性响应
  • 您不需要图像附件或中间会话控制方法
  • 您需要在无状态环境中运行,例如 lambda 函数

限制

单消息输入模式支持:
  • 消息中的直接图像附件
  • 动态消息队列
  • 实时中断
  • 自然的多轮对话

实现示例

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

// Simple one-shot query
for await (const message of query({
  prompt: "Explain the authentication flow",
  options: {
    maxTurns: 1,
    allowedTools: ["Read", "Grep"]
  }
})) {
  if (message.type === "result" && message.subtype === "success") {
    console.log(message.result);
  }
}

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