70 lines
1.4 KiB
TypeScript
70 lines
1.4 KiB
TypeScript
export interface SearchResult {
|
|
title: string;
|
|
url: string;
|
|
content: string;
|
|
score: number;
|
|
}
|
|
|
|
const TAVILY_API_URL = "https://api.tavily.com/search";
|
|
|
|
export async function searchItem(
|
|
itemName: string,
|
|
context: string
|
|
): Promise<SearchResult[]> {
|
|
const apiKey = process.env.TAVILY_API_KEY;
|
|
if (!apiKey) {
|
|
return [];
|
|
}
|
|
|
|
try {
|
|
const query = `${itemName} ${context}`.trim();
|
|
|
|
const response = await fetch(TAVILY_API_URL, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
api_key: apiKey,
|
|
query,
|
|
max_results: 5,
|
|
include_answer: false,
|
|
search_depth: "advanced",
|
|
}),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
console.error(
|
|
`Tavily API error: ${response.status} ${response.statusText}`
|
|
);
|
|
return [];
|
|
}
|
|
|
|
const data = await response.json();
|
|
|
|
if (!data.results || !Array.isArray(data.results)) {
|
|
return [];
|
|
}
|
|
|
|
return data.results.map(
|
|
(result: {
|
|
title?: string;
|
|
url?: string;
|
|
content?: string;
|
|
score?: number;
|
|
}) => ({
|
|
title: result.title ?? "",
|
|
url: result.url ?? "",
|
|
content: result.content ?? "",
|
|
score: result.score ?? 0,
|
|
})
|
|
);
|
|
} catch (error) {
|
|
console.error(
|
|
`Tavily search failed for "${itemName}":`,
|
|
error instanceof Error ? error.message : error
|
|
);
|
|
return [];
|
|
}
|
|
}
|