From cbcbbc41af43ee56a6e32d677ba95bb18625e611 Mon Sep 17 00:00:00 2001 From: balibabu Date: Fri, 26 Dec 2025 12:10:13 +0800 Subject: [PATCH] Feat: The agent can only retrieve content from the knowledge base or memory. #4213 (#12224) ### What problem does this PR solve? Feat: The agent can only retrieve content from the knowledge base or memory. #4213 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/layouts/next-header.tsx | 2 +- web/src/locales/en.ts | 4 +- web/src/locales/zh.ts | 4 +- web/src/pages/agent/constant/index.tsx | 6 ++ .../pages/agent/form/retrieval-form/next.tsx | 69 ++++++++++++++++--- .../form/tool-form/retrieval-form/index.tsx | 28 +++++--- 6 files changed, 90 insertions(+), 23 deletions(-) diff --git a/web/src/layouts/next-header.tsx b/web/src/layouts/next-header.tsx index fe48fa1c7..b2504534b 100644 --- a/web/src/layouts/next-header.tsx +++ b/web/src/layouts/next-header.tsx @@ -79,7 +79,7 @@ export function Header() { { path: Routes.Chats, name: t('header.chat'), icon: MessageSquareText }, { path: Routes.Searches, name: t('header.search'), icon: Search }, { path: Routes.Agents, name: t('header.flow'), icon: Cpu }, - { path: Routes.Memories, name: t('header.Memories'), icon: Cpu }, + { path: Routes.Memories, name: t('header.memories'), icon: Cpu }, { path: Routes.Files, name: t('header.fileManager'), icon: File }, ], [t], diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 7ebbb7ceb..1779129ee 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -99,7 +99,7 @@ export default { search: 'Search', welcome: 'Welcome to', dataset: 'Dataset', - Memories: 'Memory', + memories: 'Memory', }, memories: { llmTooltip: @@ -2169,7 +2169,7 @@ Important structured information may include: names, dates, locations, events, k agentStatus: 'Agent status:', }, saveToMemory: 'Save to memory', - memory: 'Memory', + retrievalFrom: 'Retrieval from', }, llmTools: { bad_calculator: { diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index 848749c28..4570233ca 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -93,7 +93,7 @@ export default { search: '搜索', welcome: '欢迎来到', dataset: '知识库', - Memories: '记忆', + memories: '记忆', }, memories: { llmTooltip: '分析对话内容,提取关键信息,并生成结构化的记忆摘要。', @@ -1970,7 +1970,7 @@ Tokenizer 会根据所选方式将内容存储为对应的数据结构。`, agentStatus: '智能体状态:', }, saveToMemory: '保存到Memory', - memory: 'Memory', + retrievalFrom: '检索来源', }, footer: { profile: 'All rights reserved @ React', diff --git a/web/src/pages/agent/constant/index.tsx b/web/src/pages/agent/constant/index.tsx index c548b896a..5f840d0d0 100644 --- a/web/src/pages/agent/constant/index.tsx +++ b/web/src/pages/agent/constant/index.tsx @@ -79,6 +79,11 @@ export const DataOperationsOperatorOptions = [ export const SwitchElseTo = 'end_cpn_ids'; +export enum RetrievalFrom { + Dataset = 'dataset', + Memory = 'memory', +} + export const initialRetrievalValues = { query: AgentGlobalsSysQueryWithBrace, top_n: 8, @@ -91,6 +96,7 @@ export const initialRetrievalValues = { use_kg: false, toc_enhance: false, cross_languages: [], + retrieval_from: RetrievalFrom.Dataset, outputs: { formalized_content: { type: 'string', diff --git a/web/src/pages/agent/form/retrieval-form/next.tsx b/web/src/pages/agent/form/retrieval-form/next.tsx index da82a105b..b4f60e5f8 100644 --- a/web/src/pages/agent/form/retrieval-form/next.tsx +++ b/web/src/pages/agent/form/retrieval-form/next.tsx @@ -20,14 +20,20 @@ import { FormLabel, FormMessage, } from '@/components/ui/form'; +import { Radio } from '@/components/ui/radio'; import { Textarea } from '@/components/ui/textarea'; import { UseKnowledgeGraphFormField } from '@/components/use-knowledge-graph-item'; import { zodResolver } from '@hookform/resolvers/zod'; import { memo, useMemo } from 'react'; -import { useForm, useFormContext } from 'react-hook-form'; +import { + UseFormReturn, + useForm, + useFormContext, + useWatch, +} from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; -import { initialRetrievalValues } from '../../constant'; +import { RetrievalFrom, initialRetrievalValues } from '../../constant'; import { useWatchFormChange } from '../../hooks/use-watch-form-change'; import { INextOperatorForm } from '../../interface'; import { FormWrapper } from '../components/form-wrapper'; @@ -55,6 +61,42 @@ export const FormSchema = z.object({ ...RetrievalPartialSchema, }); +export function MemoryDatasetForm() { + const { t } = useTranslation(); + const form = useFormContext(); + const retrievalFrom = useWatch({ + control: form.control, + name: 'retrieval_from', + }); + + return ( + <> + + + + {t('knowledgeDetails.dataset')} + + {t('header.memories')} + + + {retrievalFrom === RetrievalFrom.Memory ? ( + + ) : ( + + )} + + ); +} + +export function useHideKnowledgeGraphField(form: UseFormReturn) { + const retrievalFrom = useWatch({ + control: form.control, + name: 'retrieval_from', + }); + + return retrievalFrom === RetrievalFrom.Memory; +} + export function EmptyResponseField() { const { t } = useTranslation(); const form = useFormContext(); @@ -106,6 +148,8 @@ function RetrievalForm({ node }: INextOperatorForm) { resolver: zodResolver(FormSchema), }); + const hideKnowledgeGraphField = useHideKnowledgeGraphField(form); + useWatchFormChange(node?.id, form); return ( @@ -114,8 +158,7 @@ function RetrievalForm({ node }: INextOperatorForm) { - - + {t('flow.advancedSettings')}}> - - + {hideKnowledgeGraphField || ( + <> + + + + )} - - - + {hideKnowledgeGraphField || ( + <> + + + + + )} diff --git a/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx b/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx index d237d0b41..84cb0896c 100644 --- a/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx +++ b/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx @@ -1,8 +1,6 @@ import { Collapse } from '@/components/collapse'; import { CrossLanguageFormField } from '@/components/cross-language-form-field'; import { FormContainer } from '@/components/form-container'; -import { KnowledgeBaseFormField } from '@/components/knowledge-base-item'; -import { MemoriesFormField } from '@/components/memories-form-field'; import { MetadataFilter } from '@/components/metadata-filter'; import { RerankFormFields } from '@/components/rerank'; import { SimilaritySliderFormField } from '@/components/similarity-slider'; @@ -18,7 +16,9 @@ import { DescriptionField } from '../../components/description-field'; import { FormWrapper } from '../../components/form-wrapper'; import { EmptyResponseField, + MemoryDatasetForm, RetrievalPartialSchema, + useHideKnowledgeGraphField, } from '../../retrieval-form/next'; import { useValues } from '../use-values'; import { useWatchFormChange } from '../use-watch-change'; @@ -36,14 +36,15 @@ const RetrievalForm = () => { resolver: zodResolver(FormSchema), }); + const hideKnowledgeGraphField = useHideKnowledgeGraphField(form); + useWatchFormChange(form); return (
- - + {t('flow.advancedSettings')}}> { isTooltipShown > - - + {hideKnowledgeGraphField || ( + <> + + + + )} + - - - + {hideKnowledgeGraphField || ( + <> + + + + + )}