ki integration

This commit is contained in:
2026-08-15 13:43:52 +02:00
parent 82d98bd8cf
commit 9ecb292c26
78 changed files with 12055 additions and 55 deletions

View File

@@ -6,9 +6,63 @@ KI-Video-Generierung mit lernender Brand-Knowledge-Base (Elo-Scoring über Attri
- **Desktop-Ansicht:** Design-Handoff für die Desktop-Adaption in [design/desktop-ansicht/](design/desktop-ansicht/) (Spezifikation: [README.md](design/desktop-ansicht/README.md))
- **Backend:** selbst gehostetes Appwrite (`https://appwrite.webklar.com/v1`), Projekt **BrandLoop** `6a5cee34002bb8360c34`, Datenbank `brandloop`
## App (`client/`)
Expo / React Native, eine Codebase für Web und nativ. Stand: Gerüst aus E1
drei Tabs, sonst leer.
```bash
npm --prefix client run web
```
## Bildgenerierung
Die Warteschlange aus `jobs` arbeitet der Dispatcher ab **serverseitig**, weil
der Anbieter-Schlüssel nicht ins Client-Bundle darf:
```bash
BILD_ANBIETER=stub node scripts/job-dispatcher.mjs
```
`stub` erzeugt Platzhalterbilder und macht die ganze Kette prüfbar, ohne Kosten.
`ark` und `openrouter` sprechen die echten Modelle an beide setzen voraus,
dass das jeweilige Konto freigeschaltet bzw. aufgeladen ist:
- **BytePlus Ark:** Modell in der Konsole unter Model Service aktivieren
- **OpenRouter:** Guthaben aufladen
Danach reicht `BILD_ANBIETER=ark node scripts/job-dispatcher.mjs` am Code
ändert sich nichts.
## Demo-Daten
Demo-Daten zum Anschauen (Marke, zwei Ordner, vier Modelle mit echten Bildern
aus `uploads/`) legt alles als **Client** an, belegt damit nebenbei die
Rechte, und ist idempotent:
```bash
node scripts/seed-demo.mjs
```
Die Mandantentrennung lässt sich jederzeit nachprüfen legt zwei echte Konten an,
prüft über die API und räumt sich selbst auf:
```bash
node scripts/test-mandanten.mjs
```
Die Appwrite-SDKs sind **exakt** gepinnt (`appwrite@23.0.0`,
`react-native-appwrite@0.25.0`): der Server läuft 1.8.1, neuere SDKs sprechen
Response-Format 1.9.x. Beim Server-Upgrade beide zusammen anheben.
Konfiguration (Endpoint, Projekt-ID, DB-ID) steht in `client/app.json` unter
`expo.extra.appwrite`. Der Appwrite-**Server-Key** gehört dort **nicht** hinein
er landet sonst im Client-Bundle; er steht in der `.env` im Repo-Root und wird
nur von `scripts/` und später von Appwrite-Functions benutzt.
## Datenbank-Setup
Das komplette Schema (15 Tabellen, Indizes, 4 Storage-Buckets, internes Dev-Team) legt
Das komplette Schema (22 Tabellen, Indizes, 5 Storage-Buckets, internes Dev-Team) legt
[scripts/setup-appwrite.mjs](scripts/setup-appwrite.mjs) an idempotent, kann nach
Plan-Erweiterungen jederzeit erneut laufen:
@@ -39,8 +93,8 @@ node scripts/seed-prompts.mjs
- **Referenzen als indizierte String-Spalten (size 64) statt Relationship-Spalten.**
Appwrite-Relationships sind nicht filter-/indizierbar der Top-N-Index auf
`attributes` (`brand_id, category_id, status, score DESC`) und alle Listen-Queries
brauchen aber genau das. Many-to-many (`videos.attribute_ids`) ist ein String-Array
`attribute_scores` (`brand_id, folder_id, category_id, score DESC`) und alle
Listen-Queries brauchen aber genau das. Many-to-many (`videos.attribute_ids`) ist ein String-Array
(`Query.contains`). IDs mit 64 Zeichen, weil uuid4 = 36 Zeichen.
- **`created_at`-Spalten entfallen** Appwrite pflegt `$createdAt` automatisch
(Indizes nutzen `$createdAt` direkt, z. B. `score_events`, `jobs`).