OPENAI 兼容网关中枢 · v1.1.5 · MIT · 零外部依赖

把 Qoder 双区,
接成一个 OpenAI 端点。

Qoder2API-Hub 将 qoder.com.cn(国内版)与 qoder.com(国际版)的原生服务封装为标准 Chat Completions 与 Responses API。多账号轮询、稳定设备指纹隔离、OAuth 免客户端登录、 每日签到与 Pro 福利真实领取、后台定时调度与 Web 看板——全部由一个纯标准库的 Python 进程承担。

三分钟接入
  • 可直接驱动
  • Codex CLI
  • Claude Code
  • Chatbox
  • Cherry Studio
  • NextChat
  • OpenAI SDK
qoder-proxy :8790 演示

        
      
GET /pingpong
调度器运行中
SSE 心跳5s : ping
2区域独立出口
2协议 Chat + Responses
0外部 pip 依赖
358项离线确定性断言
8790默认端口
1个 Python 进程

同一件事有四五种叫法。它们强调的不是同一个层面,搞清楚你要的是哪一层,才知道该配哪个客户端、该看哪个日志。

反向代理 / 反代

客户端把 Base URL 指向 127.0.0.1:8790,由它替你去访问官方上游并把响应带回来。这个名字强调的是谁在真正发出上游请求——COSY 签名、机器头、编码全部在这里完成,客户端一行协议代码都不用改。

API 中转

一层 OpenAI 协议进、Qoder 协议出,中间还夹着账号池轮换、出口绑定与额度管理。强调的是流量经过它:换号、重试、冷却、故障切换都发生在中转这一跳,客户端只看到一个稳定的端点。

协议适配

Chat Completions 与 Responses 双向映射到 agent_chat_generation,含 apply_patch freeform 工具的出站降级与入站还原。强调的是翻译而不是转发——工具调用、思考档位、SSE 信封都要逐字段对齐。

网关中枢

除转发之外还有账号生命周期、每日签到与福利领取、整点调度、用量指标与 Web 看板。强调的是它是一个有状态的控制面,而不只是一根管子。

01 / 双区域

两套官方服务,两种性格。
网关让它们各走各的门。

国际版与国内版的域名、鉴权参数、模型清单都不相同。网关按区域独立配置与管理,区域独占模型自动路由到归属出口,错配的 Key 会被拦下并返回通俗 400,而不是晦涩的上游拒流。

国际版

qoder.com

推理出口
api1.qoder.sh
故障切换
api2 → api3 按序自动切
设备授权
client_id + machine_id
模型清单
动态 17 条 · 开通 2 条
独占模型
smodel · ultimate

未开通条目不过滤,附官方原文「需要升级或购买千问官方套餐开放」与上游 disabled_message_key——与桌面版此刻看到同一份清单。

国内版

qoder.com.cn

推理出口
gateway.qoder.com.cn
网关基址
双区 openapi 与官方一致
设备授权
redirect_uri + client_id + machine_id
模型清单
动态 14 条 · 全部开通
独占模型
q37fmodel · glm-5.2

千问 / DeepSeek / GLM / Kimi / MiniMax 同 key 跨区可能指向不同模型(mmodel 国际 = MiniMax-M3、国内 = MiniMax-M2.7),逐项按区域取值。

国内版模型库 · 取自本机官方客户端 catalog 全字段快照chat 场景

    02 / 请求链路

    一次 OpenAI 调用,
    如何变成官方 COSY 请求。

    逆向对齐官方桌面 / CLI 客户端协议,RSA 包裹 AES 会话密钥、MD5 请求签名、自定义 Base64 请求体编码——AES-128/256、RSA-PKCS1v15、GCM、DPAPI、QMC 全部为纯 Python 标准库实现,Docker alpine 下同样零依赖。

    1. 01

      客户端 OpenAI 请求

      /v1/chat/completions 或 /v1/responses,标准协议进入。

    2. 02

      build_qoder_body()

      官方 baseprompt 模板 + 会话压平,system / 工具 / 参数覆写。

    3. 03

      qoder_encode()

      自定义 Base64:标准三段轮转 + 字母表映射,'=' → '$'。

    4. 04

      COSY 签名

      RSA-1024 包裹 AES-128 会话密钥 → info(AES-CBC 身份)。
      Bearer = COSY.{payload}.{md5(payload\ncosyKey\ndate\nbody\npath)}

    5. 05

      POST 上游推理

      /algo/api/v2/service/pro/sse/agent_chat_generation?…&Encode=1

    6. 06

      SSE 信封解包

      {headers, body, statusCodeValue} 嵌套帧 → 内层 OpenAI chunk。

    7. 07

      标准 OpenAI 回流

      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 签名头逐请求携带。同一账号长期固定在同一台虚拟物理设备,规避机器码漂移;不同账号机器码彼此独立,阻断跨账号关联检测。

    双区域统一方案单向派生 · 不可反推

    每日签到与 Pro 福利 · 真实领取

    「每日领取 100 Credits」这类活动由网关直接领取:用桌面端请求头列出活动,对 CLAIMABLE 的 Credits 活动 POST /sash/api/v1/me/campaigns/{id}/claim。官方幂等——已领返回 replayed,不会重复发放。Pro 升级包走 eligibility → claim 两步。

    真实机器身份取真值(调用官方风控桥)旧 sash 接口能力运行时探测

    多账号负载轮询

    账号池按会话粘性 + 轮询使用;某个账号被上游拒绝时自动切到下一个,不中断当前请求。

    OAuth 设备授权

    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,避免客户端与中间代理空闲超时重连。

    多 API Key 与出口绑定

    每个 Key 可强制走国际版或国内版出口,或跟随看板全局切换;单独启停、删除即刻失效。面板配置过 Key 后,启动脚本里的旧 --api-key 自动失效。

    双层瞬时故障重试

    连接层与流内信封层各自重试 2 次(1s / 2s 退避)——上游在 SSE 信封里投 statusCodeValue=418 时,只要尚未向客户端写出任何字节就重开上游,流式客户端全程无感。仍失败才短冷却换号,不因上游的锅罚账号 60 秒。

    同样具备
    • Responses API 与 apply_patch freeform 工具双向转译
    • DSML 工具调用回退解析
    • DeepSeek 族 reasoning_content 回填并跨轮保留
    • 内容安全审核拒绝快速失败并给出中文解释
    • /ping /healthz /livez /readyz 免鉴权探活
    • 面板密码 PBKDF2-SHA256 摘要存储,不存明文
    • LAN 模式随机 qd- 高强度 Key 并持久化
    • 账号 JSON 导入导出 · Dry-Run 预检 · 覆盖同 UID
    • 会话死亡识别自动停用并标注需重新登录
    • GET /update/check 对比 GitHub 最新 release

    04 / 峰谷价

    现在是不是谷时?
    这块面板按官方口径实时判定。

    官方 promotion 字段里的峰谷倍率会随模型清单一起输出:price_factor_peak / price_factor_valley / off_peak 时段窗口与错峰文案,以及 off_peak_active_now。看板在低谷窗口内把价签切成发光高亮,判定用后端字段 + 浏览器本地时间双保险。下面这块复算的是同一个规则。

    计算中按官方时区 UTC+8 跨午夜窗口判定
    --:--:-- 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 刷新。

    Qoder 网关看板:双区出口状态、账号池与最近请求流水

    双区出口状态、后台调度器、账号池与请求流水一屏尽览。

    06 / 接入

    双击,或者一条 docker 命令。

    零外部 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 → 真实流式

    生成你的客户端配置

    选好区域、模式与端口,直接拿到可粘贴的配置。这里只在前端拼装,不会发出任何网络请求。

    跟随看板

    模型名是唯一需要记的值。upstream_key、展示 id「key (Name)」、人类别名与官方本地化名也全部可解析。

    07 / 接口一览

    看板与接口,全部同源。

    默认端口 8790。除 /ping 系列探活端点外,看板接口受面板密码保护,OpenAI 接口受 API Key 保护。

    网关核心接口列表
    方法路径说明
    GET/Web 用量与任务监控看板
    POST/v1/chat/completions标准 Chat Completions 接口
    POST/v1/responsesResponses 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.pyUID 稳定设备指纹派生 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 / 版本

    v1.1.5

    发布节奏很快,且每条改动都带实测数据。完整记录在 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 与实测记录,不是推测。

    Q1模型名称到底填什么?

    填 /v1/models 返回的 id,也就是官方模型名(如 Qwen3.8-Max)——这是客户端唯一需要记的值。

    upstream_key(qmodel_38max)、展示 id「key (Name)」、人类别名(qwen3.8-max)与官方本地化名同样都能解析。区域独占模型会自动路由到归属出口;如果 Key 的出口和模型区域不匹配,返回的是通俗 400,而不是上游那种晦涩的拒流报错。

    Q2Codex CLI 与 Claude Code 怎么接?

    走 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 的打补丁回路完整可用,不需要客户端做任何适配。

    Q3怎么用 Docker 部署?

    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 任何东西。