Python: [BREAKING] Python: Rename workflow to workflows (#1007)

* Rename workflow to workflows

* Update occurence of workflow to new name
This commit is contained in:
Evan Mattson
2025-09-30 20:21:34 +09:00
committed by GitHub
Unverified
parent 189434dd4b
commit b42bb700fb
82 changed files with 87 additions and 90 deletions
@@ -1,8 +1,8 @@
# Workflow Getting Started Samples
# Workflows Getting Started Samples
## Installation
Workflow support ships with the core `agent-framework` package, so no extra installation step is required.
Microsoft Agent Framework Workflows support ships with the core `agent-framework` or `agent-framework-core` package, so no extra installation step is required.
To install with visualization support:
@@ -14,7 +14,7 @@ from agent_framework import (
WorkflowStatusEvent,
handler,
)
from agent_framework._workflow._events import WorkflowOutputEvent
from agent_framework._workflows._events import WorkflowOutputEvent
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
from typing_extensions import Never
@@ -52,13 +52,13 @@ class Writer(Executor):
def __init__(self, chat_client: AzureOpenAIChatClient, id: str = "writer"):
# Create a domain specific agent using your configured AzureOpenAIChatClient.
agent = chat_client.create_agent(
self.agent = chat_client.create_agent(
instructions=(
"You are an excellent content writer. You create new content and edit contents based on the feedback."
),
)
# Associate this agent with the executor node. The base Executor stores it on self.agent.
super().__init__(agent=agent, id=id)
super().__init__(id=id)
@handler
async def handle(self, message: ChatMessage, ctx: WorkflowContext[list[ChatMessage]]) -> None:
@@ -89,12 +89,12 @@ class Reviewer(Executor):
def __init__(self, chat_client: AzureOpenAIChatClient, id: str = "reviewer"):
# Create a domain specific agent that evaluates and refines content.
agent = chat_client.create_agent(
self.agent = chat_client.create_agent(
instructions=(
"You are an excellent content reviewer. You review the content and provide feedback to the writer."
),
)
super().__init__(agent=agent, id=id)
super().__init__(id=id)
@handler
async def handle(self, messages: list[ChatMessage], ctx: WorkflowContext[Never, str]) -> None:
@@ -43,13 +43,13 @@ class Writer(Executor):
def __init__(self, chat_client: AzureOpenAIChatClient, id: str = "writer"):
# Create a domain specific agent using your configured AzureOpenAIChatClient.
agent = chat_client.create_agent(
self.agent = chat_client.create_agent(
instructions=(
"You are an excellent content writer. You create new content and edit contents based on the feedback."
),
)
# Associate the agent with this executor node. The base Executor stores it on self.agent.
super().__init__(agent=agent, id=id)
super().__init__(id=id)
@handler
async def handle(self, message: ChatMessage, ctx: WorkflowContext[list[ChatMessage], str]) -> None:
@@ -85,12 +85,12 @@ class Reviewer(Executor):
def __init__(self, chat_client: AzureOpenAIChatClient, id: str = "reviewer"):
# Create a domain specific agent that evaluates and refines content.
agent = chat_client.create_agent(
self.agent = chat_client.create_agent(
instructions=(
"You are an excellent content reviewer. You review the content and provide feedback to the writer."
),
)
super().__init__(agent=agent, id=id)
super().__init__(id=id)
@handler
async def handle(self, messages: list[ChatMessage], ctx: WorkflowContext[list[ChatMessage], str]) -> None:
@@ -27,7 +27,7 @@ from agent_framework import ( # noqa: E402
handler,
)
from agent_framework.openai import OpenAIChatClient # noqa: E402
from getting_started.workflow.agents.workflow_as_agent_reflection_pattern import ( # noqa: E402
from getting_started.workflows.agents.workflow_as_agent_reflection_pattern import ( # noqa: E402
ReviewRequest,
ReviewResponse,
Worker,
@@ -35,7 +35,7 @@ from azure.identity import AzureCliCredential
if TYPE_CHECKING:
from agent_framework import Workflow
from agent_framework._workflow._checkpoint import WorkflowCheckpoint
from agent_framework._workflows._checkpoint import WorkflowCheckpoint
"""
Sample: Checkpoint + human-in-the-loop quickstart.
@@ -23,7 +23,7 @@ from azure.identity import AzureCliCredential
if TYPE_CHECKING:
from agent_framework import Workflow
from agent_framework._workflow._checkpoint import WorkflowCheckpoint
from agent_framework._workflows._checkpoint import WorkflowCheckpoint
"""
Sample: Checkpointing and Resuming a Workflow (with an Agent stage)
@@ -212,7 +212,7 @@ def _render_checkpoint_summary(checkpoints: list["WorkflowCheckpoint"]) -> None:
async def main():
# Clear existing checkpoints in this sample directory for a clean run.
checkpoint_dir = Path(TEMP_DIR)
for file in checkpoint_dir.glob("*.json"):
for file in checkpoint_dir.glob("*.json"): # noqa: ASYNC240
file.unlink()
# Backing store for checkpoints written by with_checkpointing.
@@ -4,8 +4,6 @@ import asyncio
import os
from typing import Any
from typing_extensions import Never
from agent_framework import ( # Core chat primitives used to build requests
AgentExecutor, # Wraps an LLM agent that can be invoked inside a workflow
AgentExecutorRequest, # Input message bundle for an AgentExecutor
@@ -19,6 +17,7 @@ from agent_framework import ( # Core chat primitives used to build requests
from agent_framework.azure import AzureOpenAIChatClient # Thin client wrapper for Azure OpenAI chat models
from azure.identity import AzureCliCredential # Uses your az CLI login for credentials
from pydantic import BaseModel # Structured outputs for safer parsing
from typing_extensions import Never
"""
Sample: Conditional routing with structured outputs
@@ -8,8 +8,6 @@ from dataclasses import dataclass
from typing import Literal
from uuid import uuid4
from typing_extensions import Never
from agent_framework import (
AgentExecutor,
AgentExecutorRequest,
@@ -25,6 +23,7 @@ from agent_framework import (
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
from pydantic import BaseModel
from typing_extensions import Never
"""
Sample: Multi-Selection Edge Group for email triage and response.
@@ -3,8 +3,6 @@
import asyncio
from typing import cast
from typing_extensions import Never
from agent_framework import (
Executor,
WorkflowBuilder,
@@ -12,6 +10,7 @@ from agent_framework import (
WorkflowOutputEvent,
handler,
)
from typing_extensions import Never
"""
Sample: Sequential workflow with streaming.
@@ -2,9 +2,8 @@
import asyncio
from typing_extensions import Never
from agent_framework import WorkflowBuilder, WorkflowContext, WorkflowOutputEvent, executor
from typing_extensions import Never
"""
Sample: Foundational sequential workflow with streaming using function-style executors.
@@ -6,8 +6,6 @@ from dataclasses import dataclass
from typing import Any, Literal
from uuid import uuid4
from typing_extensions import Never
from agent_framework import ( # Core chat primitives used to form LLM requests
AgentExecutor, # Wraps an agent so it can run inside a workflow
AgentExecutorRequest, # Message bundle sent to an AgentExecutor
@@ -23,6 +21,7 @@ from agent_framework import ( # Core chat primitives used to form LLM requests
from agent_framework.azure import AzureOpenAIChatClient # Thin client for Azure OpenAI chat models
from azure.identity import AzureCliCredential # Uses your az CLI login for credentials
from pydantic import BaseModel # Structured outputs with validation
from typing_extensions import Never
"""
Sample: Switch-Case Edge Group with an explicit Uncertain branch.
@@ -40,14 +40,14 @@ class ResearcherExec(Executor):
agent: ChatAgent
def __init__(self, chat_client: AzureOpenAIChatClient, id: str = "researcher"):
agent = chat_client.create_agent(
self.agent = chat_client.create_agent(
instructions=(
"You're an expert market and product researcher. Given a prompt, provide concise, factual insights,"
" opportunities, and risks."
),
name=id,
)
super().__init__(agent=agent, id=id)
super().__init__(id=id)
@handler
async def run(self, request: AgentExecutorRequest, ctx: WorkflowContext[AgentExecutorResponse]) -> None:
@@ -60,14 +60,14 @@ class MarketerExec(Executor):
agent: ChatAgent
def __init__(self, chat_client: AzureOpenAIChatClient, id: str = "marketer"):
agent = chat_client.create_agent(
self.agent = chat_client.create_agent(
instructions=(
"You're a creative marketing strategist. Craft compelling value propositions and target messaging"
" aligned to the prompt."
),
name=id,
)
super().__init__(agent=agent, id=id)
super().__init__(id=id)
@handler
async def run(self, request: AgentExecutorRequest, ctx: WorkflowContext[AgentExecutorResponse]) -> None:
@@ -80,14 +80,14 @@ class LegalExec(Executor):
agent: ChatAgent
def __init__(self, chat_client: AzureOpenAIChatClient, id: str = "legal"):
agent = chat_client.create_agent(
self.agent = chat_client.create_agent(
instructions=(
"You're a cautious legal/compliance reviewer. Highlight constraints, disclaimers, and policy concerns"
" based on the prompt."
),
name=id,
)
super().__init__(agent=agent, id=id)
super().__init__(id=id)
@handler
async def run(self, request: AgentExecutorRequest, ctx: WorkflowContext[AgentExecutorResponse]) -> None:
@@ -3,8 +3,6 @@
import asyncio
from typing import Any
from typing_extensions import Never
from agent_framework import (
ChatMessage,
Executor,
@@ -15,6 +13,7 @@ from agent_framework import (
)
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
from typing_extensions import Never
"""
Sample: Sequential workflow mixing agents and a custom summarizer executor
@@ -3,8 +3,6 @@
import asyncio
from dataclasses import dataclass
from typing_extensions import Never
from agent_framework import ( # Core chat primitives to build LLM requests
AgentExecutor, # Wraps an LLM agent for use inside a workflow
AgentExecutorRequest, # The message bundle sent to an AgentExecutor
@@ -20,6 +18,7 @@ from agent_framework import ( # Core chat primitives to build LLM requests
)
from agent_framework.azure import AzureOpenAIChatClient # Client wrapper for Azure OpenAI chat models
from azure.identity import AzureCliCredential # Uses your az CLI login for credentials
from typing_extensions import Never
"""
Sample: Concurrent fan out and fan in with three domain agents
@@ -7,8 +7,6 @@ from collections import defaultdict
from dataclasses import dataclass
import aiofiles
from typing_extensions import Never
from agent_framework import (
Executor, # Base class for custom workflow steps
WorkflowBuilder, # Fluent builder for executors and edges
@@ -17,6 +15,7 @@ from agent_framework import (
WorkflowViz, # Utility to visualize a workflow graph
handler, # Decorator to expose an Executor method as a step
)
from typing_extensions import Never
"""
Sample: Map reduce word count with fan out and fan in over file backed intermediate results
@@ -6,8 +6,6 @@ from dataclasses import dataclass
from typing import Any
from uuid import uuid4
from typing_extensions import Never
from agent_framework import (
AgentExecutorRequest,
AgentExecutorResponse,
@@ -20,6 +18,7 @@ from agent_framework import (
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
from pydantic import BaseModel
from typing_extensions import Never
"""
Sample: Shared state with agents and conditional routing.
@@ -3,8 +3,6 @@
import asyncio
from dataclasses import dataclass
from typing_extensions import Never
from agent_framework import (
AgentExecutor,
AgentExecutorRequest,
@@ -21,6 +19,7 @@ from agent_framework import (
)
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
from typing_extensions import Never
"""
Sample: Concurrent (Fan-out/Fan-in) with Agents + Visualization