setActiveTab("constraints")}>
+
Sampler: {constraints.sampler}
-
setActiveTab("constraints")}>
+
Seed: {constraints.seed === -1 ? "Random" : constraints.seed}
diff --git a/app/frontend/src/components/Settings.jsx b/app/frontend/src/components/Settings.jsx
index c94d98d..1f5de62 100644
--- a/app/frontend/src/components/Settings.jsx
+++ b/app/frontend/src/components/Settings.jsx
@@ -423,10 +423,48 @@ function Settings({
};
const updateTextSetting = (key, value) => {
- setPendingTextSettings((prev) => ({
- ...prev,
- [key]: value
- }));
+ setPendingTextSettings((prev) => {
+ const updated = { ...prev, [key]: value };
+
+ // If the user selected a preset performance profile, apply its hardware parameters
+ if (key === "performanceProfile") {
+ const presets = specs?.recommended_text_settings;
+ if (presets) {
+ let preset = null;
+ if (value === "potato") preset = presets.low;
+ else if (value === "balanced") preset = presets.mid;
+ else if (value === "high") preset = presets.high;
+
+ if (preset) {
+ Object.assign(updated, {
+ contextSize: preset.contextSize,
+ threads: preset.threads,
+ gpuLayers: preset.gpuLayers,
+ cacheTypeK: preset.cacheTypeK,
+ cacheTypeV: preset.cacheTypeV,
+ flashAttn: preset.flashAttn,
+ mlock: preset.mlock,
+ mmap: preset.mmap,
+ cachePrompt: preset.cachePrompt,
+ batchSize: preset.batchSize,
+ ubatchSize: preset.ubatchSize,
+ });
+ }
+ }
+ } else {
+ // If the user manually overrides any performance-related setting, auto-switch profile to "custom"
+ const isPerformanceKey = [
+ "contextSize", "threads", "gpuLayers", "cacheTypeK", "cacheTypeV",
+ "flashAttn", "mlock", "mmap", "cachePrompt", "batchSize", "ubatchSize"
+ ].includes(key);
+
+ if (isPerformanceKey) {
+ updated.performanceProfile = "custom";
+ }
+ }
+
+ return updated;
+ });
};
const updateSpeechSetting = (key, value) => {
@@ -1093,6 +1131,8 @@ function Settings({