-
Notifications
You must be signed in to change notification settings - Fork 865
Closed
Labels
Description
Description
When running sequential workflow that include an agent with tool, the process fails with the following error.
ValueError("No thread ID was provided, but chat messages includes tool results.")
Reproduction
Example Script
import asyncio
import os
from typing import Annotated
from agent_framework import (
AgentRunContext,
agent_middleware,
ChatMessage,
SequentialBuilder,
)
from agent_framework.azure import AzureAIAgentClient
from azure.identity.aio import DefaultAzureCredential
from typing import Callable, Awaitable
from pydantic import Field
from dotenv import load_dotenv
load_dotenv()
# mock tool: return a fixed weather information
def get_weather(
location: Annotated[str, Field(description="The location to get the weather for.")],
) -> str:
print(f"tool executed")
return f"The weather in {location} is 1000°C."
# monitor the agent's response
@agent_middleware
async def monitor_agent_middleware(
context: AgentRunContext,
next: Callable[[AgentRunContext], Awaitable[None]],
) -> None:
await next(context)
agent_name: str = context.agent.name
response_messages: list[ChatMessage] = context.result.messages
for message in response_messages:
print(f"[{agent_name}]: {message.text}")
async def tools_on_agent_level() -> None:
async with (
DefaultAzureCredential() as credential,
AzureAIAgentClient(
async_credential=credential,
project_endpoint=os.environ["AIPROJECT_ENDPOINT"],
model_deployment_name=os.environ["AZURE_OPENAI_DEPLOYMENT"],
) as chat_client,
):
optimize_agent = chat_client.create_agent(
instructions="Your task is to optimize user's input, make it more accurate and concise.",
name="optimize_agent",
middleware=[monitor_agent_middleware],
store=True,
)
tool_agent = chat_client.create_agent(
instructions="You are a helpful assistant that can provide weather information. Use yout get_weather_forecast tool to get the weather information.",
name="weather_tool_agent",
tools=[get_weather],
middleware=[monitor_agent_middleware],
store=True,
)
summary_agent = chat_client.create_agent(
instructions="Your task is to summarize the weather information.",
name="summary_agent",
middleware=[monitor_agent_middleware],
store=True,
)
query = "What's the weather like in New York?"
workflow = (
SequentialBuilder()
.participants([optimize_agent, tool_agent, summary_agent])
.build()
)
await workflow.run(query)
if __name__ == "__main__":
asyncio.run(tools_on_agent_level())Output in the CLI
[optimize_agent]: What is the current weather in New York City?
tool executed
[weather_tool_agent]:
[weather_tool_agent]:
[weather_tool_agent]: There appears to be an error with the temperature value reported for New York. Would you like me to try retrieving the weather information again?
Traceback (most recent call last):
File "C:\Kurt\03_agent_framework\multi-agent-sdk\sequential_bug.py", line 71, in <module>
asyncio.run(tools_on_agent_level())
File "C:\Users\a-kurtshen\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Users\a-kurtshen\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\a-kurtshen\AppData\Local\Programs\Python\Python312\Lib\asyncio\base_events.py", line 664, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\sequential_bug.py", line 66, in tools_on_agent_level
await workflow.run(query)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_workflow.py", line 554, in run
raw_events = [
^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_workflow.py", line 330, in _run_workflow_with_tracing
async for event in self._runner.run_until_convergence():
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_runner.py", line 113, in run_until_convergence
await iteration_task
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_runner.py", line 175, in _run_iteration
await asyncio.gather(*tasks)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_runner.py", line 171, in _deliver_messages
await asyncio.gather(*tasks)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_runner.py", line 150, in _deliver_message_inner
return await edge_runner.send_message(message, self._shared_state, self._ctx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_edge_runner.py", line 137, in send_message
await self._execute_on_target(target_id, [source_id], message, shared_state, ctx)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_edge_runner.py", line 68, in _execute_on_target
await target_executor.execute(
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_executor.py", line 276, in execute
await handler(message, context)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_executor.py", line 486, in wrapper
return await func(self, message, ctx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_agent_executor.py", line 192, in from_messages
await self._run_agent_and_emit(ctx)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_workflows\_agent_executor.py", line 121, in _run_agent_and_emit
response = await self._agent.run(
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 1239, in middleware_enabled_run
result = await agent_pipeline.execute(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 809, in execute
await first_handler(context)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 684, in current_handler
await middleware.process(c, next_handler)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 601, in process
await self.func(context, next)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\sequential_bug.py", line 27, in monitor_agent_middleware
await next(context)
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 674, in final_wrapper
result = await final_handler(c)
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 806, in agent_final_handler
return await final_handler(c)
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 1237, in _execute_handler
return await original_run(self, ctx.messages, thread=thread, **ctx.kwargs) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\observability.py", line 1097, in trace_run
return await run_func(self, messages=messages, thread=thread, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_agents.py", line 863, in run
response = await self.chat_client.get_response(messages=thread_messages, chat_options=co, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_tools.py", line 1364, in function_invocation_wrapper
response = await func(self, messages=prepped_messages, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\observability.py", line 829, in trace_get_response
return await func(
^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_middleware.py", line 1367, in middleware_enabled_get_response
return await original_get_response(self, messages, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_clients.py", line 619, in get_response
return await self._inner_get_response(messages=prepped_messages, chat_options=chat_options, **filtered_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework_azure_ai\_chat_client.py", line 321, in _inner_get_response
return await ChatResponse.from_chat_response_generator(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework\_types.py", line 2431, in from_chat_response_generator
async for update in updates:
File "C:\Kurt\03_agent_framework\multi-agent-sdk\.venv\Lib\site-packages\agent_framework_azure_ai\_chat_client.py", line 344, in _inner_get_streaming_response
raise ValueError("No thread ID was provided, but chat messages includes tool results.")
ValueError: No thread ID was provided, but chat messages includes tool results.
Environment
python version: 3.12
agent-framework version: 1.0.0b251028