├── README.md └── workers.js /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Grok API Proxy 3 | 4 | ![Cloudflare Workers](https://img.shields.io/badge/Cloudflare-Workers-orange) ![xAI](https://img.shields.io/badge/xAI-Grok-blue) ![License](https://img.shields.io/badge/license-MIT-green) 5 | 6 | ## 项目概述 7 | 8 | `grok-api-proxy` 是一个基于 [Cloudflare Workers](https://workers.cloudflare.com/) 的代理服务,用于中转 [xAI Grok API](https://api.x.ai/) 请求。它利用 Cloudflare 的全球边缘网络加速对 `https://api.x.ai/v1/chat/completions` 的访问,客户端需提供自己的 xAI API 密钥,确保灵活性和安全性。 9 | 10 | - **部署地址**: [https://grok.bkgr.workers.dev/](https://grok.bkgr.workers.dev/) 11 | - **GitHub**: [https://github.com/tianrking/grok-api-proxy](https://github.com/tianrking/grok-api-proxy) 12 | 13 | ## 功能 14 | 15 | - **API 中转**: 将客户端请求转发到 xAI 的 Grok API。 16 | - **加速访问**: 通过 Cloudflare 的 CDN 优化网络延迟。 17 | - **密钥灵活性**: 支持客户端使用自己的 xAI API 密钥,无需在代理端存储。 18 | - **流式/非流式支持**: 兼容 Grok API 的所有响应模式。 19 | 20 | ## 部署步骤 21 | 22 | 1. **创建 Worker**: 23 | - 登录 [Cloudflare 仪表板](https://dash.cloudflare.com/),进入 “Workers & Pages” 页面。 24 | - 点击 “Create Worker”,粘贴 `worker.js` 中的代码。 25 | - 部署到你的 Workers 域名(例如 `grok.bkgr.workers.dev`)。 26 | 27 | 2. **无需配置密钥**: 28 | - 本项目不存储 xAI API 密钥,密钥由客户端通过 `Authorization` 请求头提供。 29 | 30 | 3. **绑定自定义域名(可选)**: 31 | - 在 “Triggers” 中添加自定义路由,如 `api.yourdomain.com/*`。 32 | 33 | ## 使用方法 34 | 35 | ### 测试接口 36 | 37 | 以下是一个使用 `curl` 测试代理服务的真实示例: 38 | 39 | ```bash 40 | curl https://grok.bkgr.workers.dev/v1/chat/completions \ 41 | -H "Content-Type: application/json" \ 42 | -H "Authorization: Bearer " \ 43 | -d '{ 44 | "messages": [ 45 | { 46 | "role": "system", 47 | "content": "You are a test assistant." 48 | }, 49 | { 50 | "role": "user", 51 | "content": "Testing. Just say hi and hello world and nothing else." 52 | } 53 | ], 54 | "model": "grok-2-latest", 55 | "stream": false, 56 | "temperature": 0 57 | }' 58 | ``` 59 | 60 | 参数说明 61 | URL: https://grok.bkgr.workers.dev/v1/chat/completions - 代理服务端点。 62 | Authorization: 替换 为你的 xAI API 密钥(例如 xai-XXXX)。 63 | model: grok-2-latest - 当前映射到 grok-2-1212(2024年12月版本)。 64 | stream: false 表示非流式响应,true 启用流式。 65 | temperature: 0 确保输出一致性。 66 | 67 | ```json 68 | json 69 | { 70 | "id": "dccd196b-afb1-4adf-bd3f-c2cf3dc6f1cc", 71 | "object": "chat.completion", 72 | "created": 1740021634, 73 | "model": "grok-2-1212", 74 | "choices": [ 75 | { 76 | "index": 0, 77 | "message": { 78 | "role": "assistant", 79 | "content": "Hi\nHello world", 80 | "refusal": null 81 | }, 82 | "finish_reason": "stop" 83 | } 84 | ], 85 | "usage": { 86 | "prompt_tokens": 28, 87 | "completion_tokens": 5, 88 | "total_tokens": 33, 89 | "prompt_tokens_details": { 90 | "text_tokens": 28, 91 | "audio_tokens": 0, 92 | "image_tokens": 0, 93 | "cached_tokens": 0 94 | } 95 | }, 96 | "system_fingerprint": "fp_c612364da3" 97 | } 98 | ``` 99 | 100 | 说明: 101 | "content": "Hi\nHello world" - 完全符合请求要求。 102 | "created": 1740021634 - Unix 时间戳,对应 2025年2月19日。 103 | "model": "grok-2-1212" - 表示 grok-2-latest 当前指向的版本。 104 | 错误示例 105 | 如果未提供有效密钥: 106 | 107 | ```json 108 | json 109 | { 110 | "error": "Missing or invalid Authorization header. Please provide a valid Bearer token." 111 | } 112 | ``` 113 | 114 | ## 注意事项 115 | - 密钥权限: 确保你的 xAI API 密钥有权访问指定模型(如 grok-2-latest)。 116 | - 模型名称: grok-2-latest 当前有效,若需使用其他模型(如 grok-3),请查阅 xAI API 文档。 117 | - 流量限制: Cloudflare 免费计划每天10万次请求,超出需升级付费计划。 118 | - 调试: 若遇到问题,可在 Worker 中添加 console.log 并查看 Cloudflare 日志。 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /workers.js: -------------------------------------------------------------------------------- 1 | // worker.js - Cloudflare Worker 脚本,用于中转 xAI Grok API 请求 2 | // 作者: w0x7ce 3 | // 描述: 该脚本通过 Cloudflare Worker 提供 xAI Grok API 的代理服务,客户端需提供自己的 API 密钥。 4 | 5 | // xAI Grok API 的官方端点 6 | const XAI_API_URL = 'https://api.x.ai/v1/chat/completions'; 7 | 8 | /** 9 | * 处理传入的 HTTP 请求并转发到 xAI API 10 | * @param {Request} request - 客户端发来的请求对象 11 | * @returns {Response} - 转发后的响应或错误信息 12 | */ 13 | async function handleRequest(request) { 14 | // 从请求头中提取客户端提供的 Authorization(API 密钥) 15 | const clientAuth = request.headers.get('Authorization'); 16 | 17 | // 检查是否提供了有效的 Bearer 密钥 18 | if (!clientAuth || !clientAuth.startsWith('Bearer ')) { 19 | return new Response( 20 | JSON.stringify({ 21 | error: 'Missing or invalid Authorization header. Please provide a valid Bearer token.', 22 | }), 23 | { 24 | status: 401, // 未授权 25 | headers: { 'Content-Type': 'application/json' }, 26 | } 27 | ); 28 | } 29 | 30 | // 复制客户端的请求头,并确保 Content-Type 为 JSON 31 | const headers = new Headers(request.headers); 32 | headers.set('Content-Type', 'application/json'); 33 | 34 | // 获取请求体(JSON 格式) 35 | const body = await request.text(); 36 | 37 | // 构造转发请求,保持原始方法、头和体 38 | const proxyRequest = new Request(XAI_API_URL, { 39 | method: request.method, 40 | headers: headers, 41 | body: body, 42 | }); 43 | 44 | // 转发请求到 xAI API 并获取响应 45 | const response = await fetch(proxyRequest); 46 | 47 | // 检查请求是否要求流式响应 48 | let stream = false; 49 | try { 50 | const requestData = JSON.parse(body); 51 | stream = requestData.stream || false; 52 | } catch (e) { 53 | // 如果 JSON 解析失败,默认非流式 54 | console.log('Failed to parse request body:', e); 55 | } 56 | 57 | // 根据 stream 参数返回流式或非流式响应 58 | if (stream) { 59 | // 流式响应:直接返回原始响应流 60 | return new Response(response.body, { 61 | status: response.status, 62 | statusText: response.statusText, 63 | headers: response.headers, 64 | }); 65 | } else { 66 | // 非流式响应:等待完整响应后返回 67 | const responseData = await response.text(); 68 | return new Response(responseData, { 69 | status: response.status, 70 | statusText: response.statusText, 71 | headers: { 'Content-Type': 'application/json' }, 72 | }); 73 | } 74 | } 75 | 76 | // 监听 Cloudflare Worker 的 fetch 事件 77 | addEventListener('fetch', event => { 78 | event.respondWith(handleRequest(event.request)); 79 | }); 80 | --------------------------------------------------------------------------------