跳转到主内容
本站为独立第三方技术服务商,Claude™ 与 Anthropic® 为 Anthropic, PBC 的商标,本站与 Anthropic 无任何关联、授权或合作关系。

从 OpenAI API 迁移到 Claude API:参数、模型、代码差异完整指南(2026)

从 OpenAI API 迁移到 Claude API 只需改 3 行代码。本文详解 base_url、模型名称映射、不兼容参数列表、streaming/tool use 迁移方法,附 Python/Node.js/curl 完整对照示例。

开发指南Claude APIOpenAI 迁移兼容接口预计阅读12分钟
2026.06.26 发表
openai-to-claude-api-migration-2026--cover

已有 OpenAI API 代码的项目迁移到 Claude API,核心修改只有 3 处:base_urlapi_keymodelclaudeapi.com 提供完整的 OpenAI 兼容接口,无需更换 SDK,现有 OpenAI 代码可直接迁移,大多数场景改动不超过 5 分钟。


一、迁移的 3 行核心改动

字段 迁移前(OpenAI) 迁移后(Claude API)
base_url / apiBase https://api.openai.com/v1 https://gw.claudeapi.com/v1
api_key sk-openai-... sk-claudeapi-...
model gpt-4ogpt-4-turbo claude-sonnet-4-6claude-opus-4-8

其余代码——消息格式、max_tokenstemperaturestreamsystem role——全部兼容,无需修改。


二、模型映射参考

OpenAI 模型 推荐对应 Claude 模型 说明
gpt-4o claude-sonnet-4-6 综合能力对标,成本相近
gpt-4-turbo claude-opus-4-8 复杂推理、长文本
gpt-3.5-turbo claude-haiku-4-5-20251001 轻量快速,成本最低

claudeapi.com 价格(输入/输出 per MTok):Haiku $0.8/$4,Sonnet $2.4/$12,Opus $4/$20。模型名与价格以控制台实际显示为准。


三、运行环境与执行方式

你的电脑 / 服务器(运行 .py 或 .mjs 脚本)
        │  发出 HTTPS 请求

gw.claudeapi.com(独立第三方中转接口)
        │  转发

Claude 模型(返回结果)


打印在你的终端
你的电脑 / 服务器(运行 .py 或 .mjs 脚本)
        │  发出 HTTPS 请求

gw.claudeapi.com(独立第三方中转接口)
        │  转发

Claude 模型(返回结果)


打印在你的终端

3.1 打开终端

系统 方法
Windows 开始菜单搜 cmdPowerShell;VS Code 里按 Ctrl+`
macOS Cmd+Space 搜索 Terminal
Linux Ctrl+Alt+T

3.2 安装依赖

Python 项目:

# 先确认 Python 版本(3.8 以上即可)
python --version

# 安装 openai 包(无需更换,Claude 兼容同一个包)
pip install openai
# 先确认 Python 版本(3.8 以上即可)
python --version

# 安装 openai 包(无需更换,Claude 兼容同一个包)
pip install openai

Node.js 项目:

# 确认 Node 版本(建议 18 以上)
node -v

# 安装
npm install openai
# 确认 Node 版本(建议 18 以上)
node -v

# 安装
npm install openai

1

3.3 配置 API Key

不要把 Key 写死在代码里——一旦提交到 Git 仓库就可能泄露。推荐两种方式:

方式 A:临时环境变量(调试用,关闭终端后失效)

# macOS / Linux
export CLAUDE_API_KEY="你的key"

# Windows PowerShell
$env:CLAUDE_API_KEY="你的key"

# Windows cmd
set CLAUDE_API_KEY=你的key
# macOS / Linux
export CLAUDE_API_KEY="你的key"

# Windows PowerShell
$env:CLAUDE_API_KEY="你的key"

# Windows cmd
set CLAUDE_API_KEY=你的key

⚠️ 必须在运行脚本的同一个终端窗口里执行,新开窗口需重新设置。

方式 B:.env 文件(推荐,长期有效)

在项目根目录新建 .env 文件:

CLAUDE_API_KEY=你的key
CLAUDE_API_KEY=你的key

Python 代码里用 python-dotenv 自动加载:

pip install python-dotenv
pip install python-dotenv
from dotenv import load_dotenv
import os

load_dotenv()   # 自动读取 .env 文件
key = os.environ["CLAUDE_API_KEY"]
from dotenv import load_dotenv
import os

load_dotenv()   # 自动读取 .env 文件
key = os.environ["CLAUDE_API_KEY"]

记得把 .env 加入 .gitignore,避免误提交。


四、完整代码迁移示例

4.1 Python(openai SDK)

迁移前:

from openai import OpenAI

client = OpenAI(api_key="sk-openai-xxx")

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "你是一个代码助手"},
        {"role": "user", "content": "写一个快速排序"}
    ],
    max_tokens=1024,
    temperature=0.7
)
print(response.choices[0].message.content)
from openai import OpenAI

client = OpenAI(api_key="sk-openai-xxx")

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "你是一个代码助手"},
        {"role": "user", "content": "写一个快速排序"}
    ],
    max_tokens=1024,
    temperature=0.7
)
print(response.choices[0].message.content)

迁移后(只改 3 处,其余不动):

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],     # ← 改 1:从环境变量读取 Key
    base_url="https://gw.claudeapi.com/v1"    # ← 改 2:指向 Claude 中转接口
)

response = client.chat.completions.create(
    model="claude-sonnet-4-6",                # ← 改 3:替换为 Claude 模型名
    messages=[
        {"role": "system", "content": "你是一个代码助手"},
        {"role": "user", "content": "写一个快速排序"}
    ],
    max_tokens=1024,      # ✅ 不用改
    temperature=0.7       # ✅ 不用改
)
print(response.choices[0].message.content)
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],     # ← 改 1:从环境变量读取 Key
    base_url="https://gw.claudeapi.com/v1"    # ← 改 2:指向 Claude 中转接口
)

response = client.chat.completions.create(
    model="claude-sonnet-4-6",                # ← 改 3:替换为 Claude 模型名
    messages=[
        {"role": "system", "content": "你是一个代码助手"},
        {"role": "user", "content": "写一个快速排序"}
    ],
    max_tokens=1024,      # ✅ 不用改
    temperature=0.7       # ✅ 不用改
)
print(response.choices[0].message.content)

保存为 demo.py,在文件所在目录执行:

python demo.py
python demo.py

跑通后,终端会直接打印出快速排序代码。若报错,见 §八 排错对照表。


4.2 Node.js(openai npm 包)

迁移前:

import OpenAI from 'openai';

const openai = new OpenAI({ apiKey: 'sk-openai-xxx' });

const response = await openai.chat.completions.create({
  model: 'gpt-4o',
  messages: [{ role: 'user', content: '写一个快速排序' }],
});
console.log(response.choices[0].message.content);
import OpenAI from 'openai';

const openai = new OpenAI({ apiKey: 'sk-openai-xxx' });

const response = await openai.chat.completions.create({
  model: 'gpt-4o',
  messages: [{ role: 'user', content: '写一个快速排序' }],
});
console.log(response.choices[0].message.content);

迁移后(同样只改 3 处):

import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.CLAUDE_API_KEY,          // ← 改 1:从环境变量读取
  baseURL: 'https://gw.claudeapi.com/v1',      // ← 改 2:指向中转接口
});

const response = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',                  // ← 改 3:替换模型名
  messages: [{ role: 'user', content: '写一个快速排序' }],
});
console.log(response.choices[0].message.content);
import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.CLAUDE_API_KEY,          // ← 改 1:从环境变量读取
  baseURL: 'https://gw.claudeapi.com/v1',      // ← 改 2:指向中转接口
});

const response = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',                  // ← 改 3:替换模型名
  messages: [{ role: 'user', content: '写一个快速排序' }],
});
console.log(response.choices[0].message.content);

保存为 demo.mjs,执行:

node demo.mjs
node demo.mjs

4.3 curl(最快验证方式)

不想写代码?用 curl 一行命令直接验证接口是否通畅:

macOS / Linux:

curl -s https://gw.claudeapi.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CLAUDE_API_KEY" \
  -d '{
    "model": "claude-sonnet-4-6",
    "messages": [{"role": "user", "content": "你好,返回 OK 即可"}],
    "max_tokens": 16
  }'
curl -s https://gw.claudeapi.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CLAUDE_API_KEY" \
  -d '{
    "model": "claude-sonnet-4-6",
    "messages": [{"role": "user", "content": "你好,返回 OK 即可"}],
    "max_tokens": 16
  }'

Windows PowerShell:

$body = '{"model":"claude-sonnet-4-6","messages":[{"role":"user","content":"你好,返回 OK 即可"}],"max_tokens":16}'
Invoke-RestMethod -Uri "https://gw.claudeapi.com/v1/chat/completions" `
  -Method POST `
  -Headers @{"Authorization"="Bearer $env:CLAUDE_API_KEY"; "Content-Type"="application/json"} `
  -Body $body
$body = '{"model":"claude-sonnet-4-6","messages":[{"role":"user","content":"你好,返回 OK 即可"}],"max_tokens":16}'
Invoke-RestMethod -Uri "https://gw.claudeapi.com/v1/chat/completions" `
  -Method POST `
  -Headers @{"Authorization"="Bearer $env:CLAUDE_API_KEY"; "Content-Type"="application/json"} `
  -Body $body

返回 JSON 且 choices[0].message.content 有内容,说明接口、Key、模型均配置正确。


4.4 流式输出(Streaming)

流式输出的写法与 OpenAI 完全相同,只需加 stream=True

Python:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],
    base_url="https://gw.claudeapi.com/v1"
)

stream = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "详细解释快速排序的原理"}],
    stream=True,
    max_tokens=1024
)

# 逐块打印,实现打字机效果
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

print()  # 最后换行
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],
    base_url="https://gw.claudeapi.com/v1"
)

stream = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "详细解释快速排序的原理"}],
    stream=True,
    max_tokens=1024
)

# 逐块打印,实现打字机效果
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

print()  # 最后换行

Node.js:

import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.CLAUDE_API_KEY,
  baseURL: 'https://gw.claudeapi.com/v1',
});

const stream = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages: [{ role: 'user', content: '详细解释快速排序的原理' }],
  stream: true,
  max_tokens: 1024,
});

for await (const chunk of stream) {
  const delta = chunk.choices[0]?.delta?.content;
  if (delta) process.stdout.write(delta);
}
console.log();
import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.CLAUDE_API_KEY,
  baseURL: 'https://gw.claudeapi.com/v1',
});

const stream = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages: [{ role: 'user', content: '详细解释快速排序的原理' }],
  stream: true,
  max_tokens: 1024,
});

for await (const chunk of stream) {
  const delta = chunk.choices[0]?.delta?.content;
  if (delta) process.stdout.write(delta);
}
console.log();

4.5 Tool Use(函数调用)

工具定义格式与 OpenAI 完全兼容。完整流程分三步:定义工具 → 模型决定调用 → 回传结果。

Python 完整示例:

import os, json
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],
    base_url="https://gw.claudeapi.com/v1"
)

# 第 1 步:定义工具(格式与 OpenAI 完全相同)
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的实时天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称,如"北京""}
                },
                "required": ["city"]
            }
        }
    }
]

messages = [{"role": "user", "content": "北京今天天气怎么样?"}]

# 第 2 步:第一次请求,模型返回 tool_calls
response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

tool_call = response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
print(f"模型要调用:{tool_call.function.name},参数:{args}")
# 输出示例:模型要调用:get_weather,参数:{'city': '北京'}

# 第 3 步:执行本地函数,把结果回传给模型
def get_weather(city: str) -> str:
    # 这里替换为真实的天气 API 调用
    return f"{city}今天晴,气温 28°C,北风 3 级"

weather_result = get_weather(args["city"])

messages.append(response.choices[0].message)          # 把模型的 tool_calls 消息加入历史
messages.append({
    "role": "tool",
    "tool_call_id": tool_call.id,
    "content": weather_result
})

# 第 4 步:第二次请求,模型根据工具返回结果生成最终回答
final_response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=messages,
    tools=tools
)
print(final_response.choices[0].message.content)
# 输出示例:北京今天天气晴朗,气温 28°C,刮北风 3 级,适合出行。
import os, json
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],
    base_url="https://gw.claudeapi.com/v1"
)

# 第 1 步:定义工具(格式与 OpenAI 完全相同)
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的实时天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称,如"北京""}
                },
                "required": ["city"]
            }
        }
    }
]

messages = [{"role": "user", "content": "北京今天天气怎么样?"}]

# 第 2 步:第一次请求,模型返回 tool_calls
response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

tool_call = response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
print(f"模型要调用:{tool_call.function.name},参数:{args}")
# 输出示例:模型要调用:get_weather,参数:{'city': '北京'}

# 第 3 步:执行本地函数,把结果回传给模型
def get_weather(city: str) -> str:
    # 这里替换为真实的天气 API 调用
    return f"{city}今天晴,气温 28°C,北风 3 级"

weather_result = get_weather(args["city"])

messages.append(response.choices[0].message)          # 把模型的 tool_calls 消息加入历史
messages.append({
    "role": "tool",
    "tool_call_id": tool_call.id,
    "content": weather_result
})

# 第 4 步:第二次请求,模型根据工具返回结果生成最终回答
final_response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=messages,
    tools=tools
)
print(final_response.choices[0].message.content)
# 输出示例:北京今天天气晴朗,气温 28°C,刮北风 3 级,适合出行。

Node.js 完整示例:

import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.CLAUDE_API_KEY,
  baseURL: 'https://gw.claudeapi.com/v1',
});

const tools = [
  {
    type: 'function',
    function: {
      name: 'get_weather',
      description: '获取指定城市的实时天气',
      parameters: {
        type: 'object',
        properties: {
          city: { type: 'string', description: '城市名称' },
        },
        required: ['city'],
      },
    },
  },
];

const messages = [{ role: 'user', content: '北京今天天气怎么样?' }];

// 第一次请求
const response = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages,
  tools,
  tool_choice: 'auto',
});

const toolCall = response.choices[0].message.tool_calls[0];
const args = JSON.parse(toolCall.function.arguments);

// 模拟本地函数执行
const weatherResult = `${args.city}今天晴,气温 28°C,北风 3 级`;

messages.push(response.choices[0].message);
messages.push({
  role: 'tool',
  tool_call_id: toolCall.id,
  content: weatherResult,
});

// 第二次请求,获取最终回答
const finalResponse = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages,
  tools,
});
console.log(finalResponse.choices[0].message.content);
import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.CLAUDE_API_KEY,
  baseURL: 'https://gw.claudeapi.com/v1',
});

const tools = [
  {
    type: 'function',
    function: {
      name: 'get_weather',
      description: '获取指定城市的实时天气',
      parameters: {
        type: 'object',
        properties: {
          city: { type: 'string', description: '城市名称' },
        },
        required: ['city'],
      },
    },
  },
];

const messages = [{ role: 'user', content: '北京今天天气怎么样?' }];

// 第一次请求
const response = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages,
  tools,
  tool_choice: 'auto',
});

const toolCall = response.choices[0].message.tool_calls[0];
const args = JSON.parse(toolCall.function.arguments);

// 模拟本地函数执行
const weatherResult = `${args.city}今天晴,气温 28°C,北风 3 级`;

messages.push(response.choices[0].message);
messages.push({
  role: 'tool',
  tool_call_id: toolCall.id,
  content: weatherResult,
});

// 第二次请求,获取最终回答
const finalResponse = await openai.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages,
  tools,
});
console.log(finalResponse.choices[0].message.content);

五、不兼容参数处理

迁移时需移除或替换以下参数(传入后会被忽略或返回 400):

参数 原因 处理方式
n > 1 Claude 不支持单次多候选 改为多次独立调用
logprobs 不支持 logprob 输出 直接移除
presence_penalty 不支持 直接移除
frequency_penalty 不支持 直接移除
seed 不支持确定性输出 直接移除
function_call(旧格式) 已废弃 改用 tools + tool_choice,参照 §4.5
response_format: json_object 不支持此格式控制参数 在 system prompt 中指定,见下方示例

response_format 替代方案:

# 迁移前(OpenAI 写法)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "返回用户信息"}],
    response_format={"type": "json_object"}   # ← Claude 不支持此参数
)

# 迁移后(用 system prompt 引导 JSON 输出)
response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[
        {
            "role": "system",
            "content": "你必须以合法的 JSON 格式回复,不要包含任何额外文字。"
                       '示例格式:{"name": "张三", "age": 25}'
        },
        {"role": "user", "content": "返回用户信息"}
    ]
)
# 迁移前(OpenAI 写法)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "返回用户信息"}],
    response_format={"type": "json_object"}   # ← Claude 不支持此参数
)

# 迁移后(用 system prompt 引导 JSON 输出)
response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[
        {
            "role": "system",
            "content": "你必须以合法的 JSON 格式回复,不要包含任何额外文字。"
                       '示例格式:{"name": "张三", "age": 25}'
        },
        {"role": "user", "content": "返回用户信息"}
    ]
)

六、迁移检查清单

完成迁移后,逐项核对:

  • [ ] base_url 已改为 https://gw.claudeapi.com/v1
  • [ ] api_key 已换成 claudeapi.com 的 Key,通过环境变量读取(未硬编码进源码)
  • [ ] model 字段已换成 Claude 模型名称
  • [ ] 已移除 n > 1logprobspresence_penaltyfrequency_penaltyseed
  • [ ] 如使用 function_call 旧格式,已更新为 tools + tool_choice
  • [ ] 如使用 response_format: json_object,已改为 system prompt 引导
  • [ ] streaming 响应正常(delta.content 有内容)
  • [ ] tool use 流程正常(finish_reason"tool_calls",回传结果后能得到最终回答)
  • [ ] 错误处理逻辑无需改动(HTTP 状态码体系与 OpenAI 相同)
  • [ ] openai SDK 无需升级或替换

七、验证迁移是否成功

迁移后先跑一条最小请求,确认链路通畅再部署:

macOS / Linux:

curl -s https://gw.claudeapi.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CLAUDE_API_KEY" \
  -d '{"model":"claude-sonnet-4-6","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'
curl -s https://gw.claudeapi.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CLAUDE_API_KEY" \
  -d '{"model":"claude-sonnet-4-6","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'

Windows PowerShell:

Invoke-RestMethod `
  -Uri "https://gw.claudeapi.com/v1/chat/completions" `
  -Method POST `
  -Headers @{"Authorization"="Bearer $env:CLAUDE_API_KEY";"Content-Type"="application/json"} `
  -Body '{"model":"claude-sonnet-4-6","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'
Invoke-RestMethod `
  -Uri "https://gw.claudeapi.com/v1/chat/completions" `
  -Method POST `
  -Headers @{"Authorization"="Bearer $env:CLAUDE_API_KEY";"Content-Type"="application/json"} `
  -Body '{"model":"claude-sonnet-4-6","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'

返回的 JSON 中,choices[0].message.content 有内容即代表接口、Key、模型三者均配置正确。


八、常见报错对照表

报错信息 常见原因 解决方法
ModuleNotFoundError: No module named 'openai' SDK 未安装 执行 pip install openai
KeyError: 'CLAUDE_API_KEY' 环境变量未设,或开了新终端窗口 重新执行 §3.3 的设置命令
401 Unauthorized Key 填错,或用了 OpenAI 的 Key claudeapi.com 控制台重新复制 Key
404 Not Found base_url 末尾缺少 /v1 改为 https://gw.claudeapi.com/v1
400 Bad Request: model not found 模型名拼写错误或版本不存在 从控制台复制完整模型名
Connection refused / Timeout 网络问题或地址写错 核对 base_url,检查本地网络
参数被静默忽略,输出异常 传入了 Claude 不支持的参数 参照 §五 移除不兼容参数
AttributeError: 'NoneType' ... tool_calls 模型未触发工具调用 检查 prompt 是否清楚表达调用意图,或改 tool_choice="required"

九、常见问题(FAQ)

Q:从 OpenAI API 迁移到 Claude API 需要更换 SDK 吗?

不需要。openai 这个包(Python 或 Node.js)可以继续使用,只需在初始化时额外传入 base_url(Python)或 baseURL(Node.js)指向 claudeapi.com 的接口地址即可。SDK 本身不感知底层模型,迁移不涉及任何包升级或替换。

Q:OpenAI 的 system role 在 Claude 里还能用吗?

可以直接用,格式完全相同。{"role": "system", "content": "..."} 放在 messages 数组第一位,Claude 会正确识别为系统提示词,无需任何改动。

Q:迁移后流式输出(streaming)还兼容吗?

完全兼容。stream=True(Python)/ stream: true(Node.js)的写法、逐块读取 chunk.choices[0].delta.content 的方式与 OpenAI 完全一致,不需要修改任何 streaming 相关代码。

Q:function_call 格式能直接用吗,还是要改成 tools

function_call 是 OpenAI 已废弃的旧格式,Claude API 不支持。需要改为 tools + tool_choice 的新格式。工具定义的 JSON Schema 结构、tool_calls 的响应结构、回传 role: tool 的方式与 OpenAI 新格式完全一致,参照 §4.5 的示例修改即可。

Q:response_format: json_object 在 Claude API 里怎么替代?

Claude API 不支持 response_format 参数。替代方案是在 system prompt 中明确要求 JSON 输出格式,例如:"你必须以合法的 JSON 格式回复,不要包含任何额外文字",并可附上示例结构。详见 §五 的代码示例。

Q:gpt-4o 对应哪个 Claude 模型?

综合能力对标推荐 claude-sonnet-4-6,适合日常问答、写作、代码生成等任务,价格也相近。需要更强推理能力或处理超长文档时,可以选 claude-opus-4-8。具体模型名称以 claudeapi.com 控制台显示为准。

Q:迁移后报 401 Unauthorized 怎么排查?

按以下顺序检查:① Key 是否完整复制(有时会漏掉末尾字符);② 是否误用了 OpenAI 的 Key 而不是 claudeapi.com 的 Key;③ 环境变量是否在当前终端窗口中生效(新开窗口需重新设置)。Key 在控制台的「API 密钥」页面可随时重新复制或重新生成。

Q:可以在现有项目里同时保留 OpenAI 和 Claude 两套接入吗?

可以。只需初始化两个客户端实例,分别传入不同的 base_urlapi_key,在代码里按需调用即可:

import os
from openai import OpenAI

# OpenAI 客户端
openai_client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# Claude 客户端(通过 claudeapi.com 中转)
claude_client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],
    base_url="https://gw.claudeapi.com/v1"
)
import os
from openai import OpenAI

# OpenAI 客户端
openai_client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# Claude 客户端(通过 claudeapi.com 中转)
claude_client = OpenAI(
    api_key=os.environ["CLAUDE_API_KEY"],
    base_url="https://gw.claudeapi.com/v1"
)

两套客户端互不影响,便于 A/B 测试或按任务类型分流。


十、更多资源


如已准备好迁移,前往 claudeapi.com 注册并获取 API Key,按以上步骤替换 3 个参数即可开始调用 Claude API。

相关文章