简介:本文详细介绍了如何使用Cloudflare Workers搭建OpenAI API代理,适合个人开发者实现低成本的API调用解决方案,涵盖原理、实现步骤、优化策略及安全注意事项。
对于个人开发者而言,直接调用OpenAI API存在三大挑战:
作为Serverless计算平台,Cloudflare Workers提供:
实现以下关键能力:
客户端 → Cloudflare Workers代理 → OpenAI API↑ ↓← 响应缓存与限流控制 ←
npm install -g wrangler
mkdir openai-proxy && cd openai-proxynpm init -ynpm install @cloudflare/workers-typeswrangler init --site
编辑src/index.ts文件:
interface Env {OPENAI_API_KEY: string;}export default {async fetch(request: Request,env: Env,ctx: ExecutionContext): Promise<Response> {// 1. 请求验证const origin = request.headers.get('origin');if (!origin?.includes('yourdomain.com')) {return new Response('Forbidden', { status: 403 });}// 2. 请求重写const url = new URL(request.url);const apiPath = url.pathname.replace('/api/', '');const openaiUrl = `https://api.openai.com/v1/${apiPath}`;// 3. 密钥注入const authHeader = `Bearer ${env.OPENAI_API_KEY}`;const modifiedRequest = new Request(openaiUrl, {method: request.method,headers: {'Authorization': authHeader,'Content-Type': 'application/json',...Object.fromEntries(request.headers),},body: request.body,});// 4. 调用OpenAI APItry {const response = await fetch(modifiedRequest);const data = await response.json();// 5. 响应处理(示例:添加自定义字段)return new Response(JSON.stringify({...data,proxy: {node: ctx.geo?.country || 'unknown',timestamp: new Date().toISOString()}}), {headers: response.headers});} catch (error) {return new Response(JSON.stringify({ error: error.message }), {status: 500});}}};
编辑wrangler.toml:
name = "openai-proxy"main = "src/index.ts"compatibility_date = "2023-07-01"workers_dev = true[vars]OPENAI_API_KEY = "your_actual_key_here" # 实际部署时应通过环境变量配置[triggers]crons = []
# 本地测试wrangler dev# 生产部署wrangler publish
// 在fetch函数顶部添加const clientIp = request.headers.get('cf-connecting-ip') || 'unknown';const rateLimitKey = `rate_limit:${clientIp}`;// 使用KV存储实现简易限流const limit = await env.RATE_LIMIT.get(rateLimitKey);if (limit && parseInt(limit) > 100) { // 每IP每分钟100次return new Response('Rate limit exceeded', { status: 429 });}await env.RATE_LIMIT.put(rateLimitKey, (limit || '0') + 1, { expirationTtl: 60 });
// 在fetch函数中添加缓存逻辑const cacheKey = new Request(url.toString(),{ headers: request.headers }).url;const cache = caches.default;let response = await cache.match(cacheKey);if (!response) {// ...原有OpenAI调用逻辑...// 缓存响应(示例:缓存5分钟)ctx.waitUntil(cache.put(cacheKey, response.clone()));}
cf-connecting-ip头验证请求来源
wrangler secret put OPENAI_API_KEY
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 403错误 | 域名未验证 | 检查CNAME记录配置 |
| 502错误 | Worker超时 | 增加ctx.waitUntil超时时间 |
| 429错误 | 请求过于频繁 | 优化限流策略或升级套餐 |
/batch端点gpt-3.5-turbo而非text-davinci-003通过Cloudflare Workers搭建的OpenAI API代理,个人开发者可以以极低的成本获得稳定、安全的API访问能力。该方案特别适合:
实际部署数据显示,采用此方案后:
建议开发者定期审查代理日志,根据实际使用情况调整缓存策略和限流规则,以获得最佳性能表现。