1313from datetime import UTC , datetime
1414from typing import TYPE_CHECKING
1515
16- from fastapi import APIRouter , HTTPException , UploadFile
16+ from fastapi import APIRouter , Depends , HTTPException , UploadFile
1717from fastapi import File as FastAPIFile
1818from fastapi .responses import StreamingResponse
1919from pydantic import BaseModel
2020
2121from agentevals import __version__
2222
2323from ..utils .log_buffer import log_buffer
24+ from .dependencies import get_trace_manager , require_trace_manager
2425from .models import DebugLoadData , SessionInfo , StandardResponse , WSSessionCompleteEvent , WSSessionStartedEvent
2526
2627if TYPE_CHECKING :
3031
3132debug_router = APIRouter ()
3233
33- _trace_manager : StreamingTraceManager | None = None
34-
35-
36- def set_trace_manager (manager : StreamingTraceManager ) -> None :
37- global _trace_manager
38- _trace_manager = manager
39-
4034
4135class FrontendDiagnostics (BaseModel ):
4236 user_description : str = ""
@@ -83,12 +77,12 @@ def _collect_environment() -> dict:
8377 }
8478
8579
86- def _collect_sessions () -> list [dict ]:
87- if not _trace_manager :
80+ def _collect_sessions (manager : StreamingTraceManager | None ) -> list [dict ]:
81+ if not manager :
8882 return []
8983
9084 sessions_data = []
91- for session in _trace_manager .sessions .values ():
85+ for session in manager .sessions .values ():
9286 sessions_data .append (
9387 {
9488 "session_id" : session .session_id ,
@@ -128,7 +122,10 @@ def _collect_temp_files(session_ids: set[str] | None = None) -> dict[str, str]:
128122
129123
130124@debug_router .post ("/bundle" )
131- async def create_debug_bundle (diagnostics : FrontendDiagnostics ):
125+ async def create_debug_bundle (
126+ diagnostics : FrontendDiagnostics ,
127+ manager : StreamingTraceManager | None = Depends (get_trace_manager ),
128+ ):
132129 timestamp = datetime .now (tz = UTC ).strftime ("%Y%m%d-%H%M%S" )
133130 prefix = f"bug-report-{ timestamp } "
134131
@@ -142,7 +139,7 @@ async def create_debug_bundle(diagnostics: FrontendDiagnostics):
142139 }
143140 zf .writestr (f"{ prefix } /metadata.json" , json .dumps (metadata , indent = 2 ))
144141
145- sessions = _collect_sessions ()
142+ sessions = _collect_sessions (manager )
146143 for s in sessions :
147144 sid = s ["session_id" ]
148145 zf .writestr (
@@ -188,13 +185,10 @@ async def create_debug_bundle(diagnostics: FrontendDiagnostics):
188185
189186
190187@debug_router .post ("/load" , response_model = StandardResponse [DebugLoadData ])
191- async def load_debug_bundle (file : UploadFile = FastAPIFile (...)):
192- if not _trace_manager :
193- raise HTTPException (
194- status_code = 400 ,
195- detail = "Live mode is not enabled. Start with: agentevals serve --dev" ,
196- )
197-
188+ async def load_debug_bundle (
189+ file : UploadFile = FastAPIFile (...),
190+ manager : StreamingTraceManager = Depends (require_trace_manager ),
191+ ):
198192 content = await file .read ()
199193 try :
200194 zf = zipfile .ZipFile (io .BytesIO (content ))
@@ -236,9 +230,9 @@ async def load_debug_bundle(file: UploadFile = FastAPIFile(...)):
236230 metadata = meta .get ("metadata" , {}),
237231 )
238232
239- _trace_manager .sessions [session .session_id ] = session
233+ manager .sessions [session .session_id ] = session
240234
241- await _trace_manager .broadcast_to_ui (
235+ await manager .broadcast_to_ui (
242236 WSSessionStartedEvent (
243237 session = SessionInfo (
244238 session_id = session .session_id ,
@@ -252,10 +246,10 @@ async def load_debug_bundle(file: UploadFile = FastAPIFile(...)):
252246 ).model_dump (by_alias = True )
253247 )
254248
255- invocations_data = await _trace_manager ._extract_invocations (session )
256- await _trace_manager ._save_spans_to_temp_file (session )
249+ invocations_data = await manager ._extract_invocations (session )
250+ await manager ._save_spans_to_temp_file (session )
257251
258- await _trace_manager .broadcast_to_ui (
252+ await manager .broadcast_to_ui (
259253 WSSessionCompleteEvent (
260254 session_id = session .session_id ,
261255 invocations = invocations_data ,
0 commit comments