跳到主要内容

OpenAI 客户端接入 Anthropic 上游

AISIX 允许应用继续使用 OpenAI Chat Completions 请求格式,同时由网关调用 Anthropic 上游模型。当应用代码已经围绕兼容 OpenAI 的 SDK 构建,但平台团队希望把这类流量路由到 Claude 时,可以使用这一模式。

AISIX 会解析模型别名,将请求转换为 Anthropic Messages 格式,使用已保存的服务提供方凭证调用 Anthropic,并把响应转换回兼容 OpenAI 的 Chat Completions 格式。

准备工作

请先准备以下内容:

  • 一个 Admin 和代理监听器都可用的自托管 AISIX 网关。
  • 网关 config.yaml 中的 Admin Key。
  • Anthropic API Key。
  • 提供给应用使用的明文调用方 API Key。
  • 如需运行 SDK 示例,请准备 Node.js 和官方 OpenAI SDK。

协议转换如何工作

应用继续保持兼容 OpenAI 的客户端契约。服务提供方选择和协议转换都留在网关中完成。

每次请求中,AISIX 都会接收兼容 OpenAI 的 Chat Completions 请求体,将请求中的模型别名解析到 Anthropic 支持的模型,向上游发送 Anthropic Messages 请求,并向客户端返回兼容 OpenAI 的 Chat Completions 响应。

AISIX 也会将 token 用量和停止原因转换为兼容 OpenAI 的响应结构,因此 SDK 调用方可以继续使用原有解析路径。

这一路径适合常见的兼容 OpenAI 的聊天请求。当应用依赖 Anthropic 专属内容块、cache control、thinking blocks 或精确的 Anthropic 工具语义时,建议使用 Anthropic 风格的 /v1/messages 路由。

配置 Anthropic 上游

为 Anthropic 创建服务提供方密钥。api_base 请设置为裸 host,因为 AISIX 会追加 Anthropic 路由路径。

curl -sS -X POST "http://127.0.0.1:3001/admin/v1/provider_keys" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"display_name": "anthropic-prod",
"provider": "anthropic",
"adapter": "anthropic",
"secret": "YOUR_ANTHROPIC_API_KEY",
"api_base": "https://api.anthropic.com"
}'

复制返回的服务提供方密钥 ID,然后创建一个指向该 Anthropic 服务提供方密钥的模型别名。

创建 Anthropic 支持的模型别名:

curl -sS -X POST "http://127.0.0.1:3001/admin/v1/models" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"display_name": "claude-prod",
"provider": "anthropic",
"model_name": "claude-3-5-haiku-20241022",
"provider_key_id": "YOUR_PROVIDER_KEY_ID"
}'

display_name 是兼容 OpenAI 的客户端发送给 AISIX 的 model 值。model_name 是 AISIX 发送给 Anthropic 的上游模型 ID。

如后续需要删除示例资源,请复制返回的模型 ID。

创建调用方 API Key

对明文调用方 API Key 做哈希:

export AISIX_API_KEY="sk-anthropic-via-openai"
export CALLER_KEY_HASH=$(printf '%s' "${AISIX_API_KEY}" | shasum -a 256 | awk '{print $1}')

创建调用方 API Key,并允许它访问 Anthropic 支持的别名:

curl -sS -X POST "http://127.0.0.1:3001/admin/v1/apikeys" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"key_hash": "'"${CALLER_KEY_HASH}"'",
"allowed_models": ["claude-prod"]
}'

如后续需要删除示例资源,请复制返回的调用方 API Key ID。

使用 OpenAI SDK 调用别名

安装 OpenAI SDK:

npm install openai

创建一个最小化 Chat Completions 客户端:

anthropic-via-openai-sdk.mjs
import OpenAI from "openai";

const client = new OpenAI({
apiKey: process.env.AISIX_API_KEY,
baseURL: "http://127.0.0.1:3000/v1",
});

const completion = await client.chat.completions.create({
model: "claude-prod",
messages: [{ role: "user", content: "Say hello from AISIX." }],
});

console.log(completion.choices[0]?.message.content);
console.log(completion.usage);

运行示例:

AISIX_API_KEY="sk-anthropic-via-openai" node anthropic-via-openai-sdk.mjs

响应会保持兼容 OpenAI 的格式。调用方不会收到 Anthropic 风格的内容块。

使用 HTTP 验证

你也可以使用 curl 查看响应:

curl -sS -X POST "http://127.0.0.1:3000/v1/chat/completions" \
-H "Authorization: Bearer sk-anthropic-via-openai" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-prod",
"messages": [{"role":"user","content":"Say hello from AISIX."}]
}'

成功响应会使用兼容 OpenAI 的 Chat Completions 结构:

{
"object": "chat.completion",
"model": "claude-prod",
"choices": [
{
"message": {
"role": "assistant",
"content": "Hello from AISIX."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 5,
"total_tokens": 14
}
}

下一步

你已经将兼容 OpenAI 的客户端路由到 Anthropic 上游。请继续阅读兼容 OpenAI 的 API 了解面向调用方的路由行为;当你希望端到端使用 Anthropic 请求和响应结构时,请阅读 Anthropic 风格 Messages API;如需了解端点与服务提供方支持边界,请阅读服务提供方兼容性