UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

75 lines (64 loc) 1.74 kB
import qs from 'query-string'; import urlJoin from 'url-join'; export interface SearXNGSearchResult { category: string; content?: string; engine: string; engines: string[]; iframe_src?: string; img_src?: string; parsed_url: string[]; positions: number[]; publishedDate?: string | null; score: number; template: string; thumbnail?: string | null; thumbnail_src?: string | null; title: string; url: string; } export interface SearXNGSearchResponse { answers: any[]; corrections: any[]; infoboxes: any[]; number_of_results: number; query: string; results: SearXNGSearchResult[]; suggestions: string[]; unresponsive_engines: any[]; } export class SearXNGClient { private baseUrl: string; constructor(baseUrl: string) { this.baseUrl = baseUrl; } async search( query: string, optionalParams: Record<string, any> = {}, ): Promise<SearXNGSearchResponse> { try { const { time_range, ...otherParams } = optionalParams; const processedParams = Object.entries(otherParams).reduce<Record<string, any>>( (acc, [key, value]) => { acc[key] = Array.isArray(value) ? value.join(',') : value; return acc; }, {}, ); const searchParams = qs.stringify({ ...processedParams, ...(time_range !== 'anytime' && { time_range }), format: 'json', q: query, }); const response = await fetch(urlJoin(this.baseUrl, `/search?${searchParams}`)); if (response.ok) { return await response.json(); } throw new Error(`Failed to search: ${response.statusText}`); } catch (error) { console.error('Error searching:', error); throw error; } } }