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": { "parameter_type": {
"string": "Text", "string": "Text",
"number": "Number", "number": "Number",
"boolean": "Boolean" "boolean": "Boolean",
"json": "JSON"
} }
}, },
"prompts": { "prompts": {

View File

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

View File

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

View File

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

View File

@ -587,7 +587,8 @@
"parameter_type": { "parameter_type": {
"string": "文字", "string": "文字",
"number": "數字", "number": "數字",
"boolean": "布林值" "boolean": "布林值",
"json": "JSON"
} }
}, },
"prompts": { "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 { HStack } from '@renderer/components/Layout'
import Scrollbar from '@renderer/components/Scrollbar' import Scrollbar from '@renderer/components/Scrollbar'
import { import {
@ -29,7 +29,7 @@ import {
setShowMessageDivider setShowMessageDivider
} from '@renderer/store/settings' } from '@renderer/store/settings'
import { Assistant, AssistantSettings, ThemeMode } from '@renderer/types' 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 { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import styled from 'styled-components' import styled from 'styled-components'
@ -203,106 +203,6 @@ const SettingsTab: FC<Props> = (props) => {
/> />
</Col> </Col>
</Row> </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>
<SettingGroup> <SettingGroup>
<SettingSubtitle style={{ marginTop: 0 }}>{t('settings.messages.title')}</SettingSubtitle> <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); 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 export default SettingsTab

View File

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

View File

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

View File

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