问题描述
工具调用卡片在 UI 上先显示原始工具名(如 run_command),经过一段工具执行时间后才刷新为正确的 displayName(如 执行命令 /bin/zsh ...)。
根因
Agent 循环中 displayName 的填充和首次 UI 渲染之间存在时序差:
Step 1: requestLLM()
→ LLM 返回 assistantMessage(displayName = nil)
→ evaluatePermissions()(只设 authorizationState,不设 displayName)
→ saveMessage() → 通知广播 → UI 渲染,此时 displayName 为 nil,显示 toolCall.name "run_command"
Step 2: executeAll() ← 耗时操作,可能几秒到几十秒
→ 执行前才填充 displayName
→ 全部执行完毕 saveMessage() → 通知广播 → UI 刷新为正确的 displayName
关键点:displayName 是在 executeAll() 里才设置的(ToolCallExecutor.swift:155-161),但消息在 requestLLM() 返回后就已通过 evaluatePermissions() → saveMessage() 保存并渲染到 UI 了。中间这段工具执行时间,UI 只能用 toolCall.name 兜底显示。
涉及代码
建议修复
在 evaluatePermissions() 阶段同时填充 displayName(该阶段已有 toolName + arguments,足够调用 toolService.displayDescription() 生成描述),这样首次 saveMessage 时 UI 就能直接显示正确的名称。
// evaluatePermissions() 循环内,设置 authorizationState 之后追加:
if calls[i].displayName == nil {
calls[i].displayName = toolService.displayDescription(
toolName: calls[i].name,
argumentsJSON: calls[i].arguments
)
}
问题描述
工具调用卡片在 UI 上先显示原始工具名(如
run_command),经过一段工具执行时间后才刷新为正确的displayName(如执行命令 /bin/zsh ...)。根因
Agent 循环中
displayName的填充和首次 UI 渲染之间存在时序差:关键点:
displayName是在executeAll()里才设置的(ToolCallExecutor.swift:155-161),但消息在requestLLM()返回后就已通过evaluatePermissions()→saveMessage()保存并渲染到 UI 了。中间这段工具执行时间,UI 只能用toolCall.name兜底显示。涉及代码
LumiApp/Core/Services/ToolCallExecutor.swiftevaluatePermissions()— 首次保存前调用,未设置 displayNameexecuteAll()— 工具执行时才设置 displayNameLumiApp/Core/Services/AgentTurnService.swiftrequestLLM()中evaluatePermissions→saveMessage构成了首次 UI 渲染时机建议修复
在
evaluatePermissions()阶段同时填充displayName(该阶段已有toolName+arguments,足够调用toolService.displayDescription()生成描述),这样首次saveMessage时 UI 就能直接显示正确的名称。