YuJunZhiXue/qwen2API

GitHub: YuJunZhiXue/qwen2API

将 Qwen 网页端转换为兼容 OpenAI、Anthropic 和 Gemini API 格式的自托管协议网关,附带 WebUI 管理界面。

Stars: 855 | Forks: 272

[English](README.md) | [简体中文](README_CN.md)
qwen2API

qwen2API

自托管的 Qwen Web 协议网关,提供兼容 OpenAI、Anthropic 和 Gemini 的 API。

GitHub · Docker Hub · Telegram · 中文说明

Release Stars Docker Hub Go React License

## 一、项目简介 / 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 对您有帮助,请考虑给项目点一个 Star。

YuJunZhiXue 及其贡献者制作。

标签:AI模型网关, API转换, EVTX分析, Go, MITM代理, OpenAI兼容, React, Ruby工具, Syscalls, 日志审计, 请求拦截, 通义千问