教程

Anthropic Node.js SDK 完全指南:TypeScript/JavaScript 接入 Claude API

Anthropic 官方 Node.js SDK(@anthropic-ai/sdk)完整教程:安装与初始化、基础对话调用、流式输出(stream)、图像输入(Base64/URL)、Tool Use 函数调用、系统提示、消息历史管理、Prompt Caching 配置、错误处理最佳实践(指数退避重试),以及 TypeScript 类型系统深度使用,适合 Node.js / Next.js / NestJS 开发者快速上手。

2026/3/204分钟 阅读ClaudeEagle

@anthropic-ai/sdk 是 Anthropic 官方提供的 Node.js 客户端, 完整支持 TypeScript,覆盖 Claude API 的所有功能。

安装

bash
npm install @anthropic-ai/sdk
# 或
pnpm add @anthropic-ai/sdk

初始化

typescript
import Anthropic from "@anthropic-ai/sdk";

// 自动读取 ANTHROPIC_API_KEY 环境变量
const client = new Anthropic();

// 或显式传入
const client = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
  maxRetries: 3,       // 自动重试次数(默认 2)
  timeout: 60_000,     // 请求超时(ms,默认 10 分钟)
});

基础对话

typescript
const message = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  messages: [
    { role: "user", content: "帮我写一个 TypeScript 的防抖函数" }
  ],
});

// 提取文本回复
const text = message.content[0].type === "text"
  ? message.content[0].text
  : "";
console.log(text);

// 查看 Token 用量
console.log("输入:", message.usage.input_tokens);
console.log("输出:", message.usage.output_tokens);

系统提示

typescript
const message = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 2048,
  system: "你是一位资深 TypeScript 工程师,回答问题时提供完整可运行的代码示例。",
  messages: [
    { role: "user", content: "如何实现一个类型安全的事件总线?" }
  ],
});

流式输出(推荐用于长回复)

typescript
// 方式一:stream helper(推荐)
const stream = await client.messages.stream({
  model: "claude-sonnet-4-6",
  max_tokens: 4096,
  messages: [{ role: "user", content: "写一篇关于 TypeScript 泛型的完整教程" }],
});

// 实时打印
for await (const chunk of stream) {
  if (
    chunk.type === "content_block_delta" &&
    chunk.delta.type === "text_delta"
  ) {
    process.stdout.write(chunk.delta.text);
  }
}

// 获取完整结果
const finalMessage = await stream.getFinalMessage();
console.log("
总 Token:", finalMessage.usage);

// 方式二:原始 SSE 事件
const stream2 = client.messages.stream({...});
stream2.on("text", (text) => process.stdout.write(text));
await stream2.finalMessage();

多轮对话(消息历史管理)

typescript
const history: Anthropic.MessageParam[] = [];

async function chat(userMessage: string): Promise<string> {
  history.push({ role: "user", content: userMessage });

  const response = await client.messages.create({
    model: "claude-sonnet-4-6",
    max_tokens: 1024,
    messages: history,
  });

  const assistantMessage = response.content[0].type === "text"
    ? response.content[0].text : "";

  history.push({ role: "assistant", content: assistantMessage });
  return assistantMessage;
}

// 使用
await chat("你好,我是 Alice");
await chat("我刚才说我叫什么?");  // Claude 会记住 "Alice"

图像输入(Vision)

typescript
import * as fs from "fs";

// Base64 图像
const imageData = fs.readFileSync("screenshot.png").toString("base64");

const message = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  messages: [{
    role: "user",
    content: [
      {
        type: "image",
        source: {
          type: "base64",
          media_type: "image/png",
          data: imageData,
        },
      },
      { type: "text", text: "这张截图里的代码有什么问题?" },
    ],
  }],
});

// URL 图像
const message2 = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  messages: [{
    role: "user",
    content: [
      {
        type: "image",
        source: { type: "url", url: "https://example.com/diagram.png" },
      },
      { type: "text", text: "解释这个架构图" },
    ],
  }],
});

Tool Use(函数调用)

typescript
const tools: Anthropic.Tool[] = [
  {
    name: "get_weather",
    description: "获取指定城市的当前天气",
    input_schema: {
      type: "object" as const,
      properties: {
        city: { type: "string", description: "城市名称,如'北京'、'上海'" },
        unit: { type: "string", enum: ["celsius", "fahrenheit"] },
      },
      required: ["city"],
    },
  },
];

const response = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  tools,
  messages: [{ role: "user", content: "上海今天天气怎么样?" }],
});

// 处理工具调用
if (response.stop_reason === "tool_use") {
  for (const block of response.content) {
    if (block.type === "tool_use") {
      console.log("调用工具:", block.name);
      console.log("参数:", block.input);
      // block.input.city === "上海"
    }
  }
}

Prompt Caching(降低成本)

typescript
const response = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  system: [
    {
      type: "text",
      text: "你是一位专业的代码审查专家...",  // 长系统提示
      cache_control: { type: "ephemeral" },  // 标记为可缓存
    },
  ],
  messages: [{ role: "user", content: userInput }],
});
// 缓存命中时输入 Token 费用降低 90%

错误处理

typescript
import Anthropic from "@anthropic-ai/sdk";

async function safeCall(prompt: string) {
  try {
    return await client.messages.create({
      model: "claude-sonnet-4-6",
      max_tokens: 1024,
      messages: [{ role: "user", content: prompt }],
    });
  } catch (error) {
    if (error instanceof Anthropic.AuthenticationError) {
      // 401:API Key 无效
      throw new Error("API Key 配置错误");
    } else if (error instanceof Anthropic.RateLimitError) {
      // 429:速率限制(SDK 默认会自动重试)
      throw new Error("触发速率限制,请稍后重试");
    } else if (error instanceof Anthropic.APIError) {
      console.error(`API 错误 ${error.status}: ${error.message}`);
      throw error;
    }
    throw error;
  }
}

SDK 默认开启自动重试(429/500/529 会自动指数退避), 通过 maxRetries: 0 可禁用。


来源:Anthropic 官方文档 - docs.anthropic.com/en/api

相关文章推荐

教程Claude API 接入完全教程:从零开始调用 Claude,Python/Node.js 实战(2026)Claude API 从零接入完整教程:Console 注册与 API Key 获取、核心接口概览、Python/Node.js SDK 安装与首次调用、多轮对话、流式输出、System Prompt 配置、REST 直调、模型选择、Token 成本控制与批量 API 省费技巧。2026/3/13教程Claude API Vision 图像理解完全指南:图片分析、截图解读与多图处理Claude API 视觉能力(Vision)完整使用指南:支持的图像格式(PNG/JPEG/GIF/WebP)与大小限制、Base64 编码图像传入方式、URL 直接引用图像、多张图片同时分析、图像与文字混合输入、典型应用场景(截图调试/图表解读/文档扫描/UI分析)、图像 Token 计算方式和成本优化,以及 Python/TypeScript 完整代码示例。2026/3/20教程Claude API 流式输出完全指南:Server-Sent Events 实时响应实战Claude API 流式输出(Streaming)完整教程:为什么用流式输出(用户体验提升50%+)、Server-Sent Events 协议原理、Python/Node.js/curl 三种实现方式、stream=True 的事件类型(message_start/content_block_delta/message_stop)、流式 Tool Use 的特殊处理、在 FastAPI/Express/Next.js 中实现流式 API 端点,以及流式输出的错误处理和超时配置。2026/3/20教程Anthropic Python SDK 完全指南:从安装到生产级集成的最佳实践Anthropic Python SDK 完整使用指南:安装配置、同步与异步客户端、流式输出、工具调用(Tool Use)、视觉 API、Prompt Caching、错误处理与重试、Token 用量追踪、httpx 客户端自定义,以及在 Django/FastAPI/Flask 框架中的集成最佳实践。2026/3/16教程Claude API Key 申请完整教程:从注册 Anthropic Console 到第一次调用Claude API Key 申请完整指南:Anthropic Console 注册、充值方式、API Key 生成与管理、Python/curl 第一次调用验证、用量监控、费用控制与限额设置,以及免费额度和各模型计费说明。2026/3/15教程大模型 Token 是什么?如何估算成本并减少 API 费用大模型 Token 完整解析:Token 定义与中英文计算规律、API 费用双向计费机制、上下文长度与成本关系,以及 5 个降低 API 费用的方法(选对模型/批量 API 省 50%/Prompt 缓存省 90%/控制输出长度/管理对话上下文),附 Anthropic Console 成本监控指南。2026/3/13