27 KiB
Boilerplate-Abgleich: M18 — KI-Layer / LLM-Gateway
Faktischer Abgleich der HiveGrid-Detail-Spec (M18) gegen die Boilerplate. Boilerplate-Wurzel (NUR LESEN):
/Users/raffaelsheikh/Documents/GitHub/boilerplateSpec-Quelle:/Users/raffaelsheikh/Documents/GitHub/HiveGrid-Cloud/_bmad-output/specs/M18-ki-layer.mdAlle Pfade absolut. Nichts erfunden — jeder Eintrag verweist auf konkrete Datei(en); fehlt etwas, ist es klar als Lücke markiert.
Kopf
| Feld | Wert |
|---|---|
| Modul-ID | M18 |
| Name | KI-Layer / LLM-Gateway |
| Milestones | M083 (EU-Provider-Layer), M084 (Multi-Provider-Fallback), M085 (Promptfoo-Eval-Suite), M086 (Sprach-zu-Automation), M087 (RAG + Aktions-Grenze), M088 (Token-Limits + Pay-as-you-go) |
| Block | Block 4 — Integrationen, Automation & KI (_bmad-output/pflichtenheft/blocks/block4.md, Modul 18) |
| Reuse-Level | HIGH |
Kernaussage: Das ist die USP-Säule mit dem höchsten Wiederverwendungs-Grad im KI-Bereich. Die Boilerplate liefert den kompletten EU-Provider-Layer (Mistral/Scaleway/Aleph Alpha — exakt der von der Spec geforderte Stack, KEIN OpenAI/Anthropic im aktiven Pfad), den 30-Min-Multi-Provider-Fallback (M084 quasi fertig), die RAG/Embeddings-Pipeline + pgvector-Store (M087-Retrieval), die Promptfoo-Eval-Suite mit OWASP-Injection-Vektoren + Gitea-CI-Workflow (M085 quasi fertig), das Cost-/Quota-Tracking inkl. Pay-as-you-go-Overage-Logik (M088-Engine fertig) und die Guards/Action-Boundary-Bausteine (M087-Aktions-Grenze). Die Hauptlücken liegen bei: HiveGrid-spezifische Daten-Modelle (LlmGatewayProvider/Model, AiSettings, Conversation als HiveGrid-Variante, TenantEmbedding-Tabelle), Whisper-EU-Transkription (komplett nicht vorhanden), die Use-Case-Orchestrierung (Lead-Zusammenfassung, Sprach→Automation, Stuck-Deal, Email-Klassifizierung) und das gesamte UI (Chat, Usage-Dashboard, Settings, Voice-Assistant).
Übernehmbar aus Boilerplate
| Boilerplate-Pfad | Was | Wie nutzbar |
|---|---|---|
packages/ai/src/index.ts |
Provider-Adapter-Interface + Registry: AIProviderName = "mistral"|"scaleway"|"aleph-alpha", getAIProviderAdapter(), getAIProviderAdapterForModel(), getPrimaryProvider(), getAIProviderDiagnostics(), Modell-Katalog aiModels (mit Preisen pro Mio Tokens), defaultAIModel = "mistral-large-latest" |
1:1 — exakt der von Spec Block B geforderte EU-Stack. Deckt M083 Erfolgskriterium (Mistral-Aufruf, Switch via Env-Var, keine US-Endpunkte) |
packages/ai/src/providers/mistral.ts |
Mistral-Provider via @ai-sdk/mistral, resolveMistralModel(env), MISTRAL_API_KEY/MISTRAL_MODEL |
1:1 — Primary-Provider (Spec: Mistral Large Chat / Mistral Small) |
packages/ai/src/providers/scaleway.ts |
Scaleway-Provider (OpenAI-kompatibel), Default mistral-small-3.2-24b-instruct-2506, SCALEWAY_*-Env |
1:1 — Secondary-Provider (France-EU) |
packages/ai/src/providers/aleph-alpha.ts |
Aleph-Alpha-Provider (OpenAI-kompatibel), Default pharia-1-llm-7b-control, ALEPH_ALPHA_*-Env |
1:1 — Tertiary-Provider (Germany-EU) |
packages/ai/src/providers/compatible.ts |
createCompatibleLanguageModel() (gemeinsame OpenAI-kompatible Basis für Scaleway + Aleph Alpha) |
1:1 |
packages/ai/src/fallback.ts |
AIProviderHealthTracker (30-Min-Failure-Window = fallbackWindowMs), getFallbackProviderSelection(), fallbackProviderOrder = ["mistral","scaleway","aleph-alpha"] |
1:1 / anpassen — deckt M084 (Auto-Fallback + 30-Min-Window) fast vollständig. Spec verlangt zusätzlich 1-Min-Health-Ping + 5-Min-Sperre (Block H / 18.6.3) — der Health-Tracker ist reaktiv (failure-on-call), nicht aktiv-pingend → kleine Erweiterung nötig |
packages/ai/src/cost/executeLLMCall.ts |
LLM-Wrapper: wrappt jeden Provider-Call, leitet Token/Kosten ab, emittiert Outbox-Event ai.cost.event.persist, Quota-Pre-Check + Soft-Degradation + Concurrency-Slot; Killswitch AI_COST_TRACKING_ENABLED=false; Capabilities chat/chat-stream/embedding/completion/rerank/tool-call |
1:1 — zentraler Gateway-Aufruf-Wrapper (Spec Block B Interface + Block F Token-Tracking) |
packages/ai/src/cost/assertCredit.ts |
assertTenantAICreditAccess() — Pre-Call-Quota-Assertion (3 Outcomes: allow / allow+degradeTo / throw AIQuotaExceededError), Concurrency-Counter, Soft-Degradation (90%-Threshold), per-Capability-Caps, Killswitch AI_QUOTA_ENFORCEMENT_ENABLED=false |
1:1 / anpassen — M088-Kern. WICHTIG: Default-Verhalten ist Hard-Deny (HTTP 402) bei Limit. HiveGrid [N13] verlangt Pay-as-you-go statt Pause → die Hard-Deny-Pfade durch Overage-Pfad ersetzen (Overage-Logik existiert separat, s.u.) |
packages/entitlements/src/ai-overage.ts |
Pay-as-you-go-Overage: AI_OVERAGE_DEFAULT_MULTIPLIER = 1.5, computeMarkedUpCostCents(), roundUpToBlock(), resolveTenantAIOverage(), standardAIOverageDefaults pro Plan, TenantAIOverageOverride (parse/resolve) |
anpassen — genau das von M088/[N13] geforderte Aufschlags-Tarif-Modell. Markup-Faktor + Block-Rundung fertig; HiveGrid-Plan-Werte + Notbremse-Threshold (18.8.7) einsetzen |
packages/entitlements/src/ai-quotas.ts |
aiQuotaCapabilityKeys, AIQuotaPlanDefaults (aiQuotaCentsPerMonth / aiPerCapabilityCaps / aiMaxConcurrentCalls / aiDegradeTo), standardAIQuotaDefaults (starter/pro/business), resolveTenantAIQuota(), parseTenantAIQuotaOverride() |
anpassen — Inklusiv-Kontingent + per-Capability-Caps pro Plan. HiveGrid-Token/Cent-Werte einsetzen (Spec: „konkrete Mengen mit Pricing-Festlegung", noch offen) |
packages/ai/src/cost/spend-cache.ts |
createSpendCache() — Monatsspend-Caching (TTL) als Watermark für 80%-Banner und Forecast |
1:1 — Datenbasis für 80%-Soft-Limit-Banner + Email (18.8.2) und Usage-Dashboard-Forecast (18.8.9) |
packages/ai/src/cost/tokens.ts |
countTokens/countMessageTokens (gpt-tokenizer + Heuristik-Fallback) |
1:1 — Token-Zählung für Budget pro Use-Case (Spec C: ~2000 in / 800 out etc.) |
packages/ai/src/cost/pricing/v2026-05-16.ts + pricing/index.ts |
Versionierte Pricing-Tabelle (getPricingTable, LATEST_PRICING_VERSION) |
anpassen — EU-Provider-Preise sind als aiModels[].costPerM* bereits hinterlegt; HiveGrid-Aufschlags-Tarife ergänzen |
packages/ai/src/guards/index.ts |
assertAICostBudget(), createFixedWindowAIRateLimiter() (pro userId), createAIAuditEvent()/createAI{Prompt,ToolCall,Mutation}AuditEvent(), redactAIAuditPayload() (PII-Redaction), createReviewRequiredResult(), AIGuardError |
1:1 / anpassen — createReviewRequiredResult() + Mutation-Audit-Events sind das Fundament der Action-Boundary (M087, Spec Block G/18.5.3: KI generiert nur Vorschläge, User bestätigt). Audit-Redaction deckt AV#6 |
packages/ai/src/embeddings/factory.ts + embeddings/types.ts |
createEmbeddingProvider(), registerEmbeddingProviderAdapter(), resolveEmbeddingProviderName(env), resolveEmbeddingDimensions(env), EmbeddingProvider-Interface |
1:1 — RAG-Schreib-/Leseseite-Fundament (M087 / Spec Block D) |
packages/ai/src/embeddings/providers/scaleway.ts |
Scaleway-Embeddings-Adapter, Default bge-multilingual-gemma2 (1024 dim), Batch 64, max 4096 Tokens |
1:1 — Spec Block D: „Scaleway-Embeddings, 1024-Dim Default" — exakter Match |
packages/ai/src/embeddings/embed-and-upsert.ts |
embedAndUpsert() — chunked Embed + Upsert in VectorUpsertSink; erzwingt tenantId im Payload; deterministische buildChunkId(); optionale Kostenverfolgung über executeLLMCall |
1:1 / anpassen — Embedding-Pipeline (Spec D: bei Anlage/Update Embedding). Re-Embed-bei-Text-Änderung via Hash (Spec D) muss als Trigger-Wiring ergänzt werden |
packages/ai/src/embeddings/retrieve.ts |
retrieveRelevantContext() — Query embedden, Fan-out über Collections, Rank-Merge, min-Score 0.7, top-K 8; tenant-scoped via RagRetrievalStore.searchForTenant |
1:1 — RAG-Leseseite. Spec D Permission-Pre-Filter andocken |
packages/ai/src/embeddings/chunking.ts |
splitForEmbedding(), countTokens(), DEFAULT_CHUNK_TOKENS/...OVERLAP_TOKENS |
1:1 |
packages/ai/src/embeddings/outbox-publisher.ts |
publishRagUpsertEvent/publishRagDeleteEvent, ragEventType() → rag.index.<entity>.<verb> (BullMQ-Queue outbox.rag-index), Idempotenz via dispatchKey |
1:1 — async Re-Index bei jedem Domain-Write (Spec D Embedding-Pipeline) |
packages/vector-store/src/factory.ts + adapters/pgvector.ts |
createVectorStore() (pgvector Default / Qdrant Upgrade), PgvectorAdapter mit HNSW-Index (m/efConstruction), Payload-Filter |
1:1 — Spec D: „pgvector mit HNSW-Index" — exakter Match. Offener Detail-Punkt der Spec (IVFFlat vs. HNSW) ist durch BP bereits auf HNSW entschieden |
packages/vector-store/src/wrappers/tenant-scoped.ts |
withTenantScope() → TenantScopedVectorStore; searchForTenant() erzwingt tenantId-must-Filter; bare searchVectors() wirft |
1:1 — Spec D: „kein Cross-Tenant!" + M087 Permission-aware. Tenant-Isolation built-in |
prisma/migrations/20260517085146_04_enable_pgvector/migration.sql |
Aktiviert pgvector-Extension |
1:1 — Voraussetzung für TenantEmbedding-Tabelle |
packages/ai/src/prompts/index.ts |
createAIPromptRegistry() mit Versionierung, render(selection, variables), {{var}}-Templates, AIPromptRegistryError |
1:1 / als-vorlage — System-Prompt-Trennung (Spec G/18.5.2) + Use-Case-Prompts. Strikte System/User-Daten/Frage-Trennung als Template-Konvention |
packages/ai/src/tools/index.ts |
createAIToolRegistry() (scoped Tools für Vercel AI SDK ToolSet), toToolSet(selection), Secret-Redaction |
1:1 — Tool-Calling-Architektur (Spec G: Tools nur per Tool-Call-Output, nicht aus Text geparst). Basis für Sprach→Automation-Tools (M086) |
packages/ai/src/streaming/index.ts |
createAITextStream() via streamText, Guard-Evaluator, Prompt-/Tool-Registry-Integration, getAITextStreamDiagnostics() mit Redaction |
1:1 — Streaming-Chat-UX für Programm-Hilfe-Chat (Use-Case 3). Guard-Evaluator-Seam = Action-Boundary-Andock-Punkt |
packages/ai/src/promptfoo-provider.ts + promptfoo.config.yaml (Repo-Root) + tests/promptfoo/injection-vectors.yaml + .gitea/workflows/promptfoo.yml |
Promptfoo-Eval-Harness mit OWASP-LLM-Vektoren (LLM01/LLM02/LLM06…), Mistral-als-Primary-Label, deterministischer Test-Provider, CI-Workflow | 1:1 / anpassen — M085 quasi fertig: description: EU-only OWASP LLM injection-vector eval suite. Pro neuem HiveGrid-Prompt-Flow eigene Eval-Vektoren ergänzen (Spec G: „pro Prompt-Flow eigene Eval-Suite") |
packages/ai/test/evals/promptfoo-baseline.test.ts + prompt-registry-cases.yaml |
Eval-Baseline-Vitest + Prompt-Registry-Testfälle | als-vorlage — Muster für HiveGrid-Prompt-Flow-Evals |
prisma/schema/ai.prisma → Chat, ChatMessage, ChatMessagePart |
Chat-Datenmodell (Typ tenant/admin/marketing, Scope, anonym via sessionId, Multi-Part-Messages) |
als-vorlage / anpassen — deckt Spec Conversation/ConversationMessage strukturell. Chat.kind/HiveGrid-kind-Enum (programm_help/automation_builder) ergänzen; lastMessageAt/archivedAt bereits vorhanden |
prisma/schema/ai.prisma → GeneratedObject |
Strukturierte AI-Outputs mit Token/Cost-Feldern, status pending/success/error, model, chatId |
1:1 / anpassen — Spec GeneratedObject (JSON-Schema-validierte Outputs). schema_version-Feld ergänzen |
prisma/schema/ai.prisma → AICostEvent |
Append-only Cost-Log (requestId @unique, KEINE Prompt-Bodies, capability/provider/model/Tokens/Cents, isOverage, markedUpCostCents, stripeReportedAt) |
1:1 — Spec AiTokenUsage (Verbrauch pro Tenant/User/Use-Case). Overage-Felder + Stripe-Watermark für M088 bereits da |
prisma/schema/ai.prisma → TenantAICostSummary |
Vor-aggregierte Cost-Summary pro Periode (@@unique([tenantId, periodStart]), breakdown JSON) |
1:1 — Spec AiCredits-Aggregat + Usage-Dashboard O(1)-Top-Line (18.8.9) |
prisma/schema/accounts.prisma → Tenant AI-Felder |
aiQuotaOverrideJson (Json, geformt als TenantAIQuotaOverride), aiCostLastAlertedThreshold, aiCostLastAlertedPeriod |
1:1 / anpassen — Spec AiSettings.usage_limit_tokens_per_month + idempotente 80%-Alert-State. HiveGrid-AiSettings braucht zusätzlich enabled_use_cases[], default_models, data_residency (s. Lücken) |
prisma/schema/promptFlows.prisma → PromptFlow, PromptTemplate, PromptFlowExecution, PromptFlowOutput*, PromptFlowInputVariable |
LLM-Prompt-Pipelines an Entity/Property gekoppelt, executionType sequential/parallel, Streaming-Flag, Execution + Result-Log, Output→Row-Property-Mapping |
als-vorlage — Phase-2-PromptFlow/PromptTemplate (visueller Prompt-Editor, Spec Block J) bereits strukturell vorhanden. Für Phase 1 optional als Use-Case-Prompt-Definitionen |
packages/queue/src/payloads.ts → AiJob |
Typisierte AI-Jobs: ai.chat-completion / ai.embedding / ai.browser-task; Queue toolctrl.ai-chatbot (names.ts) |
1:1 / anpassen — async KI-Verarbeitung. Whisper-Transkriptions-Job-Typ fehlt → ergänzen (ai.transcribe) |
packages/queue/src/* (producers/priority/connection/runtime) |
enqueueJob(), Idempotenz (buildIdempotentJoben), Plan-basierte Prioritäten (resolveJobPriorityForTenant), BullMQ-Runtime-Factory |
1:1 — Whisper-Async-Pipeline (Spec E: Audio-Upload → Job-Queue → Whisper → Resultat) baut hierauf |
packages/storage/src/index.ts + signed/index.ts + scan/* |
Scaleway-S3-Adapter, Signed-Upload/Download-URLs, ClamAV + magic-bytes Virus-Scan, Quarantäne | 1:1 — Audio-Upload für Whisper-Transkription (Spec E) + DSGVO-EU-Storage |
packages/db/src/outbox.ts + prisma/schema/outbox.prisma |
publishOutboxEvent(tx, args) transaktional, OutboxEvent-Modell |
1:1 — alle KI-Side-Effects (Cost-Persist, RAG-Reindex, Notifications) transaktional |
prisma/schema/notifications.prisma → NotificationDelivery, UserNotificationPreference |
In-App + Email + Push Notification-Delivery | 1:1 — 80%-Budget-Email an Tenant-Admin (18.8.2), Notbremse-Warnung (18.8.7) — via notify() (M011), nicht direkt |
prisma/schema/permissions.prisma → Role, Permission, RolePermission, UserRole, Group |
RBAC-Fundament | 1:1 — die 6 ai.*-Permissions (Spec Block I) als Permission-Rows + Bundle-Mapping + Default-Rollen-Zuweisung |
prisma/schema/featureFlags.prisma → FeatureFlag |
Feature-Toggles (scope global/tenant/user) | 1:1 — DoD verlangt Feature-Flag-Abschaltbarkeit; ai-quota-soft-degradation-Flag wird von assertCredit.ts bereits erwartet |
prisma/schema/knowledgeBase.prisma → KnowledgeBaseArticle etc. |
Help-Center-Datenmodell | als-vorlage — RAG-Quelle für Programm-Hilfe-Chat (Use-Case 3) + HelpArticleEmbedding (M38-Kopplung) |
packages/search/src/* (Meilisearch) + schemas/kb-articles.ts |
Tenant-scoped Volltext-Index | 1:1 — Spec D Hybrid-Suche (Volltext + Embeddings) + Graceful-Degradation-Fallback bei Provider-Down (Spec D/H: „Standard-Volltext-Suche aktiv") |
Vorhandene Daten-Modelle (konkret)
Alle in /Users/raffaelsheikh/Documents/GitHub/boilerplate/prisma/schema/:
| Spec-Modell (M18 Block A) | Boilerplate-Entsprechung | Datei | Bewertung |
|---|---|---|---|
Conversation |
Chat (type tenant/admin/marketing, scope, sessionId, title, lastMessageAt, archivedAt, metadata) |
ai.prisma |
strukturell vorhanden — kind-Werte (programm_help/automation_builder/tenant_assistant) als HiveGrid-Anpassung |
ConversationMessage |
ChatMessage + ChatMessagePart (role, Multi-Part content, order) |
ai.prisma |
vorhanden — Token-Felder (tokens_input/output) pro Message ergänzen (aktuell auf GeneratedObject/AICostEvent-Ebene) |
GeneratedObject |
GeneratedObject (object/type/model, userPrompt/fullPrompt, generatedData JSON, Token+Cost, status, chatId) |
ai.prisma |
nahezu 1:1 — schema_version ergänzen |
AiTokenUsage |
AICostEvent (capability, provider, model, in/out/total Tokens, costCents, requestId @unique, isOverage, markedUpCostCents, stripeReportedAt) |
ai.prisma |
1:1 — append-only, KEINE Prompt-Bodies (PII-konform) |
AiCredits (Aggregat-Teil) |
TenantAICostSummary (periodStart/End, totalCostCents, total Tokens, breakdown JSON) |
ai.prisma |
1:1 für vor-aggregierte Sicht |
AiSettings (Teil) |
Tenant.aiQuotaOverrideJson + aiCostLastAlertedThreshold/Period |
accounts.prisma |
teilweise — Quota-Override + Alert-State da; restliche AiSettings-Felder fehlen |
| Plan-Defaults / Inklusiv-Kontingent | standardAIQuotaDefaults + AIQuotaPlanDefaults (Code, kein DB-Modell) |
packages/entitlements/src/ai-quotas.ts |
1:1 (Code-Registry-Stil) |
| Overage-/Aufschlags-Tarif | standardAIOverageDefaults + resolveTenantAIOverage (Code) |
packages/entitlements/src/ai-overage.ts |
1:1 (Code-Registry-Stil) |
PromptFlow/PromptTemplate (Phase 2) |
PromptFlow, PromptTemplate, PromptFlowExecution, PromptFlowOutput(+Mapping), PromptFlowInputVariable, PromptFlowGroup(+Template+Entity) |
promptFlows.prisma |
12 Modelle bereits vorhanden (visueller Prompt-Editor Phase 2) |
Provider-Registry als Code, nicht als DB: Die Spec modelliert LlmGatewayProvider / LlmGatewayModel als „Plattform-weit, Code-Registry". Die Boilerplate setzt das genau so um: providerMetadata + aiModels-Katalog in packages/ai/src/index.ts (mit costPerMInputTokens/costPerMOutputTokens/maxOutputTokens pro Modell). Es gibt keine Prisma-Modelle LlmGatewayProvider/LlmGatewayModel — das ist konform mit der Spec (Code-Registry) und kein Defizit.
Lücken / komplett neu zu bauen
Daten-Layer (in prisma/schema/app.prisma — leerer HiveGrid-Platzhalter)
AiSettings(HiveGrid-spezifisch) — kein Modell vorhanden. Benötigt:enabled_use_cases[],default_models(Use-Case→Modell-Key JSON),data_residency(Defaulteu, Hard-Constraint). Teilweise durchTenant.aiQuotaOverrideJsongedeckt; HiveGrid-Settings-Modell neu.TenantEmbedding-Tabelle — als Prisma-Modell nicht vorhanden. Die Boilerplate legt Vektoren über pgvector invec_<namespace>_<collection>-Tabellen per Raw-SQL an (kein Prisma-Modell). Spec verlangt zusätzlich Metadaten-Tracking (entity_type,entity_id,text_sourcefür Re-Embed-Hash,embedding_model_id,last_embedded_at) — Metadaten-Begleittabelle neu bauen (die Vektoren selbst kommen aus dem vorhandenen pgvector-Adapter).HelpArticleEmbedding(M38-Kopplung) — nicht vorhanden; analog zu TenantEmbedding über pgvector + Begleit-Metadaten.- Conversation-
kind-Enum + per-Message-Token-Felder — kleine Schema-Erweiterung anChat/ChatMessage. - Whisper-Transkriptions-Modell (Job-Status, Audio-Ref, Transkript, Sprache, Edit-State) — komplett neu.
Whisper-EU-Transkription (Spec Block E) — KOMPLETT FEHLT
- Kein Transcription-Adapter, keine
transcribe()-Methode inpackages/ai, kein Audio/Whisper-Code (grep überpackages/ai/srcergab 0 Treffer für transcri/whisper/audio/speech). - Queue-Payload
AiJobkennt nurai.chat-completion/ai.embedding/ai.browser-task—ai.transcribefehlt. - Neu zu bauen: Whisper-auf-Scaleway-GPU-Adapter (DSGVO-konform), Async-Pipeline (Storage-Upload → Queue → Whisper → Resultat — Bausteine
storage+queuevorhanden), Auto-Sprache-Erkennung (DE/EN), Mikrofon-Aufnahme-UI, Edit-Funktion, Klartext-Fehler.
Use-Case-Orchestrierung (Spec Block C) — Gateway-Bausteine da, Use-Cases neu
- Lead-Zusammenfassung / Pre-Termin-Brief (Use-Case 2): Activity-Stream + Custom-Felder + Form-Submissions als Kontext sammeln, Cache-Hit-Logik (gleiche Datenbasis), Widget im Kontakt-Detail. Neu.
- Programm-Hilfe-Chat (Use-Case 3): RAG über Help-Articles + Conversation-Historie. Streaming-Chat-Baustein vorhanden, Orchestrierung + UI neu.
- Klartext-Diagnostik-Fallback (Use-Case 4): KI nur Fallback bei unbekannten Fehler-Codes, klar markiert. Neu.
- Stuck-Deal-Vorschläge (Use-Case 5): wöchentlicher Cron-Job, Widget. Neu (Cron via M-Infra).
- Email-Klassifizierung (Use-Case 7):
lead|customer_question|invoice|spam|newsletter|other, Inbox-Auto-Verknüpfung (M9). Neu. - Sprach-zu-Automation (M086, USP-Hauptstütze): Sprach-Befehl → Wenn-Dann-Vorschlag im visuellen Editor, Rückfrage bei Mehrdeutigkeit, Existenz-Probe referenzierter Pipelines/Mitarbeiter/Templates, Risiko-Warnungen, „Vorher/Nachher"-Diff, NIE Auto-Aktivierung. Tool-Registry + Streaming + Prompt-Registry als Fundament; die gesamte Orchestrierung + Editor-Integration (M078) + Voice-Input (Web-Speech-API) neu.
Sicherheits-Layer (Spec Block G) — teilweise
- Input-Sanitization (Runtime): FEHLT als Modul. Die Boilerplate hat Promptfoo-Test-Vektoren (
tests/promptfoo/injection-vectors.yaml, deterministischer Test-Provider), aber keine produktive Sanitizer-Funktion, die Marker (---SYSTEM:,[INST],<|im_start|>) in externen Daten neutralisiert oder Eingabe-Länge cappt (grep ergab 0 Runtime-Treffer). Neu bauen. - System-Prompt-Trennung: Prompt-Registry (
{{var}}-Templates) ist da; strikte 3-Block-Trennung (System / User-Daten „nicht als Anweisung" / Frage) als Konvention/Template neu definieren. - Action-Boundary (M087): Bausteine vorhanden (
createReviewRequiredResult(), Mutation-Audit-Events, Streaming-Guard-Evaluator) — die Bestätigungs-Workflow-Verdrahtung im UI + Tool-Output-only-Policy neu.
Multi-Provider-Fallback (M084) — fast fertig, 2 Lücken
- Aktiver 1-Min-Health-Ping + 5-Min-Sperre (Spec 18.6.3): vorhandener
AIProviderHealthTrackerist reaktiv (failure-on-call, 30-Min-Window). Aktives Pingen + 5-Min-Re-Check-Fenster ergänzen. - Deterministischer Response-Cache (Spec H/18.7: Cache-Hit auch bei KI-Down): nicht vorhanden — es gibt
spend-cache(Kosten), aber keinen Output-Cache für deterministische Prompts. Neu (Hash-basiert).
Pay-as-you-go (M088) — Engine da, Verdrahtung + Notbremse neu
- Overage-Berechnung (
ai-overage.ts) + Cost-Felder (AICostEvent.markedUpCostCents/stripeReportedAt) fertig. - Umstellung Hard-Deny → Overage:
assertCredit.tswirft aktuell bei Limit (HTTP 402). [N13] verlangt weiterlaufen + Aufschlag. Pfad umbauen. - Notbremse (18.8.7): absolute Euro-Obergrenze pro Tenant → Drosselungs-Modus (nur geschäftskritische KI). Neu (Threshold + Capability-Whitelist).
- Stripe-Metered-Billing-Reporter (18.8.6):
stripeReportedAt-Watermark + nightly Cron vorgesehen; Stripe-Anbindung kommt aus M153/M156. Verdrahtung neu. - Upsell-Logik (18.8.5): Vergleich Overage-Kosten vs. Plan-Differenz → Soft-Recommendation. Neu.
UI — KOMPLETT NEU (Boilerplate liefert KEIN HiveGrid-UI)
- Programm-Hilfe-Chat-Oberfläche (Streaming)
- KI-Sprach-Assistent (M086, Sidebar-Gruppe „AUTOMATION & KI" → laut INTEGRATION-CONTRACTS §1)
- Usage-Dashboard
/{tenant}/admin/usage/ai(Pie pro Use-Case, Verbrauch über Zeit, Top-User, Forecast, Tarif, Notbremse-Stand) - AI-Settings-Seite (EU-DSGVO-Klartext, Modell-Defaults pro Use-Case, Token-Override) — Sidebar „EINSTELLUNGEN → Mandant"
- Voice-Aufnahme-Komponente (Mikrofon-Tap/Toggle, Edit, Klartext-Fehler)
- Lead-Zusammenfassungs-Widget, Stuck-Deal-Widget
- Action-Boundary-Bestätigungs-Dialog
- DoD-Pflicht (alle Milestones): View-Model-Loader-Trennung, keine Prisma-Imports in
packages/ui-hivegrid/**, Subframe-Adapter, i18n-Keys, Smoke-Tests, Hot-Swap-Drill gegenpackages/ui-mock, Visual-Regression — alles HiveGrid-seitig neu.
Querschnitt-Wiring (HiveGrid-seitig)
- Sidebar-Registrierung in
packages/ui-hivegrid/src/app-shell/sidebar.config.ts(M086 → Gruppe „AUTOMATION & KI"; Usage/Settings → „EINSTELLUNGEN") - Routes unter Tenant-URL-Pattern, Breadcrumbs, Customer-Portal-Sichtbarkeit
- i18n-Keys für alle Klartext-Fehler (Spec 18.12 — 5 konkrete Beispiele) aus M002-Catalog
- Activity-Stream (
logActivity) + Notifications (notify()) Anbindung - Permission-Seed der 6
ai.*-Permissions + 3 Bundles + Default-Rollen-Zuweisung - Feature-Flag pro KI-Modul
Empfohlenes Vorgehen (Reihenfolge)
Phase 0 — Voraussetzung (vor M083): EU-Sterilisation der Boilerplate prüfen. Der aktive Provider-Pfad ist bereits EU-only (Mistral/Scaleway/Aleph Alpha); Anthropic/OpenAI existieren nur als Embedding-Stub bzw. @ai-sdk/openai-compatible-Bibliothek (packages/ai/src/embeddings/providers/{openai,anthropic}.ts). Sicherstellen, dass diese nicht aktiviert/registriert werden (DSGVO-Hard-Constraint, Spec 18.2.2).
M083 (EU-Provider-Layer) — überwiegend ÜBERNEHMEN:
packages/aiProvider-Registry + Mistral/Scaleway/Aleph-Alpha-Adapter 1:1 nutzen.executeLLMCallals zentralen Gateway-Wrapper verdrahten (Boundary in apps/api injiziert Env-Snapshots + Cost-Publisher + Prisma-Adapter).- EU-DSGVO-Klartext in AiSettings (Spec 18.2.4) als i18n-Key.
M084 (Fallback) — ÜBERNEHMEN + 2 Erweiterungen:
fallback.ts(30-Min-Window, Mistral→Scaleway→Aleph-Alpha) 1:1.- NEU: aktiver 1-Min-Health-Ping + 5-Min-Sperre.
- NEU: deterministischer Output-Cache (Hash-basiert, Cache-Hit bei KI-Down).
- Graceful-Degradation-Klartexte + Editor-Fallback-Hinweis (UI).
M085 (Promptfoo) — fast fertig ÜBERNEHMEN:
promptfoo.config.yaml+tests/promptfoo/injection-vectors.yaml+.gitea/workflows/promptfoo.yml1:1.- NEU: pro HiveGrid-Prompt-Flow eigene Eval-Vektoren ergänzen; CI-Gate verifizieren.
M087 (RAG + Aktions-Grenze) — Bausteine ÜBERNEHMEN, Wiring neu:
- pgvector-Migration aktivieren;
vector-storetenant-scoped +embeddings-Pipeline 1:1. - NEU:
TenantEmbedding-Metadaten-Modell inapp.prisma(Re-Embed-Hash, embedding_model_id, last_embedded_at). - NEU: Permission-Pre-Filter vor Vector-Search (Spec 18.3.3).
- NEU: Embedding-Trigger bei Entity-Anlage/Update (Outbox
rag.index.*vorhanden — Domain-Writes andocken). - Action-Boundary:
createReviewRequiredResult()+ Mutation-Audit + UI-Bestätigungs-Dialog. - NEU: Runtime-Input-Sanitizer (Marker-Neutralisierung + Längen-Cap).
M086 (Sprach-zu-Automation, USP) — meiste Eigenleistung:
- Tool-Registry + Streaming + Prompt-Registry als Fundament.
- NEU: Sprach→Wenn-Dann-Orchestrierung, Existenz-Probe, Rückfrage-Loop, Risiko-Warnung, Vorher/Nachher-Diff, Voice-Input (Web-Speech-API), Editor-Integration (M078). NIE Auto-Aktivierung.
- Abhängig von M087 (Aktions-Grenze) + M075-M077 (Automation-Schema).
M088 (Token-Limits + Pay-as-you-go) — Engine ÜBERNEHMEN, Policy umbauen:
ai-quotas.ts+ai-overage.ts+AICostEvent/TenantAICostSummary1:1 (HiveGrid-Plan-Werte einsetzen, sobald Pricing fixiert).- UMBAU:
assertCredit.tsHard-Deny → Pay-as-you-go-Overage-Pfad ([N13]). - NEU: Notbremse (absolute Euro-Obergrenze → Drosselung statt Pause), Upsell-Logik, 80%-Banner+Email, Usage-Dashboard.
- Stripe-Metered-Reporter andocken (M153/M156).
Whisper-EU (Spec Block E) — separater Neubau-Strang (parallel/danach):
- NEU: Whisper-auf-Scaleway-GPU-Adapter +
transcribe()-Methode inpackages/ai. - NEU:
ai.transcribe-Queue-Job + Async-Pipeline (storage + queue vorhanden). - NEU: Voice-Aufnahme-UI + Edit + Klartext-Fehler.
Querschnitt zum Schluss jedes Milestones (DoD): Sidebar-Wiring, Routes/Breadcrumbs, Permission-Seed (6 ai.* + Bundles + Default-Rollen), i18n-Klartexte (18.12), Activity/Notifications, Feature-Flags, View-Model-Loader-Trennung, Smoke- + Hot-Swap- + Visual-Regression-Tests.