import { useCallback, useMemo } from 'react' import { QueryMode, QueryRequest } from '@/api/lightrag' // Removed unused import for Text component import Checkbox from '@/components/ui/Checkbox' import Input from '@/components/ui/Input' import UserPromptInputWithHistory from '@/components/ui/UserPromptInputWithHistory' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/Card' import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/Tooltip' import { useSettingsStore } from '@/stores/settings' import { useTranslation } from 'react-i18next' import { RotateCcw } from 'lucide-react' export default function QuerySettings() { const { t } = useTranslation() const querySettings = useSettingsStore((state) => state.querySettings) const userPromptHistory = useSettingsStore((state) => state.userPromptHistory) const handleChange = useCallback((key: keyof QueryRequest, value: any) => { useSettingsStore.getState().updateQuerySettings({ [key]: value }) }, []) const handleSelectFromHistory = useCallback((prompt: string) => { handleChange('user_prompt', prompt) }, [handleChange]) const handleDeleteFromHistory = useCallback((index: number) => { const newHistory = [...userPromptHistory] newHistory.splice(index, 1) useSettingsStore.getState().setUserPromptHistory(newHistory) }, [userPromptHistory]) // Default values for reset functionality const defaultValues = useMemo(() => ({ mode: 'mix' as QueryMode, top_k: 40, chunk_top_k: 20, max_entity_tokens: 6000, max_relation_tokens: 8000, max_total_tokens: 30000 }), []) const handleReset = useCallback((key: keyof typeof defaultValues) => { handleChange(key, defaultValues[key]) }, [handleChange, defaultValues]) // Reset button component const ResetButton = ({ onClick, title }: { onClick: () => void; title: string }) => (

{title}

) return ( {t('retrievePanel.querySettings.parametersTitle')} {t('retrievePanel.querySettings.parametersDescription')}
{/* User Prompt - Moved to top for better dropdown space */} <>

{t('retrievePanel.querySettings.userPromptTooltip')}

handleChange('user_prompt', value)} onSelectFromHistory={handleSelectFromHistory} onDeleteFromHistory={handleDeleteFromHistory} history={userPromptHistory} placeholder={t('retrievePanel.querySettings.userPromptPlaceholder')} className="h-9" />
{/* Query Mode */} <>

{t('retrievePanel.querySettings.queryModeTooltip')}

handleReset('mode')} title="Reset to default (Mix)" />
{/* Top K */} <>

{t('retrievePanel.querySettings.topKTooltip')}

{ const value = e.target.value handleChange('top_k', value === '' ? '' : parseInt(value) || 0) }} onBlur={(e) => { const value = e.target.value if (value === '' || isNaN(parseInt(value))) { handleChange('top_k', 40) } }} min={1} placeholder={t('retrievePanel.querySettings.topKPlaceholder')} className="h-9 flex-1 pr-2 [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield]" /> handleReset('top_k')} title="Reset to default" />
{/* Chunk Top K */} <>

{t('retrievePanel.querySettings.chunkTopKTooltip')}

{ const value = e.target.value handleChange('chunk_top_k', value === '' ? '' : parseInt(value) || 0) }} onBlur={(e) => { const value = e.target.value if (value === '' || isNaN(parseInt(value))) { handleChange('chunk_top_k', 20) } }} min={1} placeholder={t('retrievePanel.querySettings.chunkTopKPlaceholder')} className="h-9 flex-1 pr-2 [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield]" /> handleReset('chunk_top_k')} title="Reset to default" />
{/* Max Entity Tokens */} <>

{t('retrievePanel.querySettings.maxEntityTokensTooltip')}

{ const value = e.target.value handleChange('max_entity_tokens', value === '' ? '' : parseInt(value) || 0) }} onBlur={(e) => { const value = e.target.value if (value === '' || isNaN(parseInt(value))) { handleChange('max_entity_tokens', 6000) } }} min={1} placeholder={t('retrievePanel.querySettings.maxEntityTokensPlaceholder')} className="h-9 flex-1 pr-2 [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield]" /> handleReset('max_entity_tokens')} title="Reset to default" />
{/* Max Relation Tokens */} <>

{t('retrievePanel.querySettings.maxRelationTokensTooltip')}

{ const value = e.target.value handleChange('max_relation_tokens', value === '' ? '' : parseInt(value) || 0) }} onBlur={(e) => { const value = e.target.value if (value === '' || isNaN(parseInt(value))) { handleChange('max_relation_tokens', 8000) } }} min={1} placeholder={t('retrievePanel.querySettings.maxRelationTokensPlaceholder')} className="h-9 flex-1 pr-2 [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield]" /> handleReset('max_relation_tokens')} title="Reset to default" />
{/* Max Total Tokens */} <>

{t('retrievePanel.querySettings.maxTotalTokensTooltip')}

{ const value = e.target.value handleChange('max_total_tokens', value === '' ? '' : parseInt(value) || 0) }} onBlur={(e) => { const value = e.target.value if (value === '' || isNaN(parseInt(value))) { handleChange('max_total_tokens', 30000) } }} min={1} placeholder={t('retrievePanel.querySettings.maxTotalTokensPlaceholder')} className="h-9 flex-1 pr-2 [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none [-moz-appearance:textfield]" /> handleReset('max_total_tokens')} title="Reset to default" />
{/* Toggle Options */} <>

{t('retrievePanel.querySettings.enableRerankTooltip')}

handleChange('enable_rerank', checked)} />

{t('retrievePanel.querySettings.onlyNeedContextTooltip')}

{ handleChange('only_need_context', checked) if (checked) { handleChange('only_need_prompt', false) } }} />

{t('retrievePanel.querySettings.onlyNeedPromptTooltip')}

{ handleChange('only_need_prompt', checked) if (checked) { handleChange('only_need_context', false) } }} />

{t('retrievePanel.querySettings.streamResponseTooltip')}

handleChange('stream', checked)} />
) }