sourcebot/packages/web/src/features/chat/components/chatBox/modelProviderLogo.tsx
Brendan Kellam 65d3cd9dc6
feat(ask_sb): OpenAI compatible language models (#424)
* wip

* docs + add option for api key

* feedback

* nit
2025-08-04 17:25:54 -07:00

101 lines
2.9 KiB
TypeScript

'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";
import azureAiLogo from "@/public/azureai.svg";
import bedrockLogo from "@/public/bedrock.svg";
import geminiLogo from "@/public/gemini.svg";
import openaiLogo from "@/public/openai.svg";
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'
};
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'
};
case 'mistral':
return {
src: mistralLogo,
};
case 'openrouter':
return {
src: openrouterLogo,
className: 'dark:invert'
};
case 'xai':
return {
src: xaiLogo,
className: 'dark:invert'
};
case 'openai-compatible':
return {
Icon: Box,
className: 'text-muted-foreground'
};
}
}, [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;
}