Spaces:
Paused
Paused
| import { env } from "$env/dynamic/private"; | |
| import { isURL } from "$lib/utils/isUrl"; | |
| import type { WebSearchSource } from "$lib/types/WebSearch"; | |
| interface YouWebSearch { | |
| hits: YouSearchHit[]; | |
| latency: number; | |
| } | |
| interface YouSearchHit { | |
| url: string; | |
| title: string; | |
| description: string; | |
| snippets: string[]; | |
| } | |
| export default async function searchWebYouApi(query: string): Promise<WebSearchSource[]> { | |
| 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 | |
| .filter(({ url }) => isURL(url)) | |
| .map(({ title, url, snippets }) => ({ | |
| title, | |
| link: url, | |
| text: snippets?.join("\n") || "", | |
| })) | |
| .sort((a, b) => b.text.length - a.text.length); // desc order by text length | |
| return formattedResultsWithSnippets; | |
| } | |