diff --git a/python/packages/core/agent_framework/__init__.py b/python/packages/core/agent_framework/__init__.py index a098159a50..13d7bade00 100644 --- a/python/packages/core/agent_framework/__init__.py +++ b/python/packages/core/agent_framework/__init__.py @@ -277,11 +277,11 @@ "USER_AGENT_TELEMETRY_DISABLED_ENV_VAR", "Agent", "AgentContext", - "AgentFrameworkException", "AgentEvalConverter", "AgentExecutor", "AgentExecutorRequest", "AgentExecutorResponse", + "AgentFrameworkException", "AgentMiddleware", "AgentMiddlewareLayer", "AgentMiddlewareTypes", diff --git a/python/packages/core/tests/core/test_exceptions.py b/python/packages/core/tests/core/test_exceptions.py index 47b3a53197..bf164cdbe2 100644 --- a/python/packages/core/tests/core/test_exceptions.py +++ b/python/packages/core/tests/core/test_exceptions.py @@ -2,8 +2,6 @@ """Tests for AgentFrameworkException inner_exception handling.""" -import pytest - from agent_framework import AgentFrameworkException diff --git a/python/samples/01-get-started/05_functional_workflow_with_agents.py b/python/samples/01-get-started/05_functional_workflow_with_agents.py index 05e5f2637f..7ffb0165c4 100644 --- a/python/samples/01-get-started/05_functional_workflow_with_agents.py +++ b/python/samples/01-get-started/05_functional_workflow_with_agents.py @@ -37,6 +37,8 @@ async def poem_workflow(topic: str) -> str: poem = (await writer.run(f"Write a poem about: {topic}")).text review = (await reviewer.run(f"Review this poem: {poem}")).text return f"Poem:\n{poem}\n\nReview: {review}" + + # diff --git a/python/samples/01-get-started/06_functional_workflow_basics.py b/python/samples/01-get-started/06_functional_workflow_basics.py index 8033a7ac4e..a679e70a99 100644 --- a/python/samples/01-get-started/06_functional_workflow_basics.py +++ b/python/samples/01-get-started/06_functional_workflow_basics.py @@ -36,6 +36,8 @@ async def text_workflow(text: str) -> str: """Uppercase the text, then reverse it.""" upper = await to_upper_case(text) return await reverse_text(upper) + + # diff --git a/python/samples/04-hosting/a2a/.env.example b/python/samples/04-hosting/a2a/.env.example new file mode 100644 index 0000000000..91f0530fcd --- /dev/null +++ b/python/samples/04-hosting/a2a/.env.example @@ -0,0 +1,8 @@ +# Azure AI Foundry Configuration (required for a2a_server.py and a2a_agent_as_function_tools.py) +FOUNDRY_PROJECT_ENDPOINT=https://your-project.services.ai.azure.com/api/projects/your-project +FOUNDRY_MODEL=gpt-4o + +# A2A Client Configuration (required for agent_with_a2a.py and a2a_agent_as_function_tools.py) +# The function-tools flow uses http://localhost:5000/ in the sample docs/output. +# Update this value if you start a different local A2A server instance on another port. +A2A_AGENT_HOST=http://localhost:5000/ diff --git a/python/samples/04-hosting/a2a/README.md b/python/samples/04-hosting/a2a/README.md index aca25a4dab..bc76d124f6 100644 --- a/python/samples/04-hosting/a2a/README.md +++ b/python/samples/04-hosting/a2a/README.md @@ -42,8 +42,33 @@ All commands below should be run from this directory: cd python/samples/04-hosting/a2a ``` +### 0. Install Dependencies + +Copy `.env.example` to `.env` and fill in your values: + +```powershell +copy .env.example .env +``` + +**Option A — pip (standard):** + +```powershell +python -m venv .venv +.venv\Scripts\Activate.ps1 # Windows +# source .venv/bin/activate # macOS / Linux +pip install -r requirements.txt +``` + +**Option B — uv:** + +```powershell +uv run python a2a_server.py --agent-type policy +``` + ### 1. Start the A2A Server +> **Note (Option A — pip users):** Replace `uv run python` with `python` in all `uv run` commands below (e.g. `python a2a_server.py ...`). `uv` is not required once the virtual environment is activated. + Pick an agent type and start the server (each in its own terminal): ```powershell diff --git a/python/samples/04-hosting/a2a/agent_framework_to_a2a.py b/python/samples/04-hosting/a2a/agent_framework_to_a2a.py index 0693b61b0a..6e68f21a02 100644 --- a/python/samples/04-hosting/a2a/agent_framework_to_a2a.py +++ b/python/samples/04-hosting/a2a/agent_framework_to_a2a.py @@ -51,7 +51,7 @@ agent = Agent( client=OpenAIChatClient(), name="Europe Travel Agent", - instructions="You are a helpful Europe Travel Agent. You can help users search and book flights and hotels across Europe." + instructions="You are a helpful Europe Travel Agent. You can help users search and book flights and hotels across Europe.", ) request_handler = DefaultRequestHandler( diff --git a/python/samples/04-hosting/a2a/requirements.txt b/python/samples/04-hosting/a2a/requirements.txt new file mode 100644 index 0000000000..fe6e43a138 --- /dev/null +++ b/python/samples/04-hosting/a2a/requirements.txt @@ -0,0 +1,23 @@ +# Agent Framework packages +# To use the deployed version, uncomment the lines below and comment out the local installation lines +# agent-framework-a2a +# agent-framework-foundry + +# Local installation (for development and testing) +# Each package must be listed explicitly because pip doesn't resolve uv workspace sources. +# Without explicit entries, pip would fetch transitive dependencies from PyPI instead of local source. +-e ../../../packages/core # Core framework - base dependency for all packages +-e ../../../packages/foundry # Foundry support - dependency for FoundryChatClient in a2a_server.py +-e ../../../packages/a2a # A2A integration - provides A2AAgent and a2a-sdk + +# Azure authentication +azure-identity + +# A2A server runtime +uvicorn + +# HTTP client used by A2A client samples +httpx + +# Environment variable loading +python-dotenv