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 { 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 handleChange = useCallback((key: keyof QueryRequest, value: any) => { useSettingsStore.getState().updateQuerySettings({ [key]: value }) }, []) // Default values for reset functionality const defaultValues = useMemo(() => ({ mode: 'mix' as QueryMode, response_type: 'Multiple Paragraphs', 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')}
{/* Query Mode */} <>

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

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

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

handleReset('response_type')} title="Reset to default (Multiple Paragraphs)" />
{/* 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" />
{/* User Prompt */} <>

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

handleChange('user_prompt', e.target.value)} placeholder={t('retrievePanel.querySettings.userPromptPlaceholder')} className="h-9" />
{/* Toggle Options */} <>

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

handleChange('enable_rerank', checked)} />

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

handleChange('only_need_context', checked)} />

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

handleChange('only_need_prompt', checked)} />

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

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