@gientech/modual 1.2.8 → 1.2.9-fix

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +593 -79
  2. package/USAGE.md +56 -0
  3. package/dist/README.md +593 -79
  4. package/dist/assets/GientechStreamReader-C21-q_Qv.js +449 -0
  5. package/dist/assets/chevron-down-DjLtKwcs.js +280 -0
  6. package/dist/assets/databse.svg +6 -0
  7. package/dist/assets/graph.svg +4 -0
  8. package/dist/assets/homeBg.png +0 -0
  9. package/dist/assets/index-BMz4lcjQ.js +1 -0
  10. package/dist/assets/index-C3Viu8Oj.js +1 -0
  11. package/dist/assets/index-C9GlPyHu.js +13 -0
  12. package/dist/assets/index-CRbX3ZA1.js +1 -0
  13. package/dist/assets/index-CTwzi_v2.js +21 -0
  14. package/dist/assets/index-DQlLDleQ.js +11 -0
  15. package/dist/assets/index-DRU1P9R0.js +1150 -0
  16. package/dist/assets/index-Dqej68NT.js +585 -0
  17. package/dist/assets/index-ECprhahs.js +157 -0
  18. package/dist/assets/index-i7qcZOwY.js +1088 -0
  19. package/dist/assets/knowledge.svg +4 -0
  20. package/dist/assets/left.jpg +0 -0
  21. package/dist/assets/logoImg.png +0 -0
  22. package/dist/assets/{plus-omCUN0e3.js → plus-CvJRSbOe.js} +1 -1
  23. package/dist/assets/sensitive.svg +5 -0
  24. package/dist/assets/style.css +1 -1
  25. package/dist/assets/style3.css +1 -1
  26. package/dist/assets/worker-BbpylX7l.js +13 -0
  27. package/dist/assets/{x-vPcWt3fC.js → x-DKPeLdlu.js} +1 -1
  28. package/dist/assistantConfig.d.ts +31 -0
  29. package/dist/assistantConfig.js +1 -0
  30. package/dist/chat.d.ts +25 -1
  31. package/dist/chat.js +563 -369
  32. package/dist/database.js +2 -2
  33. package/dist/databaseId.js +1 -11
  34. package/dist/databaseTable.js +2 -2
  35. package/dist/index.d.ts +85 -0
  36. package/dist/index.js +1 -0
  37. package/dist/modelManage.js +1 -1
  38. package/dist/package.json +13 -1
  39. package/dist/sensitive.js +1 -1
  40. package/dist/streamFilesReader.d.ts +3 -0
  41. package/dist/streamFilesReader.js +1 -442
  42. package/doc_assets//346/226/271/346/241/210//344/274/230/345/214/226/346/226/271/346/241/210-/345/244/232/344/274/232/350/257/235SSE/350/277/236/346/216/245/347/256/241/347/220/206.md +504 -0
  43. package/package.json +125 -99
  44. package/package.json.demo-backup +109 -0
  45. package/scripts/README.md +133 -133
  46. package/scripts/build-demo.js +88 -88
  47. package/scripts/demo-selector.js +216 -216
  48. package/scripts/preview-demo.js +130 -130
  49. package/scripts/run-demo.bat +34 -34
  50. package/src/assets/img/close.png +0 -0
  51. package/src/assets/img/database.png +0 -0
  52. package/src/assets/img/downLoad.png +0 -0
  53. package/src/assets/img/graphIcon.png +0 -0
  54. package/src/assets/img/pdf.png +0 -0
  55. package/src/assets/img/singleQa.png +0 -0
  56. package/src/assets/img/webSearch.png +0 -0
  57. package/src/examples/ConversationAssistantPage/index.tsx +37 -0
  58. package/src/examples/Demo/index.tsx +12 -0
  59. package/src/examples/chat/components/DrawerGraphPreview.tsx +78 -0
  60. package/src/examples/chat/index.tsx +112 -99
  61. package/src/examples/chat/logo03.png +0 -0
  62. package/src/examples/gientechStreamFilesReader/index.tsx +4 -69
  63. package/src/lib_enter.ts +11 -6
  64. package/src/modules/assistantConfig/assets/databse.svg +6 -0
  65. package/src/modules/assistantConfig/assets/empty.png +0 -0
  66. package/src/modules/assistantConfig/assets/graph.svg +4 -0
  67. package/src/modules/assistantConfig/assets/knowledge.svg +4 -0
  68. package/src/modules/assistantConfig/assets/sensitive.svg +5 -0
  69. package/src/modules/assistantConfig/components/Database.tsx +144 -0
  70. package/src/modules/assistantConfig/components/Graph.tsx +156 -0
  71. package/src/modules/assistantConfig/components/Knowledge.tsx +266 -0
  72. package/src/modules/assistantConfig/components/NotFoundContent.tsx +21 -0
  73. package/src/modules/assistantConfig/components/Paragraph.tsx +51 -0
  74. package/src/modules/assistantConfig/components/ParamsItem.tsx +39 -0
  75. package/src/modules/assistantConfig/components/ResourceBinderItem.tsx +132 -0
  76. package/src/modules/assistantConfig/components/SearchableSelector.tsx +500 -0
  77. package/src/modules/assistantConfig/components/Sensitive.tsx +179 -0
  78. package/src/modules/assistantConfig/components/SliderInput.tsx +65 -0
  79. package/src/modules/assistantConfig/constants.tsx +74 -0
  80. package/src/modules/assistantConfig/index.tsx +700 -0
  81. package/src/modules/assistantConfig/server.ts +262 -0
  82. package/src/modules/chat/Conversations/List.tsx +76 -9
  83. package/src/modules/chat/Conversations/index.tsx +37 -19
  84. package/src/modules/chat/ReferenceBar.tsx +592 -0
  85. package/src/modules/chat/constants.tsx +29 -6
  86. package/src/modules/chat/data.txt +82 -0
  87. package/src/modules/chat/index.tsx +357 -113
  88. package/src/modules/chat/referenceCom/DeleteModal.tsx +75 -0
  89. package/src/modules/chat/referenceCom/DrawerContent.tsx +136 -0
  90. package/src/modules/chat/referenceCom/DrawerDatabase.tsx +110 -0
  91. package/src/modules/chat/referenceCom/DrawerGraphPreview.tsx +86 -0
  92. package/src/modules/chat/referenceCom/DrawerPreview.tsx +73 -0
  93. package/src/modules/chat/referenceCom/DrawerTitle.tsx +26 -0
  94. package/src/modules/chat/referenceCom/RenameModal.tsx +86 -0
  95. package/src/modules/chat/referenceCom/TagCom.tsx +30 -0
  96. package/src/modules/chat/style.less +3 -0
  97. package/src/modules/chat/utils/index.ts +326 -0
  98. package/src/modules/database/CreateModal.tsx +1 -1
  99. package/src/modules/headlessChat/index.tsx +1 -3
  100. package/src/modules/nodegraph/index.tsx +1 -0
  101. package/src/modules/search/components/ResultContent.tsx +2 -2
  102. package/src/modules/streamFilesReader/GientechStreamReader.tsx +436 -367
  103. package/src/modules/streamFilesReader/index.tsx +1 -1
  104. package/src/utils/gientechCommon/components/AppLoading.tsx +10 -10
  105. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +312 -27
  106. package/src/utils/gientechCommon/hooks/AichatUseController.tsx +84 -6
  107. package/src/utils/testconfigs/index.ts +7 -1
  108. package/stats.html +1 -1
  109. package/vite.config.ts +69 -20
  110. package/dist/assets/_commonjsHelpers-gnU0ypJ3.js +0 -1
  111. package/dist/assets/circle-alert-g2Y6zAjt.js +0 -6
  112. package/dist/assets/index-97TKgPKE.js +0 -1284
  113. package/dist/assets/index-CEK88UzR.js +0 -26
  114. package/dist/assets/index-DIm7RgkM.js +0 -1709
  115. package/dist/assets/styled-components.browser.esm-DPkS13KC.js +0 -2
@@ -0,0 +1,700 @@
1
+ import React, { useState, useMemo, useEffect, useRef } from 'react';
2
+ import { Form, Input, Select, Checkbox, Switch, Row, Col, message, Button } from 'antd';
3
+ import { ArrowLeft } from 'lucide-react';
4
+ import Paragraph from './components/Paragraph';
5
+ import NotFoundContent from './components/NotFoundContent';
6
+ import { Styles } from '@mxmweb/zui';
7
+ import { CustomComponents } from '@mxmweb/xviewer';
8
+ import {
9
+ EXPLANATION_PROMPT,
10
+ EXPLANATION_DEPENDON_KB,
11
+ DEFAULT_PROMPT,
12
+ SearchPolicyOptions,
13
+ ASSISTANT_MIN_MAX,
14
+ ASSISTANT_DEFAULT,
15
+ TraceabilityStrategy,
16
+ } from './constants';
17
+ import AxiosInstance from './server';
18
+ import SensitiveSection from './components/Sensitive';
19
+ import KnowledgeSection from './components/Knowledge';
20
+ import DatabaseSection from './components/Database';
21
+ import GraphSection from './components/Graph';
22
+ import ParamsItem from './components/ParamsItem';
23
+
24
+ import '@mxmweb/zui/style.css';
25
+
26
+ const { Item } = Form;
27
+
28
+ interface ConversationAssistantProps {
29
+ url?: string;
30
+ token?: string;
31
+ role?: string;
32
+ id?: string;
33
+ showDatabase: boolean;
34
+ showGraph: boolean;
35
+ isShare?: boolean;
36
+ styles?: Styles;
37
+ disabled?: boolean;
38
+ CustomComponents?: CustomComponents;
39
+ eventsEmit?: (name: string, data?: any) => void;
40
+ }
41
+
42
+ const ConversationAssistant: React.FC<ConversationAssistantProps> = ({
43
+ url,
44
+ token,
45
+ role,
46
+ id,
47
+ showDatabase = true,
48
+ showGraph,
49
+ isShare,
50
+ disabled, //查看时,不可修改
51
+ eventsEmit,
52
+ CustomComponents,
53
+ }) => {
54
+ const { ContentLoading } = CustomComponents;
55
+ const [form] = Form.useForm();
56
+ const [configData, setConfigData]: any = useState();
57
+ const [modelList, setModelList]: any = useState();
58
+ const [rerankOptions, setRerankOptions]: any = useState();
59
+ const [multiModelOptions, setMultiModalOptions]: any = useState();
60
+ const [loading, setLoading] = useState(true);
61
+ const [btnLoading, seBtntLoading] = useState(false);
62
+ const [configScale, setConfigScale] = useState(ASSISTANT_MIN_MAX);
63
+
64
+ const resourceBindData = useRef<{
65
+ knowledge_base_name?: string;
66
+ knowledge_base_name_source?: string;
67
+ selectedKnowledgeBase?: any[];
68
+ sensitiveWordIds?: string;
69
+ database_name?: any[];
70
+ graph_nb_name?: any[];
71
+ }>({});
72
+
73
+ const {
74
+ getConfigById,
75
+ fetchModels,
76
+ fetchConfigItemLimit,
77
+ checkName,
78
+ addConversationAssistant,
79
+ updateConversationAssistant,
80
+ fetchSensitiveLibrary,
81
+ } = AxiosInstance({
82
+ url,
83
+ token,
84
+ role,
85
+ eventsEmit,
86
+ });
87
+
88
+ useEffect(() => {
89
+ init();
90
+ }, [id]);
91
+
92
+ useEffect(() => {
93
+ if (id) {
94
+ //编辑的话,只有模型列表返回为空才需要校验
95
+ if (Array.isArray(modelList) && Array.isArray(rerankOptions)) {
96
+ form.validateFields([
97
+ 'model_name',
98
+ 'plan_model_name',
99
+ 'recommend_model_name',
100
+ 'rerank_model_name',
101
+ 'multi_model_name',
102
+ ]);
103
+ }
104
+ if (Array.isArray(multiModelOptions)) {
105
+ form.validateFields(['multi_model_name']);
106
+ }
107
+ } else {
108
+ //新增的话,只有模型列表返回为空才需要校验
109
+ if (Array.isArray(modelList) && modelList?.length == 0) {
110
+ form.validateFields(['model_name', 'plan_model_name', 'recommend_model_name']);
111
+ }
112
+
113
+ if (Array.isArray(rerankOptions) && rerankOptions?.length == 0) {
114
+ form.validateFields(['rerank_model_name']);
115
+ }
116
+ if (Array.isArray(multiModelOptions) && multiModelOptions?.length == 0) {
117
+ form.validateFields(['multi_model_name']);
118
+ }
119
+ }
120
+ }, [rerankOptions, modelList, multiModelOptions, id]);
121
+
122
+ // 初始化数据
123
+ const init = async () => {
124
+ let _configData;
125
+ if (id) {
126
+ if (!loading) setLoading(true);
127
+ try {
128
+ const res = await getConfigById(id);
129
+ if (res) {
130
+ const { configJson, ...rest } = res;
131
+ const config = configJson && JSON.parse(configJson);
132
+ const {
133
+ knowledge_base_name,
134
+ knowledge_base_name_source,
135
+ selectedKnowledgeBase,
136
+ sensitiveWordIds,
137
+ database_name,
138
+ graph_nb_name,
139
+ } = config;
140
+ _configData = {
141
+ ...rest,
142
+ ...config,
143
+ };
144
+
145
+ resourceBindData.current = {
146
+ knowledge_base_name,
147
+ knowledge_base_name_source,
148
+ selectedKnowledgeBase,
149
+ sensitiveWordIds,
150
+ database_name,
151
+ graph_nb_name,
152
+ };
153
+
154
+ setConfigData(_configData);
155
+ form.setFieldsValue(_configData);
156
+ setLoading(false);
157
+ }
158
+ } catch (e) {}
159
+ } else {
160
+ setLoading(false);
161
+ }
162
+
163
+ await fetchList(_configData);
164
+ };
165
+
166
+ const fetchList = async (configData?: any) => {
167
+ try {
168
+ const [modelRes, recallModelRes, multiModelRes, configItemLimitRes] =
169
+ await Promise.allSettled([
170
+ fetchModels({
171
+ pageNum: 1,
172
+ pageSize: 9999,
173
+ status: 1,
174
+ type: 1,
175
+ }),
176
+ fetchModels({
177
+ pageNum: 1,
178
+ pageSize: 9999,
179
+ status: 1,
180
+ type: 3,
181
+ }),
182
+ fetchModels({
183
+ pageNum: 1,
184
+ pageSize: 9999,
185
+ status: 1,
186
+ type: 4,
187
+ }),
188
+ fetchConfigItemLimit(),
189
+ ]);
190
+ if (modelRes.status === 'fulfilled' && modelRes.value) {
191
+ const list = modelRes.value?.records || [];
192
+ const options = list.map((item: any) => ({
193
+ ...item,
194
+ label: item.modelName,
195
+ value: item.modelName,
196
+ }));
197
+ setModelList(options);
198
+ }
199
+
200
+ if (recallModelRes.status === 'fulfilled' && recallModelRes.value) {
201
+ const options = (recallModelRes.value?.records || []).map((item: any) => ({
202
+ label: item.modelName || item.name,
203
+ value: item.modelName || item.name,
204
+ }));
205
+ setRerankOptions(options);
206
+ if (options.length > 0) {
207
+ !configData?.rerank_model_name &&
208
+ form.setFieldsValue({ rerank_model_name: options[0].value });
209
+ }
210
+ }
211
+ if (multiModelRes.status === 'fulfilled' && multiModelRes.value) {
212
+ const options = (multiModelRes.value?.records || []).map((item: any) => ({
213
+ label: item.modelName || item.name,
214
+ value: item.modelName || item.name,
215
+ }));
216
+ setMultiModalOptions(options);
217
+ if (options.length > 0) {
218
+ !configData?.multi_model_name &&
219
+ form.setFieldsValue({ multi_model_name: options[0].value });
220
+ }
221
+ }
222
+ if (configItemLimitRes.status === 'fulfilled' && configItemLimitRes.value) {
223
+ if (configItemLimitRes.value) {
224
+ const config = configItemLimitRes.value;
225
+
226
+ Object.keys(ASSISTANT_MIN_MAX).forEach(key => {
227
+ if (config.hasOwnProperty(key)) {
228
+ const { max, min } = config[key];
229
+ ASSISTANT_MIN_MAX[key] = {
230
+ ...ASSISTANT_MIN_MAX[key],
231
+ min,
232
+ max,
233
+ };
234
+ }
235
+ });
236
+ setConfigScale(ASSISTANT_MIN_MAX);
237
+ }
238
+ }
239
+ } catch (e) {
240
+ console.error('获取列表失败:', e);
241
+ }
242
+ };
243
+
244
+ const checkConfigName = async (_, value: any) => {
245
+ const res = await checkName(value, id);
246
+ if (res) {
247
+ message.warning('名称重复!', 2);
248
+ return Promise.reject('名称重复');
249
+ }
250
+ return Promise.resolve();
251
+ };
252
+
253
+ const validateModel = (options: any[], msg: string) => ({
254
+ validator(_: any, value: any) {
255
+ if (!value) {
256
+ if (Array.isArray(options) && options.length === 0) {
257
+ return Promise.reject('暂无可用模型,请联系管理员');
258
+ } else {
259
+ return Promise.reject(msg);
260
+ }
261
+ }
262
+ if (
263
+ (Array.isArray(options) && options.length === 0) ||
264
+ !options.find((m: any) => m.value == value)
265
+ ) {
266
+ return Promise.reject('模型无法使用,请联系管理员');
267
+ }
268
+ return Promise.resolve();
269
+ },
270
+ });
271
+
272
+ const handleEventsEmit = (name: string, data?: any) => {
273
+ console.log('++++助手配置', name, data);
274
+ switch (name) {
275
+ case 'knowledge_selected':
276
+ resourceBindData.current = {
277
+ ...resourceBindData.current,
278
+ ...data,
279
+ };
280
+ break;
281
+ case 'sensitive_selected':
282
+ resourceBindData.current = {
283
+ ...resourceBindData.current,
284
+ sensitiveWordIds: data,
285
+ };
286
+ break;
287
+ case 'database_selected':
288
+ resourceBindData.current = {
289
+ ...resourceBindData.current,
290
+ database_name: data,
291
+ };
292
+ break;
293
+ case 'graph_selected':
294
+ resourceBindData.current = {
295
+ ...resourceBindData.current,
296
+ graph_nb_name: data,
297
+ };
298
+ break;
299
+ }
300
+ };
301
+
302
+ const handleSubmit = async () => {
303
+ let params = {};
304
+ try {
305
+ seBtntLoading(true);
306
+ const data = await form.validateFields();
307
+ const {
308
+ knowledge_base_name,
309
+ knowledge_base_name_source,
310
+ selectedKnowledgeBase,
311
+ sensitiveWordIds,
312
+ database_name,
313
+ graph_nb_name,
314
+ } = resourceBindData.current;
315
+ data.thinking =
316
+ (modelList.find((item: any) => item.modelName == data.config_name) as any)?.thinking ||
317
+ false;
318
+
319
+ const configJson = JSON.stringify({
320
+ ...data,
321
+ knowledge_base_name,
322
+ knowledge_base_name_source,
323
+ selectedKnowledgeBase,
324
+ sensitiveWordIds,
325
+ ...(showDatabase ? { database_name } : {}),
326
+ ...(showGraph ? { graph_nb_name } : {}),
327
+ });
328
+
329
+ params = {
330
+ configJson,
331
+ name: data.config_name,
332
+ isDefault: data.isDefault,
333
+ defaultAnswer: data.defaultAnswer,
334
+ dependOnKb: data.dependOnKb,
335
+ };
336
+ if (id) {
337
+ const res = await updateConversationAssistant(id, params);
338
+ if (res) {
339
+ message.success('更新助手配置成功');
340
+ eventsEmit && eventsEmit('go_back');
341
+ }
342
+ } else {
343
+ const res = await addConversationAssistant(params);
344
+ if (res) {
345
+ message.success('新增助手配置成功');
346
+ eventsEmit && eventsEmit('go_back');
347
+ }
348
+ }
349
+ } catch (e) {
350
+ console.error('submit error', e);
351
+ } finally {
352
+ seBtntLoading(false);
353
+ }
354
+ };
355
+
356
+ const formInitialValue = useMemo(() => {
357
+ // 获取 检索与生成参数(ASSISTANT_MIN_MAX) 和 功能开关的初始值(ASSISTANT_DEFAULT)
358
+ const _default: any = {};
359
+ Object.keys(ASSISTANT_MIN_MAX).forEach(key => {
360
+ _default[key] = ASSISTANT_MIN_MAX[key]?.default;
361
+ });
362
+ return {
363
+ ...ASSISTANT_DEFAULT,
364
+ ..._default,
365
+ };
366
+ }, []);
367
+
368
+ return (
369
+ <div
370
+ style={{
371
+ height: '100%',
372
+ width: '100%',
373
+ }}
374
+ >
375
+ <div
376
+ className="flex items-center justify-between"
377
+ style={{
378
+ width: '100%',
379
+ padding: '4px 10px 16px 10px',
380
+ }}
381
+ >
382
+ <div className="flex items-center">
383
+ <ArrowLeft color="#2468F2" onClick={() => eventsEmit && eventsEmit('go_back')} />
384
+ <div
385
+ className="text-[16px] text-[#1D2129] bold"
386
+ style={{
387
+ marginLeft: 20,
388
+ }}
389
+ >
390
+ {id ? '编辑会话助手' : '新建会话助手'}
391
+ </div>
392
+ </div>
393
+ {!loading && (
394
+ <Button
395
+ type="primary"
396
+ onClick={() => handleSubmit()}
397
+ loading={btnLoading}
398
+ disabled={disabled}
399
+ style={{
400
+ backgroundColor: '#055aff',
401
+ }}
402
+ >
403
+ 确定
404
+ </Button>
405
+ )}
406
+ </div>
407
+
408
+ {loading || false ? (
409
+ ContentLoading && <ContentLoading />
410
+ ) : (
411
+ <Form
412
+ style={{
413
+ padding: 20,
414
+ height: 'calc(100vh - 150px)',
415
+ backgroundColor: '#fff',
416
+ }}
417
+ form={form}
418
+ layout="vertical"
419
+ initialValues={formInitialValue}
420
+ disabled={disabled}
421
+ >
422
+ <Row
423
+ gutter={24}
424
+ style={{
425
+ height: '100%',
426
+ }}
427
+ >
428
+ <Col
429
+ span={12}
430
+ style={{
431
+ borderRight: '1px solid #E5E6EB',
432
+ padding: '10px 32px',
433
+ height: '100%',
434
+ overflowY: 'auto',
435
+ }}
436
+ >
437
+ <Item
438
+ label="助手名称"
439
+ name="config_name"
440
+ validateTrigger="onBlur"
441
+ rules={[
442
+ { required: true, message: '请输入助手名称' },
443
+ {
444
+ validator: checkConfigName,
445
+ },
446
+ ]}
447
+ >
448
+ <Input placeholder="请输入" />
449
+ </Item>
450
+
451
+ <Row gutter={16}>
452
+ <Col span={12}>
453
+ <Item
454
+ label="问答模型"
455
+ name="model_name"
456
+ rules={[
457
+ { required: true, message: '' },
458
+ validateModel(modelList, '请选择问答模型'),
459
+ ]}
460
+ >
461
+ <Select
462
+ placeholder="请选择"
463
+ options={modelList}
464
+ notFoundContent={<NotFoundContent />}
465
+ />
466
+ </Item>
467
+ </Col>
468
+ <Col span={12}>
469
+ <Item
470
+ label="规划模型"
471
+ name="plan_model_name"
472
+ rules={[
473
+ { required: true, message: '' },
474
+ validateModel(modelList, '请选择规划模型'),
475
+ ]}
476
+ >
477
+ <Select
478
+ placeholder="请选择"
479
+ options={modelList}
480
+ notFoundContent={<NotFoundContent />}
481
+ />
482
+ </Item>
483
+ </Col>
484
+ </Row>
485
+ <Row gutter={16}>
486
+ <Col span={12}>
487
+ <Item
488
+ label="上传文档问答多模态模型"
489
+ name="multi_model_name"
490
+ rules={[
491
+ { required: true, message: '' },
492
+ validateModel(multiModelOptions, '请选择上传文档问答多模态模型模型'),
493
+ ]}
494
+ >
495
+ <Select
496
+ placeholder="请选择"
497
+ options={multiModelOptions}
498
+ notFoundContent={<NotFoundContent />}
499
+ />
500
+ </Item>
501
+ </Col>
502
+ <Col span={12}>
503
+ <Item
504
+ label="Rerank模型"
505
+ name="rerank_model_name"
506
+ rules={[
507
+ { required: true, message: '' },
508
+ validateModel(rerankOptions, '请选择Rerank模型'),
509
+ ]}
510
+ >
511
+ <Select
512
+ placeholder="请选择"
513
+ options={rerankOptions}
514
+ notFoundContent={<NotFoundContent />}
515
+ />
516
+ </Item>
517
+ </Col>
518
+ </Row>
519
+
520
+ <Item label="开场白" name="prologue">
521
+ <Input.TextArea
522
+ maxLength={50}
523
+ showCount
524
+ placeholder="请输入开场白"
525
+ autoSize={{ minRows: 2 }}
526
+ />
527
+ </Item>
528
+
529
+ <Item label="提示词" name="system_prompt" tooltip={EXPLANATION_PROMPT}>
530
+ <Input.TextArea
531
+ showCount
532
+ rows={8}
533
+ maxLength={3000}
534
+ autoSize={{ minRows: 10 }}
535
+ placeholder={`例如:${DEFAULT_PROMPT}`}
536
+ />
537
+ </Item>
538
+
539
+ <Item
540
+ name="isDefault"
541
+ valuePropName="checked"
542
+ normalize={value => (value === true ? 1 : value)}
543
+ >
544
+ <Checkbox>选择为默认助手</Checkbox>
545
+ </Item>
546
+ </Col>
547
+ <Col
548
+ span={12}
549
+ style={{
550
+ height: '100%',
551
+ padding: '10px 32px',
552
+ overflowY: 'auto',
553
+ }}
554
+ >
555
+ <Paragraph title="检索与生成参数">
556
+ <Item
557
+ label="问题推荐模型"
558
+ name="recommend_model_name"
559
+ rules={[
560
+ { required: true, message: '' },
561
+ validateModel(modelList, '请选择问题推荐模型'),
562
+ ]}
563
+ >
564
+ <Select
565
+ placeholder="请选择"
566
+ options={modelList}
567
+ notFoundContent={<NotFoundContent />}
568
+ />
569
+ </Item>
570
+
571
+ <Item label="检索策略" name="search_policy">
572
+ <Select options={SearchPolicyOptions} placeholder="请选择" />
573
+ </Item>
574
+
575
+ <Row gutter={16}>
576
+ <ParamsItem label="温度" name="temperature" configScale={configScale} />
577
+ <ParamsItem label="多样性" name="top_p" configScale={configScale} />
578
+ </Row>
579
+
580
+ <Row gutter={16}>
581
+ <ParamsItem label="召回数" name="top_k" configScale={configScale} />
582
+ <ParamsItem label="相似度阈值" name="score_threshold" configScale={configScale} />
583
+ </Row>
584
+ <Row gutter={16}>
585
+ <ParamsItem label="最大令牌数" name="max_tokens" configScale={configScale} />
586
+ <ParamsItem label="上下文最大轮数" name="max_round" configScale={configScale} />
587
+ </Row>
588
+ </Paragraph>
589
+ <Paragraph title="功能开关">
590
+ <Item
591
+ label="开启FAQ优先"
592
+ name="enabled_faq"
593
+ valuePropName="checked"
594
+ layout="horizontal"
595
+ >
596
+ <Switch />
597
+ </Item>
598
+ <Item
599
+ label="启用图谱增强"
600
+ name="enabled_graph"
601
+ valuePropName="checked"
602
+ layout="horizontal"
603
+ >
604
+ <Switch />
605
+ </Item>
606
+ <Item
607
+ label="开启强企业知识依赖"
608
+ name="dependOnKb"
609
+ valuePropName="checked"
610
+ layout="horizontal"
611
+ tooltip={EXPLANATION_DEPENDON_KB}
612
+ normalize={value => (value === true ? 1 : value)}
613
+ >
614
+ <Switch />
615
+ </Item>
616
+ <Item
617
+ label="开启问题改写"
618
+ name="enabled_question_rewrite"
619
+ valuePropName="checked"
620
+ layout="horizontal"
621
+ >
622
+ <Switch />
623
+ </Item>
624
+ <Item
625
+ label="开启溯源"
626
+ name="need_trace_source"
627
+ valuePropName="checked"
628
+ layout="horizontal"
629
+ >
630
+ <Switch />
631
+ </Item>
632
+ <Item
633
+ noStyle
634
+ shouldUpdate={(prev, cur) => prev.need_trace_source !== cur.need_trace_source}
635
+ >
636
+ {({ getFieldValue }) =>
637
+ getFieldValue('need_trace_source') ? (
638
+ <>
639
+ <Item label="溯源策略" name="trace_by_llm" layout="horizontal">
640
+ <Select placeholder="请选择" options={TraceabilityStrategy} />
641
+ </Item>
642
+ <Item name="is_download" valuePropName="checked" layout="horizontal">
643
+ <Checkbox>允许下载溯源文件</Checkbox>
644
+ </Item>
645
+ </>
646
+ ) : null
647
+ }
648
+ </Item>
649
+ </Paragraph>
650
+ <Paragraph title="资源绑定">
651
+ <SensitiveSection
652
+ url={url}
653
+ token={token}
654
+ role={role}
655
+ sectionData={configData?.sensitiveWordIds}
656
+ eventsEmit={handleEventsEmit}
657
+ // getList={fetchSensitiveLibrary}
658
+ />
659
+ <KnowledgeSection
660
+ url={url}
661
+ token={token}
662
+ role={role}
663
+ sectionData={{
664
+ knowledge_base_name: configData?.knowledge_base_name,
665
+ knowledge_base_name_source: configData?.knowledge_base_name_source,
666
+ selectedKnowledgeBase: configData?.selectedKnowledgeBase,
667
+ }}
668
+ createBy={isShare ? configData?.createBy : undefined}
669
+ eventsEmit={handleEventsEmit}
670
+ />
671
+
672
+ {showDatabase && (
673
+ <DatabaseSection
674
+ url={url}
675
+ token={token}
676
+ role={role}
677
+ disabled={disabled}
678
+ sectionData={configData?.database_name}
679
+ eventsEmit={handleEventsEmit}
680
+ />
681
+ )}
682
+ {showGraph && (
683
+ <GraphSection
684
+ url={url}
685
+ token={token}
686
+ role={role}
687
+ sectionData={configData?.graph_nb_name}
688
+ eventsEmit={handleEventsEmit}
689
+ />
690
+ )}
691
+ </Paragraph>
692
+ </Col>
693
+ </Row>
694
+ </Form>
695
+ )}
696
+ </div>
697
+ );
698
+ };
699
+
700
+ export default ConversationAssistant;