diff --git a/web/src/components/next-message-item/index.tsx b/web/src/components/next-message-item/index.tsx index dd7fc104f..1379560c7 100644 --- a/web/src/components/next-message-item/index.tsx +++ b/web/src/components/next-message-item/index.tsx @@ -170,13 +170,15 @@ function MessageItem({ > )} {isAssistant && currentEventListWithoutMessageById && ( - +
+ +
)} {isUser && ( diff --git a/web/src/components/originui/time-range-picker.tsx b/web/src/components/originui/time-range-picker.tsx index 0ec1790ac..e117f74c9 100644 --- a/web/src/components/originui/time-range-picker.tsx +++ b/web/src/components/originui/time-range-picker.tsx @@ -143,6 +143,9 @@ const TimeRangePicker = ({ const [date, setDate] = useState( selectDateRange || { from: today, to: today }, ); + useEffect(() => { + setDate(selectDateRange); + }, [selectDateRange]); const onChange = (e: DateRange | undefined) => { if (!e) return; setDate(e); diff --git a/web/src/hooks/use-send-message.ts b/web/src/hooks/use-send-message.ts index 3361a149e..a5c635575 100644 --- a/web/src/hooks/use-send-message.ts +++ b/web/src/hooks/use-send-message.ts @@ -20,6 +20,7 @@ export enum MessageEventType { export interface IAnswerEvent { event: MessageEventType; message_id: string; + session_id: string; created_at: number; task_id: string; data: T; diff --git a/web/src/pages/agent/chat/use-send-agent-message.ts b/web/src/pages/agent/chat/use-send-agent-message.ts index cf1ef9ea7..9a262d44d 100644 --- a/web/src/pages/agent/chat/use-send-agent-message.ts +++ b/web/src/pages/agent/chat/use-send-agent-message.ts @@ -180,6 +180,7 @@ export const useSendAgentMessage = ( const { id: agentId } = useParams(); const { handleInputChange, value, setValue } = useHandleMessageInputChange(); const inputs = useSelectBeginNodeDataInputs(); + const [sessionId, setSessionId] = useState(null); const { send, answerList, done, stopOutputMessage } = useSendMessageBySSE( url || api.runCanvas, ); @@ -187,6 +188,12 @@ export const useSendAgentMessage = ( return answerList[0]?.message_id; }, [answerList]); + useEffect(() => { + if (answerList[0]?.session_id) { + setSessionId(answerList[0]?.session_id); + } + }, [answerList]); + const { findReferenceByMessageId } = useFindMessageReference(answerList); const prologue = useGetBeginNodePrologue(); const { @@ -222,6 +229,8 @@ export const useSendAgentMessage = ( params.inputs = transferInputsArrayToObject(query); // begin operator inputs params.files = uploadResponseList; + + params.session_id = sessionId; } const res = await send(params); @@ -239,6 +248,7 @@ export const useSendAgentMessage = ( }, [ agentId, + sessionId, send, inputs, uploadResponseList, diff --git a/web/src/pages/agent/hooks/use-cache-chat-log.ts b/web/src/pages/agent/hooks/use-cache-chat-log.ts index 293ea6688..85365c949 100644 --- a/web/src/pages/agent/hooks/use-cache-chat-log.ts +++ b/web/src/pages/agent/hooks/use-cache-chat-log.ts @@ -43,19 +43,13 @@ export function useCacheChatLog() { setEventList([]); }, []); - const addEventList = useCallback( - (events: IEventList, message_id: string) => { - const nextList = [...eventList]; - events.forEach((x) => { - if (nextList.every((y) => y !== x)) { - nextList.push(x); - } - }); - setEventList(nextList); - setMessageIdPool((prev) => ({ ...prev, [message_id]: nextList })); - }, - [eventList], - ); + const addEventList = useCallback((events: IEventList, message_id: string) => { + setEventList((x) => { + const list = [...x, ...events]; + setMessageIdPool((prev) => ({ ...prev, [message_id]: list })); + return list; + }); + }, []); const currentEventListWithoutMessage = useMemo(() => { const list = messageIdPool[currentMessageId]?.filter( diff --git a/web/src/pages/agent/log-sheet/toolTimelineItem.tsx b/web/src/pages/agent/log-sheet/toolTimelineItem.tsx index 4cdcbd8f3..7c3a00184 100644 --- a/web/src/pages/agent/log-sheet/toolTimelineItem.tsx +++ b/web/src/pages/agent/log-sheet/toolTimelineItem.tsx @@ -18,16 +18,26 @@ import { JsonViewer } from './workFlowTimeline'; const ToolTimelineItem = ({ tools }: { tools: Record[] }) => { if (!tools || tools.length === 0 || !Array.isArray(tools)) return null; - const blackList = ['analyze_task', 'add_memory', 'gen_citations']; + const blackList = ['add_memory', 'gen_citations']; const filteredTools = tools.filter( (tool) => !blackList.includes(tool.tool_name), ); + const capitalizeWords = (str: string, separator: string = '_'): string => { + if (!str) return ''; + + return str + .split(separator) + .map((word) => { + return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); + }) + .join(' '); + }; return ( <> {filteredTools?.map((tool, idx) => { return ( @@ -82,7 +92,10 @@ const ToolTimelineItem = ({ tools }: { tools: Record[] }) => {
- {tool.tool_name} + + {tool.path + ' '} + {capitalizeWords(tool.tool_name, '_')} + {/* 0:00 {x.data.elapsed_time?.toString().slice(0, 6)} */} diff --git a/web/src/pages/agents/agent-log-detail-modal.tsx b/web/src/pages/agents/agent-log-detail-modal.tsx new file mode 100644 index 000000000..bf8a6b01c --- /dev/null +++ b/web/src/pages/agents/agent-log-detail-modal.tsx @@ -0,0 +1,58 @@ +import MessageItem from '@/components/next-message-item'; +import { Modal } from '@/components/ui/modal'; +import { useFetchAgent } from '@/hooks/use-agent-request'; +import { useFetchUserInfo } from '@/hooks/user-setting-hooks'; +import { IAgentLogMessage } from '@/interfaces/database/agent'; +import { IReferenceObject, Message } from '@/interfaces/database/chat'; +import { buildMessageUuidWithRole } from '@/utils/chat'; +import React from 'react'; +import { IMessage } from '../chat/interface'; + +interface CustomModalProps { + isOpen: boolean; + onClose: () => void; + message: IAgentLogMessage[]; + reference: IReferenceObject; +} + +export const AgentLogDetailModal: React.FC = ({ + isOpen, + onClose, + message: derivedMessages, + reference, +}) => { + const { data: userInfo } = useFetchUserInfo(); + const { data: canvasInfo } = useFetchAgent(); + return ( + +
+
+ {derivedMessages?.map((message, i) => { + return ( + , + )} + nickname={userInfo.nickname} + avatar={userInfo.avatar} + avatarDialog={canvasInfo.avatar} + item={message as IMessage} + reference={reference} + index={i} + showLikeButton={false} + showLog={false} + > + ); + })} +
+
+
+ ); +}; diff --git a/web/src/pages/agents/agent-log-page.tsx b/web/src/pages/agents/agent-log-page.tsx index 02e508e4a..00c8ccf36 100644 --- a/web/src/pages/agents/agent-log-page.tsx +++ b/web/src/pages/agents/agent-log-page.tsx @@ -13,7 +13,12 @@ import { RAGFlowPagination } from '@/components/ui/ragflow-pagination'; import { Spin } from '@/components/ui/spin'; import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; import { useFetchAgentLog } from '@/hooks/use-agent-request'; -import { IAgentLogResponse } from '@/interfaces/database/agent'; +import { + IAgentLogMessage, + IAgentLogResponse, +} from '@/interfaces/database/agent'; +import { IReferenceObject } from '@/interfaces/database/chat'; +import { useQueryClient } from '@tanstack/react-query'; import React, { useEffect, useState } from 'react'; import { useParams } from 'umi'; import { DateRange } from '../../components/originui/calendar/index'; @@ -26,16 +31,27 @@ import { TableRow, } from '../../components/ui/table'; import { useFetchDataOnMount } from '../agent/hooks/use-fetch-data'; +import { AgentLogDetailModal } from './agent-log-detail-modal'; +const getStartOfToday = (): Date => { + const today = new Date(); + today.setHours(0, 0, 0, 0); + return today; +}; +const getEndOfToday = (): Date => { + const today = new Date(); + today.setHours(23, 59, 59, 999); + return today; +}; const AgentLogPage: React.FC = () => { const { navigateToAgentList, navigateToAgent } = useNavigatePage(); const { flowDetail: agentDetail } = useFetchDataOnMount(); const { id: canvasId } = useParams(); - const today = new Date(); + const queryClient = useQueryClient(); const init = { keywords: '', - from_date: today, - to_date: today, + from_date: getStartOfToday(), + to_date: getEndOfToday(), orderby: 'create_time', desc: false, page: 1, @@ -152,6 +168,13 @@ const AgentLogPage: React.FC = () => { }); }; + const handleClickSearch = () => { + setPagination({ ...pagination, current: 1 }); + handleSearch(); + queryClient.invalidateQueries({ + queryKey: ['fetchAgentLog'], + }); + }; useEffect(() => { handleSearch(); }, [pagination.current, pagination.pageSize, sortConfig]); @@ -166,7 +189,17 @@ const AgentLogPage: React.FC = () => { const handleReset = () => { setSearchParams(init); + setKeywords(init.keywords); + setCurrentDate({ from: init.from_date, to: init.to_date }); }; + + const [openModal, setOpenModal] = useState(false); + const [modalData, setModalData] = useState(); + const showLogDetail = (item: IAgentLogResponse) => { + setModalData(item); + setOpenModal(true); + }; + return (
@@ -209,15 +242,14 @@ const AgentLogPage: React.FC = () => { Latest Date
+ setOpenModal(false)} + /> ); }; diff --git a/web/src/pages/next-chats/share/index.tsx b/web/src/pages/next-chats/share/index.tsx index 0a02464bd..aef9b1e1a 100644 --- a/web/src/pages/next-chats/share/index.tsx +++ b/web/src/pages/next-chats/share/index.tsx @@ -91,55 +91,63 @@ const ChatContainer = () => { } return ( -
-
-
-
- {derivedMessages?.map((message, i) => { - return ( - - ); - })} +
+
+
+
+
+ {derivedMessages?.map((message, i) => { + return ( + + ); + })} +
+
+
+
+
+ +
-
- -
+
{visible && (