Ein öffentlicher Test-Chat für mittwald AI-Hosting: mehrere Sprachmodelle ausprobieren, Bilder senden, Spracheingabe nutzen — ohne Login, wie bei einer Demo-Instanz von ChatGPT.
- OpenAI-kompatible API von mittwald (
https://llm.aihosting.mittwald.de/v1) - Chatverlauf nur im Browser (localStorage), nicht auf dem Server
- API-Key nur serverseitig — Besucher brauchen keinen eigenen Key
- Rate-Limits schützen vor Missbrauch (konfigurierbar in
.env)
Beta: Funktionen und Modellangebot können sich ändern. Für öffentliche Test-Instanzen: Modell-Allowlist und Rate-Limits bewusst setzen — siehe Öffentlich betreiben.
Repository: github.com/maikbehring/chatmittwaldai
| Zielgruppe | Nutzung |
|---|---|
| Interessierte / Tester | URL öffnen und kurz ausprobieren — kein Account, kein eigener API-Key. |
| Entwickler & Admins | Repo klonen, mit eigenem mittwald API-Key betreiben (lokal oder auf mittwald Container Hosting). |
| mittwald-Kunden | Eigene Playground-Instanz als Demo für AI-Hosting; Modellliste und Limits per Konfiguration steuern. |
- Mehrere Chats in der Sidebar (Verlauf pro Thread im Browser, „Neuer Chat“)
- Use Cases — vorgefertigte Workflows (Alt-Tags, SEO, LinkedIn, Recherche, OCR, Modellvergleich, …) mit Briefing-Feldern und Spracheingabe
- Chat mit Streaming-Antworten (Markdown, Code, Kopieren-Buttons)
- Modellauswahl inkl. Modellübersicht, Modellvergleich und Einstellungen (Temperatur, System-Prompt, …)
- Websuche (optional, pro Chat): Globus am Eingabefeld, einmalige Einwilligung — Standard DuckDuckGo; optional Google via SerpAPI oder Serper
- Footer-Links (Impressum, Datenschutz, …) per
.envkonfigurierbar - Bilder im Chat (Vision-Modelle) und PDF-Rechnungs-OCR (GLM-OCR + Qwen)
- Spracheingabe (Whisper über mittwald, z. B.
whisper-large-v3-turbo) - Geschätzte Token-Statistik und CO₂-Hinweis pro Antwort (Orientierungswerte)
- Dark Mode, mobile UX, Tastatur: Enter senden, Shift+Enter Zeilenumbruch
Den Playground selbst betreiben oder lokal testen kannst du nur mit einem gültigen API-Key von mittwald AI Hosting. Den Key bekommst du nicht über dieses Repository — du brauchst ein gebuchtes AI-Hosting-Paket:
- AI Hosting buchen — Tarife ab dem Starter-Paket (DSGVO-konform in Deutschland gehostet, OpenAI-kompatible API, u. a. Qwen, gpt-oss, Devstral, Ministral, Whisper).
- Im mStudio Organisation anlegen und AI Hosting aktivieren.
- Unter AI Hosting → API-Keys einen Key erzeugen und in
.envalsMITTWALD_AI_API_KEYeintragen.
Ohne eigenes Hosting kannst du trotzdem eine öffentliche Playground-Instanz nutzen, wenn jemand sie für dich hostet — dann brauchst du keinen Key, nur die URL.
Technische Details: Developer-Dokumentation AI-Hosting.
- Node.js 18+ (nodejs.org)
- mittwald API-Key (siehe Abschnitt AI Hosting bei mittwald)
git clone https://github.com/maikbehring/chatmittwaldai.git
cd chatmittwaldai
cp .env.example .env
# In .env: MITTWALD_AI_API_KEY eintragen
npm install
npm run dev| Dienst | URL |
|---|---|
| Oberfläche | http://localhost:5173 |
| API-Proxy | http://localhost:8787 |
Der Vite-Dev-Server leitet /api an den Proxy weiter. PORT in .env gilt für beide.
npm install
npm run build # erzeugt client/dist
npm run start # Server + statisches FrontendStandard-Port: 8787 (PORT in .env). Für öffentliche URLs: Reverse-Proxy mit TLS davor; TRUST_PROXY=1 setzen, wenn Client-IPs für Rate-Limits wichtig sind.
Für eine öffentliche URL (z. B. https://playground.mittwald.de/ai) liegt im Repo ein Dockerfile — Build und Start in einem Prozess (Express + client/dist). Der Playground ist für den Unterpfad /ai konfiguriert (VITE_APP_BASE_PATH=/ai/ im Build, PLAYGROUND_BASE_PATH=/ai im Server).
Kurzablauf:
- AI Hosting + Container Hosting (Server-Projekt) im mStudio
- Registry anlegen, API-Token für die CLI holen
.env.productionanlegen (Secrets, keinPORT) — siehe .env.example- Deploy:
export MITTWALD_API_TOKEN="…"
export DOCKER_DEFAULT_PLATFORM=linux/amd64 # Pflicht auf Apple Silicon
mw experimental deploy \
--project-id <PROJECT_ID> \
--env-file .env.production \
--uri-prefix ki-playground \
--wait- Im mStudio Ports: 80 → 3000 (intern lauscht die App auf 3000)
CORS_ORIGIN= exakte HTTPS-URL(s) der Instanz- Healthcheck:
https://<prefix>.mittwald.app/api/health
Ausführliche Anleitung, Fehlerbehebung (502, Origin, Registry): docs/mittwald-deploy.md
Weitere Doku: Rechnungs-OCR-Ablauf · Security Hardening
Alle Variablen sind in .env.example dokumentiert. Wichtigste:
| Variable | Beschreibung |
|---|---|
MITTWALD_AI_API_KEY |
Pflicht — Key aus dem mStudio (Server → mittwald KI; nicht der Zugangsschutz für Besucher) |
PLAYGROUND_ALLOWED_MODELS |
Kommagetrennte Modell-IDs; nur diese erscheinen im UI. Für öffentliche Instanzen unbedingt setzen und bewusst kürzen. |
PLAYGROUND_BRAND_TITLE |
Anzeigename (optional) |
PLAYGROUND_LINK_*_URL / *_LABEL |
Footer- & Sidebar-Links (Impressum, Datenschutz, …) — siehe Footer- & Rechts-Links |
CORS_ORIGIN |
Erlaubte Browser-Origins (z. B. https://ki-playground.mittwald.app). In Produktion nicht *; http und https getrennt eintragen wenn nötig. |
TRUST_PROXY |
1 hinter nginx/Reverse-Proxy (Rate-Limits, Origin-Check) |
PLAYGROUND_APP_API_KEY |
Optional — nur für interne Instanzen; für öffentliche Demos ohne Login in der Regel nicht setzen |
REQUIRE_ORIGIN_CHECK |
Standard 1: erzwingt Origin-Check auf kostenintensiven POST-Routen (mit 0 deaktivierbar) |
RATE_LIMIT_* |
Schutz vor Missbrauch (global, Chat, Modellliste, Transkription, Websuche) |
PLAYGROUND_MAX_MESSAGES |
Max. Nachrichten pro Request (Standard: 60) |
PLAYGROUND_WHISPER_* |
Spracheingabe (Modell, Sprache, max. Audio-Größe) |
WEB_SEARCH_PROVIDER |
duckduckgo (Standard), serpapi (Google) oder serper (Google) |
WEB_SEARCH_SERPAPI_API_KEY |
Bei serpapi — Key aus dem SerpAPI Dashboard |
WEB_SEARCH_SERPER_API_KEY |
Bei serper — Key von serper.dev |
WEB_SEARCH_GOOGLE_GL / HL / LOCATION |
Optional Region/Sprache für Google (z. B. de, Germany) |
WEB_SEARCH_MAX_RESULTS |
Treffer pro Anfrage (Standard: 5) |
WEB_SEARCH_QUERY_MODEL |
Optional: mittwald-Modell-ID für Kurz-Google-Query aus Chat-Auszug (sonst erstes PLAYGROUND_ALLOWED_MODELS; kostet 1 zusätzliche LLM-Anfrage pro Websuche) |
RATE_LIMIT_MAX_WEB_SEARCH |
Rate-Limit für POST /api/web/search (Standard: 30 pro Fenster) |
RATE_LIMIT_MAX_GLOBAL |
Globales Rate-Limit für alle /api/*-Routen (Standard: 300 pro Fenster) |
Für einen öffentlichen Test ohne Login (ChatGPT-ähnlich) reichen Rate-Limits und Modell-Allowlist — PLAYGROUND_APP_API_KEY ist dafür nicht nötig.
Optional (z. B. interne Instanzen): PLAYGROUND_APP_API_KEY setzen; dann muss der Client den Header x-playground-api-key mitschicken (401 bei Fehlen).
Zusätzlich erzwingt der Server standardmäßig einen Origin-Check für Chat-, Transkriptions- und Websuche-Routen (REQUIRE_ORIGIN_CHECK=1). Hinter einem Reverse-Proxy mit TRUST_PROXY=1 gilt auch der Host-Match der Request-URL.
Wichtig für Produktion:
- Verwende eine explizite CORS-Allowlist via
CORS_ORIGIN. - Starte nicht mit Wildcard-CORS (
*) inNODE_ENV=production— der Server beendet sich in diesem Fall absichtlich mit Fehler.
Anbieter (Server, .env):
| Modus | Konfiguration | Hinweis |
|---|---|---|
| DuckDuckGo | Standard, kein Key | Kostenlos; kann bei hoher Last blockieren |
| Google (SerpAPI) | WEB_SEARCH_PROVIDER=serpapi + WEB_SEARCH_SERPAPI_API_KEY |
Empfohlen für stabile Google-Ergebnisse (Dashboard) |
| Google (Serper) | WEB_SEARCH_PROVIDER=serper + WEB_SEARCH_SERPER_API_KEY |
Alternative zu SerpAPI |
Optional: WEB_SEARCH_GOOGLE_GL, WEB_SEARCH_GOOGLE_HL, WEB_SEARCH_GOOGLE_LOCATION für deutschsprachige Treffer.
Bedienung im UI (analog früherer ChatGPT-Websuche):
- Globus neben dem Eingabefeld antippen → Websuche für diesen Chat an (blau) / erneut antippen → aus.
- Beim ersten Aktivieren erscheint ein Einwilligungs-Dialog (einmal pro Browser gespeichert): Hinweis, dass Suchanfragen an den konfigurierten Anbieter gehen und dort verarbeitet werden können.
- Ist der Modus aktiv, erscheint ein Chip über dem Feld („Im Web suchen · …“) mit × zum Deaktivieren.
- Beim Senden einer Textnachricht mit aktiver Websuche: der Server bildet aus aktueller Nachricht plus Chat-Verlauf eine kurze Google-Suchzeile (über dieselbe mittwald-KI), ruft dann
POST /api/web/searchauf und streamt anschließend den Chat mit den Treffern (heute Europe/Berlin im Kontext). - In den Modell-Einstellungen (Zahnrad): optional „Neue Chats starten mit aktivierter Websuche“.
Suchtreffer werden nicht serverseitig dauerhaft gespeichert; der Chatverlauf bleibt im Browser.
Für öffentliche Instanzen solltest du eigene Seiten für Impressum und Datenschutz verlinken. Pro Link gibt es eine URL- und optional eine LABEL-Variable in .env; der Server liefert die Liste über GET /api/config → Feld links.
Verhalten:
- Nur Links mit gesetzter
*_URLerscheinen im UI (Sidebar unten, Fußzeile, Glossar in den Modell-Einstellungen). - Fehlt
*_LABEL, wird die Standard-Beschriftung aus der Tabelle unten genutzt. - Bug melden: Ohne
PLAYGROUND_LINK_BUG_URLwird automatisch der GitHub-Issue-Link dieses Repos eingetragen (einziger Link, wenn sonst nichts konfiguriert ist).
Beispiel .env:
PLAYGROUND_LINK_IMPRESSUM_URL=https://example.com/impressum
PLAYGROUND_LINK_IMPRESSUM_LABEL=Impressum
PLAYGROUND_LINK_PRIVACY_URL=https://example.com/datenschutz
PLAYGROUND_LINK_PRIVACY_LABEL=Datenschutz
PLAYGROUND_LINK_TERMS_URL=https://example.com/nutzungsbedingungen
PLAYGROUND_LINK_TERMS_LABEL=Nutzungsbedingungen
PLAYGROUND_LINK_AI_HOSTING_URL=https://www.mittwald.de/mstudio/ai-hosting
PLAYGROUND_LINK_AI_HOSTING_LABEL=AI Hosting
PLAYGROUND_LINK_DOCS_URL=https://developer.mittwald.de/de/docs/v2/platform/aihosting/
PLAYGROUND_LINK_DOCS_LABEL=Developer-Dokumentation
# Optional — sonst Standard-Link zum GitHub-Repo
# PLAYGROUND_LINK_BUG_URL=https://github.com/org/repo/issues/new
# PLAYGROUND_LINK_BUG_LABEL=Bug melden| Link | URL-Variable | Label-Variable (optional) | Standard-Label |
|---|---|---|---|
| Impressum | PLAYGROUND_LINK_IMPRESSUM_URL |
PLAYGROUND_LINK_IMPRESSUM_LABEL |
Impressum |
| Datenschutz | PLAYGROUND_LINK_PRIVACY_URL |
PLAYGROUND_LINK_PRIVACY_LABEL |
Datenschutz |
| Nutzungsbedingungen | PLAYGROUND_LINK_TERMS_URL |
PLAYGROUND_LINK_TERMS_LABEL |
Nutzungsbedingungen |
| AI Hosting (Produkt) | PLAYGROUND_LINK_AI_HOSTING_URL |
PLAYGROUND_LINK_AI_HOSTING_LABEL |
AI Hosting |
| Entwickler-Doku | PLAYGROUND_LINK_DOCS_URL |
PLAYGROUND_LINK_DOCS_LABEL |
Dokumentation |
| Bug / Feedback | PLAYGROUND_LINK_BUG_URL |
PLAYGROUND_LINK_BUG_LABEL |
Bug melden |
Alle Variablen sind auch auskommentiert in .env.example aufgeführt. Die Links öffnen in einem neuen Tab (target="_blank"). Sie ersetzen keine rechtliche Prüfung — Inhalte der verlinkten Seiten liegen bei dir.
Modell-IDs müssen exakt zu GET /v1/models passen. Im Code sind u. a. Presets für gpt-oss-120b, Qwen3.5/3.6, Ministral und Devstral verdrahtet — fehlen sie in PLAYGROUND_ALLOWED_MODELS, erscheinen sie nicht im Dropdown.
Wenn der Playground für alle erreichbar sein soll — wie eine Demo zum Ausprobieren:
- Rate-Limits — niedrig halten (z. B.
RATE_LIMIT_MAX_CHAT=5pro 15 Minuten); das ist der Hauptschutz, kein Login nötig. - Allowlist —
PLAYGROUND_ALLOWED_MODELSauf Demo-taugliche Modelle begrenzen. - CORS —
CORS_ORIGINauf die echte HTTPS-URL setzen (TRUST_PROXY=1am Proxy). - Deploy — mittwald Container Hosting mit
Dockerfileund.env.production(Secrets nicht ins Image); siehe Deploy auf mittwald. - Port-Mapping — im mStudio 80 → 3000; kein
PORTin.env.production. - Rechtliches — Impressum/Datenschutz verlinken (
PLAYGROUND_LINK_*); UI-Hinweis „Test-Playground“ bleibt sichtbar. - Kosten — Verbrauch im mStudio AI Hosting beobachten; bei Bedarf Limits weiter senken.
- Logging — keine Chat-Inhalte in App-Logs; API-Keys nie committen oder in Issues posten.
PLAYGROUND_APP_API_KEY ist für interne Zugänge gedacht, nicht für öffentliche Schnupper-Demos.
- Chats liegen nur im localStorage des jeweiligen Browsers (inkl. mehrerer Threads, Websuche pro Chat, Websuche-Einwilligung).
- Schrift Inter wird selbst gehostet (npm-Paket, kein Abruf von Google Fonts / fonts.googleapis.com).
- Der API-Key (mittwald, ggf. SerpAPI/Serper) liegt nur in der Server-Umgebung (
.env), nicht im Frontend. - Anfragen gehen über euren Proxy an mittwald; Inhalte unterliegen auch der mittwald-Dokumentation.
- Bei aktivierter Websuche: Kurz-Anfragen an Google (SerpAPI/Serper) bzw. Abfragen an DuckDuckGo; der rohe Chat-Verlauf wird serverseitig nur verdichtet, nicht 1:1 an den Suchdienst geschickt. Es gelten die Nutzungsbedingungen des jeweiligen Anbieters.
- Die Einwilligung zur Websuche wird nur lokal im Browser gespeichert; zurückziehen unter Modell-Einstellungen (Zahnrad) → Websuche → „Einwilligung zurückziehen“. Ersetzt keine Datenschutzerklärung — für öffentliche Instanzen eigene Seiten verlinken (
PLAYGROUND_LINK_*). - CO₂- und Token-Werte sind Schätzungen zur Orientierung.
- Was beim Betrieb noch fehlen kann (rechtlich-organisatorisch, Infrastruktur, optionale App-Ergänzungen): docs/Datenschutz-und-Betrieb-offene-Massnahmen.md.
| Endpoint | Beschreibung |
|---|---|
GET /api/health |
Liveness |
GET /api/config |
UI-Konfiguration (Titel, Limits, Whisper, Websuche, Footer-Links, …) |
GET /api/models |
Modellliste (gefiltert) |
POST /api/chat/completions |
Chat (Streaming); nur erlaubte JSON-Felder |
POST /api/audio/transcriptions |
Sprache → Text (Whisper) |
POST /api/web/search |
Websuche — Body z. B. { "userMessage": "…", "chatExcerpt": "…", "maxResults": 10 }; optional Legacy { "q": "…" } ohne Verdichtung |
Vision: Bilder nur als data:image/… Base64 im Request.
| Symptom | Lösung |
|---|---|
MITTWALD_AI_API_KEY fehlt / 401 |
Key in .env / .env.production setzen, neu deployen |
| 502 Bad Gateway (mittwald) | Port-Mapping im mStudio: 80 → 3000; kein PORT=8787 in Produktion |
| Origin ist nicht erlaubt | CORS_ORIGIN = exakte Browser-URL (https://…); TRUST_PROXY=1; Redeploy |
| Keine Modelle im Dropdown | API erreichbar? PLAYGROUND_ALLOWED_MODELS prüfen (exakte IDs) |
EADDRINUSE Port 8787 |
Alten Prozess beenden: lsof -nP -iTCP:8787 -sTCP:LISTEN → kill <PID> |
Vite: command not found |
Im Projektroot npm install ausführen |
| Docker-Build schlägt fehl | Dockerfile im Root; auf Mac: DOCKER_DEFAULT_PLATFORM=linux/amd64 |
| Mikrofon funktioniert nicht | Browser-Berechtigung; HTTPS in Produktion |
| CORS-Fehler in Produktion | CORS_ORIGIN auf öffentliche URL; http und https wenn beides genutzt wird |
| Websuche liefert keine Treffer | Rate-Limit; SerpAPI-Key und WEB_SEARCH_PROVIDER prüfen |
| Websuche lässt sich nicht aktivieren | Einwilligungs-Dialog; localStorage mittwald-ai-playground-web-search-consent-v1 löschen |
Verbesserungen und Pull Requests sind willkommen.
Bug oder Idee: GitHub Issue erstellen — im Playground unter Bug melden verlinkt.
- AI Hosting buchen & Tarife — Produktseite (Starter, Pro, Business, …)
- Entwickler-Dokumentation
- Container Deploy (CLI) —
mw experimental deploy - Deploy-Anleitung im Repo
Der Quellcode steht unter der MIT License — Copyright (c) 2026 Maik Behring.
Community-Projekt: Dieser Playground ist ein unabhängiges Demo- und Community-Repository, kein offizielles mittwald-Produkt. „Mittwald“, mStudio und zugehörige Marken sind Eigentum der Mittwald CM Service GmbH & Co. KG.
Die Nutzung von mittwald AI Hosting (API-Key, Modelle, Tarife) unterliegt den Vertrags- und Nutzungsbedingungen von mittwald. Maintainer: Maik Behring (Produktmanager bei mittwald, in privatem/community-Kontext).