import { NextRequest, NextResponse } from "next/server"; const SYSTEM_PROMPT = `Du bist ein Experte für B2B-Lead-Generierung im deutschsprachigen Raum. Deine Aufgabe: Wandle die Beschreibung des Nutzers in 2–4 konkrete Google-Suchanfragen um, die lokale Unternehmen und Dienstleister finden. Regeln: - Jede Query besteht aus einem kurzen Suchbegriff (Branche/Tätigkeit) und einer Region (Bundesland, Stadt oder Gebiet) - Suchbegriffe sind konkret, auf Deutsch, wie ein Mensch bei Google suchen würde - Keine Firmennamen, keine Websites, keine Social-Media-Begriffe - Wenn der Nutzer keine Region nennt, verteile auf sinnvolle deutsche Regionen (z.B. Bayern, NRW, Baden-Württemberg) - Wenn der Nutzer eine spezifische Region nennt, halte dich daran — teile ggf. in Städte auf für mehr Abdeckung - count immer 50 außer der Nutzer nennt explizit eine Zahl (dann zwischen 25 und 100) - Maximal 4 Queries zurückgeben - Keine Erklärungen, nur JSON Antworte ausschließlich mit einem JSON-Array, kein Markdown, kein Text drumherum: [ { "query": "Dachdecker", "region": "Bayern", "count": 50 }, { "query": "Dachdecker", "region": "NRW", "count": 50 } ]`; export async function POST(req: NextRequest) { try { const { description } = await req.json() as { description: string }; if (!description?.trim()) { return NextResponse.json({ error: "Beschreibung fehlt" }, { status: 400 }); } const apiKey = process.env.OPENROUTER_API_KEY; if (!apiKey) { return NextResponse.json({ error: "OpenRouter API Key nicht konfiguriert" }, { status: 500 }); } const res = await fetch("https://openrouter.ai/api/v1/chat/completions", { method: "POST", headers: { "Authorization": `Bearer ${apiKey}`, "Content-Type": "application/json", "HTTP-Referer": "https://onvyaleads.app", "X-Title": "OnyvaLeads", }, body: JSON.stringify({ model: "openai/gpt-4o-mini", temperature: 0.4, max_tokens: 512, messages: [ { role: "system", content: SYSTEM_PROMPT }, { role: "user", content: description.trim() }, ], }), }); if (!res.ok) { const err = await res.text(); console.error("[ai-search] OpenRouter error:", err); return NextResponse.json({ error: "KI-Anfrage fehlgeschlagen" }, { status: 500 }); } const data = await res.json() as { choices: Array<{ message: { content: string } }>; }; const raw = data.choices[0]?.message?.content?.trim() ?? ""; let queries: Array<{ query: string; region: string; count: number }>; try { queries = JSON.parse(raw); } catch { const match = raw.match(/\[[\s\S]*\]/); if (!match) throw new Error("Kein JSON in Antwort"); queries = JSON.parse(match[0]); } queries = queries .filter(q => typeof q.query === "string" && q.query.trim()) .slice(0, 4) .map(q => ({ query: q.query.trim(), region: (q.region ?? "").trim(), count: Math.min(Math.max(Number(q.count) || 50, 25), 100), })); return NextResponse.json({ queries }); } catch (err) { console.error("[ai-search] error:", err); return NextResponse.json({ error: "Fehler bei der KI-Anfrage" }, { status: 500 }); } }