DevSprint Copilot: ein Tool-Loop-Agent mit menschlich freigegebenen Schreibzugriffen und beidseitiger MCP-Anbindung
DevOps-Copilot über ein Mock-Sprint-Board: Vue-3-SPA, Hono auf Cloudflare Workers, AI-SDK-v6-Agent mit Freigabe jedes Schreibzugriffs, MCP-Server und -Client. Demo live auf Groq; nur das Demo-Video fehlt noch.
- Stack:
- Vue 3.5 · Vite 8 (Rolldown) · Hono · Cloudflare Workers · AI SDK v6 (ToolLoopAgent) · MCP over Streamable HTTP · TypeScript (strict) · pnpm workspaces · Durable Objects · Groq · Langfuse (OTLP)
- Zeitraum:
- 2026
- veröffentlicht:
Das Problem
Ich wollte ein Projekt, das Agent-Architektur zeigt (Tool-Design, Human-in-the-Loop-Freigabe, Streaming-UI, MCP-Interoperabilität), und zwar für Reviewer, die schon hundert dünne Chat-Wrapper-Demos gesehen haben. DevSprint Copilot ist ein Projekt- und DevOps-Copilot, der einen simulierten Workspace für die Softwareauslieferung per Chat bedient: fragen, wie der Sprint läuft, Issues schließen, Release Notes entwerfen, ein simuliertes Deployment anstoßen und dabei zusehen, wie die Änderungen im Board-Bereich neben dem Gespräch erscheinen.
Der Workspace ist bewusst künstlich und bewusst deterministisch: ein Projekt, zwei Sprints, 13 Issues auf einem Board mit fünf Spalten, vier Nutzer, fünf Deployments, alles aus Fixtures geseedet, mit eingefrorener Demo-Uhr (WORKSPACE_NOW = 2026-07-01T09:00:00Z). Das ist keine Abkürzung, sondern die Eval-Strategie. Wenn sich der Seed nie ändert, sind „DS-11 ist blockiert“ und „8 von 31 Punkten erledigt“ exakte Aussagen, und dieselben sechs Skript-Szenarien können als Abnahmespezifikation, als Trajektorien-Eval-Suite und als Playwright-E2E-Spezifikation dienen, ohne neu interpretiert zu werden.
Architektur
Das Frontend ist eine Vue-3.5-SPA auf Vite 8 (Rolldown) mit zwei Bereichen: links das Workspace-Board, rechts der Chat. Das Backend ist Hono auf Cloudflare Workers und betreibt den ToolLoopAgent des AI SDK v6 vollständig serverseitig. Modell-Keys liegen ausschließlich in den Env-Variablen des Workers, und der Browser spricht nie mit einem Modellanbieter. Gemeinsame Typen, Routen-Konstanten und das Fixture-Set liegen in einem Workspace-Paket, das beide Seiten importieren.
Der Agent bekommt genau elf Tools, vorab inventarisiert mit Zod-Eingabeschemata und einem gemeinsamen Ergebnis-Envelope ({ ok: true, data } | { ok: false, error }). Die Tools sind nach Risiko klassifiziert: Lese- und Abfrage-Tools laufen unbeaufsichtigt; datenreiche Tools speisen Generative-UI-Karten (Burndown-Chart, Diff der Release Notes); jeder Schreibzugriff liegt hinter einer Freigabekarte im Stream, eine Freigabe pro Schreibzugriff; ein Klick auf „Alle freigeben“ beantwortet eine Gruppe von Karten über denselben Weg wie jede einzelne (ADR-0023). Der Klick des Nutzers ist nur ein Bedienschritt in der Oberfläche; der Worker validiert die Tool-Eingabe erneut und bewertet die Freigabe-Policy neu, bevor er ausführt, denn ein vom Client gelieferter Nachrichtenverlauf könnte sonst eine Freigabe vortäuschen, die nie stattgefunden hat.
Der Weg zu MCP war bewusst gestaffelt (siehe Entscheidungsprotokoll weiter unten). In den Phasen 3–5 liefen alle zehn Tools als schlichte Funktionsaufrufe im API-Worker; Phase 6 hat die vier Issue-Tools (fünf, seit assign_issue dazukam) hinter einen eigenen MCP-Server auf Workers gezogen, öffentlich über Streamable HTTP für externe Hosts wie Claude Desktop erreichbar, und das Backend nutzt ihn selbst als MCP-Client. Ein System steht auf beiden Seiten des Protokolls, und genau das ist das Unterscheidungsmerkmal. Erst der transportunabhängige Ergebnis-Envelope hat diesen Schritt zu einem Refactoring statt zu einer Neuentwicklung gemacht. Das Diagramm zeigt die gebaute Topologie: Die gestrichelten Server für Deployments und Analytics wurden nie gebaut, daher bleiben diese sechs Tools schlichte Funktionsaufrufe im API-Worker.
Aufbau der Evals
Veröffentlicht ist noch keine Zahl; jede Zeile in der Metriktabelle oben ist ausstehend, und ich zeige lieber eine leere Tabelle als eine erfundene. Was existiert, ist das Harness, samt einer ehrlichen Antwort darauf, was es belegen kann und was nicht.
Die Einheit der Evals ist die Trajektorie, nicht die Antwort. Ein plausibler Absatz über den Zustand des Sprints ist wertlos, wenn der Agent get_sprint_status nie aufgerufen hat; die interessanten Fehlerfälle sind falsche Tool-Reihenfolge, übersprungene Gates und halluzinierte Argumente. Deshalb bringt jedes der sechs Demo-Szenarien wörtliche Eval-Assertions mit. Für Szenario S-A heißt das: Die Tools werden in genau der Reihenfolge get_sprint_status → list_issues → diff_release_notes → create_release_notes aufgerufen, und create_release_notes wird nie ohne vorherige Freigabeantwort ausgeführt. Diese Blöcke wurden in Phase 10 1:1 in Eval-Prüfungen übertragen und in Phase 13 in Playwright-Erwartungen, ohne Neuinterpretation; jeder Browser-Test prüft DOM, UI-Stream und Durable Object (ADR-0018).
Das Harness kam in Phase 10 zusammen mit der Observability: OTLP-Traces nach Langfuse, exportiert ohne OpenTelemetry-SDK. Es spielt jedes Szenario gegen ein geskriptetes Mock-Modell durch, deterministisch und kostenlos; das belegt, dass die Anwendung jede Trajektorie einhält, nicht, dass ein echtes Modell sie hervorbringt. Bis zum 21. Oktober 2026 lief es in der CI, seitdem läuft es lokal mit pnpm ci:local. Läufe mit echten Modellen funktionieren seit dem 22. Oktober 2026: Bevor die Demo auf ein echtes Modell umstieg, liefen die sechs Szenarien gegen Groq und Gemini, und das brachte sechs Probleme zutage, die das Mock-Modell verdeckt hatte, von zwei eingestellten Modellen bis zu einer Tool-Beschreibung, die ihrem Szenario widersprach (ADR-0021). Die Evals haben jetzt zwei Stufen: Jedes Modell muss die Bedeutung jedes Szenarios treffen, und das Mock-Modell muss zusätzlich seine exakten Sätze liefern. Ein Lauf mit einem echten Modell ist eine Stichprobe auf Free Tiers, ein Qualitätssignal auf Abruf und nie ein CI-Gate. Der deterministische Seed hält das alles günstig: Ein LLM-as-Judge ist nicht nötig, wenn die erwarteten Tool-Aufrufe und Workspace-Zustände exakt feststehen.
Kosten und Latenz als Entwurfsvorgaben
Das Produkt-Briefing setzt ein hartes Budget: höchstens 5 EUR/Monat Betriebskosten, Ziel 0. Das ist eine Entwurfsvorgabe, keine Messung. Sie hat das Modell-Routing direkt geprägt. Groq ist das Primärmodell, inzwischen openai/gpt-oss-120b, dessen Free Tier 8.000 Tokens pro Minute erlaubt, während eine Agent-Runde etwa 2.000 verbraucht; und ein globales Tageslimit für Tokens wirkt als Kill-Switch, der die Anwendung in einen bewusst gestalteten Zustand „Demo-Budget erreicht“ überführt, statt mitten im Gespräch Anbieterfehler durchzureichen. Seit dem 22. Oktober 2026 antwortet die deployte Demo mit einem echten Modell. Der Free Tier ist ihre Kapazitätsgrenze, und seit dem 2. November 2026 gibt es kein zweites Modell mehr (ADR-0026): Eine Ablehnung wegen des Minutenlimits wird bis zu etwa 14 Sekunden abgewartet, alles Längere beendet die Runde mit einem Fehler.
Latenz wird in diesem Stadium strukturell statt numerisch behandelt: Alles streamt. Der Meilenstein von Phase 2 war Token-für-Token-Streaming vom Worker zur SPA, bevor überhaupt ein Modell beteiligt war; wenn die ersten echten Tokens ankommen, ist die Streaming-Strecke also bereits erprobt. Auf der Live-Site erreichte Lighthouse in allen vier Kategorien 100, mobil und am Desktop (Roadmap, Phase 14); die Barrierefreiheit prüft stattdessen axe über fünf UI-Zustände in beiden Themes, und axe fand drei WCAG-AA-Verstöße, die die 100 verdeckt hatte (ADR-0017). Das Tracing aus Phase 10, das Time-to-First-Token und Kosten pro Runde liefern würde, ist gebaut; der deployte Worker hat seit dem 22. Oktober 2026 ein echtes Modell, sendet aber noch keine Traces, daher ist keiner der beiden Werte festgehalten.
Was gebaut ist, was als Nächstes kommt
Gebaut sind heute die Phasen 0–14 der 16-phasigen Roadmap. Der Agent läuft: Der ToolLoopAgent des AI SDK v6 verkettet die elf Tools innerhalb eines Budgets von sechs Schritten, die sechs Lese- und Rich-Data-Tools unbeaufsichtigt, jeden Schreibzugriff hinter einer Freigabe im Stream, die signiert, nur einmal gültig und serverseitig erneut geprüft ist, mit „Alle freigeben“ für eine Gruppe von Karten und einem Rückgängig auf jedem angewendeten Board-Schreibzugriff. Die fünf Issue-Tools stellt ein öffentlicher MCP-Server über Streamable HTTP bereit, den die App über ihren eigenen MCP-Client nutzt. Ein lang laufendes Deploy-Tool streamt seinen Fortschritt und lässt sich mitten im Lauf abbrechen; ein täglicher Alarm setzt das Board zurück; jeder Schritt lässt sich über OTLP nach Langfuse tracen (auf der deployten Demo sind keine Keys gesetzt); und drei Kostenbremsen schützen die Demo, ein Rate Limit pro IP, ein Tagesanteil pro Client und eine tägliche Token-Obergrenze, dazu eine klar formulierte Haltung zu Prompt Injection. Seit dem 21. Oktober 2026 laufen drei Worker auf Cloudflare: die SPA, die API und der öffentliche MCP-Server. Seit dem 22. Oktober 2026 antwortet die Demo mit einem echten Modell, seit dem 2. November 2026 ist Groq openai/gpt-oss-120b das einzige.
Was nicht belegt ist: Die Assertions der sechs Demo-Szenarien laufen als Trajektorien-Evals gegen ein geskriptetes Mock-Modell, und die Browser-Tests steuern dasselbe Mock-Modell. Das belegt, dass die Anwendung jede Trajektorie einhält. Die Läufe mit echten Modellen sind Stichproben: In der Produktionskonfiguration bestanden am 22. Oktober 2026 7 von 9 Fällen, jeder Fehlschlag ein Anbieter, der eine Anfrage ablehnte; eine Quote wird daher nicht veröffentlicht. Modellkosten und Latenz der Live-Demo sind nicht festgehalten. Als Nächstes: das Demo-Video, der letzte offene Teil von Phase 15.
Zentrale Entscheidungen
01 Das AI SDK auf die v6-Linie pinnen, nicht auf v7
ai@6.0.277 über den offiziellen dist-tag ai-v6, exakt gepinnt im pnpm-Katalog, mit ausdrücklichem Hinweis, die Version nicht anzuheben (npm latest ist v7).
v6 ist die ausgereifte Linie, auf deren ToolLoopAgent und deren Freigabe-Gate needsApproval pro Tool dieser Build aufbaut; mit einem exakten Pin werden Upgrades zu bewussten Entscheidungen statt zu Unfällen im Lockfile.
verworfen: ai@7 (npm latest) · Lose SemVer-Bereiche
02 MCP schrittweise einführen
Für die Phasen 3–5 schlichtes Function Calling mit dem AI SDK, dann in Phase 6 dieselben 10 Tools hinter 2–3 auf Workers gehostete MCP-Server (Streamable HTTP) verlagern, wobei der Issues-Server öffentlich erreichbar ist.
Der transportunabhängige Tool-Envelope { ok, data | error } macht den Wechsel zu einem Refactoring statt zu einer Neuentwicklung. Die Bewegung bei MCP-Transport und -Spezifikation bleibt auf eine Phase beschränkt, statt den ersten funktionierenden Agenten zu blockieren.
Stand 22. Oktober 2026: Die Staffelung kam, kleiner als geplant. Gebaut wurde ein Server, mcp-issues, mit fünf Issue-Tools, seit am 25. Oktober 2026 assign_issue dazukam; die Server für Deployments und Analytics nicht, daher bleiben diese sechs Tools schlichte Funktionsaufrufe im API-Worker.
verworfen: MCP ab Phase 3 · Dauerhaft einfaches Function Calling · Ein fremdes MCP-Framework als einzige Abstraktion
03 HITL-Freigabe als Policy, getrennt vom SDK-Mechanismus
Jedes Schreib-Tool verlangt immer eine menschliche Freigabe im Stream, ohne Bündelung (N implizite Schreibzugriffe = N Gates), und der Server validiert Eingabe und Policy vor der Ausführung erneut.
Ein vom Client gelieferter Nachrichtenverlauf kann eine Freigabe vortäuschen, die nie stattgefunden hat; der Client ist also nur eine Darstellungsschicht, keine Autorität. Die Policy getrennt vom Mechanismus des SDK zu formulieren, hielt den ADR über die Implementierung hinweg stabil.
Der Mechanismus (ADR-0010) ist needsApproval pro Tool, das einzige Freigabe-Gate in ai@6.0.277, dazu ein Signatur-Secret gegen gefälschte Freigaben und ein Ledger für einmalige Verwendung gegen wiederholte: Mit der Signatur des SDK allein führte eine einzige mitgeschnittene Freigabe denselben Schreibzugriff dreimal aus. Seit dem 25. Oktober 2026 beantwortet ein Klick auf „Alle freigeben“ die offenen Karten einer Gruppe über denselben Weg wie jede einzelne Karte; jeder Schreibzugriff wird also weiterhin einzeln freigegeben und festgehalten, und ein angewendeter Board-Schreibzugriff lässt sich auf seiner Karte rückgängig machen, solange sich das Board nicht weiterbewegt hat (ADR-0023).
verworfen: Freigabe nur clientseitig · Allein auf die Freigabe-Signatur des SDK vertrauen · Schreibzugriffe mit geringem Risiko automatisch freigeben
04 Modell-Routing: Groq als einziges echtes Modell, globales Token-Limit
Groq openai/gpt-oss-120b als einziges echtes Modell und ein Kill-Switch über ein tägliches Token-Limit, der in einen bewusst gestalteten Zustand „Demo-Budget erreicht“ übergeht.
Das Budget von ≤ 5 EUR/Monat schließt Anbieter ohne dauerhaften Free Tier aus, und eine öffentliche Demo braucht einen harten Stopp, damit ein einzelner Crawler sie nicht mitten im Gespräch lahmlegt.
Stand 2. November 2026: Die zuerst gewählten Modelle, llama-3.3-70b-versatile und gemini-2.5-flash, hatten ihre Anbieter eingestellt; neue wurden daher in Szenario-Läufen mit echten Modellen ausgewählt, und die Demo antwortet seit dem 22. Oktober 2026 mit einem echten Modell (MODEL_PROVIDER=auto, ADR-0021). Der Gemini-Fallback wurde am 2. November 2026 entfernt: Seitdem ist Groq das einzige echte Modell, und wenn es gedrosselt wird, gibt es keinen Anbieterwechsel mehr (ADR-0026).
verworfen: Anthropic oder OpenAI direkt · Workers AI als primäres Modell · Einen zweiten Anbieter als Fallback bezahlen
05 Deterministischer Seed mit eingefrorener Demo-Uhr
Ein geseedeter Workspace mit WORKSPACE_NOW fest auf 2026-07-01T09:00:00Z; alle Kennzahlen beziehen sich auf die Demo-Uhr, nie auf Date.now().
Erst der Determinismus macht Trajektorien-Evals und Playwright-Specs exakt prüfbar: „DS-11 ist blockiert“ ist eine testbare Tatsache und kein Zufallsergebnis. Eine echte Integration bringt zusätzlichen Aufwand für Auth und Rate Limits mit, ohne mehr Agent-Architektur zu zeigen.
verworfen: Live erzeugte Mock-Daten · Anbindung eines echten Issue-Trackers
06 Ein Katalog mit exakten Pins, eine Lint-Konfiguration
Toolchain und gemeinsame Abhängigkeiten, darunter die Pakete von AI SDK und MCP, sind exakt im Default-Katalog des pnpm-Workspace gepinnt, die Linien von AI SDK und MCP mit dem Hinweis, sie nicht anzuheben; eine einzige ESLint-Konfiguration gilt für das ganze Repository. UI-Bibliotheken, die nur die App nutzt, behalten Caret-Bereiche in ihrer eigenen package.json.
Ein Monorepo im Alleingang driftet am schnellsten durch Versions-Skew auseinander; eine einzige Quelle der Wahrheit macht jedes Upgrade zu einem geprüften, grep-baren Diff, und eine lesbare Historie ist selbst Teil des Portfolios.
verworfen: SemVer-Bereiche für Toolchain und AI-Pakete · Lint-Konfigurationen je Paket
07 Der Workspace in einem einzigen Durable Object
Der ganze Workspace liegt in einem Durable Object, das im API-Worker definiert ist und vom MCP-Worker skriptübergreifend gebunden wird; kein D1 daneben, und der MCP-Server bleibt zustandslos.
Getrennte Worker teilen keinen Speicher, und Szenario S-F verlangt, dass ein Schreibzugriff aus einem externen MCP-Host im Board der SPA erscheint. Lokal gemessen warf eine D1-Datenbank, die sich zwei wrangler-dev-Prozesse teilten, bei 8 von 50 gleichzeitigen Schreibzugriffen einen internen Fehler; ein skriptübergreifendes Durable Object verlor unter derselben Last nichts und serialisiert den nächsten Issue-Schlüssel, sodass nicht zwei Clients zugleich DS-14 beanspruchen können.
verworfen: D1, aus Phase 9 vorgezogen · Die MCP-Routen im API-Worker einhängen · Der MCP-Server hält den Zustand
08 Ein Rate Limit für den öffentlichen MCP-Endpunkt, mit eigenem Zugang für den Agenten
Den öffentlichen Endpunkt /mcp auf 30 Anfragen pro Minute und Client-IP begrenzen; der Agent in der App erreicht denselben Handler über einen benannten Entrypoint Internal, den nur ein Service Binding im eigenen Account aufrufen kann.
Der öffentliche Server führt create_issue ohne Gate aus, weil diese Abfrage beim MCP-Host liegt; eine Schleife könnte das gemeinsame Board also in Sekunden bis zu seiner Grenze von 512 KB füllen. Eine Anfrage über das Binding trägt keine Client-IP: Sie auszunehmen, würde nur zufällig funktionieren; ein geheimer Header schützt, was die Plattform ohnehin abgrenzt; und die Byte-Grenze begrenzt die Größe schon, das Problem war die Geschwindigkeit.
ADR-0020, lokal geprüft: 30 Anfragen wurden beantwortet, dann kam 429, während Chat-Runden ihre Tools weiterhin über MCP erreichten.
verworfen: Binding-Verkehr ausnehmen, weil er keine Client-IP trägt · Ein geheimer Header von der API · Eine Obergrenze für die Zahl der Issues
Evaluationsergebnisse
| Kennzahl | Wert | Status |
|---|---|---|
| Bestehensquote der Trajektorien-Evals (6 Demo-Szenarien) | k. A. | ausstehend Die Assertions der sechs Szenarien laufen gegen ein geskriptetes Mock-Modell (bis zum 21. Oktober 2026 in der CI, seitdem lokal): Das belegt, dass die Anwendung jede Trajektorie einhält. Läufe mit echten Modellen am 22. Oktober 2026 (ADR-0021) sind Stichproben: Die Produktionskonfiguration bestand 7 von 9 Eval-Fällen, jedes Szenario bestand in mindestens einem Lauf, und jeder Fehlschlag war ein Anbieter, der eine Anfrage ablehnte. Aus Stichproben wird keine Quote veröffentlicht. |
| Integrität der Schreib-Gates (kein Schreibzugriff wird ohne vorherige Freigabe ausgeführt) | k. A. | ausstehend In der Trajektorien-Eval jedes Szenarios geprüft und serverseitig durchgesetzt: Freigaben sind signiert, nur einmal gültig und werden vor jedem Schreibzugriff erneut geprüft. Die Stichproben mit echten Modellen prüfen das ebenfalls; eine Quote wird daraus nicht veröffentlicht. |
| Qualität der Tool-Auswahl beim Set aus 11 Tools | k. A. | ausstehend In Szenario-Läufen mit echten Modellen (ADR-0021) setzte sich Groq gpt-oss-120b gegen das andere Tool-Calling-Modell von Groq durch, qwen3.8-27b, das langsamer war, früher an Rate Limits stieß und Schreibzugriffe ausließ; gpt-oss-120b ist daher das Primärmodell. Aus diesen Stichproben wird kein Wert veröffentlicht. |
| Szenario-E2E-Suite gegen ein echtes Modell | k. A. | ausstehend Gebaut in Phase 13: ein Playwright-Test pro Demo-Szenario, der DOM, UI-Stream und Durable Object prüft (ADR-0018). Die Tests liefen bis zum 21. Oktober 2026 grün in der CI und laufen seitdem lokal, gegen das geskriptete Modell; sie belegen damit die App, nicht ein echtes Modell. |
Kosten & Latenz
| Kennzahl | Wert | Status |
|---|---|---|
| Monatliche Betriebskosten | k. A. | ausstehend Ausgelegt auf ≤ 5 EUR/Monat (Ziel 0) über Free Tiers. Seit dem 22. Oktober 2026 antwortet die Demo mit echten Modellen auf Free Tiers; die Kosten eines Monats sind noch nicht festgehalten. |
| Täglicher Token-Verbrauch gegenüber dem globalen Limit | k. A. | ausstehend Tageslimit und Rate Limits pro IP sind gebaut (Phase 11). Seit dem 22. Oktober 2026 verbraucht die Demo echte Tokens, laut ADR-0021 etwa 2.000 pro Agent-Runde, aber ihr Tagesverbrauch gegenüber dem Limit ist noch nicht festgehalten. |
| Time-to-First-Token pro Chat-Runde | k. A. | ausstehend Der Agent-Loop streamt, und das Tracing nach Langfuse ist gebaut, aber die deployte Demo sendet keine Traces (dort sind keine Langfuse-Keys gesetzt); eine Time-to-First-Token ist daher nicht festgehalten. |
Sicherheit & Fehlerfälle
Risiken
- Destruktive Schreibzugriffe: Der Agent verändert den gemeinsam genutzten Demo-Workspace (Issue-Status, Release Notes, Deployments).
- Prompt Injection über Workspace-Inhalte: Ticket-Titel und Kommentare fließen in den Kontext und könnten die Tool-Aufrufe des Agenten steuern.
- Exfiltration von Modell-Keys, falls Anbieter-Zugangsdaten je den Client erreichen.
- Erschöpfte Kontingente oder aus dem Ruder laufender Token-Verbrauch bei einer öffentlich erreichbaren Demo.
Gegenmaßnahmen
- Jedes Schreib-Tool hat ein Human-in-the-Loop-Gate im Stream, ohne Bündelung, und der Worker validiert Eingabe und Freigabe-Policy vor der Ausführung erneut. Die Freigabe im Client ist nur ein Bedienschritt in der Oberfläche; die Autorität liegt beim Server.
- Typisierte Tool-Contracts in Zod mit Allowlist und fest aufgezählten Argumenten; jeder Schreibzugriff des Agenten in der App passiert weiterhin ein menschliches Freigabe-Gate (der öffentliche MCP-Server führt create_issue ohne Gate aus, weil diese Abfrage beim MCP-Host liegt, ADR-0016; ADR-0020 begrenzt diesen Endpunkt auf 30 Anfragen pro Minute und IP, lokal geprüft); die Trajektorien-Evals wirken als Regressions-Gates gegen fremdgesteuerte Tool-Pfade (gegen das geskriptete Modell; bis zum 21. Oktober 2026 in der CI, seitdem lokal).
- Keys liegen ausschließlich in den Env-Variablen des Workers; der Browser spricht nie mit einem Modellanbieter.
- Ein Rate Limit von 60 Chat-Anfragen pro Minute und IP, ein Tagesanteil von 25.000 Tokens pro Client und ein globales Tageslimit von 100.000 Tokens, das in einen bewusst gestalteten Zustand „Demo-Budget erreicht“ übergeht.