import { QueryKeys, dataService, EModelEndpoint, defaultOrderQuery } from 'librechat-data-provider'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import type { QueryObserverResult, UseQueryOptions } from '@tanstack/react-query'; import type t from 'librechat-data-provider'; /** * AGENTS */ /** * Hook for getting all available tools for A */ export const useAvailableAgentToolsQuery = (): QueryObserverResult => { const queryClient = useQueryClient(); const endpointsConfig = queryClient.getQueryData([QueryKeys.endpoints]); const enabled = !!endpointsConfig?.[EModelEndpoint.agents]; return useQuery([QueryKeys.tools], () => dataService.getAvailableAgentTools(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, enabled, }); }; /** * Hook for listing all Agents, with optional parameters provided for pagination and sorting */ export const useListAgentsQuery = ( params: t.AgentListParams = defaultOrderQuery, config?: UseQueryOptions, ): QueryObserverResult => { const queryClient = useQueryClient(); const endpointsConfig = queryClient.getQueryData([QueryKeys.endpoints]); const enabled = !!endpointsConfig?.[EModelEndpoint.agents]; return useQuery( [QueryKeys.agents, params], () => dataService.listAgents(params), { // Example selector to sort them by created_at // select: (res) => { // return res.data.sort((a, b) => a.created_at - b.created_at); // }, staleTime: 1000 * 5, refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, ...config, enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, }, ); }; /** * Hook for retrieving details about a single agent */ export const useGetAgentByIdQuery = ( agent_id: string, config?: UseQueryOptions, ): QueryObserverResult => { return useQuery( [QueryKeys.agent, agent_id], () => dataService.getAgentById({ agent_id, }), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, ...config, }, ); }; /** * MARKETPLACE QUERIES */ /** * Hook for getting all agent categories with counts */ export const useGetAgentCategoriesQuery = ( config?: UseQueryOptions, ): QueryObserverResult => { const queryClient = useQueryClient(); const endpointsConfig = queryClient.getQueryData([QueryKeys.endpoints]); const enabled = !!endpointsConfig?.[EModelEndpoint.agents]; return useQuery( [QueryKeys.agents, 'categories'], () => dataService.getAgentCategories(), { staleTime: 1000 * 60 * 15, // 15 minutes - categories rarely change refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, ...config, enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, }, ); }; /** * Hook for getting promoted/top picks agents with pagination */ export const useGetPromotedAgentsQuery = ( params: { page?: number; limit?: number; showAll?: string } = { page: 1, limit: 6 }, config?: UseQueryOptions, ): QueryObserverResult => { const queryClient = useQueryClient(); const endpointsConfig = queryClient.getQueryData([QueryKeys.endpoints]); const enabled = !!endpointsConfig?.[EModelEndpoint.agents]; return useQuery( [QueryKeys.agents, 'promoted', params], () => dataService.getPromotedAgents(params), { staleTime: 1000 * 60, // 1 minute stale time refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, keepPreviousData: true, ...config, enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, }, ); }; /** * Hook for getting all agents with pagination (for "all" category) */ export const useGetAllAgentsQuery = ( params: { page?: number; limit?: number } = { page: 1, limit: 6 }, config?: UseQueryOptions, ): QueryObserverResult => { const queryClient = useQueryClient(); const endpointsConfig = queryClient.getQueryData([QueryKeys.endpoints]); const enabled = !!endpointsConfig?.[EModelEndpoint.agents]; return useQuery( [QueryKeys.agents, 'all', params], () => dataService.getAllAgents(params), { staleTime: 1000 * 60, // 1 minute stale time refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, keepPreviousData: true, ...config, enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, }, ); }; /** * Hook for getting agents by category with pagination */ export const useGetAgentsByCategoryQuery = ( params: { category: string; page?: number; limit?: number }, config?: UseQueryOptions, ): QueryObserverResult => { const queryClient = useQueryClient(); const endpointsConfig = queryClient.getQueryData([QueryKeys.endpoints]); const enabled = !!endpointsConfig?.[EModelEndpoint.agents]; return useQuery( [QueryKeys.agents, 'category', params], () => dataService.getAgentsByCategory(params), { staleTime: 1000 * 60, // 1 minute stale time refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, keepPreviousData: true, ...config, enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, }, ); }; /** * Hook for searching agents with pagination and filtering */ export const useSearchAgentsQuery = ( params: { q: string; category?: string; page?: number; limit?: number }, config?: UseQueryOptions, ): QueryObserverResult => { const queryClient = useQueryClient(); const endpointsConfig = queryClient.getQueryData([QueryKeys.endpoints]); const enabled = !!endpointsConfig?.[EModelEndpoint.agents] && !!params.q; return useQuery( [QueryKeys.agents, 'search', params], () => dataService.searchAgents(params), { staleTime: 1000 * 60, // 1 minute stale time refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, keepPreviousData: true, ...config, enabled: config?.enabled !== undefined ? config.enabled && enabled : enabled, }, ); };