From 69e9b9855e852ddaacbcc7046825fbbaddd77548 Mon Sep 17 00:00:00 2001 From: suyao Date: Wed, 30 Apr 2025 02:52:18 +0800 Subject: [PATCH] feat: implement ThinkingPanel for managing reasoning effort and token limits - Added ThinkingPanel component to handle user settings for reasoning effort and thinking budget. - Introduced ThinkingSelect and ThinkingSlider components for selecting reasoning effort and adjusting token limits. - Updated models and hooks to support new reasoning effort and thinking budget features. - Enhanced Inputbar to integrate ThinkingPanel and provide a toggle for enabling thinking features. - Updated translations and styles for new components. --- .../ThinkingPanel/ThinkingSelect.tsx | 64 +++++++++ .../ThinkingPanel/ThinkingSlider.tsx | 92 +++++++++++++ .../src/components/ThinkingPanel/index.tsx | 125 ++++++++++++++++++ src/renderer/src/config/models.ts | 102 +++++++++++--- src/renderer/src/locales/zh/translation.json | 1 + .../src/pages/home/Inputbar/Inputbar.tsx | 72 +++++++++- .../pages/home/Inputbar/ThinkingButton.tsx | 31 +++++ .../src/pages/home/Tabs/SettingsTab.tsx | 94 +------------ .../AssistantModelSettings.tsx | 30 +---- .../providers/AiProvider/GeminiProvider.ts | 35 ++--- .../providers/AiProvider/OpenAIProvider.ts | 59 +++++---- src/renderer/src/types/index.ts | 2 + 12 files changed, 512 insertions(+), 195 deletions(-) create mode 100644 src/renderer/src/components/ThinkingPanel/ThinkingSelect.tsx create mode 100644 src/renderer/src/components/ThinkingPanel/ThinkingSlider.tsx create mode 100644 src/renderer/src/components/ThinkingPanel/index.tsx create mode 100644 src/renderer/src/locales/zh/translation.json create mode 100644 src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx diff --git a/src/renderer/src/components/ThinkingPanel/ThinkingSelect.tsx b/src/renderer/src/components/ThinkingPanel/ThinkingSelect.tsx new file mode 100644 index 0000000000..307dd4d4f4 --- /dev/null +++ b/src/renderer/src/components/ThinkingPanel/ThinkingSelect.tsx @@ -0,0 +1,64 @@ +import { isSupportedReasoningEffortGrokModel } from '@renderer/config/models' +import { Assistant, Model } from '@renderer/types' +import { Select } from 'antd' +import { useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' + +import { ReasoningEffortOptions } from './index' + +interface ThinkingSelectProps { + model: Model + assistant: Assistant + value?: ReasoningEffortOptions | null + onChange?: (value: ReasoningEffortOptions) => void +} + +interface OptionType { + label: string + value: ReasoningEffortOptions +} + +export default function ThinkingSelect({ model, assistant, value, onChange }: ThinkingSelectProps) { + const { t } = useTranslation() + const [open, setOpen] = useState(false) + + const baseOptions = useMemo( + () => + [ + { label: t('assistants.settings.reasoning_effort.low'), value: 'low' }, + { label: t('assistants.settings.reasoning_effort.medium'), value: 'medium' }, + { label: t('assistants.settings.reasoning_effort.high'), value: 'high' } + ] as OptionType[], + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ) + + const options = useMemo( + () => + isSupportedReasoningEffortGrokModel(model) + ? baseOptions.filter((option) => option.value === 'low' || option.value === 'high') + : baseOptions, + [model, baseOptions] + ) + + const currentValue = value ?? assistant.settings?.reasoning_effort ?? null + + const handleChange = (newValue: ReasoningEffortOptions) => { + onChange?.(newValue) + setOpen(false) + } + + return ( + <> +