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>
51 lines
1.8 KiB
TypeScript
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;
|
|
}
|
|
}
|