| import { formatDuration } from "@utils/format.ts"; |
| import { Timer, Wrench } from "lucide-react"; |
| import { useState } from "react"; |
|
|
| import type { ChatMessageAssistantTool } from "../textGeneration/types.ts"; |
| import { Loader } from "../theme"; |
| import cn from "../utils/classnames.ts"; |
|
|
| export default function MessageToolCall({ |
| tool, |
| className = "", |
| }: { |
| tool: ChatMessageAssistantTool; |
| className?: string; |
| }) { |
| const [expanded, setExpanded] = useState<boolean>(false); |
|
|
| const isLoading = tool.result === ""; |
|
|
| return ( |
| <div |
| className={cn( |
| className, |
| "rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800" |
| )} |
| > |
| <div className="flex items-center justify-between gap-3"> |
| <button |
| className="flex w-full cursor-pointer items-center justify-between gap-2 text-xs text-gray-700 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100" |
| onClick={() => setExpanded(!expanded)} |
| > |
| <span className="flex items-center gap-2"> |
| {isLoading ? <Loader size="xs" /> : <Wrench className="h-3 w-3" />} |
| {isLoading ? "calling tool" : "called tool"} <b>{tool.name}</b> |
| </span> |
| <span className="flex items-center gap-1 opacity-60"> |
| <Timer className="h-3 w-3" /> |
| {formatDuration(tool.time)} |
| </span> |
| </button> |
| </div> |
| {expanded && ( |
| <div className="mt-2 space-y-2"> |
| <div> |
| <div className="mb-1 text-xs text-gray-600 dark:text-gray-400"> |
| Function: |
| </div> |
| <code className="block overflow-hidden rounded bg-white p-2 font-mono text-xs text-blue-600 dark:bg-gray-900 dark:text-blue-400"> |
| {tool.functionSignature} |
| </code> |
| </div> |
| <div> |
| <div className="mb-1 text-xs text-gray-600 dark:text-gray-400"> |
| Result: |
| </div> |
| <div className="overflow-hidden rounded bg-white p-2 text-sm whitespace-pre-wrap text-gray-900 dark:bg-gray-900 dark:text-gray-100"> |
| {tool.result || "loading.."} |
| </div> |
| </div> |
| </div> |
| )} |
| </div> |
| ); |
| } |
|
|