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>
121 lines
3.6 KiB
Python
121 lines
3.6 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import argparse
|
|
import os
|
|
import sys
|
|
|
|
import uvicorn
|
|
from a2a.server.apps.jsonrpc.starlette_app import A2AStarletteApplication
|
|
from a2a.server.request_handlers.default_request_handler import DefaultRequestHandler
|
|
from a2a.server.tasks.inmemory_task_store import InMemoryTaskStore
|
|
from agent_definitions import AGENT_CARD_FACTORIES, AGENT_FACTORIES
|
|
from agent_executor import AgentFrameworkExecutor
|
|
from agent_framework.foundry import FoundryChatClient
|
|
from azure.identity import AzureCliCredential
|
|
from dotenv import load_dotenv
|
|
|
|
# Load environment variables from .env file
|
|
load_dotenv()
|
|
|
|
"""
|
|
A2A Server Sample — Host an Agent Framework agent as an A2A endpoint
|
|
|
|
This sample creates a Python-based A2A-compliant server that wraps an Agent
|
|
Framework agent. The server uses the a2a-sdk's Starlette application to handle
|
|
JSON-RPC requests and serves the AgentCard at /.well-known/agent.json.
|
|
|
|
Three agent types are available:
|
|
- invoice — Answers invoice queries using mock data and function tools.
|
|
- policy — Returns a fixed policy response.
|
|
- logistics — Returns a fixed logistics response.
|
|
|
|
Usage:
|
|
uv run python a2a_server.py --agent-type policy --port 5001
|
|
uv run python a2a_server.py --agent-type invoice --port 5000
|
|
uv run python a2a_server.py --agent-type logistics --port 5002
|
|
|
|
Environment variables:
|
|
FOUNDRY_PROJECT_ENDPOINT — Your Azure AI Foundry project endpoint
|
|
FOUNDRY_MODEL — Model deployment name (e.g. gpt-4o)
|
|
"""
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser(description="A2A Agent Server")
|
|
parser.add_argument(
|
|
"--agent-type",
|
|
choices=["invoice", "policy", "logistics"],
|
|
default="policy",
|
|
help="Type of agent to host (default: policy)",
|
|
)
|
|
parser.add_argument(
|
|
"--host",
|
|
default="localhost",
|
|
help="Host to bind to (default: localhost)",
|
|
)
|
|
parser.add_argument(
|
|
"--port",
|
|
type=int,
|
|
default=5001,
|
|
help="Port to listen on (default: 5001)",
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def main() -> None:
|
|
args = parse_args()
|
|
|
|
# Validate environment
|
|
project_endpoint = os.getenv("FOUNDRY_PROJECT_ENDPOINT")
|
|
deployment_name = os.getenv("FOUNDRY_MODEL")
|
|
|
|
if not project_endpoint:
|
|
print("Error: FOUNDRY_PROJECT_ENDPOINT environment variable is not set.")
|
|
sys.exit(1)
|
|
if not deployment_name:
|
|
print("Error: FOUNDRY_MODEL environment variable is not set.")
|
|
sys.exit(1)
|
|
|
|
# Create the LLM client
|
|
credential = AzureCliCredential()
|
|
client = FoundryChatClient(
|
|
project_endpoint=project_endpoint,
|
|
model=deployment_name,
|
|
credential=credential,
|
|
)
|
|
|
|
# Create the Agent Framework agent for the chosen type
|
|
agent_factory = AGENT_FACTORIES[args.agent_type]
|
|
agent = agent_factory(client)
|
|
|
|
# Build the A2A server components
|
|
url = f"http://{args.host}:{args.port}/"
|
|
agent_card = AGENT_CARD_FACTORIES[args.agent_type](url)
|
|
executor = AgentFrameworkExecutor(agent)
|
|
task_store = InMemoryTaskStore()
|
|
request_handler = DefaultRequestHandler(
|
|
agent_executor=executor,
|
|
task_store=task_store,
|
|
)
|
|
|
|
a2a_app = A2AStarletteApplication(
|
|
agent_card=agent_card,
|
|
http_handler=request_handler,
|
|
)
|
|
|
|
print(f"Starting A2A server: {agent_card.name}")
|
|
print(f" Agent type : {args.agent_type}")
|
|
print(f" Listening : {url}")
|
|
print(f" Agent card : {url}.well-known/agent.json")
|
|
print()
|
|
|
|
uvicorn.run(
|
|
a2a_app.build(),
|
|
host=args.host,
|
|
port=args.port,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|