把通義千問(Qwen)Web 端能力轉換成 OpenAI / Anthropic Claude / Gemini 相容介面的自託管網關。
Language: English · 繁體中文
💡 想直接體驗服務效果? 我自己部署了一份公開可用的實例,可從這裡試用 → https://x.com/i/status/2063271049199046672
(本倉庫是給想自架的人;只想用一下不必自己跑。)
本專案是 YuJunZhiXue/qwen2API(Python + React)的 Rust 後端 + 純原生前端重寫版,並非原作者,原始設計與協議分析歸功於上游。基準上游版本與同步流程見
dev/UPSTREAM.md。
axum + tokio + reqwest + serde),單一靜態二進位,低記憶體、高並發。HTML + CSS + JS 三檔(web/),零框架、零建置、可離線。/v1/chat/completions)串流 + 非串流/v1/responses)typed SSE events/v1/messages、/anthropic/v1/messages)串流 + 非串流 + count_tokensgenerateContent / streamGenerateContent/v1/images/generations)— 驅動 Qwen 影像生成/v1/files)+ 對話附件(自動阿里 OSS V4 上傳 / 小文字檔內聯)tool_call(Qwen Web 無原生工具)/chats/new 0.5~6s 握手;對上萬帳號有覆蓋數上限保護)/healthz、/readyz 探針
數據統計 · 請求 / Tokens / TTFT 分桶,按模型 + 接口拆分
|
圖片生成 · 批次提交、比例切換、本地永久保存
|
影片生成 · 異步任務佇列 + 自動重試 + 智慧跳過無 t2v 權限帳號
|
需求:Rust 1.80+(已測 1.93)。
cp .env.example .env # 設定 ADMIN_KEY、PORT 等
mkdir -p data
# 放入帳號:data/accounts.json = [{"email","token", ...}, ...]
# token = 在 chat.qwen.ai 登入後,localStorage 裡的 token 原始值
# 範本見 dev/accounts.example.json
cargo run --release
啟動後:
- WebUI:http://127.0.0.1:7860/(系統設置頁貼上 ADMIN_KEY 或任一 API Key 作為會話金鑰)
- API Base:http://127.0.0.1:7860
呼叫範例(OpenAI 相容):
curl http://127.0.0.1:7860/v1/chat/completions \
-H "Authorization: Bearer <你的 API Key 或 ADMIN_KEY>" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"你好"}],"stream":true}'
Anthropic 相容:
curl http://127.0.0.1:7860/v1/messages \
-H "x-api-key: <你的 API Key 或 ADMIN_KEY>" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"claude-3-5-sonnet-20241022","max_tokens":1024,"messages":[{"role":"user","content":"你好"}]}'
模型名可用任意 OpenAI / Claude / Gemini 名稱(自動映射到 Qwen,未知者回退 DEFAULT_MODEL),或直接用 qwen3.7-plus、qwen3.7-plus-thinking 等(/v1/models 可查全部)。
兩種皆可(單一靜態 binary,rustls 無需系統 OpenSSL)。
與原專案相同的 docker-compose 工作流;映像約 145MB(debian-slim 基底,比原 Python 版含 camoufox 小很多;可改 distroless/musl 再瘦身)。
# data/ 可直接沿用原版(放 accounts.json 等)
mkdir -p data
vim docker-compose.yml # 修改 ADMIN_KEY 等
docker compose up -d --build
docker compose logs -f
./data 掛到容器 /app/data。HEALTHCHECK(打 /healthz)。git pull && docker compose up -d --build。cargo build --release # 產出 target/release/qwen2api-rs
cp .env.example .env && vim .env
mkdir -p data # 放 accounts.json
WEB_DIR=web ./target/release/qwen2api-rs
建議用 systemd 常駐(/etc/systemd/system/qwen2api-rs.service):
[Unit]
Description=qwen2api-rs gateway
After=network.target
[Service]
WorkingDirectory=/opt/qwen2api-rs
EnvironmentFile=/opt/qwen2api-rs/.env
ExecStart=/opt/qwen2api-rs/qwen2api-rs
Restart=always
[Install]
WantedBy=multi-user.target
Docker vs Binary 取捨:Docker = 可重現、隔離、跨發行版可攜、與原版同流程、易更新 / 重啟;Binary = 啟動最快、佔用最小、無需 docker,但需自行用 systemd 常駐且跨機需注意 glibc 版本(或用 musl 靜態編譯)。
完整清單見 .env.example(含風控 / 帳號池 / 上下文等 20+ 項)。變數名與原 Python 版相容,可直接指向同一份 data/。
| 變數 | 用途 | 預設 |
|---|---|---|
PORT |
服務埠 | 7860 |
ADMIN_KEY |
管理台金鑰 | change-me-now |
MAX_INFLIGHT_PER_ACCOUNT |
每帳號同時在途請求數 | 2 |
MAX_RETRIES |
跨帳號重試次數 | 3 |
ACCOUNT_MIN_INTERVAL_MS |
同帳號最小請求間隔(風控) | 3000 |
CHAT_ID_PREWARM_TARGET_PER_ACCOUNT |
chat_id 預熱池每帳號目標數 | 5 |
DEFAULT_MODEL |
未知下游模型回退 | qwen3.7-plus |
DATA_DIR |
資料目錄 | ./data |
Authorization: Bearer <key>、x-api-key、或 ?key=。data/api_keys.json 有設定 key,則必須使用 ADMIN_KEY / 已建立的 key;否則放行任意 key。/api/admin/*:Bearer 須等於 ADMIN_KEY 或已建立的 key。技術棧與 Python→Rust 模組對應見 dev/ARCHITECTURE.md;實測捕捉的上游協議(含 SSE 格式)見 dev/PROTOCOL.md。
src/
main.rs 入口 / 路由
config.rs state.rs db.rs error.rs util.rs auth.rs
account/ 帳號池(account.rs / pool.rs)
upstream/ 上游傳輸(client / payload / sse / executor / chat_id_pool)
request/ 標準請求構建(model_modes / prompt_builder / client_profiles / model_catalog)
toolcall/ 工具調用(注入 + 解析 + 名稱混淆)
execution/ 編排 + 串流翻譯(translator / presenter / formatters)
context/ 附件 / OSS V4 上傳 / 本地檔案庫
api/ 各協議端點(openai / anthropic / gemini / responses / images / videos / files / embeddings / admin / probes)
stats.rs SQLite 統計子系統
media.rs 媒體任務佇列(圖片 / 影片)
web/ 純前端三檔(index.html / app.js / style.css)
dev/ 開發筆記(上游版本追蹤、架構、協議捕捉、部署)
chat.qwen.ai 純 HTTP signin + 自動 refresh worker。qwen3.7-plus。<tool_call>{json}</tool_call>)注入 + 解析(brace-balanced,無 regex 失誤)。stats.rs 統計面板(請求量 / Tokens / TTFT / 按模型 + 接口拆分)。詳見 dev/UPSTREAM.md。
僅供學習與自託管研究。Qwen 為阿里巴巴商標,使用需遵守其服務條款;本專案不保證上游 web 介面行為穩定。
$ claude mcp add qwen2api-rs \
-- python -m otcore.mcp_server <graph>