This commit is contained in:
HadiCherkaoui
2025-02-28 15:16:54 +01:00
parent 4a7ca8fc68
commit f19d2e3a97
4 changed files with 57 additions and 24 deletions

View File

@ -11,6 +11,7 @@ import { searchSearxng } from '../lib/searchEngines/searxng';
import { searchGooglePSE } from '../lib/searchEngines/google_pse'; import { searchGooglePSE } from '../lib/searchEngines/google_pse';
import { searchBraveAPI } from '../lib/searchEngines/brave'; import { searchBraveAPI } from '../lib/searchEngines/brave';
import { searchYaCy } from '../lib/searchEngines/yacy'; import { searchYaCy } from '../lib/searchEngines/yacy';
import { searchBingAPI } from '../lib/searchEngines/bing';
import { getSearchEngineBackend } from '../config'; import { getSearchEngineBackend } from '../config';
import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
@ -107,6 +108,21 @@ async function performImageSearch(query: string) {
break; 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: default:
throw new Error(`Unknown search engine ${searchEngine}`); throw new Error(`Unknown search engine ${searchEngine}`);
} }

View File

@ -10,7 +10,7 @@ import { StringOutputParser } from '@langchain/core/output_parsers';
import { searchSearxng } from '../lib/searchEngines/searxng'; import { searchSearxng } from '../lib/searchEngines/searxng';
import { searchGooglePSE } from '../lib/searchEngines/google_pse'; import { searchGooglePSE } from '../lib/searchEngines/google_pse';
import { searchBraveAPI } from '../lib/searchEngines/brave'; import { searchBraveAPI } from '../lib/searchEngines/brave';
import { searchYaCy } from '../lib/searchEngines/yacy'; import { searchBingAPI } from '../lib/searchEngines/bing';
import { getSearchEngineBackend } from '../config'; import { getSearchEngineBackend } from '../config';
import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
@ -108,6 +108,22 @@ async function performVideoSearch(query: string) {
break; 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: default:
throw new Error(`Unknown search engine ${searchEngine}`); throw new Error(`Unknown search engine ${searchEngine}`);
} }

View File

@ -32,15 +32,12 @@ interface BingAPISearchResult {
width?: number; width?: number;
height?: number; height?: number;
}; };
provider?: Array<{
name: string;
_type: string;
}>;
video?: { video?: {
allowHttpsEmbed?: boolean; allowHttpsEmbed?: boolean;
embedHtml?: string; embedHtml?: string;
allowMobileEmbed?: boolean; allowMobileEmbed?: boolean;
viewCount?: number; viewCount?: number;
duration?: string;
}; };
image?: { image?: {
thumbnail?: { thumbnail?: {
@ -51,29 +48,14 @@ interface BingAPISearchResult {
imageInsightsToken?: string; imageInsightsToken?: string;
imageId?: 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) => { export const searchBingAPI = async (query: string) => {
try { try {
const bingApiKey = await getBingSubscriptionKey(); const bingApiKey = await getBingSubscriptionKey();
const url = new URL(`https://api.cognitive.microsoft.com/bing/v7.0/search`); const url = new URL(`https://api.cognitive.microsoft.com/bing/v7.0/search`);
url.searchParams.append('q', query); 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(), { const res = await axios.get(url.toString(), {
headers: { headers: {
@ -87,11 +69,13 @@ export const searchBingAPI = async (query: string) => {
} }
const originalres = res.data; const originalres = res.data;
// Extract web, image, and video results
const webResults = originalres.webPages?.value || []; const webResults = originalres.webPages?.value || [];
const imageResults = originalres.images?.value || []; const imageResults = originalres.images?.value || [];
const videoResults = originalres.videos?.value || []; const videoResults = originalres.videos?.value || [];
const results = webResults.map((item: any) => ({ const results = webResults.map((item: BingAPISearchResult) => ({
title: item.name, title: item.name,
url: item.url, url: item.url,
content: item.snippet, content: item.snippet,
@ -102,7 +86,9 @@ export const searchBingAPI = async (query: string) => {
videoData: { videoData: {
duration: item.video.duration, duration: item.video.duration,
embedUrl: item.video.embedHtml?.match(/src="(.*?)"/)?.[1] embedUrl: item.video.embedHtml?.match(/src="(.*?)"/)?.[1]
} },
publisher: item.publisher,
datePublished: item.datePublished
}) })
})); }));

View File

@ -3,6 +3,7 @@ import { searchSearxng } from '../lib/searchEngines/searxng';
import { searchGooglePSE } from '../lib/searchEngines/google_pse'; import { searchGooglePSE } from '../lib/searchEngines/google_pse';
import { searchBraveAPI } from '../lib/searchEngines/brave'; import { searchBraveAPI } from '../lib/searchEngines/brave';
import { searchYaCy } from '../lib/searchEngines/yacy'; import { searchYaCy } from '../lib/searchEngines/yacy';
import { searchBingAPI } from '../lib/searchEngines/bing';
import { getSearchEngineBackend } from '../config'; import { getSearchEngineBackend } from '../config';
import logger from '../utils/logger'; 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: default:
throw new Error(`Unknown search engine ${searchEngine}`); throw new Error(`Unknown search engine ${searchEngine}`);
} }