diff --git a/surfsense_web/components/assistant-ui/assistant-message.tsx b/surfsense_web/components/assistant-ui/assistant-message.tsx index 7a357dc85..4f3dd7c00 100644 --- a/surfsense_web/components/assistant-ui/assistant-message.tsx +++ b/surfsense_web/components/assistant-ui/assistant-message.tsx @@ -23,6 +23,10 @@ import dynamic from "next/dynamic"; import type { FC } from "react"; import { useEffect, useMemo, useRef, useState } from "react"; import { commentsEnabledAtom, targetCommentIdAtom } from "@/atoms/chat/current-thread.atom"; +import { + globalNewLLMConfigsAtom, + newLLMConfigsAtom, +} from "@/atoms/new-llm-config/new-llm-config-query.atoms"; import { activeSearchSpaceIdAtom } from "@/atoms/search-spaces/search-space-query.atoms"; import { CitationMetadataProvider, @@ -47,6 +51,7 @@ import { useComments } from "@/hooks/use-comments"; import { useMediaQuery } from "@/hooks/use-media-query"; import { useElectronAPI } from "@/hooks/use-platform"; import { useTokenUsage } from "@/components/assistant-ui/token-usage-context"; +import { getProviderIcon } from "@/lib/provider-icons"; import { cn } from "@/lib/utils"; // Captured once at module load — survives client-side navigations that strip the query param. @@ -386,6 +391,26 @@ const MessageInfoDropdown: FC = () => { const createdAt = useAuiState(({ message }) => message?.createdAt); const usage = useTokenUsage(messageId); + const { data: localConfigs } = useAtomValue(newLLMConfigsAtom); + const { data: globalConfigs } = useAtomValue(globalNewLLMConfigsAtom); + + const configByModel = useMemo(() => { + const map = new Map(); + for (const c of [...(globalConfigs ?? []), ...(localConfigs ?? [])]) { + map.set(c.model_name, { name: c.name, provider: c.provider }); + } + return map; + }, [localConfigs, globalConfigs]); + + const resolveModel = (modelKey: string) => { + const parts = modelKey.split("/"); + const bare = parts[parts.length - 1] ?? modelKey; + const config = configByModel.get(modelKey) ?? configByModel.get(bare); + return config + ? { name: config.name, icon: getProviderIcon(config.provider, { className: "size-3.5" }) } + : { name: modelKey, icon: null }; + }; + const modelBreakdown = usage ? (usage.usage ?? usage.model_breakdown) : undefined; const models = modelBreakdown ? Object.entries(modelBreakdown) : []; const hasUsage = usage && usage.total_tokens > 0; @@ -411,14 +436,20 @@ const MessageInfoDropdown: FC = () => { <> {models.length > 0 ? ( - models.map(([model, counts]) => ( - e.preventDefault()}> - {model} - - {counts.total_tokens.toLocaleString()} tokens - - - )) + models.map(([model, counts]) => { + const { name, icon } = resolveModel(model); + return ( + e.preventDefault()}> + + {icon} + {name} + + + {counts.total_tokens.toLocaleString()} tokens + + + ); + }) ) : ( e.preventDefault()}>