自建 vs LiteLLM vs 商业中转

维度自建 WorkersLiteLLM 自托管商业中转
部署难度低(10 分钟)高(VPS + DB)0(注册即用)
月成本$0-5$10-30加价 5-30%
模型支持自己写内置 100+内置
自定义路由完全可控中等
适合规模个人 / 小 SaaS中型 SaaS任意

下面走 Workers 自建路线。

最小可行版本

50 行 TypeScript 完成 Claude API 透传:

export default {
  async fetch(req: Request, env: Env) {
    const url = new URL(req.url);
    if (!url.pathname.startsWith('/v1/messages')) {
      return new Response('Not Found', { status: 404 });
    }
    const auth = req.headers.get('authorization');
    if (auth !== `Bearer ${env.GATEWAY_KEY}`) {
      return new Response('Unauthorized', { status: 401 });
    }
    const upstream = await fetch('https://api.anthropic.com/v1/messages', {
      method: 'POST',
      headers: {
        'x-api-key': env.ANTHROPIC_KEY,
        'anthropic-version': '2023-06-01',
        'content-type': 'application/json',
      },
      body: req.body,
    });
    return new Response(upstream.body, {
      status: upstream.status,
      headers: upstream.headers,
    });
  },
};

这个版本透传 Anthropic API,包含基本鉴权。Streaming 透传开箱即用。

加 API Key 轮询

把多个 key 放进 Cloudflare KV:

async function pickKey(env: Env): Promise<string> {
  const keys = JSON.parse(env.KEY_POOL) as string[];
  const validKeys: string[] = [];
  for (const key of keys) {
    const cooldown = await env.KV.get(`cd:${key}`);
    if (!cooldown) validKeys.push(key);
  }
  return validKeys[Math.floor(Math.random() * validKeys.length)];
}

async function markCooldown(env: Env, key: string) {
  await env.KV.put(`cd:${key}`, '1', { expirationTtl: 60 });
}

请求失败(429 / 5xx)时调 markCooldown,下次随机选取自动跳过。

加多模型路由

Claude / GPT 同时支持:

const route = (model: string): { url: string; headers: Record<string, string> } => {
  if (model.startsWith('claude-')) {
    return {
      url: 'https://api.anthropic.com/v1/messages',
      headers: {
        'x-api-key': env.ANTHROPIC_KEY,
        'anthropic-version': '2023-06-01',
      },
    };
  }
  if (model.startsWith('gpt-')) {
    return {
      url: 'https://api.openai.com/v1/chat/completions',
      headers: { authorization: `Bearer ${env.OPENAI_KEY}` },
    };
  }
  throw new Error(`Unknown model: ${model}`);
};

注意:Anthropic / OpenAI 协议不同,要做转换层(用户传 OpenAI 格式 → 内部转 Anthropic 格式 → 返回时再转回)。约 100-150 行额外代码。

Cache 与限流

Cache 对幂等请求:

const cacheKey = await sha256(JSON.stringify({ model, prompt }));
const cached = await caches.default.match(new Request(`/cache/${cacheKey}`));
if (cached) return cached.clone();
// ... 调用 upstream
await caches.default.put(new Request(`/cache/${cacheKey}`), response.clone(), {
  expirationTtl: 3600,
});

限流用 Durable Objects 或 KV + sliding window:

const usage = (await env.KV.get(`usage:${userId}:${date}`)) || '0';
if (Number(usage) > MAX_DAILY) {
  return new Response('Rate limit exceeded', { status: 429 });
}
await env.KV.put(`usage:${userId}:${date}`, String(Number(usage) + 1));

部署

npm install wrangler
wrangler init my-llm-gateway
# 编辑 src/index.ts
wrangler secret put ANTHROPIC_KEY
wrangler secret put OPENAI_KEY
wrangler kv:namespace create KV
# 编辑 wrangler.toml 加入 KV binding
wrangler deploy

10 分钟搞定。

自建 vs 直接订阅:选哪个

自建网关的好处:完全可控、模型可选、便宜。坏处:

  1. 维护成本:模型上新、协议变化要自己跟
  2. 不解决「免外卡」:还是要绑定 Anthropic / OpenAI 信用卡
  3. 限流 / Quota 仍是 Anthropic / OpenAI 的

如果只是「免外卡 + 一个 key 调 Claude / GPT + 国内可访问」,直接订阅一家商业中转更省心。

Cloudflare Workers Claude 网关的准备材料

一个人运营时可以用表格压住复杂度:负责人、后台入口、到期日、费用来源和回滚动作各占一列,避免换服务商时才发现资料缺口。

涉及 Stripe、公司注册、税表或签证的内容,只能作为操作参考。当前页面没有覆盖你所在司法辖区的特殊规定时,不应把它当成法律或税务意见。

Cloudflare Workers Claude 网关最怕把法律主体、收款工具和产品代码混成一个问题。动手前看清入口位置、配置差异和失败提示,金额较大或涉及税务时应交给专业顾问处理。

项目看什么不宜继续的信号
入口位置当前后台、日志或设置页里能直接看到的字段页面提示和手头资料对不上
配置差异费用、权限、地区或设备造成的实际影响已经影响付款、审核、生产环境或家庭使用
失败提示回退入口、旧配置、官方支持材料找不到回滚方式,或责任人无法确认

相关阅读