-
{section} configuration lands in R7.4c.
-
- Needs a native GGUF file picker that doesn't exist yet in graphlink_desktop.py.
+
+
+
+
+ Current Active GGUF: {state.llamaCppChatModelPath ? basename(state.llamaCppChatModelPath) : "No model selected"}
+
+
+
+
+
+
{state.llamaCppScanSummary}
+
+
+
+ {state.llamaCppScannedModels.length > 0 && (
+
+ )}
+
+
+ Chat Model File
+ {state.llamaCppChatModelPath || "No file selected"}
+
+
+
+ {state.llamaCppScannedModels.length > 0 && (
+
+ )}
+
+
+ Chat Naming File (optional)
+ {state.llamaCppTitleModelPath || "Reusing the main chat model"}
+
+
+
+
+
+
transport.intent("app-settings", "setLlamaCppNCtx", [n])}
+ />
+ transport.intent("app-settings", "setLlamaCppNGpuLayers", [n])}
+ />
+ transport.intent("app-settings", "setLlamaCppNThreads", [n])}
+ />
+
+ {state.llamaCppNotice && (
+
+ {state.llamaCppNotice}
+
+ )}
+
+
+
+
);
}
@@ -646,8 +912,8 @@ export function SettingsDialog({ transport }: { transport: WsTransport }) {
) : activeSection === "Ollama (Local)" ? (
- ) : DEFERRED_SECTIONS.has(activeSection) ? (
-
+ ) : activeSection === "Llama.cpp (Local)" ? (
+
) : (
activeSection
)}
diff --git a/web_ui/src/lib/bridge-core/generated/app-settings-state.schema.json b/web_ui/src/lib/bridge-core/generated/app-settings-state.schema.json
index f3b4b66..b24af7b 100644
--- a/web_ui/src/lib/bridge-core/generated/app-settings-state.schema.json
+++ b/web_ui/src/lib/bridge-core/generated/app-settings-state.schema.json
@@ -81,6 +81,42 @@
"githubTokenConfigured": {
"type": "boolean"
},
+ "llamaCppChatFormat": {
+ "type": "string"
+ },
+ "llamaCppChatModelPath": {
+ "type": "string"
+ },
+ "llamaCppNCtx": {
+ "type": "integer"
+ },
+ "llamaCppNGpuLayers": {
+ "type": "integer"
+ },
+ "llamaCppNThreads": {
+ "type": "integer"
+ },
+ "llamaCppNotice": {
+ "type": "string"
+ },
+ "llamaCppReasoningMode": {
+ "type": "string"
+ },
+ "llamaCppScanStatus": {
+ "type": "string"
+ },
+ "llamaCppScanSummary": {
+ "type": "string"
+ },
+ "llamaCppScannedModels": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "llamaCppTitleModelPath": {
+ "type": "string"
+ },
"minCompatibleSchemaVersion": {
"type": "integer"
},
@@ -162,7 +198,18 @@
"ollamaScanSummary",
"ollamaScanStatus",
"ollamaPullStatus",
- "ollamaNotice"
+ "ollamaNotice",
+ "llamaCppReasoningMode",
+ "llamaCppChatModelPath",
+ "llamaCppTitleModelPath",
+ "llamaCppChatFormat",
+ "llamaCppNCtx",
+ "llamaCppNGpuLayers",
+ "llamaCppNThreads",
+ "llamaCppScannedModels",
+ "llamaCppScanSummary",
+ "llamaCppScanStatus",
+ "llamaCppNotice"
],
"title": "AppSettingsState",
"type": "object"
diff --git a/web_ui/src/lib/bridge-core/generated/app-settings-state.ts b/web_ui/src/lib/bridge-core/generated/app-settings-state.ts
index ed03be1..ddc0ef5 100644
--- a/web_ui/src/lib/bridge-core/generated/app-settings-state.ts
+++ b/web_ui/src/lib/bridge-core/generated/app-settings-state.ts
@@ -37,6 +37,17 @@ export interface AppSettingsState {
ollamaScanStatus: string;
ollamaPullStatus: string;
ollamaNotice: string;
+ llamaCppReasoningMode: string;
+ llamaCppChatModelPath: string;
+ llamaCppTitleModelPath: string;
+ llamaCppChatFormat: string;
+ llamaCppNCtx: number;
+ llamaCppNGpuLayers: number;
+ llamaCppNThreads: number;
+ llamaCppScannedModels: string[];
+ llamaCppScanSummary: string;
+ llamaCppScanStatus: string;
+ llamaCppNotice: string;
minCompatibleSchemaVersion?: number | null;
}
@@ -225,6 +236,62 @@ function checkAppSettingsState(value: unknown, path: string, errors: string[]):
if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.ollamaNotice: missing required field`);
else { if (typeof fieldValue !== "string") errors.push(`${path}.ollamaNotice` + ": expected string"); }
}
+ {
+ const fieldValue = value["llamaCppReasoningMode"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppReasoningMode: missing required field`);
+ else { if (typeof fieldValue !== "string") errors.push(`${path}.llamaCppReasoningMode` + ": expected string"); }
+ }
+ {
+ const fieldValue = value["llamaCppChatModelPath"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppChatModelPath: missing required field`);
+ else { if (typeof fieldValue !== "string") errors.push(`${path}.llamaCppChatModelPath` + ": expected string"); }
+ }
+ {
+ const fieldValue = value["llamaCppTitleModelPath"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppTitleModelPath: missing required field`);
+ else { if (typeof fieldValue !== "string") errors.push(`${path}.llamaCppTitleModelPath` + ": expected string"); }
+ }
+ {
+ const fieldValue = value["llamaCppChatFormat"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppChatFormat: missing required field`);
+ else { if (typeof fieldValue !== "string") errors.push(`${path}.llamaCppChatFormat` + ": expected string"); }
+ }
+ {
+ const fieldValue = value["llamaCppNCtx"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppNCtx: missing required field`);
+ else { if (typeof fieldValue !== "number") errors.push(`${path}.llamaCppNCtx` + ": expected number"); }
+ }
+ {
+ const fieldValue = value["llamaCppNGpuLayers"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppNGpuLayers: missing required field`);
+ else { if (typeof fieldValue !== "number") errors.push(`${path}.llamaCppNGpuLayers` + ": expected number"); }
+ }
+ {
+ const fieldValue = value["llamaCppNThreads"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppNThreads: missing required field`);
+ else { if (typeof fieldValue !== "number") errors.push(`${path}.llamaCppNThreads` + ": expected number"); }
+ }
+ {
+ const fieldValue = value["llamaCppScannedModels"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppScannedModels: missing required field`);
+ else { if (!Array.isArray(fieldValue)) errors.push(`${path}.llamaCppScannedModels` + ": expected array");
+ else (fieldValue as unknown[]).forEach((item, i) => { if (typeof item !== "string") errors.push(`${path}.llamaCppScannedModels` + `[${i}]` + ": expected string"); }); }
+ }
+ {
+ const fieldValue = value["llamaCppScanSummary"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppScanSummary: missing required field`);
+ else { if (typeof fieldValue !== "string") errors.push(`${path}.llamaCppScanSummary` + ": expected string"); }
+ }
+ {
+ const fieldValue = value["llamaCppScanStatus"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppScanStatus: missing required field`);
+ else { if (typeof fieldValue !== "string") errors.push(`${path}.llamaCppScanStatus` + ": expected string"); }
+ }
+ {
+ const fieldValue = value["llamaCppNotice"];
+ if (fieldValue === undefined || fieldValue === null) errors.push(`${path}.llamaCppNotice: missing required field`);
+ else { if (typeof fieldValue !== "string") errors.push(`${path}.llamaCppNotice` + ": expected string"); }
+ }
{
const fieldValue = value["minCompatibleSchemaVersion"];
if (fieldValue !== undefined && fieldValue !== null) { if (typeof fieldValue !== "number") errors.push(`${path}.minCompatibleSchemaVersion` + ": expected number"); }