# GenAI-Plattform: App-Pakete bauen > Anleitung für App-Teams und KI-Assistenten: wie ein App-Paket (Modul-Repository mit Terraform-Modul und Ordner genai-cli/) aussieht, damit die GenAI-Plattform von govdigital es in Umgebungen ausrollt und mit Redis, LiteLLM, Postgres, S3, Admin-Zugang und Secrets verdrahtet. Stand 13.10.2026, heutiges Format; eine Einreich-API gibt es noch nicht, Apps kommen über das Plattform-Team in den Katalog. Sprache der Dokumente: Deutsch. Code und Kommentare im Code: Englisch. ## Dokumente - [Anleitung (Markdown, vollständig)](app-entwicklung.md): Repo-Aufbau, jede genai-cli-Datei, Abhängigkeiten, Redis, LiteLLM, Datenbank/S3, Admin und Secrets, Logo, metadata.json, Versionen, Images, AI Hub, lokal prüfen, Übergabe, Checkliste, Stolperstellen - [Regeln für KI-Assistenten](app-entwicklung.md#ki-regeln): die harten Regeln in 14 Punkten - [Doku-Seite](index.html): dieselbe Anleitung als klickbare Seite (erzeugt aus dem Markdown), dazu Baukasten und Vorlagen-Explorer. Für Agenten ist das Markdown die bessere Quelle. - [baukasten.js](baukasten.js): erzeugt genai-cli/ aus Bausteinen (reine Funktionen `GenaiBaukasten.generate(opts)`, `repo(template, opts)`); `node test-baukasten.mjs` prüft alle 128 Kombinationen mit pruefen.sh ## Vorlage - [vorlage/README.md](vorlage/README.md): Kopiervorlage eines vollständigen App-Pakets - [vorlage/genai-cli/terragrunt.hcl.genai](vorlage/genai-cli/terragrunt.hcl.genai): Aufruf des Moduls mit allen Anbindungen - [vorlage/genai-cli/config.litellm.hcl.genai](vorlage/genai-cli/config.litellm.hcl.genai): LiteLLM-Schlüssel - [vorlage/genai-cli/config.secrets.hcl.genai](vorlage/genai-cli/config.secrets.hcl.genai): Secrets, die die Plattform erzeugt - [vorlage/genai-cli/metadata.json](vorlage/genai-cli/metadata.json): Katalogtexte - [vorlage/pruefen.sh](vorlage/pruefen.sh): Paket-Check, Exit 1 bei Fehlern ## Kernfakten - Pflicht: genai-cli/terragrunt.hcl.genai (auf dem Standard-Branch) und metadata.json mit catalog.category (core|observability|ui|tooling|data). Für Partner zusätzlich catalog.summary (eine Zeile), catalog.details (Klartext ohne <>*# und Backtick), catalog.vendor und genai-cli/logo.svg oder logo.png. - .genai-Dateien sind Jinja-Vorlagen (Variablen: source und catalog.defaultValues, immer mit | default). Zur Laufzeit liest das Modul local.common_vars.inputs.*, jeder Zugriff in try(). - Schlüssel ^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$; in config.*, inputs.* und secrets.* mit Unterstrich. - Abhängigkeit = dependencies { paths = ["../redis", "../../applications/litellm"] }; letzter Pfadteil ist der Katalogschlüssel; die Plattform rollt Abhängigkeiten mit und vorher aus. - Redis: inputs.databases.redis.{host,port,password}. LiteLLM: config.litellm.hcl.genai mit key = try(include.global.locals.secrets.litellm.keys., ""), lesen inputs.litellm..key, URL http://${inputs.hosts.litellm}:4000/v1. - Postgres/S3 sind verwaltet, keine Abhängigkeit: config.databases.hcl.genai auf secrets.database..*, config.s3_buckets.hcl.genai auf secrets.s3_buckets..* (Access-Key heißt dort username). - Admin: inputs.default_user_email, default_user_first_name, default_user_password. Eigene Secrets: config.secrets.hcl.genai, locals.required_secrets.. = { type = password|hex|fernet|prefixed|static }, lesen inputs.secrets... admin_password erbt das Admin-Passwort. - Modul ohne provider- und backend-Blöcke, Helm-Provider ~> 2.0, Release-Name ${release_name_prefix}, Images aus registry.onstackit.cloud/govdigital/ mit festem Tag. - AI-Hub-Kachel: catalog.role application und config.domains mit genau dem Schlüssel (mit Unterstrich). - Übergabe: Repo in GitLab-Gruppe genai-plattform/applications, SemVer-Tag; das Plattform-Team importiert unter App-Katalog → Importieren und schaltet die Partner-Sichtbarkeit frei.