WebberUI

AI Tool Call Card

呈現 AI 工具呼叫的狀態卡,於執行中/成功/失敗之間平滑過渡,可展開查看參數與結果。

載入預覽⋯

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

1240
<AiToolCallCard />

安裝

npx shadcn@latest add https://webberui.com/r/ai-tool-call-card.json

或在 components.json 設定 registries 後,改用 @webberui/ai-tool-call-card 安裝。

安裝依賴後,從 registry JSON(/r/ai-tool-call-card.jsonfiles[0].content)複製 ai-tool-call-card.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion lucide-react clsx tailwind-merge

使用

import { AiToolCallCard } from "@/components/ui/ai-tool-call-card";

<AiToolCallCard
  name="search_web"
  status="running"
  description="搜尋文件庫以回答使用者問題"
  args={{ query: "webber ui motion", top_k: 5 }}
/>;

status 由你的 agent 執行流程驅動,值變更時卡片會自動過渡:圓形指示器的圖示彈入、狀態文字上下翻轉、外框顏色平滑染色。

狀態轉換

status 綁到工具呼叫的實際生命週期即可,元件負責所有過場動畫:

const [status, setStatus] = useState<ToolCallStatus>("pending");

async function call() {
  setStatus("running");
  try {
    const result = await runTool();
    setStatus("success");
  } catch {
    setStatus("error");
  }
}

進入 error 時,非受控模式會自動展開以露出錯誤訊息。

展開參數與結果

提供 args 時卡片可展開;result(成功時)與 error(失敗時)分別顯示在對應段落。展開狀態支援受控與非受控雙模式:

<AiToolCallCard
  name="run_sql"
  status="success"
  args={{ table: "orders", limit: 100 }}
  result={<pre>{JSON.stringify(rows, null, 2)}</pre>}
  expanded={open}
  onExpandedChange={setOpen}
/>

Props

Prop型別預設值說明
namestring工具(函式)名稱,以等寬字顯示
status"pending" | "running" | "success" | "error"目前狀態;變更時觸發過場動畫
labelstringstatus覆寫右側狀態文字
descriptionstring名稱下方的一行副標
argsRecord<string, unknown>呼叫參數,以 key/value 等寬清單顯示
resultReact.ReactNode成功時顯示於「結果」段落
errorReact.ReactNode失敗時顯示於「錯誤」段落
elapsedMsnumber耗時(毫秒),於狀態文字旁格式化顯示
expandedboolean受控展開狀態
defaultExpandedbooleanfalse非受控模式的初始展開狀態
onExpandedChange(expanded: boolean) => void展開狀態變更時的回呼

細節

  • 圓形指示器以 AnimatePresencestatus 切換圖示:舊圖示縮退、新圖示以 spring 彈入
  • 狀態文字使用翻轉窗(overflow 遮罩),舊值上翻出、新值自下方翻入
  • 外框與指示器底色以 transition-colors 平滑染色(var(--wb-duration-normal,300ms)
  • 執行中時底線出現不定量的亮帶掃動,代表工具仍在運作
  • 展開區以 height: auto 過渡開闔,內容淡入

可及性

  • 卡片內含 role="status"aria-live="polite" 純文字,狀態變更時朗讀「名稱:狀態」
  • 所有動畫節點皆 aria-hidden,不重複朗讀
  • 可展開時,標題列為 <button>,帶 aria-expanded / aria-controls,支援鍵盤操作與 focus ring
  • 使用者開啟「減少動態效果」時:指示器停止旋轉、翻轉改為淡入淡出、進度帶隱藏、展開改為即時切換,DOM 結構維持一致(掛載後才切換,避免 hydration 不一致)

On this page