"use client"; import { makeAssistantToolUI } from "@assistant-ui/react"; import { z } from "zod"; import { ExternalLinkIcon, Loader2Icon } from "lucide-react"; const LinkPreviewArgsSchema = z.object({ url: z.string(), }).passthrough(); const LinkPreviewResultSchema = z.object({ url: z.string().optional(), title: z.string().optional(), description: z.string().optional(), image: z.string().optional(), favicon: z.string().optional(), error: z.string().optional(), }).passthrough(); type LinkPreviewArgs = z.infer; type LinkPreviewResult = z.infer; export const LinkPreviewToolUI = makeAssistantToolUI({ toolName: "link_preview", render: ({ args, result, status }) => { const isLoading = status.type === "running"; const url = result?.url ?? args?.url; if (isLoading) { return (
Loading preview...
); } if (result?.error || !url) return null; return ( {result?.favicon && ( )}

{result?.title ?? url}

{result?.description && (

{result.description}

)}

{url}

); }, });