feat(workflow): 添加消息队列节点 (MqNode) 及其相关配置和翻译支持

pull/21533/head
ziqiang 11 months ago
parent 945d1569ee
commit e4b143094c

File diff suppressed because it is too large Load Diff

@ -100,6 +100,12 @@ export const BLOCKS: Block[] = [
type: BlockEnum.Agent,
title: 'Agent',
},
{
classification: BlockClassificationEnum.Utilities,
type: BlockEnum.MqNode,
title: 'MqNode',
description: '一个简单的输入节点',
},
]
export const BLOCK_CLASSIFICATIONS: string[] = [

@ -168,6 +168,15 @@ export const NODES_EXTRA_DATA: Record<BlockEnum, NodesExtraData> = {
getAvailableNextNodes: HttpRequestDefault.getAvailableNextNodes,
checkValid: HttpRequestDefault.checkValid,
},
[BlockEnum.MqNode]: {
author: 'Zzq',
about: '',
availablePrevNodes: [],
availableNextNodes: [],
getAvailablePrevNodes: HttpRequestDefault.getAvailablePrevNodes,
getAvailableNextNodes: HttpRequestDefault.getAvailableNextNodes,
checkValid: HttpRequestDefault.checkValid,
},
[BlockEnum.VariableAssigner]: {
author: 'Dify',
about: '',
@ -346,6 +355,13 @@ export const NODES_INITIAL_DATA = {
variables: [],
...HttpRequestDefault.defaultValue,
},
[BlockEnum.MqNode]: {
type: BlockEnum.MqNode,
title: '',
desc: '',
variables: [],
...HttpRequestDefault.defaultValue,
},
[BlockEnum.ParameterExtractor]: {
type: BlockEnum.ParameterExtractor,
title: '',

@ -100,6 +100,9 @@ export const useChecklist = (nodes: Node[], edges: Edge[]) => {
if (node.type === CUSTOM_NODE) {
const checkData = getCheckData(node.data)
console.log('node', node)
console.log('checkData', checkData)
console.log('nodesExtraData', nodesExtraData)
const { errorMessage } = nodesExtraData[node.data.type].checkValid(checkData, t, moreDataForCheckValid)
if (errorMessage || !validNodes.find(n => n.id === node.id)) {

@ -38,6 +38,7 @@ import ListFilterNode from './list-operator/node'
import ListFilterPanel from './list-operator/panel'
import AgentNode from './agent/node'
import AgentPanel from './agent/panel'
import MqNode from './mq/node'
import { TransferMethod } from '@/types/app'
export const NodeComponentMap: Record<string, ComponentType<any>> = {
@ -51,6 +52,7 @@ export const NodeComponentMap: Record<string, ComponentType<any>> = {
[BlockEnum.Code]: CodeNode,
[BlockEnum.TemplateTransform]: TemplateTransformNode,
[BlockEnum.HttpRequest]: HttpNode,
[BlockEnum.MqNode]: MqNode,
[BlockEnum.Tool]: ToolNode,
[BlockEnum.VariableAssigner]: VariableAssignerNode,
[BlockEnum.Assigner]: AssignerNode,
@ -84,6 +86,7 @@ export const PanelComponentMap: Record<string, ComponentType<any>> = {
[BlockEnum.DocExtractor]: DocExtractorPanel,
[BlockEnum.ListFilter]: ListFilterPanel,
[BlockEnum.Agent]: AgentPanel,
[BlockEnum.MqNode]: MqNode,
}
export const CUSTOM_NODE_TYPE = 'custom'

@ -14,6 +14,7 @@ import BasePanel from './_base/panel'
const CustomNode = (props: NodeProps) => {
const nodeData = props.data
console.log('zzq see nodeData', props)
const NodeComponent = NodeComponentMap[nodeData.type]
return (

@ -116,6 +116,7 @@ export const useNodeLoopInteractions = () => {
return childrenNodes.map((child, index) => {
const childNodeType = child.data.type as BlockEnum
const nodesWithSameType = nodes.filter(node => node.data.type === childNodeType)
console.log('childNodeType', childNodeType)
const { newNode } = generateNewNode({
type: getNodeCustomTypeByNodeDataType(childNodeType),
data: {

@ -0,0 +1,73 @@
import type { FC } from 'react'
import React from 'react'
import type { NodeProps } from '@/app/components/workflow/types'
const MqNode: FC<NodeProps<any>> = ({ data }) => {
return (
<div style={{
marginBottom: '16px',
padding: '12px',
backgroundColor: '#f8f9fa',
borderRadius: '8px',
boxShadow: '0 1px 3px rgba(0,0,0,0.1)',
}}>
<div style={{ marginBottom: '12px' }}>
<label style={{
display: 'block',
marginBottom: '4px',
fontSize: '14px',
color: '#495057',
fontWeight: '500',
}}>
Channel Name
</label>
<input
style={{
width: '100%',
padding: '8px 12px',
border: '1px solid #ced4da',
borderRadius: '4px',
fontSize: '14px',
transition: 'border-color 0.15s ease-in-out',
boxSizing: 'border-box',
}}
type="text"
value={data.channelName || ''}
placeholder="请输入频道名称"
readOnly
/>
</div>
<div>
<label style={{
display: 'block',
marginBottom: '4px',
fontSize: '14px',
color: '#495057',
fontWeight: '500',
}}>
Message
</label>
<textarea
style={{
width: '100%',
padding: '8px 12px',
border: '1px solid #ced4da',
borderRadius: '4px',
fontSize: '14px',
transition: 'border-color 0.15s ease-in-out',
boxSizing: 'border-box',
minHeight: '100px',
resize: 'vertical',
fontFamily: 'inherit',
lineHeight: '1.5',
}}
value={data.mqValue || ''}
placeholder="请输入要发送的消息"
readOnly
/>
</div>
</div>
)
}
export default React.memo(MqNode)

@ -41,6 +41,7 @@ export enum BlockEnum {
Loop = 'loop',
LoopStart = 'loop-start',
LoopEnd = 'loop-end',
MqNode = 'MqNode',
}
export enum ControlMode {

@ -233,6 +233,7 @@ const translation = {
blocks: {
'start': 'Start',
'end': 'End',
'MqNode': '消息队列',
'answer': 'Answer',
'llm': 'LLM',
'knowledge-retrieval': 'Knowledge Retrieval',

@ -233,6 +233,7 @@ const translation = {
},
blocks: {
'start': '开始',
'MqNode': '消息队列',
'end': '结束',
'answer': '直接回复',
'llm': 'LLM',

@ -237,6 +237,7 @@ const translation = {
'start': '開始',
'end': '結束',
'answer': '直接回覆',
'MqNode': '消息队列',
'llm': 'LLM',
'knowledge-retrieval': '知識檢索',
'question-classifier': '問題分類器',

Loading…
Cancel
Save