From 39fd3657ddb93be92ca1df06ac87ceaa0cf3f552 Mon Sep 17 00:00:00 2001 From: zhangzhanwei Date: Mon, 17 Nov 2025 10:24:39 +0800 Subject: [PATCH] feat: Knowledge write node --- apps/application/flow/step_node/__init__.py | 3 +- .../knowledge_write_node/__init__.py | 8 ++ .../i_knowledge_write_node.py | 38 ++++++++ .../knowledge_write_node/impl/__init__.py | 8 ++ .../impl/base_knowledge_write_node.py | 19 ++++ .../assets/workflow/icon_knowledge_write.svg | 6 ++ ui/src/enums/application.ts | 1 + ui/src/locales/lang/en-US/common.ts | 1 + .../lang/en-US/views/application-workflow.ts | 5 + ui/src/locales/lang/zh-CN/common.ts | 1 + .../lang/zh-CN/views/application-workflow.ts | 5 + ui/src/locales/lang/zh-Hant/common.ts | 1 + .../zh-Hant/views/application-workflow.ts | 5 + ui/src/permission/knowledge/system-manage.ts | 2 +- ui/src/views/knowledge-workflow/index.vue | 2 +- ui/src/workflow/common/data.ts | 15 ++- .../icons/knowledge-write-node-icon.vue | 6 ++ .../nodes/knowledge-write-node/index.ts | 15 +++ .../nodes/knowledge-write-node/index.vue | 95 +++++++++++++++++++ 19 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 apps/application/flow/step_node/knowledge_write_node/__init__.py create mode 100644 apps/application/flow/step_node/knowledge_write_node/i_knowledge_write_node.py create mode 100644 apps/application/flow/step_node/knowledge_write_node/impl/__init__.py create mode 100644 apps/application/flow/step_node/knowledge_write_node/impl/base_knowledge_write_node.py create mode 100644 ui/src/assets/workflow/icon_knowledge_write.svg create mode 100644 ui/src/workflow/icons/knowledge-write-node-icon.vue create mode 100644 ui/src/workflow/nodes/knowledge-write-node/index.ts create mode 100644 ui/src/workflow/nodes/knowledge-write-node/index.vue diff --git a/apps/application/flow/step_node/__init__.py b/apps/application/flow/step_node/__init__.py index 382c5fedd..dbca4e20c 100644 --- a/apps/application/flow/step_node/__init__.py +++ b/apps/application/flow/step_node/__init__.py @@ -18,6 +18,7 @@ from .image_generate_step_node import * from .image_to_video_step_node import BaseImageToVideoNode from .image_understand_step_node import * from .intent_node import * +from .knowledge_write_node.impl.base_knowledge_write_node import BaseKnowledgeWriteNode from .loop_break_node import BaseLoopBreakNode from .loop_continue_node import BaseLoopContinueNode from .loop_node import * @@ -49,7 +50,7 @@ node_list = [BaseStartStepNode, BaseChatNode, BaseSearchKnowledgeNode, BaseSearc BaseIntentNode, BaseLoopNode, BaseLoopStartStepNode, BaseLoopContinueNode, BaseLoopBreakNode, BaseVariableSplittingNode, BaseParameterExtractionNode, BaseVariableAggregationNode, - BaseDataSourceLocalNode,BaseDataSourceWebNode] + BaseDataSourceLocalNode,BaseDataSourceWebNode,BaseKnowledgeWriteNode] def get_node(node_type): diff --git a/apps/application/flow/step_node/knowledge_write_node/__init__.py b/apps/application/flow/step_node/knowledge_write_node/__init__.py new file mode 100644 index 000000000..ea50569d5 --- /dev/null +++ b/apps/application/flow/step_node/knowledge_write_node/__init__.py @@ -0,0 +1,8 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: __init__.py.py + @date:2025/11/13 11:17 + @desc: +""" \ No newline at end of file diff --git a/apps/application/flow/step_node/knowledge_write_node/i_knowledge_write_node.py b/apps/application/flow/step_node/knowledge_write_node/i_knowledge_write_node.py new file mode 100644 index 000000000..eadb0becb --- /dev/null +++ b/apps/application/flow/step_node/knowledge_write_node/i_knowledge_write_node.py @@ -0,0 +1,38 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: i_knowledge_write_node.py + @date:2025/11/13 11:19 + @desc: +""" +from typing import Type + +from django.utils.translation import gettext_lazy as _ +from rest_framework import serializers + +from application.flow.i_step_node import INode, NodeResult + + + +class KnowledgeWriteNodeParamSerializer(serializers.Serializer): + paragraph_list = serializers.ListField(required=True, label=_("Paragraph list")) + chunk_length = serializers.CharField(required=True, label=_("Child chunk length")) + + + + +class IKnowledgeWriteNode(INode): + + def get_node_params_serializer_class(self) -> Type[serializers.Serializer]: + return KnowledgeWriteNodeParamSerializer + + + def _run(self): + return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data) + + def execute(self, paragraph_list, chunk_length, **kwargs) -> NodeResult: + pass + + type = 'knowledge-write-node' + diff --git a/apps/application/flow/step_node/knowledge_write_node/impl/__init__.py b/apps/application/flow/step_node/knowledge_write_node/impl/__init__.py new file mode 100644 index 000000000..077d74325 --- /dev/null +++ b/apps/application/flow/step_node/knowledge_write_node/impl/__init__.py @@ -0,0 +1,8 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: __init__.py.py + @date:2025/11/13 11:18 + @desc: +""" diff --git a/apps/application/flow/step_node/knowledge_write_node/impl/base_knowledge_write_node.py b/apps/application/flow/step_node/knowledge_write_node/impl/base_knowledge_write_node.py new file mode 100644 index 000000000..17b47f8d0 --- /dev/null +++ b/apps/application/flow/step_node/knowledge_write_node/impl/base_knowledge_write_node.py @@ -0,0 +1,19 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:niu + @file: base_knowledge_write_node.py + @date:2025/11/13 11:19 + @desc: +""" +from application.flow.i_step_node import NodeResult +from application.flow.step_node.knowledge_write_node.i_knowledge_write_node import IKnowledgeWriteNode + + +class BaseKnowledgeWriteNode(IKnowledgeWriteNode): + + def save_context(self, details, workflow_manage): + pass + + def execute(self, paragraph_list, chunk_length, **kwargs) -> NodeResult: + pass \ No newline at end of file diff --git a/ui/src/assets/workflow/icon_knowledge_write.svg b/ui/src/assets/workflow/icon_knowledge_write.svg new file mode 100644 index 000000000..755e027c1 --- /dev/null +++ b/ui/src/assets/workflow/icon_knowledge_write.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ui/src/enums/application.ts b/ui/src/enums/application.ts index 933ab6763..479855e28 100644 --- a/ui/src/enums/application.ts +++ b/ui/src/enums/application.ts @@ -40,6 +40,7 @@ export enum WorkflowType { ParameterExtractionNode = 'parameter-extraction-node', DataSourceLocalNode = 'data-source-local-node', DataSourceWebNode = 'data-source-web-node', + KnowledgeWriteNode = 'knowledge-write-node', } export enum WorkflowKind { DataSource = 'data-source', diff --git a/ui/src/locales/lang/en-US/common.ts b/ui/src/locales/lang/en-US/common.ts index 4c5f629ee..6ce0dab50 100644 --- a/ui/src/locales/lang/en-US/common.ts +++ b/ui/src/locales/lang/en-US/common.ts @@ -76,6 +76,7 @@ export default { }, aggregationStrategy: 'Aggregation Strategy', inputPlaceholder: 'Please input', + inputContent: 'Input content', selectPlaceholder: 'Please select', title: 'Title', content: 'Content', diff --git a/ui/src/locales/lang/en-US/views/application-workflow.ts b/ui/src/locales/lang/en-US/views/application-workflow.ts index 7ab3938ef..9bc8e206c 100644 --- a/ui/src/locales/lang/en-US/views/application-workflow.ts +++ b/ui/src/locales/lang/en-US/views/application-workflow.ts @@ -79,6 +79,11 @@ export default { loopNodeBreakNodeRequired: 'Wireless loop must have a Break node', }, nodes: { + knowledgeWriteNode: { + chunk_length: 'Chunk length', + text: 'Knowledge write', + label: 'Knowledge write', + }, dataSourceWebNode: { label: 'Web Site', text: 'Web Site', diff --git a/ui/src/locales/lang/zh-CN/common.ts b/ui/src/locales/lang/zh-CN/common.ts index f0dc6a198..c9077e5bd 100644 --- a/ui/src/locales/lang/zh-CN/common.ts +++ b/ui/src/locales/lang/zh-CN/common.ts @@ -80,6 +80,7 @@ export default { }, aggregationStrategy: '聚合策略', inputPlaceholder: '请输入', + inputContent: '输入内容', selectPlaceholder: '请选择', title: '标题', content: '内容', diff --git a/ui/src/locales/lang/zh-CN/views/application-workflow.ts b/ui/src/locales/lang/zh-CN/views/application-workflow.ts index f840d5ed6..9f6fea9c8 100644 --- a/ui/src/locales/lang/zh-CN/views/application-workflow.ts +++ b/ui/src/locales/lang/zh-CN/views/application-workflow.ts @@ -81,6 +81,11 @@ export default { loopNodeBreakNodeRequired: '无限循环 必须存在 Break 节点', }, nodes: { + knowledgeWriteNode: { + chunk_length: '子分块长度', + text: '知识库写入', + label: '知识库写入', + }, dataSourceWebNode: { label: 'Web站点', text: 'Web站点', diff --git a/ui/src/locales/lang/zh-Hant/common.ts b/ui/src/locales/lang/zh-Hant/common.ts index a040de098..b3a87d388 100644 --- a/ui/src/locales/lang/zh-Hant/common.ts +++ b/ui/src/locales/lang/zh-Hant/common.ts @@ -76,6 +76,7 @@ export default { }, aggregationStrategy: '聚合策略', inputPlaceholder: '請輸入', + inputContent: '輸入內容', selectPlaceholder: '請選擇', title: '標題', content: '内容', diff --git a/ui/src/locales/lang/zh-Hant/views/application-workflow.ts b/ui/src/locales/lang/zh-Hant/views/application-workflow.ts index f1ec72a1c..0bf97a87d 100644 --- a/ui/src/locales/lang/zh-Hant/views/application-workflow.ts +++ b/ui/src/locales/lang/zh-Hant/views/application-workflow.ts @@ -80,6 +80,11 @@ export default { loopNodeBreakNodeRequired: '無限循環必須存在Break節點', }, nodes: { + knowledgeWriteNode: { + chunk_length: '子分塊長度', + text: '知識庫寫入', + label: '知識庫寫入', + }, dataSourceWebNode: { label: 'Web網站', text: 'Web網站', diff --git a/ui/src/permission/knowledge/system-manage.ts b/ui/src/permission/knowledge/system-manage.ts index be65ab207..bb8a1dad0 100644 --- a/ui/src/permission/knowledge/system-manage.ts +++ b/ui/src/permission/knowledge/system-manage.ts @@ -185,7 +185,7 @@ const systemManage = { PermissionConst.RESOURCE_KNOWLEDGE_TAG_DELETE ],'OR' ), - bug: () => + debug: () => hasPermission([ RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_WORKFLOW_READ diff --git a/ui/src/views/knowledge-workflow/index.vue b/ui/src/views/knowledge-workflow/index.vue index 4b0b65856..91130dc67 100644 --- a/ui/src/views/knowledge-workflow/index.vue +++ b/ui/src/views/knowledge-workflow/index.vue @@ -30,7 +30,7 @@ {{ $t('views.knowledgeWorkflow.setting.addComponent') }} - + {{ $t('views.knowledgeWorkflow.setting.debug') }} diff --git a/ui/src/workflow/common/data.ts b/ui/src/workflow/common/data.ts index b085f7ea8..6b9d3f5bf 100644 --- a/ui/src/workflow/common/data.ts +++ b/ui/src/workflow/common/data.ts @@ -119,7 +119,19 @@ export const dataSourceWebNode = { ], }, }, +} +export const knowledgeWriteNode = { + type: WorkflowType.KnowledgeWriteNode, + text: t('views.applicationWorkflow.nodes.knowledgeWriteNode.text'), + label: t('views.applicationWorkflow.nodes.knowledgeWriteNode.label'), + properties: { + height: 252, + stepName: t('views.applicationWorkflow.nodes.knowledgeWriteNode.label'), + config: { + fields:[] + }, + }, } @@ -706,7 +718,7 @@ export const knowledgeMenuNodes = [ }, { label: t('views.knowledge.title'), - list: [documentExtractNode], + list: [documentExtractNode, knowledgeWriteNode], }, { label: t('views.applicationWorkflow.nodes.classify.businessLogic'), @@ -952,6 +964,7 @@ export const nodeDict: any = { [WorkflowType.KnowledgeBase]: knowledgeBaseNode, [WorkflowType.DataSourceLocalNode]: dataSourceLocalNode, [WorkflowType.DataSourceWebNode]: dataSourceWebNode, + [WorkflowType.KnowledgeWriteNode]: knowledgeWriteNode, } export function isWorkFlow(type: string | undefined) { diff --git a/ui/src/workflow/icons/knowledge-write-node-icon.vue b/ui/src/workflow/icons/knowledge-write-node-icon.vue new file mode 100644 index 000000000..2408c9f3d --- /dev/null +++ b/ui/src/workflow/icons/knowledge-write-node-icon.vue @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/ui/src/workflow/nodes/knowledge-write-node/index.ts b/ui/src/workflow/nodes/knowledge-write-node/index.ts new file mode 100644 index 000000000..0318f1c19 --- /dev/null +++ b/ui/src/workflow/nodes/knowledge-write-node/index.ts @@ -0,0 +1,15 @@ +import KnowledgeWriteVue from './index.vue' +import { AppNode, AppNodeModel } from '@/workflow/common/app-node' + + +class KnowledgeWriteNode extends AppNode { + constructor(props: any) { + super(props, KnowledgeWriteVue) + } +} + +export default { + type: 'knowledge-write-node', + model: AppNodeModel, + view: KnowledgeWriteNode, +} \ No newline at end of file diff --git a/ui/src/workflow/nodes/knowledge-write-node/index.vue b/ui/src/workflow/nodes/knowledge-write-node/index.vue new file mode 100644 index 000000000..007cbf95a --- /dev/null +++ b/ui/src/workflow/nodes/knowledge-write-node/index.vue @@ -0,0 +1,95 @@ + + + + +