API Dokumentation
ZVV Info — KI-gestützte Fahrplan-Auskunft für den Schweizer ÖV
ZVV Info ist eine KI-gestützte Fahrplan-Auskunft für den gesamten Schweizer öffentlichen Verkehr. Nutzer können per Text oder Sprache Fragen zu Fahrplänen, Haltestellen, Abfahrten und Verbindungen stellen.
Im Hintergrund verbindet sich die App über das Model Context Protocol (MCP) mit dem GTFS-Backend, das den gesamten Schweizer ÖV-Fahrplan als SQLite-Datenbank bereitstellt. Das LLM entscheidet selbstständig, welche Datenabfragen nötig sind, führt sie aus und präsentiert die Ergebnisse in einer nutzerfreundlichen Form.
Fragen wie "Wann fährt der nächste Zug ab Zürich HB?" werden vom LLM verstanden und beantwortet.
Mikrofon-Button für Voice-to-Text via OpenAI Whisper oder Browser Speech API.
Echtzeit-Modellwechsel zwischen Claude, GPT und lokalen LLMs (LM Studio).
Alle Daten kommen live vom GTFS-Backend — kein veraltetes Training, sondern aktuelle Abfragen.
Das LLM ruft automatisch die richtigen Tools auf: Haltestellensuche, Abfahrten, SQL-Queries.
Nach jeder Antwort werden kontextbezogene, klickbare Folgefragen vorgeschlagen.
Echtzeit-Statistiken: TTFT, Tokens/s, Latenz, Tool-Calls — für jede Anfrage.
Fragen per URL-Parameter vorausfüllen und automatisch absenden.
Die App folgt einer drei-schichtigen Architektur: Frontend → LLM-Backend → MCP-Datenserver.
Die App nutzt das Model Context Protocol (MCP) über @ai-sdk/mcp, um sich dynamisch mit Datenquellen zu verbinden. Tools werden nicht fest verdrahtet, sondern beim Serverstart vom MCP-Backend abgerufen.
| Backend | URL | Transport | Beschreibung |
|---|---|---|---|
| Schweizer ÖV-Fahrplan | gtfs.zvv.dev/mcp | StreamableHTTP | Haltestellen, Linien, Abfahrten, Fahrpläne (GTFS) |
| Tool | Beschreibung |
|---|---|
| search_stops | Textsuche nach Haltestellen (Name, Limit) |
| get_routes | Linien filtern nach Typ und/oder Agency |
| get_departures | Abfahrten ab einer Haltestelle (Stop-ID, Datum, Uhrzeit) |
| get_trip_details | Alle Halte einer bestimmten Fahrt |
| get_agencies | Alle Verkehrsunternehmen auflisten |
| query_gtfs | Freie SQL-SELECT-Abfrage auf die GTFS-Datenbank |
Das Modell kann in Echtzeit gewechselt werden — ohne Neuladen der Seite. Die Auswahl wird pro Request an den Server gesendet.
| Provider | Modelle | Hinweise |
|---|---|---|
| Anthropic | Claude Haiku 4.5, Claude Sonnet 4.5 | Standard. Exzellentes Tool-Calling. |
| OpenAI | GPT-4o, GPT-4o Mini | Auch für Voice Realtime API. |
| LM Studio (lokal) | Qwen3, Gemma, Llama, Mistral u.a. | Nur geladene Modelle wählbar. Chat Completions API. |
Konfiguration: Modelle werden über Env-Variablen gesteuert:
MAIN_MODEL — Standard-Modell (Default: claude-haiku-4-5)ANTHROPIC_API_KEY — Aktiviert Anthropic-ModelleOPENAI_API_KEY — Aktiviert OpenAI-Modelle + VoiceLMSTUDIO_BASE_URL + LMSTUDIO_API_KEY — LM Studio VerbindungDie App bietet einen Mikrofon-Button für Spracheingabe. Das Audio wird transkribiert und als Text-Nachricht gesendet.
| Methode | Voraussetzung | Qualität |
|---|---|---|
| OpenAI Whisper API | OPENAI_API_KEY gesetzt | Hoch (Server-seitig) |
| Browser Speech API | Kein API-Key nötig | Mittel (Browser-abhängig) |
Fragen können per URL-Parameter vorausgefüllt und automatisch abgesendet werden:
| URL | Beschreibung |
|---|---|
| /?text=Nächste Abfahrten ab Zürich HB | Abfahrten abfragen |
| /?text=Verbindung von Bern nach Luzern | Verbindungssuche |
| /?text=Welche Tramlinien gibt es in Zürich? | Linien-Info |
| /?text=Wo hält die S8? | Haltestellensuche |
| /docs | Diese Dokumentation |
| Endpoint | Methode | Beschreibung |
|---|---|---|
| / | GET | Chat-Frontend |
| /docs | GET | Dokumentation (diese Seite) |
| /api/chat | POST | Chat-Completion mit LLM + MCP Tools |
| /api/models | GET | Verfügbare LLM-Modelle + Loaded-Status |
| /api/health | GET | Backend-Health-Check (MCP-Verbindungen) |
| /api/debug | GET | Debug-Info (Environment, Backends, Tools) |
Die rechte Seitenleiste zeigt Echtzeit-Metriken für jeden LLM-Request:
TTFTTime To First Token — Latenz bis das erste Token vom LLM ankommtTok/sGeschätzte Token-Generierungsrate (Tokens pro Sekunde)ElapsedGesamtdauer des Requests (Submit → Complete)StreamDauer der Token-Generierung (First Token → Complete)CharsZeichenanzahl der generierten AntwortToolsAnzahl der Tool-Calls im RequestZusätzlich zeigt das Panel: Environment-Info (Node.js, Next.js, AI SDK Versionen), Backend-Status mit Latenz, und eine History der letzten 20 Requests.
| Komponente | Technologie |
|---|---|
| Framework | Next.js 15 (App Router) |
| UI | React 19, Tailwind CSS 4 |
| AI Integration | Vercel AI SDK 6 (@ai-sdk/react, @ai-sdk/anthropic, @ai-sdk/openai) |
| MCP Client | @ai-sdk/mcp (StreamableHTTP Transport) |
| LLM Providers | Anthropic (Claude), OpenAI (GPT), LM Studio (lokale Modelle) |
| Sprache | OpenAI Whisper API / Browser Speech API |
| Markdown | react-markdown + remark-gfm |
| Icons | Lucide React |
| Deployment | Vercel (Serverless) |
| Datenquelle | GTFS Schweiz via MCP (gtfs.zvv.dev) |
| Sprache | TypeScript 5.7 |
Die Fahrplandaten stammen von opentransportdata.swiss und unterliegen den Nutzungsbedingungen von opendata.swiss. Die App selbst ist Open Source.