mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-06 21:35:52 +08:00
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:
parent
c4182a950f
commit
536aa68389
@ -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) {
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -465,7 +465,7 @@
|
|||||||
},
|
},
|
||||||
"top_p": {
|
"top_p": {
|
||||||
"label": "Top-P",
|
"label": "Top-P",
|
||||||
"tip": "默认值为 1,值越小,AI 生成的内容越单调,也越容易理解;值越大,AI 回复的词汇围越大,越多样化"
|
"tip": "默认值为 1,值越小,AI 生成的内容越单调,也越容易理解;值越大,AI 回复的词汇范围越大,越多样化"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"suggestions": {
|
"suggestions": {
|
||||||
|
|||||||
@ -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')}>
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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')}>
|
||||||
|
|||||||
@ -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: []
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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[]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user