🥷 fix: Correct Agents Handling for Marketplace Users (#9065)

* refactor: Introduce ModelSelectorChatContext and integrate with ModelSelector

* fix: agents handling in ModelSelector to show expected agents if user has marketplace access
This commit is contained in:
Danny Avila 2025-08-14 19:13:48 -04:00 committed by GitHub
parent e4e25aaf2b
commit d57e7aec73
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 124 additions and 57 deletions

View file

@ -3,10 +3,16 @@ import React, { createContext, useContext, useState, useMemo } from 'react';
import { isAgentsEndpoint, isAssistantsEndpoint } from 'librechat-data-provider';
import type * as t from 'librechat-data-provider';
import type { Endpoint, SelectedValues } from '~/common';
import { useAgentsMapContext, useAssistantsMapContext, useChatContext } from '~/Providers';
import { useEndpoints, useSelectorEffects, useKeyDialog } from '~/hooks';
import {
useAgentDefaultPermissionLevel,
useSelectorEffects,
useKeyDialog,
useEndpoints,
} from '~/hooks';
import { useAgentsMapContext, useAssistantsMapContext } from '~/Providers';
import { useGetEndpointsQuery, useListAgentsQuery } from '~/data-provider';
import { useModelSelectorChatContext } from './ModelSelectorChatContext';
import useSelectMention from '~/hooks/Input/useSelectMention';
import { useGetEndpointsQuery } from '~/data-provider';
import { filterItems } from './utils';
type ModelSelectorContextType = {
@ -51,14 +57,24 @@ export function ModelSelectorProvider({ children, startupConfig }: ModelSelector
const agentsMap = useAgentsMapContext();
const assistantsMap = useAssistantsMapContext();
const { data: endpointsConfig } = useGetEndpointsQuery();
const { conversation, newConversation } = useChatContext();
const { endpoint, model, spec, agent_id, assistant_id, newConversation } =
useModelSelectorChatContext();
const modelSpecs = useMemo(() => startupConfig?.modelSpecs?.list ?? [], [startupConfig]);
const permissionLevel = useAgentDefaultPermissionLevel();
const { data: agents = null } = useListAgentsQuery(
{ requiredPermission: permissionLevel },
{
select: (data) => data?.data,
},
);
const { mappedEndpoints, endpointRequiresUserKey } = useEndpoints({
agentsMap,
agents,
assistantsMap,
startupConfig,
endpointsConfig,
});
const { onSelectEndpoint, onSelectSpec } = useSelectMention({
// presets,
modelSpecs,
@ -70,13 +86,21 @@ export function ModelSelectorProvider({ children, startupConfig }: ModelSelector
// State
const [selectedValues, setSelectedValues] = useState<SelectedValues>({
endpoint: conversation?.endpoint || '',
model: conversation?.model || '',
modelSpec: conversation?.spec || '',
endpoint: endpoint || '',
model: model || '',
modelSpec: spec || '',
});
useSelectorEffects({
agentsMap,
conversation,
conversation: endpoint
? ({
endpoint: endpoint ?? null,
model: model ?? null,
spec: spec ?? null,
agent_id: agent_id ?? null,
assistant_id: assistant_id ?? null,
} as any)
: null,
assistantsMap,
setSelectedValues,
});
@ -86,7 +110,7 @@ export function ModelSelectorProvider({ children, startupConfig }: ModelSelector
const keyProps = useKeyDialog();
// Memoized search results
/** Memoized search results */
const searchResults = useMemo(() => {
if (!searchValue) {
return null;
@ -95,7 +119,6 @@ export function ModelSelectorProvider({ children, startupConfig }: ModelSelector
return filterItems(allItems, searchValue, agentsMap, assistantsMap || {});
}, [searchValue, modelSpecs, mappedEndpoints, agentsMap, assistantsMap]);
// Functions
const setDebouncedSearchValue = useMemo(
() =>
debounce((value: string) => {