mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-04-03 14:27:20 +02:00
* 🗑️ chore: Remove unused Legacy Provider clients and related helpers * Deleted OpenAIClient and GoogleClient files along with their associated tests. * Removed references to these clients in the clients index file. * Cleaned up typedefs by removing the OpenAISpecClient export. * Updated chat controllers to use the OpenAI SDK directly instead of the removed client classes. * chore/remove-openapi-specs * 🗑️ chore: Remove unused mergeSort and misc utility functions * Deleted mergeSort.js and misc.js files as they are no longer needed. * Removed references to cleanUpPrimaryKeyValue in messages.js and adjusted related logic. * Updated mongoMeili.ts to eliminate local implementations of removed functions. * chore: remove legacy endpoints * chore: remove all plugins endpoint related code * chore: remove unused prompt handling code and clean up imports * Deleted handleInputs.js and instructions.js files as they are no longer needed. * Removed references to these files in the prompts index.js. * Updated docker-compose.yml to simplify reverse proxy configuration. * chore: remove unused LightningIcon import from Icons.tsx * chore: clean up translation.json by removing deprecated and unused keys * chore: update Jest configuration and remove unused mock file * Simplified the setupFiles array in jest.config.js by removing the fetchEventSource mock. * Deleted the fetchEventSource.js mock file as it is no longer needed. * fix: simplify endpoint type check in Landing and ConversationStarters components * Updated the endpoint type check to use strict equality for better clarity and performance. * Ensured consistency in the handling of the azureOpenAI endpoint across both components. * chore: remove unused dependencies from package.json and package-lock.json * chore: remove legacy EditController, associated routes and imports * chore: update banResponse logic to refine request handling for banned users * chore: remove unused validateEndpoint middleware and its references * chore: remove unused 'res' parameter from initializeClient in multiple endpoint files * chore: remove unused 'isSmallScreen' prop from BookmarkNav and NewChat components; clean up imports in ArchivedChatsTable and useSetIndexOptions hooks; enhance localization in PromptVersions * chore: remove unused import of Constants and TMessage from MobileNav; retain only necessary QueryKeys import * chore: remove unused TResPlugin type and related references; clean up imports in types and schemas
138 lines
4.8 KiB
TypeScript
138 lines
4.8 KiB
TypeScript
import { useRecoilState } from 'recoil';
|
|
import { EModelEndpoint, SettingsViews } from 'librechat-data-provider';
|
|
import { Button, MessagesSquared, AssistantIcon, DataIcon } from '@librechat/client';
|
|
import type { ReactNode } from 'react';
|
|
import { useChatContext } from '~/Providers';
|
|
import { useLocalize } from '~/hooks';
|
|
import { cn } from '~/utils';
|
|
import store from '~/store';
|
|
|
|
type TPopoverButton = {
|
|
label: string;
|
|
buttonClass: string;
|
|
handler: () => void;
|
|
type?: 'alternative';
|
|
icon: ReactNode;
|
|
};
|
|
|
|
export default function PopoverButtons({
|
|
buttonClass,
|
|
iconClass = '',
|
|
endpoint: _overrideEndpoint,
|
|
endpointType: overrideEndpointType,
|
|
model: overrideModel,
|
|
}: {
|
|
buttonClass?: string;
|
|
iconClass?: string;
|
|
endpoint?: EModelEndpoint | string;
|
|
endpointType?: EModelEndpoint | string | null;
|
|
model?: string | null;
|
|
}) {
|
|
const localize = useLocalize();
|
|
const { conversation, optionSettings, setOptionSettings } = useChatContext();
|
|
const [settingsView, setSettingsView] = useRecoilState(store.currentSettingsView);
|
|
|
|
const { model: _model, endpoint: _endpoint, endpointType } = conversation ?? {};
|
|
const overrideEndpoint = overrideEndpointType ?? _overrideEndpoint;
|
|
const endpoint = overrideEndpoint ?? endpointType ?? _endpoint ?? '';
|
|
const model = overrideModel ?? _model;
|
|
|
|
const isGenerativeModel = /gemini|learnlm|gemma/.test(model ?? '') ?? false;
|
|
const isChatModel = (!isGenerativeModel && model?.toLowerCase().includes('chat')) ?? false;
|
|
const isTextModel = !isGenerativeModel && !isChatModel && /code|text/.test(model ?? '');
|
|
|
|
const { showExamples } = optionSettings;
|
|
const showExamplesButton = !isGenerativeModel && !isTextModel && isChatModel;
|
|
|
|
const triggerExamples = () => {
|
|
setSettingsView(SettingsViews.default);
|
|
setOptionSettings((prev) => ({ ...prev, showExamples: !(prev.showExamples ?? false) }));
|
|
};
|
|
|
|
const endpointSpecificbuttons: { [key: string]: TPopoverButton[] } = {
|
|
[EModelEndpoint.google]: [
|
|
{
|
|
label: localize(showExamples === true ? 'com_hide_examples' : 'com_show_examples'),
|
|
buttonClass: isGenerativeModel === true || isTextModel ? 'disabled' : '',
|
|
handler: triggerExamples,
|
|
icon: <MessagesSquared className={cn('mr-1 w-[14px]', iconClass)} />,
|
|
},
|
|
],
|
|
};
|
|
|
|
if (!endpoint) {
|
|
return null;
|
|
}
|
|
|
|
if (endpoint === EModelEndpoint.google && !showExamplesButton) {
|
|
return null;
|
|
}
|
|
|
|
const additionalButtons: { [key: string]: TPopoverButton[] } = {
|
|
[SettingsViews.default]: [
|
|
{
|
|
label: 'Context Settings',
|
|
buttonClass: '',
|
|
type: 'alternative',
|
|
handler: () => setSettingsView(SettingsViews.advanced),
|
|
icon: <DataIcon className={cn('mr-1 h-6 w-[14px]', iconClass)} />,
|
|
},
|
|
],
|
|
[SettingsViews.advanced]: [
|
|
{
|
|
label: 'Model Settings',
|
|
buttonClass: '',
|
|
type: 'alternative',
|
|
handler: () => setSettingsView(SettingsViews.default),
|
|
icon: <AssistantIcon className={cn('mr-1 h-6 w-[14px]', iconClass)} />,
|
|
},
|
|
],
|
|
};
|
|
|
|
const endpointButtons = (endpointSpecificbuttons[endpoint] as TPopoverButton[] | null) ?? [];
|
|
|
|
const disabled = true;
|
|
|
|
return (
|
|
<div className="flex w-full justify-between">
|
|
<div className="flex items-center justify-start">
|
|
{endpointButtons.map((button, index) => (
|
|
<Button
|
|
key={`button-${index}`}
|
|
type="button"
|
|
className={cn(
|
|
button.buttonClass,
|
|
'border border-gray-300/50 focus:ring-1 focus:ring-green-500/90 dark:border-gray-500/50 dark:focus:ring-green-500',
|
|
'ml-1 h-full bg-transparent px-2 py-1 text-xs font-normal text-black hover:bg-gray-100 hover:text-black dark:bg-transparent dark:text-white dark:hover:bg-gray-600 dark:hover:text-white',
|
|
buttonClass ?? '',
|
|
)}
|
|
onClick={button.handler}
|
|
>
|
|
{button.icon}
|
|
{button.label}
|
|
</Button>
|
|
))}
|
|
</div>
|
|
{disabled ? null : (
|
|
<div className="flex w-[150px] items-center justify-end">
|
|
{additionalButtons[settingsView].map((button, index) => (
|
|
<Button
|
|
key={`button-${index}`}
|
|
type="button"
|
|
className={cn(
|
|
button.buttonClass,
|
|
'flex justify-center border border-gray-300/50 focus:ring-1 focus:ring-green-500/90 dark:border-gray-500/50 dark:focus:ring-green-500',
|
|
'h-full w-full bg-transparent px-2 py-1 text-xs font-normal text-black hover:bg-gray-100 hover:text-black dark:bg-transparent dark:text-white dark:hover:bg-gray-600 dark:hover:text-white',
|
|
buttonClass ?? '',
|
|
)}
|
|
onClick={button.handler}
|
|
>
|
|
{button.icon}
|
|
{button.label}
|
|
</Button>
|
|
))}
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|