docs(conductor): Synchronize docs for track 'GUI Performance Profiling & Optimization'
This commit is contained in:
45
src/gui_2.py
45
src/gui_2.py
@@ -149,6 +149,7 @@ class App:
|
||||
def current_provider(self, value: str) -> None:
|
||||
self.controller.current_provider = value
|
||||
|
||||
@property
|
||||
@property
|
||||
def current_model(self) -> str:
|
||||
return self.controller.current_model
|
||||
@@ -156,9 +157,14 @@ class App:
|
||||
@current_model.setter
|
||||
def current_model(self, value: str) -> None:
|
||||
self.controller.current_model = value
|
||||
# ---------------------------------------------------------------- project loading
|
||||
# ---------------------------------------------------------------- logic
|
||||
|
||||
@property
|
||||
def perf_profiling_enabled(self) -> bool:
|
||||
return self.controller.perf_profiling_enabled
|
||||
|
||||
@perf_profiling_enabled.setter
|
||||
def perf_profiling_enabled(self, value: bool) -> None:
|
||||
self.controller.perf_profiling_enabled = value
|
||||
def shutdown(self) -> None:
|
||||
"""Cleanly shuts down the app's background tasks and saves state."""
|
||||
try:
|
||||
@@ -863,6 +869,7 @@ class App:
|
||||
traceback.print_exc()
|
||||
|
||||
def _render_projects_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_projects_panel")
|
||||
proj_name = self.project.get("project", {}).get("name", Path(self.active_project_path).stem)
|
||||
imgui.text_colored(C_IN, f"Active: {proj_name}")
|
||||
imgui.separator()
|
||||
@@ -949,6 +956,7 @@ class App:
|
||||
ch, val = imgui.checkbox(f"Enable {t_name}", val)
|
||||
if ch:
|
||||
self.ui_agent_tools[t_name] = val
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_projects_panel")
|
||||
|
||||
def _render_track_proposal_modal(self) -> None:
|
||||
if self._show_track_proposal_modal:
|
||||
@@ -1143,6 +1151,7 @@ class App:
|
||||
imgui.end()
|
||||
|
||||
def _render_files_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_files_panel")
|
||||
imgui.text("Paths")
|
||||
imgui.same_line()
|
||||
imgui.text("| Base Dir:")
|
||||
@@ -1203,8 +1212,10 @@ class App:
|
||||
d = filedialog.askdirectory()
|
||||
r.destroy()
|
||||
if d: self.files.append(models.FileItem(path=str(Path(d) / "**" / "*")))
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_files_panel")
|
||||
|
||||
def _render_screenshots_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_screenshots_panel")
|
||||
imgui.text("Paths")
|
||||
imgui.same_line()
|
||||
imgui.text("| Base Dir:")
|
||||
@@ -1235,6 +1246,7 @@ class App:
|
||||
r.destroy()
|
||||
for p in paths:
|
||||
if p not in self.screenshots: self.screenshots.append(p)
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_screenshots_panel")
|
||||
|
||||
def _render_discussion_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_discussion_panel")
|
||||
@@ -1447,6 +1459,7 @@ class App:
|
||||
imgui.end_child()
|
||||
|
||||
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:
|
||||
@@ -1489,8 +1502,10 @@ class App:
|
||||
if ch:
|
||||
if hasattr(ai_client, "_gemini_cli_adapter") and ai_client._gemini_cli_adapter:
|
||||
ai_client._gemini_cli_adapter.binary_path = self.ui_gemini_cli_path
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_provider_panel")
|
||||
|
||||
def _render_token_budget_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_token_budget_panel")
|
||||
imgui.text("Session Telemetry")
|
||||
usage = self.session_usage
|
||||
total = usage["input_tokens"] + usage["output_tokens"]
|
||||
@@ -1511,6 +1526,7 @@ class App:
|
||||
stats = self._token_stats
|
||||
if not stats:
|
||||
imgui.text_disabled("Token stats unavailable")
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_token_budget_panel")
|
||||
return
|
||||
pct = stats.get("utilization_pct", 0.0)
|
||||
current = stats.get("estimated_prompt_tokens", stats.get("total_tokens", 0))
|
||||
@@ -1590,15 +1606,20 @@ class App:
|
||||
imgui.text_colored(C_LBL, f"Gemini Cache: ACTIVE | Age: {age:.0f}s / {ttl}s | Renews at: {ttl * 0.9:.0f}s")
|
||||
else:
|
||||
imgui.text_disabled("Gemini Cache: INACTIVE")
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_token_budget_panel")
|
||||
|
||||
def _render_cache_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_cache_panel")
|
||||
if self.current_provider != "gemini":
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_cache_panel")
|
||||
return
|
||||
if not imgui.collapsing_header("Cache Analytics"):
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_cache_panel")
|
||||
return
|
||||
stats = getattr(self.controller, '_cached_cache_stats', {})
|
||||
if not stats.get("cache_exists"):
|
||||
imgui.text_disabled("No active cache")
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_cache_panel")
|
||||
return
|
||||
age_sec = stats.get("cache_age_seconds", 0)
|
||||
ttl_remaining = stats.get("ttl_remaining", 0)
|
||||
@@ -1621,9 +1642,12 @@ class App:
|
||||
self._cache_cleared_timestamp = time.time()
|
||||
if hasattr(self, '_cache_cleared_timestamp') and time.time() - self._cache_cleared_timestamp < 5:
|
||||
imgui.text_colored(imgui.ImVec4(0.2, 1.0, 0.2, 1.0), "Cache cleared - will rebuild on next request")
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_cache_panel")
|
||||
|
||||
def _render_tool_analytics_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_tool_analytics_panel")
|
||||
if not imgui.collapsing_header("Tool Usage Analytics"):
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_tool_analytics_panel")
|
||||
return
|
||||
now = time.time()
|
||||
if not hasattr(self, '_tool_stats_cache_time') or now - self._tool_stats_cache_time > 1.0:
|
||||
@@ -1631,6 +1655,7 @@ class App:
|
||||
tool_stats = getattr(self.controller, '_cached_tool_stats', {})
|
||||
if not tool_stats:
|
||||
imgui.text_disabled("No tool usage data")
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_tool_analytics_panel")
|
||||
return
|
||||
if imgui.begin_table("tool_stats", 4, imgui.TableFlags_.borders | imgui.TableFlags_.sortable):
|
||||
imgui.table_setup_column("Tool")
|
||||
@@ -1658,9 +1683,12 @@ class App:
|
||||
else:
|
||||
imgui.text("0%")
|
||||
imgui.end_table()
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_tool_analytics_panel")
|
||||
|
||||
def _render_session_insights_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_session_insights_panel")
|
||||
if not imgui.collapsing_header("Session Insights"):
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_session_insights_panel")
|
||||
return
|
||||
insights = self.controller.get_session_insights()
|
||||
imgui.text(f"Total Tokens: {insights.get('total_tokens', 0):,}")
|
||||
@@ -1671,8 +1699,10 @@ class App:
|
||||
efficiency = insights.get('efficiency', 0)
|
||||
imgui.text(f"Completed: {completed}")
|
||||
imgui.text(f"Tokens/Ticket: {efficiency:.0f}" if efficiency > 0 else "Tokens/Ticket: N/A")
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_session_insights_panel")
|
||||
|
||||
def _render_message_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_message_panel")
|
||||
# LIVE indicator
|
||||
is_live = self.ai_status in ["running powershell...", "fetching url...", "searching web...", "powershell done, awaiting AI..."]
|
||||
if is_live:
|
||||
@@ -1707,8 +1737,10 @@ class App:
|
||||
if imgui.button("-> History"):
|
||||
if self.ui_ai_input:
|
||||
self.disc_entries.append({"role": "User", "content": self.ui_ai_input, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_message_panel")
|
||||
|
||||
def _render_response_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_response_panel")
|
||||
if self._trigger_blink:
|
||||
self._trigger_blink = False
|
||||
self._is_blinking = True
|
||||
@@ -1740,8 +1772,10 @@ class App:
|
||||
self.disc_entries.append({"role": "AI", "content": self.ai_response, "collapsed": True, "ts": project_manager.now_ts()})
|
||||
if is_blinking:
|
||||
imgui.pop_style_color(2)
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_response_panel")
|
||||
|
||||
def _render_comms_history_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_comms_history_panel")
|
||||
imgui.text_colored(vec4(200, 220, 160), f"Status: {self.ai_status}")
|
||||
imgui.same_line()
|
||||
if imgui.button("Clear##comms"):
|
||||
@@ -1844,8 +1878,10 @@ class App:
|
||||
imgui.end_child()
|
||||
if self.is_viewing_prior_session:
|
||||
imgui.pop_style_color()
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_comms_history_panel")
|
||||
|
||||
def _render_tool_calls_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_tool_calls_panel")
|
||||
imgui.text("Tool call history")
|
||||
imgui.same_line()
|
||||
if imgui.button("Clear##tc"):
|
||||
@@ -1900,6 +1936,7 @@ class App:
|
||||
if self._scroll_tool_calls_to_bottom:
|
||||
imgui.set_scroll_here_y(1.0)
|
||||
self._scroll_tool_calls_to_bottom = False
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_tool_calls_panel")
|
||||
|
||||
def _render_mma_dashboard(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_mma_dashboard")
|
||||
@@ -2302,6 +2339,7 @@ class App:
|
||||
self._push_mma_state_update()
|
||||
|
||||
def _render_tier_stream_panel(self, tier_key: str, stream_key: str | None) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_tier_stream_panel")
|
||||
if stream_key is not None:
|
||||
content = self.mma_streams.get(stream_key, "")
|
||||
imgui.begin_child(f"##stream_content_{tier_key}", imgui.ImVec2(-1, -1))
|
||||
@@ -2339,6 +2377,7 @@ class App:
|
||||
except (TypeError, AttributeError):
|
||||
pass
|
||||
imgui.end_child()
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_tier_stream_panel")
|
||||
|
||||
def _render_system_prompts_panel(self) -> None:
|
||||
imgui.text("Global System Prompt (all projects)")
|
||||
@@ -2348,6 +2387,7 @@ class App:
|
||||
ch, self.ui_project_system_prompt = imgui.input_text_multiline("##psp", self.ui_project_system_prompt, imgui.ImVec2(-1, 100))
|
||||
|
||||
def _render_theme_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_theme_panel")
|
||||
exp, opened = imgui.begin("Theme", self.show_windows["Theme"])
|
||||
self.show_windows["Theme"] = bool(opened)
|
||||
if exp:
|
||||
@@ -2394,6 +2434,7 @@ class App:
|
||||
ch, scale = imgui.slider_float("##scale", theme.get_current_scale(), 0.5, 3.0, "%.2f")
|
||||
if ch: theme.set_scale(scale)
|
||||
imgui.end()
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_theme_panel")
|
||||
|
||||
def _load_fonts(self) -> None:
|
||||
font_path, font_size = theme.get_font_loading_params()
|
||||
|
||||
Reference in New Issue
Block a user