arguments-modal.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import { Button, Col, Form, Input, Modal, Row, Spin, Tabs } from 'antd';
  2. import { useEffect, useState } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import { apiInterceptors, getArguments, saveArguments } from '@/client/api';
  5. import { IArguments, ISpace } from '@/types/knowledge';
  6. import { AlertFilled, BookOutlined, FileSearchOutlined } from '@ant-design/icons';
  7. const { TextArea } = Input;
  8. interface IProps {
  9. space: ISpace;
  10. argumentsShow: boolean;
  11. setArgumentsShow: (argumentsShow: boolean) => void;
  12. }
  13. export default function ArgumentsModal({ space, argumentsShow, setArgumentsShow }: IProps) {
  14. const { t } = useTranslation();
  15. const [newSpaceArguments, setNewSpaceArguments] = useState<IArguments | null>();
  16. const [spinning, setSpinning] = useState<boolean>(false);
  17. const fetchArguments = async () => {
  18. const [_, data] = await apiInterceptors(getArguments(space.name));
  19. setNewSpaceArguments(data);
  20. };
  21. useEffect(() => {
  22. fetchArguments();
  23. }, [space.name]);
  24. const renderEmbeddingForm = () => {
  25. return (
  26. <Row gutter={24}>
  27. <Col span={12} offset={0}>
  28. <Form.Item<IArguments>
  29. tooltip={t(`the_top_k_vectors`)}
  30. rules={[{ required: true }]}
  31. label={t('topk')}
  32. name={['embedding', 'topk']}
  33. >
  34. <Input className='mb-5 h-12' />
  35. </Form.Item>
  36. </Col>
  37. <Col span={12}>
  38. <Form.Item<IArguments>
  39. tooltip={t(`Set_a_threshold_score`)}
  40. rules={[{ required: true }]}
  41. label={t('recall_score')}
  42. name={['embedding', 'recall_score']}
  43. >
  44. <Input className='mb-5 h-12' placeholder='请输入' />
  45. </Form.Item>
  46. </Col>
  47. <Col span={12}>
  48. <Form.Item<IArguments>
  49. tooltip={t(`recall_type`)}
  50. rules={[{ required: true }]}
  51. label={t('recall_type')}
  52. name={['embedding', 'recall_type']}
  53. >
  54. <Input className='mb-5 h-12' />
  55. </Form.Item>
  56. </Col>
  57. <Col span={12}>
  58. <Form.Item<IArguments>
  59. tooltip={t(`A_model_used`)}
  60. rules={[{ required: true }]}
  61. label={t('model')}
  62. name={['embedding', 'model']}
  63. >
  64. <Input className='mb-5 h-12' />
  65. </Form.Item>
  66. </Col>
  67. <Col span={12}>
  68. <Form.Item<IArguments>
  69. tooltip={t(`The_size_of_the_data_chunks`)}
  70. rules={[{ required: true }]}
  71. label={t('chunk_size')}
  72. name={['embedding', 'chunk_size']}
  73. >
  74. <Input className='mb-5 h-12' />
  75. </Form.Item>
  76. </Col>
  77. <Col span={12}>
  78. <Form.Item<IArguments>
  79. tooltip={t(`The_amount_of_overlap`)}
  80. rules={[{ required: true }]}
  81. label={t('chunk_overlap')}
  82. name={['embedding', 'chunk_overlap']}
  83. >
  84. <Input className='mb-5 h-12' placeholder={t('Please_input_the_description')} />
  85. </Form.Item>
  86. </Col>
  87. </Row>
  88. );
  89. };
  90. const renderPromptForm = () => {
  91. return (
  92. <>
  93. <Form.Item<IArguments> tooltip={t(`A_contextual_parameter`)} label={t('scene')} name={['prompt', 'scene']}>
  94. <TextArea rows={4} className='mb-2' />
  95. </Form.Item>
  96. <Form.Item<IArguments> tooltip={t(`structure_or_format`)} label={t('template')} name={['prompt', 'template']}>
  97. <TextArea rows={7} className='mb-2' />
  98. </Form.Item>
  99. <Form.Item<IArguments>
  100. tooltip={t(`The_maximum_number_of_tokens`)}
  101. label={t('max_token')}
  102. name={['prompt', 'max_token']}
  103. >
  104. <Input className='mb-2' />
  105. </Form.Item>
  106. </>
  107. );
  108. };
  109. const renderSummary = () => {
  110. return (
  111. <>
  112. <Form.Item<IArguments>
  113. rules={[{ required: true }]}
  114. label={t('max_iteration')}
  115. name={['summary', 'max_iteration']}
  116. >
  117. <Input className='mb-2' />
  118. </Form.Item>
  119. <Form.Item<IArguments>
  120. rules={[{ required: true }]}
  121. label={t('concurrency_limit')}
  122. name={['summary', 'concurrency_limit']}
  123. >
  124. <Input className='mb-2' />
  125. </Form.Item>
  126. </>
  127. );
  128. };
  129. const items = [
  130. {
  131. key: 'Embedding',
  132. label: (
  133. <div>
  134. <FileSearchOutlined />
  135. {t('Embedding')}
  136. </div>
  137. ),
  138. children: renderEmbeddingForm(),
  139. },
  140. {
  141. key: 'Prompt',
  142. label: (
  143. <div>
  144. <AlertFilled />
  145. {t('Prompt')}
  146. </div>
  147. ),
  148. children: renderPromptForm(),
  149. },
  150. {
  151. key: 'Summary',
  152. label: (
  153. <div>
  154. <BookOutlined />
  155. {t('Summary')}
  156. </div>
  157. ),
  158. children: renderSummary(),
  159. },
  160. ];
  161. const handleSubmit = async (fieldsValue: IArguments) => {
  162. setSpinning(true);
  163. const [, , res] = await apiInterceptors(
  164. saveArguments(space.name, {
  165. argument: JSON.stringify(fieldsValue),
  166. }),
  167. );
  168. setSpinning(false);
  169. res?.success && setArgumentsShow(false);
  170. };
  171. return (
  172. <Modal
  173. width={850}
  174. open={argumentsShow}
  175. onCancel={() => {
  176. setArgumentsShow(false);
  177. }}
  178. footer={null}
  179. >
  180. <Spin spinning={spinning}>
  181. <Form
  182. size='large'
  183. className='mt-4'
  184. layout='vertical'
  185. name='basic'
  186. initialValues={{ ...newSpaceArguments }}
  187. autoComplete='off'
  188. onFinish={handleSubmit}
  189. >
  190. <Tabs items={items}></Tabs>
  191. <div className='mt-3 mb-3'>
  192. <Button htmlType='submit' type='primary' className='mr-6'>
  193. {t('Submit')}
  194. </Button>
  195. <Button
  196. onClick={() => {
  197. setArgumentsShow(false);
  198. }}
  199. >
  200. {t('close')}
  201. </Button>
  202. </div>
  203. </Form>
  204. </Spin>
  205. </Modal>
  206. );
  207. }