import { LYRA_TOPICS, TOPIC_HINTS, type LyraTopic } from "./lyra-post.post"; const LYRA_SYSTEM_PROMPT = `Du bist Lyra – Recovery-Coach und Begleiterin der ReBreak-Community. Du hast tiefes Wissen in CBT, Verhaltenspsychologie und dem Alltag von Menschen mit Spielsucht. Du schreibst kurze Community-Beiträge. Deine Stimme: - Direkt und persönlich – du sprichst die Person an ("du") - Warmherzig, geerdet, wie jemand der wirklich zuhört - Niemals klischeehafte Motivationsfloskeln ("Du schaffst das!!!") - Kein KI-Sprech, keine Listen, keine Aufzählungen - Keine Casino-Werbung, keine Links, keine medizinischen Diagnosen - Auf Deutsch, max. 3–4 Sätze Antworte NUR mit dem Post-Text. Kein "Lyra:" Prefix, keine Anführungszeichen.`; const REBREAK_SYSTEM_PROMPT = `Du bist der offizielle ReBreak Account. ReBreak ist eine App zur Überwindung von Glücksspielsucht. Du postest Neuigkeiten, Updates und Community-Ankündigungen. Deine Tonalität: - Offiziell aber nahbar – wie ein Team-Update, nicht wie Werbung - Kurz (max. 3–4 Sätze) - Sachlich und informativ, gelegentlich motivierend - Keine medizinischen Ratschläge, keine Links - Auf Deutsch Antworte NUR mit dem Post-Text. Kein "ReBreak:" Prefix, keine Anführungszeichen.`; /** POST /api/admin/lyra-generate — generiert Text via LLM ohne zu posten */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig(); const adminSecret = getHeader(event, "x-admin-secret"); if (!config.adminSecret || adminSecret !== config.adminSecret) { throw createError({ statusCode: 401, message: "Unauthorized" }); } if (!config.groqApiKey) { throw createError({ statusCode: 500, message: "Groq API Key fehlt" }); } const body = await readBody(event); const author: "lyra" | "rebreak" = body?.author === "rebreak" ? "rebreak" : "lyra"; const topic: LyraTopic = LYRA_TOPICS.includes(body?.topic) ? body.topic : LYRA_TOPICS[Math.floor(Math.random() * LYRA_TOPICS.length)]; const context: string | undefined = body?.context?.trim() || undefined; const userPrompt = context ? `${TOPIC_HINTS[topic]}\n\nZusätzlicher Kontext für diesen Post: ${context}` : TOPIC_HINTS[topic]; const systemPrompt = author === "rebreak" ? REBREAK_SYSTEM_PROMPT : LYRA_SYSTEM_PROMPT; const response = await $fetch<{ choices: { message: { content: string } }[]; }>("https://api.groq.com/openai/v1/chat/completions", { method: "POST", headers: { Authorization: `Bearer ${config.groqApiKey}`, "Content-Type": "application/json", }, body: { model: "llama-3.3-70b-versatile", max_tokens: 200, messages: [ { role: "system", content: systemPrompt }, { role: "user", content: userPrompt }, ], }, }); const content = response.choices?.[0]?.message?.content?.trim(); if (!content) { throw createError({ statusCode: 500, message: "Keine Antwort von LLM" }); } return { success: true, content }; });