import { ACCESS_CODE_PREFIX } from "../constant"; import { ModelConfig, ModelType, useAccessStore } from "../store"; import { ChatGPTApi } from "./platforms/openai"; export const ROLES = ["system", "user", "assistant"] as const; export type MessageRole = (typeof ROLES)[number]; export const Models = ["gpt-3.5-turbo", "gpt-4"] as const; export type ChatModel = ModelType; export interface RequestMessage { role: MessageRole; content: string; } export interface LLMConfig { model: string; temperature?: number; top_p?: number; stream?: boolean; presence_penalty?: number; frequency_penalty?: number; } export interface ChatOptions { messages: RequestMessage[]; config: LLMConfig; onUpdate?: (message: string, chunk: string) => void; onFinish: (message: string) => void; onError?: (err: Error) => void; onController?: (controller: AbortController) => void; } export interface LLMUsage { used: number; total: number; } export abstract class LLMApi { abstract chat(options: ChatOptions): Promise; abstract usage(): Promise; } export class ClientApi { public llm: LLMApi; constructor() { this.llm = new ChatGPTApi(); } config() {} prompts() {} masks() {} } export const api = new ClientApi(); export function getHeaders() { const accessStore = useAccessStore.getState(); let headers: Record = { "Content-Type": "application/json", "x-requested-with": "XMLHttpRequest", }; const makeBearer = (token: string) => `Bearer ${token.trim()}`; const validString = (x: string) => x && x.length > 0; // use user's api key first if (validString(accessStore.token)) { headers.Authorization = makeBearer(accessStore.token); } else if ( accessStore.enabledAccessControl() && validString(accessStore.accessCode) ) { headers.Authorization = makeBearer( ACCESS_CODE_PREFIX + accessStore.accessCode, ); } return headers; }