YuJunZhiXue/qwen2API
GitHub: YuJunZhiXue/qwen2API
将 Qwen 网页端转换为兼容 OpenAI、Anthropic 和 Gemini API 格式的自托管协议网关,附带 WebUI 管理界面。
Stars: 855 | Forks: 272
[English](README.md) | [简体中文](README_CN.md)
## 一、项目简介 / Project Overview
qwen2API 将 Qwen Web 的功能转换为通用的 API 协议,并提供本地的 WebUI,用于账户管理、下游 API key、运行时设置、模型测试、图像测试和视频测试。
### 1. 功能图谱
| 领域 | 功能 |
| --- | --- |
| 兼容 OpenAI 的 API | `/v1/chat/completions`, `/v1/responses`, `/v1/models`, `/v1/files`, `/v1/images/generations`, `/v1/videos/generations` |
| 兼容 Anthropic 的 API | `/v1/messages`, `/anthropic/v1/messages`, `/v1/messages/count_tokens` |
| 兼容 Gemini 的 API | `/v1beta/models/{model}:generateContent`, `/v1beta/models/{model}:streamGenerateContent` |
| WebUI | 账户、API key、运行时配置、对话测试、图像测试、视频测试 |
| 账号池 | 多账号轮换、单账号并发、独立的对话/图像/视频冷却时间追踪 |
| 运维 | `/healthz`, `/readyz`, `/keepalive`, Docker healthcheck, 多架构镜像发布 |
### 2. 版本线
| 版本 | 技术栈 | 状态 |
| --- | --- | --- |
| `v1.0` | Python + FastAPI/Uvicorn | 历史旧版本,仅作为历史背景保留 |
| `v2.0` | Go 后端 + React WebUI | 当前主线 |
## 二、快速部署 / Quick Deployment
### 1. 从 Docker Hub 拉取
对于大多数部署情况,请直接使用 Docker Hub 镜像。将 `data` 和 `logs` 保存在您的 compose 文件旁边;Docker 会将它们挂载到容器中,这样升级时就不会清除您的账户、key 或日志。
```
mkdir qwen2api
cd qwen2api
mkdir -p data logs
```
创建一个简单的 `.env` 文件:
```
HOST_PORT=7860
HOST_DATA_DIR=./data
HOST_LOGS_DIR=./logs
ADMIN_KEY=replace-with-your-own-strong-random-key
```
创建 `docker-compose.yml` 文件:
```
services:
qwen2api:
image: ${QWEN2API_IMAGE:-yujunzhixue/qwen2api:latest}
container_name: qwen2api
restart: unless-stopped
init: true
env_file:
- .env
ports:
- "${HOST_PORT:-7860}:${PORT:-7860}"
volumes:
- ${HOST_DATA_DIR:-./data}:/app/data
- ${HOST_LOGS_DIR:-./logs}:/app/logs
shm_size: "512m"
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:${PORT:-7860}/healthz || exit 1"]
interval: 30s
timeout: 10s
start_period: 120s
retries: 3
```
您无需为 `accounts.json`、`api_keys.json` 或其他内部文件设置路径。镜像内部已经使用了 `/app/data` 和 `/app/logs`;上面的卷映射决定了这些文件在宿主机上的存放位置。
启动它:
```
docker compose pull
docker compose up -d
docker compose logs -f qwen2api
```
打开:
- WebUI: `http://127.0.0.1:7860`
- 健康检查: `http://127.0.0.1:7860/healthz`
- 保活探测: `http://127.0.0.1:7860/keepalive`
### 2. 使用 Docker 在本地构建
当您修改了源代码并需要构建自己的镜像时,请使用此路径。
```
git clone https://github.com/YuJunZhiXue/qwen2API.git
cd qwen2API
cp .env.example .env
docker compose -f docker-compose.yml -f docker-compose.build.yml build
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d
```
## 三、架构与配置 / Architecture and Configuration
### 1. 运行时架构
```
flowchart LR
subgraph Clients["API Clients"]
OpenAI["OpenAI SDK / Chat Completions"]
Anthropic["Claude / Anthropic Messages"]
Gemini["Gemini-compatible clients"]
CLI["Claude Code / Codex / other CLI tools"]
end
subgraph App["qwen2API v2.0"]
WebUI["React WebUI"]
Router["Go HTTP Router"]
Adapter["Protocol Adapters"]
Tools["Tool-call / Context Pipeline"]
Pool["Qwen Account Pool"]
Store["JSON Stores / Data Files"]
end
subgraph Runtime["Runtime"]
Docker["Docker image"]
Data["./data volume"]
Logs["./logs volume"]
end
Qwen["Qwen Web Upstream"]
OpenAI --> Router
Anthropic --> Router
Gemini --> Router
CLI --> Router
WebUI --> Router
Router --> Adapter
Adapter --> Tools
Tools --> Pool
Pool --> Qwen
Pool --> Store
Store --> Data
Router --> Logs
Docker --> App
```
### 2. 环境变量
不要提交真实的 secret。`.env.example` 中仅故意保留了空值和注释示例。
| 变量 | 描述 |
| --- | --- |
| `ADMIN_KEY` | WebUI 和 `/api/admin/*` 管理 key。请设置一个强大的私有值。 |
| `QWEN_API_KEY`, `QWEN_API_KEYS`, `QWEN_API_KEY_N` | 从环境变量注入的、仅用于运行时的下游 API key。它们不会保存到 `data/api_keys.json` 中,也不能从 WebUI 中删除。 |
| `QWEN_ACCOUNT_N` | 仅用于运行时的上游 Qwen 账户,格式为 `token;optional-email;optional-password`。它不会保存到 `data/accounts.json` 中。 |
| `KEEPALIVE_URL`, `KEEPALIVE_INTERVAL` | 可选的后台保活任务。环境变量的值会锁定 WebUI 中的相同设置。 |
| `TOOL_RECOVERY_MAX_ATTEMPTS` | 当工具结果之后的上游响应未能产生下一个客户端工具调用时,尝试进行自动恢复的最大次数。默认值为 `4`,限制范围为 `1`-`8`。 |
| `HOST_DATA_DIR`, `HOST_LOGS_DIR` | 挂载到 Docker 中作为 `/app/data` 和 `/app/logs` 的宿主机路径。默认值为 `./data` 和 `./logs`。 |
| `DATA_DIR`, `LOGS_DIR` | 本地非 Docker 路径覆盖。留空则使用当前项目目录。 |
## 四、开发指南 / Development Guide
### 1. 环境要求
- Go `1.26`
- Node.js `20+`
- npm
- Docker,仅在您需要构建容器时使用
### 2. 一行命令本地启动
```
go run start-all.go
```
### 3. 后端开发
```
cd backend
go run .
```
验证:
```
cd backend
go test ./...
go build -trimpath -ldflags="-s -w" -o ..\bin\qwen2api-backend.exe .
```
### 4. 前端开发
```
cd frontend
npm ci
npm run dev
```
生产构建:
```
cd frontend
npm run build
```
### 5. 开发规则
- 保持 Go 后端作为 `v2.0` 运行时的唯一事实来源。
- 保持 Docker 数据路径在容器内部为 `/app/data` 和 `/app/logs`。
- 通过 compose 卷映射控制宿主机路径,而不是使用硬编码的工作区路径。
- 不要提交 `data/`、`logs/`、`.env`、真实的 token、cookie、密码或下游 API key。
- 在添加用户可见的配置时,请更新 README 和 `.env.example`。
## 六、其他信息 / Other Information
### 2. 许可证
本项目基于 [GPL-3.0 License](./LICENSE) 发布。
### 3. 免责声明
- 本项目作为开源的自托管网关提供。
- 在部署之前,请查阅您当地的法律法规、平台规则以及上游账号政策。
- 请勿公开或分享真实的账号 token、cookie、密码或下游 API key。
- 如果您发现安全问题,请避免在公开场合披露 secret,并首先通过私下渠道进行报告。
### 4. 鸣谢
- 特别鸣谢: [LinuxDo](https://linux.do/)
qwen2API
自托管的 Qwen Web 协议网关,提供兼容 OpenAI、Anthropic 和 Gemini 的 API。
GitHub · Docker Hub · Telegram · 中文说明
如果 qwen2API 对您有帮助,请考虑给项目点一个 Star。
由 YuJunZhiXue 及其贡献者制作。
标签:AI模型网关, API转换, EVTX分析, Go, MITM代理, OpenAI兼容, React, Ruby工具, Syscalls, 日志审计, 请求拦截, 通义千问