Skip to content

Python: [Sequential Workflow] ValueError("No thread ID was provided, but chat messages includes tool results.") when using agent with tool in Sequential Workflow #1767

@q33566

Description

@q33566

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

Metadata

Metadata

Assignees

Labels

pythonworkflowsRelated to Workflows in agent-framework

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions