在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,大模型是不断去请求的,后台限流了基本是废了。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐