Appearance
Microsoft Agent Framework (MAF) Orchestration Design
Overview
This document outlines the design for reimplementing the orchestration layer of the Azure AI Travel Agents application using the Microsoft Agent Framework (MAF) Python SDK.
Background
Current Implementation
The current orchestration layer uses:
- Framework: LlamaIndex.TS
- Language: TypeScript/Node.js
- Location:
packages/api-llamaindex-ts/src/ - Pattern: Multi-agent workflow with triage agent as root
New Implementation Goals
Migrate to Microsoft Agent Framework to:
- Leverage MAF's native agent orchestration capabilities
- Use Python ecosystem for AI/ML workflows
- Utilize MAF's workflow patterns and best practices
- Improve integration with Azure AI services
- Enable better agent coordination and state management
Architecture Design
High-Level Architecture
┌─────────────────────────────────────────────────────────────┐
│ Frontend (Angular) │
└─────────────────────────┬───────────────────────────────────┘
│ HTTP/SSE
┌─────────────────────────▼───────────────────────────────────┐
│ Python API Server (FastAPI) │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ MAF Orchestration Layer │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ MAF Workflow Engine │ │ │
│ │ │ - Multi-agent coordination │ │ │
│ │ │ - State management │ │ │
│ │ │ - Agent handoff orchestration │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ MAF Agents │ │ │
│ │ │ - Triage Agent (root) │ │ │
│ │ │ - Customer Query Agent │ │ │
│ │ │ - Destination Recommendation Agent │ │ │
│ │ │ - Itinerary Planning Agent │ │ │
│ │ │ - Echo Ping Agent │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ MCP Client Integration │ │ │
│ │ │ - HTTP MCP Client │ │ │
│ │ │ - SSE MCP Client │ │ │
│ │ │ - Tool Registry │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────┬───────────────────────────────────┘
│ MCP Protocol
┌─────────────────────────▼───────────────────────────────────┐
│ MCP Tool Servers │
│ (Customer Query, Destination, Itinerary, Code Eval, etc.) │
└───────────────────────────────────────────────────────────────┘Component Design
1. MAF Workflow Engine
- Purpose: Orchestrate multi-agent workflows
- Responsibilities:
- Coordinate agent execution
- Manage workflow state
- Handle agent-to-agent communication
- Implement parallel and sequential execution patterns
- Error handling and recovery
2. MAF Agents
Each agent will be implemented as a MAF agent with:
- Configuration: Agent name, system prompt, capabilities
- Tools: MCP tools specific to the agent's domain
- LLM Integration: Azure OpenAI connection
- State Management: Conversation context and history
Agent Definitions:
Triage Agent (Root Agent)
- Role: Route queries to appropriate specialized agents
- Tools: Access to all available tools for context
- Handoff: Can delegate to any specialized agent
Customer Query Agent
- Role: Understand customer preferences and requirements
- Tools: Customer query analysis tools (MCP server)
Destination Recommendation Agent
- Role: Suggest travel destinations
- Tools: Destination recommendation tools (MCP server)
Itinerary Planning Agent
- Role: Create detailed travel itineraries
- Tools: Itinerary planning tools (MCP server)
Echo Ping Agent
- Role: Echo back input for testing
- Tools: Echo ping tools (MCP server)
3. MCP Client Integration
HTTP MCP Client:
- Support for HTTP-based MCP tool servers
- Request/response handling
- Retry logic with exponential backoff
- Error handling
SSE MCP Client:
- Support for Server-Sent Events based MCP servers
- Streaming response handling
- Connection management
Tool Registry:
- Centralized tool configuration
- Dynamic tool loading based on selected tools
- Tool metadata and capabilities
Workflow Patterns
1. Sequential Workflow
python
# Example: Customer Query → Destination → Itinerary
async def sequential_travel_planning(user_query: str):
# Step 1: Understand customer preferences
preferences = await customer_query_agent.process(user_query)
# Step 2: Get destination recommendations
destinations = await destination_agent.process(preferences)
# Step 3: Create itinerary
itinerary = await itinerary_agent.process({
"destinations": destinations,
"preferences": preferences
})
return itinerary2. Parallel Workflow
python
# Example: Get destination recommendations and current travel data in parallel
async def parallel_travel_research(preferences: dict):
# Execute multiple agents in parallel
results = await asyncio.gather(
destination_agent.process(preferences),
)
return {
"recommendations": results[0],
"current_data": results[1]
}3. Conditional Workflow
python
# Example: Route based on query type
async def conditional_routing(user_query: str):
# Triage agent determines the workflow
intent = await triage_agent.analyze_intent(user_query)
if intent.type == "destination_search":
return await destination_agent.process(user_query)
elif intent.type == "itinerary_planning":
return await itinerary_agent.process(user_query)
else:
return await triage_agent.process(user_query)Implementation Plan
Directory Structure
src/
├── api/ # Existing TypeScript API (to be maintained or replaced)
└── api-python/ # New Python API with MAF
├── pyproject.toml # Python project configuration
├── Dockerfile # Container configuration
├── .env.sample # Environment variables template
├── src/
│ ├── __init__.py
│ ├── main.py # FastAPI application entry point
│ ├── config.py # Configuration management
│ ├── orchestrator/ # MAF orchestration layer
│ │ ├── __init__.py
│ │ ├── workflow.py # Workflow engine implementation
│ │ ├── agents/ # Agent implementations
│ │ │ ├── __init__.py
│ │ │ ├── base.py # Base agent class
│ │ │ ├── triage_agent.py
│ │ │ ├── customer_query_agent.py
│ │ │ ├── destination_agent.py
│ │ │ ├── itinerary_agent.py
│ │ │ └── echo_agent.py
│ │ └── tools/ # MCP tool integration
│ │ ├── __init__.py
│ │ ├── mcp_client.py # MCP client base
│ │ ├── http_client.py # HTTP MCP client
│ │ ├── sse_client.py # SSE MCP client
│ │ └── tool_registry.py # Tool configuration
│ ├── api/ # FastAPI routes and endpoints
│ │ ├── __init__.py
│ │ ├── chat.py # Chat endpoint
│ │ ├── tools.py # Tools endpoint
│ │ └── health.py # Health check endpoint
│ └── utils/ # Utility functions
│ ├── __init__.py
│ ├── telemetry.py # OpenTelemetry setup
│ └── streaming.py # SSE streaming utilities
└── tests/ # Test files
├── __init__.py
├── test_agents.py
├── test_workflow.py
└── test_api.pyTechnology Stack
Core Dependencies:
agent-framework- Microsoft Agent Framework Python SDKfastapi- Web framework for APIuvicorn- ASGI serverpydantic- Data validationhttpx- HTTP client for MCPsse-starlette- Server-Sent Events supportopentelemetry-api- Observabilityopentelemetry-sdk- Telemetry SDKazure-identity- Azure authenticationazure-ai-projects- Azure AI integrationpython-dotenv- Environment management
Configuration
Environment Variables:
txt
# Azure OpenAI Configuration
AZURE_OPENAI_ENDPOINT=
AZURE_OPENAI_API_KEY=
AZURE_OPENAI_DEPLOYMENT=
AZURE_OPENAI_API_VERSION=
# MCP Server URLs
MCP_CUSTOMER_QUERY_URL=
MCP_DESTINATION_RECOMMENDATION_URL=
MCP_ITINERARY_PLANNING_URL=
MCP_ECHO_PING_URL=
MCP_ECHO_PING_ACCESS_TOKEN=
# Server Configuration
PORT=4000
LOG_LEVEL=INFO
# Telemetry
OTLP_ENDPOINT=
OTEL_SERVICE_NAME=api-pythonMigration Strategy
Phase 1: Parallel Deployment
- Deploy new Python API alongside existing TypeScript API
- Use feature flags or separate endpoints for testing
- Gradually migrate traffic to Python API
Phase 2: Integration Testing
- Validate all agent workflows
- Test MCP tool integration
- Performance benchmarking
- End-to-end testing with UI
Phase 3: Full Migration
- Update UI to point to new Python API
- Update Docker Compose configuration
- Update Azure deployment configurations
- Deprecate TypeScript API (or keep for backup)
Best Practices from MAF
1. Agent Design
- Keep agents focused on specific tasks
- Use clear system prompts
- Implement proper error handling
- Add telemetry and logging
2. Workflow Design
- Design workflows for observability
- Implement retry and fallback strategies
- Use async/await for concurrent operations
- Maintain conversation context
3. Tool Integration
- Validate tool inputs and outputs
- Implement timeout handling
- Add circuit breaker patterns for external services
- Cache responses when appropriate
4. State Management
- Use MAF's built-in state management
- Implement proper session handling
- Track conversation history
- Manage workflow context
5. Observability
- Instrument all agents and workflows
- Use structured logging
- Implement distributed tracing
- Monitor performance metrics
Testing Strategy
Unit Tests
- Test individual agent implementations
- Test MCP client implementations
- Test workflow logic
Integration Tests
- Test agent-to-agent handoffs
- Test MCP tool integration
- Test workflow orchestration
End-to-End Tests
- Test complete user workflows
- Test streaming responses
- Test error scenarios
- Test concurrent requests
Performance Considerations
Optimization Strategies
- Connection Pooling: Reuse HTTP connections to MCP servers
- Caching: Cache tool responses and agent outputs where appropriate
- Parallel Execution: Use asyncio for concurrent agent operations
- Streaming: Implement streaming responses for better UX
- Resource Management: Proper cleanup of connections and resources
Monitoring Metrics
- Request latency
- Agent execution time
- MCP tool call latency
- Error rates
- Concurrent request handling
Security Considerations
Authentication & Authorization
- Secure API endpoints
- Validate MCP tool access
- Implement rate limiting
- Use Azure Managed Identity where possible
Data Protection
- Sanitize user inputs
- Validate tool outputs
- Implement proper error messages (no sensitive data)
- Secure configuration management
Conclusion
This design provides a comprehensive approach to reimplementing the orchestration layer using Microsoft Agent Framework. The modular architecture allows for incremental migration and testing, ensuring a smooth transition from the current LlamaIndex.TS implementation.
