feat: add Top-P parameter toggle with default enabled state and improved UI styling (#8137)

* feat: add Top-P parameter toggle with default enabled state and improved UI styling

* fix: resolve undefined enableTopP issue in ppio models by using getAssistantSettings

* refactor(api): Unify getTopP method to BaseApiClient

* feat(settings): adjust layout of Top-P setting in assistant model settings

* feat: add temperature parameter toggle control with UI and multi-language support

* fix: Fix lint error

* fix: Sort these imports

* style(settings): refactor model settings layout and styles

* chore: yarn sync:i18n
This commit is contained in:
lihqi 2025-07-28 21:27:31 +08:00 committed by GitHub
parent c4182a950f
commit 536aa68389
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 246 additions and 164 deletions

View File

@ -8,6 +8,7 @@ import {
import { REFERENCE_PROMPT } from '@renderer/config/prompts' import { REFERENCE_PROMPT } from '@renderer/config/prompts'
import { getLMStudioKeepAliveTime } from '@renderer/hooks/useLMStudio' import { getLMStudioKeepAliveTime } from '@renderer/hooks/useLMStudio'
import { getStoreSetting } from '@renderer/hooks/useSettings' import { getStoreSetting } from '@renderer/hooks/useSettings'
import { getAssistantSettings } from '@renderer/services/AssistantService'
import { SettingsState } from '@renderer/store/settings' import { SettingsState } from '@renderer/store/settings'
import { import {
Assistant, Assistant,
@ -185,11 +186,19 @@ export abstract class BaseApiClient<
} }
public getTemperature(assistant: Assistant, model: Model): number | undefined { public getTemperature(assistant: Assistant, model: Model): number | undefined {
return isNotSupportTemperatureAndTopP(model) ? undefined : assistant.settings?.temperature if (isNotSupportTemperatureAndTopP(model)) {
return undefined
}
const assistantSettings = getAssistantSettings(assistant)
return assistantSettings?.enableTemperature ? assistantSettings?.temperature : undefined
} }
public getTopP(assistant: Assistant, model: Model): number | undefined { public getTopP(assistant: Assistant, model: Model): number | undefined {
return isNotSupportTemperatureAndTopP(model) ? undefined : assistant.settings?.topP if (isNotSupportTemperatureAndTopP(model)) {
return undefined
}
const assistantSettings = getAssistantSettings(assistant)
return assistantSettings?.enableTopP ? assistantSettings?.topP : undefined
} }
protected getServiceTier(model: Model) { protected getServiceTier(model: Model) {

View File

@ -138,14 +138,14 @@ export class AnthropicAPIClient extends BaseApiClient<
if (assistant.settings?.reasoning_effort && isClaudeReasoningModel(model)) { if (assistant.settings?.reasoning_effort && isClaudeReasoningModel(model)) {
return undefined return undefined
} }
return assistant.settings?.temperature return super.getTemperature(assistant, model)
} }
override getTopP(assistant: Assistant, model: Model): number | undefined { override getTopP(assistant: Assistant, model: Model): number | undefined {
if (assistant.settings?.reasoning_effort && isClaudeReasoningModel(model)) { if (assistant.settings?.reasoning_effort && isClaudeReasoningModel(model)) {
return undefined return undefined
} }
return assistant.settings?.topP return super.getTopP(assistant, model)
} }
/** /**

View File

@ -1,7 +1,6 @@
import { loggerService } from '@logger' import { loggerService } from '@logger'
import { import {
isClaudeReasoningModel, isClaudeReasoningModel,
isNotSupportTemperatureAndTopP,
isOpenAIReasoningModel, isOpenAIReasoningModel,
isSupportedModel, isSupportedModel,
isSupportedReasoningEffortOpenAIModel isSupportedReasoningEffortOpenAIModel
@ -172,23 +171,17 @@ export abstract class OpenAIBaseClient<
} }
override getTemperature(assistant: Assistant, model: Model): number | undefined { override getTemperature(assistant: Assistant, model: Model): number | undefined {
if ( if (assistant.settings?.reasoning_effort && isClaudeReasoningModel(model)) {
isNotSupportTemperatureAndTopP(model) ||
(assistant.settings?.reasoning_effort && isClaudeReasoningModel(model))
) {
return undefined return undefined
} }
return assistant.settings?.temperature return super.getTemperature(assistant, model)
} }
override getTopP(assistant: Assistant, model: Model): number | undefined { override getTopP(assistant: Assistant, model: Model): number | undefined {
if ( if (assistant.settings?.reasoning_effort && isClaudeReasoningModel(model)) {
isNotSupportTemperatureAndTopP(model) ||
(assistant.settings?.reasoning_effort && isClaudeReasoningModel(model))
) {
return undefined return undefined
} }
return assistant.settings?.topP return super.getTopP(assistant, model)
} }
/** /**

View File

@ -465,7 +465,7 @@
}, },
"top_p": { "top_p": {
"label": "Top-P", "label": "Top-P",
"tip": "默认值为 1值越小AI 生成的内容越单调也越容易理解值越大AI 回复的词汇围越大,越多样化" "tip": "默认值为 1值越小AI 生成的内容越单调也越容易理解值越大AI 回复的词汇围越大,越多样化"
} }
}, },
"suggestions": { "suggestions": {

View File

@ -68,6 +68,7 @@ const SettingsTab: FC<Props> = (props) => {
const { themeNames } = useCodeStyle() const { themeNames } = useCodeStyle()
const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) const [temperature, setTemperature] = useState(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE)
const [enableTemperature, setEnableTemperature] = useState(assistant?.settings?.enableTemperature ?? true)
const [contextCount, setContextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT) const [contextCount, setContextCount] = useState(assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT)
const [enableMaxTokens, setEnableMaxTokens] = useState(assistant?.settings?.enableMaxTokens ?? false) const [enableMaxTokens, setEnableMaxTokens] = useState(assistant?.settings?.enableMaxTokens ?? false)
const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0) const [maxTokens, setMaxTokens] = useState(assistant?.settings?.maxTokens ?? 0)
@ -154,6 +155,7 @@ const SettingsTab: FC<Props> = (props) => {
useEffect(() => { useEffect(() => {
setTemperature(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE) setTemperature(assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE)
setEnableTemperature(assistant?.settings?.enableTemperature ?? true)
setContextCount(assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT) setContextCount(assistant?.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT)
setEnableMaxTokens(assistant?.settings?.enableMaxTokens ?? false) setEnableMaxTokens(assistant?.settings?.enableMaxTokens ?? false)
setMaxTokens(assistant?.settings?.maxTokens ?? DEFAULT_MAX_TOKENS) setMaxTokens(assistant?.settings?.maxTokens ?? DEFAULT_MAX_TOKENS)
@ -193,19 +195,32 @@ const SettingsTab: FC<Props> = (props) => {
<Tooltip title={t('chat.settings.temperature.tip')}> <Tooltip title={t('chat.settings.temperature.tip')}>
<CircleHelp size={14} style={{ marginLeft: 4 }} color="var(--color-text-2)" /> <CircleHelp size={14} style={{ marginLeft: 4 }} color="var(--color-text-2)" />
</Tooltip> </Tooltip>
<Switch
size="small"
style={{ marginLeft: 'auto' }}
checked={enableTemperature}
onChange={(enabled) => {
setEnableTemperature(enabled)
onUpdateAssistantSettings({ enableTemperature: enabled })
}}
/>
</Row> </Row>
<Row align="middle" gutter={10}> {enableTemperature ? (
<Col span={23}> <Row align="middle" gutter={10}>
<Slider <Col span={23}>
min={0} <Slider
max={2} min={0}
onChange={setTemperature} max={2}
onChangeComplete={onTemperatureChange} onChange={setTemperature}
value={typeof temperature === 'number' ? temperature : 0} onChangeComplete={onTemperatureChange}
step={0.1} value={typeof temperature === 'number' ? temperature : 0}
/> step={0.1}
</Col> />
</Row> </Col>
</Row>
) : (
<SettingDivider />
)}
<Row align="middle"> <Row align="middle">
<SettingRowTitleSmall>{t('chat.settings.context_count.label')}</SettingRowTitleSmall> <SettingRowTitleSmall>{t('chat.settings.context_count.label')}</SettingRowTitleSmall>
<Tooltip title={t('chat.settings.context_count.tip')}> <Tooltip title={t('chat.settings.context_count.tip')}>

View File

@ -29,9 +29,11 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
const [toolUseMode, setToolUseMode] = useState(assistant?.settings?.toolUseMode ?? 'prompt') const [toolUseMode, setToolUseMode] = useState(assistant?.settings?.toolUseMode ?? 'prompt')
const [defaultModel, setDefaultModel] = useState(assistant?.defaultModel) const [defaultModel, setDefaultModel] = useState(assistant?.defaultModel)
const [topP, setTopP] = useState(assistant?.settings?.topP ?? 1) const [topP, setTopP] = useState(assistant?.settings?.topP ?? 1)
const [enableTopP, setEnableTopP] = useState(assistant?.settings?.enableTopP ?? true)
const [customParameters, setCustomParameters] = useState<AssistantSettingCustomParameters[]>( const [customParameters, setCustomParameters] = useState<AssistantSettingCustomParameters[]>(
assistant?.settings?.customParameters ?? [] assistant?.settings?.customParameters ?? []
) )
const [enableTemperature, setEnableTemperature] = useState(assistant?.settings?.enableTemperature ?? true)
const customParametersRef = useRef(customParameters) const customParametersRef = useRef(customParameters)
@ -151,20 +153,24 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
const onReset = () => { const onReset = () => {
setTemperature(DEFAULT_TEMPERATURE) setTemperature(DEFAULT_TEMPERATURE)
setEnableTemperature(true)
setContextCount(DEFAULT_CONTEXTCOUNT) setContextCount(DEFAULT_CONTEXTCOUNT)
setEnableMaxTokens(false) setEnableMaxTokens(false)
setMaxTokens(0) setMaxTokens(0)
setStreamOutput(true) setStreamOutput(true)
setTopP(1) setTopP(1)
setEnableTopP(true)
setCustomParameters([]) setCustomParameters([])
setToolUseMode('prompt') setToolUseMode('prompt')
updateAssistantSettings({ updateAssistantSettings({
temperature: DEFAULT_TEMPERATURE, temperature: DEFAULT_TEMPERATURE,
enableTemperature: true,
contextCount: DEFAULT_CONTEXTCOUNT, contextCount: DEFAULT_CONTEXTCOUNT,
enableMaxTokens: false, enableMaxTokens: false,
maxTokens: 0, maxTokens: 0,
streamOutput: true, streamOutput: true,
topP: 1, topP: 1,
enableTopP: true,
customParameters: [], customParameters: [],
toolUseMode: 'prompt' toolUseMode: 'prompt'
}) })
@ -226,86 +232,103 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
</HStack> </HStack>
</HStack> </HStack>
<Divider style={{ margin: '10px 0' }} /> <Divider style={{ margin: '10px 0' }} />
<Row align="middle">
<Col span={20}> <SettingRow style={{ minHeight: 30 }}>
<HStack alignItems="center">
<Label> <Label>
{t('chat.settings.temperature.label')} {t('chat.settings.temperature.label')}
<Tooltip title={t('chat.settings.temperature.tip')}> <Tooltip title={t('chat.settings.temperature.tip')}>
<QuestionIcon /> <QuestionIcon />
</Tooltip> </Tooltip>
</Label> </Label>
</Col> </HStack>
<Col span={4}> <Switch
<EditableNumber checked={enableTemperature}
min={0} onChange={(enabled) => {
max={2} setEnableTemperature(enabled)
step={0.01} updateAssistantSettings({ enableTemperature: enabled })
precision={2} }}
value={temperature} />
onChange={(value) => { </SettingRow>
if (value !== null) { {enableTemperature && (
setTemperature(value) <Row align="middle" gutter={12}>
setTimeout(() => updateAssistantSettings({ temperature: value }), 500) <Col span={20}>
} <Slider
}} min={0}
style={{ width: '100%' }} max={2}
/> onChange={setTemperature}
</Col> onChangeComplete={onTemperatureChange}
</Row> value={typeof temperature === 'number' ? temperature : 0}
<Row align="middle" gutter={24}> marks={{ 0: '0', 0.7: '0.7', 2: '2' }}
<Col span={24}> step={0.01}
<Slider />
min={0} </Col>
max={2} <Col span={4}>
onChange={setTemperature} <EditableNumber
onChangeComplete={onTemperatureChange} min={0}
value={typeof temperature === 'number' ? temperature : 0} max={2}
marks={{ 0: '0', 0.7: '0.7', 2: '2' }} step={0.01}
step={0.01} value={temperature}
/> changeOnBlur
</Col> onChange={(value) => {
</Row> if (!isNull(value)) {
setTemperature(value)
setTimeout(() => updateAssistantSettings({ temperature: value }), 500)
}
}}
style={{ width: '100%' }}
/>
</Col>
</Row>
)}
<Divider style={{ margin: '10px 0' }} /> <Divider style={{ margin: '10px 0' }} />
<Row align="middle"> <SettingRow style={{ minHeight: 30 }}>
<Col span={20}> <HStack alignItems="center">
<Label> <Label>{t('chat.settings.top_p.label')}</Label>
{t('chat.settings.top_p.label')} <Tooltip title={t('chat.settings.top_p.tip')}>
<Tooltip title={t('chat.settings.top_p.tip')}> <QuestionIcon />
<QuestionIcon /> </Tooltip>
</Tooltip> </HStack>
</Label> <Switch
</Col> checked={enableTopP}
<Col span={4}> onChange={(enabled) => {
<EditableNumber setEnableTopP(enabled)
min={0} updateAssistantSettings({ enableTopP: enabled })
max={1} }}
step={0.01} />
value={topP} </SettingRow>
changeOnBlur {enableTopP && (
onChange={(value) => { <Row align="middle" gutter={12}>
if (!isNull(value)) { <Col span={20}>
setTopP(value) <Slider
setTimeout(() => updateAssistantSettings({ topP: value }), 500) min={0}
} max={1}
}} onChange={setTopP}
style={{ width: '100%' }} onChangeComplete={onTopPChange}
/> value={typeof topP === 'number' ? topP : 1}
</Col> marks={{ 0: '0', 1: '1' }}
</Row> step={0.01}
<Row align="middle" gutter={24}> />
<Col span={24}> </Col>
<Slider <Col span={4}>
min={0} <EditableNumber
max={1} min={0}
onChange={setTopP} max={1}
onChangeComplete={onTopPChange} step={0.01}
value={typeof topP === 'number' ? topP : 1} value={topP}
marks={{ 0: '0', 1: '1' }} changeOnBlur
step={0.01} onChange={(value) => {
/> if (!isNull(value)) {
</Col> setTopP(value)
</Row> setTimeout(() => updateAssistantSettings({ topP: value }), 500)
}
}}
style={{ width: '100%' }}
/>
</Col>
</Row>
)}
<Divider style={{ margin: '10px 0' }} /> <Divider style={{ margin: '10px 0' }} />
<Row align="middle"> <Row align="middle">

View File

@ -13,15 +13,17 @@ import { Dispatch, FC, SetStateAction, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import styled from 'styled-components' import styled from 'styled-components'
import { SettingContainer, SettingSubtitle } from '..' import { SettingContainer, SettingRow, SettingSubtitle } from '..'
const AssistantSettings: FC = () => { const AssistantSettings: FC = () => {
const { defaultAssistant, updateDefaultAssistant } = useDefaultAssistant() const { defaultAssistant, updateDefaultAssistant } = useDefaultAssistant()
const [temperature, setTemperature] = useState(defaultAssistant.settings?.temperature ?? DEFAULT_TEMPERATURE) const [temperature, setTemperature] = useState(defaultAssistant.settings?.temperature ?? DEFAULT_TEMPERATURE)
const [enableTemperature, setEnableTemperature] = useState(defaultAssistant.settings?.enableTemperature ?? true)
const [contextCount, setContextCount] = useState(defaultAssistant.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT) const [contextCount, setContextCount] = useState(defaultAssistant.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT)
const [enableMaxTokens, setEnableMaxTokens] = useState(defaultAssistant?.settings?.enableMaxTokens ?? false) const [enableMaxTokens, setEnableMaxTokens] = useState(defaultAssistant?.settings?.enableMaxTokens ?? false)
const [maxTokens, setMaxTokens] = useState(defaultAssistant?.settings?.maxTokens ?? 0) const [maxTokens, setMaxTokens] = useState(defaultAssistant?.settings?.maxTokens ?? 0)
const [topP, setTopP] = useState(defaultAssistant.settings?.topP ?? 1) const [topP, setTopP] = useState(defaultAssistant.settings?.topP ?? 1)
const [enableTopP, setEnableTopP] = useState(defaultAssistant.settings?.enableTopP ?? true)
const [emoji, setEmoji] = useState(defaultAssistant.emoji || getLeadingEmoji(defaultAssistant.name) || '') const [emoji, setEmoji] = useState(defaultAssistant.emoji || getLeadingEmoji(defaultAssistant.name) || '')
const [name, setName] = useState( const [name, setName] = useState(
defaultAssistant.name.replace(getLeadingEmoji(defaultAssistant.name) || '', '').trim() defaultAssistant.name.replace(getLeadingEmoji(defaultAssistant.name) || '', '').trim()
@ -36,11 +38,13 @@ const AssistantSettings: FC = () => {
settings: { settings: {
...defaultAssistant.settings, ...defaultAssistant.settings,
temperature: settings.temperature ?? temperature, temperature: settings.temperature ?? temperature,
enableTemperature: settings.enableTemperature ?? enableTemperature,
contextCount: settings.contextCount ?? contextCount, contextCount: settings.contextCount ?? contextCount,
enableMaxTokens: settings.enableMaxTokens ?? enableMaxTokens, enableMaxTokens: settings.enableMaxTokens ?? enableMaxTokens,
maxTokens: settings.maxTokens ?? maxTokens, maxTokens: settings.maxTokens ?? maxTokens,
streamOutput: settings.streamOutput ?? true, streamOutput: settings.streamOutput ?? true,
topP: settings.topP ?? topP topP: settings.topP ?? topP,
enableTopP: settings.enableTopP ?? enableTopP
} }
}) })
} }
@ -61,20 +65,24 @@ const AssistantSettings: FC = () => {
const onReset = () => { const onReset = () => {
setTemperature(DEFAULT_TEMPERATURE) setTemperature(DEFAULT_TEMPERATURE)
setEnableTemperature(true)
setContextCount(DEFAULT_CONTEXTCOUNT) setContextCount(DEFAULT_CONTEXTCOUNT)
setEnableMaxTokens(false) setEnableMaxTokens(false)
setMaxTokens(0) setMaxTokens(0)
setTopP(1) setTopP(1)
setEnableTopP(true)
updateDefaultAssistant({ updateDefaultAssistant({
...defaultAssistant, ...defaultAssistant,
settings: { settings: {
...defaultAssistant.settings, ...defaultAssistant.settings,
temperature: DEFAULT_TEMPERATURE, temperature: DEFAULT_TEMPERATURE,
enableTemperature: true,
contextCount: DEFAULT_CONTEXTCOUNT, contextCount: DEFAULT_CONTEXTCOUNT,
enableMaxTokens: false, enableMaxTokens: false,
maxTokens: DEFAULT_MAX_TOKENS, maxTokens: DEFAULT_MAX_TOKENS,
streamOutput: true, streamOutput: true,
topP: 1 topP: 1,
enableTopP: true
} }
}) })
} }
@ -96,9 +104,11 @@ const AssistantSettings: FC = () => {
} }
return ( return (
<SettingContainer style={{ height: 'auto', background: 'transparent', padding: 0 }} theme={theme}> <SettingContainer
style={{ height: 'auto', background: 'transparent', padding: `0 0 12px 0`, gap: 12 }}
theme={theme}>
<SettingSubtitle style={{ marginTop: 0 }}>{t('common.name')}</SettingSubtitle> <SettingSubtitle style={{ marginTop: 0 }}>{t('common.name')}</SettingSubtitle>
<HStack gap={8} alignItems="center" style={{ margin: '10px 0' }}> <HStack gap={8} alignItems="center">
<Popover content={<EmojiPicker onEmojiClick={handleEmojiSelect} />} arrow> <Popover content={<EmojiPicker onEmojiClick={handleEmojiSelect} />} arrow>
<EmojiButtonWrapper> <EmojiButtonWrapper>
<Button style={{ fontSize: 20, padding: '4px', minWidth: '30px', height: '30px' }}>{emoji}</Button> <Button style={{ fontSize: 20, padding: '4px', minWidth: '30px', height: '30px' }}>{emoji}</Button>
@ -129,84 +139,108 @@ const AssistantSettings: FC = () => {
style={{ flex: 1 }} style={{ flex: 1 }}
/> />
</HStack> </HStack>
<SettingSubtitle>{t('common.prompt')}</SettingSubtitle> <SettingSubtitle style={{ marginTop: 0 }}>{t('common.prompt')}</SettingSubtitle>
<TextArea <TextArea
rows={4} rows={4}
placeholder={t('common.assistant') + t('common.prompt')} placeholder={t('common.assistant') + t('common.prompt')}
value={defaultAssistant.prompt} value={defaultAssistant.prompt}
onChange={(e) => updateDefaultAssistant({ ...defaultAssistant, prompt: e.target.value })} onChange={(e) => updateDefaultAssistant({ ...defaultAssistant, prompt: e.target.value })}
style={{ margin: '10px 0' }}
spellCheck={false} spellCheck={false}
/> />
<SettingSubtitle <SettingSubtitle
style={{ style={{
display: 'flex', display: 'flex',
flexDirection: 'row', flexDirection: 'row',
justifyContent: 'space-between' justifyContent: 'space-between',
marginTop: 0
}}> }}>
{t('settings.assistant.model_params')} {t('settings.assistant.model_params')}
<Button onClick={onReset} style={{ width: 81 }}> <Button onClick={onReset} style={{ width: 81 }}>
{t('chat.settings.reset')} {t('chat.settings.reset')}
</Button> </Button>
</SettingSubtitle> </SettingSubtitle>
<Row align="middle"> <SettingRow>
<Label>{t('chat.settings.temperature.label')}</Label> <HStack alignItems="center">
<Tooltip title={t('chat.settings.temperature.tip')}> <Label>{t('chat.settings.temperature.label')}</Label>
<QuestionIcon /> <Tooltip title={t('chat.settings.temperature.tip')}>
</Tooltip> <QuestionIcon />
</Row> </Tooltip>
<Row align="middle" style={{ marginBottom: 10 }} gutter={20}> </HStack>
<Col span={19}> <Switch
<Slider style={{ marginLeft: 10 }}
min={0} checked={enableTemperature}
max={2} onChange={(enabled) => {
onChange={setTemperature} setEnableTemperature(enabled)
onChangeComplete={onTemperatureChange} onUpdateAssistantSettings({ enableTemperature: enabled })
value={typeof temperature === 'number' ? temperature : 0} }}
marks={{ 0: '0', 0.7: '0.7', 2: '2' }} />
step={0.01} </SettingRow>
/> {enableTemperature && (
</Col> <Row align="middle" gutter={12}>
<Col span={5}> <Col span={20}>
<InputNumber <Slider
min={0} min={0}
max={2} max={2}
step={0.01} onChange={setTemperature}
value={temperature} onChangeComplete={onTemperatureChange}
onChange={onTemperatureChange} value={typeof temperature === 'number' ? temperature : 0}
style={{ width: '100%' }} marks={{ 0: '0', 0.7: '0.7', 2: '2' }}
/> step={0.01}
</Col> />
</Row> </Col>
<Row align="middle"> <Col span={4}>
<Label>{t('chat.settings.top_p.label')}</Label> <InputNumber
<Tooltip title={t('chat.settings.top_p.tip')}> min={0}
<QuestionIcon /> max={2}
</Tooltip> step={0.01}
</Row> value={temperature}
<Row align="middle" style={{ marginBottom: 10 }} gutter={20}> onChange={onTemperatureChange}
<Col span={19}> style={{ width: '100%' }}
<Slider />
min={0} </Col>
max={1} </Row>
onChange={setTopP} )}
onChangeComplete={onTopPChange} <SettingRow>
value={typeof topP === 'number' ? topP : 1} <HStack alignItems="center">
marks={{ 0: '0', 0.5: '0.5', 1: '1' }} <Label>{t('chat.settings.top_p.label')}</Label>
step={0.01} <Tooltip title={t('chat.settings.top_p.tip')}>
/> <QuestionIcon />
</Col> </Tooltip>
<Col span={5}> </HStack>
<InputNumber min={0} max={1} step={0.01} value={topP} onChange={onTopPChange} style={{ width: '100%' }} /> <Switch
</Col> style={{ marginLeft: 10 }}
</Row> checked={enableTopP}
onChange={(enabled) => {
setEnableTopP(enabled)
onUpdateAssistantSettings({ enableTopP: enabled })
}}
/>
</SettingRow>
{enableTopP && (
<Row align="middle" gutter={12}>
<Col span={20}>
<Slider
min={0}
max={1}
onChange={setTopP}
onChangeComplete={onTopPChange}
value={typeof topP === 'number' ? topP : 1}
marks={{ 0: '0', 0.5: '0.5', 1: '1' }}
step={0.01}
/>
</Col>
<Col span={4}>
<InputNumber min={0} max={1} step={0.01} value={topP} onChange={onTopPChange} style={{ width: '100%' }} />
</Col>
</Row>
)}
<Row align="middle"> <Row align="middle">
<Label>{t('chat.settings.context_count.label')}</Label> <Label>{t('chat.settings.context_count.label')}</Label>
<Tooltip title={t('chat.settings.context_count.tip')}> <Tooltip title={t('chat.settings.context_count.tip')}>
<QuestionIcon /> <QuestionIcon />
</Tooltip> </Tooltip>
</Row> </Row>
<Row align="middle" style={{ marginBottom: 10 }} gutter={20}> <Row align="middle" gutter={20}>
<Col span={19}> <Col span={19}>
<Slider <Slider
min={0} min={0}
@ -229,7 +263,7 @@ const AssistantSettings: FC = () => {
/> />
</Col> </Col>
</Row> </Row>
<Flex justify="space-between" align="center" style={{ marginBottom: 10 }}> <Flex justify="space-between" align="center">
<HStack alignItems="center"> <HStack alignItems="center">
<Label>{t('chat.settings.max_tokens.label')}</Label> <Label>{t('chat.settings.max_tokens.label')}</Label>
<Tooltip title={t('chat.settings.max_tokens.tip')}> <Tooltip title={t('chat.settings.max_tokens.tip')}>

View File

@ -32,11 +32,13 @@ export function getDefaultAssistant(): Assistant {
regularPhrases: [], // Added regularPhrases regularPhrases: [], // Added regularPhrases
settings: { settings: {
temperature: DEFAULT_TEMPERATURE, temperature: DEFAULT_TEMPERATURE,
enableTemperature: true,
contextCount: DEFAULT_CONTEXTCOUNT, contextCount: DEFAULT_CONTEXTCOUNT,
enableMaxTokens: false, enableMaxTokens: false,
maxTokens: 0, maxTokens: 0,
streamOutput: true, streamOutput: true,
topP: 1, topP: 1,
enableTopP: true,
toolUseMode: 'prompt', toolUseMode: 'prompt',
customParameters: [] customParameters: []
} }
@ -125,7 +127,9 @@ export const getAssistantSettings = (assistant: Assistant): AssistantSettings =>
return { return {
contextCount: contextCount === MAX_CONTEXT_COUNT ? UNLIMITED_CONTEXT_COUNT : contextCount, contextCount: contextCount === MAX_CONTEXT_COUNT ? UNLIMITED_CONTEXT_COUNT : contextCount,
temperature: assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE, temperature: assistant?.settings?.temperature ?? DEFAULT_TEMPERATURE,
enableTemperature: assistant?.settings?.enableTemperature ?? true,
topP: assistant?.settings?.topP ?? 1, topP: assistant?.settings?.topP ?? 1,
enableTopP: assistant?.settings?.enableTopP ?? true,
enableMaxTokens: assistant?.settings?.enableMaxTokens ?? false, enableMaxTokens: assistant?.settings?.enableMaxTokens ?? false,
maxTokens: getAssistantMaxTokens(), maxTokens: getAssistantMaxTokens(),
streamOutput: assistant?.settings?.streamOutput ?? true, streamOutput: assistant?.settings?.streamOutput ?? true,
@ -155,11 +159,13 @@ export async function createAssistantFromAgent(agent: Agent) {
regularPhrases: agent.regularPhrases || [], // Ensured regularPhrases regularPhrases: agent.regularPhrases || [], // Ensured regularPhrases
settings: agent.settings || { settings: agent.settings || {
temperature: DEFAULT_TEMPERATURE, temperature: DEFAULT_TEMPERATURE,
enableTemperature: true,
contextCount: DEFAULT_CONTEXTCOUNT, contextCount: DEFAULT_CONTEXTCOUNT,
enableMaxTokens: false, enableMaxTokens: false,
maxTokens: 0, maxTokens: 0,
streamOutput: true, streamOutput: true,
topP: 1, topP: 1,
enableTopP: true,
toolUseMode: 'prompt', toolUseMode: 'prompt',
customParameters: [] customParameters: []
} }

View File

@ -62,11 +62,13 @@ export const EFFORT_RATIO: EffortRatio = {
} }
export type AssistantSettings = { export type AssistantSettings = {
contextCount: number maxTokens?: number
enableMaxTokens?: boolean
temperature: number temperature: number
enableTemperature?: boolean
topP: number topP: number
maxTokens: number | undefined enableTopP?: boolean
enableMaxTokens: boolean contextCount: number
streamOutput: boolean streamOutput: boolean
defaultModel?: Model defaultModel?: Model
customParameters?: AssistantSettingCustomParameters[] customParameters?: AssistantSettingCustomParameters[]