OpenAI API 迁移到 Claude API 完整指南:代码改动、不兼容参数、迁移检查清单
·
环境说明
- openai Python SDK ≥ 1.0 / openai npm ≥ 4.0
- API 服务:claudeapi.com(OpenAI 兼容)
- 接口地址:
https://gw.claudeapi.com/v1
核心:只需改 base_url、api_key、model 三个字段,无需更换 SDK。
一、Python 迁移
1.1 初始化
# 迁移前
from openai import OpenAI
client = OpenAI(api_key="sk-openai-xxx")
# 迁移后
from openai import OpenAI
client = OpenAI(
api_key="sk-claudeapi-xxx", # 换 key
base_url="https://gw.claudeapi.com/v1" # 换接口地址
)
1.2 基础调用
response = client.chat.completions.create(
model="claude-sonnet-4-6", # 原来是 gpt-4o
messages=[
{"role": "system", "content": "你是一个Python专家"},
{"role": "user", "content": "实现一个线程安全的单例模式"}
],
max_tokens=2048,
temperature=0.7
)
print(response.choices[0].message.content)
1.3 流式输出
stream = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "解释 Python GIL"}],
stream=True,
max_tokens=1024
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
1.4 异步调用
import asyncio
from openai import AsyncOpenAI
async_client = AsyncOpenAI(
api_key="sk-claudeapi-xxx",
base_url="https://gw.claudeapi.com/v1"
)
async def main():
response = await async_client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "写一个异步 HTTP 客户端"}],
max_tokens=1024
)
print(response.choices[0].message.content)
asyncio.run(main())
二、Node.js 迁移
2.1 初始化
// 迁移前
import OpenAI from 'openai';
const client = new OpenAI({ apiKey: 'sk-openai-xxx' });
// 迁移后
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'sk-claudeapi-xxx',
baseURL: 'https://gw.claudeapi.com/v1',
});
2.2 基础调用
const response = await client.chat.completions.create({
model: 'claude-sonnet-4-6',
messages: [
{ role: 'system', content: '你是一个 JavaScript 专家' },
{ role: 'user', content: '实现 Promise.all 的 polyfill' }
],
max_tokens: 2048,
});
console.log(response.choices[0].message.content);
2.3 流式输出
const stream = await client.chat.completions.create({
model: 'claude-sonnet-4-6',
messages: [{ role: 'user', content: '解释事件循环机制' }],
stream: true,
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content ?? '';
process.stdout.write(content);
}
三、Tool Use(函数调用)
OpenAI 的 tools 格式完全兼容,无需修改工具定义。
tools = [
{
"type": "function",
"function": {
"name": "execute_sql",
"description": "执行 SQL 查询并返回结果",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "SQL 查询语句"
},
"database": {
"type": "string",
"description": "数据库名称",
"enum": ["production", "staging", "dev"]
}
},
"required": ["query", "database"]
}
}
}
]
response = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "查询 production 库中用户总数"}],
tools=tools,
tool_choice="auto"
)
# 解析工具调用
message = response.choices[0].message
if message.tool_calls:
for tool_call in message.tool_calls:
print(f"调用函数:{tool_call.function.name}")
print(f"参数:{tool_call.function.arguments}")
四、curl 示例
# 基础调用
curl -s https://gw.claudeapi.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-6",
"messages": [
{"role": "user", "content": "用 Python 实现二分查找"}
],
"max_tokens": 1024
}' | python3 -m json.tool
# 流式调用
curl -s https://gw.claudeapi.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-6",
"messages": [{"role": "user", "content": "解释 TCP 三次握手"}],
"stream": true
}'
五、不兼容参数详表
| 参数 | OpenAI 支持 | Claude 支持 | 迁移处理 |
|---|---|---|---|
n > 1 |
✅ | ❌ | 改为多次独立调用 |
logprobs |
✅ | ❌ | 移除参数 |
top_logprobs |
✅ | ❌ | 移除参数 |
presence_penalty |
✅ | ❌ | 移除(Claude 默认行为类似) |
frequency_penalty |
✅ | ❌ | 移除 |
seed |
✅ | ❌ | 移除(Claude 无确定性输出) |
function_call(旧格式) |
✅(旧) | ❌ | 更新为 tools + tool_choice |
response_format: json_object |
✅ | ❌ | 在 system prompt 中指定 JSON 输出格式 |
max_tokens |
✅ | ✅ | 无需修改 |
temperature |
✅ | ✅ | 无需修改 |
top_p |
✅ | ✅ | 无需修改 |
stop |
✅ | ✅ | 无需修改 |
stream |
✅ | ✅ | 无需修改 |
六、模型名称对照
| OpenAI 模型 | 推荐 Claude 模型 | 输入价格 | 输出价格 |
|---|---|---|---|
| gpt-3.5-turbo | claude-haiku-4-5-20251001 |
$0.8/MTok | $4/MTok |
| gpt-4o | claude-sonnet-4-6 |
$2.4/MTok | $12/MTok |
| gpt-4-turbo | claude-opus-4-8 |
$4/MTok | $20/MTok |
(价格来源:claudeapi.com 控制台,2026-06-25)
七、迁移检查清单
# 快速扫描不兼容参数(Python 项目)
grep -rn "presence_penalty\|frequency_penalty\|logprobs\|\"n\":\s*[2-9]\|function_call\|seed" ./src
逐项核查:
-
base_url已改为https://gw.claudeapi.com/v1 -
api_key已换成 claudeapi.com 的 Key(sk-开头) -
model已换为 Claude 模型名称(完整名,如claude-haiku-4-5-20251001) - 无
n > 1 - 无
logprobs/top_logprobs - 无
presence_penalty/frequency_penalty - 无
seed -
function_call旧格式已更新为tools新格式(如有) -
response_format: json_object已改为 prompt 引导(如有) - streaming 测试通过(delta.content 非空)
- tool use 测试通过(finish_reason 为 “tool_calls”)
- 错误处理逻辑无须修改(HTTP 状态码体系一致)
八、常见错误
401 Unauthorized
{"error": {"message": "Invalid API key", "type": "authentication_error"}}
API Key 错误,检查 key 是否为 claudeapi.com 的 key(不是 OpenAI 的 key)。
404 Not Found
base_url 末尾少了 /v1,正确写法:https://gw.claudeapi.com/v1。
400 Bad Request(model not found)
模型名称不完整,使用完整模型名如 claude-haiku-4-5-20251001。
参数被静默忽略
presence_penalty、seed 等不兼容参数传入后不报错但会被忽略,建议主动清除避免混淆。
更多推荐
所有评论(0)