From 33df2568638f84ce6a7446e6f519213b867f184e Mon Sep 17 00:00:00 2001 From: v-zhangjc9 Date: Wed, 25 Jun 2025 17:25:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E5=A2=9E=E5=8A=A0=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=BA=93=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/src/pages/ai/flow/FlowEditor.tsx | 64 +++++++++++++++---- .../src/pages/ai/flow/node/KnowledgeNode.tsx | 59 +++++++++++++++++ .../client/src/pages/ai/flow/node/LlmNode.tsx | 2 +- 3 files changed, 111 insertions(+), 14 deletions(-) create mode 100644 service-web/client/src/pages/ai/flow/node/KnowledgeNode.tsx diff --git a/service-web/client/src/pages/ai/flow/FlowEditor.tsx b/service-web/client/src/pages/ai/flow/FlowEditor.tsx index d102146..9db0218 100644 --- a/service-web/client/src/pages/ai/flow/FlowEditor.tsx +++ b/service-web/client/src/pages/ai/flow/FlowEditor.tsx @@ -20,6 +20,7 @@ import styled from 'styled-components' import '@xyflow/react/dist/style.css' import {amisRender, commonInfo, horizontalFormOptions} from '../../../util/amis.tsx' import EndNode from './node/EndNode.tsx' +import KnowledgeNode from './node/KnowledgeNode.tsx' import LlmNode from './node/LlmNode.tsx' import StartNode from './node/StartNode.tsx' import {useDataStore} from './store/DataStore.ts' @@ -84,6 +85,11 @@ function FlowEditor() { name: '大模型', component: LlmNode, }, + { + key: 'knowledge-amis-node', + name: '知识库', + component: KnowledgeNode, + }, ]) const [open, setOpen] = useState(false) @@ -229,52 +235,78 @@ function FlowEditor() { "id": "BMFP3Eov94", "type": "start-amis-node", "position": { - "x": 10, - "y": 100 + "x": 8, + "y": 272 }, "data": {}, "measured": { "width": 256, - "height": 83 + "height": 75 }, - "selected": false + "selected": false, + "dragging": false }, { "id": "PYK8LjduQ1", "type": "end-amis-node", "position": { - "x": 654, - "y": 332 + "x": 736, + "y": 317 }, "data": {}, "measured": { "width": 256, - "height": 83 + "height": 75 }, - "selected": false, + "selected": true, "dragging": false }, { "id": "nCm-ij5I6o", "type": "llm-amis-node", "position": { - "x": 318, - "y": 208 + "x": 438, + "y": 113 }, "data": {}, "measured": { "width": 256, - "height": 83 + "height": 75 }, - "selected": true, + "selected": false, + "dragging": false + }, + { + "id": "9RIg65O0YQ", + "type": "knowledge-amis-node", + "position": { + "x": 352, + "y": 387 + }, + "data": {}, + "measured": { + "width": 256, + "height": 75 + }, + "selected": false, "dragging": false } ], "edges": [ { "source": "BMFP3Eov94", + "target": "9RIg65O0YQ", + "id": "xy-edge__BMFP3Eov94-9RIg65O0YQ" + }, + { + "source": "9RIg65O0YQ", "target": "nCm-ij5I6o", - "id": "xy-edge__BMFP3Eov94-nCm-ij5I6o" + "id": "xy-edge__9RIg65O0YQ-nCm-ij5I6o" + }, + { + "source": "nCm-ij5I6o", + "target": "PYK8LjduQ1", + "id": "xy-edge__nCm-ij5I6o-PYK8LjduQ1" } ], "data": { @@ -297,6 +329,12 @@ function FlowEditor() { } }, "systemPrompt": "你是个沙雕" + }, + "9RIg65O0YQ": { + "count": 3, + "score": 0.75, + "knowledgeId": 3585368238960640, + "query": "hello world" } } }`) diff --git a/service-web/client/src/pages/ai/flow/node/KnowledgeNode.tsx b/service-web/client/src/pages/ai/flow/node/KnowledgeNode.tsx new file mode 100644 index 0000000..ff39dc1 --- /dev/null +++ b/service-web/client/src/pages/ai/flow/node/KnowledgeNode.tsx @@ -0,0 +1,59 @@ +import type {NodeProps} from '@xyflow/react' +import {commonInfo} from '../../../../util/amis.tsx' +import AmisNode from './AmisNode.tsx' + +// @ts-ignore +const KnowledgeNode = (props: NodeProps) => AmisNode( + props, + 'normal', + '知识库', + '查询知识库获取外部知识', + undefined, + [ + { + type: 'select', + name: 'knowledgeId', + label: '知识库', + required: true, + options: [], + source: { + method: 'get', + url: `${commonInfo.baseAiUrl}/knowledge/list`, + // @ts-ignore + adaptor: (payload, response, api, context) => { + return { + ...payload, + data: { + items: payload.data.items.map((item: any) => ({value: item['id'], label: item['name']})), + } + } + }, + }, + }, + { + type: 'input-text', + name: 'query', + label: '查询文本', + required: true, + }, + { + type: 'input-range', + name: 'count', + label: '返回数量', + required: true, + value: 3, + max: 10, + }, + { + type: 'input-range', + name: 'score', + label: '匹配阀值', + required: true, + value: 0.6, + max: 1, + step: 0.05, + }, + ], +) + +export default KnowledgeNode \ No newline at end of file diff --git a/service-web/client/src/pages/ai/flow/node/LlmNode.tsx b/service-web/client/src/pages/ai/flow/node/LlmNode.tsx index 815d874..09768d5 100644 --- a/service-web/client/src/pages/ai/flow/node/LlmNode.tsx +++ b/service-web/client/src/pages/ai/flow/node/LlmNode.tsx @@ -4,7 +4,7 @@ import AmisNode, {outputsFormColumns} from './AmisNode.tsx' const LlmNode = (props: NodeProps) => AmisNode( props, 'normal', - '大模型节点', + '大模型', '使用大模型对话', undefined, [