mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
5e056b672e
* Python: Provider-leading client design & OpenAI package extraction Major refactoring of the Python Agent Framework client architecture: - Extract OpenAI clients into new `agent-framework-openai` package - Core package no longer depends on openai, azure-identity, azure-ai-projects - Rename clients for discoverability: OpenAIResponsesClient → OpenAIChatClient, OpenAIChatClient → OpenAIChatCompletionClient - Unify `model_id`/`deployment_name`/`model_deployment_name` → `model` param - New FoundryChatClient for Azure AI Foundry Responses API - New FoundryAgent/FoundryAgentClient for connecting to pre-configured Foundry agents - Remove OpenAIBase/OpenAIConfigMixin from non-deprecated client MRO - Deprecate AzureOpenAI* clients, AzureAIClient, OpenAIAssistantsClient - Reorganize samples: azure_openai+azure_ai+azure_ai_agent → azure/ - ADR-0020: Provider-Leading Client Design Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: missing Agent imports in samples, .model_id → .model in foundry_local sample Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: CI failures — mypy errors, coverage targets, sample imports - azure-ai mypy: add type ignores for TypedDict total=, model arg, forward ref - Coverage: replace core.azure/openai targets with openai package target - project_provider: add type annotation for opts dict Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: populate openai .pyi stub, fix broken README links, coverage targets Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fixes * updated observabilitty * reset azure init.pyi * fix errors * updated adr number * fix foundry local * fixed not renamed docstrings and comments, and added deprecated markers to old classes * fix tests and pyprojects * fix test vars * updated function tests * update durable * updated test setup for functions * Fix Foundry auth in workflow samples Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Stabilize Python integration workflows Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update hosting samples for Foundry Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Trigger full CI rerun Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Trigger CI rerun again Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * trigger rerun * trigger rerun * fix for litellm * undo durabletask changes * Move Foundry APIs into foundry namespace Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix Foundry pyproject formatting Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Split provider samples by Foundry surface Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore hosting sample requirements Also fix the Foundry Local sample link after the provider sample move. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * updated tests * udpated foundry integration tests * removed dist from azurefunctions tests * Use separate Foundry clients for concurrent agents Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix client setup in azfunc and durable * disabled two tests * updated setup for some function and durable tests * improved azure openai setup with new clients * ignore deprecated * fixes * skip 11 * remove openai assistants int tests --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
71 lines
1.7 KiB
Python
71 lines
1.7 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import asyncio
|
|
|
|
from agent_framework import (
|
|
Executor,
|
|
WorkflowBuilder,
|
|
WorkflowContext,
|
|
executor,
|
|
handler,
|
|
)
|
|
from typing_extensions import Never
|
|
|
|
"""
|
|
First Workflow — Chain executors with edges
|
|
|
|
This sample builds a minimal workflow with two steps:
|
|
1. Convert text to uppercase (class-based executor)
|
|
2. Reverse the text (function-based executor)
|
|
|
|
No external services are required.
|
|
"""
|
|
|
|
|
|
# <create_workflow>
|
|
# Step 1: A class-based executor that converts text to uppercase
|
|
class UpperCase(Executor):
|
|
def __init__(self, id: str):
|
|
super().__init__(id=id)
|
|
|
|
@handler
|
|
async def to_upper_case(self, text: str, ctx: WorkflowContext[str]) -> None:
|
|
"""Convert input to uppercase and forward to the next node."""
|
|
await ctx.send_message(text.upper())
|
|
|
|
|
|
# Step 2: A function-based executor that reverses the string and yields output
|
|
@executor(id="reverse_text")
|
|
async def reverse_text(text: str, ctx: WorkflowContext[Never, str]) -> None:
|
|
"""Reverse the string and yield the final workflow output."""
|
|
await ctx.yield_output(text[::-1])
|
|
|
|
|
|
def create_workflow():
|
|
"""Build the workflow: UpperCase → reverse_text."""
|
|
upper = UpperCase(id="upper_case")
|
|
return WorkflowBuilder(start_executor=upper).add_edge(upper, reverse_text).build()
|
|
|
|
|
|
# </create_workflow>
|
|
|
|
|
|
async def main() -> None:
|
|
# <run_workflow>
|
|
workflow = create_workflow()
|
|
|
|
events = await workflow.run("hello world")
|
|
print(f"Output: {events.get_outputs()}")
|
|
print(f"Final state: {events.get_final_state()}")
|
|
# </run_workflow>
|
|
|
|
"""
|
|
Expected output:
|
|
Output: ['DLROW OLLEH']
|
|
Final state: WorkflowRunState.IDLE
|
|
"""
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|