import { useState } from 'react'; import { ChevronDown } from 'lucide-react'; import * as Menu from '@ariakit/react/menu'; import { AuthType, SearchCategories, RerankerTypes } from 'librechat-data-provider'; import type { UseFormRegister, UseFormHandleSubmit } from 'react-hook-form'; import type { SearchApiKeyFormData } from '~/hooks/Plugins/useAuthSearchTool'; import type { MenuItemProps } from '~/common'; import { Input, Button, OGDialog, Label } from '~/components/ui'; import OGDialogTemplate from '~/components/ui/OGDialogTemplate'; import DropdownPopup from '~/components/ui/DropdownPopup'; import { useGetStartupConfig } from '~/data-provider'; import { useLocalize } from '~/hooks'; export default function ApiKeyDialog({ isOpen, onSubmit, onRevoke, onOpenChange, authTypes, isToolAuthenticated, register, handleSubmit, triggerRef, triggerRefs, }: { isOpen: boolean; onOpenChange: (open: boolean) => void; onSubmit: (data: SearchApiKeyFormData) => void; onRevoke: () => void; authTypes: [string, AuthType][]; isToolAuthenticated: boolean; register: UseFormRegister; handleSubmit: UseFormHandleSubmit; triggerRef?: React.RefObject; triggerRefs?: React.RefObject[]; }) { const localize = useLocalize(); const { data: config } = useGetStartupConfig(); const [selectedReranker, setSelectedReranker] = useState< RerankerTypes.JINA | RerankerTypes.COHERE >( config?.webSearch?.rerankerType === RerankerTypes.COHERE ? RerankerTypes.COHERE : RerankerTypes.JINA, ); const [providerDropdownOpen, setProviderDropdownOpen] = useState(false); const [scraperDropdownOpen, setScraperDropdownOpen] = useState(false); const [rerankerDropdownOpen, setRerankerDropdownOpen] = useState(false); const providerItems: MenuItemProps[] = [ { label: localize('com_ui_web_search_provider_serper'), onClick: () => {}, }, ]; const scraperItems: MenuItemProps[] = [ { label: localize('com_ui_web_search_scraper_firecrawl'), onClick: () => {}, }, ]; const rerankerItems: MenuItemProps[] = [ { label: localize('com_ui_web_search_reranker_jina'), onClick: () => setSelectedReranker(RerankerTypes.JINA), }, { label: localize('com_ui_web_search_reranker_cohere'), onClick: () => setSelectedReranker(RerankerTypes.COHERE), }, ]; const showProviderDropdown = !config?.webSearch?.searchProvider; const showScraperDropdown = !config?.webSearch?.scraperType; const showRerankerDropdown = !config?.webSearch?.rerankerType; // Determine which categories are SYSTEM_DEFINED const providerAuthType = authTypes.find(([cat]) => cat === SearchCategories.PROVIDERS)?.[1]; const scraperAuthType = authTypes.find(([cat]) => cat === SearchCategories.SCRAPERS)?.[1]; const rerankerAuthType = authTypes.find(([cat]) => cat === SearchCategories.RERANKERS)?.[1]; function renderRerankerInput() { if (config?.webSearch?.rerankerType === RerankerTypes.JINA) { return ( <> (e.target.readOnly = false)} {...register('jinaApiKey')} />
{localize('com_ui_web_search_reranker_jina_key')}
); } if (config?.webSearch?.rerankerType === RerankerTypes.COHERE) { return ( <> (e.target.readOnly = false)} {...register('cohereApiKey')} />
{localize('com_ui_web_search_reranker_cohere_key')}
); } if (!config?.webSearch?.rerankerType && selectedReranker === RerankerTypes.JINA) { return ( <> (e.target.readOnly = false)} {...register('jinaApiKey')} />
{localize('com_ui_web_search_reranker_jina_key')}
); } if (!config?.webSearch?.rerankerType && selectedReranker === RerankerTypes.COHERE) { return ( <> (e.target.readOnly = false)} {...register('cohereApiKey')} />
{localize('com_ui_web_search_reranker_cohere_key')}
); } return null; } return (
{localize('com_ui_web_search')}
{localize('com_ui_web_search_api_subtitle')}
{/* Search Provider Section */} {providerAuthType !== AuthType.SYSTEM_DEFINED && (
{showProviderDropdown ? ( setProviderDropdownOpen(!providerDropdownOpen)} className="flex items-center rounded-md border border-border-light px-3 py-1 text-sm text-text-secondary" > {localize('com_ui_web_search_provider_serper')} } /> ) : (
{localize('com_ui_web_search_provider_serper')}
)}
(e.target.readOnly = false)} {...register('serperApiKey', { required: true })} />
)} {/* Scraper Section */} {scraperAuthType !== AuthType.SYSTEM_DEFINED && (
{showScraperDropdown ? ( setScraperDropdownOpen(!scraperDropdownOpen)} className="flex items-center rounded-md border border-border-light px-3 py-1 text-sm text-text-secondary" > {localize('com_ui_web_search_scraper_firecrawl')} } /> ) : (
{localize('com_ui_web_search_scraper_firecrawl')}
)}
(e.target.readOnly = false)} className="mb-2" {...register('firecrawlApiKey')} />
)} {/* Reranker Section */} {rerankerAuthType !== AuthType.SYSTEM_DEFINED && (
{showRerankerDropdown && ( setRerankerDropdownOpen(!rerankerDropdownOpen)} className="flex items-center rounded-md border border-border-light px-3 py-1 text-sm text-text-secondary" > {selectedReranker === RerankerTypes.JINA ? localize('com_ui_web_search_reranker_jina') : localize('com_ui_web_search_reranker_cohere')} } /> )} {!showRerankerDropdown && (
{config?.webSearch?.rerankerType === RerankerTypes.COHERE ? localize('com_ui_web_search_reranker_cohere') : localize('com_ui_web_search_reranker_jina')}
)}
{renderRerankerInput()}
)}
} selection={{ selectHandler: handleSubmit(onSubmit), selectClasses: 'bg-green-500 hover:bg-green-600 text-white', selectText: localize('com_ui_save'), }} buttons={ isToolAuthenticated && ( ) } showCancelButton={true} />
); }