Skip to content

Python: Executor with decorator doesn't generate AgentRunUpdateEvent event #2536

@a1exwang

Description

@a1exwang

For my workflow, if a workflow node is created with the decorator syntax, it's missing the AgentRunUpdateEvent. But if a node is a plain agent, it will correctly generate AgentRunUpdateEvent.

Repro steps

  1. Run the app code
  2. Get the result
WorkflowStartedEvent(origin=WorkflowEventSource.FRAMEWORK, data=None)
WorkflowStatusEvent(state=WorkflowRunState.IN_PROGRESS, data=None, origin=WorkflowEventSource.FRAMEWORK)
ExecutorInvokedEvent(executor_id=ContentWriter, data=None)
AgentRunUpdateEvent(executor_id=ContentWriter, messages=Thank)
AgentRunUpdateEvent(executor_id=ContentWriter, messages= you)
...
ExecutorCompletedEvent(executor_id=ContentWriter, data=None)
ExecutorInvokedEvent(executor_id=CodeWriter, data=None)   # <---- HERE, the CodeWriter executor only has executor level events, no agent events.
ExecutorCompletedEvent(executor_id=CodeWriter, data=None)
WorkflowStatusEvent(state=WorkflowRunState.IDLE, data=None, origin=WorkflowEventSource.FRAMEWORK)

Expected behavior

For the latter syntax can also generate AgentRunUpdateEvent which contains the output text.

My app code

import asyncio
import os
from typing import Any, Never

from agent_framework import (
    AgentExecutorResponse,
    WorkflowBuilder,
    Executor, WorkflowContext, handler, ChatAgent, ChatMessage,
    executor,
)
from agent_framework.azure import AzureOpenAIChatClient
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

async def main():
    chat_client = AzureOpenAIChatClient(api_key=os.environ["AZURE_OPENAI_API_KEY"])
    writer_agent = chat_client.create_agent(
        name="ContentWriter",
        instructions=("You are an excellent content writer. "),
    )
    class CodeWriter(Executor):
        agent: ChatAgent
        def __init__(self, chat_client: AzureOpenAIChatClient):
            self.agent = chat_client.create_agent(instructions=("You are an excellent programmer. Rewrite your input with Python code."))
            super().__init__(id="CodeWriter")

        @handler
        async def handle(self, last_response: AgentExecutorResponse, ctx: WorkflowContext[list[ChatMessage]]) -> None:
            response = await self.agent.run(last_response.agent_run_response.text)
            await ctx.send_message(response)

    writer2 = CodeWriter(chat_client=chat_client)

    workflow = (
        WorkflowBuilder(
            name="Test Workflow",
            description="Test Workflow",
        )
        .set_start_executor(writer_agent)
        .add_edge(writer_agent, writer2)
        .build()
    )

    async for event in workflow.run_stream([ChatMessage(role="user", content="Hello world")]):
        print(event)

if __name__ == "__main__":
    asyncio.run(main())

package version:

> uv pip freeze | grep agent-framework
agent-framework-azure-ai==1.0.0b251007
agent-framework-core==1.0.0b251007

Metadata

Metadata

Assignees

Labels

pythonworkflowsRelated to Workflows in agent-framework

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions