Skip to content

工具调用 UI 先显示原始工具名,延迟后才切换为 displayName #116

Description

@nookery

问题描述

工具调用卡片在 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 兜底显示。

涉及代码

  • LumiApp/Core/Services/ToolCallExecutor.swift

    • evaluatePermissions() — 首次保存前调用,未设置 displayName
    • executeAll() — 工具执行时才设置 displayName
  • LumiApp/Core/Services/AgentTurnService.swift

    • requestLLM()evaluatePermissionssaveMessage 构成了首次 UI 渲染时机

建议修复

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
    )
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions