@gientech/modual 1.4.7 → 1.5.2

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 (65) hide show
  1. package/dist/assets/GientechStreamReader-KtCNi1G3.js +447 -0
  2. package/dist/assets/Input-CNqIA41v.js +236 -0
  3. package/dist/assets/index-Bof0D4vl.js +1088 -0
  4. package/dist/assets/{index-BVENTW1Q.js → index-C5RhLYRh.js} +1 -1
  5. package/dist/assets/index-COcmK9my.js +1 -0
  6. package/dist/assets/index-CysDmrpo.js +1798 -0
  7. package/dist/assets/{index-7rZAt9P3.js → index-DP8Ki8qW.js} +1 -1
  8. package/dist/assets/index-pybYlMAT.js +11 -0
  9. package/dist/assets/{plus-CrtEUXaQ.js → plus-CzbYbK8K.js} +1 -1
  10. package/dist/assets/style3.css +1 -1
  11. package/dist/assets/worker-BbpylX7l.js +13 -0
  12. package/dist/assets/{x-Dr3EBTzJ.js → x-DdRafKQU.js} +1 -1
  13. package/dist/chat.d.ts +17 -0
  14. package/dist/chat.js +2539 -52
  15. package/dist/database.js +2 -2
  16. package/dist/databaseId.js +1 -11
  17. package/dist/databaseTable.js +2 -2
  18. package/dist/index.d.ts +4 -0
  19. package/dist/index.js +1 -14
  20. package/dist/modelManage.js +1 -1
  21. package/dist/package.json +1 -1
  22. package/dist/sensitive.js +1 -1
  23. package/dist/streamFilesReader.js +1 -1
  24. package/dist/worker/pdf.worker1.min.js +23 -0
  25. package/package.json +6 -6
  26. package/public/worker/pdf.worker1.min.js +23 -0
  27. package/scripts/README.md +133 -133
  28. package/scripts/build-demo.js +88 -88
  29. package/scripts/demo-selector.js +216 -216
  30. package/scripts/preview-demo.js +130 -130
  31. package/scripts/run-demo.bat +34 -34
  32. package/src/assets/img/close.png +0 -0
  33. package/src/assets/img/database.png +0 -0
  34. package/src/assets/img/downLoad.png +0 -0
  35. package/src/assets/img/graphIcon.png +0 -0
  36. package/src/assets/img/pdf.png +0 -0
  37. package/src/assets/img/singleQa.png +0 -0
  38. package/src/assets/img/webSearch.png +0 -0
  39. package/src/examples/chat/index.tsx +5 -29
  40. package/src/main.tsx.backup +5 -5
  41. package/src/modules/chat/ReferenceBar.tsx +522 -0
  42. package/src/modules/chat/constants.tsx +29 -6
  43. package/src/modules/chat/index.tsx +118 -4
  44. package/src/modules/chat/referenceCom/DeleteModal.tsx +75 -0
  45. package/src/modules/chat/referenceCom/DrawerContent.tsx +136 -0
  46. package/src/modules/chat/referenceCom/DrawerDatabase.tsx +110 -0
  47. package/src/modules/chat/referenceCom/DrawerGraphPreview.tsx +86 -0
  48. package/src/modules/chat/referenceCom/DrawerPreview.tsx +73 -0
  49. package/src/modules/chat/referenceCom/DrawerTitle.tsx +26 -0
  50. package/src/modules/chat/referenceCom/RenameModal.tsx +86 -0
  51. package/src/modules/chat/referenceCom/TagCom.tsx +30 -0
  52. package/src/modules/chat/style.css +3 -0
  53. package/src/modules/chat/utils/index.ts +326 -0
  54. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +231 -18
  55. package/src/utils/testconfigs/index.ts +1 -1
  56. package/stats.html +1 -1
  57. package/dist/assets/AppLoading-mci3gLZt.js +0 -414
  58. package/dist/assets/GientechStreamReader-4496nAm0.js +0 -446
  59. package/dist/assets/index-Bb8_WB-l.js +0 -1
  60. package/dist/assets/index-BpJ9Bm5x.js +0 -21
  61. package/dist/assets/index-CNxDI4h-.js +0 -1078
  62. package/dist/assets/index-CWzpBU29.js +0 -1
  63. package/dist/assets/index-D1m34Ij7.js +0 -1429
  64. package/dist/assets/index-_gBtdXQV.js +0 -585
  65. package/dist/assets/style4.css +0 -1
@@ -0,0 +1,522 @@
1
+ import { ConfigProvider, Drawer, Tooltip } from 'antd';
2
+ import SingleQa from '../../assets/img/singleQa.png';
3
+ import DownLoad from '../../assets/img/downLoad.png';
4
+ import GraphIcon from '../../assets/img/graphIcon.png';
5
+ import WebSearch from '../../assets/img/webSearch.png';
6
+ import Database from '../../assets/img/database.png';
7
+ import { useEffect, useMemo, useState } from 'react';
8
+ import './style.css';
9
+ import DrawerGraphPreview from './referenceCom/DrawerGraphPreview';
10
+ import { DrawerContent } from './referenceCom/DrawerContent';
11
+ import DrawerPreview from './referenceCom/DrawerPreview';
12
+ import DrawerDatabase from './referenceCom/DrawerDatabase';
13
+ import DrawerTitle from './referenceCom/DrawerTitle';
14
+ import TagCom from './referenceCom/TagCom';
15
+ import {
16
+ downloadByStream,
17
+ getFileIcon,
18
+ getFileName,
19
+ getMarkExcludeType,
20
+ TempBaseUrl,
21
+ } from './utils';
22
+ import { DrawerType } from '../../lib_enter';
23
+
24
+ enum ListName {
25
+ KNOWLEDGE = 'knowledgeList',
26
+ SEARCH = 'searchList',
27
+ DATABASE = 'databaseList',
28
+ GRAPH = 'graphList',
29
+ }
30
+
31
+ export const bgColor: any = {
32
+ [ListName.KNOWLEDGE]: '#EAF4FD',
33
+ [ListName.SEARCH]: '#E8F7F0',
34
+ [ListName.DATABASE]: '#FFF4E5',
35
+ [ListName.GRAPH]: '#E7F8FB',
36
+ };
37
+
38
+ export const textColor: any = {
39
+ [ListName.KNOWLEDGE]: '#2072F0',
40
+ [ListName.SEARCH]: '#39B83F',
41
+ [ListName.DATABASE]: '#F48C14',
42
+ [ListName.GRAPH]: '#10BBD9',
43
+ };
44
+
45
+ const BTNS = [
46
+ {
47
+ key: ListName.KNOWLEDGE,
48
+ name: '知识库文档',
49
+ },
50
+ {
51
+ key: ListName.SEARCH,
52
+ name: '联网搜索',
53
+ hideBtns: true,
54
+ },
55
+ {
56
+ key: ListName.DATABASE,
57
+ name: '数据库',
58
+ },
59
+ {
60
+ key: ListName.GRAPH,
61
+ name: '知识图谱',
62
+ hideBtns: true,
63
+ },
64
+ ];
65
+
66
+ export const ReferenceBar = ({
67
+ type,
68
+ data,
69
+ token,
70
+ eventsEmit,
71
+ is_download,
72
+ }: {
73
+ type: string;
74
+ data: any;
75
+ token: string;
76
+ eventsEmit?: (eventName: string, data: any) => void;
77
+ is_download: boolean;
78
+ }) => {
79
+ const [btns, setBtns] = useState(BTNS);
80
+ const [drawerType, setDrawerType] = useState<string>('mark');
81
+ const [drawerOpen, setDrawerOpen] = useState<boolean>(false);
82
+ const [curFileInfo, setCurFileInfo] = useState<any>({});
83
+ const [activeBtn, setActiveBtn] = useState<any>(ListName.KNOWLEDGE);
84
+ const [lists, seLists] = useState<any>({
85
+ [ListName.KNOWLEDGE]: [],
86
+ [ListName.SEARCH]: [],
87
+ [ListName.DATABASE]: [],
88
+ [ListName.GRAPH]: [],
89
+ });
90
+
91
+ const getEmptyBoxs = useMemo(() => {
92
+ const n = 4 - btns.length;
93
+ const arr = Array(n)
94
+ .fill(null)
95
+ .map((v, i) => {
96
+ return {
97
+ name: '',
98
+ key: 100 + i,
99
+ };
100
+ });
101
+
102
+ const r = [...btns, ...arr];
103
+ console.log('rrrrrr', r);
104
+
105
+ return r;
106
+ }, [btns]);
107
+
108
+ const filterScore = (score: any) => {
109
+ if (isNaN(score)) {
110
+ return '';
111
+ } else {
112
+ return (+score).toFixed(2);
113
+ }
114
+ };
115
+
116
+ const getIcon = (btn: string, filtType?: string) => {
117
+ switch (btn) {
118
+ case ListName.KNOWLEDGE:
119
+ return getFileIcon(filtType as any);
120
+ case ListName.SEARCH:
121
+ return WebSearch;
122
+ case ListName.DATABASE:
123
+ return Database;
124
+ case ListName.GRAPH:
125
+ return GraphIcon;
126
+ }
127
+ };
128
+
129
+ const dealData = (type: string, data: any[]) => {
130
+ if (type === ListName.GRAPH) {
131
+ return data.map(item => {
132
+ return {
133
+ ...item,
134
+ name: item.graphName,
135
+ };
136
+ });
137
+ }
138
+
139
+ if (type === ListName.KNOWLEDGE) {
140
+ return data.map(item => {
141
+ return {
142
+ ...item,
143
+ name: item.file_name,
144
+ score: item.rrf_score,
145
+ };
146
+ });
147
+ }
148
+
149
+ if (type === ListName.SEARCH) {
150
+ return data.map(item => {
151
+ return {
152
+ ...item,
153
+ name: item.file_name,
154
+ };
155
+ });
156
+ }
157
+
158
+ return data;
159
+ };
160
+
161
+ const clickTag = (file: any, tag: any, btn: any) => {
162
+ switch (btn.key) {
163
+ case ListName.KNOWLEDGE:
164
+ console.log('click knowledge tag', file, tag);
165
+ const curFile = file;
166
+ const { pdfPages, parsedFilePath, order_num, metadata } = curFile;
167
+ const id = tag.id || order_num || 'Unknown ID';
168
+ // 解析 source 字段
169
+ const sourceParts = metadata.source.split('/');
170
+ const fileName = sourceParts[sourceParts.length - 1] || '';
171
+ const fileParts = fileName.split('.');
172
+ const label = fileParts.slice(0, -1).join('.') || 'Unknown Label';
173
+ const file_type = fileParts[fileParts.length - 1] || 'Unknown Type';
174
+
175
+ setCurFileInfo({
176
+ id,
177
+ title: label,
178
+ file_name: fileName,
179
+ file_type: file_type,
180
+ file_source: getMarkExcludeType(file_type)
181
+ ? `${TempBaseUrl}${metadata.source}`
182
+ : parsedFilePath,
183
+ metadata: metadata,
184
+ pdfPages: pdfPages,
185
+ });
186
+ setDrawerType('mark');
187
+ setDrawerOpen(true);
188
+ break;
189
+ case ListName.SEARCH:
190
+ console.log('click search tag', file, tag);
191
+ break;
192
+ case ListName.DATABASE:
193
+ console.log('click database tag', file, tag);
194
+ break;
195
+ case ListName.GRAPH:
196
+ console.log('click graph tag', file, tag);
197
+ setDrawerType('graphPreview');
198
+ setCurFileInfo({
199
+ ...file,
200
+ traceNode: (data?.traceNode || []).find((item: any) => {
201
+ return item.id === tag.id;
202
+ }),
203
+ });
204
+ setDrawerOpen(true);
205
+ break;
206
+ }
207
+ };
208
+
209
+ useEffect(() => {
210
+ if (type !== DrawerType.REFERENCELIST) return;
211
+ console.log('data in reference drawer', data);
212
+ if (!data) return;
213
+ const { graphRefs, knowledgeRefs, webRefs } = data;
214
+ if (graphRefs?.length) {
215
+ lists[ListName.GRAPH] = dealData(ListName.GRAPH, graphRefs);
216
+ }
217
+ if (knowledgeRefs?.length) {
218
+ lists[ListName.KNOWLEDGE] = dealData(ListName.KNOWLEDGE, knowledgeRefs);
219
+ }
220
+ if (webRefs?.length) {
221
+ lists[ListName.SEARCH] = dealData(ListName.SEARCH, webRefs);
222
+ }
223
+
224
+ const curBtns = BTNS.filter((item: any) => {
225
+ return lists[item.key]?.length;
226
+ });
227
+
228
+ setBtns(curBtns);
229
+
230
+ if (curBtns?.length) {
231
+ setActiveBtn(curBtns[0].key);
232
+ }
233
+
234
+ seLists({ ...lists });
235
+ }, [data]);
236
+
237
+ return (
238
+ <>
239
+ <div className="listWrap w-full h-full">
240
+ <DrawerTitle
241
+ title="知识溯源"
242
+ setOpen={() => {
243
+ const closeEvent = new CustomEvent('aichat:right_set', {
244
+ detail: { collapsed: true },
245
+ });
246
+ window.dispatchEvent(closeEvent);
247
+ }}
248
+ />
249
+ <div style={{ height: 'calc(100% - 60px)' }}>
250
+ <div
251
+ className="tabs"
252
+ style={{ display: 'flex', justifyContent: 'space-between', padding: '12px 20px' }}
253
+ >
254
+ {getEmptyBoxs.map(item => (
255
+ <div
256
+ key={item.key}
257
+ className="tab-item"
258
+ style={{
259
+ display: 'inline-block',
260
+ padding: '5.5px 12px',
261
+ backgroundColor: !item.name
262
+ ? 'transparent'
263
+ : activeBtn === item.key
264
+ ? '#4E6EF2'
265
+ : '#F5F6F9',
266
+ cursor: 'pointer',
267
+ borderRadius: '4px',
268
+ color: activeBtn === item.key ? '#FFFFFF' : '#4E5969',
269
+ fontSize: '14px',
270
+ minWidth: '80px',
271
+ }}
272
+ onClick={() => {
273
+ if (item.name) {
274
+ setActiveBtn(item.key);
275
+ }
276
+ }}
277
+ >
278
+ {item.name}
279
+ </div>
280
+ ))}
281
+ </div>
282
+ <div
283
+ className="listBox"
284
+ style={{
285
+ height: 'calc(100% - 66px)',
286
+ overflowY: 'auto',
287
+ display: 'flex',
288
+ flexDirection: 'column',
289
+ alignItems: 'center',
290
+ }}
291
+ >
292
+ {btns.map((item: any) => {
293
+ let list: any[] = lists[item.key] || [];
294
+ if (activeBtn !== item.key) return null;
295
+ return (
296
+ <div key={item.key}>
297
+ {list.map(
298
+ (i: {
299
+ name: string;
300
+ id: string;
301
+ score: number | string;
302
+ tags?: any[];
303
+ hideBtns?: boolean;
304
+ file_type?: string;
305
+ link?: string;
306
+ metadata: any;
307
+ file_name: any;
308
+ parsedFilePath: any;
309
+ }) => {
310
+ return (
311
+ <div
312
+ key={i.id}
313
+ style={{
314
+ width: '360px',
315
+ padding: '4px 8px',
316
+ borderRadius: '4px',
317
+ margin: '6px 0',
318
+ cursor: 'pointer',
319
+ }}
320
+ className="listItemBox"
321
+ onClick={() => {
322
+ if (item.key === ListName.SEARCH) {
323
+ window.open(i.link, '_blank');
324
+ }
325
+ }}
326
+ >
327
+ <div
328
+ style={{
329
+ display: 'flex',
330
+ justifyContent: 'space-between',
331
+ alignItems: 'center',
332
+ }}
333
+ >
334
+ <div
335
+ style={{
336
+ width: item.hideBtns ? '339px' : '288px',
337
+ fontSize: '14px',
338
+ color: '#1D2129',
339
+ fontWeight: '700',
340
+ display: 'flex',
341
+ alignItems: 'center',
342
+ }}
343
+ >
344
+ <img
345
+ src={getIcon(item.key, i.file_type)}
346
+ style={{ width: '16px', height: '16px', marginRight: '2px' }}
347
+ />
348
+ <Tooltip
349
+ placement="topLeft"
350
+ title={i?.name?.length > 16 ? i.name : ''}
351
+ >
352
+ <div
353
+ style={{
354
+ whiteSpace: 'nowrap',
355
+ overflow: 'hidden',
356
+ textOverflow: 'ellipsis',
357
+ width: item.hideBtns ? '322px' : '258px',
358
+ }}
359
+ >
360
+ {i.name}
361
+ </div>
362
+ </Tooltip>
363
+ </div>
364
+ <div
365
+ style={{
366
+ width: '52px',
367
+ justifyContent: 'space-between',
368
+ alignItems: 'center',
369
+ marginRight: '8px',
370
+ display: item.hideBtns ? 'none' : 'flex',
371
+ }}
372
+ >
373
+ <img
374
+ src={SingleQa}
375
+ style={{ width: '16px', height: '16px', cursor: 'pointer' }}
376
+ onClick={() => {
377
+ eventsEmit?.('referenceFile_filechat', {
378
+ data: {
379
+ ...i,
380
+ file_type: i.file_type,
381
+ file_name: i.file_name,
382
+ metadata: i.metadata,
383
+ parsedFilePath: i.parsedFilePath,
384
+ },
385
+ });
386
+ }}
387
+ />
388
+ <div
389
+ style={{ borderRight: '1px solid #E5E6EB', height: '14px' }}
390
+ ></div>
391
+ <img
392
+ src={DownLoad}
393
+ style={{
394
+ width: '16px',
395
+ height: '16px',
396
+ cursor: is_download ? 'pointer' : 'not-allowed',
397
+ }}
398
+ onClick={() => {
399
+ if (!i?.metadata || !is_download) return;
400
+ downloadByStream({
401
+ filePath: `${TempBaseUrl}${i.metadata.source}`,
402
+ fileName: getFileName(i),
403
+ token,
404
+ });
405
+ }}
406
+ />
407
+ </div>
408
+ </div>
409
+ {(typeof i.score === 'string' ||
410
+ typeof i.score === 'number' ||
411
+ (i?.tags?.length && i.tags.length > 0 && i.tags.length <= 10)) && (
412
+ <div
413
+ style={{
414
+ display: 'flex',
415
+ justifyContent: 'space-between',
416
+ height: '18px',
417
+ marginTop: '4px',
418
+ }}
419
+ >
420
+ {(typeof i.score === 'string' || typeof i.score === 'number') && (
421
+ <div
422
+ style={{
423
+ backgroundColor: '#F2F2FB',
424
+ borderRadius: '4px',
425
+ padding: '2px 3px',
426
+ display: 'flex',
427
+ justifyContent: 'center',
428
+ alignItems: 'center',
429
+ fontSize: '12px',
430
+ }}
431
+ >
432
+ <span style={{ color: '#4E5969', marginRight: '6px' }}>
433
+ 分数:
434
+ </span>
435
+ <span style={{ color: '#1D2129' }}>{filterScore(i.score)}</span>
436
+ </div>
437
+ )}
438
+ <div style={{ flex: 1, display: 'flex', justifyContent: 'flex-end' }}>
439
+ {(i?.tags?.length && i.tags.length > 0 && i.tags.length <= 10
440
+ ? i.tags
441
+ : []
442
+ ).map((j: any) => {
443
+ return (
444
+ <TagCom
445
+ key={j.id}
446
+ i={i}
447
+ item={item}
448
+ j={j}
449
+ clickTag={clickTag}
450
+ />
451
+ );
452
+ })}
453
+ </div>
454
+ </div>
455
+ )}
456
+ <div
457
+ style={{
458
+ flex: 1,
459
+ display: 'flex',
460
+ justifyContent: 'flex-start',
461
+ marginTop: '4px',
462
+ }}
463
+ >
464
+ {(i?.tags?.length && i.tags.length > 10 ? i.tags : []).map((j: any) => {
465
+ return (
466
+ <TagCom key={j.id} i={i} item={item} j={j} clickTag={clickTag} />
467
+ );
468
+ })}
469
+ </div>
470
+ </div>
471
+ );
472
+ }
473
+ )}
474
+ </div>
475
+ );
476
+ })}
477
+ </div>
478
+ </div>
479
+ </div>
480
+ <ConfigProvider
481
+ drawer={{
482
+ styles: {
483
+ body: { padding: 0 },
484
+ header: { display: 'none' },
485
+ },
486
+ }}
487
+ >
488
+ <Drawer
489
+ autoFocus={false}
490
+ onClose={() => setDrawerOpen(false)}
491
+ open={drawerOpen}
492
+ width={720}
493
+ className="overflow-x-hidden"
494
+ destroyOnClose
495
+ getContainer={false}
496
+ afterOpenChange={open => {
497
+ if (!open) {
498
+ setCurFileInfo(null);
499
+ }
500
+ }}
501
+ >
502
+ {drawerType === 'graphPreview' && (
503
+ <DrawerGraphPreview
504
+ curFileInfo={curFileInfo as any}
505
+ onClose={setDrawerOpen}
506
+ token={token}
507
+ />
508
+ )}
509
+ {drawerType === 'mark' && (
510
+ <DrawerContent content={curFileInfo as any} onClose={setDrawerOpen} token={token} />
511
+ )}
512
+ {drawerType === 'preview' && (
513
+ <DrawerPreview curFileInfo={curFileInfo} onClose={setDrawerOpen} token={token} />
514
+ )}
515
+ {drawerType === 'database' && (
516
+ <DrawerDatabase curFileInfo={curFileInfo} onClose={setDrawerOpen} />
517
+ )}
518
+ </Drawer>
519
+ </ConfigProvider>
520
+ </>
521
+ );
522
+ };
@@ -1,30 +1,53 @@
1
1
  import { Icon } from '@mxmweb/zui';
2
+ import { FileSymlink, Mic, Paperclip } from 'lucide-react';
2
3
 
3
4
  export const DefaultSenderConfig = {
4
5
  actions: [
5
6
  {
6
- icon: <Icon type='rag/folder' size={18} />,
7
7
  name: 'history',
8
- badgeCount: 0,
8
+ icon: <Paperclip color='#4E5969' size={20}/>,
9
+ // badgeCount: 0,
10
+ tip: '录音',
9
11
  },
12
+ {
13
+ name: 'upload',
14
+ icon: <Mic color='#4E5969' size={20}/>,
15
+ tip: '上传',
16
+ }
10
17
  ],
11
18
 
19
+ // {
20
+ // name: 'reasoning',
21
+ // label: '思维链',
22
+ // type: 'switch' as const,
23
+ // defaultValue: false,
24
+ // enabled: true,
25
+ // icon: <LoaderPinwheel size={16} />,
26
+ // },
27
+ // {
28
+ // name: 'netSearch',
29
+ // label: '网络搜索',
30
+ // type: 'switch' as const,
31
+ // defaultValue: true,
32
+ // enabled: true,
33
+ // icon: <Globe size={16} />,
34
+ // },
12
35
  switchs: [
13
36
  {
14
37
  label: '联网搜索',
15
38
  name: 'netSearch',
16
- type: 'checkbox',
39
+ type: 'switch',
17
40
  defaultValue: false,
18
41
  enabled: true,
19
- icon: <Icon type='rag/url' size={12} />,
42
+ icon: <Icon type='rag/url' size={16} />,
20
43
  },
21
44
  {
22
45
  label: '推理思考',
23
46
  name: 'reasoning',
24
- type: 'checkbox',
47
+ type: 'switch',
25
48
  defaultValue: false,
26
49
  enabled: true,
27
- icon: <Icon type='rag/think' size={12} />,
50
+ icon: <Icon type='rag/think' size={16} />,
28
51
  },
29
52
  ],
30
53
  };