import { type FC, useEffect, useState, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom' import { Row, Col, Progress } from 'antd' import RbCard from '@/components/RbCard/Card' import { getForgetStats, } from '@/api/memory' import type { ForgetData } from '../types' import ActivationMetricsPieCard from '../components/ActivationMetricsPieCard' import RecentTrendsLineCard from '../components/RecentTrendsLineCard' import Table from '@/components/Table' import { formatDateTime } from '@/utils/format' import StatusTag from '@/components/StatusTag' const statusTagColors: Record = { statement: 'success', entity: 'purple', summary: 'default', chunk: 'warning', } const ForgetOverview: FC = () => { const { t } = useTranslation() const { id } = useParams() const [loading, setLoading] = useState(false) const [data, setData] = useState({} as ForgetData) useEffect(() => { if (!id) return getData() }, [id]) // 记忆洞察 const getData = () => { if (!id) return setLoading(true) getForgetStats(id).then((res) => { const response = res as ForgetData setData(response) setLoading(false) }) .finally(() => { setLoading(false) }) } const chartData = useMemo(() => { const { activation_metrics } = data if (!activation_metrics) return [] let health_nodes = (activation_metrics.total_nodes || 0) - (activation_metrics.low_activation_nodes || 0) - (activation_metrics.nodes_without_activation || 0) return [ { name: t('forgetDetail.health_nodes'), value: health_nodes }, { name: t('forgetDetail.nodes_without_activation'), value: activation_metrics.nodes_without_activation || 0 }, { name: t('forgetDetail.low_activation_nodes'), value: activation_metrics.low_activation_nodes || 0 }, ] }, [data.activation_metrics, t]) const seriesList = useMemo(() => { const { recent_trends = [] } = data if (!recent_trends || recent_trends.length === 0) return { chartData: [], seriesList: [] } return { chartData: recent_trends, seriesList: ['merged_count', 'average_activation'] } }, [data.recent_trends]) return (
{t('forgetDetail.title')}
{t('forgetDetail.overviewTitle')}
{t('forgetDetail.totalMemory')}
{data?.activation_metrics?.total_nodes ?? 0}
{['statement_count', 'entity_count', 'summary_count', 'chunk_count'].map((key, index) => (
{data?.node_distribution?.[key as keyof typeof data.node_distribution] ?? 0}
{t(`forgetDetail.${key}`)}
))}
{t('forgetDetail.MemoryHealth')}
{data?.activation_metrics?.average_activation_value ?? 0}
{t('forgetDetail.healthStatus')}
{data?.activation_metrics?.average_activation_value > data.activation_metrics?.forgetting_threshold ? t('forgetDetail.healthy') : t('forgetDetail.unhealthy')}
{t('forgetDetail.average')}
{t('forgetDetail.threshold')}{data.activation_metrics?.forgetting_threshold ?? 0}
{t('forgetDetail.riskOfForgetting')}
{data.activation_metrics?.low_activation_nodes ?? 0}
{t('forgetDetail.low_nodes')}
{t('forgetDetail.memoryHealthVisualization')}
{t('forgetDetail.pending_nodes')}
{content_summary}
}, { title: t('forgetDetail.node_type'), dataIndex: 'node_type', key: 'node_type', render: (node_type: string) => { return } }, { title: t('forgetDetail.last_access_time'), dataIndex: 'last_access_time', key: 'last_access_time', render: (last_access_time) => formatDateTime(last_access_time, 'YYYY-MM-DD HH:mm') }, { title: t('forgetDetail.activation_value'), dataIndex: 'activation_value', key: 'activation_value', }, ]} pagination={false} /> ) } export default ForgetOverview