From 1317f6f9c0bf6ae5ccc4a2b60e09bc7505675a16 Mon Sep 17 00:00:00 2001 From: "L. Elaine Dazzio" Date: Fri, 10 Apr 2026 17:24:02 -0400 Subject: [PATCH] fix: use workflow factory to avoid RuntimeError under parallel requests (#4766) --- .../main.py | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 python/samples/05-end-to-end/hosted_agents/writer_reviewer_agents_in_workflow/main.py diff --git a/python/samples/05-end-to-end/hosted_agents/writer_reviewer_agents_in_workflow/main.py b/python/samples/05-end-to-end/hosted_agents/writer_reviewer_agents_in_workflow/main.py new file mode 100644 index 0000000000..e90044c958 --- /dev/null +++ b/python/samples/05-end-to-end/hosted_agents/writer_reviewer_agents_in_workflow/main.py @@ -0,0 +1,72 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os +from contextlib import asynccontextmanager + +from agent_framework import Agent, WorkflowBuilder +from agent_framework.foundry import FoundryChatClient +from azure.ai.agentserver.agentframework import from_agent_framework +from azure.identity.aio import AzureCliCredential, ManagedIdentityCredential +from dotenv import load_dotenv + +load_dotenv(override=True) + +# Configure these for your Foundry project +# Read the explicit variables present in the .env file +FOUNDRY_PROJECT_ENDPOINT = os.getenv( + "FOUNDRY_PROJECT_ENDPOINT" +) # e.g., "https://.services.ai.azure.com/api/projects/" +FOUNDRY_MODEL = os.getenv("FOUNDRY_MODEL", "gpt-4.1-mini") # Your model deployment name e.g., "gpt-4.1-mini" + + +def get_credential(): + """Will use Managed Identity when running in Azure, otherwise falls back to Azure CLI Credential.""" + return ManagedIdentityCredential() if os.getenv("MSI_ENDPOINT") else AzureCliCredential() + + +@asynccontextmanager +async def create_agents(): + async with get_credential() as credential: + client = FoundryChatClient( + project_endpoint=FOUNDRY_PROJECT_ENDPOINT, + model=FOUNDRY_MODEL, + credential=credential, + ) + writer = Agent( + client=client, + name="Writer", + instructions="You are an excellent content writer. You create new content and edit contents based on the feedback.", + ) + reviewer = Agent( + client=client, + name="Reviewer", + instructions="You are an excellent content reviewer. Provide actionable feedback to the writer about the provided content in the most concise manner possible.", + ) + yield writer, reviewer + + +def create_workflow(writer, reviewer): + workflow = WorkflowBuilder(start_executor=writer).add_edge(writer, reviewer).build() + return Agent( + client=workflow, + ) + + +async def main() -> None: + """ + The writer and reviewer multi-agent workflow. + + Environment variables required: + - FOUNDRY_PROJECT_ENDPOINT: Your Microsoft Foundry project endpoint + - FOUNDRY_MODEL: Your Microsoft Foundry model deployment name + """ + + async with create_agents() as (writer, reviewer): + # Use a factory lambda so each incoming request gets a fresh Workflow + # instance, avoiding RuntimeError from concurrent executions (#4766). + await from_agent_framework(lambda: create_workflow(writer, reviewer)).run_async() + + +if __name__ == "__main__": + asyncio.run(main())