第三方大模型api中转为anthropic的claude code API
在coding plan,spec coding风靡全球的环境下,我司某五百强头部新能源还是单机版古法编程,但是内网有部署了开源的模型可以用,辛苦申请了key,但是看文档是openAI标准的接口,open ai标准的api接口和claude code所使用的anthropic的api标准是不一样的,在claude code下不能直接使用。OpenAI API标准:/v1/chat/completi
·
在coding plan,spec coding风靡全球的环境下,我司某五百强头部新能源还是单机版古法编程,但是内网有部署了开源的模型可以用,辛苦申请了key,但是看文档是openAI标准的接口,open ai标准的api接口和claude code所使用的anthropic的api标准是不一样的,在claude code下不能直接使用。
OpenAI API标准:/v1/chat/completions
Anthropic API: /v1/messages
首先想到的就是使用代理,我这里部署的是一个qwen35-35b-a3b-fp8模型, 直接用node写了一个proxy代理:
import express from 'express';
import axios from 'axios';
const app = express();
app.use(express.json());
app.use(express.json({ limit: '10mb' })); // 增加JSON请求体大小限制
app.use(express.urlencoded({ extended: true, limit: '10mb' })); // 增加URL编码请求体大小限制
// ====================== 你只需要改这里 ======================
const CUSTOM_API_BASE = "https://xxx/open-api/1.0/llm/v1/bala bala。。。"; //第三方open api标准接口
const CUSTOM_API_KEY = "你的key";
const PORT = 3000;
// ==========================================================
// Anthropic 标准接口:/v1/messages
app.post('/v1/messages', async (req, res) => {
try {
const anthropicBody = req.body;
// 1. 把 Anthropic 请求 → 转成 OpenAI 格式
const openaiMessages = anthropicBody.messages.map(msg => ({
role: msg.role === 'assistant' ? 'assistant' : 'user',
content: msg.content
}));
const openaiBody = {
model: "qwen35-35b-a3b-fp8",
messages: openaiMessages,
temperature: anthropicBody.temperature || 0.7,
max_tokens: anthropicBody.max_tokens || 1024,
stream: false // 如需流式,我可以再给你流式版本
};
// 2. 调用第三方open ai接口
const customRes = await axios.post(
`${CUSTOM_API_BASE}/chat/completions`,
openaiBody,
{
headers: {
"Authorization": `Bearer ${CUSTOM_API_KEY}`,
"Content-Type": "application/json"
}
}
);
// 3. 把第三方open ai返回 → 转回 Anthropic 格式
const choice = customRes.data.choices?.[0];
const anthropicResponse = {
id: `msg-${Date.now()}`,
type: "message",
role: "assistant",
content: [{ type: "text", text: choice?.message?.content || "" }],
model: anthropicBody.model,
stop_reason: "stop_sequence",
usage: {
input_tokens: customRes.data.usage?.prompt_tokens || 0,
output_tokens: customRes.data.usage?.completion_tokens || 0
}
};
res.json(anthropicResponse);
} catch (err) {
console.error("代理错误:", err.response?.data || err.message);
res.status(500).json({
type: "error",
error: { type: "api_error", message: "代理请求失败" }
});
}
});
app.listen(PORT, () => {
console.log(`Anthropic 兼容代理服务已启动:http://localhost:${PORT}`);
console.log(`Anthropic 接口地址:http://localhost:${PORT}/v1/messages`);
});
配置好你的claude code的setting.json文件就可以了:
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:30000", //这里不用写/v1/messages了
"ANTHROPIC_AUTH_TOKEN": "随便写,因为已经配置在代理中了",
"ANTHROPIC_MODEL": "qwen35-35b-a3b-fp8",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen35-35b-a3b-fp8",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen35-35b-a3b-fp8",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen35-35b-a3b-fp8",
"CLAUDE_CODE_MAX_OUTPUT_TOKENS": "32000",
"OTEL_METRICS_EXPORTER": "otlp",
"CLAUDE_CODE_ENABLE_TELEMETRY": "1"
"API_TIMEOUT_MS": "300000",
"DISABLE_AUTOUPDATER": "1"
},
"includeCoAuthoredBy": false,
"permissions": {
"allow": [
"Bash(npm run lint)",
"Bash(npm run test *)",
"Read(~/.zshrc)",
"Bash(curl *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)"
]
},
"language": "简体中文",
"doc": "https://code.claude.com/docs/zh-CN/settings",
"language": "chinese",
"alwaysThinkingEnabled":true,
"hasCompletedOnboarding": true
}
别忘了"hasCompletedOnboarding": true, 这个可以跳过登录
新增重试机制
配置后,拉胯的要命,代理控制台一直提示代理错误: Too Many Requests继续改造第二步,增加重试机制:
// 2. 调用openai接口(带重试机制)
const maxRetries = 3;
let retryCount = 0;
let customRes;
while (retryCount <= maxRetries) {
try {
customRes= await axios.post(
`${CUSTOM_API_BASE}/chat/completions`,
openaiBody,
{
headers: {
"Authorization": `Bearer ${CUSTOM_API_KEY}`
"Content-Type": "application/json"
}
}
);
break; // 请求成功,跳出循环
} catch (axiosErr) {
// 检查是否是429错误且还有重试次数
if (axiosErr.response?.status === 429 && retryCount < maxRetries) {
retryCount++;
const delay = Math.pow(2, retryCount) * 1000 + Math.random() * 1000; // 指数退避 + 随机延迟
console.log(`请求过于频繁,${delay}ms后第${retryCount}次重试...`);
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw axiosErr; // 其他错误或重试次数用完,抛出异常
}
}
}
放弃了,这就是个呆呆的问答的助手,而非高频率api,大模型是不断去请求的,后台限流了基本是废了。
更多推荐



所有评论(0)