refactor(gui): redesign ai settings layout and fix model fetching sync

This commit is contained in:
2026-03-11 00:18:45 -04:00
parent 747b810fe1
commit 3870bf086c
2 changed files with 42 additions and 27 deletions

View File

@@ -883,6 +883,8 @@ class AppController:
self.persona_manager = PersonaManager(Path(self.active_project_path).parent if self.active_project_path else None) self.persona_manager = PersonaManager(Path(self.active_project_path).parent if self.active_project_path else None)
self.personas = self.persona_manager.load_all() self.personas = self.persona_manager.load_all()
self._fetch_models(self.current_provider)
self.ui_active_tool_preset = os.environ.get('SLOP_TOOL_PRESET') or ai_cfg.get("active_tool_preset") self.ui_active_tool_preset = os.environ.get('SLOP_TOOL_PRESET') or ai_cfg.get("active_tool_preset")
self.ui_active_bias_profile = ai_cfg.get("active_bias_profile") self.ui_active_bias_profile = ai_cfg.get("active_bias_profile")
ai_client.set_tool_preset(self.ui_active_tool_preset) ai_client.set_tool_preset(self.ui_active_tool_preset)
@@ -1496,6 +1498,9 @@ class AppController:
self._current_provider = value self._current_provider = value
ai_client.reset_session() ai_client.reset_session()
ai_client.set_provider(value, self.current_model) ai_client.set_provider(value, self.current_model)
self.available_models = self.all_available_models.get(value, [])
if not self.available_models:
self._fetch_models(value)
self._token_stats = {} self._token_stats = {}
self._token_stats_dirty = True self._token_stats_dirty = True

View File

@@ -451,12 +451,12 @@ class App:
exp, opened = imgui.begin("AI Settings", self.show_windows["AI Settings"]) exp, opened = imgui.begin("AI Settings", self.show_windows["AI Settings"])
self.show_windows["AI Settings"] = bool(opened) self.show_windows["AI Settings"] = bool(opened)
if exp: if exp:
self._render_persona_selector_panel()
if imgui.collapsing_header("Provider & Model"): if imgui.collapsing_header("Provider & Model"):
self._render_provider_panel() self._render_provider_panel()
if imgui.collapsing_header("System Prompts"): if imgui.collapsing_header("System Prompts"):
self._render_system_prompts_panel() self._render_system_prompts_panel()
self._render_agent_tools_panel() self._render_agent_tools_panel()
self._render_cache_panel()
imgui.end() imgui.end()
if self.ui_separate_usage_analytics and self.show_windows.get("Usage Analytics", False): if self.ui_separate_usage_analytics and self.show_windows.get("Usage Analytics", False):
@@ -2250,8 +2250,8 @@ def hello():
self._scroll_disc_to_bottom = False self._scroll_disc_to_bottom = False
imgui.end_child() imgui.end_child()
def _render_provider_panel(self) -> None: def _render_persona_selector_panel(self) -> None:
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_provider_panel") if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_persona_selector_panel")
imgui.text("Persona") imgui.text("Persona")
if not hasattr(self, 'ui_active_persona'): if not hasattr(self, 'ui_active_persona'):
self.ui_active_persona = "" self.ui_active_persona = ""
@@ -2265,24 +2265,29 @@ def hello():
if pname in personas: if pname in personas:
persona = personas[pname] persona = personas[pname]
self._editing_persona_name = persona.name self._editing_persona_name = persona.name
self._editing_persona_provider = persona.provider or ""
self._editing_persona_model = persona.model or ""
self._editing_persona_system_prompt = persona.system_prompt or "" self._editing_persona_system_prompt = persona.system_prompt or ""
self._editing_persona_temperature = persona.temperature or 0.7
self._editing_persona_max_tokens = persona.max_output_tokens or 4096
self._editing_persona_tool_preset_id = persona.tool_preset or "" self._editing_persona_tool_preset_id = persona.tool_preset or ""
self._editing_persona_bias_profile_id = persona.bias_profile or "" self._editing_persona_bias_profile_id = persona.bias_profile or ""
import json import copy
self._editing_persona_preferred_models = json.dumps(persona.preferred_models) if persona.preferred_models else "[]" self._editing_persona_preferred_models_list = copy.deepcopy(persona.preferred_models) if persona.preferred_models else []
self._editing_persona_is_new = False self._editing_persona_is_new = False
if persona.provider and persona.provider in self.controller.PROVIDERS:
self.current_provider = persona.provider # Apply persona to current state immediately
if persona.model: if persona.preferred_models and len(persona.preferred_models) > 0:
self.current_model = persona.model first_model = persona.preferred_models[0]
if persona.temperature is not None: if first_model.get("provider"):
ai_client.temperature = persona.temperature self.current_provider = first_model.get("provider")
if persona.max_output_tokens: if first_model.get("model"):
ai_client.max_output_tokens = persona.max_output_tokens self.current_model = first_model.get("model")
if first_model.get("temperature") is not None:
ai_client.temperature = first_model.get("temperature")
self.temperature = first_model.get("temperature")
if first_model.get("max_output_tokens"):
ai_client.max_output_tokens = first_model.get("max_output_tokens")
self.max_tokens = first_model.get("max_output_tokens")
if first_model.get("history_trunc_limit"):
self.history_trunc_limit = first_model.get("history_trunc_limit")
if persona.system_prompt: if persona.system_prompt:
self.ui_project_system_prompt = persona.system_prompt self.ui_project_system_prompt = persona.system_prompt
if persona.tool_preset: if persona.tool_preset:
@@ -2298,29 +2303,32 @@ def hello():
if self.ui_active_persona and self.ui_active_persona in personas: if self.ui_active_persona and self.ui_active_persona in personas:
persona = personas[self.ui_active_persona] persona = personas[self.ui_active_persona]
self._editing_persona_name = persona.name self._editing_persona_name = persona.name
self._editing_persona_provider = persona.provider or ""
self._editing_persona_model = persona.model or ""
self._editing_persona_system_prompt = persona.system_prompt or "" self._editing_persona_system_prompt = persona.system_prompt or ""
self._editing_persona_temperature = persona.temperature if persona.temperature is not None else 0.7
self._editing_persona_max_tokens = persona.max_output_tokens if persona.max_output_tokens is not None else 4096
self._editing_persona_tool_preset_id = persona.tool_preset or "" self._editing_persona_tool_preset_id = persona.tool_preset or ""
self._editing_persona_bias_profile_id = persona.bias_profile or "" self._editing_persona_bias_profile_id = persona.bias_profile or ""
self._editing_persona_preferred_models_list = list(persona.preferred_models) if persona.preferred_models else [] import copy
self._editing_persona_preferred_models_list = copy.deepcopy(persona.preferred_models) if persona.preferred_models else []
self._editing_persona_scope = self.controller.persona_manager.get_persona_scope(persona.name) self._editing_persona_scope = self.controller.persona_manager.get_persona_scope(persona.name)
self._editing_persona_is_new = False self._editing_persona_is_new = False
else: else:
self._editing_persona_name = "" self._editing_persona_name = ""
self._editing_persona_provider = self.current_provider
self._editing_persona_model = self.current_model
self._editing_persona_system_prompt = "" self._editing_persona_system_prompt = ""
self._editing_persona_temperature = 0.7
self._editing_persona_max_tokens = 4096
self._editing_persona_tool_preset_id = "" self._editing_persona_tool_preset_id = ""
self._editing_persona_bias_profile_id = "" self._editing_persona_bias_profile_id = ""
self._editing_persona_preferred_models_list = [] self._editing_persona_preferred_models_list = [{
"provider": self.current_provider,
"model": self.current_model,
"temperature": getattr(self, "temperature", 0.7),
"max_output_tokens": getattr(self, "max_tokens", 4096),
"history_trunc_limit": getattr(self, "history_trunc_limit", 900000)
}]
self._editing_persona_scope = "project" self._editing_persona_scope = "project"
self._editing_persona_is_new = True self._editing_persona_is_new = True
imgui.separator() imgui.separator()
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_persona_selector_panel")
def _render_provider_panel(self) -> None:
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_provider_panel")
imgui.text("Provider") imgui.text("Provider")
if imgui.begin_combo("##prov", self.current_provider): if imgui.begin_combo("##prov", self.current_provider):
for p in PROVIDERS: for p in PROVIDERS:
@@ -2565,6 +2573,8 @@ def hello():
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_usage_analytics_panel") if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_usage_analytics_panel")
self._render_token_budget_panel() self._render_token_budget_panel()
imgui.separator() imgui.separator()
self._render_cache_panel()
imgui.separator()
self._render_tool_analytics_panel() self._render_tool_analytics_panel()
imgui.separator() imgui.separator()
self._render_session_insights_panel() self._render_session_insights_panel()