把 WorkBuddy 客户端里免费的 hy3(腾讯混元 3,Hunyuan 3)反代成本地 OpenAI 兼容 API。
- 上游:WorkBuddy 官方网关
https://copilot.tencent.com/v2/chat/completions - 鉴权(两层):
- 客户端 → 本代理:
Authorization: Bearer <API_KEY>(未配置则启动时随机生成并写入.env) - 本代理 → 上游:
Authorization: Bearer <WorkBuddy accessToken>+X-User-Id
- 客户端 → 本代理:
- 端点:
/v1/chat/completions、/v1/responses(Responses 自动转换,非流式自动合并 SSE)、/v1/models(获取模型列表) - 特性:流式/非流式、工具调用、上下文裁剪(默认 180K,
MAX_INPUT_TOKENS可调)、启动自检(自动读登录态 / 生成密钥 / 释放端口 / 自检)
WorkBuddy 客户端里 hy3 的免费额度(活动 hy3-free-trial-202608)通过官方网关提供服务。
本代理用你的 WorkBuddy 登录态(token + uid)直连官方网关,并转换为 OpenAI 兼容协议,
因此 Codex、Trae、Cherry Studio 等客户端可以直接使用。
复制 .env.example 为 .env:
PORT=8910
UPSTREAM_URL=https://copilot.tencent.com/v2/chat/completions
API_KEY=
MAX_INPUT_TOKENS=180000
WB_ACCESS_TOKEN=
WB_USER_ID=
API_KEY:客户端调用本代理的鉴权密钥。留空时启动会自动生成sk-xxxx并写入.env, 之后所有客户端请求都必须在Authorization: Bearer <API_KEY>中携带它(缺失/错误返回 401)。 想换密钥直接改.env里的API_KEY重启即可;想彻底关闭客户端鉴权可把API_KEY设为固定值并在客户端使用同样的值。- 模型固定为
hy3(对应免费通道活动模型),无需配置:对外GET /v1/models返回模型hy3-chat(显示名hy3,分组hy3;ID 带hy3-前缀是为了让 Cherry Studio 等客户端 能推导出分组名,避免落到服务商的 UUID 分组);客户端请求里无论model传什么值, 都会统一改写为hy3再发往上游。 WB_ACCESS_TOKEN/WB_USER_ID:WorkBuddy 登录态。 代理启动时会自动从 WorkBuddy 客户端登录文件(%LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth\workbuddy-desktop.info)读取并写入.env(仅 Windows,由 Node 直连读取,无需 powershell/hy3-env.ps1);也可手动填写。- token 过期后:先在 WorkBuddy 客户端登录一次,再重跑
start-hy3.bat。
所有启动逻辑(读取 WorkBuddy 登录态、生成/持久化 API 密钥、释放被占用的端口、打印接入信息、自检 /v1/models)都在 proxy.js 内由 Node 完成,bat 只是 4 行启动器:
node proxy.jsWindows 一键启动(仅 chcp 65001 + node proxy.js,无中文、无 powershell、无 .ps1,所有中文提示由 Node 控制台以 UTF-8 输出,规避了 bat 中文乱码问题):
start-hy3.bat启动后控制台会直接打印三项接入信息(API 密钥 / API 地址 / 模型名称)并自检 /v1/models 是否返回 200。
如需完整对话测试,可另跑 node hy3-test.js(自动从 .env 读取 API_KEY 发一次 chat/completions):
node hy3-test.js手动测试:
# API_KEY 取启动日志或 .env 中的值
curl http://127.0.0.1:8910/v1/models -H "Authorization: Bearer $API_KEY"
curl http://127.0.0.1:8910/v1/chat/completions -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"model":"hy3","messages":[{"role":"user","content":"ping"}],"stream":false}'
curl http://127.0.0.1:8910/v1/responses -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"model":"hy3","input":"ping","stream":false}'
# 未携带密钥会被拒绝:
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8910/v1/chat/completions # -> 401客户端配置:
Base URL: http://127.0.0.1:8910/v1
API Key: 启动日志/.env 中的 API_KEY(如 sk-xxxx...)
Model: hy3
代理运行时会写入以下文件(位于项目下 log/ 目录):
| 文件 | 内容 |
|---|---|
log/hy3-debug.log |
每条请求的元数据:路由、是否流式、模型、tools 数量、各消息角色/长度/前 160 字符、上游状态码、内容过滤标记,带 reqId 关联 |
log/hy3-error.log |
结构化错误日志(JSON):代理内部异常(含 stack)、上游非 200 错误正文(upstream_body)、内容过滤命中,带 reqId 关联 |
log/hy3-requests.log |
仅当请求带 tools 时记录完整请求体 |
代理的控制台输出(启动 banner、自检结果、警告)直接打印到运行
start-hy3.bat的终端窗口。 每次收到客户端请求时还会实时打印通信内容:请求侧打印路由、是否流式、消息条数、估算输入 tokens、各消息角色与内容摘要;响应侧打印状态码、耗时、上游实际返回的 token 用量(in/out/total)与回复摘要。持久化日志见上表三个文件。
排障时,先用报错时间或客户端拿到的 req_xxx id 在 log/hy3-error.log 与 log/hy3-debug.log 中交叉定位同一次请求。
日志轮转:log/hy3-debug.log / log/hy3-error.log / log/hy3-requests.log 在超过单文件大小上限、或跨天时会自动切卷,归档文件按日期标记命名(不再用 .1/.2):
- 当天首次切卷:
log/hy3-error.log.2026-08-18 - 同一天多次切卷:追加时间后缀
log/hy3-error.log.2026-08-18-143500 - 超过保留份数的最旧归档按日期自动删除
可通过环境变量调整:
MAX_LOG_BYTES=5242880 # 单文件上限(字节),默认 5MB(下限 64KB)
MAX_LOG_BACKUPS=30 # 保留的日期归档份数,默认 30(约一个月)
.env、log/目录(含全部日志与日期归档)已被.gitignore忽略,请勿提交凭证与日志。
- hy3 免费活动有期限(
hy3-free-trial-202608),结束时间以上游为准。 - 上游仅支持流式(非流式请求返回
code 11101),本代理对非流式客户端自动合并 SSE。 - 上游内容安全策略较严格,本代理会把 Codex 类 agent 系统提示替换为中立系统提示以避免误拦截。
- 请遵守 WorkBuddy / 腾讯云相关服务条款;token 属于敏感信息,请勿公开。
MIT