3737 RunConfig ,
3838 RunContextWrapper ,
3939 RunHooks ,
40+ Runner ,
4041 set_tracing_disabled ,
4142 trace ,
4243)
4546from agents .run_internal .run_loop import ComputerAction , ToolRunComputerAction
4647from agents .tool import ComputerToolSafetyCheckData
4748
49+ from .fake_model import FakeModel
50+ from .test_responses import get_text_message
4851from .testing_processor import SPAN_PROCESSOR_TESTING
4952
5053
@@ -61,6 +64,19 @@ def _get_function_span(tool_name: str) -> dict[str, Any]:
6164 raise AssertionError (f"Function span for tool '{ tool_name } ' not found" )
6265
6366
67+ def _get_agent_span (agent_name : str ) -> dict [str , Any ]:
68+ for span in SPAN_PROCESSOR_TESTING .get_ordered_spans (including_empty = True ):
69+ exported = span .export ()
70+ if not exported :
71+ continue
72+ span_data = exported .get ("span_data" )
73+ if not isinstance (span_data , dict ):
74+ continue
75+ if span_data .get ("type" ) == "agent" and span_data .get ("name" ) == agent_name :
76+ return exported
77+ raise AssertionError (f"Agent span for '{ agent_name } ' not found" )
78+
79+
6480class LoggingComputer (Computer ):
6581 """A `Computer` implementation that logs calls to its methods for verification in tests."""
6682
@@ -403,13 +419,49 @@ async def test_execute_emits_function_span() -> None:
403419 )
404420
405421 assert isinstance (result , ToolCallOutputItem )
406- assert ComputerAction .TRACE_TOOL_NAME == "computer_use_preview "
422+ assert ComputerAction .TRACE_TOOL_NAME == "computer "
407423 function_span = _get_function_span (ComputerAction .TRACE_TOOL_NAME )
408424 span_data = cast (dict [str , Any ], function_span ["span_data" ])
409425 assert span_data .get ("input" ) is not None
410426 assert cast (str , span_data .get ("output" , "" )).startswith ("data:image/png;base64," )
411427
412428
429+ @pytest .mark .asyncio
430+ async def test_runner_trace_lists_ga_computer_tool_name () -> None :
431+ SPAN_PROCESSOR_TESTING .clear ()
432+
433+ computer = LoggingComputer (screenshot_return = "trace_img" )
434+ tool_call = ResponseComputerToolCall (
435+ id = "tool_trace_agent_tools" ,
436+ type = "computer_call" ,
437+ action = ActionScreenshot (type = "screenshot" ),
438+ call_id = "tool_trace_agent_tools" ,
439+ pending_safety_checks = [],
440+ status = "completed" ,
441+ )
442+ model = FakeModel (tracing_enabled = True )
443+ model .add_multiple_turn_outputs (
444+ [
445+ [tool_call ],
446+ [get_text_message ("done" )],
447+ ]
448+ )
449+ agent = Agent (
450+ name = "test_agent_trace_tools" ,
451+ model = model ,
452+ tools = [ComputerTool (computer = computer )],
453+ )
454+
455+ set_tracing_disabled (False )
456+ with trace ("computer-agent-span-test" ):
457+ result = await Runner .run (agent , input = "take a screenshot" )
458+
459+ assert result .final_output == "done"
460+ agent_span = _get_agent_span (agent .name )
461+ span_data = cast (dict [str , Any ], agent_span ["span_data" ])
462+ assert span_data ["tools" ] == ["computer" ]
463+
464+
413465@pytest .mark .asyncio
414466async def test_execute_emits_batched_actions_in_function_span () -> None :
415467 computer = LoggingComputer (screenshot_return = "trace_img" )
0 commit comments