Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/frontend/components/language-model-icon.tsx
6023 views
1
import { CSS, useTypedRedux } from "@cocalc/frontend/app-framework";
2
import {
3
LLMServiceName,
4
LanguageModel,
5
SERVICES,
6
fromCustomOpenAIModel,
7
fromOllamaModel,
8
fromUserDefinedLLMModel,
9
isGoogleModel,
10
isLanguageModel,
11
isUserDefinedModel,
12
model2vendor,
13
} from "@cocalc/util/db-schema/llm-utils";
14
import { unreachable } from "@cocalc/util/misc";
15
import AIAvatar from "./ai-avatar";
16
import AnthropicAvatar from "./anthropic-avatar";
17
import GoogleGeminiLogo from "./google-gemini-avatar";
18
import GooglePalmLogo from "./google-palm-avatar";
19
import MistralAvatar from "./mistral-avatar";
20
import OllamaAvatar from "./ollama-avatar";
21
import OpenAIAvatar from "./openai-avatar";
22
import XAIAvatar from "./xai-avatar";
23
24
export function LanguageModelVendorAvatar(
25
props: Readonly<{
26
model?: LanguageModel;
27
size?: number;
28
style?: CSS;
29
}>,
30
) {
31
const { model, size = 20 } = props;
32
33
const ollama = useTypedRedux("customize", "ollama");
34
const custom_openai = useTypedRedux("customize", "custom_openai");
35
36
const style: CSS = {
37
marginRight: "5px",
38
...props.style,
39
} as const;
40
41
function fallback() {
42
return <AIAvatar size={size} style={style} />;
43
}
44
45
if (model == null) {
46
return fallback();
47
}
48
49
function renderImgIcon(icon: string) {
50
return (
51
<img
52
width={size}
53
height={size}
54
src={icon}
55
style={{ display: "inline-block", ...style }}
56
/>
57
);
58
}
59
60
function renderModel(model: string, vendor?: LLMServiceName) {
61
const useIcon = vendor == null;
62
const vendorName = vendor ?? model2vendor(model).name;
63
switch (vendorName) {
64
case "openai":
65
return <OpenAIAvatar size={size} style={style} />;
66
67
case "custom_openai": {
68
const icon = custom_openai?.getIn([
69
fromCustomOpenAIModel(model),
70
"icon",
71
]);
72
if (useIcon && typeof icon === "string") {
73
return renderImgIcon(icon);
74
} else {
75
return <OpenAIAvatar size={size} style={style} />;
76
}
77
}
78
79
case "google": {
80
if (model === "chat-bison-001") {
81
// Palm2, no longer supported, just for backwards compatibility
82
return <GooglePalmLogo size={size} style={style} />;
83
} else if (!useIcon || isGoogleModel(model)) {
84
return <GoogleGeminiLogo size={size} style={style} />;
85
} else {
86
return fallback();
87
}
88
}
89
90
case "mistralai":
91
return <MistralAvatar size={size} style={style} />;
92
93
case "ollama": {
94
const icon = ollama?.getIn([fromOllamaModel(model), "icon"]);
95
if (useIcon && typeof icon === "string") {
96
return renderImgIcon(icon);
97
} else {
98
return <OllamaAvatar size={size} style={style} />;
99
}
100
}
101
102
case "anthropic":
103
return <AnthropicAvatar size={size} style={style} />;
104
105
case "xai":
106
return <XAIAvatar size={size} style={style} />;
107
108
case "user":
109
// should never happen, because it is unpacked below
110
return fallback();
111
112
default:
113
unreachable(vendorName);
114
return fallback();
115
}
116
}
117
118
if (isUserDefinedModel(model)) {
119
const udm = fromUserDefinedLLMModel(model);
120
if (!udm) {
121
return fallback();
122
} else {
123
// TODO: support a customizable icon for user defined LLMs
124
for (const vendor of SERVICES) {
125
if (udm.startsWith(`${vendor}-`)) {
126
return renderModel(udm, vendor);
127
}
128
}
129
}
130
} else if (isLanguageModel(model)) {
131
return renderModel(model);
132
}
133
134
return fallback();
135
}
136
137