Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

model-setting.tsx 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. import {
  2. LlmModelType,
  3. ModelVariableType,
  4. settledModelVariableMap,
  5. } from '@/constants/knowledge';
  6. import { Divider, Flex, Form, InputNumber, Select, Slider, Switch } from 'antd';
  7. import classNames from 'classnames';
  8. import camelCase from 'lodash/camelCase';
  9. import { useEffect } from 'react';
  10. import { ISegmentedContentProps } from '../interface';
  11. import { useTranslate } from '@/hooks/commonHooks';
  12. import { useFetchLlmList, useSelectLlmOptions } from '@/hooks/llmHooks';
  13. import { Variable } from '@/interfaces/database/chat';
  14. import { variableEnabledFieldMap } from '../constants';
  15. import styles from './index.less';
  16. const ModelSetting = ({
  17. show,
  18. form,
  19. initialLlmSetting,
  20. visible,
  21. }: ISegmentedContentProps & {
  22. initialLlmSetting?: Variable;
  23. visible?: boolean;
  24. }) => {
  25. const { t } = useTranslate('chat');
  26. const parameterOptions = Object.values(ModelVariableType).map((x) => ({
  27. label: t(camelCase(x)),
  28. value: x,
  29. }));
  30. const modelOptions = useSelectLlmOptions();
  31. const handleParametersChange = (value: ModelVariableType) => {
  32. const variable = settledModelVariableMap[value];
  33. form.setFieldsValue({ llm_setting: variable });
  34. };
  35. useEffect(() => {
  36. if (visible) {
  37. const values = Object.keys(variableEnabledFieldMap).reduce<
  38. Record<string, boolean>
  39. >((pre, field) => {
  40. pre[field] =
  41. initialLlmSetting === undefined
  42. ? true
  43. : !!initialLlmSetting[
  44. variableEnabledFieldMap[
  45. field as keyof typeof variableEnabledFieldMap
  46. ] as keyof Variable
  47. ];
  48. return pre;
  49. }, {});
  50. form.setFieldsValue(values);
  51. }
  52. }, [form, initialLlmSetting, visible]);
  53. useFetchLlmList(LlmModelType.Chat);
  54. return (
  55. <section
  56. className={classNames({
  57. [styles.segmentedHidden]: !show,
  58. })}
  59. >
  60. <Form.Item
  61. label={t('model')}
  62. name="llm_id"
  63. tooltip={t('modelTip')}
  64. rules={[{ required: true, message: t('modelMessage') }]}
  65. >
  66. <Select options={modelOptions} showSearch />
  67. </Form.Item>
  68. <Divider></Divider>
  69. <Form.Item
  70. label={t('freedom')}
  71. name="parameters"
  72. tooltip={t('freedomTip')}
  73. initialValue={ModelVariableType.Precise}
  74. >
  75. <Select<ModelVariableType>
  76. options={parameterOptions}
  77. onChange={handleParametersChange}
  78. />
  79. </Form.Item>
  80. <Form.Item label={t('temperature')} tooltip={t('temperatureTip')}>
  81. <Flex gap={20} align="center">
  82. <Form.Item
  83. name={'temperatureEnabled'}
  84. valuePropName="checked"
  85. noStyle
  86. >
  87. <Switch size="small" />
  88. </Form.Item>
  89. <Form.Item noStyle dependencies={['temperatureEnabled']}>
  90. {({ getFieldValue }) => {
  91. const disabled = !getFieldValue('temperatureEnabled');
  92. return (
  93. <>
  94. <Flex flex={1}>
  95. <Form.Item name={['llm_setting', 'temperature']} noStyle>
  96. <Slider
  97. className={styles.variableSlider}
  98. max={1}
  99. step={0.01}
  100. disabled={disabled}
  101. />
  102. </Form.Item>
  103. </Flex>
  104. <Form.Item name={['llm_setting', 'temperature']} noStyle>
  105. <InputNumber
  106. className={styles.sliderInputNumber}
  107. max={1}
  108. min={0}
  109. step={0.01}
  110. disabled={disabled}
  111. />
  112. </Form.Item>
  113. </>
  114. );
  115. }}
  116. </Form.Item>
  117. </Flex>
  118. </Form.Item>
  119. <Form.Item label={t('topP')} tooltip={t('topPTip')}>
  120. <Flex gap={20} align="center">
  121. <Form.Item name={'topPEnabled'} valuePropName="checked" noStyle>
  122. <Switch size="small" />
  123. </Form.Item>
  124. <Form.Item noStyle dependencies={['topPEnabled']}>
  125. {({ getFieldValue }) => {
  126. const disabled = !getFieldValue('topPEnabled');
  127. return (
  128. <>
  129. <Flex flex={1}>
  130. <Form.Item name={['llm_setting', 'top_p']} noStyle>
  131. <Slider
  132. className={styles.variableSlider}
  133. max={1}
  134. step={0.01}
  135. disabled={disabled}
  136. />
  137. </Form.Item>
  138. </Flex>
  139. <Form.Item name={['llm_setting', 'top_p']} noStyle>
  140. <InputNumber
  141. className={styles.sliderInputNumber}
  142. max={1}
  143. min={0}
  144. step={0.01}
  145. disabled={disabled}
  146. />
  147. </Form.Item>
  148. </>
  149. );
  150. }}
  151. </Form.Item>
  152. </Flex>
  153. </Form.Item>
  154. <Form.Item label={t('presencePenalty')} tooltip={t('presencePenaltyTip')}>
  155. <Flex gap={20} align="center">
  156. <Form.Item
  157. name={'presencePenaltyEnabled'}
  158. valuePropName="checked"
  159. noStyle
  160. >
  161. <Switch size="small" />
  162. </Form.Item>
  163. <Form.Item noStyle dependencies={['presencePenaltyEnabled']}>
  164. {({ getFieldValue }) => {
  165. const disabled = !getFieldValue('presencePenaltyEnabled');
  166. return (
  167. <>
  168. <Flex flex={1}>
  169. <Form.Item
  170. name={['llm_setting', 'presence_penalty']}
  171. noStyle
  172. >
  173. <Slider
  174. className={styles.variableSlider}
  175. max={1}
  176. step={0.01}
  177. disabled={disabled}
  178. />
  179. </Form.Item>
  180. </Flex>
  181. <Form.Item name={['llm_setting', 'presence_penalty']} noStyle>
  182. <InputNumber
  183. className={styles.sliderInputNumber}
  184. max={1}
  185. min={0}
  186. step={0.01}
  187. disabled={disabled}
  188. />
  189. </Form.Item>
  190. </>
  191. );
  192. }}
  193. </Form.Item>
  194. </Flex>
  195. </Form.Item>
  196. <Form.Item
  197. label={t('frequencyPenalty')}
  198. tooltip={t('frequencyPenaltyTip')}
  199. >
  200. <Flex gap={20} align="center">
  201. <Form.Item
  202. name={'frequencyPenaltyEnabled'}
  203. valuePropName="checked"
  204. noStyle
  205. >
  206. <Switch size="small" />
  207. </Form.Item>
  208. <Form.Item noStyle dependencies={['frequencyPenaltyEnabled']}>
  209. {({ getFieldValue }) => {
  210. const disabled = !getFieldValue('frequencyPenaltyEnabled');
  211. return (
  212. <>
  213. <Flex flex={1}>
  214. <Form.Item
  215. name={['llm_setting', 'frequency_penalty']}
  216. noStyle
  217. >
  218. <Slider
  219. className={styles.variableSlider}
  220. max={1}
  221. step={0.01}
  222. disabled={disabled}
  223. />
  224. </Form.Item>
  225. </Flex>
  226. <Form.Item
  227. name={['llm_setting', 'frequency_penalty']}
  228. noStyle
  229. >
  230. <InputNumber
  231. className={styles.sliderInputNumber}
  232. max={1}
  233. min={0}
  234. step={0.01}
  235. disabled={disabled}
  236. />
  237. </Form.Item>
  238. </>
  239. );
  240. }}
  241. </Form.Item>
  242. </Flex>
  243. </Form.Item>
  244. <Form.Item label={t('maxTokens')} tooltip={t('maxTokensTip')}>
  245. <Flex gap={20} align="center">
  246. <Form.Item name={'maxTokensEnabled'} valuePropName="checked" noStyle>
  247. <Switch size="small" />
  248. </Form.Item>
  249. <Form.Item noStyle dependencies={['maxTokensEnabled']}>
  250. {({ getFieldValue }) => {
  251. const disabled = !getFieldValue('maxTokensEnabled');
  252. return (
  253. <>
  254. <Flex flex={1}>
  255. <Form.Item name={['llm_setting', 'max_tokens']} noStyle>
  256. <Slider
  257. className={styles.variableSlider}
  258. max={2048}
  259. disabled={disabled}
  260. />
  261. </Form.Item>
  262. </Flex>
  263. <Form.Item name={['llm_setting', 'max_tokens']} noStyle>
  264. <InputNumber
  265. disabled={disabled}
  266. className={styles.sliderInputNumber}
  267. max={2048}
  268. min={0}
  269. />
  270. </Form.Item>
  271. </>
  272. );
  273. }}
  274. </Form.Item>
  275. </Flex>
  276. </Form.Item>
  277. </section>
  278. );
  279. };
  280. export default ModelSetting;