| | import { |
| | QueryKeys, |
| | dataService, |
| | EModelEndpoint, |
| | isAgentsEndpoint, |
| | defaultOrderQuery, |
| | defaultAssistantsVersion, |
| | } from 'librechat-data-provider'; |
| | import { useQuery, useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; |
| | import type { |
| | UseInfiniteQueryOptions, |
| | QueryObserverResult, |
| | UseQueryOptions, |
| | InfiniteData, |
| | } from '@tanstack/react-query'; |
| | import type t from 'librechat-data-provider'; |
| | import type { |
| | Action, |
| | TPreset, |
| | ConversationListResponse, |
| | ConversationListParams, |
| | MessagesListParams, |
| | MessagesListResponse, |
| | Assistant, |
| | AssistantListParams, |
| | AssistantListResponse, |
| | AssistantDocument, |
| | TEndpointsConfig, |
| | TCheckUserKeyResponse, |
| | SharedLinksListParams, |
| | SharedLinksResponse, |
| | } from 'librechat-data-provider'; |
| | import type { ConversationCursorData } from '~/utils/convos'; |
| | import { findConversationInInfinite } from '~/utils'; |
| |
|
| | export const useGetPresetsQuery = ( |
| | config?: UseQueryOptions<TPreset[]>, |
| | ): QueryObserverResult<TPreset[], unknown> => { |
| | return useQuery<TPreset[]>([QueryKeys.presets], () => dataService.getPresets(), { |
| | staleTime: 1000 * 10, |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | ...config, |
| | }); |
| | }; |
| |
|
| | export const useGetConvoIdQuery = ( |
| | id: string, |
| | config?: UseQueryOptions<t.TConversation>, |
| | ): QueryObserverResult<t.TConversation> => { |
| | const queryClient = useQueryClient(); |
| |
|
| | return useQuery<t.TConversation>( |
| | [QueryKeys.conversation, id], |
| | () => { |
| | |
| | const convosQuery = queryClient.getQueryData<InfiniteData<ConversationCursorData>>( |
| | [QueryKeys.allConversations], |
| | { exact: false }, |
| | ); |
| | const found = findConversationInInfinite(convosQuery, id); |
| |
|
| | if (found && found.messages != null) { |
| | return found; |
| | } |
| | |
| | return dataService.getConversationById(id); |
| | }, |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | ...config, |
| | }, |
| | ); |
| | }; |
| |
|
| | export const useConversationsInfiniteQuery = ( |
| | params: ConversationListParams, |
| | config?: UseInfiniteQueryOptions<ConversationListResponse, unknown>, |
| | ) => { |
| | const { isArchived, sortBy, sortDirection, tags, search } = params; |
| |
|
| | return useInfiniteQuery<ConversationListResponse>({ |
| | queryKey: [ |
| | isArchived ? QueryKeys.archivedConversations : QueryKeys.allConversations, |
| | { isArchived, sortBy, sortDirection, tags, search }, |
| | ], |
| | queryFn: ({ pageParam }) => |
| | dataService.listConversations({ |
| | isArchived, |
| | sortBy, |
| | sortDirection, |
| | tags, |
| | search, |
| | cursor: pageParam?.toString(), |
| | }), |
| | getNextPageParam: (lastPage) => lastPage?.nextCursor ?? undefined, |
| | keepPreviousData: true, |
| | staleTime: 5 * 60 * 1000, |
| | cacheTime: 30 * 60 * 1000, |
| | ...config, |
| | }); |
| | }; |
| |
|
| | export const useMessagesInfiniteQuery = ( |
| | params: MessagesListParams, |
| | config?: UseInfiniteQueryOptions<MessagesListResponse, unknown>, |
| | ) => { |
| | const { sortBy, sortDirection, pageSize, conversationId, messageId, search } = params; |
| |
|
| | return useInfiniteQuery<MessagesListResponse>({ |
| | queryKey: [ |
| | QueryKeys.messages, |
| | { sortBy, sortDirection, pageSize, conversationId, messageId, search }, |
| | ], |
| | queryFn: ({ pageParam }) => |
| | dataService.listMessages({ |
| | sortBy, |
| | sortDirection, |
| | pageSize, |
| | conversationId, |
| | messageId, |
| | search, |
| | cursor: pageParam?.toString(), |
| | }), |
| | getNextPageParam: (lastPage) => lastPage?.nextCursor ?? undefined, |
| | keepPreviousData: true, |
| | staleTime: 5 * 60 * 1000, |
| | cacheTime: 30 * 60 * 1000, |
| | ...config, |
| | }); |
| | }; |
| |
|
| | export const useSharedLinksQuery = ( |
| | params: SharedLinksListParams, |
| | config?: UseInfiniteQueryOptions<SharedLinksResponse, unknown>, |
| | ) => { |
| | const { pageSize, isPublic, search, sortBy, sortDirection } = params; |
| |
|
| | return useInfiniteQuery<SharedLinksResponse>({ |
| | queryKey: [QueryKeys.sharedLinks, { pageSize, isPublic, search, sortBy, sortDirection }], |
| | queryFn: ({ pageParam }) => |
| | dataService.listSharedLinks({ |
| | cursor: pageParam?.toString(), |
| | pageSize, |
| | isPublic, |
| | search, |
| | sortBy, |
| | sortDirection, |
| | }), |
| | getNextPageParam: (lastPage) => lastPage?.nextCursor ?? undefined, |
| | keepPreviousData: true, |
| | staleTime: 5 * 60 * 1000, |
| | cacheTime: 30 * 60 * 1000, |
| | ...config, |
| | }); |
| | }; |
| |
|
| | export const useConversationTagsQuery = ( |
| | config?: UseQueryOptions<t.TConversationTagsResponse>, |
| | ): QueryObserverResult<t.TConversationTagsResponse> => { |
| | return useQuery<t.TConversationTag[]>( |
| | [QueryKeys.conversationTags], |
| | () => dataService.getConversationTags(), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | ...config, |
| | }, |
| | ); |
| | }; |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | export const useAvailableToolsQuery = <TData = t.TPlugin[]>( |
| | endpoint: t.AssistantsEndpoint | EModelEndpoint.agents, |
| | config?: UseQueryOptions<t.TPlugin[], unknown, TData>, |
| | ): QueryObserverResult<TData> => { |
| | const queryClient = useQueryClient(); |
| | const endpointsConfig = queryClient.getQueryData<TEndpointsConfig>([QueryKeys.endpoints]); |
| | const keyExpiry = queryClient.getQueryData<TCheckUserKeyResponse>([QueryKeys.name, endpoint]); |
| | const userProvidesKey = !!endpointsConfig?.[endpoint]?.userProvide; |
| | const keyProvided = userProvidesKey ? !!keyExpiry?.expiresAt : true; |
| | const enabled = isAgentsEndpoint(endpoint) ? true : !!endpointsConfig?.[endpoint] && keyProvided; |
| | const version: string | number | undefined = |
| | endpointsConfig?.[endpoint]?.version ?? defaultAssistantsVersion[endpoint]; |
| | return useQuery<t.TPlugin[], unknown, TData>( |
| | [QueryKeys.tools], |
| | () => dataService.getAvailableTools(endpoint, version), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | enabled, |
| | ...config, |
| | }, |
| | ); |
| | }; |
| |
|
| | |
| | |
| | |
| | export const useListAssistantsQuery = <TData = AssistantListResponse>( |
| | endpoint: t.AssistantsEndpoint, |
| | params: Omit<AssistantListParams, 'endpoint'> = defaultOrderQuery, |
| | config?: UseQueryOptions<AssistantListResponse, unknown, TData>, |
| | ): QueryObserverResult<TData> => { |
| | const queryClient = useQueryClient(); |
| | const endpointsConfig = queryClient.getQueryData<TEndpointsConfig>([QueryKeys.endpoints]); |
| | const keyExpiry = queryClient.getQueryData<TCheckUserKeyResponse>([QueryKeys.name, endpoint]); |
| | const userProvidesKey = !!(endpointsConfig?.[endpoint]?.userProvide ?? false); |
| | const keyProvided = userProvidesKey ? !!(keyExpiry?.expiresAt ?? '') : true; |
| | const enabled = !!endpointsConfig?.[endpoint] && keyProvided; |
| | const version = endpointsConfig?.[endpoint]?.version ?? defaultAssistantsVersion[endpoint]; |
| | return useQuery<AssistantListResponse, unknown, TData>( |
| | [QueryKeys.assistants, endpoint, params], |
| | () => dataService.listAssistants({ ...params, endpoint }, version), |
| | { |
| | |
| | |
| | |
| | |
| | staleTime: 1000 * 5, |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, |
| | }, |
| | ); |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | export const useGetAssistantByIdQuery = ( |
| | endpoint: t.AssistantsEndpoint, |
| | assistant_id: string, |
| | config?: UseQueryOptions<Assistant>, |
| | ): QueryObserverResult<Assistant> => { |
| | const queryClient = useQueryClient(); |
| | const endpointsConfig = queryClient.getQueryData<TEndpointsConfig>([QueryKeys.endpoints]); |
| | const keyExpiry = queryClient.getQueryData<TCheckUserKeyResponse>([QueryKeys.name, endpoint]); |
| | const userProvidesKey = endpointsConfig?.[endpoint]?.userProvide ?? false; |
| | const keyProvided = userProvidesKey ? !!keyExpiry?.expiresAt : true; |
| | const enabled = !!endpointsConfig?.[endpoint] && keyProvided; |
| | const version = endpointsConfig?.[endpoint]?.version ?? defaultAssistantsVersion[endpoint]; |
| | return useQuery<Assistant>( |
| | [QueryKeys.assistant, assistant_id], |
| | () => |
| | dataService.getAssistantById({ |
| | endpoint, |
| | assistant_id, |
| | version, |
| | }), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | |
| | enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, |
| | }, |
| | ); |
| | }; |
| |
|
| | |
| | |
| | |
| | export const useGetActionsQuery = <TData = Action[]>( |
| | endpoint: t.AssistantsEndpoint | EModelEndpoint.agents, |
| | config?: UseQueryOptions<Action[], unknown, TData>, |
| | ): QueryObserverResult<TData> => { |
| | const queryClient = useQueryClient(); |
| | const endpointsConfig = queryClient.getQueryData<TEndpointsConfig>([QueryKeys.endpoints]); |
| | const keyExpiry = queryClient.getQueryData<TCheckUserKeyResponse>([QueryKeys.name, endpoint]); |
| | const userProvidesKey = !!endpointsConfig?.[endpoint]?.userProvide; |
| | const keyProvided = userProvidesKey ? !!keyExpiry?.expiresAt : true; |
| | const enabled = |
| | (!!endpointsConfig?.[endpoint] && keyProvided) || endpoint === EModelEndpoint.agents; |
| |
|
| | return useQuery<Action[], unknown, TData>([QueryKeys.actions], () => dataService.getActions(), { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | ...config, |
| | enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, |
| | }); |
| | }; |
| |
|
| | |
| | |
| | |
| | export const useGetAssistantDocsQuery = <TData = AssistantDocument[]>( |
| | endpoint: t.AssistantsEndpoint | string, |
| | config?: UseQueryOptions<AssistantDocument[], unknown, TData>, |
| | ): QueryObserverResult<TData> => { |
| | const queryClient = useQueryClient(); |
| | const endpointsConfig = queryClient.getQueryData<TEndpointsConfig>([QueryKeys.endpoints]); |
| | const keyExpiry = queryClient.getQueryData<TCheckUserKeyResponse>([QueryKeys.name, endpoint]); |
| | const userProvidesKey = !!(endpointsConfig?.[endpoint]?.userProvide ?? false); |
| | const keyProvided = userProvidesKey ? !!(keyExpiry?.expiresAt ?? '') : true; |
| | const enabled = !!endpointsConfig?.[endpoint] && keyProvided; |
| | const version = endpointsConfig?.[endpoint]?.version ?? defaultAssistantsVersion[endpoint]; |
| |
|
| | return useQuery<AssistantDocument[], unknown, TData>( |
| | [QueryKeys.assistantDocs, endpoint], |
| | () => |
| | dataService.getAssistantDocs({ |
| | endpoint, |
| | version, |
| | }), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | ...config, |
| | enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, |
| | }, |
| | ); |
| | }; |
| |
|
| | |
| |
|
| | |
| | export const useVoicesQuery = ( |
| | config?: UseQueryOptions<t.VoiceResponse>, |
| | ): QueryObserverResult<t.VoiceResponse> => { |
| | return useQuery<t.VoiceResponse>([QueryKeys.voices], () => dataService.getVoices(), { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | }); |
| | }; |
| |
|
| | |
| | export const useCustomConfigSpeechQuery = ( |
| | config?: UseQueryOptions<t.TCustomConfigSpeechResponse>, |
| | ): QueryObserverResult<t.TCustomConfigSpeechResponse> => { |
| | return useQuery<t.TCustomConfigSpeechResponse>( |
| | [QueryKeys.customConfigSpeech], |
| | () => dataService.getCustomConfigSpeech(), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | }, |
| | ); |
| | }; |
| |
|
| | |
| |
|
| | export const usePromptGroupsInfiniteQuery = ( |
| | params?: t.TPromptGroupsWithFilterRequest, |
| | config?: UseInfiniteQueryOptions<t.PromptGroupListResponse, unknown>, |
| | ) => { |
| | const { name, pageSize, category } = params || {}; |
| | return useInfiniteQuery<t.PromptGroupListResponse, unknown>( |
| | [QueryKeys.promptGroups, name, category, pageSize], |
| | ({ pageParam }) => { |
| | const queryParams: t.TPromptGroupsWithFilterRequest = { |
| | name, |
| | category: category || '', |
| | limit: (pageSize || 10).toString(), |
| | }; |
| |
|
| | |
| | if (pageParam && typeof pageParam === 'string') { |
| | queryParams.cursor = pageParam; |
| | } |
| |
|
| | return dataService.getPromptGroups(queryParams); |
| | }, |
| | { |
| | getNextPageParam: (lastPage) => { |
| | |
| | return lastPage.has_more && lastPage.after ? lastPage.after : undefined; |
| | }, |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | ...config, |
| | }, |
| | ); |
| | }; |
| |
|
| | export const useGetPromptGroup = ( |
| | id: string, |
| | config?: UseQueryOptions<t.TPromptGroup>, |
| | ): QueryObserverResult<t.TPromptGroup> => { |
| | return useQuery<t.TPromptGroup>( |
| | [QueryKeys.promptGroup, id], |
| | () => dataService.getPromptGroup(id), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | enabled: config?.enabled !== undefined ? config.enabled : true, |
| | }, |
| | ); |
| | }; |
| |
|
| | export const useGetPrompts = ( |
| | filter: t.TPromptsWithFilterRequest, |
| | config?: UseQueryOptions<t.TPrompt[]>, |
| | ): QueryObserverResult<t.TPrompt[]> => { |
| | return useQuery<t.TPrompt[]>( |
| | [QueryKeys.prompts, filter.groupId ?? ''], |
| | () => dataService.getPrompts(filter), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | enabled: config?.enabled !== undefined ? config.enabled : true, |
| | }, |
| | ); |
| | }; |
| |
|
| | export const useGetAllPromptGroups = <TData = t.AllPromptGroupsResponse>( |
| | filter?: t.AllPromptGroupsFilterRequest, |
| | config?: UseQueryOptions<t.AllPromptGroupsResponse, unknown, TData>, |
| | ): QueryObserverResult<TData> => { |
| | return useQuery<t.AllPromptGroupsResponse, unknown, TData>( |
| | [QueryKeys.allPromptGroups], |
| | () => dataService.getAllPromptGroups(), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | }, |
| | ); |
| | }; |
| |
|
| | export const useGetCategories = <TData = t.TGetCategoriesResponse>( |
| | config?: UseQueryOptions<t.TGetCategoriesResponse, unknown, TData>, |
| | ): QueryObserverResult<TData> => { |
| | return useQuery<t.TGetCategoriesResponse, unknown, TData>( |
| | [QueryKeys.categories], |
| | () => dataService.getCategories(), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | enabled: config?.enabled !== undefined ? config.enabled : true, |
| | }, |
| | ); |
| | }; |
| |
|
| | export const useGetRandomPrompts = ( |
| | filter: t.TGetRandomPromptsRequest, |
| | config?: UseQueryOptions<t.TGetRandomPromptsResponse>, |
| | ): QueryObserverResult<t.TGetRandomPromptsResponse> => { |
| | return useQuery<t.TGetRandomPromptsResponse>( |
| | [QueryKeys.randomPrompts], |
| | () => dataService.getRandomPrompts(filter), |
| | { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | retry: false, |
| | ...config, |
| | enabled: config?.enabled !== undefined ? config.enabled : true, |
| | }, |
| | ); |
| | }; |
| |
|
| | export const useUserTermsQuery = ( |
| | config?: UseQueryOptions<t.TUserTermsResponse>, |
| | ): QueryObserverResult<t.TUserTermsResponse> => { |
| | return useQuery<t.TUserTermsResponse>([QueryKeys.userTerms], () => dataService.getUserTerms(), { |
| | refetchOnWindowFocus: false, |
| | refetchOnReconnect: false, |
| | refetchOnMount: false, |
| | ...config, |
| | }); |
| | }; |
| |
|