Trae CN / Trae Solo CN 模型反代。把 Trae 的 Remote / IDE / Work 模型通道包装成 OpenAI 兼容 API(Chat Completions + Responses),支持调用方工具调用、thinking 分离输出、思考强度映射、多账号并发轮询、每日签到和积分消费记录,可直接接入 Codex、new-api 和各类 OpenAI SDK。
仅供学习使用。请勿用于商业用途。
- OpenAI 兼容接口:
GET /v1/models、POST /v1/chat/completions、POST /v1/responses、POST /v1/chat、POST /v1 - 流式与非流式输出,SSE 心跳防止网关空闲断开
- 完整工具调用:
tools/tool_choice(auto / none / required / 指定函数)/parallel_tool_calls,流式输出标准delta.tool_calls - Codex Responses API:文本流、
function_call、custom_tool_call、namespace 工具、*_call_output续轮和previous_response_id - thinking 与正文分离:思考内容只进
reasoning_content/ Responses reasoning 事件,不混入正文,且默认压缩为关键结论 - 思考强度:
reasoning_effort/thinking.budget_tokens映射到 Trae 原生light/high/extra_high,按模型声明的档位自动钳制 - 四个可切换上游端点:Remote、IDE Agent、Work Agent、IDE Raw,原生端点失败时可自动回落 Remote
- 自动路由开关:按请求是否带工具自动选端点(工具走 IDE Agent,纯聊天走 Remote),失败保底回落 Remote
- 多账号:网页 OAuth 登录、手动添加凭证、账号模型请求开关(不影响签到)、顺序轮询 / 积分优先轮询、每账号并发槽位与排队
- 每日签到:一键签到、定时自动签到(控制台开关 + 每日时间,北京时间)、9074 风控自动换设备 ID 并退避重试、后台错峰自动重试
- 积分与消费记录:统一显示通用积分,按请求记录 tokens、单次积分、状态、思考强度、上下文模式及工具调用
- 网页控制台:账号与签到、消费记录、轮询与设置、模型连通性测试(可选端点、工具探针和思考强度)
- 1M Max 上下文模式(可选)、自动刷新 Cloud-IDE-JWT、未知模型透传
- Docker 一键部署,镜像只包含运行所需源码
控制台「轮询与设置 → 上游端点」可在运行时切换,也可用 UPSTREAM_MODE 固定。以下为 glm-5.3 / deepseek-v4-pro 实测结果(7 项工具测试:流式与非流式的工具调用、两轮工具续写、并行调用、强制 tool_choice、tool_choice=none):
| 端点 | UPSTREAM_MODE |
上游路径 | 工具调用 | 思考强度 | 说明 |
|---|---|---|---|---|---|
| Remote(默认) | remote |
/api/remote/v1/chat_sessions |
glm-5.3 6/7(不支持并行调用) | 生效 | 最稳定的通用通道;Agent 优先,失败回退一次 Work |
| IDE Agent | ide |
/api/agent/v3/llm_utils_chat |
glm-5.3 7/7,deepseek-v4-pro 7/7 | 不生效(端点忽略该字段) | 工具能力最完整,适合 Codex / Agent 类客户端 |
| Work Agent | work-agent |
Remote solo_work_remote |
glm-5.3 6/7 | 生效(无 Work 档位时借用 Agent 档位) | 走 Work 执行器,不会被默认 provider 接管 |
| IDE Raw | raw |
/api/ide/v2/llm_raw_chat |
不可用 | 不可用 | 个人账号返回 2001 app config record not found,需要企业 PAT;保留作协议诊断 |
部分模型在 Remote / Work 上会出现上游 4028 / 502(例如 deepseek-v4-pro),此时请切换到 IDE Agent。需要完整工具能力(含并行调用)时推荐 IDE Agent;只聊天或需要思考强度时用 Remote。
| 方式 | 说明 |
|---|---|
auto |
自动解密本地 Trae CN / SOLO CN 的 storage.json |
env |
从 .env 读取 TRAE_TOKEN / TRAE_REFRESH_TOKEN / TRAE_USER_ID |
manual |
网页抓包得到的 Cloud-IDE-JWT |
cli |
本地 Trae CLI 子进程,不需要 JWT |
web-login |
浏览器授权登录,打开 http://服务器:8000/web/login 后在页面完成授权 |
cp .env.example .env
# 编辑 .env 配置 TRAE_AUTH_SOURCE 和上游模式
pip install -r requirements.txt
uvicorn src.main:app --host 0.0.0.0 --port 8000开发环境使用 pip install -r requirements-dev.txt,Windows TraeWork native
helper 使用 pip install -r requirements-native.txt。Linux relay 镜像只安装核心依赖。
每个 v*.*.* 标签会由 GitHub Actions 自动完成测试、源码包发布和
GHCR 镜像构建。也可以在仓库的 Actions → Release and container image →
Run workflow 手动执行,默认会构建 v1.0.2。部署机器不需要安装 Python、
Node 或本项目源码,只需要 Docker、Docker Compose 和一个 .env 文件:
cp .env.example .env
docker pull ghcr.io/autumnsentiment/trae2api-cn:latest
docker compose -f docker-compose.image.yml up -d镜像以公开 GHCR 包发布,支持 linux/amd64 和 linux/arm64,无需登录即可
拉取。需要固定版本时,把 docker-compose.image.yml 中的 :latest 改为发布页的
版本标签,例如 :1.0.2。更新已有部署时执行
docker compose -f docker-compose.image.yml pull,再执行
docker compose -f docker-compose.image.yml up -d。
预构建镜像的 Compose 文件不依赖外部 new-api 网络。如果 new-api 也在 Docker
中,可通过宿主地址访问 relay,或显式把两者加入同一网络。宿主端口由
RELAY_PORT 控制;容器监听端口由 .env 的 PORT 控制,两者默认都是 8000。
源码构建仍可用于开发和没有外网的部署环境:
cp .env.example .env
docker compose up -d --build容器默认监听 8000 端口。RELAY_PORT 修改宿主机发布端口,不修改容器内
监听端口;调整端口映射后需执行 docker compose up -d --force-recreate,
仅重启旧容器不会改变映射。
Actions 发布的镜像会把提交 SHA 写入 RELAY_BUILD_REVISION 镜像 label,并由
/v1/status 返回,便于确认运行容器与源码版本一致。手动源码构建可设置
RELAY_BUILD_REVISION=$(git rev-parse --short HEAD)。
为什么需要一个本机助手? Trae 授权页强制要求授权回调地址为
http://127.0.0.1:<端口>/authorize, 且浏览器网页出于安全沙箱无法监听本机 TCP 端口,因此必须由本机运行 一个轻量监听器来接收回调并转发给服务器。这是 Trae 的限制,不是本项目的缺陷。
- 打开
http://服务器:8000/web/login - 点击「使用 Trae 网页授权登录」,页面会自动检测本机助手是否在线
- 若提示「未检测到本机授权助手」,点击页面上的「下载一键启动 start_auth.bat」
- 双击运行
start_auth.bat(Windows,无需安装 Python 时会提示安装),保持窗口开启 - 回到页面重新点击授权,浏览器弹出 Trae 授权页,确认登录即可
- 凭据自动写入服务器,页面自动刷新显示「已登录」
也可手动运行:
python web_login.py --relay http://服务器:8000
本机助手已在线时,直接点授权即可,无需重复下载和启动。
GET http://127.0.0.1:8765/healthz— 健康检查(供网页检测)GET http://127.0.0.1:8765/relay-url— 返回配置的 relay 地址
详见 .env.example 中的注释。
关键变量:
| 变量 | 默认值 | 说明 |
|---|---|---|
TRAE_AUTH_SOURCE |
auto |
认证来源 |
UPSTREAM_MODE |
remote |
上游模式:remote 默认先用 solo_agent_remote,创建失败或首个模型事件前空响应时最多回退一次 solo_work_remote;其他兼容模式可显式选择 raw / cli / web / ide |
TRAE_WEB_SLOT_TIMEOUT |
60 |
等待账号并发槽位的超时(秒);所有账号槽位占满时请求排队等待 |
TRAE_VERBOSE_REASONING |
空 | 设为 1 时输出完整思考链;默认只保留压缩后的关键结论 |
TRAE_MAX_COMPLETION_TOKENS |
64000 |
单次输出 token 上限;Agent 模型最高 64K |
TRAEWORK_CUSTOM_UPSTREAM_MODE |
remote |
TraeWork custom-model/raw 入站使用的上游;默认走已验证的 remote 会话,raw 仅保留作原生协议诊断 |
TRAE_CHECKIN_DEVICE_ID |
空 | 可选的 TraeWork 原生 guaranteedDeviceId;配置后签到优先使用真实客户端设备身份 |
TRAE_CHECKIN_DEVICE_IDS_JSON |
空 | 可选的账号到 TraeWork 设备 ID 的 JSON 映射,优先级高于全局设备 ID |
TRAE_CHECKIN_INTERVAL_SECONDS |
60 |
多账号轮询时相邻实际签到请求的间隔 |
TRAE_CHECKIN_9074_RETRY_SECONDS |
60 |
上游返回业务码 9074 后提示的最短重试等待时间;relay 不会立即重复 claim |
TRAE_CHECKIN_9074_MAX_BACKOFF_SECONDS |
3600 |
连续 9074 指数退避的等待上限(秒) |
TRAE_CHECKIN_AUTO_RETRY_INTERVAL_SECONDS |
60 |
后台自动错峰重试的扫描间隔(秒),到点自动 claim 冷却到期的账号 |
TRAE_RAW_BASE_URL |
https://trae-api-cn.mchost.guru |
Trae raw v2 llm_raw_chat 网关;账号站 api.trae.com.cn 不提供此模型端点 |
TRAE_RAW_MAX_MESSAGES |
80 |
raw 请求保留的非系统历史消息上限;会保留最近连续历史及边界工具调用配对 |
TRAE_RAW_MAX_HISTORY_CHARS |
120000 |
raw 历史文本字符上限,避免重复工具 schema 和过长历史造成额外消费 |
TRAE_RAW_MAX_TOOL_SCHEMA_CHARS |
48000 |
raw 系统提示中的工具 schema 字符预算;超限时保留全部工具名并压缩为字段签名,减少输入积分消耗 |
TRAE_REMOTE_ONLY_MODELS |
空 | 仅将列出的显式模型强制送往 remote;逗号分隔,* 表示全部强制 remote |
TRAE_REMOTE_MAX_MESSAGES |
500 |
remote 会话保留的非系统历史消息上限 |
TRAE_REMOTE_MAX_HISTORY_CHARS |
480000 |
remote 历史文本字符上限(压缩阶段) |
TRAE_REMOTE_QUERY_MAX_CHARS |
480000 |
remote 扁平化 query 的硬上限;上游超过约 500K 字符会静默结束事件流,超限时从最早的非系统消息开始裁剪 |
TRAE_AUTO_ROUTE |
0 |
自动路由默认值,控制台「自动路由」开关保存后以控制台为准;开启后带 tools / tool_choice 或工具历史的请求走 IDE Agent,其余走 Remote,失败回落 Remote |
TRAE_AUTO_CHECKIN |
0 |
定时自动签到默认值,控制台「自动签到」开关保存后以控制台为准 |
TRAE_AUTO_CHECKIN_TIME |
08:30 |
每日自动签到时间(HH:MM,北京时间);relay 晚于该时间启动时当天会补签一次 |
TRAE_REMOTE_MAX_MODE |
0 |
默认值,控制台「1M 上下文」开关保存后以控制台为准(写入 data/accounts.json,重启后保留);remote 会话启用 1M Max 模式;对账号配置 max_mode=true 的模型注入 strategy=max 与 1M/936K/64K 参数,并使用独立的 max 会话 ID |
TRAE_REMOTE_MAX_MODELS |
空 | Max 模型白名单,逗号分隔;留空表示所有 max_mode=true 模型生效 |
TRAE_REMOTE_MAX_MODE_TYPE |
1 |
服务端 get_model_selection_modes 的模式枚举;1 已实测生效 |
TRAE_REMOTE_AGENT_FIRST |
1 |
remote 是否默认锁定 Agent 执行器;关闭后普通请求直接使用 Work |
TRAE_REMOTE_WORK_FALLBACK |
1 |
Agent 创建失败或可重试空响应时,是否同账号回退一次 Work |
TRAE_REMOTE_CALLER_TOOLS_USE_WORK |
1 |
带调用端工具的 remote 请求固定使用 Work,避免 Agent 内部远端工具把“已下载/已写入”误报为调用端本地文件操作;普通无工具请求仍默认 Agent |
TRAE_CLIENT_WORKSPACE_PATH |
C:\workspace |
未传 client_context 时使用的调用方工作区 |
TRAE_CLIENT_SYSTEM_TYPE |
Windows |
未传 client_context 时使用的调用方系统 |
TRAE_CLI_DISALLOWED_TOOLS |
Read,Bash,Edit,Replace,Write,Glob,Grep,Task |
CLI 模式额外禁用的 relay 本机工具;外部工具请求会与默认项合并 |
TRAE_WEB_BASE_URL |
https://trae-api-cn.mchost.guru/api/remote/v1 |
remote 上游端点;remote 模式按 9router 的 chat_sessions + events 协议转发 |
TRAE_WEB_PARALLEL_LIMIT |
2 |
每账号最大并行会话数 |
TRAE_WEB_IDLE_TIMEOUT |
60 |
空闲会话回收超时(秒) |
TRAE_REMOTE_FIRST_EVENT_TIMEOUT_SECONDS |
120 |
remote 会话创建成功但没有首个 SSE 事件时的重试等待;首事件前 EOF/读超时同样按可重试空响应处理,0 表示关闭独立首事件期限 |
TRAE_MODEL_LIST_CACHE_TTL |
300 |
/v1/models 上游模型列表缓存秒数。列表实时取自当前账号的 Agent / Work / Design 模型,只返回小写模型名(带大写的 config 名统一转小写去重),外加 auto、work;上游拉取失败时回落内置列表 |
SSE_HEARTBEAT_SECONDS |
1 |
Chat/Responses 上游空窗时发送标准 SSE 注释心跳;0 为关闭 |
TRAE_USAGE_RECORDS_PATH |
data/usage_records.json |
消费记录独立持久化文件,不改写 data/accounts.json |
TRAE_USAGE_SESSION_QUERY |
true |
有上游回合 ID 时异步查询精确积分;失败自动回退账号快照差值 |
TRAE_USAGE_API_HOST |
https://api5-normal.mchost.guru |
TraeWork 商业用量查询主机,不与 entitlement API 混用 |
TRAE_USAGE_QUERY_TIMEOUT_SECONDS |
15 |
回合积分查询超时时间;只影响后台 enrichment |
TRAE_USAGE_CREDIT_SETTLE_SECONDS |
1 |
请求完成后等待上游积分账单落库再计算单次积分差值 |
RESPONSES_SESSION_TTL_SECONDS |
3600 |
previous_response_id 会话缓存有效期(秒) |
RESPONSES_SESSION_MAX_ENTRIES |
1024 |
Responses 进程内会话缓存最大条数 |
RELAY_API_KEYS |
空 | API 密钥鉴权(逗号分隔多个);公网部署必须设置并配合 TLS |
LOG_LEVEL |
INFO |
日志级别 |
控制台的“消费记录”按请求保存一行,包含输入/输出/总 tokens、单次消耗积分、请求状态、模型、思考强度、上下文模式和 Tool 参数。工具定义与模型实际返回的工具调用分别记录,Max 请求值与上游应用值分别保存,没有上游证据时不标为已启用,历史记录缺失字段显示 --。积分优先级为:上游显式 usage、TraeWork 回合级 credits_float、同一账号请求前后的累计积分差值;无法安全归属时显示 --,不会把未知值伪装成 0。回合级查询使用上游 reply_to_message_id/userMessageId,不会把固定 raw 会话 UUID 当作计费键,也不会阻塞模型首帧。记录保存在独立的 usage_records.json,账号凭据仍只在 accounts.json 中维护。
「账号与签到」中每个账号都有独立的“模型请求”开关,旧账号默认开启,
开关保存在 data/accounts.json 中。关闭后,该账号不会接收新模型请求或
轮询重试;手动签到、每日定时签到、状态刷新与积分查询照常运行。
已经输出中的请求不会被强制中断,绑定该账号的会话下一轮请求返回
503 model_account_unavailable,可重新开启账号后继续。全部账号关闭时,
Chat Completions / Responses 返回明确的 503,不会绕回当前管理账号。
也可通过管理 API 设置:
curl -X POST http://127.0.0.1:8000/api/accounts/model-enabled \
-H 'Content-Type: application/json' \
-d '{"account_id":"你的账号ID","enabled":false}'端点模式与自定义 URL 同样持久化在账号存储中,启动后恢复控制台保存的选择, 优先于容器环境默认值。Relay 服务端口单独保存,不会被端点切换顺带修改。
工具调用使用标准 OpenAI 多轮协议。首次请求把工具 schema 和调用方环境放进请求:
{
"model": "auto",
"stream": false,
"session_id": "terminal-session-1",
"messages": [{"role": "user", "content": "读取 README.md"}],
"tools": [{
"type": "function",
"function": {
"name": "read_file",
"description": "读取调用方工作区中的文件",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"]
}
}
}],
"tool_choice": "auto",
"parallel_tool_calls": true,
"client_context": {
"workspace_path": "C:\\Users\\me\\project",
"system_type": "Windows 11",
"terminal_context": [{"shell": "PowerShell", "cwd": "C:\\Users\\me\\project"}]
}
}非流式响应使用 message.content: null、message.tool_calls 和 finish_reason: "tool_calls";function.arguments 是 JSON 字符串。流式响应在 delta.tool_calls 中返回增量,客户端需要按 index / id 拼接,直到收到 finish_reason: "tool_calls"。
客户端收到 assistant 的 tool_calls 后,在自己的终端执行工具,再把原 assistant 消息和 role: "tool"、匹配的 tool_call_id(建议同时带 name)及执行结果一起发起下一轮请求。relay 本身不会执行请求中声明的外部工具,也不会自动拥有调用方文件系统;client_context 只是告诉模型真实环境,不能替代客户端工具实现。
IDE Agent 使用原生工具协议:schema 放入上游 tools,parameters 按 SOLO 协议编码为 JSON 字符串;历史中的 assistant.tool_calls、调用 ID、role: "tool" 和 tool_call_id 保持关联。Remote / Work Agent 与 Raw 使用文本工具桥接,不代表上游原生支持 OpenAI tools。2026-10-03 的独立 IDE 实测中,glm-5.3 的流式和非流式两轮调用均完成 Windows 客户端本地读文件、结果回传及内容校验,实际 provider 为 glm-5.3,未启用回落。
第二轮请求需带回完整历史,例如:
{
"model": "auto",
"session_id": "terminal-session-1",
"messages": [
{"role": "user", "content": "读取 README.md"},
{
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_read_1",
"type": "function",
"function": {"name": "read_file", "arguments": "{\"path\":\"README.md\"}"}
}]
},
{
"role": "tool",
"tool_call_id": "call_read_1",
"name": "read_file",
"content": "README.md 的实际内容"
}
],
"tools": [{
"type": "function",
"function": {
"name": "read_file",
"parameters": {"type": "object", "properties": {"path": {"type": "string"}}}
}
}]
}路由规则:选中的端点总是第一个尝试。raw 失败时按 IDE Agent -> Remote 回落,ide / work-agent 失败时回落 remote;空响应仅在允许重试且未观察到模型活动时可跨端点回落。已收到输出、provider、usage 或工具事件,或返回不可重试错误时,不重放模型请求,避免重复消费。公开流的初始空 delta / 心跳不是模型输出。TRAE_REMOTE_ONLY_MODELS 可把指定模型强制送往 remote,* 表示全部。
自动路由:在「轮询与设置 → 自动路由」打开开关(或 POST /api/auto-route {"enabled":true})后,每个请求按内容选端点:请求带 tools / tool_choice / parallel_tool_calls,或历史中有工具调用 / 工具结果时走 IDE Agent,否则走 Remote;IDE Agent 失败时按上面的规则回落 Remote。开关开启时预设端点的模式选择不再生效,关闭后恢复预设端点。本地 CLI / TraeWork native 模式不受影响。模型测试页可选「自动路由」单独验证,不需要打开全局开关。
raw 端点的 HTTP body 固定为 config_name、conversation_id、messages、model_name、session_id、stream 六个字段,OpenAI 工具字段由 relay 转成系统提示,再把模型文本中的工具调用解析回 OpenAI 事件。
remote 模式复用了 9router Trae executor 的两步会话协议:先 POST /chat_sessions 创建回合,再 GET /chat_sessions/{id}/events?reply_to_message_id=... 读取 SSE。plan_item.thought 按累计快照计算增量,token_usage、done 和 error 会转换为现有 OpenAI Chat/Responses 输出。它只复用 9router 的转发逻辑,不切换到国际版;默认仍使用当前 CN remote 地址。
ide 模式调用 /api/agent/v3/llm_utils_chat,使用 function=solo_work_lite、config_name、结构化 messages、设备指纹和 Cloud-IDE-JWT 请求头,不再使用旧 /api/ide/v1/chat 的 chat_history 封装。IDE 与其他模式共用账号绑定、SSE 心跳、消费记录和 Responses 会话缓存。
work-agent 模式固定使用 Remote 的 solo_work_remote 执行器,并设置 _trae_mode=work,避免 Work 请求被默认 provider(例如 Kimi/Agent)接管。它保留调用端 tools 定义和工具历史;若 Work Remote 创建或首事件失败,则按配置回退到 Remote 通用路径。
raw 模式不会向上游发送其不接受的 OpenAI 顶层工具字段,也不会在空响应后伪造占位正文。只有在首个模型事件出现前允许一次空响应重试;已有输出、provider、usage 或工具事件后不会重放请求,避免重复消费。GET /v1/status 的 tool_execution 固定为 client,并列出当前工具桥接能力。
UPSTREAM_MODE=cli 仅作为显式兼容模式保留,会禁用默认工具并合并 TRAE_CLI_DISALLOWED_TOOLS;auto 不会进入该路径。
工具调用属于不可信模型输出。客户端应校验工具名 allowlist 和 JSON schema,并对路径、命令、权限、超时及输出大小做限制。提示词、client_context、工具 schema 和工具结果都会发送给 relay/Trae 上游,敏感内容仍需在调用端裁剪。
在控制台「轮询与设置 → 1M 上下文(Max 模式)」打开开关即可,新会话立即生效,无需重启。「生效模型」留空表示账号中所有标记 max_mode 的模型;点「检测支持的模型」可列出当前账号支持 Max 的模型并一键加入。单次请求也可带 "trae_max_mode": true 临时开启。
Max 只作用于 Remote 端点的 Agent 会话。带调用端工具的请求默认走 Work(TRAE_REMOTE_CALLER_TOOLS_USE_WORK=1),不会使用 Max;IDE Agent / Work Agent / IDE Raw 端点也不使用 Max。模型测试页勾选「1M Max」可确认是否实际生效。
思考内容默认不对外输出。请求带 thinking: {"type": "enabled"}(或 include_reasoning: true)时,Chat 返回 reasoning_content,Responses 返回独立的 reasoning 事件,正文 content 中不会出现思考文本。思考内容默认被压缩为关键结论,设置 TRAE_VERBOSE_REASONING=1 可恢复完整输出。
思考强度支持以下写法,统一映射到 Trae custom_model.reasoning_effort:
| 请求参数 | Trae 档位 |
|---|---|
reasoning_effort: minimal / low |
light |
reasoning_effort: medium / high |
high |
reasoning_effort: xhigh / max |
extra_high |
reasoning: {"effort": ...}(Responses) |
同上 |
thinking.budget_tokens < 4096 / < 16384 / 更大 |
light / high / extra_high |
档位会被钳制到模型 reasoning_effort_config 声明的选项内。模型不支持思考档位或端点不接受该字段时(IDE Agent、IDE Raw),请求照常完成,强度字段被忽略;模型测试页会显示未生效原因。
Codex 使用 POST /v1/responses,不能只把 wire_api 改成 Responses 后继续返回 Chat Completions SSE。relay 会把 Responses 的 input、扁平 function、自定义工具和 namespace 工具转换到统一工具管线,再按选定端点使用 IDE 原生协议或文本桥接,返回带类型的 Responses 事件。
流式工具轮次会依次包含完整的 response.output_item.done 和 response.completed。Codex 收到当前响应完成后,才会在调用方终端执行工具,并用相同 call_id 加入 function_call_output 或 custom_tool_call_output,自动发起下一次 /v1/responses 请求。Responses 流不使用 Chat Completions 的 data: [DONE] 作为完成信号。
Codex 自定义 provider 示例:
model_provider = "trae-relay"
model = "glm-5.3"
[model_providers.trae-relay]
base_url = "http://服务器:8000/v1"
wire_api = "responses"
requires_openai_auth = true若前面还有 new-api,应确保其 Responses 渠道把 /v1/responses 原样转发到本 relay;relay 地址自身则是 http://服务器:8000/v1。
relay 支持两种连续会话方式:客户端可以在每轮重放完整 input 历史,也可以只发送新的输入或工具结果并携带上一轮返回的 previous_response_id。后一种方式会从有 TTL 和容量上限的进程内缓存恢复用户消息、assistant 输出、工具调用及绑定;客户端即使同时重放完整历史也会进行重叠去重。store: false 不写入缓存,未知、过期、容器重启后失效或超过缓存上限的 response id 会返回明确的 400 previous_response_id 错误。
启动后访问 http://服务器:8000/web/login,左侧纵向导航五个页面,右上角可切换浅色 / 夜间主题:
- 概览(默认首页):总 tokens、输入 / 输出 / 缓存 tokens、今日用量、有效账号数;按日期堆叠柱状图(7 / 14 / 30 天)、服务状态(版本、运行时长、上游端点、自动路由、轮询、1M、自动签到、并发中请求)和按日期汇总表。数据来自
GET /api/overview?days=N,每日汇总持久化在data/usage_stats.json,不受 100 条消费记录上限影响 - 账号与签到:上方是授权登录(网页授权、本机助手下载、手动填写凭证),中间是自动签到(启用开关、每日时间、立即执行,以及下次执行 / 上次执行 / 上次结果),下方是整宽账号列表(账号、用户 ID、状态、有效期、通用积分、签到状态,单账号签到 / 切换 / 删除,以及查询签到状态、查询全部积分、一键轮询签到)
- 消费记录:按请求显示模型、tokens、单次积分、状态、思考强度、上下文模式,以及是否携带工具参数和本轮是否返回工具调用
- 轮询与设置:多账号轮询开关、顺序 / 积分优先模式、上游端点预设与自定义 URL、Relay 端口、1M 上下文(Max 模式)开关与生效模型(可一键检测账号支持 Max 的模型)
- 模型测试:批量测试模型连通性,可选文本 / 工具探针、思考强度、thinking 输出和 1M Max,并可指定端点(测试期间禁止跨端点回落)
- 网络边界:本项目设计为内网部署。不要把 8000 端口直接暴露到公网;如必须公网访问,请设置
RELAY_API_KEYS并在前面加 TLS 反代。管理接口和模型测试接口对内网地址免鉴权。 - 敏感数据:
.env与data/(accounts.json、usage_records.json)包含 JWT、刷新令牌和账号信息,已在.gitignore和.dockerignore中排除,切勿提交或分享。 - 工具执行在调用端:relay 只转发工具调用和结果,不会替客户端执行命令或写文件。模型声称“已下载 / 已写入”但本地没有文件,说明客户端没有真正执行工具,请检查客户端是否把
tools发给 relay、是否回传了role: "tool"结果。 - 端点选择:不想手动切换时打开「自动路由」;需要工具调用时优先用 IDE Agent 或 Remote;IDE Raw 对个人账号不可用。切换端点或开关后无需重启,立即生效。
- 上下文长度:remote 扁平化 query 约 500K 字符时上游会静默断流,relay 默认在 480K 字符处裁剪最早的历史。长会话建议客户端自行压缩上下文。
- 并发:每账号默认 2 个并行会话(
TRAE_WEB_PARALLEL_LIMIT),多个 bot 同时请求时开启多账号轮询,请求会分散到不同账号;槽位全满时排队,超过TRAE_WEB_SLOT_TIMEOUT返回错误。 - 签到 9074:9074 是上游风控码。relay 会自动轮换签到设备 ID 并指数退避重试,无需手动反复点击;若长期失败,可在
TRAE_CHECKIN_DEVICE_IDS_JSON中填入真实客户端的设备 ID。 - 自动签到:定时签到按顺序逐个账号执行,已签到和无凭证的账号会跳过,账号之间沿用
TRAE_CHECKIN_INTERVAL_SECONDS间隔,遇到 9074 的账号交给后台退避重试。时间以北京时间计算,每天只触发一次定时任务;「立即执行」不会占用当天的定时任务。 - 用量统计:缓存 tokens 仅在上游返回时统计,旧记录按 0 计;日期按北京时间划分,最多保留 400 天。
- 积分:控制台只显示合并后的通用积分。单次积分需要等上游账单落库后才能计算,个别记录短时间显示
--属于正常现象。 - 502 / 空响应:首个模型事件前的空响应会自动重试一次,仍失败时返回 502 并在错误信息中列出每个端点的失败原因。常见原因有模型未绑定到账号、上游
4028和 raw 的2001,可在模型测试页逐个端点排查。 - 更新部署:更新前建议先
docker commit备份当前容器镜像;更新后浏览器按 Ctrl+F5 强制刷新控制台。 - 合规:使用本项目需自行承担账号风险,请遵守 Trae 服务条款。
正式可部署源码只有以下边界:
src/ relay 服务与协议转换
main.py 路由、端点调度、网页控制台、签到与消费记录
trae_remote_client.py Remote / Work Agent 会话协议
trae_client.py IDE 端点、账号槽位、模型列表
raw_client.py raw v2 协议与工具提示词桥接
responses_api.py Responses API 转换与会话缓存
sse.py SSE 转换、thinking 分离与工具调用解析
reasoning_effort.py 思考强度映射
traework_compat.py TraeWork custom-model 入站兼容
tests/ 离线协议、流式和路由回归测试
native/ TraeWork native 文件清单与说明,不包含 DLL
tools/ Windows native helper
scripts/backup_runtime.sh Docker 运行态一致性备份
探针、抓包、逆向材料、账号状态、旧发布包和备份不进入 Docker 构建上下文,
也不应提交到仓库。trae-cn-relay 是唯一产品源码目录;研究目录只用于生成报告或补丁。
发布前运行:
python -m pytest -q
docker compose build在 Docker 主机上备份当前运行容器、容器内源码、宿主配置和数据:
sudo bash scripts/backup_runtime.sh脚本会短暂停止并自动重启容器,备份写入 backups/<timestamp>-runtime/,
同时生成镜像归档和 SHA-256 校验清单。.env 与 data 含敏感状态,备份目录权限为 0700,文件为 0600。
MIT License
Copyright (c) 2026 autumnsentiment
本项目仅用于学习和研究目的。使用本项目产生的任何后果由使用者自行承担。