diff --git a/src/chains/imageSearchAgent.ts b/src/chains/imageSearchAgent.ts index 04fb108..b2c4155 100644 --- a/src/chains/imageSearchAgent.ts +++ b/src/chains/imageSearchAgent.ts @@ -11,6 +11,7 @@ import { searchSearxng } from '../lib/searchEngines/searxng'; import { searchGooglePSE } from '../lib/searchEngines/google_pse'; import { searchBraveAPI } from '../lib/searchEngines/brave'; import { searchYaCy } from '../lib/searchEngines/yacy'; +import { searchBingAPI } from '../lib/searchEngines/bing'; import { getSearchEngineBackend } from '../config'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; @@ -107,6 +108,21 @@ async function performImageSearch(query: string) { break; } + case 'bing': { + const bingResult = await searchBingAPI(query); + images = bingResult.results.map((result) => { + if (result.img_src && result.url && result.title) { + return { + img_src: result.img_src, + url: result.url, + title: result.title, + source: result.url + } + } + }).filter(Boolean); + break; + } + default: throw new Error(`Unknown search engine ${searchEngine}`); } diff --git a/src/chains/videoSearchAgent.ts b/src/chains/videoSearchAgent.ts index 1fcbc13..5bff63d 100644 --- a/src/chains/videoSearchAgent.ts +++ b/src/chains/videoSearchAgent.ts @@ -10,7 +10,7 @@ import { StringOutputParser } from '@langchain/core/output_parsers'; import { searchSearxng } from '../lib/searchEngines/searxng'; import { searchGooglePSE } from '../lib/searchEngines/google_pse'; import { searchBraveAPI } from '../lib/searchEngines/brave'; -import { searchYaCy } from '../lib/searchEngines/yacy'; +import { searchBingAPI } from '../lib/searchEngines/bing'; import { getSearchEngineBackend } from '../config'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; @@ -108,6 +108,22 @@ async function performVideoSearch(query: string) { break; } + case 'bing': { + const bingResult = await searchBingAPI(youtubeQuery); + bingResult.results.forEach((result) => { + if (result.img_src && result.url && result.title) { + const videoId = new URL(result.url).searchParams.get('v'); + videos.push({ + img_src: result.img_src, + url: result.url, + title: result.title, + iframe_src: videoId ? `https://www.youtube.com/embed/${videoId}` : null + }); + } + }); + break; + } + default: throw new Error(`Unknown search engine ${searchEngine}`); } diff --git a/src/lib/searchEngines/bing.ts b/src/lib/searchEngines/bing.ts index c03c82d..dd9efd8 100644 --- a/src/lib/searchEngines/bing.ts +++ b/src/lib/searchEngines/bing.ts @@ -32,15 +32,12 @@ interface BingAPISearchResult { width?: number; height?: number; }; - provider?: Array<{ - name: string; - _type: string; - }>; video?: { allowHttpsEmbed?: boolean; embedHtml?: string; allowMobileEmbed?: boolean; viewCount?: number; + duration?: string; }; image?: { thumbnail?: { @@ -51,29 +48,14 @@ interface BingAPISearchResult { imageInsightsToken?: string; imageId?: string; }; - metatags?: Array<{ - [key: string]: string; - 'og:type'?: string; - 'og:image'?: string; - 'og:video'?: string; - }>; - mentions?: Array<{ - name: string; - }>; - entity?: { - entityPresentationInfo?: { - entityTypeHints?: string[]; - }; - }; } - export const searchBingAPI = async (query: string) => { try { const bingApiKey = await getBingSubscriptionKey(); const url = new URL(`https://api.cognitive.microsoft.com/bing/v7.0/search`); url.searchParams.append('q', query); - url.searchParams.append('responseFilter', 'Webpages,Images,Videos,News'); + url.searchParams.append('responseFilter', 'Webpages,Images,Videos'); const res = await axios.get(url.toString(), { headers: { @@ -87,11 +69,13 @@ export const searchBingAPI = async (query: string) => { } const originalres = res.data; + + // Extract web, image, and video results const webResults = originalres.webPages?.value || []; const imageResults = originalres.images?.value || []; const videoResults = originalres.videos?.value || []; - const results = webResults.map((item: any) => ({ + const results = webResults.map((item: BingAPISearchResult) => ({ title: item.name, url: item.url, content: item.snippet, @@ -102,7 +86,9 @@ export const searchBingAPI = async (query: string) => { videoData: { duration: item.video.duration, embedUrl: item.video.embedHtml?.match(/src="(.*?)"/)?.[1] - } + }, + publisher: item.publisher, + datePublished: item.datePublished }) })); @@ -113,4 +99,4 @@ export const searchBingAPI = async (query: string) => { : error.message || 'Unknown error'; throw new Error(`Bing API Error: ${errorMessage}`); } -}; +}; \ No newline at end of file diff --git a/src/routes/discover.ts b/src/routes/discover.ts index ecf3099..8206d38 100644 --- a/src/routes/discover.ts +++ b/src/routes/discover.ts @@ -3,6 +3,7 @@ import { searchSearxng } from '../lib/searchEngines/searxng'; import { searchGooglePSE } from '../lib/searchEngines/google_pse'; import { searchBraveAPI } from '../lib/searchEngines/brave'; import { searchYaCy } from '../lib/searchEngines/yacy'; +import { searchBingAPI } from '../lib/searchEngines/bing'; import { getSearchEngineBackend } from '../config'; import logger from '../utils/logger'; @@ -72,6 +73,20 @@ async function performSearch(query: string, site: string) { })) } + case 'bing': { + const bingResult = await searchBingAPI(query); + return bingResult.results.map(item => ({ + title: item.title, + url: item.url, + content: item.content, + thumbnail: item.img_src, + img_src: item.img_src, + iframe_src: null, + author: item?.publisher || site, + publishedDate: item?.datePublished + })) + } + default: throw new Error(`Unknown search engine ${searchEngine}`); }