import type { AxiosResponse } from 'axios'; import type * as t from './types'; import * as endpoints from './api-endpoints'; import * as a from './types/assistants'; import * as m from './types/mutations'; import * as q from './types/queries'; import * as f from './types/files'; import * as config from './config'; import request from './request'; import * as s from './schemas'; import * as r from './roles'; export function abortRequestWithMessage( endpoint: string, abortKey: string, message: string, ): Promise { return request.post(endpoints.abortRequest(endpoint), { arg: { abortKey, message } }); } export function revokeUserKey(name: string): Promise { return request.delete(endpoints.revokeUserKey(name)); } export function revokeAllUserKeys(): Promise { return request.delete(endpoints.revokeAllUserKeys()); } export function deleteUser(): Promise { return request.delete(endpoints.deleteUser()); } export function getMessagesByConvoId(conversationId: string): Promise { if (conversationId === 'new') { return Promise.resolve([]); } return request.get(endpoints.messages(conversationId)); } export function getSharedMessages(shareId: string): Promise { return request.get(endpoints.shareMessages(shareId)); } export const listSharedLinks = ( params?: q.SharedLinkListParams, ): Promise => { const pageNumber = (params?.pageNumber ?? '1') || '1'; // Default to page 1 if not provided const isPublic = params?.isPublic ?? true; // Default to true if not provided return request.get(endpoints.getSharedLinks(pageNumber, isPublic)); }; export function getSharedLink(shareId: string): Promise { return request.get(endpoints.shareMessages(shareId)); } export function createSharedLink(payload: t.TSharedLinkRequest): Promise { return request.post(endpoints.createSharedLink, payload); } export function updateSharedLink(payload: t.TSharedLinkRequest): Promise { return request.patch(endpoints.updateSharedLink, payload); } export function deleteSharedLink(shareId: string): Promise { return request.delete(endpoints.shareMessages(shareId)); } export function updateMessage(payload: t.TUpdateMessageRequest): Promise { const { conversationId, messageId, text } = payload; if (!conversationId) { throw new Error('conversationId is required'); } return request.put(endpoints.messages(conversationId, messageId), { text }); } export function updateMessageContent(payload: t.TUpdateMessageContent): Promise { const { conversationId, messageId, index, text } = payload; if (!conversationId) { throw new Error('conversationId is required'); } return request.put(endpoints.messages(conversationId, messageId), { text, index }); } export function updateUserKey(payload: t.TUpdateUserKeyRequest) { const { value } = payload; if (!value) { throw new Error('value is required'); } return request.put(endpoints.keys(), payload); } export function getPresets(): Promise { return request.get(endpoints.presets()); } export function createPreset(payload: s.TPreset): Promise { return request.post(endpoints.presets(), payload); } export function updatePreset(payload: s.TPreset): Promise { return request.post(endpoints.presets(), payload); } export function deletePreset(arg: s.TPreset | undefined): Promise { return request.post(endpoints.deletePreset(), arg); } export function getSearchEnabled(): Promise { return request.get(endpoints.searchEnabled()); } export function getUser(): Promise { return request.get(endpoints.user()); } export function getUserBalance(): Promise { return request.get(endpoints.balance()); } export const updateTokenCount = (text: string) => { return request.post(endpoints.tokenizer(), { arg: text }); }; export const login = (payload: t.TLoginUser) => { return request.post(endpoints.login(), payload); }; export const logout = () => { return request.post(endpoints.logout()); }; export const register = (payload: t.TRegisterUser) => { return request.post(endpoints.register(), payload); }; export const userKeyQuery = (name: string): Promise => request.get(endpoints.userKeyQuery(name)); export const getLoginGoogle = () => { return request.get(endpoints.loginGoogle()); }; export const requestPasswordReset = ( payload: t.TRequestPasswordReset, ): Promise => { return request.post(endpoints.requestPasswordReset(), payload); }; export const resetPassword = (payload: t.TResetPassword) => { return request.post(endpoints.resetPassword(), payload); }; export const verifyEmail = (payload: t.TVerifyEmail): Promise => { return request.post(endpoints.verifyEmail(), payload); }; export const resendVerificationEmail = ( payload: t.TResendVerificationEmail, ): Promise => { return request.post(endpoints.resendVerificationEmail(), payload); }; export const getAvailablePlugins = (): Promise => { return request.get(endpoints.plugins()); }; export const updateUserPlugins = (payload: t.TUpdateUserPlugins) => { return request.post(endpoints.userPlugins(), payload); }; /* Config */ export const getStartupConfig = (): Promise => { return request.get(endpoints.config()); }; export const getAIEndpoints = (): Promise => { return request.get(endpoints.aiEndpoints()); }; export const getModels = async (): Promise => { return request.get(endpoints.models()); }; export const getEndpointsConfigOverride = (): Promise => { return request.get(endpoints.endpointsConfigOverride()); }; /* Assistants */ export const createAssistant = ({ version, ...data }: a.AssistantCreateParams): Promise => { return request.post(endpoints.assistants({ version }), data); }; export const getAssistantById = ({ endpoint, assistant_id, version, }: { endpoint: s.AssistantsEndpoint; assistant_id: string; version: number | string | number; }): Promise => { return request.get( endpoints.assistants({ path: assistant_id, endpoint, version, }), ); }; export const updateAssistant = ({ assistant_id, data, version, }: { assistant_id: string; data: a.AssistantUpdateParams; version: number | string; }): Promise => { return request.patch( endpoints.assistants({ path: assistant_id, version, }), data, ); }; export const deleteAssistant = ({ assistant_id, model, endpoint, version, }: m.DeleteAssistantBody & { version: number | string }): Promise => { return request.delete( endpoints.assistants({ path: assistant_id, options: { model, endpoint }, version, }), ); }; export const listAssistants = ( params: a.AssistantListParams, version: number | string, ): Promise => { return request.get( endpoints.assistants({ version, options: params, }), ); }; export function getAssistantDocs({ endpoint, version, }: { endpoint: s.AssistantsEndpoint | string; version: number | string; }): Promise { if (!s.isAssistantsEndpoint(endpoint)) { return Promise.resolve([]); } return request.get( endpoints.assistants({ path: 'documents', version, options: { endpoint }, endpoint: endpoint as s.AssistantsEndpoint, }), ); } /* Tools */ export const getAvailableTools = ( _endpoint: s.AssistantsEndpoint | s.EModelEndpoint.agents, version?: number | string, ): Promise => { let path = ''; if (s.isAssistantsEndpoint(_endpoint)) { const endpoint = _endpoint as s.AssistantsEndpoint; path = endpoints.assistants({ path: 'tools', endpoint: endpoint, version: version ?? config.defaultAssistantsVersion[endpoint], }); } else { path = endpoints.agents({ path: 'tools', }); } return request.get(path); }; export const getVerifyAgentToolAuth = ( params: q.VerifyToolAuthParams, ): Promise => { return request.get( endpoints.agents({ path: `tools/${params.toolId}/auth`, }), ); }; /* Files */ export const getFiles = (): Promise => { return request.get(endpoints.files()); }; export const getFileConfig = (): Promise => { return request.get(`${endpoints.files()}/config`); }; export const uploadImage = ( data: FormData, signal?: AbortSignal | null, ): Promise => { const requestConfig = signal ? { signal } : undefined; return request.postMultiPart(endpoints.images(), data, requestConfig); }; export const uploadFile = (data: FormData, signal?: AbortSignal | null): Promise => { const requestConfig = signal ? { signal } : undefined; return request.postMultiPart(endpoints.files(), data, requestConfig); }; /* actions */ export const updateAction = (data: m.UpdateActionVariables): Promise => { const { assistant_id, version, ...body } = data; return request.post( endpoints.assistants({ path: `actions/${assistant_id}`, version, }), body, ); }; export function getActions(): Promise { return request.get( endpoints.agents({ path: 'actions', }), ); } export const deleteAction = async ({ assistant_id, action_id, model, version, endpoint, }: m.DeleteActionVariables & { version: number | string }): Promise => request.delete( endpoints.assistants({ path: `actions/${assistant_id}/${action_id}/${model}`, version, endpoint, }), ); /** * Agents */ export const createAgent = ({ ...data }: a.AgentCreateParams): Promise => { return request.post(endpoints.agents({}), data); }; export const getAgentById = ({ agent_id }: { agent_id: string }): Promise => { return request.get( endpoints.agents({ path: agent_id, }), ); }; export const updateAgent = ({ agent_id, data, }: { agent_id: string; data: a.AgentUpdateParams; }): Promise => { return request.patch( endpoints.agents({ path: agent_id, }), data, ); }; export const deleteAgent = ({ agent_id }: m.DeleteAgentBody): Promise => { return request.delete( endpoints.agents({ path: agent_id, }), ); }; export const listAgents = (params: a.AgentListParams): Promise => { return request.get( endpoints.agents({ options: params, }), ); }; /* Tools */ export const getAvailableAgentTools = (): Promise => { return request.get( endpoints.agents({ path: 'tools', }), ); }; /* Actions */ export const updateAgentAction = ( data: m.UpdateAgentActionVariables, ): Promise => { const { agent_id, ...body } = data; return request.post( endpoints.agents({ path: `actions/${agent_id}`, }), body, ); }; export const deleteAgentAction = async ({ agent_id, action_id, }: m.DeleteAgentActionVariables): Promise => request.delete( endpoints.agents({ path: `actions/${agent_id}/${action_id}`, }), ); /** * Imports a conversations file. * * @param data - The FormData containing the file to import. * @returns A Promise that resolves to the import start response. */ export const importConversationsFile = (data: FormData): Promise => { return request.postMultiPart(endpoints.importConversation(), data); }; export const uploadAvatar = (data: FormData): Promise => { return request.postMultiPart(endpoints.avatar(), data); }; export const uploadAssistantAvatar = (data: m.AssistantAvatarVariables): Promise => { return request.postMultiPart( endpoints.assistants({ path: `avatar/${data.assistant_id}`, options: { model: data.model, endpoint: data.endpoint }, version: data.version, }), data.formData, ); }; export const uploadAgentAvatar = (data: m.AgentAvatarVariables): Promise => { return request.postMultiPart( endpoints.agents({ path: `avatar/${data.agent_id}`, }), data.formData, ); }; export const getFileDownload = async (userId: string, file_id: string): Promise => { return request.getResponse(`${endpoints.files()}/download/${userId}/${file_id}`, { responseType: 'blob', headers: { Accept: 'application/octet-stream', }, }); }; export const getCodeOutputDownload = async (url: string): Promise => { return request.getResponse(url, { responseType: 'blob', headers: { Accept: 'application/octet-stream', }, }); }; export const deleteFiles = async (payload: { files: f.BatchFile[]; agent_id?: string; assistant_id?: string; tool_resource?: a.EToolResources; }): Promise => request.deleteWithOptions(endpoints.files(), { data: payload, }); /* Speech */ export const speechToText = (data: FormData): Promise => { return request.postMultiPart(endpoints.speechToText(), data); }; export const textToSpeech = (data: FormData): Promise => { return request.postTTS(endpoints.textToSpeechManual(), data); }; export const getVoices = (): Promise => { return request.get(endpoints.textToSpeechVoices()); }; export const getCustomConfigSpeech = (): Promise => { return request.get(endpoints.getCustomConfigSpeech()); }; /* conversations */ export function forkConversation(payload: t.TForkConvoRequest): Promise { return request.post(endpoints.forkConversation(), payload); } export function deleteConversation(payload: t.TDeleteConversationRequest) { //todo: this should be a DELETE request return request.post(endpoints.deleteConversation(), { arg: payload }); } export function clearAllConversations(): Promise { return request.post(endpoints.deleteConversation(), { arg: {} }); } export const listConversations = ( params?: q.ConversationListParams, ): Promise => { // Assuming params has a pageNumber property const pageNumber = (params?.pageNumber ?? '1') || '1'; // Default to page 1 if not provided const isArchived = params?.isArchived ?? false; // Default to false if not provided const tags = params?.tags || []; // Default to an empty array if not provided return request.get(endpoints.conversations(pageNumber, isArchived, tags)); }; export const listConversationsByQuery = ( params?: q.ConversationListParams & { searchQuery?: string }, ): Promise => { const pageNumber = (params?.pageNumber ?? '1') || '1'; // Default to page 1 if not provided const searchQuery = params?.searchQuery ?? ''; // If no search query is provided, default to an empty string // Update the endpoint to handle a search query if (searchQuery !== '') { return request.get(endpoints.search(searchQuery, pageNumber)); } else { return request.get(endpoints.conversations(pageNumber)); } }; export const searchConversations = async ( q: string, pageNumber: string, ): Promise => { return request.get(endpoints.search(q, pageNumber)); }; export function getConversations(pageNumber: string): Promise { return request.get(endpoints.conversations(pageNumber)); } export function getConversationById(id: string): Promise { return request.get(endpoints.conversationById(id)); } export function updateConversation( payload: t.TUpdateConversationRequest, ): Promise { return request.post(endpoints.updateConversation(), { arg: payload }); } export function archiveConversation( payload: t.TArchiveConversationRequest, ): Promise { return request.post(endpoints.updateConversation(), { arg: payload }); } export function genTitle(payload: m.TGenTitleRequest): Promise { return request.post(endpoints.genTitle(), payload); } export function getPrompt(id: string): Promise<{ prompt: t.TPrompt }> { return request.get(endpoints.getPrompt(id)); } export function getPrompts(filter: t.TPromptsWithFilterRequest): Promise { return request.get(endpoints.getPromptsWithFilters(filter)); } export function getAllPromptGroups(): Promise { return request.get(endpoints.getAllPromptGroups()); } export function getPromptGroups( filter: t.TPromptGroupsWithFilterRequest, ): Promise { return request.get(endpoints.getPromptGroupsWithFilters(filter)); } export function getPromptGroup(id: string): Promise { return request.get(endpoints.getPromptGroup(id)); } export function createPrompt(payload: t.TCreatePrompt): Promise { return request.post(endpoints.postPrompt(), payload); } export function updatePromptGroup( variables: t.TUpdatePromptGroupVariables, ): Promise { return request.patch(endpoints.updatePromptGroup(variables.id), variables.payload); } export function deletePrompt(payload: t.TDeletePromptVariables): Promise { return request.delete(endpoints.deletePrompt(payload)); } export function makePromptProduction(id: string): Promise { return request.patch(endpoints.updatePromptTag(id)); } export function updatePromptLabels( variables: t.TUpdatePromptLabelsRequest, ): Promise { return request.patch(endpoints.updatePromptLabels(variables.id), variables.payload); } export function deletePromptGroup(id: string): Promise { return request.delete(endpoints.deletePromptGroup(id)); } export function getCategories(): Promise { return request.get(endpoints.getCategories()); } export function getRandomPrompts( variables: t.TGetRandomPromptsRequest, ): Promise { return request.get(endpoints.getRandomPrompts(variables.limit, variables.skip)); } /* Roles */ export function getRole(roleName: string): Promise { return request.get(endpoints.getRole(roleName)); } export function updatePromptPermissions( variables: m.UpdatePromptPermVars, ): Promise { return request.put(endpoints.updatePromptPermissions(variables.roleName), variables.updates); } /* Tags */ export function getConversationTags(): Promise { return request.get(endpoints.conversationTags()); } export function createConversationTag( payload: t.TConversationTagRequest, ): Promise { return request.post(endpoints.conversationTags(), payload); } export function updateConversationTag( tag: string, payload: t.TConversationTagRequest, ): Promise { return request.put(endpoints.conversationTags(tag), payload); } export function deleteConversationTag(tag: string): Promise { return request.delete(endpoints.conversationTags(tag)); } export function addTagToConversation( conversationId: string, payload: t.TTagConversationRequest, ): Promise { return request.put(endpoints.addTagToConversation(conversationId), payload); } export function rebuildConversationTags(): Promise { return request.post(endpoints.conversationTags('rebuild')); } export function healthCheck(): Promise { return request.get(endpoints.health()); } export function getUserTerms(): Promise { return request.get(endpoints.userTerms()); } export function acceptTerms(): Promise { return request.post(endpoints.acceptUserTerms()); } export function getBanner(): Promise { return request.get(endpoints.banner()); }