From 098499b510f26b728def88adb61655711a3895db Mon Sep 17 00:00:00 2001 From: Johann Schleier-Smith Date: Wed, 9 Jul 2025 14:58:23 -0700 Subject: [PATCH 1/6] improve tracing for openai agents --- openai_agents/run_customer_service_client.py | 2 +- openai_agents/run_worker.py | 4 +++ .../workflows/agents_as_tools_workflow.py | 4 ++- .../workflows/hello_world_workflow.py | 17 +++++++----- .../research_agents/research_manager.py | 2 +- openai_agents/workflows/tools_workflow.py | 27 ++++++++++--------- 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/openai_agents/run_customer_service_client.py b/openai_agents/run_customer_service_client.py index c4277dc4..bcb55077 100644 --- a/openai_agents/run_customer_service_client.py +++ b/openai_agents/run_customer_service_client.py @@ -39,7 +39,7 @@ async def main(): CustomerServiceWorkflow.get_chat_history, reject_condition=QueryRejectCondition.NOT_OPEN, ) - except WorkflowQueryRejectedError as e: + except WorkflowQueryRejectedError: start = True except RPCError as e: if e.status == RPCStatusCode.NOT_FOUND: diff --git a/openai_agents/run_worker.py b/openai_agents/run_worker.py index 365db097..13061461 100644 --- a/openai_agents/run_worker.py +++ b/openai_agents/run_worker.py @@ -9,6 +9,9 @@ from temporalio.contrib.openai_agents.temporal_openai_agents import ( set_open_ai_agent_temporal_overrides, ) +from temporalio.contrib.openai_agents.trace_interceptor import ( + OpenAIAgentsTracingInterceptor, +) from temporalio.contrib.pydantic import pydantic_data_converter from temporalio.worker import Worker @@ -47,6 +50,7 @@ async def main(): model_activity.invoke_model_activity, get_weather, ], + interceptors=[OpenAIAgentsTracingInterceptor()], ) await worker.run() diff --git a/openai_agents/workflows/agents_as_tools_workflow.py b/openai_agents/workflows/agents_as_tools_workflow.py index 76a68ea4..e19c0472 100644 --- a/openai_agents/workflows/agents_as_tools_workflow.py +++ b/openai_agents/workflows/agents_as_tools_workflow.py @@ -1,3 +1,4 @@ +from agents import gen_trace_id from temporalio import workflow with workflow.unsafe.imports_passed_through(): @@ -68,7 +69,8 @@ async def run(self, msg: str) -> str: config = RunConfig() # Run the entire orchestration in a single trace - with trace("Orchestrator evaluator"): + trace_id = gen_trace_id() + with trace("Orchestrator evaluator", trace_id=trace_id): orchestrator = orchestrator_agent() synthesizer = synthesizer_agent() diff --git a/openai_agents/workflows/hello_world_workflow.py b/openai_agents/workflows/hello_world_workflow.py index aff1478e..6f9ce46d 100644 --- a/openai_agents/workflows/hello_world_workflow.py +++ b/openai_agents/workflows/hello_world_workflow.py @@ -1,18 +1,21 @@ +from agents import gen_trace_id from temporalio import workflow # Import agent Agent and Runner with workflow.unsafe.imports_passed_through(): - from agents import Agent, Runner + from agents import Agent, Runner, trace @workflow.defn class HelloWorldAgent: @workflow.run async def run(self, prompt: str) -> str: - agent = Agent( - name="Assistant", - instructions="You only respond in haikus.", - ) + trace_id = gen_trace_id() + with trace("Hello World", trace_id=trace_id): + agent = Agent( + name="Assistant", + instructions="You only respond in haikus.", + ) - result = await Runner.run(agent, input=prompt) - return result.final_output + result = await Runner.run(agent, input=prompt) + return result.final_output diff --git a/openai_agents/workflows/research_agents/research_manager.py b/openai_agents/workflows/research_agents/research_manager.py index 19bdd224..d28e60fc 100644 --- a/openai_agents/workflows/research_agents/research_manager.py +++ b/openai_agents/workflows/research_agents/research_manager.py @@ -29,7 +29,7 @@ def __init__(self): async def run(self, query: str) -> str: trace_id = gen_trace_id() - with trace("Research trace", trace_id=trace_id): + with trace("Research", trace_id=trace_id): search_plan = await self._plan_searches(query) search_results = await self._perform_searches(search_plan) report = await self._write_report(query, search_results) diff --git a/openai_agents/workflows/tools_workflow.py b/openai_agents/workflows/tools_workflow.py index 0b981f59..0b2ed7cf 100644 --- a/openai_agents/workflows/tools_workflow.py +++ b/openai_agents/workflows/tools_workflow.py @@ -2,12 +2,13 @@ from datetime import timedelta +from agents import gen_trace_id from temporalio import workflow from temporalio.contrib.openai_agents.temporal_tools import activity_as_tool # Import our activity, passing it through the sandbox with workflow.unsafe.imports_passed_through(): - from agents import Agent, Runner + from agents import Agent, Runner, trace from openai_agents.workflows.get_weather_activity import get_weather @@ -16,15 +17,17 @@ class ToolsWorkflow: @workflow.run async def run(self, question: str) -> str: - agent = Agent( - name="Hello world", - instructions="You are a helpful agent.", - tools=[ - activity_as_tool( - get_weather, start_to_close_timeout=timedelta(seconds=10) - ) - ], - ) + trace_id = gen_trace_id() + with trace("Activity as tool", trace_id=trace_id): + agent = Agent( + name="Weather agent", + instructions="You are a helpful agent.", + tools=[ + activity_as_tool( + get_weather, start_to_close_timeout=timedelta(seconds=10) + ) + ], + ) - result = await Runner.run(agent, input=question) - return result.final_output + result = await Runner.run(agent, input=question) + return result.final_output From ad15acd709a6098d58fb3eeebc4c4cb3e68249fd Mon Sep 17 00:00:00 2001 From: Johann Schleier-Smith Date: Tue, 22 Jul 2025 19:37:21 -0700 Subject: [PATCH 2/6] formatting --- openai_agents/run_customer_service_client.py | 1 + openai_agents/run_hello_world_workflow.py | 1 - openai_agents/run_worker.py | 2 +- openai_agents/workflows/hello_world_workflow.py | 1 + 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openai_agents/run_customer_service_client.py b/openai_agents/run_customer_service_client.py index 1f035f46..be081c1e 100644 --- a/openai_agents/run_customer_service_client.py +++ b/openai_agents/run_customer_service_client.py @@ -32,6 +32,7 @@ async def main(): # Query the workflow for the chat history # If the workflow is not open, start a new one start = False + history = [] try: history = await handle.query( CustomerServiceWorkflow.get_chat_history, diff --git a/openai_agents/run_hello_world_workflow.py b/openai_agents/run_hello_world_workflow.py index ee5dee90..566d525a 100644 --- a/openai_agents/run_hello_world_workflow.py +++ b/openai_agents/run_hello_world_workflow.py @@ -4,7 +4,6 @@ from temporalio.contrib.pydantic import pydantic_data_converter from openai_agents.workflows.hello_world_workflow import HelloWorldAgent -from openai_agents.workflows.research_bot_workflow import ResearchWorkflow async def main(): diff --git a/openai_agents/run_worker.py b/openai_agents/run_worker.py index 29b62ed3..ccc541fb 100644 --- a/openai_agents/run_worker.py +++ b/openai_agents/run_worker.py @@ -9,7 +9,7 @@ ModelActivityParameters, set_open_ai_agent_temporal_overrides, ) -from temporalio.contrib.openai_agents._trace_interceptor import ( +from temporalio.contrib.openai_agents import ( OpenAIAgentsTracingInterceptor, ) from temporalio.contrib.pydantic import pydantic_data_converter diff --git a/openai_agents/workflows/hello_world_workflow.py b/openai_agents/workflows/hello_world_workflow.py index 4ef369a4..51ff8fb9 100644 --- a/openai_agents/workflows/hello_world_workflow.py +++ b/openai_agents/workflows/hello_world_workflow.py @@ -2,6 +2,7 @@ from agents import gen_trace_id, trace from temporalio import workflow + @workflow.defn class HelloWorldAgent: @workflow.run From 939b7d9b492f63bb6eb3cdaeea4cea31a7e66f65 Mon Sep 17 00:00:00 2001 From: Johann Schleier-Smith Date: Tue, 22 Jul 2025 20:02:51 -0700 Subject: [PATCH 3/6] follow openai agents examples more closely --- .../workflows/agents_as_tools_workflow.py | 4 +--- openai_agents/workflows/hello_world_workflow.py | 15 ++++++--------- .../workflows/research_agents/research_manager.py | 5 ++--- openai_agents/workflows/tools_workflow.py | 5 ++--- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/openai_agents/workflows/agents_as_tools_workflow.py b/openai_agents/workflows/agents_as_tools_workflow.py index fcbad34b..1e219fd1 100644 --- a/openai_agents/workflows/agents_as_tools_workflow.py +++ b/openai_agents/workflows/agents_as_tools_workflow.py @@ -1,4 +1,3 @@ -from agents import gen_trace_id from agents import Agent, ItemHelpers, MessageOutputItem, RunConfig, Runner, trace from temporalio import workflow @@ -68,8 +67,7 @@ async def run(self, msg: str) -> str: config = RunConfig() # Run the entire orchestration in a single trace - trace_id = gen_trace_id() - with trace("Orchestrator evaluator", trace_id=trace_id): + with trace("Orchestrator evaluator"): orchestrator = orchestrator_agent() synthesizer = synthesizer_agent() diff --git a/openai_agents/workflows/hello_world_workflow.py b/openai_agents/workflows/hello_world_workflow.py index 51ff8fb9..dd6b2e41 100644 --- a/openai_agents/workflows/hello_world_workflow.py +++ b/openai_agents/workflows/hello_world_workflow.py @@ -1,5 +1,4 @@ from agents import Agent, Runner -from agents import gen_trace_id, trace from temporalio import workflow @@ -7,12 +6,10 @@ class HelloWorldAgent: @workflow.run async def run(self, prompt: str) -> str: - trace_id = gen_trace_id() - with trace("Hello World", trace_id=trace_id): - agent = Agent( - name="Assistant", - instructions="You only respond in haikus.", - ) + agent = Agent( + name="Assistant", + instructions="You only respond in haikus.", + ) - result = await Runner.run(agent, input=prompt) - return result.final_output + result = await Runner.run(agent, input=prompt) + return result.final_output diff --git a/openai_agents/workflows/research_agents/research_manager.py b/openai_agents/workflows/research_agents/research_manager.py index d28e60fc..356da1d7 100644 --- a/openai_agents/workflows/research_agents/research_manager.py +++ b/openai_agents/workflows/research_agents/research_manager.py @@ -6,7 +6,7 @@ with workflow.unsafe.imports_passed_through(): # TODO: Restore progress updates - from agents import RunConfig, Runner, custom_span, gen_trace_id, trace + from agents import RunConfig, Runner, custom_span, trace from openai_agents.workflows.research_agents.planner_agent import ( WebSearchItem, @@ -28,8 +28,7 @@ def __init__(self): self.writer_agent = new_writer_agent() async def run(self, query: str) -> str: - trace_id = gen_trace_id() - with trace("Research", trace_id=trace_id): + with trace("Research trace"): search_plan = await self._plan_searches(query) search_results = await self._perform_searches(search_plan) report = await self._write_report(query, search_results) diff --git a/openai_agents/workflows/tools_workflow.py b/openai_agents/workflows/tools_workflow.py index 0bf2cf02..adc1e663 100644 --- a/openai_agents/workflows/tools_workflow.py +++ b/openai_agents/workflows/tools_workflow.py @@ -2,7 +2,7 @@ from datetime import timedelta -from agents import gen_trace_id, trace +from agents import trace from agents import Agent, Runner from temporalio import workflow from temporalio.contrib import openai_agents as temporal_agents @@ -14,8 +14,7 @@ class ToolsWorkflow: @workflow.run async def run(self, question: str) -> str: - trace_id = gen_trace_id() - with trace("Activity as tool", trace_id=trace_id): + with trace("Activity as tool"): agent = Agent( name="Hello world", instructions="You are a helpful agent.", From db6ccdd4e5ae5cbb175068c9f00a8bfab7e2aad9 Mon Sep 17 00:00:00 2001 From: Johann Schleier-Smith Date: Tue, 22 Jul 2025 20:03:12 -0700 Subject: [PATCH 4/6] formatting --- openai_agents/workflows/tools_workflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openai_agents/workflows/tools_workflow.py b/openai_agents/workflows/tools_workflow.py index adc1e663..d141b8d5 100644 --- a/openai_agents/workflows/tools_workflow.py +++ b/openai_agents/workflows/tools_workflow.py @@ -2,7 +2,7 @@ from datetime import timedelta -from agents import trace +from agents import trace from agents import Agent, Runner from temporalio import workflow from temporalio.contrib import openai_agents as temporal_agents From 47d4f70cf55eb56f6b3db2c7abd18aba51a4cbb9 Mon Sep 17 00:00:00 2001 From: Johann Schleier-Smith Date: Tue, 22 Jul 2025 20:10:22 -0700 Subject: [PATCH 5/6] formatting --- openai_agents/run_worker.py | 4 +--- openai_agents/workflows/agents_as_tools_workflow.py | 1 - openai_agents/workflows/tools_workflow.py | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/openai_agents/run_worker.py b/openai_agents/run_worker.py index ccc541fb..9dbaef91 100644 --- a/openai_agents/run_worker.py +++ b/openai_agents/run_worker.py @@ -7,10 +7,8 @@ from temporalio.contrib.openai_agents import ( ModelActivity, ModelActivityParameters, - set_open_ai_agent_temporal_overrides, -) -from temporalio.contrib.openai_agents import ( OpenAIAgentsTracingInterceptor, + set_open_ai_agent_temporal_overrides, ) from temporalio.contrib.pydantic import pydantic_data_converter from temporalio.worker import Worker diff --git a/openai_agents/workflows/agents_as_tools_workflow.py b/openai_agents/workflows/agents_as_tools_workflow.py index 1e219fd1..db849c1c 100644 --- a/openai_agents/workflows/agents_as_tools_workflow.py +++ b/openai_agents/workflows/agents_as_tools_workflow.py @@ -1,5 +1,4 @@ from agents import Agent, ItemHelpers, MessageOutputItem, RunConfig, Runner, trace - from temporalio import workflow """ diff --git a/openai_agents/workflows/tools_workflow.py b/openai_agents/workflows/tools_workflow.py index d141b8d5..e8b28f75 100644 --- a/openai_agents/workflows/tools_workflow.py +++ b/openai_agents/workflows/tools_workflow.py @@ -2,8 +2,7 @@ from datetime import timedelta -from agents import trace -from agents import Agent, Runner +from agents import Agent, Runner, trace from temporalio import workflow from temporalio.contrib import openai_agents as temporal_agents From 8f9a40c99a605fc2e586f0ae5c1199098bee2e8b Mon Sep 17 00:00:00 2001 From: Johann Schleier-Smith Date: Wed, 23 Jul 2025 10:39:56 -0700 Subject: [PATCH 6/6] remove tracing from tools example --- openai_agents/workflows/tools_workflow.py | 25 +++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/openai_agents/workflows/tools_workflow.py b/openai_agents/workflows/tools_workflow.py index e8b28f75..c9f80e9f 100644 --- a/openai_agents/workflows/tools_workflow.py +++ b/openai_agents/workflows/tools_workflow.py @@ -2,7 +2,7 @@ from datetime import timedelta -from agents import Agent, Runner, trace +from agents import Agent, Runner from temporalio import workflow from temporalio.contrib import openai_agents as temporal_agents @@ -13,16 +13,15 @@ class ToolsWorkflow: @workflow.run async def run(self, question: str) -> str: - with trace("Activity as tool"): - agent = Agent( - name="Hello world", - instructions="You are a helpful agent.", - tools=[ - temporal_agents.workflow.activity_as_tool( - get_weather, start_to_close_timeout=timedelta(seconds=10) - ) - ], - ) + agent = Agent( + name="Hello world", + instructions="You are a helpful agent.", + tools=[ + temporal_agents.workflow.activity_as_tool( + get_weather, start_to_close_timeout=timedelta(seconds=10) + ) + ], + ) - result = await Runner.run(agent, input=question) - return result.final_output + result = await Runner.run(agent, input=question) + return result.final_output