自建 vs LiteLLM vs 商业中转
| 维度 | 自建 Workers | LiteLLM 自托管 | 商业中转 |
|---|---|---|---|
| 部署难度 | 低(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 直接订阅:选哪个
自建网关的好处:完全可控、模型可选、便宜。坏处:
- 维护成本:模型上新、协议变化要自己跟
- 不解决「免外卡」:还是要绑定 Anthropic / OpenAI 信用卡
- 限流 / Quota 仍是 Anthropic / OpenAI 的
如果只是「免外卡 + 一个 key 调 Claude / GPT + 国内可访问」,直接订阅一家商业中转更省心。
Cloudflare Workers Claude 网关的准备材料
一个人运营时可以用表格压住复杂度:负责人、后台入口、到期日、费用来源和回滚动作各占一列,避免换服务商时才发现资料缺口。
涉及 Stripe、公司注册、税表或签证的内容,只能作为操作参考。当前页面没有覆盖你所在司法辖区的特殊规定时,不应把它当成法律或税务意见。
Cloudflare Workers Claude 网关最怕把法律主体、收款工具和产品代码混成一个问题。动手前看清入口位置、配置差异和失败提示,金额较大或涉及税务时应交给专业顾问处理。
| 项目 | 看什么 | 不宜继续的信号 |
|---|---|---|
| 入口位置 | 当前后台、日志或设置页里能直接看到的字段 | 页面提示和手头资料对不上 |
| 配置差异 | 费用、权限、地区或设备造成的实际影响 | 已经影响付款、审核、生产环境或家庭使用 |
| 失败提示 | 回退入口、旧配置、官方支持材料 | 找不到回滚方式,或责任人无法确认 |