TypeScript SDK V2 interface (preview)
- Source ID:
src-20260420-6fe6f13a354d - Kind:
document - Scope:
shared - Origin: https://code.claude.com/docs/en/agent-sdk/typescript-v2-preview.md
- Raw path:
sources/raw/typescript-sdk-v2-interface-preview__src-20260420-6fe6f13a354d.md - Status:
active
Tags
official-docs claude-code-cli
Content
Documentation Index
Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt Use this file to discover all available pages before exploring further.
TypeScript SDK V2 interface (preview)
Preview of the simplified V2 TypeScript Agent SDK, with session-based send/stream patterns for multi-turn conversations.
The V2 Claude Agent TypeScript SDK removes the need for async generators and yield coordination. This makes multi-turn conversations simpler, instead of managing generator state across turns, each turn is a separate send()/stream() cycle. The API surface reduces to three concepts:
createSession()/resumeSession(): Start or continue a conversationsession.send(): Send a messagesession.stream(): Get the response
Installation
The V2 interface is included in the existing SDK package:
```bash theme={null} npm install @anthropic-ai/claude-agent-sdk
<Note>
The SDK bundles a native Claude Code binary for your platform as an optional dependency, so you don't need to install Claude Code separately.
</Note>
## Quick start
### One-shot prompt
For simple single-turn queries where you don't need to maintain a session, use `unstable_v2_prompt()`. This example sends a math question and logs the answer:
```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);
}
See the same operation in 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); } } ```Basic session
For interactions beyond a single prompt, create a session. V2 separates sending and streaming into distinct steps:
send()dispatches your messagestream()streams back the response
This explicit separation makes it easier to add logic between turns (like processing responses before sending follow-ups).
The example below creates a session, sends "Hello!" to Claude, and prints the text response. It uses await using (TypeScript 5.2+) to automatically close the session when the block exits. You can also call session.close() manually.
```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()) { // Filter for assistant messages to get human-readable output if (msg.type === "assistant") { const text = msg.message.content .filter((block) => block.type === "text") .map((block) => block.text) .join(""); console.log(text); } }
<details>
<summary>See the same operation in V1</summary>
In V1, both input and output flow through a single async generator. For a basic prompt this looks similar, but adding multi-turn logic requires restructuring to use an 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>
### Multi-turn conversation
Sessions persist context across multiple exchanges. To continue a conversation, call `send()` again on the same session. Claude remembers the previous turns.
This example asks a math question, then asks a follow-up that references the previous answer:
```typescript theme={null}
import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
await using session = unstable_v2_createSession({
model: "claude-opus-4-7"
});
// Turn 1
await session.send("What is 5 + 3?");
for await (const msg of session.stream()) {
// Filter for assistant messages to get human-readable output
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);
}
}
// Turn 2
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);
}
}
See the same operation in V1
```typescript theme={null} import { query } from "@anthropic-ai/claude-agent-sdk"; // Must create an async iterable to feed messages async function* createInputStream() { yield { type: "user", session_id: "", message: { role: "user", content: [{ type: "text", text: "What is 5 + 3?" }] }, parent_tool_use_id: null }; // Must coordinate when to yield next message 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 resume
If you have a session ID from a previous interaction, you can resume it later. This is useful for long-running workflows or when you need to persist conversations across application restarts.
This example creates a session, stores its ID, closes it, then resumes the conversation:
```typescript theme={null} import { unstable_v2_createSession, unstable_v2_resumeSession, type SDKMessage } from "@anthropic-ai/claude-agent-sdk";
// Helper to extract text from assistant messages 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(""); }
// Create initial session and have a conversation const session = unstable_v2_createSession({ model: "claude-opus-4-7" });
await session.send("Remember this number: 42");
// Get the session ID from any received message 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();
// Later: resume the session using the stored ID 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>See the same operation in V1</summary>
```typescript theme={null}
import { query } from "@anthropic-ai/claude-agent-sdk";
// Create initial session
const initialQuery = query({
prompt: "Remember this number: 42",
options: { model: "claude-opus-4-7" }
});
// Get session ID from any message
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);
// Later: resume the 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>
### Cleanup
Sessions can be closed manually or automatically using [`await using`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management), a TypeScript 5.2+ feature for automatic resource cleanup. If you're using an older TypeScript version or encounter compatibility issues, use manual cleanup instead.
**Automatic cleanup (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 closes automatically when the block exits
Manual cleanup:
```typescript theme={null} import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
const session = unstable_v2_createSession({ model: "claude-opus-4-7" }); // ... use the session ... session.close();
## API reference
### `unstable_v2_createSession()`
Creates a new session for multi-turn conversations.
```typescript theme={null}
function unstable_v2_createSession(options: {
model: string;
// Additional options supported
}): SDKSession;
unstable_v2_resumeSession()
Resumes an existing session by ID.
```typescript theme={null} function unstable_v2_resumeSession( sessionId: string, options: { model: string; // Additional options supported } ): SDKSession;
### `unstable_v2_prompt()`
One-shot convenience function for single-turn queries.
```typescript theme={null}
function unstable_v2_prompt(
prompt: string,
options: {
model: string;
// Additional options supported
}
): Promise<SDKResultMessage>;
SDKSession interface
typescript theme={null}
interface SDKSession {
readonly sessionId: string;
send(message: string | SDKUserMessage): Promise<void>;
stream(): AsyncGenerator<SDKMessage, void>;
close(): void;
}
Feature availability
Not all V1 features are available in V2 yet. The following require using the V1 SDK:
- Session forking (
forkSessionoption) - Some advanced streaming input patterns
Feedback
Share your feedback on the V2 interface before it becomes stable. Report issues and suggestions through GitHub Issues.
See also
- TypeScript SDK reference (V1) - Full V1 SDK documentation
- SDK overview - General SDK concepts
- V2 examples on GitHub - Working code examples