TypeScript SDK V2 Session API(已移除)¶
已废弃的 V2 TypeScript Agent SDK Session API 参考,包含基于 session 的 send/stream 模式实现多轮对话。
V2 session API 已不再支持。TypeScript Agent SDK 0.3.142 移除了 unstable_v2_createSession、unstable_v2_resumeSession、unstable_v2_prompt,以及 SDKSession 和 SDKSessionOptions 类型。
迁移方式:使用 query() API 及其接受的 session 选项。多轮对话传入 AsyncIterable<SDKUserMessage>,恢复已保存会话使用 options.resume。本页仅供维护 Agent SDK 0.2.x 或更早版本代码时参考。
V2 是一套实验性 session API,消除了 async generator 和 yield 协调的复杂度。 每轮对话变成独立的 send()/stream() 调用,API 表面缩减为三个概念:
createSession()/resumeSession():开始或恢复对话session.send():发送消息session.stream():获取响应
安装¶
Agent SDK 0.2.x 是包含 V2 接口的最后版本。 版本号从 0.2.x 直接跳到 0.3.142,因此上面提到的移除版本与下面的安装锁定描述的是同一个边界。安装最后一个兼容 V2 的版本:
```bash theme={null}
npm install @anthropic-ai/[email protected]
<Note>
SDK 会将你平台对应的 Claude Code 原生二进制包含为可选依赖,因此无需单独安装 Claude Code。
</Note>
## 快速开始
### 单次 Prompt
**简单的单轮查询,不需要维护 session。** 使用 `unstable_v2_prompt()` 发送一个数学问题并打印答案:
```typescript theme={null}
import { unstable_v2_prompt } from "@anthropic-ai/claude-agent-sdk";
const result = await unstable_v2_prompt("What is 2 + 2?", {
model: "claude-opus-4-7"
});
if (result.subtype === "success") {
console.log(result.result);
}
V1 等效写法
```typescript theme={null} import { query } from "@anthropic-ai/claude-agent-sdk"; const q = query({ prompt: "What is 2 + 2?", options: { model: "claude-opus-4-7" } }); for await (const msg of q) { if (msg.type === "result" && msg.subtype === "success") { console.log(msg.result); } } ```基本 Session¶
超过单轮的交互需要创建 session。 V2 将发送和流式接收分为两个独立步骤:
send()— 发送消息stream()— 流式接收响应
这种显式分离使得在轮次之间插入逻辑(如处理响应后再发后续消息)更加容易。
下面的示例创建一个 session,向 Claude 发送 "Hello!",并打印文本响应。使用 await using(TypeScript 5.2+)在代码块退出时自动关闭 session。也可以手动调用 session.close()。
```typescript theme={null}
import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
await using session = unstable_v2_createSession({
model: "claude-opus-4-7"
});
await session.send("Hello!");
for await (const msg of session.stream()) {
// 过滤 assistant 消息获取可读输出
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);
}
}
<details>
<summary>V1 等效写法</summary>
V1 中输入和输出都通过单个 async generator 流动。基本 prompt 看起来类似,但添加多轮逻辑需要重构为使用 input generator。
```typescript theme={null}
import { query } from "@anthropic-ai/claude-agent-sdk";
const q = query({
prompt: "Hello!",
options: { model: "claude-opus-4-7" }
});
for await (const msg of q) {
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);
}
}
```
</details>
### 多轮对话
**Session 在多次交互间保持上下文。** 在同一个 session 上再次调用 `send()` 即可继续对话,Claude 会记住之前的轮次。
下面的示例先问一个数学问题,再问一个引用前一个答案的后续问题:
```typescript theme={null}
import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
await using session = unstable_v2_createSession({
model: "claude-opus-4-7"
});
// 第一轮
await session.send("What is 5 + 3?");
for await (const msg of session.stream()) {
// 过滤 assistant 消息获取可读输出
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);
}
}
// 第二轮
await session.send("Multiply that by 2");
for await (const msg of session.stream()) {
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);
}
}
V1 等效写法
```typescript theme={null} import { query } from "@anthropic-ai/claude-agent-sdk"; // 需要创建 async iterable 来提供消息 async function* createInputStream() { yield { type: "user", session_id: "", message: { role: "user", content: [{ type: "text", text: "What is 5 + 3?" }] }, parent_tool_use_id: null }; // 需要协调何时 yield 下一条消息 yield { type: "user", session_id: "", message: { role: "user", content: [{ type: "text", text: "Multiply by 2" }] }, parent_tool_use_id: null }; } const q = query({ prompt: createInputStream(), options: { model: "claude-opus-4-7" } }); for await (const msg of q) { if (msg.type === "assistant") { const text = msg.message.content .filter((block) => block.type === "text") .map((block) => block.text) .join(""); console.log(text); } } ```会话恢复¶
如果有之前交互的 session ID,可以稍后恢复。 适用于长时间运行的工作流或需要跨应用重启持久化对话的场景。
下面的示例创建一个 session、保存其 ID、关闭它,然后恢复对话:
```typescript theme={null}
import {
unstable_v2_createSession,
unstable_v2_resumeSession,
type SDKMessage
} from "@anthropic-ai/claude-agent-sdk";
// 从 assistant 消息提取文本的辅助函数
function getAssistantText(msg: SDKMessage): string | null {
if (msg.type !== "assistant") return null;
return msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
}
// 创建初始 session 并进行对话
const session = unstable_v2_createSession({
model: "claude-opus-4-7"
});
await session.send("Remember this number: 42");
// 从接收到的消息中获取 session ID
let sessionId: string | undefined;
for await (const msg of session.stream()) {
sessionId = msg.session_id;
const text = getAssistantText(msg);
if (text) console.log("Initial response:", text);
}
console.log("Session ID:", sessionId);
session.close();
// 稍后:使用保存的 ID 恢复 session
await using resumedSession = unstable_v2_resumeSession(sessionId!, {
model: "claude-opus-4-7"
});
await resumedSession.send("What number did I ask you to remember?");
for await (const msg of resumedSession.stream()) {
const text = getAssistantText(msg);
if (text) console.log("Resumed response:", text);
}
<details>
<summary>V1 等效写法</summary>
```typescript theme={null}
import { query } from "@anthropic-ai/claude-agent-sdk";
// 创建初始 session
const initialQuery = query({
prompt: "Remember this number: 42",
options: { model: "claude-opus-4-7" }
});
// 从任意消息获取 session ID
let sessionId: string | undefined;
for await (const msg of initialQuery) {
sessionId = msg.session_id;
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log("Initial response:", text);
}
}
console.log("Session ID:", sessionId);
// 稍后:恢复 session
const resumedQuery = query({
prompt: "What number did I ask you to remember?",
options: {
model: "claude-opus-4-7",
resume: sessionId
}
});
for await (const msg of resumedQuery) {
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log("Resumed response:", text);
}
}
```
</details>
### 资源清理
**Session 可以手动或自动关闭。** 使用 [`await using`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management)(TypeScript 5.2+ 的自动资源管理特性)在代码块退出时自动清理。旧版 TypeScript 或遇到兼容问题时使用手动清理。
**自动清理(TypeScript 5.2+):**
```typescript theme={null}
import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
await using session = unstable_v2_createSession({
model: "claude-opus-4-7"
});
// 代码块退出时 session 自动关闭
手动清理:
```typescript theme={null}
import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
const session = unstable_v2_createSession({
model: "claude-opus-4-7"
});
// ... 使用 session ...
session.close();
## API 参考
### `unstable_v2_createSession()`
**创建新的多轮对话 session。**
```typescript theme={null}
function unstable_v2_createSession(options: {
model: string;
// 支持其他选项
}): SDKSession;
unstable_v2_resumeSession()¶
通过 ID 恢复已有 session。
```typescript theme={null}
function unstable_v2_resumeSession(
sessionId: string,
options: {
model: string;
// 支持其他选项
}
): SDKSession;
### `unstable_v2_prompt()`
**单轮查询的便捷函数。**
```typescript theme={null}
function unstable_v2_prompt(
prompt: string,
options: {
model: string;
// 支持其他选项
}
): Promise<SDKResultMessage>;
SDKSession 接口¶
typescript theme={null}
interface SDKSession {
readonly sessionId: string;
send(message: string | SDKUserMessage): Promise<void>;
stream(): AsyncGenerator<SDKMessage, void>;
close(): void;
}
功能可用性¶
V2 session API 不支持所有 V1 功能。 以下功能需要使用 V1 SDK:
- Session 分叉(
forkSession选项) - 部分高级流式输入模式
相关文档¶
- TypeScript SDK 参考(V1)(中文) - 完整的 V1 SDK 文档
- SDK 概览(中文) - SDK 通用概念
- V2 示例(GitHub) - 可运行的代码示例