yqj123 commited on
Commit
f3dd131
·
1 Parent(s): 103e12b

set port (#39)

Browse files

* set port

* add knowledge-search

* update text

web/package.json CHANGED
@@ -2,7 +2,7 @@
2
  "private": true,
3
  "author": "zhaofengchao <[email protected]>",
4
  "scripts": {
5
- "dev": "set PORT=9000&&umi dev",
6
  "build": "umi build",
7
  "postinstall": "umi setup",
8
  "setup": "umi setup",
@@ -30,6 +30,7 @@
30
  "@types/react": "^18.0.33",
31
  "@types/react-dom": "^18.0.11",
32
  "@umijs/plugins": "^4.1.0",
 
33
  "typescript": "^5.0.3",
34
  "umi-plugin-icons": "^0.1.1"
35
  }
 
2
  "private": true,
3
  "author": "zhaofengchao <[email protected]>",
4
  "scripts": {
5
+ "dev": "cross-env PORT=9000 umi dev",
6
  "build": "umi build",
7
  "postinstall": "umi setup",
8
  "setup": "umi setup",
 
30
  "@types/react": "^18.0.33",
31
  "@types/react-dom": "^18.0.11",
32
  "@umijs/plugins": "^4.1.0",
33
+ "cross-env": "^7.0.3",
34
  "typescript": "^5.0.3",
35
  "umi-plugin-icons": "^0.1.1"
36
  }
web/src/pages/add-knowledge/components/knowledge-chunk/{createModal.tsx → components/createModal.tsx} RENAMED
@@ -14,10 +14,12 @@ interface kFProps {
14
  dispatch: Dispatch;
15
  chunkModel: chunkModelState;
16
  getChunkList: () => void;
17
- doc_id: string
 
 
18
  }
19
- const Index: React.FC<kFProps> = ({ chunkModel, dispatch, getChunkList, doc_id }) => {
20
- const { isShowCreateModal, chunk_id, chunkInfo } = chunkModel
21
  const [important_kwd, setImportantKwd] = useState(['Unremovable', 'Tag 2', 'Tag 3']);
22
  const { t } = useTranslation()
23
  const handleCancel = () => {
@@ -29,6 +31,7 @@ const Index: React.FC<kFProps> = ({ chunkModel, dispatch, getChunkList, doc_id }
29
  });
30
  };
31
  useEffect(() => {
 
32
  if (chunk_id && isShowCreateModal) {
33
  dispatch({
34
  type: 'chunkModel/get_chunk',
@@ -85,7 +88,7 @@ const Index: React.FC<kFProps> = ({ chunkModel, dispatch, getChunkList, doc_id }
85
  <Form.Item<FieldType>
86
  label="chunk 内容"
87
  name="content_ltks"
88
- rules={[{ required: true, message: 'Please input name!' }]}
89
  >
90
  <Input.TextArea />
91
  </Form.Item>
 
14
  dispatch: Dispatch;
15
  chunkModel: chunkModelState;
16
  getChunkList: () => void;
17
+ isShowCreateModal: boolean;
18
+ doc_id: string;
19
+ chunk_id: string
20
  }
21
+ const Index: React.FC<kFProps> = ({ dispatch, getChunkList, doc_id, isShowCreateModal, chunk_id }) => {
22
+ // const { , chunkInfo } = chunkModel
23
  const [important_kwd, setImportantKwd] = useState(['Unremovable', 'Tag 2', 'Tag 3']);
24
  const { t } = useTranslation()
25
  const handleCancel = () => {
 
31
  });
32
  };
33
  useEffect(() => {
34
+ console.log(chunk_id, isShowCreateModal)
35
  if (chunk_id && isShowCreateModal) {
36
  dispatch({
37
  type: 'chunkModel/get_chunk',
 
88
  <Form.Item<FieldType>
89
  label="chunk 内容"
90
  name="content_ltks"
91
+ rules={[{ required: true, message: 'Please input value!' }]}
92
  >
93
  <Input.TextArea />
94
  </Form.Item>
web/src/pages/add-knowledge/components/knowledge-chunk/{editTag.tsx → components/editTag.tsx} RENAMED
File without changes
web/src/pages/add-knowledge/components/knowledge-chunk/index.tsx CHANGED
@@ -4,7 +4,7 @@ import { Card, Row, Col, Input, Select, Switch, Pagination, Spin, Button, Popcon
4
  import { MinusSquareOutlined, DeleteOutlined, } from '@ant-design/icons';
5
  import type { PaginationProps } from 'antd';
6
  import { api_host } from '@/utils/api'
7
- import CreateModal from './createModal'
8
 
9
 
10
  import styles from './index.less'
@@ -21,7 +21,7 @@ const Index: React.FC<chunkProps> = ({ chunkModel, dispatch, doc_id }) => {
21
  const navigate = useNavigate()
22
  const [pagination, setPagination] = useState({ page: 1, size: 30 })
23
  // const [datas, setDatas] = useState(data)
24
- const { data = [], total, loading } = chunkModel
25
  console.log(chunkModel)
26
  const getChunkList = (value?: string) => {
27
  dispatch({
@@ -66,7 +66,8 @@ const Index: React.FC<chunkProps> = ({ chunkModel, dispatch, doc_id }) => {
66
  type: 'chunkModel/updateState',
67
  payload: {
68
  isShowCreateModal: true,
69
- chunk_id
 
70
  },
71
  callback: getChunkList
72
  });
@@ -216,7 +217,7 @@ const Index: React.FC<chunkProps> = ({ chunkModel, dispatch, doc_id }) => {
216
  </div>
217
 
218
  </div >
219
- <CreateModal doc_id={doc_id} getChunkList={getChunkList} />
220
  </>
221
  )
222
  };
 
4
  import { MinusSquareOutlined, DeleteOutlined, } from '@ant-design/icons';
5
  import type { PaginationProps } from 'antd';
6
  import { api_host } from '@/utils/api'
7
+ import CreateModal from './components/createModal'
8
 
9
 
10
  import styles from './index.less'
 
21
  const navigate = useNavigate()
22
  const [pagination, setPagination] = useState({ page: 1, size: 30 })
23
  // const [datas, setDatas] = useState(data)
24
+ const { data = [], total, loading, chunk_id, isShowCreateModal } = chunkModel
25
  console.log(chunkModel)
26
  const getChunkList = (value?: string) => {
27
  dispatch({
 
66
  type: 'chunkModel/updateState',
67
  payload: {
68
  isShowCreateModal: true,
69
+ chunk_id,
70
+ doc_id
71
  },
72
  callback: getChunkList
73
  });
 
217
  </div>
218
 
219
  </div >
220
+ <CreateModal doc_id={doc_id} isShowCreateModal={isShowCreateModal} chunk_id={chunk_id} getChunkList={getChunkList} />
221
  </>
222
  )
223
  };
web/src/pages/add-knowledge/components/knowledge-chunk/model.ts CHANGED
@@ -8,6 +8,7 @@ export interface chunkModelState {
8
  total: number;
9
  isShowCreateModal: boolean;
10
  chunk_id: string;
 
11
  chunkInfo: any
12
  }
13
  export interface chunkgModelType {
@@ -33,6 +34,7 @@ const Model: chunkgModelType = {
33
  total: 0,
34
  isShowCreateModal: false,
35
  chunk_id: '',
 
36
  chunkInfo: {}
37
  },
38
  subscriptions: {
 
8
  total: number;
9
  isShowCreateModal: boolean;
10
  chunk_id: string;
11
+ doc_id: string;
12
  chunkInfo: any
13
  }
14
  export interface chunkgModelType {
 
34
  total: 0,
35
  isShowCreateModal: false,
36
  chunk_id: '',
37
+ doc_id: '',
38
  chunkInfo: {}
39
  },
40
  subscriptions: {
web/src/pages/add-knowledge/components/knowledge-file/createEFileModal.tsx CHANGED
@@ -65,7 +65,7 @@ const Index: React.FC<kFProps> = ({ kFModel, dispatch, getKfList, kb_id }) => {
65
  <Form.Item<FieldType>
66
  label="文件名"
67
  name="name"
68
- rules={[{ required: true, message: 'Please input name!' }]}
69
  >
70
  <Input />
71
  </Form.Item>
 
65
  <Form.Item<FieldType>
66
  label="文件名"
67
  name="name"
68
+ rules={[{ required: true, message: 'Please input value!' }]}
69
  >
70
  <Input />
71
  </Form.Item>
web/src/pages/add-knowledge/components/knowledge-search/index.less ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .chunkPage {
2
+ padding: 24px;
3
+ display: flex;
4
+ height: calc(100vh - 112px);
5
+ // flex-direction: column;
6
+
7
+ .filter {
8
+ margin-right: 20px;
9
+ display: flex;
10
+ height: 32px;
11
+ width: 300px;
12
+ flex-wrap: wrap;
13
+ justify-content: space-between;
14
+ }
15
+
16
+ .pageContainer {
17
+ flex: 1;
18
+ display: flex;
19
+ flex-direction: column;
20
+
21
+ .pageContent {
22
+ flex: 1;
23
+ width: 100%;
24
+ padding-right: 12px;
25
+ overflow-y: auto;
26
+
27
+ .spin {
28
+ min-height: 400px;
29
+ }
30
+ }
31
+
32
+ .pageFooter {
33
+ height: 32px;
34
+ float: right;
35
+ }
36
+ }
37
+
38
+ }
39
+
40
+ .container {
41
+ height: 100px;
42
+ display: flex;
43
+ flex-direction: column;
44
+ justify-content: space-between;
45
+
46
+ .content {
47
+ display: flex;
48
+ justify-content: space-between;
49
+
50
+ .context {
51
+ flex: 1;
52
+ // width: 207px;
53
+ height: 88px;
54
+ overflow: hidden;
55
+ }
56
+ }
57
+
58
+ .footer {
59
+ height: 20px;
60
+
61
+ .text {
62
+ margin-left: 10px;
63
+ }
64
+ }
65
+ }
66
+
67
+ .card {
68
+ :global {
69
+ .ant-card-body {
70
+ padding: 10px;
71
+ margin: 0;
72
+ }
73
+
74
+ margin-bottom: 10px;
75
+ }
76
+
77
+ cursor: pointer;
78
+
79
+ }
web/src/pages/add-knowledge/components/knowledge-search/index.tsx CHANGED
@@ -1,3 +1,247 @@
1
- export default () => {
2
- return <div>知识库搜索</div>
3
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useEffect, useState, useCallback, } from 'react';
2
+ import { useNavigate, connect, Dispatch } from 'umi'
3
+ import { Card, Row, Col, Input, Select, Switch, Pagination, Spin, Button, Popconfirm } from 'antd';
4
+ import { MinusSquareOutlined, DeleteOutlined, } from '@ant-design/icons';
5
+ import type { PaginationProps } from 'antd';
6
+ import { api_host } from '@/utils/api'
7
+ import CreateModal from '../knowledge-chunk/components/createModal'
8
+
9
+
10
+ import styles from './index.less'
11
+ import { debounce } from 'lodash';
12
+ import type { kSearchModelState } from './model'
13
+ import type { chunkModelState } from '../knowledge-chunk/model'
14
+ interface chunkProps {
15
+ dispatch: Dispatch;
16
+ kSearchModel: kSearchModelState;
17
+ chunkModel: chunkModelState;
18
+ kb_id: string
19
+ }
20
+ const Index: React.FC<chunkProps> = ({ kSearchModel, chunkModel, dispatch, kb_id }) => {
21
+
22
+ const { data = [], total, loading, d_list = [], question, doc_ids, pagination, } = kSearchModel
23
+ const { chunk_id, doc_id, isShowCreateModal } = chunkModel
24
+ const getChunkList = () => {
25
+ dispatch({
26
+ type: 'kSearchModel/updateState',
27
+ payload: {
28
+ loading: true
29
+ }
30
+ });
31
+ interface payloadType {
32
+ kb_id: string;
33
+ question?: string;
34
+ doc_ids: any[];
35
+ similarity_threshold?: number
36
+ }
37
+ const payload: payloadType = {
38
+ kb_id,
39
+ question,
40
+ doc_ids,
41
+ similarity_threshold: 0.1
42
+ }
43
+ dispatch({
44
+ type: 'kSearchModel/chunk_list',
45
+ payload: {
46
+ ...payload,
47
+ ...pagination
48
+ }
49
+ });
50
+ }
51
+ const confirm = (id: string) => {
52
+ console.log(id)
53
+ dispatch({
54
+ type: 'kSearchModel/rm_chunk',
55
+ payload: {
56
+ chunk_ids: [id]
57
+ },
58
+ callback: getChunkList
59
+ });
60
+ };
61
+ const handleEditchunk = (item: any) => {
62
+ const { chunk_id, doc_id } = item
63
+ dispatch({
64
+ type: 'chunkModel/updateState',
65
+ payload: {
66
+ isShowCreateModal: true,
67
+ chunk_id,
68
+ doc_id
69
+ },
70
+ callback: getChunkList
71
+ });
72
+ }
73
+ const onShowSizeChange: PaginationProps['onShowSizeChange'] = (page, size) => {
74
+ dispatch({
75
+ type: 'kSearchModel/updateState',
76
+ payload: {
77
+ pagination: { page, size }
78
+ }
79
+ });
80
+ };
81
+ useEffect(() => {
82
+ dispatch({
83
+ type: 'kSearchModel/updateState',
84
+ payload: {
85
+ loading: false,
86
+ doc_ids: [],
87
+ question: ""
88
+ }
89
+ });
90
+ dispatch({
91
+ type: 'kSearchModel/getKfList',
92
+ payload: {
93
+ kb_id
94
+ }
95
+
96
+ });
97
+ }, [])
98
+ const switchChunk = (item: any, available_int: boolean) => {
99
+ const { chunk_id, doc_id } = item
100
+ dispatch({
101
+ type: 'kSearchModel/updateState',
102
+ payload: {
103
+ loading: true
104
+ }
105
+ });
106
+ dispatch({
107
+ type: 'kSearchModel/switch_chunk',
108
+ payload: {
109
+ chunk_ids: [chunk_id],
110
+ doc_id,
111
+ available_int
112
+ },
113
+ callback: getChunkList
114
+ });
115
+ }
116
+
117
+
118
+ useEffect(() => {
119
+ getChunkList()
120
+ }, [doc_ids, pagination, question])
121
+ const debounceChange = debounce((value) => {
122
+ dispatch({
123
+ type: 'kSearchModel/updateState',
124
+ payload: {
125
+ question: value
126
+ }
127
+ });
128
+ }, 300)
129
+ const debounceCallback = useCallback((value: string) => debounceChange(value), [])
130
+ const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
131
+ const value = e.target.value
132
+ debounceCallback(value)
133
+ }
134
+ const handleSelectChange = (value:
135
+ any[]) => {
136
+ dispatch({
137
+ type: 'kSearchModel/updateState',
138
+ payload: {
139
+ doc_ids: value
140
+ }
141
+ });
142
+ }
143
+ console.log('loading', loading)
144
+ return (<>
145
+ <div className={styles.chunkPage}>
146
+ <div className={styles.filter}>
147
+ <Select
148
+ showSearch
149
+ placeholder="文件列表"
150
+ optionFilterProp="children"
151
+ onChange={handleSelectChange}
152
+ style={{ width: 300, marginBottom: 20 }}
153
+ options={d_list}
154
+ fieldNames={{ label: 'name', value: 'id' }}
155
+ mode='multiple'
156
+ />
157
+
158
+ <Input.TextArea autoSize={{ minRows: 6, maxRows: 6 }} placeholder="搜索" style={{ width: 300 }} allowClear onChange={handleInputChange} />
159
+
160
+ </div>
161
+ <div className={styles.pageContainer}>
162
+ <div className={styles.pageContent}>
163
+ <Spin spinning={loading} className={styles.spin} size='large'>
164
+ <Row gutter={{ xs: 8, sm: 16, md: 24, lg: 24 }} >
165
+ {
166
+ data.map((item: any) => {
167
+ return (<Col className="gutter-row" key={item.chunk_id} xs={24} sm={12} md={12} lg={8}>
168
+ <Card className={styles.card}
169
+ onClick={() => { handleEditchunk(item) }}
170
+ >
171
+ <img style={{ width: '50px' }} src={`${api_host}/document/image/${item.img_id}`} alt="" />
172
+ <div className={styles.container}>
173
+ <div className={styles.content}>
174
+ <span className={styles.context}>
175
+ {item.content_ltks}
176
+ </span>
177
+ <span className={styles.delete}>
178
+ <Switch size="small" defaultValue={item.doc_ids == '1'} onChange={(checked: boolean, e: any) => {
179
+ e.stopPropagation();
180
+ e.nativeEvent.stopImmediatePropagation(); switchChunk(item, checked)
181
+ }} />
182
+ </span>
183
+ </div>
184
+ <div className={styles.footer}>
185
+ <span className={styles.text}>
186
+ <MinusSquareOutlined />{item.doc_num}文档
187
+ </span>
188
+ <span className={styles.text}>
189
+ <MinusSquareOutlined />{item.chunk_num}个
190
+ </span>
191
+ <span className={styles.text}>
192
+ <MinusSquareOutlined />{item.token_num}千字符
193
+ </span>
194
+ <span style={{ float: 'right' }}>
195
+ <Popconfirm
196
+ title="Delete the task"
197
+ description="Are you sure to delete this task?"
198
+ onConfirm={(e: any) => {
199
+ e.stopPropagation();
200
+ e.nativeEvent.stopImmediatePropagation()
201
+ console.log(confirm)
202
+ confirm(item.chunk_id)
203
+
204
+ }}
205
+ okText="Yes"
206
+ cancelText="No"
207
+ >
208
+ <DeleteOutlined onClick={(e) => {
209
+ e.stopPropagation();
210
+ e.nativeEvent.stopImmediatePropagation()
211
+ }} />
212
+ </Popconfirm>
213
+
214
+ </span>
215
+ </div>
216
+
217
+ </div>
218
+ </Card>
219
+ </Col>)
220
+ })
221
+ }
222
+ </Row>
223
+ </Spin>
224
+
225
+ </div>
226
+ <div className={styles.pageFooter}>
227
+ <Pagination
228
+ responsive
229
+ showLessItems
230
+ showQuickJumper
231
+ showSizeChanger
232
+ onChange={onShowSizeChange}
233
+ defaultPageSize={30}
234
+ pageSizeOptions={[30, 60, 90]}
235
+ defaultCurrent={pagination.page}
236
+ total={total}
237
+ />
238
+ </div>
239
+ </div>
240
+
241
+ </div >
242
+ <CreateModal getChunkList={getChunkList} isShowCreateModal={isShowCreateModal} chunk_id={chunk_id} doc_id={doc_id} />
243
+ </>
244
+ )
245
+ };
246
+
247
+ export default connect(({ kSearchModel, chunkModel, loading }) => ({ kSearchModel, chunkModel, loading }))(Index);
web/src/pages/add-knowledge/components/knowledge-search/model.ts ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Effect, Reducer, Subscription } from 'umi'
2
+ import { message } from 'antd';
3
+ import kbService from '@/services/kbService';
4
+
5
+ export interface kSearchModelState {
6
+ loading: boolean;
7
+ data: any[];
8
+ total: number;
9
+ isShowCreateModal: boolean;
10
+ chunk_id: string;
11
+ chunkInfo: any;
12
+ d_list: any[];
13
+ question: string;
14
+ doc_ids: any[];
15
+ pagination: any;
16
+ doc_id: string
17
+
18
+ }
19
+ export interface chunkgModelType {
20
+ namespace: 'kSearchModel';
21
+ state: kSearchModelState;
22
+ effects: {
23
+ chunk_list: Effect;
24
+ get_chunk: Effect;
25
+ create_hunk: Effect;
26
+ switch_chunk: Effect;
27
+ rm_chunk: Effect;
28
+ getKfList: Effect;
29
+ };
30
+ reducers: {
31
+ updateState: Reducer<kSearchModelState>;
32
+ };
33
+ subscriptions: { setup: Subscription };
34
+ }
35
+ const Model: chunkgModelType = {
36
+ namespace: 'kSearchModel',
37
+ state: {
38
+ loading: false,
39
+ data: [],
40
+ total: 0,
41
+ isShowCreateModal: false,
42
+ chunk_id: '',
43
+ chunkInfo: {},
44
+ d_list: [],
45
+ question: '',
46
+ doc_ids: [],
47
+ pagination: { page: 1, size: 30 },
48
+ doc_id: ''
49
+ },
50
+ subscriptions: {
51
+ setup({ dispatch, history }) {
52
+ history.listen(location => {
53
+ console.log(location)
54
+ });
55
+ }
56
+ },
57
+ effects: {
58
+ *getKfList({ payload = {} }, { call, put }) {
59
+ const { data, response } = yield call(kbService.get_document_list, payload);
60
+
61
+ const { retcode, data: res, retmsg } = data
62
+ if (retcode === 0) {
63
+ yield put({
64
+ type: 'updateState',
65
+ payload: {
66
+ d_list: res
67
+ }
68
+ });
69
+ }
70
+ },
71
+ * chunk_list({ payload = {}, callback }, { call, put }) {
72
+ const { data, response } = yield call(kbService.retrieval_test, payload);
73
+ const { retcode, data: res, retmsg } = data
74
+ if (retcode === 0) {
75
+ console.log(res)
76
+ yield put({
77
+ type: 'updateState',
78
+ payload: {
79
+ data: res.chunks,
80
+ total: res.total,
81
+ loading: false
82
+ }
83
+ });
84
+ callback && callback()
85
+
86
+ }
87
+ },
88
+ *switch_chunk({ payload = {}, callback }, { call, put }) {
89
+ const { data, response } = yield call(kbService.switch_chunk, payload);
90
+ const { retcode, data: res, retmsg } = data
91
+ if (retcode === 0) {
92
+ callback && callback()
93
+
94
+ }
95
+ },
96
+ *rm_chunk({ payload = {}, callback }, { call, put }) {
97
+ console.log('shanchu')
98
+ const { data, response } = yield call(kbService.rm_chunk, payload);
99
+ const { retcode, data: res, retmsg } = data
100
+ if (retcode === 0) {
101
+ callback && callback()
102
+
103
+ }
104
+ },
105
+ * get_chunk({ payload = {}, callback }, { call, put }) {
106
+ const { data, response } = yield call(kbService.get_chunk, payload);
107
+ const { retcode, data: res, retmsg } = data
108
+ if (retcode === 0) {
109
+
110
+ yield put({
111
+ type: 'updateState',
112
+ payload: {
113
+ chunkInfo: res
114
+ }
115
+ });
116
+ callback && callback(res)
117
+
118
+ }
119
+ },
120
+ *create_hunk({ payload = {} }, { call, put }) {
121
+ yield put({
122
+ type: 'updateState',
123
+ payload: {
124
+ loading: true
125
+ }
126
+ });
127
+ let service = kbService.create_chunk
128
+ if (payload.chunk_id) {
129
+ service = kbService.set_chunk
130
+ }
131
+ const { data, response } = yield call(service, payload);
132
+ const { retcode, data: res, retmsg } = data
133
+ yield put({
134
+ type: 'updateState',
135
+ payload: {
136
+ loading: false
137
+ }
138
+ });
139
+ if (retcode === 0) {
140
+ yield put({
141
+ type: 'updateState',
142
+ payload: {
143
+ isShowCreateModal: false
144
+ }
145
+ });
146
+ }
147
+ },
148
+ },
149
+ reducers: {
150
+ updateState(state, { payload }) {
151
+ return {
152
+ ...state,
153
+ ...payload
154
+ };
155
+ }
156
+ }
157
+ };
158
+ export default Model;
web/src/pages/add-knowledge/index.tsx CHANGED
@@ -1,5 +1,5 @@
1
  import { connect, useNavigate, useLocation, Dispatch } from 'umi'
2
- import React, { useState, useEffect } from 'react';
3
  import type { MenuProps } from 'antd';
4
  import { Menu } from 'antd';
5
  import {
@@ -70,8 +70,10 @@ const Index: React.FC<kAProps> = ({ kAModel, dispatch }) => {
70
  label: React.ReactNode,
71
  key: React.Key,
72
  icon?: React.ReactNode,
 
73
  children?: MenuItem[],
74
  type?: 'group',
 
75
  ): MenuItem {
76
  return {
77
  key,
@@ -79,13 +81,17 @@ const Index: React.FC<kAProps> = ({ kAModel, dispatch }) => {
79
  children,
80
  label,
81
  type,
 
82
  } as MenuItem;
83
  }
84
- const items: MenuItem[] = [
85
- getItem('配置', 'setting', <ToolOutlined />),
86
- getItem('知识库', 'file', <BarsOutlined />),
87
- getItem('搜索测试', 'search', <SearchOutlined />),
88
- ];
 
 
 
89
  const handleSelect: MenuProps['onSelect'] = (e) => {
90
  navigate(`/knowledge/add/setting?activeKey=${e.key}&id=${id}`);
91
  }
@@ -105,7 +111,7 @@ const Index: React.FC<kAProps> = ({ kAModel, dispatch }) => {
105
  <div className={styles.content}>
106
  {activeKey === 'file' && !doc_id && <File kb_id={id} />}
107
  {activeKey === 'setting' && <Setting kb_id={id} />}
108
- {activeKey === 'search' && <Search />}
109
  {activeKey === 'file' && !!doc_id && <Chunk doc_id={doc_id} />}
110
 
111
  </div>
 
1
  import { connect, useNavigate, useLocation, Dispatch } from 'umi'
2
+ import React, { useState, useEffect, useMemo } from 'react';
3
  import type { MenuProps } from 'antd';
4
  import { Menu } from 'antd';
5
  import {
 
70
  label: React.ReactNode,
71
  key: React.Key,
72
  icon?: React.ReactNode,
73
+ disabled?: boolean,
74
  children?: MenuItem[],
75
  type?: 'group',
76
+
77
  ): MenuItem {
78
  return {
79
  key,
 
81
  children,
82
  label,
83
  type,
84
+ disabled
85
  } as MenuItem;
86
  }
87
+ const items: MenuItem[] = useMemo(() => {
88
+ const disabled = !id
89
+ return [
90
+ getItem('配置', 'setting', <ToolOutlined />),
91
+ getItem('知识库', 'file', <BarsOutlined />, disabled),
92
+ getItem('搜索测试', 'search', <SearchOutlined />, disabled),
93
+ ]
94
+ }, [id]);
95
  const handleSelect: MenuProps['onSelect'] = (e) => {
96
  navigate(`/knowledge/add/setting?activeKey=${e.key}&id=${id}`);
97
  }
 
111
  <div className={styles.content}>
112
  {activeKey === 'file' && !doc_id && <File kb_id={id} />}
113
  {activeKey === 'setting' && <Setting kb_id={id} />}
114
+ {activeKey === 'search' && <Search kb_id={id} />}
115
  {activeKey === 'file' && !!doc_id && <Chunk doc_id={doc_id} />}
116
 
117
  </div>
web/src/pages/login/index.tsx CHANGED
@@ -79,9 +79,9 @@ const View: FC<LoginProps> = ({
79
  {...formItemLayout}
80
  name="email"
81
  label="Email"
82
- rules={[{ required: true, message: 'Please input your name' }]}
83
  >
84
- <Input size='large' placeholder="Please input your name" />
85
  </Form.Item>
86
  {
87
  title === 'register' && <Form.Item
@@ -97,9 +97,9 @@ const View: FC<LoginProps> = ({
97
  {...formItemLayout}
98
  name="password"
99
  label="Password"
100
- rules={[{ required: true, message: 'Please input your name' }]}
101
  >
102
- <Input size='large' placeholder="Please input your name" />
103
  </Form.Item>
104
  {
105
  title === 'login' && <Form.Item
 
79
  {...formItemLayout}
80
  name="email"
81
  label="Email"
82
+ rules={[{ required: true, message: 'Please input value' }]}
83
  >
84
+ <Input size='large' placeholder="Please input value" />
85
  </Form.Item>
86
  {
87
  title === 'register' && <Form.Item
 
97
  {...formItemLayout}
98
  name="password"
99
  label="Password"
100
+ rules={[{ required: true, message: 'Please input value' }]}
101
  >
102
+ <Input size='large' placeholder="Please input value" />
103
  </Form.Item>
104
  {
105
  title === 'login' && <Form.Item
web/src/pages/setting/CPwModal.tsx CHANGED
@@ -71,7 +71,7 @@ const Index: FC<CPwModalProps> = ({ settingModel, dispatch }) => {
71
  <Form.Item<FieldType>
72
  label="旧密码"
73
  name="password"
74
- rules={[{ required: true, message: 'Please input your password!' }]}
75
  >
76
  <Input.Password />
77
  </Form.Item>
 
71
  <Form.Item<FieldType>
72
  label="旧密码"
73
  name="password"
74
+ rules={[{ required: true, message: 'Please input value' }]}
75
  >
76
  <Input.Password />
77
  </Form.Item>
web/src/pages/setting/SSModal.tsx CHANGED
@@ -76,7 +76,7 @@ const Index: FC<SSModalProps> = ({ settingModel, dispatch }) => {
76
  <Form.Item<FieldType>
77
  label="embedding 模型"
78
  name="embd_id"
79
- rules={[{ required: true, message: 'Please input your password!' }]}
80
  initialValue={tenantIfo.embd_id}
81
 
82
  >
@@ -93,7 +93,7 @@ const Index: FC<SSModalProps> = ({ settingModel, dispatch }) => {
93
  <Form.Item<FieldType>
94
  label="chat 模型"
95
  name="llm_id"
96
- rules={[{ required: true, message: 'Please input your password!' }]}
97
  initialValue={tenantIfo.llm_id}
98
 
99
  >
@@ -110,7 +110,7 @@ const Index: FC<SSModalProps> = ({ settingModel, dispatch }) => {
110
  <Form.Item<FieldType>
111
  label="image2text 模型"
112
  name="img2txt_id"
113
- rules={[{ required: true, message: 'Please input your password!' }]}
114
  initialValue={tenantIfo.img2txt_id}
115
 
116
  >
@@ -127,7 +127,7 @@ const Index: FC<SSModalProps> = ({ settingModel, dispatch }) => {
127
  <Form.Item<FieldType>
128
  label="speech2text 模型"
129
  name="asr_id"
130
- rules={[{ required: true, message: 'Please input your password!' }]}
131
  initialValue={tenantIfo.asr_id}
132
 
133
  >
 
76
  <Form.Item<FieldType>
77
  label="embedding 模型"
78
  name="embd_id"
79
+ rules={[{ required: true, message: 'Please input value' }]}
80
  initialValue={tenantIfo.embd_id}
81
 
82
  >
 
93
  <Form.Item<FieldType>
94
  label="chat 模型"
95
  name="llm_id"
96
+ rules={[{ required: true, message: 'Please input value' }]}
97
  initialValue={tenantIfo.llm_id}
98
 
99
  >
 
110
  <Form.Item<FieldType>
111
  label="image2text 模型"
112
  name="img2txt_id"
113
+ rules={[{ required: true, message: 'Please input value' }]}
114
  initialValue={tenantIfo.img2txt_id}
115
 
116
  >
 
127
  <Form.Item<FieldType>
128
  label="speech2text 模型"
129
  name="asr_id"
130
+ rules={[{ required: true, message: 'Please input value' }]}
131
  initialValue={tenantIfo.asr_id}
132
 
133
  >
web/src/services/kbService.ts CHANGED
@@ -16,7 +16,10 @@ const {
16
  chunk_list,
17
  create_chunk,
18
  set_chunk,
19
- get_chunk, switch_chunk, rm_chunk } = api;
 
 
 
20
  interface kbService {
21
  createKb: () => void;
22
  updateKb: () => void;
@@ -34,6 +37,7 @@ interface kbService {
34
  get_chunk: () => void;
35
  switch_chunk: () => void;
36
  rm_chunk: () => void;
 
37
  }
38
  const kbService: kbService = registerServer(
39
  {
@@ -104,7 +108,10 @@ const kbService: kbService = registerServer(
104
  url: rm_chunk,
105
  method: 'post'
106
  },
107
-
 
 
 
108
  },
109
  request
110
  );
 
16
  chunk_list,
17
  create_chunk,
18
  set_chunk,
19
+ get_chunk,
20
+ switch_chunk,
21
+ rm_chunk,
22
+ retrieval_test } = api;
23
  interface kbService {
24
  createKb: () => void;
25
  updateKb: () => void;
 
37
  get_chunk: () => void;
38
  switch_chunk: () => void;
39
  rm_chunk: () => void;
40
+ retrieval_test: () => void;
41
  }
42
  const kbService: kbService = registerServer(
43
  {
 
108
  url: rm_chunk,
109
  method: 'post'
110
  },
111
+ retrieval_test: {
112
+ url: retrieval_test,
113
+ method: 'post'
114
+ },
115
  },
116
  request
117
  );
web/src/utils/api.ts CHANGED
@@ -39,6 +39,8 @@ export default {
39
  get_chunk: `${api_host}/chunk/get`,
40
  switch_chunk: `${api_host}/chunk/switch`,
41
  rm_chunk: `${api_host}/chunk/rm`,
 
 
42
 
43
 
44
 
 
39
  get_chunk: `${api_host}/chunk/get`,
40
  switch_chunk: `${api_host}/chunk/switch`,
41
  rm_chunk: `${api_host}/chunk/rm`,
42
+ retrieval_test: `${api_host}/chunk/retrieval_test`,
43
+
44
 
45
 
46