最近在使用 Trae 做远程 SSH 开发时,AI 编程体验整体非常顺滑,自定义模型接入 DeepSeek 后,可以直接在远程服务器上进行代码生成与重构,这种“远程 + AI Agent”的组合在工程效率上提升明显。但在实际使用过程中,遇到了一个比较典型但又非常隐蔽的问题:在连接远程服务器后使用 DeepSeek 自定义模型时,频繁报 4054 错误,并且该问题无法通过常规重试解决。

错误信息如下:

error_code: 4054 error_message: "Custom model internal error occurred. Please check the proxy response for details."

更关键的是,这个问题具有明显的“环境相关性”:同一账号在本地环境正常、在其他服务器正常,只有某一台远程服务器出现异常,并且问题是“突然发生”的,没有任何明显配置变更。这种情况基本可以排除模型本身问题,而更可能是远程运行时环境或代理链路状态异常。

一、问题现象与触发条件

在 Trae 通过 SSH Remote 连接远程服务器后,选择 DeepSeek(如 deepseek-v4-flash 或 deepseek-v4-pro)作为自定义模型,输入任意消息后立即返回 4054 错误。但如果切换到其他模型或者更换服务器,该问题完全消失。

这种现象具有几个典型特征:

  • 同账号不同机器表现不一致
  • 同机器不同模型表现不一致
  • 问题出现无明显触发事件
  • 重启 IDE 无法修复

这些特征通常意味着问题不在业务层,而是在代理层或连接状态层

二、Trae 远程开发架构拆解

要理解问题根因,需要先明确 Trae 远程开发的整体链路结构:

  • 本地 Trae 客户端通过 SSH 连接远程服务器

  • 远程运行 trae-server 主进程

  • 子模块包括:

    • server-main(主控制)
    • ai-agent(AI对话执行)
    • trae-helper(网络层 / TTNet)
    • ckg_server(代码知识图谱)
  • AI 请求链路为:

ai-agent → custom_model_proxy_client → WebSocket → Trae云网关 → DeepSeek API

  • 聊天记录存储位置:

ai-agent/database.db(SQLite)

在这个链路中,真正关键的不是模型,而是:

custom_model_proxy_client 的 WebSocket 长连接机制

三、初步排查:网络层异常信号

首先检查 Trae 网络层日志:

grep 'country_code' ~/.trae-server/manager-logs/*/Modular/trae-helper_*_stdout.log

得到结果:

country_code=tw, country_code_src=uid

这里出现了一个明显异常:服务器被识别为 tw(台湾节点),而正常情况应为 hkcn 路由。这意味着请求可能被调度到了错误的 CDN 节点。

但需要注意,这一现象并不是直接错误原因,而是后续链路异常的诱因之一。

四、进程状态异常:多版本 Trae 混跑

继续检查服务器进程:

ps aux | grep 'trae-server' | grep -v grep

结果发现存在多个版本混合运行:

版本 状态
stable-318b0f6... 2 实例活跃
stable-8829057c... 僵尸进程残留(8 个 agent-tool-host)
stable-d2e2138f... 僵尸进程残留
stable-97bd3e97... 僵尸进程残留
trae-cn-server 1 实例活跃

这种状态会导致:

  • 网络参数污染
  • WebSocket连接复用异常
  • 路由策略不一致
  • 代理层状态混乱

在分布式客户端系统中,这属于典型的“多版本运行污染问题”。

五、请求链路分析:关键时间异常

从 ai-agent 日志中提取关键指标:

svr_11_gateway_server_processing_time: 4927ms
svr_06_platform_first_token_timing: 4000ms
svr__06_platform_provider_first_token_timing: 0
svr__06_platform_provider_network_latency: 0

分析结果:

  • 请求已到达 Trae 云网关
  • 网关处理耗时约 5 秒
  • DeepSeek 侧无任何响应
  • provider 层未返回 token

结论非常明确:

问题发生在“网关 → 模型代理”之间,而不是模型本身

六、根因定位:长连接状态污染

进一步分析后发现核心问题在于:

custom_model_proxy_client 在启动时会建立 WebSocket 长连接,并绑定当前:

  • CDN 节点
  • country_code
  • 路由策略

关键问题是:

该 WebSocket 在生命周期内不会随网络状态更新自动刷新

导致以下链路:

  1. 初始连接被错误标记为 tw 节点
  2. WebSocket 绑定到错误 CDN
  3. 后续请求持续复用该连接
  4. 即使 country_code 修正,也不会影响已建立连接
  5. 最终持续返回 4054 错误

本质是典型的:

长连接状态漂移 + 路由不一致问题

七、修复方案:避免数据丢失的精准重启

❌ 方案A:全量删除(不推荐)

rm -rf ~/.trae-server

问题:

  • 聊天记录丢失
  • 配置丢失
  • 索引重建成本高

✅ 方案B:精准重启 ai-agent(推荐)

核心思路:只重建 WebSocket,不动数据层。

#!/bin/bash
# Trae AI Agent 精准重启脚本
# 只重启 ai-agent,不丢聊天记录
set -e

TRAE_DIR="$HOME/.trae-server"
DB_PATH="$TRAE_DIR/ai-agent/database.db"

echo "=== Trae AI Agent 精准重启 ==="
echo "时间:$(date '+%Y-%m-%d %H:%M:%S')"

if [ -f "$DB_PATH" ]; then
    BACKUP="$DB_PATH.backup.$(date +%Y%m%d_%H%M%S)"
    cp "$DB_PATH" "$BACKUP"
    echo "✓ 数据库已备份:$BACKUP"
fi

AGENT_PIDS=$(ps aux | grep 'trae-server.*ai-agent' | grep -v grep | awk '{print$2}')
TOOL_PIDS=$(ps aux | grep 'agent-tool-host' | grep -v grep | awk '{print$2}')

for pid in $AGENT_PIDS; do
    kill "$pid" 2>/dev/null
done

for pid in $TOOL_PIDS; do
    kill "$pid" 2>/dev/null
done

sleep 3

echo "✓ ai-agent 已重启"
echo "=== 完成 ==="

八、工程视角总结:问题本质

该问题并不是模型错误,而是典型的分布式系统问题:

  • 长连接生命周期未刷新
  • 路由状态与实际网络不一致
  • 旧 WebSocket 复用错误 CDN
  • 代理层状态漂移

在更复杂的工程体系中,这类问题通常会通过统一 API 网关进行隔离与控制,例如类似 TreeRouter 这样的多模型聚合网关,仅提供统一 OpenAI 兼容接口与模型路由能力,从工程上减少多接口切换复杂度,但连接层的稳定性仍主要依赖底层通信系统与客户端实现。

九、结语

4054 错误的本质并不是 DeepSeek 或模型问题,而是 AI Agent 架构中典型的“长连接状态不一致”问题。在分布式与多节点代理系统中,这类问题往往比业务错误更难定位,因为表象是“模型失败”,本质却是“连接已经变质但仍在复用”。

真正稳定的 AI 开发环境,需要同时控制三件事:

  • 网络路由一致性
  • 长连接生命周期管理
  • 代理层状态同步机制

否则再强的模型,也会被错误的连接状态拖垮。