Files
lead-scraper/lib/services/openai.ts
TimoUttenweiler 89a176700d feat: GPT-4.1 optimierte Ergänzungssuche bei Maps-Lücke
Wenn Google Maps weniger Leads findet als angefragt, wird automatisch
eine optimierte Suchanfrage via GPT-4.1 generiert und als SERP-Job
gestartet, um die Lücke zu füllen. Die KI-Query wird im LoadingCard
angezeigt. Fallback auf Original-Query wenn kein OpenAI-Key konfiguriert.

- lib/services/openai.ts: GPT-4.1 Query-Generator
- app/api/search/supplement: neuer Endpoint (GPT + SERP-Job)
- LoadingCard: ruft /api/search/supplement statt direkt SERP
- apiKey.ts + .env.local.example: openai Key-Support

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 10:43:33 +02:00

51 lines
1.8 KiB
TypeScript

import OpenAI from "openai";
/**
* Generates an optimized alternative search query when the primary Maps search
* returned fewer results than requested. Uses GPT-4.1 to find synonyms,
* related terms, or slight regional variations that surface different businesses.
*
* Returns null if OpenAI is not configured or the call fails (caller should fall
* back to the original query).
*/
export async function generateSupplementQuery(
query: string,
region: string,
foundCount: number,
targetCount: number,
apiKey: string,
): Promise<string | null> {
const client = new OpenAI({ apiKey });
const searchQuery = region ? `${query} ${region}` : query;
try {
const response = await client.chat.completions.create({
model: "gpt-4.1",
messages: [
{
role: "system",
content:
"Du bist ein Experte für B2B-Lead-Generierung in Deutschland. " +
"Antworte immer nur mit der Suchanfrage selbst — keine Anführungszeichen, keine Erklärungen.",
},
{
role: "user",
content:
`Eine Google-Suche nach "${searchQuery}" hat nur ${foundCount} von ${targetCount} Unternehmen gefunden. ` +
`Erstelle eine alternative Suchanfrage (max. 6 Wörter), die weitere passende Unternehmen findet, ` +
`die die erste Suche nicht erfasst hat. Nutze Synonyme, verwandte Branchen-Begriffe oder ` +
`leichte Variationen der Region — aber halte den Fokus auf dieselbe Branche und Region.`,
},
],
max_tokens: 30,
temperature: 0.7,
});
const text = response.choices[0]?.message?.content?.trim();
return text || null;
} catch (err) {
console.error("OpenAI query generation failed:", err);
return null;
}
}