# Admin-Tool Modularisierung & Replicate-Integration > **Dokument erstellt:** 28.01.2025 > **Status:** Konzeptphase > **Ziel:** Wiederverwendbares Admin-Tool mit KI-Bildgenerierung ## 📋 Executive Summary Das Memoro Admin-Tool entwickelt sich zu einem eigenständigen, wertvollen Werkzeug. Dieses Dokument beschreibt Konzepte zur: 1. **Modularisierung** des Admin-Tools für Wiederverwendbarkeit in anderen Projekten 2. **Integration von Replicate** zur KI-basierten Bildgenerierung für Personas 3. **Backend-Architektur** auf Hetzner VPS mit Coolify ## 🎯 Anforderungen ### Funktionale Anforderungen - Admin-Tool soll in anderen Websites wiederverwendbar sein - Komplette Trennung von Code und Content - KI-basierte Bildgenerierung für Personas via Replicate - Zentrale Backend-Services auf Hetzner VPS - Verwaltung via Coolify (Docker-basiert) ### Nicht-funktionale Anforderungen - Einfache Installation/Integration - Minimale Dependencies - Skalierbare Architektur - Sichere API-Kommunikation - Kosteneffiziente Bildgenerierung ## 🏗️ Modularisierungskonzepte ### Konzept 1: NPM Package + API Backend **Architektur:** ``` @memoro/admin-tool (NPM Package) ├── components/ # Wiederverwendbare UI-Komponenten ├── layouts/ # Admin-Layouts ├── hooks/ # React/Vue Hooks für API ├── types/ # TypeScript Definitionen └── utils/ # Helper Functions @memoro/admin-api (Separates Backend) ├── /api/personas # Personas CRUD ├── /api/images # Bildgenerierung ├── /api/content # Content Management └── /api/auth # Authentication ``` **Vorteile:** - ✅ Maximale Wiederverwendbarkeit - ✅ Framework-agnostisch (Adapter Pattern) - ✅ Versionskontrolle via NPM - ✅ Type-Safety durch TypeScript **Nachteile:** - ❌ Komplexe Initial-Setup - ❌ Wartung von zwei Packages - ❌ Breaking Changes Management **Integration:** ```typescript // In beliebiger Astro/Next/Vue App import { AdminTool } from '@memoro/admin-tool'; import { MemoroadminProvider } from '@memoro/admin-tool/providers'; // Konfiguration const config = { apiUrl: 'https://api.memoro-admin.com', apiKey: process.env.MEMORO_API_KEY, features: ['personas', 'content', 'images'] }; ``` ### Konzept 2: Monorepo mit Shared Packages **Struktur:** ``` memoro-workspace/ ├── apps/ │ ├── memoro-website/ # Aktuelle Website │ ├── admin-dashboard/ # Standalone Admin │ └── api-backend/ # Zentrales Backend ├── packages/ │ ├── admin-ui/ # UI Components │ ├── admin-core/ # Business Logic │ ├── content-types/ # Shared Types │ └── api-client/ # API Client Library └── services/ ├── image-generator/ # Replicate Service └── content-sync/ # Content Synchronization ``` **Vorteile:** - ✅ Einheitliche Entwicklung - ✅ Shared Dependencies - ✅ Einfaches Testing - ✅ Atomic Commits **Nachteile:** - ❌ Größeres Repository - ❌ Komplexere CI/CD - ❌ Schwieriger für externe Nutzer **Tools:** - Turborepo oder NX für Monorepo Management - Changesets für Versionierung - pnpm Workspaces für Dependencies ### Konzept 3: Microservices + Web Components **Architektur:** ``` Frontend (Web Components) ├── ├── ├── └── Microservices (Docker/Coolify) ├── persona-service/ # Node.js/Fastify ├── image-service/ # Python/FastAPI + Replicate ├── content-service/ # Node.js/Express ├── auth-service/ # Node.js/JWT └── gateway/ # Kong/Traefik ``` **Vorteile:** - ✅ Framework-unabhängig - ✅ Isolierte Services - ✅ Unabhängige Skalierung - ✅ Native Browser-Support **Nachteile:** - ❌ Komplexe Orchestrierung - ❌ Network Latency - ❌ Service Discovery **Integration:** ```html ``` ### Konzept 4: Plugin-System (Empfohlen) ⭐ **Architektur:** ``` @memoro/admin-core ├── core/ │ ├── plugin-system.ts # Plugin Registry │ ├── api-client.ts # API Abstraction │ └── auth.ts # Auth Management ├── plugins/ │ ├── personas/ # Personas Plugin │ ├── image-generator/ # Replicate Plugin │ ├── content-manager/ # Content Plugin │ └── analytics/ # Analytics Plugin └── adapters/ ├── astro/ # Astro Integration ├── nextjs/ # Next.js Integration └── vue/ # Vue Integration ``` **Plugin-Beispiel:** ```typescript // personas-plugin.ts export const personasPlugin: AdminPlugin = { id: 'personas', name: 'Personas Management', version: '1.0.0', routes: [ { path: '/personas', component: PersonasList }, { path: '/personas/:id', component: PersonaDetail } ], api: { endpoints: [ { method: 'GET', path: '/personas', handler: getPersonas }, { method: 'POST', path: '/personas/:id/image', handler: generateImage } ] }, permissions: ['personas.read', 'personas.write', 'personas.generate'], config: { replicateModel: 'stability-ai/sdxl', imageStyles: ['portrait', 'professional', 'casual'] } }; ``` **Vorteile:** - ✅ Maximale Flexibilität - ✅ Einfache Erweiterung - ✅ Selective Features - ✅ Community Plugins möglich **Nachteile:** - ❌ Initial-Komplexität - ❌ Plugin-Kompatibilität - ❌ Versioning-Challenges ## 🖼️ Replicate Integration ### Backend Service Architektur ```typescript // services/image-generator/src/replicate-service.ts import Replicate from 'replicate'; import { Queue } from 'bullmq'; import { S3 } from '@aws-sdk/client-s3'; export class ReplicateImageService { private replicate: Replicate; private queue: Queue; private storage: S3; async generatePersonaImage(persona: Persona): Promise { // 1. Prompt generieren basierend auf Persona-Daten const prompt = this.buildPrompt(persona); // 2. Job in Queue einreihen const job = await this.queue.add('generate-image', { personaId: persona.id, prompt, model: 'stable-diffusion-xl', parameters: { width: 1024, height: 1024, num_outputs: 4, guidance_scale: 7.5 } }); // 3. Auf Completion warten const result = await job.waitUntilFinished(); // 4. Bilder in S3/Hetzner speichern const imageUrls = await this.storeImages(result.images); return imageUrls; } private buildPrompt(persona: Persona): string { const { appearance, outfits, demographics } = persona; return ` Professional portrait photo of a ${demographics.age} year old ${demographics.gender}, ${appearance.description}, ${appearance.hairColor} hair in ${appearance.hairStyle}, ${appearance.eyeColor} eyes, wearing ${outfits[0]?.items.top || 'business attire'}, ${appearance.firstImpression}, studio lighting, high quality, detailed, realistic `; } } ``` ### Admin UI Integration ```typescript // components/PersonaImageGenerator.tsx export function PersonaImageGenerator({ persona }: Props) { const [generating, setGenerating] = useState(false); const [images, setImages] = useState([]); const [selectedImage, setSelectedImage] = useState(); const [prompt, setPrompt] = useState(''); const generateImages = async () => { setGenerating(true); const response = await fetch(`/api/personas/${persona.id}/generate-images`, { method: 'POST', body: JSON.stringify({ prompt: prompt || buildDefaultPrompt(persona), style: selectedStyle, count: 4 }) }); const data = await response.json(); setImages(data.images); setGenerating(false); }; return (

KI Bildgenerierung

{/* Prompt Editor */}