| import { createGoogleGenerativeAI } from "@ai-sdk/google"; |
| import type { createLoggerWithContext } from "@midday/logger"; |
| import { generateText } from "ai"; |
| import { removeProtocolFromDomain } from "../utils"; |
|
|
| const google = createGoogleGenerativeAI({ |
| apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY!, |
| }); |
|
|
| const DOMAIN_LOOKUP_TIMEOUT = 8000; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export async function lookupDomainByCompanyName( |
| companyName: string | null | undefined, |
| logger?: ReturnType<typeof createLoggerWithContext>, |
| ): Promise<string | null> { |
| |
| if (!companyName || companyName.trim().length === 0) { |
| return null; |
| } |
|
|
| const cleanedCompanyName = companyName.trim(); |
|
|
| |
| if (cleanedCompanyName.length < 2) { |
| return null; |
| } |
|
|
| logger?.info("Attempting domain lookup", { companyName: cleanedCompanyName }); |
|
|
| try { |
| |
| const controller = new AbortController(); |
| const timeoutId = setTimeout(() => { |
| controller.abort(); |
| }, DOMAIN_LOOKUP_TIMEOUT); |
|
|
| const prompt = `What is the official website domain for the company "${cleanedCompanyName}"? |
| |
| Respond with ONLY the domain name (e.g., "example.com"), without protocol (http://, https://), without www prefix, and without any paths. |
| If you cannot find the official website, respond with "unknown". |
| |
| Domain:`; |
|
|
| const result = await generateText({ |
| model: google("gemini-3-flash-preview"), |
| tools: { |
| google_search: google.tools.googleSearch({}), |
| } as any, |
| prompt, |
| temperature: 0.1, |
| abortSignal: controller.signal, |
| }); |
|
|
| clearTimeout(timeoutId); |
|
|
| const responseText = result.text.trim().toLowerCase(); |
|
|
| |
| if ( |
| responseText === "unknown" || |
| responseText === "not found" || |
| responseText === "n/a" || |
| responseText.length === 0 |
| ) { |
| logger?.info("Domain lookup returned unknown", { |
| companyName: cleanedCompanyName, |
| }); |
| return null; |
| } |
|
|
| |
| const domain = removeProtocolFromDomain(responseText); |
|
|
| if (!domain) { |
| logger?.warn("Domain lookup returned invalid domain", { |
| companyName: cleanedCompanyName, |
| response: responseText, |
| }); |
| return null; |
| } |
|
|
| logger?.info("Domain lookup successful", { |
| companyName: cleanedCompanyName, |
| domain, |
| }); |
|
|
| return domain.toLowerCase(); |
| } catch (error) { |
| |
| if (error instanceof Error && error.name === "AbortError") { |
| logger?.warn("Domain lookup timed out", { |
| companyName: cleanedCompanyName, |
| timeout: DOMAIN_LOOKUP_TIMEOUT, |
| }); |
| return null; |
| } |
|
|
| |
| logger?.warn("Domain lookup failed", { |
| companyName: cleanedCompanyName, |
| error: error instanceof Error ? error.message : "Unknown error", |
| }); |
|
|
| return null; |
| } |
| } |
|
|