File size: 7,461 Bytes
8da62af
6fb275e
 
 
 
8da62af
 
6fb275e
8da62af
 
6fb275e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
---
title: Grok2API
emoji: 🤖
colorFrom: blue
colorTo: purple
sdk: docker
pinned: false
license: mit
---

# 🤖 Grok2API on HuggingFace Spaces

> 基于 FastAPI 重构的 Grok 反向代理,提供 OpenAI 兼容接口。  
> 支持流式/非流式对话、图像生成/编辑、视频生成、深度推理、Token 池并发与负载均衡。

---

## 📁 仓库文件结构

部署到 HuggingFace Space 只需以下文件:

```
your-space/
├── README.md          # 本文件(含 HF metadata)
├── Dockerfile         # 容器构建配置
└── entrypoint.sh      # 启动脚本(注入环境变量生成 config.toml)
```

---

## 📄 Dockerfile

```dockerfile
FROM python:3.12-slim

# 安装系统依赖
RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/*

# 安装 uv 包管理器
RUN pip install uv --no-cache-dir

# 克隆 grok2api 源码
RUN git clone https://github.com/chenyme/grok2api /app

WORKDIR /app

# 安装 Python 依赖
RUN uv sync

# HuggingFace 文件系统只读,所有写入必须走 /tmp
RUN mkdir -p /tmp/data /tmp/logs

# 复制启动脚本
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh

# 环境变量默认值
ENV DATA_DIR=/tmp/data
ENV LOG_FILE_ENABLED=false
ENV LOG_LEVEL=INFO
ENV SERVER_PORT=7860
ENV SERVER_HOST=0.0.0.0

# HuggingFace Spaces 固定使用 7860 端口
EXPOSE 7860

CMD ["/app/entrypoint.sh"]
```

---

## 📄 entrypoint.sh

```bash
#!/bin/sh
set -e

echo "[entrypoint] Starting grok2api on HuggingFace Space..."

# 确保 /tmp 目录存在
mkdir -p /tmp/data /tmp/logs

# 从环境变量生成 config.toml
# APP_KEY      → 管理后台密码(默认 grok2api,强烈建议修改)
# API_KEY      → 调用 API 时需携带的访问密钥(留空则不鉴权)
# APP_URL      → 对外访问的完整 URL,用于生成文件链接
#                格式: https://你的用户名-grok2api.hf.space
cat > /tmp/data/config.toml << EOF
[app]
app_key   = "${APP_KEY:-grok2api}"
api_key   = "${API_KEY:-}"
app_url   = "${APP_URL:-}"
image_format = "url"
video_format = "html"
temporary    = true
disable_memory = true
stream       = true
thinking     = true

[server]
storage_type = "${SERVER_STORAGE_TYPE:-local}"
storage_url  = "${SERVER_STORAGE_URL:-}"
EOF

echo "[entrypoint] config.toml generated."
echo "[entrypoint] admin panel: ${APP_URL:-http://localhost:7860}/admin"

# 启动 FastAPI 服务
exec uv run granian \
  --interface asgi \
  --host 0.0.0.0 \
  --port 7860 \
  --workers 1 \
  main:app
```

---

## ⚙️ 环境变量配置

在 HuggingFace Space **Settings → Variables and secrets** 中配置以下变量:

### 🔐 Secrets(敏感信息,加密存储)

| 变量名 | 必填 | 说明 | 示例 |
|--------|:----:|------|------|
| `APP_KEY` | ✅ | 管理后台登录密码,**务必修改默认值** | `my-secure-password` |
| `API_KEY` | ⬜ | 调用 `/v1/chat/completions` 时需携带的密钥,留空则不鉴权 | `sk-my-api-key` |
| `SERVER_STORAGE_URL` | ⬜ | 外部数据库 DSN(推荐 Neon PostgreSQL,见下方说明) | `postgresql+asyncpg://user:pass@host/db?sslmode=require` |

### 🌐 Variables(普通变量)

| 变量名 | 必填 | 说明 | 示例 |
|--------|:----:|------|------|
| `APP_URL` | ⬜ | Space 对外 URL,用于生成图片/视频访问链接 | `https://你的用户名-grok2api.hf.space` |
| `SERVER_STORAGE_TYPE` | ⬜ | 存储类型,使用外部数据库时填 `pgsql` | `pgsql` / `local` |
| `LOG_LEVEL` | ⬜ | 日志级别 | `INFO` |

---

## 🗄️ 持久化存储(强烈推荐)

HuggingFace Space **重启后 `/tmp` 数据会丢失**,导致已导入的 Grok Token 全部清空。  
推荐使用 **Neon PostgreSQL 免费版** 做持久化:

1. 前往 [neon.tech](https://neon.tech) 注册,创建一个数据库
2. 复制 Connection String,格式如下:
   ```
   postgresql+asyncpg://user:password@ep-xxx.us-east-2.aws.neon.tech/neondb?sslmode=require
   ```
3. 在 HF Space Secrets 中设置:
   - `SERVER_STORAGE_TYPE` = `pgsql`
   - `SERVER_STORAGE_URL` = 上方连接字符串

> **为什么选 Neon 而非 Supabase?**  
> Supabase 免费项目 7 天无活动会自动暂停,Neon 不会,更适合低频使用场景。

---

## 🚀 部署步骤

### 第一步:创建 Space

1. 登录 [huggingface.co](https://huggingface.co)
2. 点击右上角头像 → **New Space**
3. 填写:
   - Space name: `grok2api`
   - SDK: **Docker**(必须选这个)
   - Hardware: CPU Basic(免费)
4. 点击 **Create Space**

### 第二步:上传文件

```bash
# 克隆 Space 仓库
git clone https://huggingface.co/spaces/你的用户名/grok2api
cd grok2api

# 创建 README.md、Dockerfile、entrypoint.sh(内容见上方)

# 推送
git add .
git commit -m "deploy grok2api"
git push
```

推送后 HuggingFace 自动构建镜像,约 3~5 分钟后服务启动。

### 第三步:配置 Secrets

在 Space 页面 → **Settings → Variables and secrets** 中添加上方表格中的变量。

> 修改 Secrets 后需点击 **Restart Space** 使配置生效。

### 第四步:访问管理后台

```
https://你的用户名-grok2api.hf.space/admin
```

默认密码为 `grok2api`,首次登录后请立即在 Secrets 中设置 `APP_KEY` 修改密码。

---

## 🔑 导入 Grok Token

服务启动后,在管理后台 `/admin` 中:

1. 点击 **Token Management**
2. 点击 **Add Token**,粘贴你的 Grok SSO Token
3. 等待状态变为 **Active** 即可使用

---

## 📡 API 使用示例

将你客户端的 Base URL 替换为 Space 地址即可:

### cURL

```bash
curl https://你的用户名-grok2api.hf.space/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d '{
    "model": "grok-3",
    "stream": true,
    "messages": [{"role": "user", "content": "你好!"}]
  }'
```

### Python(OpenAI SDK)

```python
from openai import OpenAI

client = OpenAI(
    api_key="你的 API_KEY",  # 未设置则填任意字符串
    base_url="https://你的用户名-grok2api.hf.space/v1",
)

response = client.chat.completions.create(
    model="grok-3",
    messages=[{"role": "user", "content": "你好!"}],
    stream=True,
)

for chunk in response:
    print(chunk.choices[0].delta.content or "", end="")
```

---

## 📊 支持的模型

| 模型 | 类型 | 账号要求 |
|------|------|---------|
| `grok-3` | 对话 / 图像 | Basic / Super |
| `grok-3-mini` | 对话 / 图像 | Basic / Super |
| `grok-3-thinking` | 深度推理 | Basic / Super |
| `grok-imagine-1.0` | 图像生成 | Basic / Super |
| `grok-imagine-1.0-edit` | 图像编辑 | Basic / Super |
| `grok-imagine-1.0-video` | 视频生成 | Basic / Super |

---

## ⚠️ 注意事项

| 限制 | 说明 |
|------|------|
| **端口** | HF Space 固定使用 `7860`,不可更改 |
| **休眠** | 免费版 48 小时无访问后自动休眠,首次访问需约 30 秒唤醒 |
| **数据持久化** | 不接外部数据库则重启丢失所有 Token,强烈建议配置 Neon |
| **文件系统只读** | 所有配置/日志必须写入 `/tmp`,entrypoint 已处理 |
| **免责声明** | 本项目仅供学习研究,请遵守 Grok 使用条款及当地法律法规 |

---

## 🔗 相关链接

- [grok2api 源码](https://github.com/chenyme/grok2api)
- [Neon 免费 PostgreSQL](https://neon.tech)
- [HuggingFace Spaces 文档](https://huggingface.co/docs/hub/spaces)