项目简介
纯 Go 实现的 Grok API 网关,管理 Grok Build、Web 和 Console 的多账号池。提供 OpenAI 与 Anthropic 兼容接口,支持路由、限流和凭据加密。
README 预览
\n \n\n\n\n 面向 Grok Build、Grok Web 与 Grok Console 的多账号 API 网关\n\n\n\n \n \n \n\n\n> [!TIP]\n> **个人新项目**\n> 推荐个人新项目 [DEEIX-AI:DEEIX-Chat 轻量化 AI 平台](https://github.com/DEEIX-AI/DEEIX-Chat):企业级模型路由、对话、文件、工具、计费、身份和运维的一体化 AI 平台,全面且极致的低占用,空载运行时仅占用 34 MB。\n\n> [!NOTE]\n> 本项目仅供学习与研究交流。请务必遵循 Grok 的使用条款及当地法律法规,不得用于非法用途!\n\nGrok2API 是一个纯 Go 实现的 Grok API 网关。项目将 Grok Build OAuth、Grok Web SSO 与 Grok Console SSO 组织为独立账号池,对外提供 OpenAI 风格接口、Anthropic Messages 兼容接口,以及账号、模型、密钥、用量和代理管理后台。\n\n## 功能概览\n\n- **三 Provider**:`grok_build`、`grok_web` 与 `grok_console` 独立路由、额度和故障状态\n- **标准接口**:Responses、Chat Completions、Images、异步 Videos、Anthropic Messages\n- **多账号调度**:优先级、并发限制、额度门控、会话粘滞、冷却与故障切换\n- **账号接入**:Device OAuth、OAuth JSON、SSO JSON、逐行 SSO Token\n- **媒体能力**:图片生成、图片编辑、视频生成、图片本地归档与 URL/Base64 返回\n- **基础设施**:SQLite/PostgreSQL、Memory/Redis、HTTP 与 SOCKS 代理池\n- **安全边界**:AES-256-GCM 凭据加密、客户端密钥哈希、日志脱敏、SSRF 与传输上限\n- **管理后台**:Dashboard、账号、模型、客户端密钥、请求审计、接口文档与热加载设置\n\n## 架构\n\n```mermaid\nflowchart LR\n Client["API Client"] --> Gateway["Go Gateway"]\n Admin["React Admin"] --> Gateway\n\n Gateway --> Router["Model Router"]\n Router --> Build["Grok Build"]\n Router --> Web["Grok Web"]\n Router --> Console["Grok Console"]\n\n Build --> BuildPool["OAuth Account Pool"]\n Web --> WebPool["SSO Account Pool"]\n Console --> ConsolePool["SSO Account Pool"]\n Build --> Egress["Egress Pool"]\n Web --> Egress\n Console --> Egress\n\n Gateway --> Database["SQLite / PostgreSQL"]\n Gateway --> Runtime["Memory / Redis"]\n Gateway --> Media["Media Storage"]\n```\n\n## 快速部署\n\n### Docker Compose\n\n1. 准备配置:\n\n```bash\ngit clone https://github.com/chenyme/grok2api.git\ncd grok2api\ncp config.example.yaml config.yaml\n```\n\n2. 生成并填写安全密钥:\n\n```bash\nopenssl rand -hex 32\nopenssl rand -base64 32\n```\n\n```yaml\nsecrets:\n jwtSecret: "替换为 hex 随机值"\n credentialEncryptionKey: "替换为 Base64 随机密钥"\n\nbootstrapAdmin:\n username: "admin"\n password: "替换为强密码"\n```\n\n3. 启动:\n\n
常见问题 (2)
故障排除如何修复 xAI Console API 400 错误:"A tool_choice was set on the request but no tools were specified"?
当规范化后的请求保留了 tool_choice(例如 "auto" 或 "none"),而 tools 为空或缺失时,就会出现这种情况。xAI Console 仅在存在非空的 tools 数组时才接受 tool_choice。
在 backend/internal/infra/provider/console/normalize.go 中,于序列化请求之前添加一个成对守卫(pair-guard)检查:
func ensureConsoleToolChoicePair(payload map[string]any) {
choice, hasChoice := payload["tool_choice"]
if !hasChoice || choice == nil {
return
}
tools, ok := payload["tools"].([]any)
if !ok || len(tools) == 0 {
delete(payload, "tools")
delete(payload, "tool_choice")
}
}
在请求体被序列化并发送到 xAI /responses 端点之前,从 normalizeRequestWithMetadata 中调用 ensureConsoleToolChoicePair(payload)。
即时客户端变通方法:从请求中移除 tool_choice,或仅当 tools 至少包含一个有效工具时才发送它。这可以防止 AxonHub、NextChat 或 LibreChat 等可能发送 tool_choice: "none" 并附带 tools: [] 的客户端收到 HTTP 400 invalid-argument 响应。
故障排除为什么 grok2api 的 grok_web 视频生成功能对于不同的提示词都返回相同的灯塔演示视频,即使任务返回 HTTP 200 且状态为已完成?
此问题是由已降级/免费的 Grok Web 账号返回上游的库存或诱饵视频片段(灯塔、高山湖泊、虎斑猫、农贸市场等)引起的,这些片段会忽略提示词。由于元数据/封装不同,该片段可能具有不同的 assetId、URL 和整文件 SHA256,但解码后的 H.264 内容仍是同一段库存视频。日志中的 403: This page is out of date 也表明该账号/会话已降级。
修复方法:将 grok2api 从 v3.1.5 升级到包含 PR feat(video): detect stock decoy clips by mdat fingerprint and retry 的发布版本/构建。该修复会对 MP4 的 mdat/解码流进行指纹识别,而不是依赖 URL 或文件 SHA256,从而识别已知的诱饵片段,将此次生成视为失败,并使用另一个账号重试。使用以下命令重新部署:
docker pull ghcr.io/chenyme/grok2api:latest
docker compose up -d
如果你正在使用的版本中尚未包含该 PR,请使用基于已合并提交的构建。作为临时解决方案,可以重新验证或移除返回 403 的账号,切换到健康/未降级或付费的 Grok 账号,或者更换服务提供商。在诱饵检测通过之前,不要将 HTTP 200/completed 视为成功;请验证实际解码出的帧。仅更改提示词或代理无法解决此问题。