1414from gooddata_eval .core .agentic ._catalog import CatalogMetricAlert
1515from gooddata_eval .core .chat .sse_client import ChatClient
1616from gooddata_eval .core .config import ReasoningEffort
17- from gooddata_eval .core .models import AgenticEvalOutcome , ToolCallEvent
17+ from gooddata_eval .core .models import AgenticEvalOutcome , ReasoningStepEvent , ToolCallEvent , build_latency_breakdown
1818
1919try :
2020 from openai import OpenAI as _OpenAI
@@ -345,6 +345,8 @@ class AlertRunResult:
345345 actual_alert_arguments : dict
346346 reasoning_steps : list [str ] = field (default_factory = list )
347347 response_id : str | None = None
348+ tool_call_events : list [ToolCallEvent ] = field (default_factory = list )
349+ reasoning_step_events : list [ReasoningStepEvent ] = field (default_factory = list )
348350
349351
350352@dataclass
@@ -495,6 +497,11 @@ def _run_once(conv_id: str) -> AlertRunResult:
495497 tool_called = False
496498 reasoning_steps : list [str ] = []
497499 response_id : str | None = None
500+ all_tool_call_events : list [ToolCallEvent ] = []
501+ all_reasoning_step_events : list [ReasoningStepEvent ] = []
502+ turn_offset = 0.0 # each turn's call_ts/ts restarts near 0 -- shift by prior turns' wall time
503+ tool_index_offset = 0
504+ reasoning_index_offset = 0
498505 # conversation_history stores prior turns for GPT-4o context.
499506 # Roles follow GPT-4o's perspective: "assistant"=agent text, "user"=sim-user reply.
500507 conversation_history : list = []
@@ -504,6 +511,21 @@ def _run_once(conv_id: str) -> AlertRunResult:
504511 chat_result = client .send_message (conv_id , current_question )
505512 reasoning_steps .extend (chat_result .reasoning_steps or [])
506513 response_id = chat_result .response_id or response_id
514+ for tc in chat_result .tool_call_events or []:
515+ if tc .call_ts is not None :
516+ tc .call_ts += turn_offset
517+ if tc .result_ts is not None :
518+ tc .result_ts += turn_offset
519+ if tc .index is not None :
520+ tc .index += tool_index_offset
521+ for rs in chat_result .reasoning_step_events or []:
522+ rs .ts += turn_offset
523+ rs .index += reasoning_index_offset
524+ all_tool_call_events .extend (chat_result .tool_call_events or [])
525+ all_reasoning_step_events .extend (chat_result .reasoning_step_events or [])
526+ tool_index_offset += len (chat_result .tool_call_events or [])
527+ reasoning_index_offset += len (chat_result .reasoning_step_events or [])
528+ turn_offset += chat_result .turn_wall_clock_sec or 0.0
507529 alert_id , actual_args , tool_called = _extract_alert_call (chat_result .tool_call_events or [])
508530 if tool_called :
509531 alert_id_to_delete = alert_id
@@ -541,6 +563,8 @@ def _run_once(conv_id: str) -> AlertRunResult:
541563 actual_alert_arguments = actual_args ,
542564 reasoning_steps = reasoning_steps ,
543565 response_id = response_id ,
566+ tool_call_events = all_tool_call_events ,
567+ reasoning_step_events = all_reasoning_step_events ,
544568 )
545569 finally :
546570 if alert_id_to_delete :
@@ -717,6 +741,7 @@ def evaluate_agentic_alert_skill(
717741 "metric_correct" : ev .metric_correct ,
718742 "recipients_correct" : ev .recipients_correct ,
719743 "actual_alert_arguments" : best .actual_alert_arguments ,
744+ "latency_breakdown" : build_latency_breakdown (best .tool_call_events , best .reasoning_step_events ),
720745 }
721746 raise exc
722747 best = summary .best
@@ -734,5 +759,6 @@ def evaluate_agentic_alert_skill(
734759 "metric_correct" : ev .metric_correct ,
735760 "recipients_correct" : ev .recipients_correct ,
736761 "actual_alert_arguments" : best .actual_alert_arguments ,
762+ "latency_breakdown" : build_latency_breakdown (best .tool_call_events , best .reasoning_step_events ),
737763 },
738764 )
0 commit comments