feat(web): memory validation add perceptual_retrieve log
This commit is contained in:
@@ -195,7 +195,7 @@ export const en = {
|
|||||||
createNewApplicationDesc: 'Build an app in 3 minutes, no code.',
|
createNewApplicationDesc: 'Build an app in 3 minutes, no code.',
|
||||||
createNewKnowledge: 'Create New Knowledge',
|
createNewKnowledge: 'Create New Knowledge',
|
||||||
createNewKnowledgeDesc: 'Create a searchable knowledge base instantly.',
|
createNewKnowledgeDesc: 'Create a searchable knowledge base instantly.',
|
||||||
memoryConversation: 'Memory Conversation',
|
memoryConversation: 'Memory Validation',
|
||||||
memoryConversationDesc: 'The more you use it, the better AI knows you.',
|
memoryConversationDesc: 'The more you use it, the better AI knows you.',
|
||||||
helpCenter: 'Help Center',
|
helpCenter: 'Help Center',
|
||||||
helpCenterDesc: 'One place to get help and start fast.',
|
helpCenterDesc: 'One place to get help and start fast.',
|
||||||
|
|||||||
@@ -906,7 +906,7 @@ export const zh = {
|
|||||||
createNewApplicationDesc: '零代码,3 分钟搭建应用',
|
createNewApplicationDesc: '零代码,3 分钟搭建应用',
|
||||||
createNewKnowledge: '创建知识库',
|
createNewKnowledge: '创建知识库',
|
||||||
createNewKnowledgeDesc: '秒级生成可搜索知识库',
|
createNewKnowledgeDesc: '秒级生成可搜索知识库',
|
||||||
memoryConversation: '记忆对话',
|
memoryConversation: '记忆验证',
|
||||||
memoryConversationDesc: '越用越懂你的 AI',
|
memoryConversationDesc: '越用越懂你的 AI',
|
||||||
helpCenter: '帮助中心',
|
helpCenter: '帮助中心',
|
||||||
helpCenterDesc: '一站式上手与支持',
|
helpCenterDesc: '一站式上手与支持',
|
||||||
|
|||||||
@@ -10,9 +10,9 @@
|
|||||||
* Supports deep thinking, normal reply, and quick reply modes
|
* Supports deep thinking, normal reply, and quick reply modes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { type FC, type ReactNode, useState, useEffect } from 'react'
|
import { type FC, type ReactNode, useState } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { Col, Row, App, Skeleton, Segmented, Tooltip, Flex } from 'antd'
|
import { Col, Row, App, Skeleton, Segmented, Tooltip, Flex, Image } from 'antd'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import type { AnyObject } from 'antd/es/_util/type';
|
import type { AnyObject } from 'antd/es/_util/type';
|
||||||
|
|
||||||
@@ -29,6 +29,8 @@ import type { ChatItem } from '@/components/Chat/types'
|
|||||||
import RbCard from '@/components/RbCard/Card';
|
import RbCard from '@/components/RbCard/Card';
|
||||||
import styles from './index.module.css'
|
import styles from './index.module.css'
|
||||||
import ResultCard from '@/components/RbCard/ResultCard'
|
import ResultCard from '@/components/RbCard/ResultCard'
|
||||||
|
import AudioPlayer from '@/views/UserMemoryDetail/components/AudioPlayer'
|
||||||
|
import VideoPlayer from '@/views/UserMemoryDetail/components/VideoPlayer'
|
||||||
|
|
||||||
|
|
||||||
/** Search mode configuration */
|
/** Search mode configuration */
|
||||||
@@ -92,6 +94,7 @@ export interface LogItem {
|
|||||||
result?: string;
|
result?: string;
|
||||||
original_query: string;
|
original_query: string;
|
||||||
index?: number;
|
index?: number;
|
||||||
|
result_count?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -144,6 +147,10 @@ const MemoryConversation: FC = () => {
|
|||||||
const handleChange = (value: string) => {
|
const handleChange = (value: string) => {
|
||||||
setSearchSwitch(value)
|
setSearchSwitch(value)
|
||||||
}
|
}
|
||||||
|
const handleDownload = (file_path?: string) => {
|
||||||
|
if (!file_path) return
|
||||||
|
window.open(file_path, '_blank')
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -168,7 +175,7 @@ const MemoryConversation: FC = () => {
|
|||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
<Row gutter={16} className="rb:h-[calc(100%-48px)]!">
|
<Row gutter={16} className="rb:h-[calc(100%-48px)]!">
|
||||||
<Col span={12}>
|
<Col span={12} className="rb:h-full!">
|
||||||
<RbCard
|
<RbCard
|
||||||
title={t('memoryConversation.conversationContent')}
|
title={t('memoryConversation.conversationContent')}
|
||||||
headerType="borderless"
|
headerType="borderless"
|
||||||
@@ -200,7 +207,7 @@ const MemoryConversation: FC = () => {
|
|||||||
</Chat>
|
</Chat>
|
||||||
</RbCard>
|
</RbCard>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={12}>
|
<Col span={12} className="rb:h-full!">
|
||||||
<RbCard
|
<RbCard
|
||||||
title={t('memoryConversation.memoryConversationAnalysis')}
|
title={t('memoryConversation.memoryConversationAnalysis')}
|
||||||
headerType="borderless"
|
headerType="borderless"
|
||||||
@@ -235,7 +242,7 @@ const MemoryConversation: FC = () => {
|
|||||||
<ContentWrapper key={vo.id}>
|
<ContentWrapper key={vo.id}>
|
||||||
<>
|
<>
|
||||||
<div className="rb:font-medium rb:text-[#212332]">{vo.id}. {vo.question}</div>
|
<div className="rb:font-medium rb:text-[#212332]">{vo.id}. {vo.question}</div>
|
||||||
<div className="rb:mt-2 rb:text-[12px] rb:text-[#5B6167]">{vo.reason}</div>
|
<div className="rb:mt-2 rb:text-[#5B6167]">{vo.reason}</div>
|
||||||
</>
|
</>
|
||||||
</ContentWrapper>
|
</ContentWrapper>
|
||||||
))}
|
))}
|
||||||
@@ -247,7 +254,7 @@ const MemoryConversation: FC = () => {
|
|||||||
<>
|
<>
|
||||||
<div className="rb:font-medium rb:text-[#212332]">{key}</div>
|
<div className="rb:font-medium rb:text-[#212332]">{key}</div>
|
||||||
{(log.data as Record<string, string[]>)[key].map((item, index) => (
|
{(log.data as Record<string, string[]>)[key].map((item, index) => (
|
||||||
<div key={index} className="rb:mt-2 rb:text-[#5B6167] rb:text-[12px]">{item}</div>
|
<div key={index} className="rb:mt-2 rb:text-[#5B6167]">{item}</div>
|
||||||
))}
|
))}
|
||||||
</>
|
</>
|
||||||
</ContentWrapper>
|
</ContentWrapper>
|
||||||
@@ -257,16 +264,16 @@ const MemoryConversation: FC = () => {
|
|||||||
? <ContentWrapper>
|
? <ContentWrapper>
|
||||||
<div className="rb:font-medium rb:text-[#212332] rb:mb-2">{log.query}</div>
|
<div className="rb:font-medium rb:text-[#212332] rb:mb-2">{log.query}</div>
|
||||||
{(log.raw_results.reranked_results as AnyObject)?.communities?.length > 0 && <>
|
{(log.raw_results.reranked_results as AnyObject)?.communities?.length > 0 && <>
|
||||||
<div className="rb:font-medium rb:text-[#212332] rb:text-[12px]">{t('memoryConversation.communities')}</div>
|
<div className="rb:font-medium rb:text-[#212332]">{t('memoryConversation.communities')}</div>
|
||||||
<ul className='rb:mt-2 rb:text-[12px] rb:text-[#5B6167] rb:list-disc rb:pl-4'>
|
<ul className='rb:mt-2 rb:text-[#5B6167] rb:list-disc rb:pl-4'>
|
||||||
{((log.raw_results.reranked_results as AnyObject)?.communities as { content: string }[]).map((item, index: number) => (
|
{((log.raw_results.reranked_results as AnyObject)?.communities as { content: string }[]).map((item, index: number) => (
|
||||||
<li key={index}>{item.content}</li>
|
<li key={index}>{item.content}</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</>}
|
</>}
|
||||||
{(log.raw_results.reranked_results as AnyObject)?.summaries?.length > 0 && <>
|
{(log.raw_results.reranked_results as AnyObject)?.summaries?.length > 0 && <>
|
||||||
<div className="rb:font-medium rb:text-[#212332] rb:text-[12px]">{t('memoryConversation.summaries')}</div>
|
<div className="rb:font-medium rb:text-[#212332]">{t('memoryConversation.summaries')}</div>
|
||||||
<ul className='rb:mt-2 rb:text-[12px] rb:text-[#5B6167] rb:list-disc rb:pl-4'>
|
<ul className='rb:mt-2 rb:text-[#5B6167] rb:list-disc rb:pl-4'>
|
||||||
{((log.raw_results.reranked_results as AnyObject)?.summaries as { content: string }[]).map((item, index: number) => (
|
{((log.raw_results.reranked_results as AnyObject)?.summaries as { content: string }[]).map((item, index: number) => (
|
||||||
<li key={index}>{item.content}</li>
|
<li key={index}>{item.content}</li>
|
||||||
))}
|
))}
|
||||||
@@ -280,8 +287,8 @@ const MemoryConversation: FC = () => {
|
|||||||
: log.type === 'verification'
|
: log.type === 'verification'
|
||||||
? <ContentWrapper>
|
? <ContentWrapper>
|
||||||
<div className="rb:font-medium rb:text-[#212332]">{log.query}</div>
|
<div className="rb:font-medium rb:text-[#212332]">{log.query}</div>
|
||||||
<div className="rb:mt-2 rb:text-[12px] rb:text-[#5B6167]">{log.reason}</div>
|
<div className="rb:mt-2 rb:text-[#5B6167]">{log.reason}</div>
|
||||||
<div className="rb:mt-2 rb:text-[12px] rb:text-[#5B6167]">{log.result}</div>
|
<div className="rb:mt-2 rb:text-[#5B6167]">{log.result}</div>
|
||||||
</ContentWrapper>
|
</ContentWrapper>
|
||||||
: log.type === 'output_type'
|
: log.type === 'output_type'
|
||||||
? <ContentWrapper>
|
? <ContentWrapper>
|
||||||
@@ -291,8 +298,8 @@ const MemoryConversation: FC = () => {
|
|||||||
: log.type === 'input_summary' && log.raw_results
|
: log.type === 'input_summary' && log.raw_results
|
||||||
? <ContentWrapper>
|
? <ContentWrapper>
|
||||||
<div className="rb:font-medium rb:text-[#212332] rb:mb-2">{log.query}</div>
|
<div className="rb:font-medium rb:text-[#212332] rb:mb-2">{log.query}</div>
|
||||||
<div className="rb:font-medium rb:text-[12px] rb:text-[#5B6167] rb:mb-2">{log.summary}</div>
|
<div className="rb:font-medium rb:text-[#5B6167] rb:mb-2">{log.summary}</div>
|
||||||
<div className='rb:mt-2 rb:text-[12px] rb:text-[#5B6167]'>
|
<div className='rb:mt-2 rb:text-[#5B6167]'>
|
||||||
{typeof log.raw_results === 'string'
|
{typeof log.raw_results === 'string'
|
||||||
? <Markdown content={log.raw_results} />
|
? <Markdown content={log.raw_results} />
|
||||||
: <>
|
: <>
|
||||||
@@ -306,7 +313,65 @@ const MemoryConversation: FC = () => {
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</ContentWrapper>
|
</ContentWrapper>
|
||||||
: null
|
: log.type === 'perceptual_retrieve' && log.data && log.data?.length > 0
|
||||||
|
? <Flex gap={12} vertical>
|
||||||
|
{log.data.map((vo: any) => (
|
||||||
|
<ContentWrapper key={vo.id}>
|
||||||
|
<Flex vertical gap={16}>
|
||||||
|
{vo.file_path
|
||||||
|
? <>
|
||||||
|
{/(jpg|jpeg|png|gif|webp|svg)$/i.test(vo.file_type)
|
||||||
|
? <Image src={vo.file_path} alt={vo.file_name} width={432} className="rb:rounded-xl rb:h-45!" />
|
||||||
|
: /(mp4|webm|ogg|mov)$/i.test(vo.file_type)
|
||||||
|
? <VideoPlayer src={vo.file_path} />
|
||||||
|
: /(mp3|wav|ogg|m4a|aac)$/i.test(vo.file_type)
|
||||||
|
? <AudioPlayer src={vo.file_path} fileName={vo.file_name} fileSize='-' />
|
||||||
|
: <Flex gap={11} align="center" justify="space-between" className="rb:bg-[#F6F6F6] rb:min-h-15.5! rb:rounded-xl rb:p-3!">
|
||||||
|
<Flex gap={12} align="center">
|
||||||
|
<div className="rb:w-7.5 rb:h-9 rb:bg-cover rb:bg-[url('@/assets/images/userMemory/file.svg')]"></div>
|
||||||
|
<div>
|
||||||
|
<div className="rb:leading-5 rb:font-medium rb:mb-1 rb:wrap-break-word rb:line-clamp-1">{vo.file_name}</div>
|
||||||
|
<div className="rb:text-[#5B6167] rb:leading-4.5">
|
||||||
|
-
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Flex>
|
||||||
|
<div
|
||||||
|
className="rb:size-6 rb:bg-cover rb:cursor-pointer rb:bg-[url('@/assets/images/userMemory/download.svg')] rb:hover:bg-[url('@/assets/images/userMemory/download_hover.svg')]"
|
||||||
|
onClick={() => handleDownload(vo.file_path)}
|
||||||
|
></div>
|
||||||
|
</Flex>
|
||||||
|
}
|
||||||
|
</>
|
||||||
|
: <div className="rb:bg-[#F6F6F6] rb:min-h-15.5! rb:rounded-xl rb:p-3!">
|
||||||
|
<Empty size={44} />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
{['summary', 'keywords', 'topic', 'domain', 'scene', 'speaker_count', 'section_count'].map(key => {
|
||||||
|
const value = vo[key]
|
||||||
|
if (value) {
|
||||||
|
return (
|
||||||
|
<div key={key} className="rb:leading-5">
|
||||||
|
<div className="rb:text-[#5B6167] rb:mb-1">{t(`perceptualDetail.${key}`)}</div>
|
||||||
|
|
||||||
|
{typeof value === 'string'
|
||||||
|
? <div>{value}</div>
|
||||||
|
: Array.isArray(value)
|
||||||
|
? <Flex wrap gap={11}>
|
||||||
|
{value.map((vo, index) => <div key={index} className="rb:bg-[#F6F6F6] rb:rounded-[13px] rb:py-1 rb:px-2 rb:font-medium rb:leading-4.5">{vo}</div>)}
|
||||||
|
</Flex>
|
||||||
|
: '-'
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
})}
|
||||||
|
</Flex>
|
||||||
|
</ContentWrapper>
|
||||||
|
))}
|
||||||
|
</Flex>
|
||||||
|
: null
|
||||||
}
|
}
|
||||||
</ResultCard>
|
</ResultCard>
|
||||||
))}
|
))}
|
||||||
|
|||||||
Reference in New Issue
Block a user