@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
text/typescript
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;
}
}
}