sourcebot/packages/web/src/features/chat/components/chatBox/modelProviderLogo.tsx

102 lines
2.9 KiB
TypeScript
Raw Normal View History

'use client';
import { useMemo } from "react";
import { LanguageModelProvider } from "../../types";
import { cn } from "@/lib/utils";
import Image from "next/image";
import anthropicLogo from "@/public/anthropic.svg";
2025-07-23 23:53:43 +00:00
import azureAiLogo from "@/public/azureai.svg";
import bedrockLogo from "@/public/bedrock.svg";
import geminiLogo from "@/public/gemini.svg";
import openaiLogo from "@/public/openai.svg";
2025-07-23 23:53:43 +00:00
import deepseekLogo from "@/public/deepseek.svg";
import mistralLogo from "@/public/mistral.svg";
import openrouterLogo from "@/public/openrouter.svg";
import xaiLogo from "@/public/xai.svg";
import { Box, LucideIcon } from "lucide-react";
interface ModelProviderLogoProps {
provider: LanguageModelProvider;
className?: string;
}
export const ModelProviderLogo = ({
provider,
className,
}: ModelProviderLogoProps) => {
const { src, Icon, className: logoClassName } = useMemo((): { src?: string, Icon?: LucideIcon, className?: string } => {
switch (provider) {
case 'amazon-bedrock':
return {
src: bedrockLogo,
className: 'dark:invert'
};
case 'anthropic':
return {
src: anthropicLogo,
className: 'dark:invert'
};
2025-07-23 23:53:43 +00:00
case 'azure':
return {
src: azureAiLogo,
};
case 'deepseek':
return {
src: deepseekLogo,
};
case 'openai':
return {
src: openaiLogo,
className: 'dark:invert'
};
case 'google-generative-ai':
case 'google-vertex':
return {
src: geminiLogo,
};
case 'google-vertex-anthropic':
return {
src: anthropicLogo,
className: 'dark:invert'
};
2025-07-23 23:53:43 +00:00
case 'mistral':
return {
src: mistralLogo,
};
case 'openrouter':
return {
src: openrouterLogo,
className: 'dark:invert'
2025-07-23 23:53:43 +00:00
};
case 'xai':
return {
src: xaiLogo,
className: 'dark:invert'
};
case 'openai-compatible':
return {
Icon: Box,
className: 'text-muted-foreground'
2025-07-23 23:53:43 +00:00
};
}
}, [provider]);
return src ? (
<Image
src={src}
alt={provider}
className={cn(
'w-3.5 h-3.5',
logoClassName,
className
)}
/>
) : Icon ? (
<Icon className={cn(
'w-3.5 h-3.5',
logoClassName,
className
)} />
) : null;
}