| | import type { YouWebSearch } from "../../types/WebSearch"; |
| | import { WebSearchProvider } from "../../types/WebSearch"; |
| | import { env } from "$env/dynamic/private"; |
| | import { getJson } from "serpapi"; |
| | import type { GoogleParameters } from "serpapi"; |
| | import { searchWebLocal } from "./searchWebLocal"; |
| | import { searchSearxng } from "./searchSearxng"; |
| |
|
| | |
| | export function getWebSearchProvider() { |
| | if (env.YDC_API_KEY) { |
| | return WebSearchProvider.YOU; |
| | } else if (env.SEARXNG_QUERY_URL) { |
| | return WebSearchProvider.SEARXNG; |
| | } else { |
| | return WebSearchProvider.GOOGLE; |
| | } |
| | } |
| |
|
| | |
| | export async function searchWeb(query: string) { |
| | if (env.USE_LOCAL_WEBSEARCH) { |
| | return await searchWebLocal(query); |
| | } |
| | if (env.SEARXNG_QUERY_URL) { |
| | return await searchSearxng(query); |
| | } |
| | if (env.SERPER_API_KEY) { |
| | return await searchWebSerper(query); |
| | } |
| | if (env.YDC_API_KEY) { |
| | return await searchWebYouApi(query); |
| | } |
| | if (env.SERPAPI_KEY) { |
| | return await searchWebSerpApi(query); |
| | } |
| | if (env.SERPSTACK_API_KEY) { |
| | return await searchSerpStack(query); |
| | } |
| | throw new Error("No You.com or Serper.dev or SerpAPI key found"); |
| | } |
| |
|
| | export async function searchWebSerper(query: string) { |
| | const params = { |
| | q: query, |
| | hl: "en", |
| | gl: "us", |
| | }; |
| |
|
| | const response = await fetch("https://google.serper.dev/search", { |
| | method: "POST", |
| | body: JSON.stringify(params), |
| | headers: { |
| | "x-api-key": env.SERPER_API_KEY, |
| | "Content-type": "application/json; charset=UTF-8", |
| | }, |
| | }); |
| |
|
| | |
| | const data = (await response.json()) as Record<string, any>; |
| |
|
| | if (!response.ok) { |
| | throw new Error( |
| | data["message"] ?? |
| | `Serper API returned error code ${response.status} - ${response.statusText}` |
| | ); |
| | } |
| |
|
| | return { |
| | organic_results: data["organic"] ?? [], |
| | }; |
| | } |
| |
|
| | export async function searchWebSerpApi(query: string) { |
| | const params = { |
| | q: query, |
| | hl: "en", |
| | gl: "us", |
| | google_domain: "google.com", |
| | api_key: env.SERPAPI_KEY, |
| | } satisfies GoogleParameters; |
| |
|
| | |
| | const response = await getJson("google", params); |
| |
|
| | return response; |
| | } |
| |
|
| | export async function searchWebYouApi(query: string) { |
| | const response = await fetch(`https://api.ydc-index.io/search?query=${query}`, { |
| | method: "GET", |
| | headers: { |
| | "X-API-Key": env.YDC_API_KEY, |
| | "Content-type": "application/json; charset=UTF-8", |
| | }, |
| | }); |
| |
|
| | if (!response.ok) { |
| | throw new Error(`You.com API returned error code ${response.status} - ${response.statusText}`); |
| | } |
| |
|
| | const data = (await response.json()) as YouWebSearch; |
| | const formattedResultsWithSnippets = data.hits |
| | .map(({ title, url, snippets }) => ({ |
| | title, |
| | link: url, |
| | text: snippets?.join("\n") || "", |
| | hostname: new URL(url).hostname, |
| | })) |
| | .sort((a, b) => b.text.length - a.text.length); |
| |
|
| | return { |
| | organic_results: formattedResultsWithSnippets, |
| | }; |
| | } |
| |
|
| | export async function searchSerpStack(query: string) { |
| | const response = await fetch( |
| | `http://api.serpstack.com/search?access_key=${env.SERPSTACK_API_KEY}&query=${query}&hl=en&gl=us`, |
| | { |
| | method: "GET", |
| | headers: { |
| | "Content-type": "application/json; charset=UTF-8", |
| | }, |
| | } |
| | ); |
| |
|
| | const data = (await response.json()) as Record<string, any>; |
| |
|
| | if (!response.ok) { |
| | throw new Error( |
| | data["error"] ?? |
| | `SerpStack API returned error code ${response.status} - ${response.statusText}` |
| | ); |
| | } |
| |
|
| | const resultsWithSnippets = data["organic_results"].map( |
| | ({ title, url, snippet }: { title: string; url: string; snippet: string | undefined }) => ({ |
| | title, |
| | link: url, |
| | text: snippet || "", |
| | }) |
| | ); |
| |
|
| | return { |
| | organic_results: resultsWithSnippets ?? [], |
| | }; |
| | } |
| |
|