import { useStreamContext } from "@/providers/Stream"; import { Checkpoint, Message } from "@langchain/langgraph-sdk"; import { getContentString } from "../utils"; import { BranchSwitcher, CommandBar } from "./shared"; import { MarkdownText } from "../markdown-text"; import { LoadExternalComponent } from "@langchain/langgraph-sdk/react-ui"; import { cn } from "@/lib/utils"; import { ToolCalls, ToolResult } from "./tool-calls"; import { StringParam, useQueryParam } from "use-query-params"; function CustomComponent({ message, thread, }: { message: Message; thread: ReturnType; }) { const [apiUrl] = useQueryParam("apiUrl", StringParam); const meta = thread.getMessagesMetadata(message); const seenState = meta?.firstSeenState; const customComponent = seenState?.values.ui ?.slice() .reverse() .find( ({ additional_kwargs }) => additional_kwargs.run_id === seenState.metadata?.run_id, ); if (!customComponent) { return null; } return (
{customComponent && ( )}
); } export function AssistantMessage({ message, isLoading, handleRegenerate, }: { message: Message; isLoading: boolean; handleRegenerate: (parentCheckpoint: Checkpoint | null | undefined) => void; }) { const contentString = getContentString(message.content); const thread = useStreamContext(); const meta = thread.getMessagesMetadata(message); const parentCheckpoint = meta?.firstSeenState?.parent_checkpoint; const hasToolCalls = "tool_calls" in message && message.tool_calls && message.tool_calls.length > 0; const isToolResult = message.type === "tool"; return (
{isToolResult ? ( ) : (
{contentString.length > 0 && (
{contentString}
)} {hasToolCalls && }
thread.setBranch(branch)} isLoading={isLoading} /> handleRegenerate(parentCheckpoint)} />
)}
); } export function AssistantMessageLoading() { return (
); }