- { t('index.latestUpdate')}
- {versionInfo && (
-
- {versionInfo.version}
-
- )}
+
+ { t('index.latestUpdate')}
+
+ {versionInfo?.version}
+
-
- {loading ? (
+
+ {versionInfo && (<>
+
+
+
+ {t('version.releaseDate')}: {versionInfo.introduction?.releaseDate}
+
+
+
+ {t('version.name')}: {versionInfo.introduction?.codeName}
+
+
+
+ {versionInfo.introduction?.upgradePosition}
+
+ {versionInfo.introduction?.coreUpgrades?.map((item,index) => (
+
+ {index + 1}. {item}
+
+ ))}
+ >)}
+ {/* {loading ? (
t('index.loading')
) : (
versionInfo?.introduction || t('index.latestUpdateDesc')
- )}
+ )} */}
{/*
);
}
\ No newline at end of file
diff --git a/web/src/views/UserMemory/types.ts b/web/src/views/UserMemory/types.ts
index 696b1694..927cf778 100644
--- a/web/src/views/UserMemory/types.ts
+++ b/web/src/views/UserMemory/types.ts
@@ -17,13 +17,10 @@ export interface Data {
entity: number;
}
},
+ memory_config: {
+ memory_config_id: string;
+ memory_config_name: string;
+ },
+ type: string;
name?: string;
-}
-export interface ConfigModalData {
- llm: string;
- embedding: string;
- rerank: string;
-}
-export interface ConfigModalRef {
- handleOpen: () => void;
}
\ No newline at end of file
diff --git a/web/src/views/UserMemoryDetail/components/EmotionLine.tsx b/web/src/views/UserMemoryDetail/components/EmotionLine.tsx
index 3652e7c5..68664d39 100644
--- a/web/src/views/UserMemoryDetail/components/EmotionLine.tsx
+++ b/web/src/views/UserMemoryDetail/components/EmotionLine.tsx
@@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'
import ReactEcharts from 'echarts-for-react';
import Empty from '@/components/Empty'
import Loading from '@/components/Empty/Loading'
-import type { Emotion } from './GraphDetail'
+import type { Emotion } from '../pages/GraphDetail'
interface EmotionLineProps {
chartData: Emotion[];
@@ -26,7 +26,7 @@ const EmotionLine: FC
= ({ chartData, loading }) => {
const seriesData = timePoints.map(time => dataMap.get(time) || 0)
return {
- name: emotionType,
+ name: t(`userMemory.${emotionType}`),
type: 'line',
smooth: true,
lineStyle: {
@@ -71,7 +71,7 @@ const EmotionLine: FC = ({ chartData, loading }) => {
formatter: function(params: any) {
let result = `${params[0].axisValue}
`
params.forEach((param: any) => {
- result += `${param.marker}${param.seriesName}: ${param.value}
`
+ result += `${param.marker}${param.seriesName}: ${param.value}%
`
})
return result
}
@@ -92,7 +92,7 @@ const EmotionLine: FC = ({ chartData, loading }) => {
},
grid: {
top: 16,
- left: 30,
+ left: 40,
right: 36,
bottom: 48,
// containLabel: false
@@ -103,7 +103,7 @@ const EmotionLine: FC = ({ chartData, loading }) => {
boundaryGap: false,
axisLabel: {
color: '#A8A9AA',
- fontFamily: 'PingFangSC, PingFang SC'
+ fontFamily: 'PingFangSC, PingFang SC',
},
axisLine: {
show: true,
@@ -130,7 +130,8 @@ const EmotionLine: FC = ({ chartData, loading }) => {
type: 'value',
axisLabel: {
color: '#A8A9AA',
- fontFamily: 'PingFangSC, PingFang SC'
+ fontFamily: 'PingFangSC, PingFang SC',
+ formatter: '{value}%'
},
axisLine: {
show: true,
@@ -152,7 +153,7 @@ const EmotionLine: FC = ({ chartData, loading }) => {
type: 'solid'
}
},
- max: 1,
+ max: 100,
min: 0
},
series: getSeries()
diff --git a/web/src/views/UserMemoryDetail/components/ForgetRefreshModal.tsx b/web/src/views/UserMemoryDetail/components/ForgetRefreshModal.tsx
new file mode 100644
index 00000000..1d0974e3
--- /dev/null
+++ b/web/src/views/UserMemoryDetail/components/ForgetRefreshModal.tsx
@@ -0,0 +1,113 @@
+import { forwardRef, useImperativeHandle, useState } from 'react';
+import { useParams } from 'react-router-dom'
+import { Form, Slider } from 'antd';
+import { useTranslation } from 'react-i18next';
+
+import RbModal from '@/components/RbModal'
+import { forgetTrigger } from '@/api/memory'
+import type { ForgetRefreshModalRef } from '../pages/ForgetDetail'
+
+interface ForgetRefreshModalProps {
+ refresh: (flag: boolean) => void;
+}
+
+const ForgetRefreshModal = forwardRef(({
+ refresh
+}, ref) => {
+ const { t } = useTranslation();
+ const { id } = useParams()
+ const [visible, setVisible] = useState(false);
+ const [form] = Form.useForm<{ max_merge_batch_size: number; min_days_since_access: number; }>();
+ const [loading, setLoading] = useState(false)
+ const values = Form.useWatch([], form);
+
+ // 封装取消方法,添加关闭弹窗逻辑
+ const handleClose = () => {
+ setVisible(false);
+ form.resetFields();
+ setLoading(false)
+ };
+
+ const handleOpen = () => {
+ form.resetFields();
+ setVisible(true);
+ };
+ // 封装保存方法,添加提交逻辑
+ const handleSave = () => {
+ if(!id) return
+ form
+ .validateFields()
+ .then((values) => {
+ setLoading(true)
+ forgetTrigger({
+ ...values,
+ end_user_id: id
+ })
+ .then(() => {
+ refresh(true)
+ handleClose()
+ })
+ .finally(() => {
+ setLoading(false)
+ })
+ })
+ .catch((err) => {
+ console.log('err', err)
+ });
+ }
+
+ // 暴露给父组件的方法
+ useImperativeHandle(ref, () => ({
+ handleOpen,
+ handleClose
+ }));
+
+ return (
+
+
+
+ );
+});
+
+export default ForgetRefreshModal;
\ No newline at end of file
diff --git a/web/src/views/UserMemoryDetail/components/InteractionBar.tsx b/web/src/views/UserMemoryDetail/components/InteractionBar.tsx
index 51224676..60c977fd 100644
--- a/web/src/views/UserMemoryDetail/components/InteractionBar.tsx
+++ b/web/src/views/UserMemoryDetail/components/InteractionBar.tsx
@@ -1,9 +1,9 @@
-import { type FC } from 'react'
+import { type FC, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import ReactEcharts from 'echarts-for-react'
import Empty from '@/components/Empty'
import Loading from '@/components/Empty/Loading'
-import type { Interaction } from './GraphDetail'
+import type { Interaction } from '../pages/GraphDetail'
interface InteractionBarProps {
chartData: Interaction[];
@@ -14,11 +14,13 @@ const Colors = ['#155EEF', '#369F21', '#FF5D34']
const InteractionBar: FC = ({ chartData, loading }) => {
const { t } = useTranslation()
- const series = [{
- name: 'Interaction Count',
- type: 'bar',
- data: chartData.map(item => item.count)
- }]
+ const series = useMemo(() => {
+ return [{
+ name: t('userMemory.interactionCountData'),
+ type: 'bar',
+ data: chartData.map(item => item.count)
+ }]
+ }, [chartData, t])
return (
<>
@@ -80,6 +82,7 @@ const InteractionBar: FC = ({ chartData, loading }) => {
},
yAxis: {
type: 'value',
+ minInterval: 1,
axisLabel: {
color: '#A8A9AA',
fontFamily: 'PingFangSC, PingFang SC'
@@ -104,8 +107,6 @@ const InteractionBar: FC = ({ chartData, loading }) => {
type: 'solid'
}
},
- max: 1,
- min: 0
},
series
}}
diff --git a/web/src/views/UserMemoryDetail/components/PageHeader.tsx b/web/src/views/UserMemoryDetail/components/PageHeader.tsx
index 56da70e0..68cdada8 100644
--- a/web/src/views/UserMemoryDetail/components/PageHeader.tsx
+++ b/web/src/views/UserMemoryDetail/components/PageHeader.tsx
@@ -1,20 +1,22 @@
import { type FC, type ReactNode } from 'react';
import { useNavigate } from 'react-router-dom';
-import { Layout } from 'antd';
+import { Layout, Space, Button } from 'antd';
import { useTranslation } from 'react-i18next';
-import logoutIcon from '@/assets/images/logout.svg'
+import logoutIcon from '@/assets/images/logout_hover.svg'
const { Header } = Layout;
interface ConfigHeaderProps {
name?: string;
operation?: ReactNode;
- source?: 'detail' | 'node'
+ source?: 'detail' | 'node';
+ extra?: ReactNode;
}
const PageHeader: FC = ({
name,
operation,
- source = 'detail'
+ source = 'detail',
+ extra
}) => {
const { t } = useTranslation();
const navigate = useNavigate();
@@ -33,10 +35,13 @@ const PageHeader: FC = ({
{operation}
-
-

- {t('common.return')}
-
+
+
+
+ {t('common.return')}
+
+ {extra}
+
);
};
diff --git a/web/src/views/UserMemoryDetail/components/RelationshipNetwork.tsx b/web/src/views/UserMemoryDetail/components/RelationshipNetwork.tsx
index 07095fe4..d12c3e57 100644
--- a/web/src/views/UserMemoryDetail/components/RelationshipNetwork.tsx
+++ b/web/src/views/UserMemoryDetail/components/RelationshipNetwork.tsx
@@ -1,19 +1,18 @@
import React, { type FC, useEffect, useState, useRef, useCallback } from 'react'
import { useTranslation } from 'react-i18next'
-import { useParams } from 'react-router-dom'
+import { useParams, useNavigate } from 'react-router-dom'
import { Col, Row, Space, Button } from 'antd'
import dayjs from 'dayjs'
import RbCard from '@/components/RbCard/Card'
import ReactEcharts from 'echarts-for-react'
import detailEmpty from '@/assets/images/userMemory/detail_empty.png'
-import type { Node, Edge, GraphData, StatementNodeProperties, ExtractedEntityNodeProperties, GraphDetailRef } from '../types'
+import type { Node, Edge, GraphData, StatementNodeProperties, ExtractedEntityNodeProperties } from '../types'
import {
getMemorySearchEdges,
} from '@/api/memory'
import Empty from '@/components/Empty'
import Tag from '@/components/Tag'
-import GraphDetail from '../components/GraphDetail'
const colors = ['#155EEF', '#369F21', '#4DA8FF', '#FF5D34', '#9C6FFF', '#FF8A4C', '#8BAEF7', '#FFB048']
const RelationshipNetwork:FC = () => {
@@ -26,7 +25,7 @@ const RelationshipNetwork:FC = () => {
const [categories, setCategories] = useState<{ name: string }[]>([])
const [selectedNode, setSelectedNode] = useState
(null)
// const [fullScreen, setFullScreen] = useState(false)
- const graphDetailRef = useRef(null)
+ const navigate = useNavigate()
console.log('categories', categories)
// 关系网络
@@ -133,15 +132,14 @@ const RelationshipNetwork:FC = () => {
}
}, [nodes])
- // const handleFullScreen = () => {
- // setFullScreen(prev => !prev)
- // }
-
- console.log('selectedNode', selectedNode)
-
const handleViewAll = () => {
if (!selectedNode) return
- graphDetailRef.current?.handleOpen(selectedNode)
+ const params = new URLSearchParams({
+ nodeId: selectedNode.id,
+ nodeLabel: selectedNode.label,
+ nodeName: selectedNode.name || ''
+ })
+ navigate(`/user-memory/detail/${id}/GRAPH?${params.toString()}`)
}
return (
@@ -336,8 +334,6 @@ const RelationshipNetwork:FC = () => {
)
}
diff --git a/web/src/views/UserMemoryDetail/components/Timeline.tsx b/web/src/views/UserMemoryDetail/components/Timeline.tsx
index d7b9b273..e2d9446f 100644
--- a/web/src/views/UserMemoryDetail/components/Timeline.tsx
+++ b/web/src/views/UserMemoryDetail/components/Timeline.tsx
@@ -9,6 +9,7 @@ import {
} from '@/api/memory'
import { formatDateTime } from '@/utils/format';
import Empty from '@/components/Empty'
+import Tag from '@/components/Tag'
interface TimelineItem {
id: string;
@@ -18,6 +19,9 @@ interface TimelineItem {
summary: string;
storage_type: number;
created_time: string | number;
+ domain: string;
+ topic: string;
+ keywords: string[]
}
const KEYS = {
@@ -68,9 +72,14 @@ const Timeline: FC = () => {
{formatDateTime(vo.created_time)}
{index !== data.length - 1 &&