---
title: "服务器端工具（Anthropic Claude Messages API）"
description: "了解如何使用 Anthropic Claude Messages API 调用服务器端工具。"
canonical_url: "https://tiptap.zhcndoc.com/content-ai/capabilities/agent/custom-llms/server-side-tools/anthropic-messages"
---

# 服务器端工具（Anthropic Claude Messages API）

了解如何使用 Anthropic Claude Messages API 调用服务器端工具。

本指南介绍如何使用 Anthropic Claude Messages API 调用服务器端工具。示例展示了一个返回指定位置天气的工具。

> **代码演示可用:**
>
> 本指南包含一个代码演示，帮助你快速入门。请参阅[GitHub
> 仓库](https://github.com/ueberdosis/ai-agent-custom-llm-demos)。

首先，在 [Anthropic Claude Messages API 工具格式](https://docs.anthropic.com/en/docs/tool-use)中定义该工具：

```ts
const weatherTool = {
  name: 'get_weather',
  description: '返回指定位置的天气',
  input_schema: {
    type: 'object',
    properties: {
      location: {
        type: 'string',
        description: '要获取天气的位置',
      },
    },
    required: ['location'],
  },
}
```

然后，在调用 Anthropic API 时，将该工具包含在 `tools` 数组中。

```ts
import {
  AiAgentToolkit,
  anthropicMessagesAdapter,
  ChatMessagesFormatter,
} from '@tiptap-pro/extension-ai-agent-server'
import Anthropic from '@anthropic-ai/sdk'

const { chatMessages, schemaAwarenessData } = request

const toolkit = new AiAgentToolkit({
  adapter: anthropicMessagesAdapter,
  schemaAwarenessData,
})

const formatter = new ChatMessagesFormatter({
  initialMessages: chatMessages,
  adapter: anthropicMessagesAdapter,
})

// 初始化 Anthropic 客户端
const anthropic = new Anthropic()

// 调用 Anthropic Claude Messages API
const response = await anthropic.messages.create({
  model: 'claude-sonnet-4-0',
  max_tokens: 2048,
  system: `
<你的系统提示>
${toolkit.getSystemPrompt()}
`,
  messages: formatter.format(),
  // 在 tools 数组中包含天气工具，以及 AiAgentToolkit 提供的其他工具
  tools: [...toolkit.format(), weatherTool],
})
```

首先，将响应添加到 formatter 中，以便包含在对话中。

```ts
formatter.addAiResponse(response)
```

然后，检查响应是否包含服务器端工具调用（如天气工具）。如果包含，则调用该工具并将结果添加到 formatter 中。随后，再次调用 Anthropic API。

重复此流程，直到响应中不再包含服务器端工具调用。

```ts
const isGetWeatherToolUse = (
  content: Anthropic.Messages.ContentBlock,
): content is Anthropic.Messages.ToolUseBlock =>
  content.type === 'tool_use' && content.name === 'get_weather'

let response: Anthropic.Messages.Message | null = null

while (!response || response.content.some(isGetWeatherToolUse)) {
  // 调用 Anthropic Claude Messages API
  response = await anthropic.messages.create({
    model: 'claude-sonnet-4-0',
    max_tokens: 2048,
    system: `${systemPrompt}\n${toolkit.getSystemPrompt()}`,
    messages: formatter.format(),
    // 在 tools 数组中包含天气工具，以及 AiAgentToolkit 的其他工具
    tools: [...toolkit.format(), weatherTool],
  })

  // 将响应转换为 AI Agent 扩展期望的格式
  formatter.addAiResponse(response)

  // 处理天气工具调用
  for (const content of response.content) {
    if (isGetWeatherToolUse(content)) {
      const weatherResult = await getWeather(content.input)

      // 将工具调用结果添加到 formatter
      formatter.addChatMessage({
        type: 'toolCallResult',
        toolName: 'get_weather',
        toolCallId: content.id,
        result: weatherResult,
        isError: false,
      })
    }
  }
}
```

最后，当不再有服务器端工具调用时，使用 `formatter` 将响应转换为 AI Agent 扩展期望的格式。

```ts
const response = formatter.getResolverResponse()
```

从 `formatter.getResolverResponse()` 返回的值即为你的 API 端点响应和解析器函数的返回值。
