This commit is contained in:
2026-04-23 14:48:07 -06:00
parent f74575277a
commit 431e667c5e
9 changed files with 505 additions and 228 deletions
+68
View File
@@ -1,14 +1,38 @@
export const COURSEWARE_RUNTIME_CONFIG_PATH = "/courseware-runtime.json";
export const LAB1_DEFAULT_NETRON_URL = "http://127.0.0.1:8338";
export const LAB2_DEFAULT_OLLAMA_URL = "http://127.0.0.1:11434";
export const LAB2_DEFAULT_OLLAMA_MODELS = [
{
label: "Gemma 4 E2B Q2",
value: "cajina/gemma4_e2b-q2_k_xl:v01",
},
{
label: "Gemma 4 E2B Q4",
value: "batiai/gemma4-e2b:q4",
},
{
label: "Gemma 4 E2B Q8",
value: "bjoernb/gemma4-e2b-fast:latest",
},
] as const;
export const LAB3_DEFAULT_TERMINAL_PATH = "/wetty";
export type CoursewareRuntimeModelOption = {
label: string;
value: string;
};
export type CoursewareRuntimeConfig = {
lab1NetronUrl?: string;
lab2OllamaModels?: CoursewareRuntimeModelOption[];
lab2OllamaUrl?: string;
lab3TerminalUrl?: string;
};
export type ResolvedCoursewareRuntimeConfig = {
lab1NetronUrl: string;
lab2OllamaModels: CoursewareRuntimeModelOption[];
lab2OllamaUrl: string;
lab3TerminalUrl: string;
};
@@ -50,6 +74,48 @@ export function getLab1NetronUrl(
return rewriteLoopbackHost(trimmedValue, currentHostname);
}
export function getLab2OllamaUrl(
envValue?: string,
currentHostname = getCurrentHostname(),
) {
const trimmedValue = envValue?.trim();
if (!trimmedValue) {
return rewriteLoopbackHost(LAB2_DEFAULT_OLLAMA_URL, currentHostname);
}
return rewriteLoopbackHost(trimmedValue, currentHostname);
}
export function getLab2OllamaModels(
envValue?: CoursewareRuntimeModelOption[],
) {
if (!Array.isArray(envValue) || envValue.length === 0) {
return LAB2_DEFAULT_OLLAMA_MODELS.map((model) => ({ ...model }));
}
const normalizedModels = envValue
.map((model) => {
const label = model?.label?.trim();
const value = model?.value?.trim();
if (!label || !value) {
return null;
}
return { label, value } satisfies CoursewareRuntimeModelOption;
})
.filter(
(model): model is CoursewareRuntimeModelOption => model !== null,
);
if (normalizedModels.length === 0) {
return LAB2_DEFAULT_OLLAMA_MODELS.map((model) => ({ ...model }));
}
return normalizedModels;
}
export function getLab3TerminalPath(
envValue?: string,
currentHostname = getCurrentHostname(),
@@ -73,6 +139,8 @@ export function normalizeCoursewareRuntimeConfig(
): ResolvedCoursewareRuntimeConfig {
return {
lab1NetronUrl: getLab1NetronUrl(config?.lab1NetronUrl, currentHostname),
lab2OllamaModels: getLab2OllamaModels(config?.lab2OllamaModels),
lab2OllamaUrl: getLab2OllamaUrl(config?.lab2OllamaUrl, currentHostname),
lab3TerminalUrl: getLab3TerminalPath(
config?.lab3TerminalUrl,
currentHostname,