1+ from __future__ import annotations
2+
3+ from datetime import datetime
4+ from enum import Enum
5+ from typing import Any
6+
7+ from a2a ._base import A2ABaseModel
8+ from a2a .extensions .base import Extension
9+
10+
11+ class CallTypeEnum (str , Enum ):
12+ """The type of the operation a step represents."""
13+
14+ AGENT = 'AGENT'
15+ TOOL = 'TOOL'
16+
17+
18+ class ToolInvocation (A2ABaseModel ):
19+ """A tool invocation."""
20+
21+ tool_name : str
22+ parameters : dict [str , Any ]
23+
24+
25+ class AgentInvocation (A2ABaseModel ):
26+ """An agent invocation."""
27+
28+ agent_url : str
29+ agent_name : str
30+ requests : dict [str , Any ]
31+ response_trace : ResponseTrace | None = None
32+
33+
34+ class StepAction (A2ABaseModel ):
35+ """The action of a step."""
36+
37+ tool_invocation : ToolInvocation | None = None
38+ agent_invocation : AgentInvocation | None = None
39+
40+
41+ class Step (A2ABaseModel ):
42+ """A single operation within a trace."""
43+
44+ step_id : str
45+ trace_id : str
46+ parent_step_id : str | None = None
47+ call_type : CallTypeEnum
48+ step_action : StepAction
49+ cost : int | None = None
50+ total_tokens : int | None = None
51+ additional_attributes : dict [str , str ] | None = None
52+ latency : int | None = None
53+ start_time : datetime
54+ end_time : datetime
55+
56+
57+ class ResponseTrace (A2ABaseModel ):
58+ """A trace message that contains a collection of spans."""
59+
60+ trace_id : str
61+ steps : list [Step ]
62+
63+
64+ class TraceExtension (Extension ):
65+ """An extension for traceability."""
66+
67+ def on_client_message (self , message : Any ) -> None :
68+ """Appends trace information to the message."""
69+ # This is a placeholder implementation.
70+ if message .metadata is None :
71+ message .metadata = {}
72+ message .metadata ['trace' ] = 'client-trace'
73+
74+ def on_server_message (self , message : Any ) -> None :
75+ """Processes trace information from the message."""
76+ # This is a placeholder implementation.
77+ if hasattr (message , 'metadata' ) and 'trace' in message .metadata :
78+ print (f"Received trace: { message .metadata ['trace' ]} " )
79+
80+
81+ AgentInvocation .model_rebuild ()
0 commit comments