BYOK 会话转录文件丢失导致 BYOK_PROVIDER_REQUEST_FAILED(实为 TranscriptSessionError,重试必失败)

Bug 反馈:BYOK 会话转录文件丢失,错误被误报为 BYOK_PROVIDER_REQUEST_FAILED

环境

  • 平台:macOS(Apple Silicon,Darwin 25.5.0)
  • Qoder 版本:升级前后均能复现(2026-08-29 ~ 2026-08-30,升级到最新版后仍存在)
  • 模型:BYOK(阿里云 Token Plan,千问3.8 Max)

现象

在 BYOK 模型的对话中发送消息,界面报错:
BYOK_PROVIDER_REQUEST_FAILED 重试会复用本轮原始输入,已产生的内容和日志会保留
点击重试永远失败。同一时段用官方托管模型的对话完全正常。

实际根因(通过本地日志定位)

真实错误不是 provider 请求失败,而是 worker 恢复会话时找不到转录文件,初始化即退出:

ERROR feedback.emitted Error resuming session: Invalid session identifier "c1f2d120-af79-46a0-b97e-2df88c9c4124".
  Searched current project and same-repo worktrees:
    - /Users/luoxiao/.qoder/projects/-Users-luoxiao-Documents---
WARN process.exiting exit_code=42 reason="input_error" error_name="TranscriptSessionError"

检查 ~/.qoder/projects/<project>/ 目录:

  • 3 个 BYOK 会话(653b50ca、731cf9f0、c1f2d120)的 <sessionId>.jsonl 转录文件全部消失
  • 同项目 3 个托管模型会话的转录文件完好
  • 这些 BYOK 会话此前均正常运行过多轮(resume 也成功过),转录文件是在会话正常结束后的数小时内被删除的
  • 全盘搜索(含临时目录)确认文件不可恢复

时间线举例(会话 c1f2d120):

  • 08-30 02:14~02:50 CST:会话正常创建并完成两轮(含一次 resume 成功)
  • 08-30 13:08 CST:Qoder 升级后首次启动,.last-cleanup 更新
  • 08-30 15:10 CST:再次发消息 → resume 失败,exit_code=42
    (注:另一会话 653b50ca 在升级前的 08-30 01:40 CST 就已出现同样错误,说明不完全是升级清理导致)

问题点(两个)

  1. 数据丢失:BYOK 会话的转录文件被异常删除(疑似清理逻辑误删或 BYOK 路径的持久化 bug),托管模型会话不受影响
  2. 错误提示失真:exit_code=42 的 TranscriptSessionError 被 UI 包装成 BYOK_PROVIDER_REQUEST_FAILED,误导用户去排查模型服务商;且提示"重试会保留内容",实际重试永远失败

复现路径(推测)

  1. 使用 BYOK 模型创建对话并完成若干轮
  2. 等待转录文件被删除(触发条件未知,疑似与清理任务或 BYOK 会话生命周期管理有关)
  3. 回到该对话发送任意消息 → 必现 BYOK_PROVIDER_REQUEST_FAILED

日志证据

Worker 进程日志~/.qoder/logs/runs/2026-08-30T15-10-55-644+08-00-tuu7p2-p1741/qodercli.log):

2026-08-30T15:10:55.691+08:00 INFO  process.started run_id="2026-08-30T15-10-55-644+08-00-tuu7p2-p1741" pid=1741 role="main"
2026-08-30T15:10:57.269+08:00 INFO  [session=92ed0cbe-581f-42ad-8bdf-704d04ad0108] session.config.loaded project_root="/Users/luoxiao/Documents/试玩" target_dir="/Users/luoxiao/Documents/试玩" debug_mode=false interactive=false model="auto" permission_mode="bypassPermissions" load_config_duration_ms=372
2026-08-30T15:10:57.283+08:00 ERROR feedback.emitted Error resuming session: Invalid session identifier "c1f2d120-af79-46a0-b97e-2df88c9c4124".
2026-08-30T15:10:59.362+08:00 WARN  process.exiting exit_code=42 reason="input_error" message="Error resuming session: Invalid session identifier \"c1f2d120-af79-46a0-b97e-2df88c9c4124\".\n  Searched current project and same-repo worktrees:\n    - /Users/luoxiao/.qoder/projects/-Users-luoxiao-Documents---\n  Use --list-sessions to see available sessions." source="gemini.resume" error_name="TranscriptSessionError" error_stack="TranscriptSessionError: Invalid session identifier \"c1f2d120-af79-46a0-b97e-2df88c9c4124\".\n  Searched current project and same-repo worktrees:\n    - /Users/luoxiao/.qoder/projects/-Users-luoxiao-Documents---\n  Use --list-sessions to see available sessions.\n    at JIA (file:///Applications/Qoder.app/Contents/Resources/app.asar.unpacked/node_modules/@qoder-ai/qoder-agent-sdk/dist/_worker/qoder-worker-runtime.obf.mjs:148:653525)\n    at async kPu (...)\n    at async RPu (...)" uptime_ms=3718

Qoder 主进程日志main.log,同一时刻两次 turn 的失败记录):

[2026-08-30T07:10:36.470Z] [INFO] [ChatSession] turn starting {"sessionId":"c1f2d120-...","model":"byok:0c0c004b-a521-45c2-bf0f-021e1329497b",...}
[2026-08-30T07:10:36.471Z] [INFO] [ChatSession] turn started {"sessionId":"c1f2d120-...","turnId":"4d59ce85-...","isByok":true,...}
[2026-08-30T07:10:59.366Z] [ERROR] [ChatSession] ChatSession runtime message consumption failed {"sessionId":"c1f2d120-...","turnId":"4d59ce85-...","isByok":true,"errorKind":"QoderWorkerRuntimeError"}
[2026-08-30T07:10:59.367Z] [ERROR] [ChatSession] ChatSession message delivery failed {"sessionId":"c1f2d120-...","turnId":"4d59ce85-...","isByok":true,"errorKind":"QoderWorkerRuntimeError"}
[2026-08-30T07:11:15.329Z] [INFO] [ChatSession] turn starting {"sessionId":"c1f2d120-...","model":"byok:0c0c004b-...","permissionMode":"default",...}
[2026-08-30T07:11:35.469Z] [ERROR] [ChatSession] ChatSession runtime message consumption failed {"sessionId":"c1f2d120-...","turnId":"86701b7c-...","isByok":true,"errorKind":"QoderWorkerRuntimeError"}
[2026-08-30T07:11:35.469Z] [ERROR] [ChatSession] ChatSession message delivery failed {"sessionId":"c1f2d120-...","turnId":"86701b7c-...","isByok":true,"errorKind":"QoderWorkerRuntimeError"}

如需完整日志文件可另行提供。

昨天,今天大量出现 :sweat_smile: Qoder worker runtime exited with code 42 重试会复用本轮原始输入,已产生的内容和日志会保留。