-
{t('knowledgeBase.shareTitle')}
-
{t('knowledgeBase.shareNote')}
+
{t('knowledgeBase.shareSpaceTitle')}
+
{t('knowledgeBase.shareSpaceNote')}
{spaceList.length === 0 && (
diff --git a/web/src/views/KnowledgeBase/types.ts b/web/src/views/KnowledgeBase/types.ts
index 95fa5b90..373de344 100644
--- a/web/src/views/KnowledgeBase/types.ts
+++ b/web/src/views/KnowledgeBase/types.ts
@@ -105,14 +105,14 @@ export interface ParserConfig {
user_agent?: string; // 用户代理
// Third-party 类型特有字段
- third_party_platform?: 'yuque' | 'feishu'; // 第三方平台类型
+ _third_party_platform?: 'yuque' | 'feishu'; // 第三方平台类型
// 语雀字段
yuque_user_id?: string; // 语雀用户ID
yuque_token?: string; // 语雀Token
// 飞书字段
- app_id?: string; // 飞书应用ID
- app_secret?: string; // 飞书应用密钥
- folder_token?: string; // 飞书文件夹Token
+ feishu_app_id?: string; // 飞书应用ID
+ feishu_app_secret?: string; // 飞书应用密钥
+ feishu_folder_token?: string; // 飞书文件夹Token
}
// 文件数据
export interface KnowledgeBaseDocumentData { // 知识库文档数据
diff --git a/web/src/views/MemoryExtractionEngine/components/Result.tsx b/web/src/views/MemoryExtractionEngine/components/Result.tsx
index cb89661a..68ff397b 100644
--- a/web/src/views/MemoryExtractionEngine/components/Result.tsx
+++ b/web/src/views/MemoryExtractionEngine/components/Result.tsx
@@ -2,7 +2,7 @@
* @Author: ZhaoYing
* @Date: 2026-02-03 17:30:11
* @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-02-04 10:08:49
+ * @Last Modified time: 2026-02-09 21:04:14
*/
/**
* Result Component
@@ -21,7 +21,7 @@ import type { AnyObject } from 'antd/es/_util/type';
import Card from './Card'
import RbCard from '@/components/RbCard/Card'
import RbAlert from '@/components/RbAlert'
-import type { TestResult } from '../types'
+import type { TestResult, OntologyCoverage } from '../types'
import { pilotRunMemoryExtractionConfig } from '@/api/memory'
import { type SSEMessage } from '@/utils/stream'
import Tag, { type TagProps } from '@/components/Tag'
@@ -78,6 +78,7 @@ const Result: FC
= ({ loading, handleSave }) => {
const [knowledgeExtraction, setKnowledgeExtraction] = useState(initObj as ModuleItem)
const [creatingNodesEdges, setCreatingNodesEdges] = useState(initObj as ModuleItem)
const [deduplication, setDeduplication] = useState(initObj as ModuleItem)
+ const [ontologyCoverage, setOntologyCoverage] = useState({} as OntologyCoverage)
const [runForm] = Form.useForm()
@@ -181,6 +182,7 @@ const Result: FC = ({ loading, handleSave }) => {
break
case 'result': // Result
setTestResult(data.data?.extracted_result)
+ setOntologyCoverage(data.data?.ontology_coverage)
break
}
})
@@ -284,8 +286,8 @@ const Result: FC = ({ loading, handleSave }) => {
headerType="borderL"
headerClassName="rb:before:bg-[#155EEF]!"
>
- {knowledgeExtraction.data.map(vo =>
- {vo.statement}
+ {knowledgeExtraction.data.map((vo, index) =>
+ {vo.statement}
)}
{formatTime(knowledgeExtraction)}
{knowledgeExtraction.result && } className="rb:mt-3">
@@ -450,6 +452,36 @@ const Result: FC = ({ loading, handleSave }) => {
}
+ {ontologyCoverage && Object.keys(ontologyCoverage).length > 0 &&
+ {t('memoryExtractionEngine.ontologyCoverage')}({ontologyCoverage.total_entities})>}
+ headerType="borderL"
+ headerClassName="rb:before:bg-[#369F21]!"
+ >
+
+ {(['scene_type_distribution', 'general_type_distribution', 'unmatched'] as const).map((key, idx) => {
+ if (!ontologyCoverage[key]) return null
+ return (
+
+
{t(`memoryExtractionEngine.${key}`)}({ontologyCoverage[key].type_count})
+
{t('memoryExtractionEngine.entity_total', { num: ontologyCoverage[key].entity_total })}
+
+ {ontologyCoverage[key].types.map((type, index) => {
+ if (!type.type || type.type === '') return null
+ return (
+
+ -{type.type}({type.count})
+
+ )
+ })}
+
+
+ )
+ })}
+
+
+ }
+
diff --git a/web/src/views/MemoryExtractionEngine/types.ts b/web/src/views/MemoryExtractionEngine/types.ts
index cbf0cca6..af38c240 100644
--- a/web/src/views/MemoryExtractionEngine/types.ts
+++ b/web/src/views/MemoryExtractionEngine/types.ts
@@ -1,8 +1,8 @@
/*
* @Author: ZhaoYing
* @Date: 2026-02-03 17:29:55
- * @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-02-03 17:29:55
+ * @Last Modified by: ZhaoYing
+ * @Last Modified time: 2026-02-09 20:56:31
*/
/**
* Memory Extraction Engine Configuration Form Types
@@ -106,4 +106,17 @@ export interface TestResult {
predicate: string;
object: string;
}[];
+}
+
+interface OntologyCoverageItem {
+ type_count: number;
+ entity_total: number;
+ types: Array<{ type: string; count: number; }>
+}
+export interface OntologyCoverage {
+ scene_type_distribution: OntologyCoverageItem;
+ general_type_distribution: OntologyCoverageItem;
+ unmatched: OntologyCoverageItem;
+ total_entities: number;
+ time: number;
}
\ No newline at end of file
diff --git a/web/src/views/Ontology/components/PageHeader.tsx b/web/src/views/Ontology/components/PageHeader.tsx
index 087a6d49..56fa8cfc 100644
--- a/web/src/views/Ontology/components/PageHeader.tsx
+++ b/web/src/views/Ontology/components/PageHeader.tsx
@@ -2,7 +2,7 @@
* @Author: ZhaoYing
* @Date: 2026-02-03 14:10:24
* @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-02-03 14:10:56
+ * @Last Modified time: 2026-02-09 18:02:13
*/
import { type FC, type ReactNode } from 'react';
import { useNavigate } from 'react-router-dom';
@@ -45,7 +45,7 @@ const PageHeader: FC
= ({
}
return (
-
+
{name}
diff --git a/web/src/views/Ontology/pages/Detail.tsx b/web/src/views/Ontology/pages/Detail.tsx
index a61a83a2..4426e96c 100644
--- a/web/src/views/Ontology/pages/Detail.tsx
+++ b/web/src/views/Ontology/pages/Detail.tsx
@@ -1,8 +1,8 @@
/*
* @Author: ZhaoYing
* @Date: 2026-02-03 14:10:20
- * @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-02-03 14:10:20
+ * @Last Modified by: ZhaoYing
+ * @Last Modified time: 2026-02-09 17:56:35
*/
import { type FC, useEffect, useState, useRef } from 'react'
import { useParams } from 'react-router-dom';
@@ -100,7 +100,7 @@ const Detail: FC = () => {
<>
{data.scene_description} }
+ subTitle={
{data.scene_description}
}
extra={
diff --git a/web/src/views/UserMemoryDetail/pages/EpisodicDetail.tsx b/web/src/views/UserMemoryDetail/pages/EpisodicDetail.tsx
index af6bc76c..2bb4dfd8 100644
--- a/web/src/views/UserMemoryDetail/pages/EpisodicDetail.tsx
+++ b/web/src/views/UserMemoryDetail/pages/EpisodicDetail.tsx
@@ -242,7 +242,7 @@ const EpisodicDetail: FC = () => {
{detail.content_records.map((vo, index) => - {vo}
)}
- {t('episodicDetail.emotion')}: {t(`statementDetail.${detail.emotion}`)}
+ {t('episodicDetail.emotion')}: {t(`episodicDetail.${detail.emotion || 'none'}`)}
)
diff --git a/web/src/views/Workflow/components/Chat/Chat.tsx b/web/src/views/Workflow/components/Chat/Chat.tsx
index cecfa5f6..95f43a9c 100644
--- a/web/src/views/Workflow/components/Chat/Chat.tsx
+++ b/web/src/views/Workflow/components/Chat/Chat.tsx
@@ -1,8 +1,8 @@
/*
* @Author: ZhaoYing
* @Date: 2026-02-06 21:10:56
- * @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-02-06 21:10:56
+ * @Last Modified by: ZhaoYing
+ * @Last Modified time: 2026-02-10 12:17:41
*/
/**
* Workflow Chat Component
@@ -99,6 +99,8 @@ const Chat = forwardRef(({ appId
setChatList([])
setVariables([])
setConversationId(null)
+ setMessage(undefined)
+ setFileList([])
}
/**
* Opens the variable configuration modal
@@ -148,7 +150,7 @@ const Chat = forwardRef(({ appId
return
}
- // setLoading(true)
+ setLoading(true)
const message = msg
setChatList(prev => [...prev, {
role: 'user',
@@ -284,6 +286,7 @@ const Chat = forwardRef(({ appId
return newList
})
setStreamLoading(false)
+ setLoading(false)
break
}
diff --git a/web/src/views/Workflow/components/Properties/index.tsx b/web/src/views/Workflow/components/Properties/index.tsx
index 8180fd63..9e6e418b 100644
--- a/web/src/views/Workflow/components/Properties/index.tsx
+++ b/web/src/views/Workflow/components/Properties/index.tsx
@@ -2,7 +2,7 @@
* @Author: ZhaoYing
* @Date: 2026-02-03 15:39:59
* @Last Modified by: ZhaoYing
- * @Last Modified time: 2026-02-05 14:21:45
+ * @Last Modified time: 2026-02-09 19:56:42
*/
import { type FC, useEffect, useState, useMemo } from "react";
import clsx from 'clsx'
@@ -491,7 +491,7 @@ const Properties: FC = ({
if (config.type === 'messageEditor') {
return (
-
+
{
- if (key === 'memory' && nodeLibraryConfig.config && nodeLibraryConfig.config[key]) {
+ if (type === 'memory-write' && key === 'message' && nodeLibraryConfig.config) {
+ nodeLibraryConfig.config['messages'].defaultValue = [{ role: 'USER', content: config[key] }]
+ delete nodeLibraryConfig.config[key]
+ } else if (key === 'memory' && nodeLibraryConfig.config && nodeLibraryConfig.config[key]) {
const { memory, messages } = config as any;
if (memory?.enable && messages && messages.length > 0) {
const lastMessage = messages[messages.length - 1]