dumate2api

skill
Guvenlik Denetimi
Basarisiz
Health Uyari
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Basarisiz
  • network request — Outbound network request in probe-ctx.js
  • process.env — Environment variable access in probe-qwen-device-login.js
  • fs module — File system access in probe-qwen-device-login.js
  • network request — Outbound network request in probe-qwen-device-login.js
  • process.env — Environment variable access in src/accounts.js
  • fs module — File system access in src/accounts.js
  • child_process — Shell command execution capability in src/admin/routes/account.js
  • process.env — Environment variable access in src/admin/routes/account.js
  • fs module — File system access in src/admin/routes/account.js
  • process.env — Environment variable access in src/admin/routes/accounts.js
  • network request — Outbound network request in src/admin/routes/accounts.js
  • process.env — Environment variable access in src/admin/routes/auth.js
Permissions Gecti
  • Permissions — No dangerous permissions requested

Bu listing icin henuz AI raporu yok.

SUMMARY

DuMate(百度搭子)/ 千问办公 / TRAE Work / Qoder → OpenAI·Anthropic·Google 三协议网关,供 Codex CLI、Claude Code、cc-switch 使用;无 GUI 拉起搭子后端,自带网页管理端

README.md

dumate2api

license
node
platform
deps

百度搭子(DuMate) 本地网关 —— 把百度搭子、千问办公、TRAE Work、Qoder 四条上游统一转成 OpenAI / Anthropic / Google 兼容 API,给 Codex CLI、Claude Code、cc-switch 用;无 GUI 拉起搭子后端,自带网页管理端。

如果你在找一个「DuMate / 百度搭子 转 OpenAI API」「搭子接 Claude Code / Codex」「千问办公或 Qoder 走标准协议」的方案,就是这里。

Codex CLI ──── OpenAI / Responses ─┐
Claude Code ──── Anthropic ────────┼──→ dumate2api :9080 ──┬──→ DuMate 后端 :8980 ──→ 百度千帆
任意客户端 ──── Google ────────────┘                        ├──→ 千问办公(进程内直连)
                                                            ├──→ TRAE Work(进程内直连)
                                                            └──→ Qoder(进程内直连)

特性

  • 三协议网关 —— OpenAI / Anthropic(含原生工具)/ Google Generative Language,外加 Responses 适配层(Codex CLI 0.155+ 只认它)
  • 四通道前缀分流 —— 百度搭子 / 千问办公 / TRAE Work / Qoder,靠模型名前缀显式路由,不猜名字
  • 零第三方依赖 —— 网关本体只用 Node 内置模块(playwright-core 仅管理端登录器需要)
  • 凭证自持,零客户端依赖 —— 千问办公 / TRAE / Qoder 三条通道走 OAuth Device Flow 自取凭证、请求签名纯本地算法,不需要装任何官方客户端;搭子也能显式只用网页凭证(DUMATE_DUMATE_SOURCE=web),连桌面客户端一并省掉
  • 无 GUI 运行 —— 自动拉起 dumate-main-server.exe,不需要打开搭子界面
  • 网页控制台 —— 仪表盘、模型管理、API Key、积分明细、请求日志、聊天测试台
  • 积分自动化 —— 签到幂等可定时;抽奖消耗不可逆,只留手动

快速开始

git clone <repo-url> && cd dumate2api
npm start                  # 网关 http://127.0.0.1:9080
npm run admin              # 管理端 http://127.0.0.1:9081(另开终端)

首次运行会自动拉起 DuMate 后端(不需要打开 DuMate 界面)。自检:

curl http://127.0.0.1:9080/health     # 应返回 "upstream_managed":true
curl http://127.0.0.1:9080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"model-text","messages":[{"role":"user","content":"hello"}]}'

四条通道

通道 上游 凭证 需要官方客户端
百度搭子(DuMate) 本地 :8980(千帆 GLM) 桌面登录态 / 网页 cookie 默认是;设 DUMATE_DUMATE_SOURCE=web 后可完全不用
千问办公(QwenWork) 云端网关,进程内直连 自持(OAuth Device Flow) 否(签名纯本地)
TRAE Work 云端网关,进程内直连 自持(OAuth) 否
Qoder 云端网关,进程内直连 自持(OAuth Device Flow) 否(签名纯本地)

搭子有两条凭证链路,能力一致:桌面凭证(dumate-main-server.exe + auth.json,需装客户端)与网页凭证(data/web-accounts.json,浏览器 cookie)。
桌面凭证不可用时自动回落到网页池,四条协议(含 Codex 只认的 responses)与 count_tokens 在回落路径上都实测可用;
想彻底不要客户端就设 DUMATE_DUMATE_SOURCE=web —— 跳过桌面链路(含启动时约 3 秒的探测),凭证来源从「兜底」变「主链路」。

靠模型名前缀分流,不猜模型名:

调用方传的模型名 路由到
model-text / glm-5 等(无前缀) 百度搭子
qwen/pro / qwen/flash 千问办公
traework/glm-5.2 TRAE Work
qoder/gfmodel Qoder
未知前缀(如 qwn/pro) 400 报错,不静默回落

用前缀而不是猜名字:两侧模型名会撞车(搭子有 glm-5,千问上游也是 GLM 系),猜错了两侧都返回 200,从响应里根本看不出来。未知前缀若静默跑到搭子,会拿到「看起来成功但完全不是想要的结果」,比直接 400 难查得多。

千问办公通道

与 Qoder 同一套 COSY 协议 —— 同一个 client_id、同一个聊天路径、同一套 Encode=1 自定义 base64、同一个 Bearer COSY.<payload>.<sig> 信封,连服务端公钥都是同一把。所以两者共用 src/cosy.js 一份签名实现,差异只有 cosyVersion(千问 1.1.52 / Qoder 1.0.10)与几个客户端身份头。

签名是纯本地算法(RSA 加密临时密钥 + AES 加密身份 + MD5 签名),不需要官方 wasm、不需要装客户端。早期版本必须调客户端的 qoder_auth_wasm_bg.wasm 生成请求体,客户端一卸载通道就死;现在本地签名直接发到 gateway.qwenwork.cn。

上游只有 pro / flash 两个模型。做重创作 / 长任务用 pro —— flash 会把进度播报当成回合终点、不调工具就收尾(实测三种纪律写法都救不回来),只适合轻量问答。

Qoder 通道

阿里 AI IDE,与千问办公同一套 COSY 协议(同样的 Encode=1 编码、同样的 Bearer COSY.<payload>.<sig> 信封、同样的 device flow、连 client_id 都相同),但有两点关键差异:

  1. 签名是纯本地算法(RSA + AES + MD5,公钥硬编码)——不需要官方 wasm、不需要装任何客户端
  2. 额度分两块且不能相加 —— userQuota(订阅套餐内,Free 恒为 0)与 addOnQuota(签到/赠送,免费用户实际能用的就是这个)

零额度时聊天会挂起(不报错、不超时),所以签到是通道可用的前提。签到积分 30 天后作废,每日 10:00 (UTC+8) 刷新(千问是 00:00,两者不同)。

上游没有逐批余额接口,批次到期信息只能从领取响应本身取,所以网关在 data/qoder-grants.jsonl 本地记账。「领取额」不是「剩余额」 —— 这是数据缺口,界面一律标注,实际剩余以额度卡总余额为准。

模型倍率差 14 倍,调试建议用 0.1 档:qfmodel / qmodel / q37fmodel / dfmodel / gfmodel。倍率从模型表的 price_factor 读,不硬编码。

命令行自测(不开管理端也能验证):

node test/qoder-cli.js login [cn|global]   # 生成授权链接
node test/qoder-cli.js quota               # 额度
node test/qoder-cli.js checkin             # 领积分
node test/qoder-cli.js chat "你好"          # 默认用最省的 gfmodel

进程一览

进程 端口 入口 职责
网关(稳定版) 9080 stable/src/server.js 对外长期服务,冻结快照
网关(开发) 9082 src/server.js 开发调试,改动都在这里
管理端 9083 src/admin/server.js 管理 API + 托管前端,读 9082
网页凭证网关 9084 src/web-gateway.js 多账号轮换跑模型
DuMate 后端 8980 由网关拉起 真实模型链路

开发时用 start-dev.bat(9082 + 9083),与稳定版 9080 互不干扰。管理端不代理模型协议——网关已经在做,多一跳只多一个故障点。所有进程通过 data/ 下的文件通信,不通过 IPC。

前置条件

  • Node.js >= 18,仅 Windows(依赖 PowerShell 进程查询、%APPDATA% 路径、taskkill)
  • 至少配置一条通道 —— 任一条不可用时网关仍会监听,/health 的 channels.*.ready 报 false,不阻断启动

百度搭子 —— 二选一:

  • 桌面凭证 —— 安装 DuMate 桌面客户端(下载)并登录一次,之后不必再打开界面。登录态在 %APPDATA%\qianfan-desktop-app\auth.json;安装目录非默认时设 DUMATE_INSTALL_DIR。
  • 网页凭证(不用装客户端) —— 在管理端用浏览器登录器登一次 www.dumate.cn(或手动粘贴 cookie),再设 DUMATE_DUMATE_SOURCE=web 把它变成主链路。

千问办公 —— 独立 OAuth 登录,不需要客户端。请求签名是纯本地算法(与 Qoder 共用 src/cosy.js:同一套 COSY 协议、同一个 client_id、同一把服务端公钥)。早期版本必须读客户端的 qoder_auth_wasm_bg.wasm,现已不需要——只有当本地签名被上游改协议拒掉时,才需要切回官方 wasm(DUMATE_QWENWORK_USE_WASM=1 + 装客户端)。

TRAE Work / Qoder —— 独立 OAuth 登录,完全不依赖客户端。

关闭某条通道:DUMATE_QWENWORK_AUTOSTART=off / DUMATE_TRAEWORK_AUTOSTART=off。

客户端配置

cc-switch

标签 名称 API 格式 Base URL Key 模型
Claude DuMate (Claude) anthropic http://127.0.0.1:9080 ← 不加 /v1 nokey model-text
Codex DuMate (Codex) openai_responses http://127.0.0.1:9080/v1 ← 要加 /v1 nokey model-text

Codex 的 config.toml:

model_provider = "dumate"
model = "model-text"
model_reasoning_effort = "high"

[model_providers.dumate]
name = "DuMate local proxy"
base_url = "http://127.0.0.1:9080/v1"
wire_api = "responses"
requires_openai_auth = true

wire_api = "responses" —— Codex CLI 0.155+ 已移除 chat(配置加载阶段直接报错)。网关自带 /v1/responses 适配层,填 responses 即可。

URL 一个有 /v1 一个没有:Claude 侧 cc-switch 会自己拼 /v1/messages;Codex 要求 base_url 本身已含 /v1。

配置完验证:node test/verify-ccswitch.js(Codex / Claude / 裸路径 / 模型映射四条链路)。

API 端点

端点 协议
GET /v1/models OpenAI 模型列表(四通道都列出)
POST /v1/chat/completions 聊天补全
POST /v1/responses 或 /responses Responses(Codex CLI)
POST /v1/messages 或 /messages 或 /api/v1/messages Anthropic Messages
POST /v1/messages/count_tokens Token 计数(估算)
GET /v1beta/models / POST .../generateContent Google Generative Language
GET /health 健康检查,含各通道就绪状态

裸路径 /messages 必须保留 —— Claude Code 打的就是它。

管理端

另起终端跑 npm run admin。首次启动会生成管理员口令并打印在终端。

改的是哪个网关端口就要带对应变量,否则管理端读到别的实例的数据:

DUMATE_ADMIN_GATEWAY_PORT=9082 npm run admin
页面 回答什么问题
仪表盘 各通道健康、用量、账号状态、即将过期积分
模型管理 有哪些模型、上下文/输出上限、倍率、额度还剩多少
API Key 签发密钥(IP 白名单、模型白名单、通道绑定)
积分明细 积分从哪来、怎么没的(含签到/任务/抽奖、额度包、日历)
账号管理 增删账号、跑任务、开轮询(操作台)
用量统计 / 请求日志 趋势与逐条明细(含每条请求花了多少积分)
聊天测试台 不签发密钥直接试调某个模型名能不能跑通

顶栏切换通道,各页面据此显示对应数据。四条通道的账各自独立,不能相加 —— 搭子靠上游账单 + 余额游标,千问是三个积分池,TRAE 是每账号独立 credits,Qoder 是订阅 + 赠送两块额度。

前端开发:cd web && npm install && npm run dev。

常用环境变量

变量 默认 说明
DUMATE2API_PORT / _HOST 9080 / 127.0.0.1 网关监听
DUMATE_REQUIRE_KEY 未设(关闭) 设 1 才校验 API Key。对外暴露必须打开
DUMATE_MIN_MAX_TOKENS / _MAX_ 65536 / 131072 输出预算钳制区间(0 关下限)
DUMATE_ADMIN_PORT 9081 管理端监听
DUMATE_ADMIN_GATEWAY_PORT 9080 管理端读哪个网关;开发实例设 9082
DUMATE_ADMIN_DATA <repo>/data 数据目录,管理端与网关必须一致
DUMATE_DUMATE_SOURCE 未设(auto) 设 web = 搭子只用网页凭证,跳过桌面链路(含启动那约 3 秒探测),不需要装客户端
DUMATE_WEB_FALLBACK 未设(开启) 0 关闭「桌面凭证失效时回落到网页池」
DUMATE_QWENWORK_AUTOSTART auto off 关闭千问通道
DUMATE_QWENWORK_USE_WASM 未设(本地签名) 设 1 切回官方 wasm 签名(退路,需要装千问客户端)
DUMATE_TRAEWORK_AUTOSTART auto off 关闭 TRAE 通道
DUMATE_AUTO_CHECKIN_HOUR / _MINUTE 9 / 17 每日自动签到(两个都要设)
DUMATE_TASK_POLL_MINUTES 30 任务轮询(0 关闭,低于 5 分钟会被拒)

完整列表见 CLAUDE.md。DUMATE2API_KEY 是历史遗留的死变量,代码中从未读取——真实开关是 DUMATE_REQUIRE_KEY。

已知边界

  • 输出预算下限是硬需求,不是可选优化。GLM 的思维链与正文共用同一个 max_tokens,reasoning 实测在 57~8492 tokens 间浮动,预算不足会拿到空正文或半句截断。网关统一抬到 65536 以上。
  • 思考强度调不了 —— 上游忽略 reasoning_effort,实测各档 reasoning token 数无差异(is_reasoning 硬编码 false)。想要更深入的分析,只能靠提示词。
  • 搭子上游不支持 function calling / 图像 —— 工具调用被降级为纯文本([Tool Use: 名字])。这是搭子上游的能力边界;三条直连通道(千问 / TRAE / Qoder)原生支持工具调用,走的是各自的真实 tool_calls。
  • 搭子上游只有三个真实模型 —— model-text / model-artifact-validate / glm-5,传别的名字硬性报 api not registered。
  • count_tokens 是估算(字节数 / 4),只用于让 Claude Code 的上下文预算不报错。
  • 搭子桌面凭证的 cookie 过期必须开一次客户端重登 —— 桌面链路唯一绕不过去的一步。不想装客户端就走网页凭证(DUMATE_DUMATE_SOURCE=web),过期后用管理端的浏览器登录器重登即可(要浏览器,不要搭子客户端)。

项目结构

src/
  server.js              网关主入口,协议路由与鉴权
  anthropic.js           Anthropic ↔ OpenAI(含 SSE 状态机)
  responses.js           Responses ↔ Chat(Codex CLI)
  google.js              Google Generative Language ↔ OpenAI
  upstream-router.js     模型名前缀 → 通道
  channels.js            通道 id 单一来源
  cosy.js                COSY 协议签名算法(千问与 Qoder 共用一份)
  qwenwork/  traework/  qoder/    三条直连通道
  admin/                 管理端(路由、存储、鉴权)
stable/                  9080 跑的冻结快照(47 个 .js,不随开发改动)
web/                     管理端前端(Vue 3 + Vite + ant-design-vue)
test/                    冒烟测试与离线验证脚本
data/                    运行时数据(**已 gitignore**,含凭证)

stable/ 是冻结快照

stable/ 是网关闭包的逐字节拷贝,保证 9080 不被开发中的代码波及,有独立启动脚本 stable/start-stable.bat。

发布新版不要简单「把 src/*.js 覆盖过去」 —— 这个 glob 漏掉 qwenwork/ traework/ 等子目录(漏了通道直接不可用),还会把管理端一起带进去。正确做法是按依赖闭包复制:从 src/server.js 出发递归解析 require('./x'),复制闭包内文件,然后逐字节比对 + node --check + 用临时端口独立启动一次。

手工启动 stable/ 会退回空数据目录(reqlog.js 按 __dirname 解析),里面没有任何凭证。启动 9080 必须走 start-stable.bat,它设了 DUMATE_ADMIN_DATA=<repo>/data。

测试

npm test                        # 冒烟测试(32 项断言,需网关在线)
node test/verify-ccswitch.js    # Codex / Claude / 裸路径 / 模型映射四条链路
node test/probe-oai.js          # 只打 OpenAI,原始 SSE 打到 stdout
node test/probe-anth.js         # 只打 Anthropic

离线验证(不需要起服务,改完相关代码先跑这些):

node test/verify-channel.js              # 通道过滤 + 积分归因配对
node test/verify-qoder-cosy.js           # Qoder 签名算法(Go 参考实现生成的向量)
node test/verify-qoder-channel.js        # Qoder 通道逻辑
node test/verify-qoder-grants.js         # Qoder 积分批次账本
node test/verify-qwenwork-local-sign.js  # 千问本地签名(不依赖 wasm 的那条路)
node test/verify-dumate-source.js        # 搭子凭证来源开关与真实失败路径
node test/verify-fallback-stream-pipe.js # 回落路径的流式转发(伪响应没有 pipe)
node test/verify-traework-gained.js      # TRAE 签到到账差值
node test/verify-traework-repair.js      # TRAE「播报即收尾」修复
node test/verify-qwen-daily-aggregate.js # 千问每日额度多账号合计
node test/verify-display-name.js         # 账号显示名解析

数据与凭证

文件 内容 敏感度
keys.json API Key,只存 sha256 低
web-accounts.json 网页账号,cookie 明文存 高
qwenwork-accounts.json / traework-accounts.json / qoder-accounts.json 直连凭证(含 refresh token) 高(等同密码)
admin-users.json / admin.secret 管理员口令(scrypt)与会话密钥 高
requests.jsonl / activity.jsonl 埋点与操作记录 中

三种凭证策略不同是刻意的:API Key 只存哈希(可验证不可还原);cookie 必须明文(上游要求原样重放);管理端口令走 scrypt。所以 data/ 一旦被复制走,网页与直连通道的凭证是直接可用的 —— 该目录已在 .gitignore,不要提交,不要放进任何备份镜像。

许可证

MIT


免责声明:本项目是独立的第三方开源项目,与百度 / 阿里(千问办公、Qoder)/ 字节(TRAE)及 Anthropic / OpenAI / Google 等主体无任何隶属、合作或背书关系,文中产品名仅为指代用途。本项目通过协议适配实现与本地已安装客户端的互操作,不破解、不绕过任何付费墙或授权机制,不分发任何上游二进制资产,也不上报任何数据 —— 所有凭证与日志只存本机。积分自动化功能可能违反上游服务条款并导致账号受限,是否使用及其后果由你自行承担。本项目按「现状」提供,不附带任何担保。有问题请通过仓库 Issue 联系。

Yorumlar (0)

Sonuc bulunamadi