diff --git a/src/app_controller.py b/src/app_controller.py index b4ad96e..d7de131 100644 --- a/src/app_controller.py +++ b/src/app_controller.py @@ -883,6 +883,8 @@ class AppController: 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._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_bias_profile = ai_cfg.get("active_bias_profile") ai_client.set_tool_preset(self.ui_active_tool_preset) @@ -1496,6 +1498,9 @@ class AppController: self._current_provider = value ai_client.reset_session() 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_dirty = True diff --git a/src/gui_2.py b/src/gui_2.py index cc1e51f..6793184 100644 --- a/src/gui_2.py +++ b/src/gui_2.py @@ -451,12 +451,12 @@ class App: exp, opened = imgui.begin("AI Settings", self.show_windows["AI Settings"]) self.show_windows["AI Settings"] = bool(opened) if exp: + self._render_persona_selector_panel() if imgui.collapsing_header("Provider & Model"): self._render_provider_panel() if imgui.collapsing_header("System Prompts"): self._render_system_prompts_panel() self._render_agent_tools_panel() - self._render_cache_panel() imgui.end() 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 imgui.end_child() - def _render_provider_panel(self) -> None: - if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_provider_panel") + def _render_persona_selector_panel(self) -> None: + if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_persona_selector_panel") imgui.text("Persona") if not hasattr(self, 'ui_active_persona'): self.ui_active_persona = "" @@ -2265,24 +2265,29 @@ def hello(): if pname in personas: persona = personas[pname] 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_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_bias_profile_id = persona.bias_profile or "" - import json - self._editing_persona_preferred_models = json.dumps(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_is_new = False - if persona.provider and persona.provider in self.controller.PROVIDERS: - self.current_provider = persona.provider - if persona.model: - self.current_model = persona.model - if persona.temperature is not None: - ai_client.temperature = persona.temperature - if persona.max_output_tokens: - ai_client.max_output_tokens = persona.max_output_tokens + + # Apply persona to current state immediately + if persona.preferred_models and len(persona.preferred_models) > 0: + first_model = persona.preferred_models[0] + if first_model.get("provider"): + self.current_provider = first_model.get("provider") + if first_model.get("model"): + 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: self.ui_project_system_prompt = persona.system_prompt if persona.tool_preset: @@ -2298,29 +2303,32 @@ def hello(): if self.ui_active_persona and self.ui_active_persona in personas: persona = personas[self.ui_active_persona] 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_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_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_is_new = False else: 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_temperature = 0.7 - self._editing_persona_max_tokens = 4096 self._editing_persona_tool_preset_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_is_new = True 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") if imgui.begin_combo("##prov", self.current_provider): for p in PROVIDERS: @@ -2565,6 +2573,8 @@ def hello(): if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_usage_analytics_panel") self._render_token_budget_panel() imgui.separator() + self._render_cache_panel() + imgui.separator() self._render_tool_analytics_panel() imgui.separator() self._render_session_insights_panel()