import { fetchEventData } from 'fetch-sse'; import { IMessage, Provider, TSearCategory, TSearchMode } from './interface'; const BASE_URL = import.meta.env.MODE === 'development' ? 'http://127.0.0.1:3000' : ''; const SEARCH = '/api/search'; const MODEL = '/api/models'; const LOCAL_MODELS = '/api/local/models'; const CHAT = '/api/chat'; export interface IQueryOptions { ctrl?: AbortController stream?: boolean model?: string | null provider?: Provider | null engine?: string | null locally?: boolean system?: string mode?: TSearchMode language?: string categories?: TSearCategory[] reload?: boolean onMessage: (data: Record) => void onOpen?: () => void onClose?: () => void onError?: (e: any) => void } export async function search(q: string, options: IQueryOptions) { const { ctrl, stream = true, model, provider, engine, reload = false, mode, categories, locally, language, onMessage, onOpen, onClose, onError } = options; const query = new URLSearchParams({ q }); const url = `${BASE_URL}${SEARCH}?${query.toString()}`; await fetchEventData(url, { method: 'POST', signal: ctrl?.signal, data: { stream, model, provider, mode, language, categories, engine, locally, reload }, headers: { 'Content-Type': 'application/json' }, onOpen: async () => { onOpen?.(); }, onMessage: (e) => { console.log('[search]', e); try { if (e?.data) { const data = JSON.parse(e.data); onMessage(JSON.parse(data.data || '{}')); } } catch (err) { onError?.(err); } }, onClose, onError }); } export async function chat(messages: IMessage[], options: IQueryOptions) { const url = `${BASE_URL}${CHAT}`; const { ctrl, model, locally, system, onMessage, onError } = options; await fetchEventData(url, { method: 'POST', signal: ctrl?.signal, data: { model, system, locally, messages }, headers: { 'Content-Type': 'application/json' }, onMessage: (e) => { try { if (e?.data) { const data = JSON.parse(e.data); console.log('[chat]', data); onMessage(data); } } catch (err) { onError?.(err); } }, }); } export async function getModels() { const res = await fetch(`${BASE_URL}${MODEL}`); return res.json(); } export async function getLocalModels(provider: Provider) { const res = await fetch(`${BASE_URL}${LOCAL_MODELS}?provider=${provider}`); return res.json(); }