A distributed, multi-agent ski resort system built with Microsoft Agent Framework (MAF), Azure AI Foundry, the A2A protocol, Voice Live, and Aspire.
An AI-powered ski resort concierge that coordinates weather intelligence, lift traffic, safety evaluation, personalized coaching, web-backed ski research, and voice conversations through a network of specialist agents β all orchestrated by hosted advisor experiences and displayed on a real-time dashboard.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Frontend (Vite + React) β
β Dashboard data + chat via Responses + voice via WS β
ββββββββββββββββ¬βββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β REST β Responses API / WebSocket
βΌ βΌ
ββββββββββββββββββββββββ ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ
β Data Generator β β Advisor Agent (.NET) β β Voice Advisor Agent (.NET)β
β (Python/FastAPI) β β Foundry hosted Responses β β Voice Live WebSocket β
ββββββββββββ¬ββββββββββββ ββββββββββββββ¬ββββββββββββββ ββββββββββββββ¬ββββββββββββββ
β β β
β A2A + Foundry tools A2A + Foundry tools
β β β
βΌ βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Shared specialist/research tools β
βββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββββββ€
β Weather β Lift Trafficβ Safety β Ski Coach β Ski Researcher β
β Agent β Agent β Agent β Agent β Foundry Prompt β
β (Python) β (.NET) β (Python) β (Python) β Agent + Web Search β
βββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββββββ
| Component | Language | Role |
|---|---|---|
| Advisor Agent | .NET | Foundry-hosted Responses orchestrator β routes chat questions to A2A specialists and the Ski Researcher prompt agent |
| Voice Advisor Agent | .NET | Voice Live WebSocket bridge β provides spoken conversations and invokes the same specialist/research tools |
| Weather Agent | Python | Current conditions, forecasts, storm alerts |
| Lift Traffic Agent | .NET | Lift status, wait times, congestion analysis |
| Safety Agent | Python | Risk evaluation, slope safety, closures |
| Ski Coach Agent | Python | Personalized slope recommendations, day plans |
| Ski Researcher Agent | Azure AI Foundry prompt agent | Web-search-backed general skiing research and background information |
| Data Generator | Python | Continuously generates synthetic resort telemetry |
| Frontend | React/Vite | Real-time dashboard with AI chat and voice controls |
- .NET 10 SDK
- Python 3.11+
- uv (Python package manager)
- Node.js 20+
- .NET Aspire CLI
- An Azure AI Foundry resource with a
gpt-4.1(or similar) deployment - Azure CLI authenticated (
az login)
Refer to the official Aspire documentation for installation instructions.
git clone https://github.com/tommasodotNET/ski-resort-demo.git
cd ski-resort-demoEdit src/apphost.settings.Development.json with your Azure details:
{
"Azure": {
"TenantId": "<your-tenant-id>",
"SubscriptionId": "<your-subscription-id>",
"AllowResourceGroupCreation": true,
"ResourceGroup": "<your-resource-group>",
"Location": "<your-azure-region>",
"CredentialSource": "AzureCli"
}
}Note: The Azure AI Foundry resource must have a chat completion model deployed (e.g.,
gpt-4.1). The deployment name is configured in the Aspire AppHost.
From the src/ directory:
cd src
aspire runThis single command starts all services:
- 3 .NET agents/services (advisor + lift traffic + voice advisor)
- 3 Python agents (weather + safety + ski coach)
- 1 Azure AI Foundry prompt agent (ski researcher with web search)
- Data generator (Python/FastAPI)
- Frontend (Vite dev server)
- Cosmos DB emulator
Open the Aspire dashboard (URL shown in terminal output) to see all services, logs, and distributed traces.
The frontend will be available at the URL assigned by Aspire (shown in the dashboard).
src/
βββ apphost.cs # Aspire orchestration (all services wired here)
βββ apphost.settings.Development.json # Azure configuration
βββ advisor-agent-dotnet/ # .NET hosted Responses advisor agent
βββ voice-advisor-agent/ # .NET Voice Live WebSocket advisor
βββ lift-traffic-agent-dotnet/ # .NET lift traffic agent (A2A)
βββ weather-agent-python/ # Python weather agent (A2A)
βββ safety-agent-python/ # Python safety agent (A2A)
βββ ski-coach-agent-python/ # Python ski coach agent (A2A)
βββ data-generator/ # Python FastAPI data generator
βββ frontend/ # Vite + React + Tailwind dashboard
βββ shared-services/ # .NET shared library (Cosmos, thread store)
βββ service-defaults/ # Aspire service defaults
The data generation speed and drift magnitudes are configurable via src/data-generator/data_generator/config.json:
{
"update_interval_seconds": { "min": 5, "max": 10 },
"weather": { "temperature_drift": 0.1, "wind_speed_drift": 0.5, ... },
"lifts": { "queue_drift": 3, "status_change_probability": 0.002 },
...
}The dashboard polling interval is configurable via src/frontend/public/config.json:
{
"pollingIntervalMs": 10000
}Changes are picked up automatically without restarting.
-
Data Generator continuously produces synthetic weather, lift, slope, and safety telemetry via a REST API.
-
Specialist agents (weather, lift, safety, coach) each wrap specific tools using MAF and expose them over the A2A protocol. Each agent calls the data generator's API to fetch current conditions.
-
Ski Researcher Agent is an Azure AI Foundry prompt agent with a web search tool. It handles general skiing questions that are not tied to live resort telemetry.
-
Advisor Agent is the chat orchestrator. It is published as a Foundry-hosted Responses agent, registers the A2A specialist agents and Ski Researcher as tools, and selectively invokes only the relevant tools based on the user's question.
-
Voice Advisor Agent bridges browser audio to Azure AI Voice Live over WebSockets. Voice Live can call the same A2A specialist agents and Ski Researcher prompt agent as function tools during a spoken conversation.
-
Frontend displays real-time data panels (weather, lifts, slopes, safety) by polling the data generator, provides an AI chat panel backed by the advisor's Responses endpoint, and offers voice conversations through the voice advisor WebSocket.
- Microsoft Agent Framework (MAF) β Agent creation, tool registration, and orchestration
- Azure AI Voice Live β Realtime speech-to-speech voice conversations
- A2A Protocol β Agent-to-agent communication over JSON-RPC + SSE streaming
- Aspire β Distributed app orchestration, service discovery, observability
- Azure AI Foundry β LLM backend, hosted Responses agent, prompt agent, web search, and realtime deployment
- Vite + React β Frontend dashboard
- Azure Cosmos DB β Conversation thread persistence
See ARCHITECTURE.md for the detailed system architecture document.