| 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<string, any>) => 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(); | |
| } | |