개요
순수 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
FAQ (2)
문제 해결xAI Console API 400 오류 해결 방법: "A tool_choice was set on the request but no tools were specified"?
이 문제는 정규화된 요청에서 tools가 비어 있거나 누락된 상태로 tool_choice(예: "auto" 또는 "none")가 유지될 때 발생합니다. 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가 포함된 릴리스/빌드로 업그레이드하세요. 해당 수정은 URL이나 파일 SHA256에 의존하는 대신 MP4 mdat/디코딩된 스트림의 지문을 추출하여 알려진 디코이 클립을 식별하고, 생성을 실패로 처리한 뒤 다른 계정으로 재시도합니다. 다음 명령으로 재배포하세요:
docker pull ghcr.io/chenyme/grok2api:latest
docker compose up -d
사용 중인 릴리스에 해당 PR이 포함되어 있지 않다면, 병합된 커밋의 빌드를 사용하세요. 즉각적인 해결 방법으로는 403을 반환하는 계정을 재인증하거나 제거하고, 정상/성능 저하되지 않은 또는 유료 Grok 계정으로 교체하거나, 제공업체를 전환하세요. 디코이 검사를 통과하기 전까지는 HTTP 200/completed를 성공으로 간주하지 마세요. 실제 디코딩된 프레임을 확인하세요. 프롬프트나 프록시만 변경해서는 이 문제가 해결되지 않습니다.