Skip to content

fix(trace): LLM_TTFT 父节点错误 + 前端未映射 ERROR/CANCELLED 状态#35

Open
melancholy154 wants to merge 1 commit into
nageoffer:mainfrom
melancholy154:fix/trace-llm-ttft-parent
Open

fix(trace): LLM_TTFT 父节点错误 + 前端未映射 ERROR/CANCELLED 状态#35
melancholy154 wants to merge 1 commit into
nageoffer:mainfrom
melancholy154:fix/trace-llm-ttft-parent

Conversation

@melancholy154
Copy link
Copy Markdown
Contributor

Summary

  • 修复 llm-first-packet (LLM_TTFT) 节点的 parentNodeId 错误指向 llm-stream-routing,而非具体的 provider 流式节点
  • 修复前端 trace 详情页在故障转移场景下因未映射 ERROR/CANCELLED 状态导致渲染崩溃

Problem

后端:LLM_TTFT 父节点错误

AbstractOpenAIStyleChatClient.doStreamChat() 在 finally 块中调用 span.detach() 弹出 LLM_PROVIDER 节点,但 RoutingLLMService
awaitFirstPacket()@RagTraceNode("llm-first-packet"))在 detach 之后才执行,导致 TTFT 节点的 parentNodeId 错误地指向 llm-stream-routing

实际 trace 树:

  llm-stream-routing
  ├── bailian-stream-chat (LLM_PROVIDER)
  └── llm-first-packet (LLM_TTFT)
image
  期望 trace 树:
  llm-stream-routing
  └── bailian-stream-chat (LLM_PROVIDER)
      └── llm-first-packet (LLM_TTFT)
image image

前端:ERROR/CANCELLED 状态未映射

STATUS_COLORS 只映射了 success/failed/running/default,故障转移时 provider 节点状态为 CANCELLEDERROR,访问时导致页面崩溃。

Fix

后端

  • doStreamChat 不再在 finally 中 detach,改为通过 StreamChatHandle 将 span 携带返回
  • StreamCancellationHandle 新增 default void detach() {} 方法,向后兼容
  • RoutingLLMServiceawaitFirstPacket 之后调 handle.detach(),确保 TTFT 记录时 LLM_PROVIDER 节点仍在栈上
  • 故障转移场景:每次循环 try-finally 保证无论成功失败都 detach,避免影响下一个 provider 的父节点链

前端

  • STATUS_COLORS 补充 error(红色)和 cancelled(灰色)状态映射
  • getStatusColors 增加 ?? STATUS_COLORS.default 兜底

Test Plan

  • 正常对话:验证 llm-first-packet 的 parentNodeId 指向具体 provider 流式节点
  • 故障转移:模拟首包超时触发 provider 切换,验证 fallback 后 trace 树结构正确
  • 前端 trace 详情页:验证 ERROR/CANCELLED 状态节点正常显示,不再崩溃

后端:span.detach() 延迟到 awaitFirstPacket 之后执行,使
llm-first-packet 节点的 parentNodeId 正确指向具体的 provider
流式节点,而非 llm-stream-routing。

前端:STATUS_COLORS 补充 error 和 cancelled 状态映射,防止
故障转移场景下节点渲染崩溃。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant