{list?.map((x) => {
return (
diff --git a/web/src/pages/next-chats/hooks/use-send-shared-message.ts b/web/src/pages/next-chats/hooks/use-send-shared-message.ts
index c378eec30..e80b9d9fb 100644
--- a/web/src/pages/next-chats/hooks/use-send-shared-message.ts
+++ b/web/src/pages/next-chats/hooks/use-send-shared-message.ts
@@ -1,20 +1,7 @@
-import { MessageType, SharedFrom } from '@/constants/chat';
-import { useCreateNextSharedConversation } from '@/hooks/chat-hooks';
-import {
- useHandleMessageInputChange,
- useSelectDerivedMessages,
- useSendMessageWithSse,
-} from '@/hooks/logic-hooks';
-import { Message } from '@/interfaces/database/chat';
-import { message } from 'antd';
-import { get } from 'lodash';
+import { SharedFrom } from '@/constants/chat';
+import { useSendAgentMessage } from '@/pages/agent/chat/use-send-agent-message';
import trim from 'lodash/trim';
-import { useCallback, useEffect, useState } from 'react';
import { useSearchParams } from 'umi';
-import { v4 as uuid } from 'uuid';
-
-const isCompletionError = (res: any) =>
- res && (res?.response.status !== 200 || res?.data?.code !== 0);
export const useSendButtonDisabled = (value: string) => {
return trim(value) === '';
@@ -40,110 +27,14 @@ export const useGetSharedChatSearchParams = () => {
};
};
-export const useSendSharedMessage = () => {
- const {
- from,
- sharedId: conversationId,
- data: data,
- } = useGetSharedChatSearchParams();
- const { createSharedConversation: setConversation } =
- useCreateNextSharedConversation();
- const { handleInputChange, value, setValue } = useHandleMessageInputChange();
- const { send, answer, done, stopOutputMessage } = useSendMessageWithSse(
- `/api/v1/${from === SharedFrom.Agent ? 'agentbots' : 'chatbots'}/${conversationId}/completions`,
- );
- const {
- derivedMessages,
- ref,
- removeLatestMessage,
- addNewestAnswer,
- addNewestQuestion,
- } = useSelectDerivedMessages();
- const [hasError, setHasError] = useState(false);
+export function useSendNextSharedMessage() {
+ const { from, sharedId: conversationId } = useGetSharedChatSearchParams();
+ const url = `/api/v1/${from === SharedFrom.Agent ? 'agentbots' : 'chatbots'}/${conversationId}/completions`;
- const sendMessage = useCallback(
- async (message: Message, id?: string) => {
- const res = await send({
- conversation_id: id ?? conversationId,
- quote: true,
- question: message.content,
- session_id: get(derivedMessages, '0.session_id'),
- });
-
- if (isCompletionError(res)) {
- // cancel loading
- setValue(message.content);
- removeLatestMessage();
- }
- },
- [send, conversationId, derivedMessages, setValue, removeLatestMessage],
- );
-
- const handleSendMessage = useCallback(
- async (message: Message) => {
- if (conversationId !== '') {
- sendMessage(message);
- } else {
- const data = await setConversation('user id');
- if (data.code === 0) {
- const id = data.data.id;
- sendMessage(message, id);
- }
- }
- },
- [conversationId, setConversation, sendMessage],
- );
-
- const fetchSessionId = useCallback(async () => {
- const payload = { question: '' };
- const ret = await send({ ...payload, ...data });
- if (isCompletionError(ret)) {
- message.error(ret?.data.message);
- setHasError(true);
- }
- }, [data, send]);
-
- useEffect(() => {
- fetchSessionId();
- }, [fetchSessionId, send]);
-
- useEffect(() => {
- if (answer.answer) {
- addNewestAnswer(answer);
- }
- }, [answer, addNewestAnswer]);
-
- const handlePressEnter = useCallback(
- (documentIds: string[]) => {
- if (trim(value) === '') return;
- const id = uuid();
- if (done) {
- setValue('');
- addNewestQuestion({
- content: value,
- doc_ids: documentIds,
- id,
- role: MessageType.User,
- });
- handleSendMessage({
- content: value.trim(),
- id,
- role: MessageType.User,
- });
- }
- },
- [addNewestQuestion, done, handleSendMessage, setValue, value],
- );
+ const ret = useSendAgentMessage(url);
return {
- handlePressEnter,
- handleInputChange,
- value,
- sendLoading: !done,
- ref,
- loading: false,
- derivedMessages,
- hasError,
- stopOutputMessage,
+ ...ret,
+ hasError: false,
};
-};
+}
diff --git a/web/src/pages/next-chats/share/index.less b/web/src/pages/next-chats/share/index.less
deleted file mode 100644
index 01e090061..000000000
--- a/web/src/pages/next-chats/share/index.less
+++ /dev/null
@@ -1,13 +0,0 @@
-.chatWrapper {
- height: 100vh;
-}
-
-.chatContainer {
- padding: 10px;
- box-sizing: border-box;
- height: 100%;
- .messageContainer {
- overflow-y: auto;
- padding-right: 6px;
- }
-}
diff --git a/web/src/pages/next-chats/share/index.tsx b/web/src/pages/next-chats/share/index.tsx
index acaadcbf9..30c3ea24d 100644
--- a/web/src/pages/next-chats/share/index.tsx
+++ b/web/src/pages/next-chats/share/index.tsx
@@ -1,13 +1,115 @@
-import ChatContainer from './large';
+import MessageInput from '@/components/message-input';
+import MessageItem from '@/components/next-message-item';
+import PdfDrawer from '@/components/pdf-drawer';
+import { useClickDrawer } from '@/components/pdf-drawer/hooks';
+import { MessageType, SharedFrom } from '@/constants/chat';
+import { useFetchNextConversationSSE } from '@/hooks/chat-hooks';
+import { useFetchAgentAvatar } from '@/hooks/use-agent-request';
+import { cn } from '@/lib/utils';
+import i18n from '@/locales/config';
+import { useSendButtonDisabled } from '@/pages/chat/hooks';
+import { buildMessageUuidWithRole } from '@/utils/chat';
+import React, { forwardRef, useMemo } from 'react';
+import {
+ useGetSharedChatSearchParams,
+ useSendNextSharedMessage,
+} from '../hooks/use-send-shared-message';
-import styles from './index.less';
+const ChatContainer = () => {
+ const {
+ sharedId: conversationId,
+ from,
+ locale,
+ visibleAvatar,
+ } = useGetSharedChatSearchParams();
+ const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } =
+ useClickDrawer();
+
+ const {
+ handlePressEnter,
+ handleInputChange,
+ value,
+ sendLoading,
+ ref,
+ derivedMessages,
+ hasError,
+ stopOutputMessage,
+ findReferenceByMessageId,
+ } = useSendNextSharedMessage();
+ const sendDisabled = useSendButtonDisabled(value);
+
+ const useFetchAvatar = useMemo(() => {
+ return from === SharedFrom.Agent
+ ? useFetchAgentAvatar
+ : useFetchNextConversationSSE;
+ }, [from]);
+
+ React.useEffect(() => {
+ if (locale && i18n.language !== locale) {
+ i18n.changeLanguage(locale);
+ }
+ }, [locale, visibleAvatar]);
+ const { data: avatarData } = useFetchAvatar();
+
+ if (!conversationId) {
+ return
empty
;
+ }
-const SharedChat = () => {
return (
-
-
-
+
+
+
+
+ {derivedMessages?.map((message, i) => {
+ return (
+
+ );
+ })}
+
+
+
+
+
+
+ {visible && (
+
+ )}
+
);
};
-export default SharedChat;
+export default forwardRef(ChatContainer);
diff --git a/web/src/pages/next-chats/share/large.tsx b/web/src/pages/next-chats/share/large.tsx
deleted file mode 100644
index 6aad99bbe..000000000
--- a/web/src/pages/next-chats/share/large.tsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import MessageInput from '@/components/message-input';
-import MessageItem from '@/components/message-item';
-import PdfDrawer from '@/components/pdf-drawer';
-import { useClickDrawer } from '@/components/pdf-drawer/hooks';
-import { MessageType, SharedFrom } from '@/constants/chat';
-import { useFetchNextConversationSSE } from '@/hooks/chat-hooks';
-import { useFetchFlowSSE } from '@/hooks/flow-hooks';
-import i18n from '@/locales/config';
-import { useSendButtonDisabled } from '@/pages/chat/hooks';
-import { buildMessageUuidWithRole } from '@/utils/chat';
-import { Flex, Spin } from 'antd';
-import React, { forwardRef, useMemo } from 'react';
-import {
- useGetSharedChatSearchParams,
- useSendSharedMessage,
-} from '../hooks/use-send-shared-message';
-import { buildMessageItemReference } from '../utils';
-import styles from './index.less';
-
-const ChatContainer = () => {
- const {
- sharedId: conversationId,
- from,
- locale,
- visibleAvatar,
- } = useGetSharedChatSearchParams();
- const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } =
- useClickDrawer();
-
- const {
- handlePressEnter,
- handleInputChange,
- value,
- sendLoading,
- loading,
- ref,
- derivedMessages,
- hasError,
- stopOutputMessage,
- } = useSendSharedMessage();
- const sendDisabled = useSendButtonDisabled(value);
-
- const useFetchAvatar = useMemo(() => {
- return from === SharedFrom.Agent
- ? useFetchFlowSSE
- : useFetchNextConversationSSE;
- }, [from]);
- React.useEffect(() => {
- if (locale && i18n.language !== locale) {
- i18n.changeLanguage(locale);
- }
- }, [locale, visibleAvatar]);
- const { data: avatarData } = useFetchAvatar();
-
- if (!conversationId) {
- return
empty
;
- }
-
- return (
- <>
-
-
-
-
- {derivedMessages?.map((message, i) => {
- return (
-
- );
- })}
-
-
-
-
-
-
-
- {visible && (
-
- )}
- >
- );
-};
-
-export default forwardRef(ChatContainer);
diff --git a/web/src/pages/next-chats/utils.ts b/web/src/pages/next-chats/utils.ts
index e3e4f5ff2..a31f40097 100644
--- a/web/src/pages/next-chats/utils.ts
+++ b/web/src/pages/next-chats/utils.ts
@@ -1,8 +1,7 @@
-import { MessageType } from '@/constants/chat';
+import { EmptyConversationId, MessageType } from '@/constants/chat';
import { IConversation, IReference } from '@/interfaces/database/chat';
import { isEmpty } from 'lodash';
-import { EmptyConversationId } from './constants';
-import { IMessage } from './interface';
+import { IMessage } from '../chat/interface';
export const isConversationIdExist = (conversationId: string) => {
return conversationId !== EmptyConversationId && conversationId !== '';
diff --git a/web/src/pages/user-setting/constants.tsx b/web/src/pages/user-setting/constants.tsx
index 6c7745546..ecf555d62 100644
--- a/web/src/pages/user-setting/constants.tsx
+++ b/web/src/pages/user-setting/constants.tsx
@@ -6,6 +6,7 @@ import {
ProfileIcon,
TeamIcon,
} from '@/assets/icon/Icon';
+import { IconFont } from '@/components/icon-font';
import { LLMFactory } from '@/constants/llm';
import { UserSettingRouteKey } from '@/constants/setting';
import { MonitorOutlined } from '@ant-design/icons';
@@ -18,6 +19,9 @@ export const UserSettingIconMap = {
[UserSettingRouteKey.Team]:
,
[UserSettingRouteKey.Logout]:
,
[UserSettingRouteKey.Api]:
,
+ [UserSettingRouteKey.MCP]: (
+
+ ),
};
export * from '@/constants/setting';
diff --git a/web/src/routes.ts b/web/src/routes.ts
index 2bfdd4e5a..612ac2323 100644
--- a/web/src/routes.ts
+++ b/web/src/routes.ts
@@ -8,6 +8,7 @@ export enum Routes {
Agent = '/agent',
AgentTemplates = '/agent-templates',
Agents = '/agents',
+ AgentList = '/agent-list',
Searches = '/next-searches',
Search = '/next-search',
Chats = '/next-chats',
@@ -53,6 +54,11 @@ const routes = [
component: '@/pages/chat/share',
layout: false,
},
+ {
+ path: '/next-chat/share',
+ component: '@/pages/next-chats/share',
+ layout: false,
+ },
{
path: '/',
component: '@/layouts',
@@ -135,6 +141,10 @@ const routes = [
path: '/user-setting/api',
component: '@/pages/user-setting/setting-api',
},
+ {
+ path: `/user-setting${Routes.Mcp}`,
+ component: `@/pages${Routes.ProfileMcp}`,
+ },
],
},
{
@@ -145,6 +155,10 @@ const routes = [
path: '/flow',
component: '@/pages/flow/list',
},
+ {
+ path: Routes.AgentList,
+ component: `@/pages/${Routes.Agents}`,
+ },
{
path: '/flow/:id',
component: '@/pages/flow',
diff --git a/web/src/services/agent-service.ts b/web/src/services/agent-service.ts
index eaf1897ae..74fe0b486 100644
--- a/web/src/services/agent-service.ts
+++ b/web/src/services/agent-service.ts
@@ -20,6 +20,7 @@ const {
fetchVersionList,
fetchVersion,
fetchCanvas,
+ fetchAgentAvatar,
} = api;
const methods = {
@@ -95,6 +96,10 @@ const methods = {
url: inputForm,
method: 'get',
},
+ fetchAgentAvatar: {
+ url: fetchAgentAvatar,
+ method: 'get',
+ },
} as const;
const agentService = registerNextServer
(methods);
diff --git a/web/src/utils/api.ts b/web/src/utils/api.ts
index 93272175d..6e268b6c9 100644
--- a/web/src/utils/api.ts
+++ b/web/src/utils/api.ts
@@ -151,6 +151,7 @@ export default {
fetchVersionList: (id: string) => `${api_host}/canvas/getlistversion/${id}`,
fetchVersion: (id: string) => `${api_host}/canvas/getversion/${id}`,
fetchCanvas: (id: string) => `${api_host}/canvas/get/${id}`,
+ fetchAgentAvatar: (id: string) => `${api_host}/canvas/getsse/${id}`,
// mcp server
listMcpServer: `${api_host}/mcp_server/list`,