import logging from fastapi import APIRouter from aworld.trace.server import get_trace_server from aworld.trace.constants import RunType from aworld.trace.server.util import build_trace_tree logger = logging.getLogger(__name__) router = APIRouter() prefix = "/api/trace" @router.get("/list") async def list_traces(): storage = get_trace_server().get_storage() trace_data = [] for trace_id in storage.get_all_traces(): spans = storage.get_all_spans(trace_id) spans_sorted = sorted(spans, key=lambda x: x.start_time) trace_tree = build_trace_tree(spans_sorted) trace_data.append({ 'trace_id': trace_id, 'root_span': trace_tree, }) return { "data": trace_data } @router.get("/agent") async def get_agent_trace(trace_id: str): storage = get_trace_server().get_storage() spans = storage.get_all_spans(trace_id) spans_dict = {span.span_id: span.dict() for span in spans} filtered_spans = {} for span_id, span in spans_dict.items(): if span.get('is_event', False) and span.get('run_type') == RunType.AGNET.value: span['show_name'] = _get_agent_show_name(span) filtered_spans[span_id] = span for span in list(filtered_spans.values()): parent_id = span['parent_id'] if span['parent_id'] else None while parent_id and parent_id not in filtered_spans: parent_span = spans_dict.get(parent_id) parent_id = parent_span['parent_id'] if parent_span and parent_span['parent_id'] else None if parent_id: parent_span = filtered_spans.get(parent_id) if not parent_span: continue if 'children' not in parent_span: parent_span['children'] = [] parent_span['children'].append(span) root_spans = [span for span in filtered_spans.values() if span['parent_id'] is None or span['parent_id'] not in filtered_spans] return { "data": root_spans } def _get_agent_show_name(span: dict): agent_name_prefix = "agent_event_" name = span.get("name") if name and name.startswith(agent_name_prefix): name = name[len(agent_name_prefix):] return name