反向代理 / 反代
客户端把 Base URL 指向 127.0.0.1:8790,由它替你去访问官方上游并把响应带回来。这个名字强调的是谁在真正发出上游请求——COSY 签名、机器头、编码全部在这里完成,客户端一行协议代码都不用改。
OPENAI 兼容网关中枢 · v1.1.5 · MIT · 零外部依赖
Qoder2API-Hub 将 qoder.com.cn(国内版)与 qoder.com(国际版)的原生服务封装为标准 Chat Completions 与 Responses API。多账号轮询、稳定设备指纹隔离、OAuth 免客户端登录、 每日签到与 Pro 福利真实领取、后台定时调度与 Web 看板——全部由一个纯标准库的 Python 进程承担。
qmodel_38max
200 · chunked
: ping同一件事有四五种叫法。它们强调的不是同一个层面,搞清楚你要的是哪一层,才知道该配哪个客户端、该看哪个日志。
客户端把 Base URL 指向 127.0.0.1:8790,由它替你去访问官方上游并把响应带回来。这个名字强调的是谁在真正发出上游请求——COSY 签名、机器头、编码全部在这里完成,客户端一行协议代码都不用改。
一层 OpenAI 协议进、Qoder 协议出,中间还夹着账号池轮换、出口绑定与额度管理。强调的是流量经过它:换号、重试、冷却、故障切换都发生在中转这一跳,客户端只看到一个稳定的端点。
Chat Completions 与 Responses 双向映射到 agent_chat_generation,含 apply_patch freeform 工具的出站降级与入站还原。强调的是翻译而不是转发——工具调用、思考档位、SSE 信封都要逐字段对齐。
除转发之外还有账号生命周期、每日签到与福利领取、整点调度、用量指标与 Web 看板。强调的是它是一个有状态的控制面,而不只是一根管子。
01 / 双区域
国际版与国内版的域名、鉴权参数、模型清单都不相同。网关按区域独立配置与管理,区域独占模型自动路由到归属出口,错配的 Key 会被拦下并返回通俗 400,而不是晦涩的上游拒流。
api1.qoder.shapi2 → api3 按序自动切client_id + machine_idsmodel · ultimate未开通条目不过滤,附官方原文「需要升级或购买千问官方套餐开放」与上游 disabled_message_key——与桌面版此刻看到同一份清单。
gateway.qoder.com.cnopenapi 与官方一致redirect_uri + client_id + machine_idq37fmodel · glm-5.2千问 / DeepSeek / GLM / Kimi / MiniMax 同 key 跨区可能指向不同模型(mmodel 国际 = MiniMax-M3、国内 = MiniMax-M2.7),逐项按区域取值。
02 / 请求链路
逆向对齐官方桌面 / CLI 客户端协议,RSA 包裹 AES 会话密钥、MD5 请求签名、自定义 Base64 请求体编码——AES-128/256、RSA-PKCS1v15、GCM、DPAPI、QMC 全部为纯 Python 标准库实现,Docker alpine 下同样零依赖。
/v1/chat/completions 或 /v1/responses,标准协议进入。
官方 baseprompt 模板 + 会话压平,system / 工具 / 参数覆写。
自定义 Base64:标准三段轮转 + 字母表映射,'=' → '$'。
RSA-1024 包裹 AES-128 会话密钥 → info(AES-CBC 身份)。Bearer = COSY.{payload}.{md5(payload\ncosyKey\ndate\nbody\npath)}
/algo/api/v2/service/pro/sse/agent_chat_generation?…&Encode=1
{headers, body, statusCodeValue} 嵌套帧 → 内层 OpenAI chunk。
SSE / chat.completion 原样交给客户端,工具回路完整。
cosy-version = 1.1.64,取自 0.4.3 内置 agent-sdk 的版本常量;COSY RSA 公钥与新客户端内置 PEM 逐字节相同。推理、模型清单、deviceToken / jobToken、userinfo、quota/usage、user/plan、sash 活动平台端点均与新版客户端一致。
官方上游对不支持的 reasoning_effort 不报错、直接忽略。网关按官方目录里该模型的合法档位表归一化:命中原样透传,未命中取最近的合法档位(同距时偏向默认档)并在日志标注。/v1/models 会宣告每个模型的 reasoning_efforts 与默认档。
官方 catalog 与动态接口都没有「最大输出」这一项,网关就不输出、不展示任何推测值。清单以动态源返回的集合为准——官方桌面版此刻显示什么,这里就显示什么。
03 / 核心能力
从入池、指纹、签到、保活到额度与用量透视,网关把官方客户端里需要「打开 App 点几下」的事情,全部变成可自动化、可观测、可持久化的能力。
derive_id以账号 UID + 业务盐单向 MD5 派生固定的 cosy-machineid / cosy-machinetoken / 会话标识,COSY 签名头逐请求携带。同一账号长期固定在同一台虚拟物理设备,规避机器码漂移;不同账号机器码彼此独立,阻断跨账号关联检测。
「每日领取 100 Credits」这类活动由网关直接领取:用桌面端请求头列出活动,对 CLAIMABLE 的 Credits 活动 POST /sash/api/v1/me/campaigns/{id}/claim。官方幂等——已领返回 replayed,不会重复发放。Pro 升级包走 eligibility → claim 两步。
账号池按会话粘性 + 轮询使用;某个账号被上游拒绝时自动切到下一个,不中断当前请求。
PKCE (S256) 设备流,双区 URL 参数按官方差异构造。点看板链接在浏览器完成授权即自动入池;亦支持 pt- PAT 导入,jobToken 自动交换与轮换。
只读探测两类官方存储:桌面 App 的 auth.v1.dat(Chromium v10 布局,Local State os_crypt 密钥经 DPAPI 解出后 AES-256-GCM 解密)与 CLI 的 ~/.qoder*/.auth/user(AES-128-CBC,key 为 machine_id 前 16 字符)。看板两步确认导入,启动日志只提示发现 N 条,永不静默采用。
09:00 / 21:00 全量签到 + 额度快照,22:00 Token 集中保活。drt- / jrt- 按前缀路由刷新,PAT 最终兜底;剩余寿命不足 4 小时提前刷新。
HTTP/1.1 chunked 正确收尾、不再发 Connection: close,同一 keep-alive 连接可连续复用;上游首字延迟实测 40–71s 期间每 5 秒发一个 SSE 注释帧 : ping,避免客户端与中间代理空闲超时重连。
每个 Key 可强制走国际版或国内版出口,或跟随看板全局切换;单独启停、删除即刻失效。面板配置过 Key 后,启动脚本里的旧 --api-key 自动失效。
连接层与流内信封层各自重试 2 次(1s / 2s 退避)——上游在 SSE 信封里投 statusCodeValue=418 时,只要尚未向客户端写出任何字节就重开上游,流式客户端全程无感。仍失败才短冷却换号,不因上游的锅罚账号 60 秒。
apply_patch freeform 工具双向转译reasoning_content 回填并跨轮保留/ping /healthz /livez /readyz 免鉴权探活qd- 高强度 Key 并持久化GET /update/check 对比 GitHub 最新 release04 / 峰谷价
官方 promotion 字段里的峰谷倍率会随模型清单一起输出:price_factor_peak / price_factor_valley / off_peak 时段窗口与错峰文案,以及 off_peak_active_now。看板在低谷窗口内把价签切成发光高亮,判定用后端字段 + 浏览器本地时间双保险。下面这块复算的是同一个规则。
--:--:--
UTC+8
Qwen3.8-Max0.50x0.20x错峰 4 折Qwen3.7-Max0.50x0.10x错峰 2 折Qwen3.7-Plus0.10x0.04x 动态为准错峰 4 折Qwen3.8-Flash0.10x限时免费 0.00x原 0.10x判定顺序上 promotion 分支优先于 0 价分支——is_free 表示「含免费权益」而非 0 价,不会把 0.20x 错标成免费、也不会吞掉低谷高亮。
05 / Web 看板
弹性指标卡片、签到与福利中心、模型能力清单、性能指标与用量透视、实时请求流水与运行日志。切视图为并行加载 + 按区域缓存即时渲染,实测账号池 / 模型库 28–53ms 刷新。
双区出口状态、后台调度器、账号池与请求流水一屏尽览。
06 / 接入
零外部 pip 依赖,Python 3.9+ 即可。生命周期就是那个 cmd 窗口——窗口开着网关就活着,关掉即停,不留后台残留进程。
双击 start-qoder-proxy.bat 并保持窗口运行。改端口:start-qoder-proxy.bat 8791。
双击 start-qoder-proxy.bat API 接口地址 http://127.0.0.1:8790/v1 Web 监控看板 http://127.0.0.1:8790/ 面板密码 admin(首次登录后请立即在「设置」修改)
客户端一直显示工作中、一个字都不吐,网关日志也毫无变化?九成是网关没在跑——请求根本没到达。一条命令确诊,逐项报出断在哪:
python _diag_gateway.py --chat 端口 → /ping → /health → /v1/models → 真实流式
持久化 ./accounts(凭证与出口设置)与 ./usage(流水与指标快照);配置参数 API_KEY、PORT。
# 后台启动容器(自动构建并运行) docker compose up -d # 查看网关日志 docker compose logs -f # 或直接 docker run docker run -d --name qoder-proxy --restart unless-stopped \ -p 8790:8790 -v $(pwd)/accounts:/app/accounts \ -v $(pwd)/usage:/app/usage -e API_KEY=your_secret_key \ $(docker build -q .)
双击 start-qoder-proxy-lan.bat,允许局域网内其他设备访问。密钥随机生成并持久化,重启复用。
# 自定义 Key start-qoder-proxy-lan.bat 8790 我的Key Base URL http://<本机局域网IP>:8790/v1 带密钥直达面板 http://<IP>:8790/?key=生成的Key # 生成的 Key 前缀 qd-,保存在 accounts/settings.json 并在终端打印 # 其他设备连不上时,管理员运行一次放行防火墙 allow-firewall.bat
选好区域、模式与端口,直接拿到可粘贴的配置。这里只在前端拼装,不会发出任何网络请求。
模型名是唯一需要记的值。upstream_key、展示 id「key (Name)」、人类别名与官方本地化名也全部可解析。
07 / 接口一览
默认端口 8790。除 /ping 系列探活端点外,看板接口受面板密码保护,OpenAI 接口受 API Key 保护。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / | Web 用量与任务监控看板 |
| POST | /v1/chat/completions | 标准 Chat Completions 接口 |
| POST | /v1/responses | Responses API 协议接口(Codex / Claude Code) |
| GET | /v1/models | 模型列表:能力与规格宣告、峰谷价、上下文多窗口、思考档位 |
| GET | /ping /healthz /livez /readyz | 纯文本 pong,免面板密码与 API Key、不查账号池,供客户端判活 |
| GET | /health | 完整运行状态 |
| GET | /tasks | 签到状态、连续天数、福利包资格与额度快照(支持 ?realm=) |
| POST | /tasks/run | 触发批量每日签到与领奖 |
| POST | /tasks/travel | 批量领取 Pro 福利包 |
| GET | /scheduler | 定时调度器运行状态与排程日志 |
| POST | /scheduler/trigger | 手动立即执行后台巡检保活 |
| POST | /accounts/login/start | 发起 OAuth 设备授权 |
| POST | /accounts/import/pat | 导入 PAT 令牌 |
| POST | /accounts/checkin | 手动签到(单个 / 全部) |
| GET | /diag/vm | 本机虚拟化状态检测(官方风控桥 + 本机交叉校验) |
| GET | /update/check | 对比 GitHub 最新 release,结果缓存 6 小时 |
| 文件 | 职责 |
|---|---|
qoder_proxy.py | 主网关:HTTP 路由、COSY 数据面、双协议转换、用量统计、看板鉴权 |
qoder_sign.py | 自定义 Base64、纯库 AES-128/256 + GCM、RSA、DPAPI、QMC 解密、COSY 签名 |
qoder_accounts.py | 双区账号池、OAuth 设备流、PAT、Token 生命周期、本机凭证扫描/导入 |
qoder_catalog.py + 双区 JSON | 官方模型快照加载(外部 JSON 优先、内嵌冻结副本兜底)、别名与独占表 |
qoder_tasks.py | 签到闭环(含 DISABLED 归一化)、Pro 福利包、批量执行、保活巡检 |
qoder_scheduler.py | 整点排程调度器(09/21 签到 · 22:00 保活,签到能力运行时探测) |
qoder_settings.py | 面板密码 (PBKDF2)、多 API Key 出口绑定、会话管理 |
qoder_fingerprint.py | UID 稳定设备指纹派生 derive_id |
dashboard.html | 单文件 Web 看板 |
# 离线确定性测试:AES 向量与官方 fixture KAT、QMC/凭证解密、自定义 B64、 # COSY 签名、双区官方目录全字段、独占路由、签到能力探测、DeepSeek 回填、 # 请求体、信封解包、custom 工具转译、本机凭证扫描 python _test_qoder.py # 端到端逐模型对比官方"此刻"数据(网关运行中执行,347 项断言) python _verify_models.py --base http://127.0.0.1:8790 # 签到 / 活动链路体检,含本机虚拟化状态,只读、中文输出 python _diag_campaign.py # 客户端更新后刷新官方模型快照,并打印变化摘要(--dry-run 只看差异) python _refresh_catalog.py
08 / 版本
发布节奏很快,且每条改动都带实测数据。完整记录在 GitHub Releases。
/tasks 的 5 个上游查询串行改并行 + 20 秒面板短缓存(签到/领取写操作后立即失效),实测 8.9s → 热 0.00s;前端切视图并行加载 + 按区域缓存即时渲染,账号池 / 模型库 28–53ms 刷新。账号文件写入加锁。
账号池列表与签到中心的账号下拉只列当前视图区域的账号(/tasks?realm=),积分仍按区域分别显示;签到后不再跳回国际版视图。
GET /update/check 对比 GitHub 最新 release,设置页自动检查并给出直达 Releases 的升级链接,顶部标题旁亮出「有新版本 → 升级」徽标。
_diag_campaign.py 与看板新增同源检测卡片:官方风控桥 vmInfo(是否虚拟机 / 平台 / 风险评分)+ 本机交叉校验(CPU 型号、系统制造商、虚拟化驱动、VBS/HVCI),全中文输出并附误报提示——开启 VBS/内核隔离的实体机也可能被误判为 VM。
09 / 常见问题
答案全部来自项目 README 与实测记录,不是推测。
填 /v1/models 返回的 id,也就是官方模型名(如 Qwen3.8-Max)——这是客户端唯一需要记的值。
upstream_key(qmodel_38max)、展示 id「key (Name)」、人类别名(qwen3.8-max)与官方本地化名同样都能解析。区域独占模型会自动路由到归属出口;如果 Key 的出口和模型区域不匹配,返回的是通俗 400,而不是上游那种晦涩的拒流报错。
走 Responses API,两个环境变量:
export OPENAI_BASE_URL="http://127.0.0.1:8790/v1" export OPENAI_API_KEY="你在看板设置中添加并绑定的API_Key"
custom freeform 工具(apply_patch)出站自动降级为 function 工具、入站还原为 custom_tool_call,所以 Codex 的打补丁回路完整可用,不需要客户端做任何适配。
docker compose up -d # 自动构建并后台运行 docker compose logs -f # 查看网关日志
持久化 ./accounts(账号凭证与出口设置)和 ./usage(请求流水与指标快照)两个目录;配置参数是环境变量 API_KEY 与 PORT,默认端口 8790。
不想用容器也可以:Linux 与 macOS 直接 python qoder_proxy.py --port 8790,Windows 双击 start-qoder-proxy.bat。AES-128/256、RSA-PKCS1v15、GCM、DPAPI、QMC 全部是纯 Python 标准库实现,所以 alpine 镜像里同样是零外部依赖——不需要 pip install 任何东西。