message log

This commit is contained in:
JzoNg 2024-03-17 14:05:56 +08:00
parent 9638885a67
commit a2e30e6aa9
5 changed files with 90 additions and 4 deletions

View File

@ -11,7 +11,7 @@ const Log: FC<LogProps> = ({
logItem,
}) => {
const { t } = useTranslation()
const { setCurrentLogItem, setShowPromptLogModal } = useAppStore()
const { setCurrentLogItem, setShowPromptLogModal, setShowMessageLogModal } = useAppStore()
const { workflow_run_id: runID } = logItem
return (
@ -21,7 +21,10 @@ const Log: FC<LogProps> = ({
e.stopPropagation()
e.nativeEvent.stopImmediatePropagation()
setCurrentLogItem(logItem)
setShowPromptLogModal(true)
if (runID)
setShowMessageLogModal(true)
else
setShowPromptLogModal(true)
}}
>
<File02 className='mr-1 w-4 h-4 text-gray-500' />

View File

@ -36,6 +36,7 @@ import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import TextGeneration from '@/app/components/app/text-generate/item'
import { addFileInfos, sortAgentSorts } from '@/app/components/tools/utils'
import PromptLogModal from '@/app/components/base/prompt-log-modal'
import MessageLogModal from '@/app/components/base/message-log-modal'
import { useStore as useAppStore } from '@/app/components/app/store'
type IConversationList = {
@ -143,7 +144,7 @@ type IDetailPanel<T> = {
function DetailPanel<T extends ChatConversationFullDetailResponse | CompletionConversationFullDetailResponse>({ detail, onFeedback }: IDetailPanel<T>) {
const { onClose, appDetail } = useContext(DrawerContext)
const { currentLogItem, setCurrentLogItem, showPromptLogModal, setShowPromptLogModal } = useAppStore()
const { currentLogItem, setCurrentLogItem, showPromptLogModal, setShowPromptLogModal, showMessageLogModal, setShowMessageLogModal } = useAppStore()
const { t } = useTranslation()
const [items, setItems] = React.useState<IChatItem[]>([])
const [hasMore, setHasMore] = useState(true)
@ -391,6 +392,16 @@ function DetailPanel<T extends ChatConversationFullDetailResponse | CompletionCo
}}
/>
)}
{showMessageLogModal && (
<MessageLogModal
width={width}
currentLogItem={currentLogItem}
onCancel={() => {
setCurrentLogItem()
setShowMessageLogModal(false)
}}
/>
)}
</div>
)
}

View File

@ -27,6 +27,7 @@ import Button from '@/app/components/base/button'
import { StopCircle } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
import PromptLogModal from '@/app/components/base/prompt-log-modal'
import { useStore as useAppStore } from '@/app/components/app/store'
import MessageLogModal from '@/app/components/base/message-log-modal'
export type ChatProps = {
chatList: ChatItem[]
@ -75,7 +76,7 @@ const Chat: FC<ChatProps> = ({
onFeedback,
}) => {
const { t } = useTranslation()
const { currentLogItem, setCurrentLogItem, showPromptLogModal, setShowPromptLogModal } = useAppStore()
const { currentLogItem, setCurrentLogItem, showPromptLogModal, setShowPromptLogModal, showMessageLogModal, setShowMessageLogModal } = useAppStore()
const [width, setWidth] = useState(0)
const chatContainerRef = useRef<HTMLDivElement>(null)
const chatContainerInnerRef = useRef<HTMLDivElement>(null)
@ -233,6 +234,17 @@ const Chat: FC<ChatProps> = ({
}}
/>
)}
{showMessageLogModal && (
<MessageLogModal
fixedWidth
width={width}
currentLogItem={currentLogItem}
onCancel={() => {
setCurrentLogItem()
setShowMessageLogModal(false)
}}
/>
)}
</div>
</ChatContextProvider>
)

View File

@ -0,0 +1,56 @@
import type { FC } from 'react'
import { useTranslation } from 'react-i18next'
import cn from 'classnames'
import { useEffect, useRef, useState } from 'react'
import { useClickAway } from 'ahooks'
import { XClose } from '@/app/components/base/icons/src/vender/line/general'
import type { IChatItem } from '@/app/components/app/chat/type'
import Run from '@/app/components/workflow/run'
type MessageLogModalProps = {
currentLogItem?: IChatItem
width: number
fixedWidth?: boolean
onCancel: () => void
}
const MessageLogModal: FC<MessageLogModalProps> = ({
currentLogItem,
width,
fixedWidth,
onCancel,
}) => {
const { t } = useTranslation()
const ref = useRef(null)
const [mounted, setMounted] = useState(false)
useClickAway(() => {
if (mounted)
onCancel()
}, ref)
useEffect(() => {
setMounted(true)
}, [])
if (!currentLogItem || !currentLogItem.workflow_run_id)
return null
return (
<div
className={cn('fixed top-16 bottom-2 flex flex-col py-3 bg-white border-[0.5px] border-gray-200 rounded-xl shadow-xl z-10')}
style={{
width: fixedWidth ? 400 : width,
left: fixedWidth ? `${8 + width - 400}px` : '8px',
}}
ref={ref}
>
<h1 className='shrink-0 px-4 py-1 text-md font-semibold text-gray-900'>{t('appLog.runDetail.title')}</h1>
<span className='absolute right-3 top-4 p-1 cursor-pointer z-20' onClick={onCancel}>
<XClose className='w-4 h-4 text-gray-500' />
</span>
<Run runID={currentLogItem.workflow_run_id}/>
</div>
)
}
export default MessageLogModal

View File

@ -72,6 +72,10 @@ const translation = {
},
workflowTitle: '日志',
workflowSubtitle: '日志记录了应用的执行情况',
runDetail: {
title: '对话日志',
workflowTitle: '日志详情',
},
promptLog: 'Prompt 日志',
viewLog: '查看日志',
}