Skip to content

tommasodotNET/ski-resort-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

67 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ”οΈ AlpineAI – Multi-Agent Ski Resort Demo

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.

.NET Python Aspire React

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         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

Prerequisites

Install Aspire CLI

Refer to the official Aspire documentation for installation instructions.

Setup

1. Clone the repository

git clone https://github.com/tommasodotNET/ski-resort-demo.git
cd ski-resort-demo

2. Configure Azure settings

Edit 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.

3. Run the application

From the src/ directory:

cd src
aspire run

This 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).

Project Structure

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

Configuration

Data Generator

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 },
  ...
}

Frontend

The dashboard polling interval is configurable via src/frontend/public/config.json:

{
  "pollingIntervalMs": 10000
}

Changes are picked up automatically without restarting.

How It Works

  1. Data Generator continuously produces synthetic weather, lift, slope, and safety telemetry via a REST API.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

Key Technologies

Further Reading

See ARCHITECTURE.md for the detailed system architecture document.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors