nico-martin's picture
nico-martin HF Staff
small improvements
b2847f1
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>
);
}