Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/frontend/account/useLanguageModelSetting.tsx
5755 views
1
import { redux, useMemo, useTypedRedux } from "@cocalc/frontend/app-framework";
2
import { getUserDefinedLLM } from "@cocalc/frontend/frame-editors/llm/use-userdefined-llm";
3
import {
4
LLMServicesAvailable,
5
LanguageService,
6
fromCustomOpenAIModel,
7
fromOllamaModel,
8
getValidLanguageModelName,
9
isCustomOpenAI,
10
isOllamaLLM,
11
isUserDefinedModel,
12
unpackUserDefinedLLMModel,
13
} from "@cocalc/util/db-schema/llm-utils";
14
15
export const SETTINGS_LANGUAGE_MODEL_KEY = "language_model";
16
17
// ATTN: it is tempting to use the `useProjectContext` hook here, but it is not possible
18
// The "AI Formula" dialog is outside the project context (unfortunately)
19
export function useLanguageModelSetting(
20
project_id?: string,
21
): [LanguageService, (llm: LanguageService) => void] {
22
const other_settings = useTypedRedux("account", "other_settings");
23
const default_llm = useTypedRedux("customize", "default_llm");
24
const ollama = useTypedRedux("customize", "ollama");
25
const custom_openai = useTypedRedux("customize", "custom_openai");
26
const selectableLLMs = useTypedRedux("customize", "selectable_llms");
27
28
const haveOpenAI = useTypedRedux("customize", "openai_enabled");
29
const haveGoogle = useTypedRedux("customize", "google_vertexai_enabled");
30
const haveOllama = useTypedRedux("customize", "ollama_enabled");
31
const haveCustomOpenAI = useTypedRedux("customize", "custom_openai_enabled");
32
const haveMistral = useTypedRedux("customize", "mistral_enabled");
33
const haveAnthropic = useTypedRedux("customize", "anthropic_enabled");
34
const haveXAI = useTypedRedux("customize", "xai_enabled");
35
36
const enabledLLMs: LLMServicesAvailable = useMemo(() => {
37
const projectsStore = redux.getStore("projects");
38
return projectsStore.whichLLMareEnabled(project_id);
39
}, [
40
haveOpenAI,
41
haveGoogle,
42
haveOllama,
43
haveCustomOpenAI,
44
haveMistral,
45
haveAnthropic,
46
haveXAI,
47
]);
48
49
const llm: LanguageService = useMemo(() => {
50
return getValidLanguageModelName({
51
model: other_settings?.get("language_model") ?? default_llm,
52
filter: enabledLLMs,
53
ollama: Object.keys(ollama?.toJS() ?? {}),
54
custom_openai: Object.keys(custom_openai?.toJS() ?? {}),
55
selectable_llms: selectableLLMs?.toJS() ?? [],
56
});
57
}, [other_settings, custom_openai, ollama, selectableLLMs, enabledLLMs]);
58
59
function setLLM(llm: LanguageService) {
60
setDefaultLLM(llm);
61
}
62
63
return [llm, setLLM];
64
}
65
66
// This changes the account's default LLM
67
export function setDefaultLLM(llm: LanguageService) {
68
const customizeStore = redux.getStore("customize");
69
const selectableLLMs = customizeStore.get("selectable_llms");
70
const ollama = customizeStore.get("ollama");
71
const custom_openai = customizeStore.get("custom_openai");
72
73
if (selectableLLMs.includes(llm as any)) {
74
redux
75
.getActions("account")
76
.set_other_settings(SETTINGS_LANGUAGE_MODEL_KEY, llm);
77
} else if (isOllamaLLM(llm) && ollama?.get(fromOllamaModel(llm))) {
78
// check if LLM is a key in the Ollama TypedMap
79
redux
80
.getActions("account")
81
.set_other_settings(SETTINGS_LANGUAGE_MODEL_KEY, llm);
82
} else if (
83
isCustomOpenAI(llm) &&
84
custom_openai?.get(fromCustomOpenAIModel(llm))
85
) {
86
redux
87
.getActions("account")
88
.set_other_settings(SETTINGS_LANGUAGE_MODEL_KEY, llm);
89
} else if (isUserDefinedModel(llm) && userDefinedLLMExists(llm)) {
90
redux
91
.getActions("account")
92
.set_other_settings(SETTINGS_LANGUAGE_MODEL_KEY, llm);
93
} else {
94
console.warn(`setDefaultLLM: LLM "${llm}" is unknown.`);
95
}
96
}
97
98
function userDefinedLLMExists(model: string): boolean {
99
const user_llm = getUserDefinedLLM();
100
const um = unpackUserDefinedLLMModel(model);
101
if (um == null) return false;
102
return user_llm.some((m) => m.service === um.service && m.model === um.model);
103
}
104
105