feat: custom parameters add json type

This commit is contained in:
kangfenmao 2025-01-02 13:32:42 +08:00
parent aa72794967
commit d9f7bcfc21
10 changed files with 46 additions and 132 deletions

View File

@ -599,7 +599,8 @@
"parameter_type": {
"string": "Text",
"number": "Number",
"boolean": "Boolean"
"boolean": "Boolean",
"json": "JSON"
}
},
"prompts": {

View File

@ -582,7 +582,8 @@
"parameter_type": {
"string": "テキスト",
"number": "数値",
"boolean": "真偽値"
"boolean": "真偽値",
"json": "JSON"
}
},
"prompts": {

View File

@ -599,7 +599,8 @@
"parameter_type": {
"string": "Текст",
"number": "Число",
"boolean": "Логическое"
"boolean": "Логическое",
"json": "JSON"
}
},
"prompts": {

View File

@ -588,7 +588,8 @@
"parameter_type": {
"string": "文本",
"number": "数字",
"boolean": "布尔值"
"boolean": "布尔值",
"json": "JSON"
}
},
"prompts": {

View File

@ -587,7 +587,8 @@
"parameter_type": {
"string": "文字",
"number": "數字",
"boolean": "布林值"
"boolean": "布林值",
"json": "JSON"
}
},
"prompts": {

View File

@ -1,4 +1,4 @@
import { CheckOutlined, DeleteOutlined, PlusOutlined, QuestionCircleOutlined, ReloadOutlined } from '@ant-design/icons'
import { CheckOutlined, QuestionCircleOutlined, ReloadOutlined } from '@ant-design/icons'
import { HStack } from '@renderer/components/Layout'
import Scrollbar from '@renderer/components/Scrollbar'
import {
@ -29,7 +29,7 @@ import {
setShowMessageDivider
} from '@renderer/store/settings'
import { Assistant, AssistantSettings, ThemeMode } from '@renderer/types'
import { Button, Col, Input, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd'
import { Col, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd'
import { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components'
@ -203,106 +203,6 @@ const SettingsTab: FC<Props> = (props) => {
/>
</Col>
</Row>
{assistant?.settings?.customParameters?.map((param, index) => (
<ParameterCard key={index}>
<Row align="middle" gutter={8} style={{ marginBottom: 8 }}>
<Col span={14}>
<Input
placeholder={t('models.parameter_name')}
value={param.name}
onChange={(e) => {
const newParams = [...(assistant?.settings?.customParameters || [])]
newParams[index] = { ...param, name: e.target.value }
onUpdateAssistantSettings({ customParameters: newParams })
}}
/>
</Col>
<Col span={10}>
<Select
value={param.type}
onChange={(value: 'string' | 'number' | 'boolean') => {
const newParams = [...(assistant?.settings?.customParameters || [])]
let defaultValue: any = ''
switch (value) {
case 'number':
defaultValue = 0
break
case 'boolean':
defaultValue = false
break
default:
defaultValue = ''
}
newParams[index] = { ...param, type: value, value: defaultValue }
onUpdateAssistantSettings({ customParameters: newParams })
}}
style={{ width: '100%' }}>
<Select.Option value="string">{t('models.parameter_type.string')}</Select.Option>
<Select.Option value="number">{t('models.parameter_type.number')}</Select.Option>
<Select.Option value="boolean">{t('models.parameter_type.boolean')}</Select.Option>
</Select>
</Col>
</Row>
<Row align="middle" gutter={10}>
<Col span={20}>
{param.type === 'boolean' ? (
<Switch
checked={param.value as boolean}
onChange={(checked) => {
const newParams = [...(assistant?.settings?.customParameters || [])]
newParams[index] = { ...param, value: checked }
onUpdateAssistantSettings({ customParameters: newParams })
}}
/>
) : param.type === 'number' ? (
<InputNumber
style={{ width: '100%' }}
value={param.value as number}
onChange={(value) => {
const newParams = [...(assistant?.settings?.customParameters || [])]
newParams[index] = { ...param, value: value || 0 }
onUpdateAssistantSettings({ customParameters: newParams })
}}
step={0.01}
/>
) : (
<Input
value={typeof param.value === 'string' ? param.value : JSON.stringify(param.value)}
onChange={(e) => {
const newParams = [...(assistant?.settings?.customParameters || [])]
newParams[index] = { ...param, value: e.target.value }
onUpdateAssistantSettings({ customParameters: newParams })
}}
/>
)}
</Col>
<Col span={4}>
<Button
icon={<DeleteOutlined />}
onClick={() => {
const newParams = [...(assistant?.settings?.customParameters || [])]
newParams.splice(index, 1)
onUpdateAssistantSettings({ customParameters: newParams })
}}
danger
style={{ width: '100%' }}
/>
</Col>
</Row>
</ParameterCard>
))}
<Button
icon={<PlusOutlined />}
onClick={() => {
const newParams = [
...(assistant?.settings?.customParameters || []),
{ name: '', value: '', type: 'string' as const }
]
onUpdateAssistantSettings({ customParameters: newParams })
}}
style={{ marginBottom: 0, width: '100%', borderStyle: 'dashed' }}>
{t('models.add_parameter')}
</Button>
</SettingGroup>
<SettingGroup>
<SettingSubtitle style={{ marginTop: 0 }}>{t('settings.messages.title')}</SettingSubtitle>
@ -519,15 +419,4 @@ export const SettingGroup = styled.div<{ theme?: ThemeMode }>`
background: var(--color-group-background);
`
const ParameterCard = styled.div`
margin-bottom: 8px;
padding: 8px;
border: 1px solid var(--color-border);
border-radius: 6px;
background: var(--color-background);
&:last-child {
margin-bottom: 12px;
}
`
export default SettingsTab

View File

@ -28,8 +28,8 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
const [customParameters, setCustomParameters] = useState<
Array<{
name: string
value: string | number | boolean
type: 'string' | 'number' | 'boolean'
value: string | number | boolean | object
type: 'string' | 'number' | 'boolean' | 'json'
}>
>(assistant?.settings?.customParameters ?? [])
const { t } = useTranslation()
@ -68,7 +68,7 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
const onUpdateCustomParameter = (
index: number,
field: 'name' | 'value' | 'type',
value: string | number | boolean
value: string | number | boolean | object
) => {
const newParams = [...customParameters]
if (field === 'type') {
@ -80,6 +80,9 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
case 'boolean':
defaultValue = false
break
case 'json':
defaultValue = ''
break
default:
defaultValue = ''
}
@ -113,6 +116,20 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
onChange={(checked) => onUpdateCustomParameter(index, 'value', checked)}
/>
)
case 'json':
return (
<Input
value={typeof param.value === 'string' ? param.value : JSON.stringify(param.value, null, 2)}
onChange={(e) => {
try {
const jsonValue = JSON.parse(e.target.value)
onUpdateCustomParameter(index, 'value', jsonValue)
} catch {
onUpdateCustomParameter(index, 'value', e.target.value)
}
}}
/>
)
default:
return (
<Input
@ -353,6 +370,7 @@ const AssistantModelSettings: FC<Props> = ({ assistant, updateAssistant, updateA
<Select.Option value="string">{t('models.parameter_type.string')}</Select.Option>
<Select.Option value="number">{t('models.parameter_type.number')}</Select.Option>
<Select.Option value="boolean">{t('models.parameter_type.boolean')}</Select.Option>
<Select.Option value="json">{t('models.parameter_type.json')}</Select.Option>
</Select>
</Col>
<Col span={12}>{renderParameterValueInput(param, index)}</Col>

View File

@ -25,7 +25,6 @@ const WebDavSettings: FC = () => {
webdavUser: webDAVUser,
webdavPass: webDAVPass,
webdavPath: webDAVPath,
webdavAutoSync: webDAVAutoSync,
webdavSyncInterval: webDAVSyncInterval
} = useSettings()

View File

@ -3,7 +3,7 @@ import { getOllamaKeepAliveTime } from '@renderer/hooks/useOllama'
import { getKnowledgeReferences } from '@renderer/services/KnowledgeService'
import store from '@renderer/store'
import { Assistant, Message, Model, Provider, Suggestion } from '@renderer/types'
import { delay } from '@renderer/utils'
import { delay, isJSON } from '@renderer/utils'
import OpenAI from 'openai'
import { CompletionsParams } from '.'
@ -101,13 +101,16 @@ export default abstract class BaseProvider {
protected getCustomParameters(assistant: Assistant) {
return (
assistant?.settings?.customParameters?.reduce(
(acc, param) => ({
...acc,
[param.name]: param.value
}),
{}
) || {}
assistant?.settings?.customParameters?.reduce((acc, param) => {
if (!param.name?.trim()) {
return acc
}
if (param.type === 'json') {
const value = param.value as string
return { ...acc, [param.name]: isJSON(value) ? JSON.parse(value) : value }
}
return { ...acc, [param.name]: param.value }
}, {}) || {}
)
}
}

View File

@ -32,8 +32,8 @@ export type AssistantSettings = {
autoResetModel: boolean
customParameters?: {
name: string
value: string | number | boolean
type: 'string' | 'number' | 'boolean'
value: string | number | boolean | object
type: 'string' | 'number' | 'boolean' | 'json'
}[]
}