WIP: profiling

This commit is contained in:
2026-03-07 14:02:03 -05:00
parent d71d82bafb
commit fcff00f750
5 changed files with 208 additions and 141 deletions

View File

@@ -167,8 +167,7 @@ class AppController:
"Tier 3": {"input": 0, "output": 0, "provider": "gemini", "model": "gemini-2.5-flash-lite"},
"Tier 4": {"input": 0, "output": 0, "provider": "gemini", "model": "gemini-2.5-flash-lite"},
}
self.perf_monitor: performance_monitor.PerformanceMonitor = performance_monitor.get_monitor()
self._perf_profiling_enabled: bool = False
self.perf_monitor: performance_monitor.PerformanceMonitor = performance_monitor.PerformanceMonitor()
self._pending_gui_tasks: List[Dict[str, Any]] = []
self._api_event_queue: List[Dict[str, Any]] = []
# Pending dialogs state moved from App
@@ -327,8 +326,20 @@ class AppController:
'_inject_preview': '_inject_preview',
'_show_inject_modal': '_show_inject_modal'
})
self.perf_monitor = performance_monitor.get_monitor()
self._perf_profiling_enabled = False
self._init_actions()
@property
def perf_profiling_enabled(self) -> bool:
return self._perf_profiling_enabled
@perf_profiling_enabled.setter
def perf_profiling_enabled(self, value: bool) -> None:
self._perf_profiling_enabled = value
if hasattr(self, 'perf_monitor'):
self.perf_monitor.enabled = value
def _update_inject_preview(self) -> None:
"""Updates the preview content based on the selected file and injection mode."""
if not self._inject_file_path:
@@ -355,15 +366,6 @@ class AppController:
except Exception as e:
self._inject_preview = f"Error reading file: {e}"
@property
def perf_profiling_enabled(self) -> bool:
return self._perf_profiling_enabled
@perf_profiling_enabled.setter
def perf_profiling_enabled(self, value: bool) -> None:
self._perf_profiling_enabled = value
self.perf_monitor.enabled = value
@property
def thinking_indicator(self) -> bool:
return self.ai_status in ("sending...", "streaming...")
@@ -425,7 +427,9 @@ class AppController:
})
def _process_pending_gui_tasks(self) -> None:
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.start_component("controller._process_pending_gui_tasks")
if not self._pending_gui_tasks:
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.end_component("controller._process_pending_gui_tasks")
return
sys.stderr.write(f"[DEBUG] _process_pending_gui_tasks: processing {len(self._pending_gui_tasks)} tasks\n")
sys.stderr.flush()
@@ -435,11 +439,6 @@ class AppController:
for task in tasks:
try:
action = task.get("action")
sys.stderr.write(f"[DEBUG] Processing GUI task: action={action}\n")
sys.stderr.flush()
if action:
session_logger.log_api_hook("PROCESS_TASK", action, str(task))
# ...
if action == "refresh_api_metrics":
self._refresh_api_metrics(task.get("payload", {}), md_content=self.last_md or None)
elif action == "set_ai_status":
@@ -921,7 +920,6 @@ class AppController:
def _run_event_loop(self):
"""Internal loop runner."""
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.start_component("_run_event_loop")
def queue_fallback() -> None:
while True:
@@ -935,7 +933,6 @@ class AppController:
fallback_thread = threading.Thread(target=queue_fallback, daemon=True)
fallback_thread.start()
self._process_event_queue()
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.end_component("_run_event_loop")
def _process_event_queue(self) -> None:
"""Listens for and processes events from the SyncEventQueue."""
@@ -944,9 +941,11 @@ class AppController:
while True:
event_name, payload = self.event_queue.get()
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.start_component("controller._process_event")
sys.stderr.write(f"[DEBUG] _process_event_queue got event: {event_name} with payload: {str(payload)[:100]}\n")
sys.stderr.flush()
if event_name == "shutdown":
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.end_component("controller._process_event")
break
if event_name == "user_request":
threading.Thread(target=self._handle_request_event, args=(payload,), daemon=True).start()
@@ -992,10 +991,10 @@ class AppController:
"action": "ticket_completed",
"payload": payload
})
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.end_component("controller._process_event")
def _handle_request_event(self, event: events.UserRequestEvent) -> None:
"""Processes a UserRequestEvent by calling the AI client."""
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.start_component("_handle_request_event")
ai_client.set_current_tier(None) # Ensure main discussion is untagged
if self.ui_auto_add_history:
with self._pending_history_adds_lock:
@@ -1038,7 +1037,6 @@ class AppController:
sys.stderr.write(f"[DEBUG] _handle_request_event ERROR: {e}\n{traceback.format_exc()}\n")
sys.stderr.flush()
self.event_queue.put("response", {"text": f"ERROR: {e}", "status": "error", "role": "System"})
if getattr(self, 'perf_profiling_enabled', False): self.perf_monitor.end_component("_handle_request_event")
def _on_ai_stream(self, text: str) -> None:
"""Handles streaming text from the AI."""
@@ -1102,8 +1100,8 @@ class AppController:
def _on_api_event(self, event_name: str = "generic_event", **kwargs: Any) -> None:
payload = kwargs.get("payload", {})
with self._pending_gui_tasks_lock:
self._pending_gui_tasks.append({"action": "refresh_api_metrics", "payload": payload})
# Push to background event queue for processing, NOT GUI queue
self.event_queue.put("refresh_api_metrics", payload)
if self.test_hooks_enabled:
with self._api_event_queue_lock:
self._api_event_queue.append({"type": event_name, "payload": payload})
@@ -1850,7 +1848,6 @@ class AppController:
self._update_cached_stats()
def _update_cached_stats(self) -> None:
import ai_client
self._cached_cache_stats = ai_client.get_gemini_cache_stats()
self._cached_tool_stats = dict(self._tool_stats)