您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. import {
  2. LlmModelType,
  3. ModelVariableType,
  4. settledModelVariableMap,
  5. } from '@/constants/knowledge';
  6. import { Flex, Form, InputNumber, Select, Slider, Switch, Tooltip } from 'antd';
  7. import camelCase from 'lodash/camelCase';
  8. import { useTranslate } from '@/hooks/common-hooks';
  9. import { useComposeLlmOptionsByModelTypes } from '@/hooks/llm-hooks';
  10. import { QuestionCircleOutlined } from '@ant-design/icons';
  11. import { useCallback, useMemo } from 'react';
  12. import styles from './index.less';
  13. interface IProps {
  14. prefix?: string;
  15. formItemLayout?: any;
  16. handleParametersChange?(value: ModelVariableType): void;
  17. }
  18. const LlmSettingItems = ({ prefix, formItemLayout = {} }: IProps) => {
  19. const form = Form.useFormInstance();
  20. const { t } = useTranslate('chat');
  21. const parameterOptions = Object.values(ModelVariableType).map((x) => ({
  22. label: t(camelCase(x)),
  23. value: x,
  24. }));
  25. const handleParametersChange = useCallback(
  26. (value: ModelVariableType) => {
  27. const variable = settledModelVariableMap[value];
  28. let nextVariable: Record<string, any> = variable;
  29. if (prefix) {
  30. nextVariable = { [prefix]: variable };
  31. }
  32. form.setFieldsValue(nextVariable);
  33. },
  34. [form, prefix],
  35. );
  36. const memorizedPrefix = useMemo(() => (prefix ? [prefix] : []), [prefix]);
  37. const modelOptions = useComposeLlmOptionsByModelTypes([
  38. LlmModelType.Chat,
  39. LlmModelType.Image2text,
  40. ]);
  41. return (
  42. <>
  43. <Form.Item
  44. label={t('model')}
  45. name="llm_id"
  46. tooltip={t('modelTip')}
  47. {...formItemLayout}
  48. rules={[{ required: true, message: t('modelMessage') }]}
  49. >
  50. <Select options={modelOptions} showSearch />
  51. </Form.Item>
  52. <div className="border rounded-md">
  53. <div className="flex justify-between bg-slate-100 p-2 mb-2">
  54. <div className="space-x-1 items-center">
  55. <span className="text-lg font-semibold">{t('freedom')}</span>
  56. <Tooltip title={t('freedomTip')}>
  57. <QuestionCircleOutlined></QuestionCircleOutlined>
  58. </Tooltip>
  59. </div>
  60. <div className="w-1/4 min-w-32">
  61. <Form.Item
  62. label={t('freedom')}
  63. name="parameter"
  64. tooltip={t('freedomTip')}
  65. initialValue={ModelVariableType.Precise}
  66. labelCol={{ span: 0 }}
  67. wrapperCol={{ span: 24 }}
  68. className="m-0"
  69. >
  70. <Select<ModelVariableType>
  71. options={parameterOptions}
  72. onChange={handleParametersChange}
  73. />
  74. </Form.Item>
  75. </div>
  76. </div>
  77. <div className="pr-2">
  78. <Form.Item
  79. label={t('temperature')}
  80. tooltip={t('temperatureTip')}
  81. {...formItemLayout}
  82. >
  83. <Flex gap={20} align="center">
  84. <Form.Item
  85. name={'temperatureEnabled'}
  86. valuePropName="checked"
  87. noStyle
  88. >
  89. <Switch size="small" />
  90. </Form.Item>
  91. <Form.Item noStyle dependencies={['temperatureEnabled']}>
  92. {({ getFieldValue }) => {
  93. const disabled = !getFieldValue('temperatureEnabled');
  94. return (
  95. <>
  96. <Flex flex={1}>
  97. <Form.Item
  98. name={[...memorizedPrefix, 'temperature']}
  99. noStyle
  100. >
  101. <Slider
  102. className={styles.variableSlider}
  103. max={1}
  104. step={0.01}
  105. disabled={disabled}
  106. />
  107. </Form.Item>
  108. </Flex>
  109. <Form.Item
  110. name={[...memorizedPrefix, 'temperature']}
  111. noStyle
  112. >
  113. <InputNumber
  114. className={styles.sliderInputNumber}
  115. max={1}
  116. min={0}
  117. step={0.01}
  118. disabled={disabled}
  119. />
  120. </Form.Item>
  121. </>
  122. );
  123. }}
  124. </Form.Item>
  125. </Flex>
  126. </Form.Item>
  127. <Form.Item
  128. label={t('topP')}
  129. tooltip={t('topPTip')}
  130. {...formItemLayout}
  131. >
  132. <Flex gap={20} align="center">
  133. <Form.Item name={'topPEnabled'} valuePropName="checked" noStyle>
  134. <Switch size="small" />
  135. </Form.Item>
  136. <Form.Item noStyle dependencies={['topPEnabled']}>
  137. {({ getFieldValue }) => {
  138. const disabled = !getFieldValue('topPEnabled');
  139. return (
  140. <>
  141. <Flex flex={1}>
  142. <Form.Item name={[...memorizedPrefix, 'top_p']} noStyle>
  143. <Slider
  144. className={styles.variableSlider}
  145. max={1}
  146. step={0.01}
  147. disabled={disabled}
  148. />
  149. </Form.Item>
  150. </Flex>
  151. <Form.Item name={[...memorizedPrefix, 'top_p']} noStyle>
  152. <InputNumber
  153. className={styles.sliderInputNumber}
  154. max={1}
  155. min={0}
  156. step={0.01}
  157. disabled={disabled}
  158. />
  159. </Form.Item>
  160. </>
  161. );
  162. }}
  163. </Form.Item>
  164. </Flex>
  165. </Form.Item>
  166. <Form.Item
  167. label={t('presencePenalty')}
  168. tooltip={t('presencePenaltyTip')}
  169. {...formItemLayout}
  170. >
  171. <Flex gap={20} align="center">
  172. <Form.Item
  173. name={'presencePenaltyEnabled'}
  174. valuePropName="checked"
  175. noStyle
  176. >
  177. <Switch size="small" />
  178. </Form.Item>
  179. <Form.Item noStyle dependencies={['presencePenaltyEnabled']}>
  180. {({ getFieldValue }) => {
  181. const disabled = !getFieldValue('presencePenaltyEnabled');
  182. return (
  183. <>
  184. <Flex flex={1}>
  185. <Form.Item
  186. name={[...memorizedPrefix, 'presence_penalty']}
  187. noStyle
  188. >
  189. <Slider
  190. className={styles.variableSlider}
  191. max={1}
  192. step={0.01}
  193. disabled={disabled}
  194. />
  195. </Form.Item>
  196. </Flex>
  197. <Form.Item
  198. name={[...memorizedPrefix, 'presence_penalty']}
  199. noStyle
  200. >
  201. <InputNumber
  202. className={styles.sliderInputNumber}
  203. max={1}
  204. min={0}
  205. step={0.01}
  206. disabled={disabled}
  207. />
  208. </Form.Item>
  209. </>
  210. );
  211. }}
  212. </Form.Item>
  213. </Flex>
  214. </Form.Item>
  215. <Form.Item
  216. label={t('frequencyPenalty')}
  217. tooltip={t('frequencyPenaltyTip')}
  218. {...formItemLayout}
  219. >
  220. <Flex gap={20} align="center">
  221. <Form.Item
  222. name={'frequencyPenaltyEnabled'}
  223. valuePropName="checked"
  224. noStyle
  225. >
  226. <Switch size="small" />
  227. </Form.Item>
  228. <Form.Item noStyle dependencies={['frequencyPenaltyEnabled']}>
  229. {({ getFieldValue }) => {
  230. const disabled = !getFieldValue('frequencyPenaltyEnabled');
  231. return (
  232. <>
  233. <Flex flex={1}>
  234. <Form.Item
  235. name={[...memorizedPrefix, 'frequency_penalty']}
  236. noStyle
  237. >
  238. <Slider
  239. className={styles.variableSlider}
  240. max={1}
  241. step={0.01}
  242. disabled={disabled}
  243. />
  244. </Form.Item>
  245. </Flex>
  246. <Form.Item
  247. name={[...memorizedPrefix, 'frequency_penalty']}
  248. noStyle
  249. >
  250. <InputNumber
  251. className={styles.sliderInputNumber}
  252. max={1}
  253. min={0}
  254. step={0.01}
  255. disabled={disabled}
  256. />
  257. </Form.Item>
  258. </>
  259. );
  260. }}
  261. </Form.Item>
  262. </Flex>
  263. </Form.Item>
  264. <Form.Item
  265. label={t('maxTokens')}
  266. tooltip={t('maxTokensTip')}
  267. {...formItemLayout}
  268. >
  269. <Flex gap={20} align="center">
  270. <Form.Item
  271. name={'maxTokensEnabled'}
  272. valuePropName="checked"
  273. noStyle
  274. >
  275. <Switch size="small" />
  276. </Form.Item>
  277. <Form.Item noStyle dependencies={['maxTokensEnabled']}>
  278. {({ getFieldValue }) => {
  279. const disabled = !getFieldValue('maxTokensEnabled');
  280. return (
  281. <>
  282. <Flex flex={1}>
  283. <Form.Item
  284. name={[...memorizedPrefix, 'max_tokens']}
  285. noStyle
  286. >
  287. <Slider
  288. className={styles.variableSlider}
  289. max={128000}
  290. disabled={disabled}
  291. />
  292. </Form.Item>
  293. </Flex>
  294. <Form.Item
  295. name={[...memorizedPrefix, 'max_tokens']}
  296. noStyle
  297. >
  298. <InputNumber
  299. disabled={disabled}
  300. className={styles.sliderInputNumber}
  301. max={128000}
  302. min={0}
  303. />
  304. </Form.Item>
  305. </>
  306. );
  307. }}
  308. </Form.Item>
  309. </Flex>
  310. </Form.Item>
  311. </div>
  312. </div>
  313. </>
  314. );
  315. };
  316. export default LlmSettingItems;