balibabu
commited on
Commit
·
1ea3843
1
Parent(s):
e92bd36
feat: Create a conversation before uploading files in it #1880 (#2057)
Browse files### What problem does this PR solve?
feat: Create a conversation before uploading files in it #1880
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- web/src/components/message-input/index.tsx +80 -19
- web/src/hooks/chat-hooks.ts +17 -0
- web/src/hooks/document-hooks.ts +32 -0
- web/src/pages/chat/chat-container/index.tsx +8 -1
- web/src/pages/chat/hooks.ts +25 -0
- web/src/pages/chat/share/large.tsx +1 -1
- web/src/services/chat-service.ts +5 -0
- web/src/services/knowledge-service.ts +5 -0
- web/src/utils/api.ts +2 -0
web/src/components/message-input/index.tsx
CHANGED
|
@@ -1,11 +1,10 @@
|
|
| 1 |
-
import { Authorization } from '@/constants/authorization';
|
| 2 |
import { useTranslate } from '@/hooks/common-hooks';
|
| 3 |
import {
|
| 4 |
useDeleteDocument,
|
| 5 |
useFetchDocumentInfosByIds,
|
| 6 |
useRemoveNextDocument,
|
|
|
|
| 7 |
} from '@/hooks/document-hooks';
|
| 8 |
-
import { getAuthorization } from '@/utils/authorization-util';
|
| 9 |
import { getExtension } from '@/utils/document-util';
|
| 10 |
import { formatBytes } from '@/utils/file-util';
|
| 11 |
import {
|
|
@@ -28,7 +27,14 @@ import {
|
|
| 28 |
} from 'antd';
|
| 29 |
import classNames from 'classnames';
|
| 30 |
import get from 'lodash/get';
|
| 31 |
-
import {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
import FileIcon from '../file-icon';
|
| 33 |
import SvgIcon from '../svg-icon';
|
| 34 |
import styles from './index.less';
|
|
@@ -64,9 +70,10 @@ interface IProps {
|
|
| 64 |
onPressEnter(documentIds: string[]): void;
|
| 65 |
onInputChange: ChangeEventHandler<HTMLInputElement>;
|
| 66 |
conversationId: string;
|
| 67 |
-
|
| 68 |
isShared?: boolean;
|
| 69 |
showUploadIcon?: boolean;
|
|
|
|
| 70 |
}
|
| 71 |
|
| 72 |
const getBase64 = (file: FileType): Promise<string> =>
|
|
@@ -87,12 +94,15 @@ const MessageInput = ({
|
|
| 87 |
onInputChange,
|
| 88 |
conversationId,
|
| 89 |
showUploadIcon = true,
|
| 90 |
-
|
|
|
|
| 91 |
}: IProps) => {
|
| 92 |
const { t } = useTranslate('chat');
|
| 93 |
const { removeDocument } = useRemoveNextDocument();
|
| 94 |
const { deleteDocument } = useDeleteDocument();
|
| 95 |
const { data: documentInfos, setDocumentIds } = useFetchDocumentInfosByIds();
|
|
|
|
|
|
|
| 96 |
|
| 97 |
const [fileList, setFileList] = useState<UploadFile[]>([]);
|
| 98 |
|
|
@@ -102,9 +112,44 @@ const MessageInput = ({
|
|
| 102 |
}
|
| 103 |
};
|
| 104 |
|
| 105 |
-
const handleChange: UploadProps['onChange'] = ({
|
| 106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
};
|
|
|
|
| 108 |
const isUploadingFile = fileList.some((x) => x.status === 'uploading');
|
| 109 |
|
| 110 |
const handlePressEnter = useCallback(async () => {
|
|
@@ -150,6 +195,16 @@ const MessageInput = ({
|
|
| 150 |
setDocumentIds(ids);
|
| 151 |
}, [fileList, setDocumentIds]);
|
| 152 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
return (
|
| 154 |
<Flex gap={20} vertical className={styles.messageInputWrapper}>
|
| 155 |
<Input
|
|
@@ -160,18 +215,22 @@ const MessageInput = ({
|
|
| 160 |
className={classNames({ [styles.inputWrapper]: fileList.length === 0 })}
|
| 161 |
suffix={
|
| 162 |
<Space>
|
| 163 |
-
{
|
| 164 |
<Upload
|
| 165 |
-
action={uploadUrl}
|
| 166 |
-
fileList={fileList}
|
| 167 |
onPreview={handlePreview}
|
| 168 |
onChange={handleChange}
|
| 169 |
-
multiple
|
| 170 |
-
headers={{ [Authorization]: getAuthorization() }}
|
| 171 |
-
data={{ conversation_id: conversationId }}
|
| 172 |
-
method="post"
|
| 173 |
onRemove={handleRemove}
|
| 174 |
showUploadList={false}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 175 |
>
|
| 176 |
<Button
|
| 177 |
type={'text'}
|
|
@@ -209,8 +268,10 @@ const MessageInput = ({
|
|
| 209 |
dataSource={fileList}
|
| 210 |
className={styles.listWrapper}
|
| 211 |
renderItem={(item) => {
|
| 212 |
-
const fileExtension = getExtension(item.name);
|
| 213 |
const id = getFileId(item);
|
|
|
|
|
|
|
|
|
|
| 214 |
|
| 215 |
return (
|
| 216 |
<List.Item>
|
|
@@ -228,14 +289,14 @@ const MessageInput = ({
|
|
| 228 |
// width={30}
|
| 229 |
></InfoCircleOutlined>
|
| 230 |
) : (
|
| 231 |
-
<FileIcon id={id} name={
|
| 232 |
)}
|
| 233 |
<Flex vertical style={{ width: '90%' }}>
|
| 234 |
<Text
|
| 235 |
-
ellipsis={{ tooltip:
|
| 236 |
className={styles.nameText}
|
| 237 |
>
|
| 238 |
-
<b> {
|
| 239 |
</Text>
|
| 240 |
{isUploadError(item) ? (
|
| 241 |
t('uploadFailed')
|
|
@@ -275,4 +336,4 @@ const MessageInput = ({
|
|
| 275 |
);
|
| 276 |
};
|
| 277 |
|
| 278 |
-
export default MessageInput;
|
|
|
|
|
|
|
| 1 |
import { useTranslate } from '@/hooks/common-hooks';
|
| 2 |
import {
|
| 3 |
useDeleteDocument,
|
| 4 |
useFetchDocumentInfosByIds,
|
| 5 |
useRemoveNextDocument,
|
| 6 |
+
useUploadAndParseDocument,
|
| 7 |
} from '@/hooks/document-hooks';
|
|
|
|
| 8 |
import { getExtension } from '@/utils/document-util';
|
| 9 |
import { formatBytes } from '@/utils/file-util';
|
| 10 |
import {
|
|
|
|
| 27 |
} from 'antd';
|
| 28 |
import classNames from 'classnames';
|
| 29 |
import get from 'lodash/get';
|
| 30 |
+
import {
|
| 31 |
+
ChangeEventHandler,
|
| 32 |
+
memo,
|
| 33 |
+
useCallback,
|
| 34 |
+
useEffect,
|
| 35 |
+
useRef,
|
| 36 |
+
useState,
|
| 37 |
+
} from 'react';
|
| 38 |
import FileIcon from '../file-icon';
|
| 39 |
import SvgIcon from '../svg-icon';
|
| 40 |
import styles from './index.less';
|
|
|
|
| 70 |
onPressEnter(documentIds: string[]): void;
|
| 71 |
onInputChange: ChangeEventHandler<HTMLInputElement>;
|
| 72 |
conversationId: string;
|
| 73 |
+
uploadMethod?: string;
|
| 74 |
isShared?: boolean;
|
| 75 |
showUploadIcon?: boolean;
|
| 76 |
+
createConversationBeforeUploadDocument?(message: string): Promise<any>;
|
| 77 |
}
|
| 78 |
|
| 79 |
const getBase64 = (file: FileType): Promise<string> =>
|
|
|
|
| 94 |
onInputChange,
|
| 95 |
conversationId,
|
| 96 |
showUploadIcon = true,
|
| 97 |
+
createConversationBeforeUploadDocument,
|
| 98 |
+
uploadMethod = 'upload_and_parse',
|
| 99 |
}: IProps) => {
|
| 100 |
const { t } = useTranslate('chat');
|
| 101 |
const { removeDocument } = useRemoveNextDocument();
|
| 102 |
const { deleteDocument } = useDeleteDocument();
|
| 103 |
const { data: documentInfos, setDocumentIds } = useFetchDocumentInfosByIds();
|
| 104 |
+
const { uploadAndParseDocument } = useUploadAndParseDocument(uploadMethod);
|
| 105 |
+
const conversationIdRef = useRef(conversationId);
|
| 106 |
|
| 107 |
const [fileList, setFileList] = useState<UploadFile[]>([]);
|
| 108 |
|
|
|
|
| 112 |
}
|
| 113 |
};
|
| 114 |
|
| 115 |
+
const handleChange: UploadProps['onChange'] = async ({
|
| 116 |
+
// fileList: newFileList,
|
| 117 |
+
file,
|
| 118 |
+
}) => {
|
| 119 |
+
let nextConversationId: string = conversationId;
|
| 120 |
+
if (createConversationBeforeUploadDocument && !conversationId) {
|
| 121 |
+
const creatingRet = await createConversationBeforeUploadDocument(
|
| 122 |
+
file.name,
|
| 123 |
+
);
|
| 124 |
+
if (creatingRet.retcode === 0) {
|
| 125 |
+
nextConversationId = creatingRet.data.id;
|
| 126 |
+
}
|
| 127 |
+
}
|
| 128 |
+
setFileList((list) => {
|
| 129 |
+
list.push({
|
| 130 |
+
...file,
|
| 131 |
+
status: 'uploading',
|
| 132 |
+
originFileObj: file as any,
|
| 133 |
+
});
|
| 134 |
+
return [...list];
|
| 135 |
+
});
|
| 136 |
+
const ret = await uploadAndParseDocument({
|
| 137 |
+
conversationId: nextConversationId,
|
| 138 |
+
fileList: [file],
|
| 139 |
+
});
|
| 140 |
+
setFileList((list) => {
|
| 141 |
+
const nextList = list.filter((x) => x.uid !== file.uid);
|
| 142 |
+
nextList.push({
|
| 143 |
+
...file,
|
| 144 |
+
originFileObj: file as any,
|
| 145 |
+
response: ret,
|
| 146 |
+
percent: 100,
|
| 147 |
+
status: ret?.retcode === 0 ? 'done' : 'error',
|
| 148 |
+
});
|
| 149 |
+
return nextList;
|
| 150 |
+
});
|
| 151 |
};
|
| 152 |
+
|
| 153 |
const isUploadingFile = fileList.some((x) => x.status === 'uploading');
|
| 154 |
|
| 155 |
const handlePressEnter = useCallback(async () => {
|
|
|
|
| 195 |
setDocumentIds(ids);
|
| 196 |
}, [fileList, setDocumentIds]);
|
| 197 |
|
| 198 |
+
useEffect(() => {
|
| 199 |
+
if (
|
| 200 |
+
conversationIdRef.current &&
|
| 201 |
+
conversationId !== conversationIdRef.current
|
| 202 |
+
) {
|
| 203 |
+
setFileList([]);
|
| 204 |
+
}
|
| 205 |
+
conversationIdRef.current = conversationId;
|
| 206 |
+
}, [conversationId, setFileList]);
|
| 207 |
+
|
| 208 |
return (
|
| 209 |
<Flex gap={20} vertical className={styles.messageInputWrapper}>
|
| 210 |
<Input
|
|
|
|
| 215 |
className={classNames({ [styles.inputWrapper]: fileList.length === 0 })}
|
| 216 |
suffix={
|
| 217 |
<Space>
|
| 218 |
+
{showUploadIcon && (
|
| 219 |
<Upload
|
| 220 |
+
// action={uploadUrl}
|
| 221 |
+
// fileList={fileList}
|
| 222 |
onPreview={handlePreview}
|
| 223 |
onChange={handleChange}
|
| 224 |
+
multiple={false}
|
| 225 |
+
// headers={{ [Authorization]: getAuthorization() }}
|
| 226 |
+
// data={{ conversation_id: conversationId }}
|
| 227 |
+
// method="post"
|
| 228 |
onRemove={handleRemove}
|
| 229 |
showUploadList={false}
|
| 230 |
+
beforeUpload={(file, fileList) => {
|
| 231 |
+
console.log('🚀 ~ beforeUpload:', fileList);
|
| 232 |
+
return false;
|
| 233 |
+
}}
|
| 234 |
>
|
| 235 |
<Button
|
| 236 |
type={'text'}
|
|
|
|
| 268 |
dataSource={fileList}
|
| 269 |
className={styles.listWrapper}
|
| 270 |
renderItem={(item) => {
|
|
|
|
| 271 |
const id = getFileId(item);
|
| 272 |
+
const documentInfo = getDocumentInfoById(id);
|
| 273 |
+
const fileExtension = getExtension(documentInfo?.name ?? '');
|
| 274 |
+
const fileName = item.originFileObj?.name ?? '';
|
| 275 |
|
| 276 |
return (
|
| 277 |
<List.Item>
|
|
|
|
| 289 |
// width={30}
|
| 290 |
></InfoCircleOutlined>
|
| 291 |
) : (
|
| 292 |
+
<FileIcon id={id} name={fileName}></FileIcon>
|
| 293 |
)}
|
| 294 |
<Flex vertical style={{ width: '90%' }}>
|
| 295 |
<Text
|
| 296 |
+
ellipsis={{ tooltip: fileName }}
|
| 297 |
className={styles.nameText}
|
| 298 |
>
|
| 299 |
+
<b> {fileName}</b>
|
| 300 |
</Text>
|
| 301 |
{isUploadError(item) ? (
|
| 302 |
t('uploadFailed')
|
|
|
|
| 336 |
);
|
| 337 |
};
|
| 338 |
|
| 339 |
+
export default memo(MessageInput);
|
web/src/hooks/chat-hooks.ts
CHANGED
|
@@ -125,6 +125,23 @@ export const useUpdateConversation = () => {
|
|
| 125 |
return updateConversation;
|
| 126 |
};
|
| 127 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
export const useSetDialog = () => {
|
| 129 |
const dispatch = useDispatch();
|
| 130 |
|
|
|
|
| 125 |
return updateConversation;
|
| 126 |
};
|
| 127 |
|
| 128 |
+
export const useUpdateNextConversation = () => {
|
| 129 |
+
const {
|
| 130 |
+
data,
|
| 131 |
+
isPending: loading,
|
| 132 |
+
mutateAsync,
|
| 133 |
+
} = useMutation({
|
| 134 |
+
mutationKey: ['updateConversation'],
|
| 135 |
+
mutationFn: async (params: Record<string, any>) => {
|
| 136 |
+
const { data } = await chatService.setConversation(params);
|
| 137 |
+
|
| 138 |
+
return data;
|
| 139 |
+
},
|
| 140 |
+
});
|
| 141 |
+
|
| 142 |
+
return { data, loading, updateConversation: mutateAsync };
|
| 143 |
+
};
|
| 144 |
+
|
| 145 |
export const useSetDialog = () => {
|
| 146 |
const dispatch = useDispatch();
|
| 147 |
|
web/src/hooks/document-hooks.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
| 1 |
import { IDocumentInfo } from '@/interfaces/database/document';
|
| 2 |
import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge';
|
| 3 |
import { IChangeParserConfigRequestBody } from '@/interfaces/request/document';
|
|
|
|
| 4 |
import kbService from '@/services/knowledge-service';
|
| 5 |
import { api_host } from '@/utils/api';
|
| 6 |
import { buildChunkHighlights } from '@/utils/document-util';
|
|
@@ -333,3 +334,34 @@ export const useDeleteDocument = () => {
|
|
| 333 |
|
| 334 |
return { data, loading, deleteDocument: mutateAsync };
|
| 335 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import { IDocumentInfo } from '@/interfaces/database/document';
|
| 2 |
import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge';
|
| 3 |
import { IChangeParserConfigRequestBody } from '@/interfaces/request/document';
|
| 4 |
+
import chatService from '@/services/chat-service';
|
| 5 |
import kbService from '@/services/knowledge-service';
|
| 6 |
import { api_host } from '@/utils/api';
|
| 7 |
import { buildChunkHighlights } from '@/utils/document-util';
|
|
|
|
| 334 |
|
| 335 |
return { data, loading, deleteDocument: mutateAsync };
|
| 336 |
};
|
| 337 |
+
|
| 338 |
+
export const useUploadAndParseDocument = (uploadMethod: string) => {
|
| 339 |
+
const {
|
| 340 |
+
data,
|
| 341 |
+
isPending: loading,
|
| 342 |
+
mutateAsync,
|
| 343 |
+
} = useMutation({
|
| 344 |
+
mutationKey: ['uploadAndParseDocument'],
|
| 345 |
+
mutationFn: async ({
|
| 346 |
+
conversationId,
|
| 347 |
+
fileList,
|
| 348 |
+
}: {
|
| 349 |
+
conversationId: string;
|
| 350 |
+
fileList: UploadFile[];
|
| 351 |
+
}) => {
|
| 352 |
+
const formData = new FormData();
|
| 353 |
+
formData.append('conversation_id', conversationId);
|
| 354 |
+
fileList.forEach((file: UploadFile) => {
|
| 355 |
+
formData.append('file', file as any);
|
| 356 |
+
});
|
| 357 |
+
if (uploadMethod === 'upload_and_parse') {
|
| 358 |
+
const data = await kbService.upload_and_parse(formData);
|
| 359 |
+
return data?.data;
|
| 360 |
+
}
|
| 361 |
+
const data = await chatService.uploadAndParseExternal(formData);
|
| 362 |
+
return data?.data;
|
| 363 |
+
},
|
| 364 |
+
});
|
| 365 |
+
|
| 366 |
+
return { data, loading, uploadAndParseDocument: mutateAsync };
|
| 367 |
+
};
|
web/src/pages/chat/chat-container/index.tsx
CHANGED
|
@@ -4,6 +4,7 @@ import { MessageType } from '@/constants/chat';
|
|
| 4 |
import { Drawer, Flex, Spin } from 'antd';
|
| 5 |
import {
|
| 6 |
useClickDrawer,
|
|
|
|
| 7 |
useFetchConversationOnMount,
|
| 8 |
useGetFileIcon,
|
| 9 |
useGetSendButtonDisabled,
|
|
@@ -24,6 +25,7 @@ const ChatContainer = () => {
|
|
| 24 |
addNewestConversation,
|
| 25 |
removeLatestMessage,
|
| 26 |
addNewestAnswer,
|
|
|
|
| 27 |
} = useFetchConversationOnMount();
|
| 28 |
const {
|
| 29 |
handleInputChange,
|
|
@@ -43,6 +45,8 @@ const ChatContainer = () => {
|
|
| 43 |
useGetFileIcon();
|
| 44 |
const loading = useSelectConversationLoading();
|
| 45 |
const { data: userInfo } = useFetchUserInfo();
|
|
|
|
|
|
|
| 46 |
|
| 47 |
return (
|
| 48 |
<>
|
|
@@ -78,7 +82,10 @@ const ChatContainer = () => {
|
|
| 78 |
value={value}
|
| 79 |
onInputChange={handleInputChange}
|
| 80 |
onPressEnter={handlePressEnter}
|
| 81 |
-
conversationId={
|
|
|
|
|
|
|
|
|
|
| 82 |
></MessageInput>
|
| 83 |
</Flex>
|
| 84 |
<Drawer
|
|
|
|
| 4 |
import { Drawer, Flex, Spin } from 'antd';
|
| 5 |
import {
|
| 6 |
useClickDrawer,
|
| 7 |
+
useCreateConversationBeforeUploadDocument,
|
| 8 |
useFetchConversationOnMount,
|
| 9 |
useGetFileIcon,
|
| 10 |
useGetSendButtonDisabled,
|
|
|
|
| 25 |
addNewestConversation,
|
| 26 |
removeLatestMessage,
|
| 27 |
addNewestAnswer,
|
| 28 |
+
conversationId,
|
| 29 |
} = useFetchConversationOnMount();
|
| 30 |
const {
|
| 31 |
handleInputChange,
|
|
|
|
| 45 |
useGetFileIcon();
|
| 46 |
const loading = useSelectConversationLoading();
|
| 47 |
const { data: userInfo } = useFetchUserInfo();
|
| 48 |
+
const { createConversationBeforeUploadDocument } =
|
| 49 |
+
useCreateConversationBeforeUploadDocument();
|
| 50 |
|
| 51 |
return (
|
| 52 |
<>
|
|
|
|
| 82 |
value={value}
|
| 83 |
onInputChange={handleInputChange}
|
| 84 |
onPressEnter={handlePressEnter}
|
| 85 |
+
conversationId={conversationId}
|
| 86 |
+
createConversationBeforeUploadDocument={
|
| 87 |
+
createConversationBeforeUploadDocument
|
| 88 |
+
}
|
| 89 |
></MessageInput>
|
| 90 |
</Flex>
|
| 91 |
<Drawer
|
web/src/pages/chat/hooks.ts
CHANGED
|
@@ -520,6 +520,7 @@ export const useFetchConversationOnMount = () => {
|
|
| 520 |
ref,
|
| 521 |
removeLatestMessage,
|
| 522 |
addNewestAnswer,
|
|
|
|
| 523 |
};
|
| 524 |
};
|
| 525 |
|
|
@@ -769,4 +770,28 @@ export const useGetSendButtonDisabled = () => {
|
|
| 769 |
export const useSendButtonDisabled = (value: string) => {
|
| 770 |
return trim(value) === '';
|
| 771 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 772 |
//#endregion
|
|
|
|
| 520 |
ref,
|
| 521 |
removeLatestMessage,
|
| 522 |
addNewestAnswer,
|
| 523 |
+
conversationId,
|
| 524 |
};
|
| 525 |
};
|
| 526 |
|
|
|
|
| 770 |
export const useSendButtonDisabled = (value: string) => {
|
| 771 |
return trim(value) === '';
|
| 772 |
};
|
| 773 |
+
|
| 774 |
+
export const useCreateConversationBeforeUploadDocument = () => {
|
| 775 |
+
const { setConversation } = useSetConversation();
|
| 776 |
+
const { dialogId } = useGetChatSearchParams();
|
| 777 |
+
|
| 778 |
+
const { handleClickConversation } = useClickConversationCard();
|
| 779 |
+
|
| 780 |
+
const createConversationBeforeUploadDocument = useCallback(
|
| 781 |
+
async (message: string) => {
|
| 782 |
+
const data = await setConversation(message);
|
| 783 |
+
if (data.retcode === 0) {
|
| 784 |
+
const id = data.data.id;
|
| 785 |
+
handleClickConversation(id);
|
| 786 |
+
}
|
| 787 |
+
return data;
|
| 788 |
+
},
|
| 789 |
+
[setConversation, handleClickConversation],
|
| 790 |
+
);
|
| 791 |
+
|
| 792 |
+
return {
|
| 793 |
+
createConversationBeforeUploadDocument,
|
| 794 |
+
dialogId,
|
| 795 |
+
};
|
| 796 |
+
};
|
| 797 |
//#endregion
|
web/src/pages/chat/share/large.tsx
CHANGED
|
@@ -75,7 +75,7 @@ const ChatContainer = () => {
|
|
| 75 |
onInputChange={handleInputChange}
|
| 76 |
onPressEnter={handlePressEnter}
|
| 77 |
sendLoading={sendLoading}
|
| 78 |
-
|
| 79 |
showUploadIcon={from === SharedFrom.Chat}
|
| 80 |
></MessageInput>
|
| 81 |
</Flex>
|
|
|
|
| 75 |
onInputChange={handleInputChange}
|
| 76 |
onPressEnter={handlePressEnter}
|
| 77 |
sendLoading={sendLoading}
|
| 78 |
+
uploadMethod="external_upload_and_parse"
|
| 79 |
showUploadIcon={from === SharedFrom.Chat}
|
| 80 |
></MessageInput>
|
| 81 |
</Flex>
|
web/src/services/chat-service.ts
CHANGED
|
@@ -19,6 +19,7 @@ const {
|
|
| 19 |
createExternalConversation,
|
| 20 |
getExternalConversation,
|
| 21 |
completeExternalConversation,
|
|
|
|
| 22 |
} = api;
|
| 23 |
|
| 24 |
const methods = {
|
|
@@ -86,6 +87,10 @@ const methods = {
|
|
| 86 |
url: completeExternalConversation,
|
| 87 |
method: 'post',
|
| 88 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
} as const;
|
| 90 |
|
| 91 |
const chatService = registerServer<keyof typeof methods>(methods, request);
|
|
|
|
| 19 |
createExternalConversation,
|
| 20 |
getExternalConversation,
|
| 21 |
completeExternalConversation,
|
| 22 |
+
uploadAndParseExternal,
|
| 23 |
} = api;
|
| 24 |
|
| 25 |
const methods = {
|
|
|
|
| 87 |
url: completeExternalConversation,
|
| 88 |
method: 'post',
|
| 89 |
},
|
| 90 |
+
uploadAndParseExternal: {
|
| 91 |
+
url: uploadAndParseExternal,
|
| 92 |
+
method: 'post',
|
| 93 |
+
},
|
| 94 |
} as const;
|
| 95 |
|
| 96 |
const chatService = registerServer<keyof typeof methods>(methods, request);
|
web/src/services/knowledge-service.ts
CHANGED
|
@@ -30,6 +30,7 @@ const {
|
|
| 30 |
web_crawl,
|
| 31 |
knowledge_graph,
|
| 32 |
document_infos,
|
|
|
|
| 33 |
} = api;
|
| 34 |
|
| 35 |
const methods = {
|
|
@@ -136,6 +137,10 @@ const methods = {
|
|
| 136 |
url: document_delete,
|
| 137 |
method: 'delete',
|
| 138 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
};
|
| 140 |
|
| 141 |
const kbService = registerServer<keyof typeof methods>(methods, request);
|
|
|
|
| 30 |
web_crawl,
|
| 31 |
knowledge_graph,
|
| 32 |
document_infos,
|
| 33 |
+
upload_and_parse,
|
| 34 |
} = api;
|
| 35 |
|
| 36 |
const methods = {
|
|
|
|
| 137 |
url: document_delete,
|
| 138 |
method: 'delete',
|
| 139 |
},
|
| 140 |
+
upload_and_parse: {
|
| 141 |
+
url: upload_and_parse,
|
| 142 |
+
method: 'post',
|
| 143 |
+
},
|
| 144 |
};
|
| 145 |
|
| 146 |
const kbService = registerServer<keyof typeof methods>(methods, request);
|
web/src/utils/api.ts
CHANGED
|
@@ -51,6 +51,7 @@ export default {
|
|
| 51 |
document_upload: `${api_host}/document/upload`,
|
| 52 |
web_crawl: `${api_host}/document/web_crawl`,
|
| 53 |
document_infos: `${api_host}/document/infos`,
|
|
|
|
| 54 |
|
| 55 |
// chat
|
| 56 |
setDialog: `${api_host}/dialog/set`,
|
|
@@ -70,6 +71,7 @@ export default {
|
|
| 70 |
createExternalConversation: `${api_host}/api/new_conversation`,
|
| 71 |
getExternalConversation: `${api_host}/api/conversation`,
|
| 72 |
completeExternalConversation: `${api_host}/api/completion`,
|
|
|
|
| 73 |
|
| 74 |
// file manager
|
| 75 |
listFile: `${api_host}/file/list`,
|
|
|
|
| 51 |
document_upload: `${api_host}/document/upload`,
|
| 52 |
web_crawl: `${api_host}/document/web_crawl`,
|
| 53 |
document_infos: `${api_host}/document/infos`,
|
| 54 |
+
upload_and_parse: `${api_host}/document/upload_and_parse`,
|
| 55 |
|
| 56 |
// chat
|
| 57 |
setDialog: `${api_host}/dialog/set`,
|
|
|
|
| 71 |
createExternalConversation: `${api_host}/api/new_conversation`,
|
| 72 |
getExternalConversation: `${api_host}/api/conversation`,
|
| 73 |
completeExternalConversation: `${api_host}/api/completion`,
|
| 74 |
+
uploadAndParseExternal: `${api_host}/api/document/upload_and_parse`,
|
| 75 |
|
| 76 |
// file manager
|
| 77 |
listFile: `${api_host}/file/list`,
|