new nofe、、

This commit is contained in:
Typer_Body
2026-05-23 03:21:31 +08:00
parent 8ebfcd963a
commit b5c43cc113
6 changed files with 63 additions and 1 deletions

View File

@@ -64,6 +64,7 @@ class NodeMetadataValidator:
'plugin-selector',
'webhook-url',
'embed-code',
'workflow-selector',
}
def validate(self, metadata: dict[str, Any]) -> list[str]:

View File

@@ -2,7 +2,7 @@
name: call_workflow
label:
en_US: Call Workflow
zh_Hans: 调用工作流
zh_Hans: 调用 工作流
category: action
icon: Workflow
color: '#8b5cf6'

View File

@@ -27,6 +27,7 @@ import {
RerankModel,
Pipeline,
PluginTool,
Workflow,
} from '@/app/infra/entities/api';
import { toast } from 'sonner';
import { useTranslation } from 'react-i18next';
@@ -114,6 +115,7 @@ export default function DynamicFormItemComponent({
const [knowledgeBases, setKnowledgeBases] = useState<KnowledgeBase[]>([]);
const [bots, setBots] = useState<Bot[]>([]);
const [pipelines, setPipelines] = useState<Pipeline[]>([]);
const [workflows, setWorkflows] = useState<Workflow[]>([]);
const [tools, setTools] = useState<PluginTool[]>([]);
const [uploading, setUploading] = useState<boolean>(false);
const [kbDialogOpen, setKbDialogOpen] = useState(false);
@@ -295,6 +297,19 @@ export default function DynamicFormItemComponent({
}
}, [config.type]);
useEffect(() => {
if (config.type === DynamicFormItemType.WORKFLOW_SELECTOR) {
httpClient
.getWorkflows()
.then((resp) => {
setWorkflows(resp.workflows);
})
.catch((err) => {
toast.error(t('workflows.loadWorkflowsFailed') + err.msg);
});
}
}, [config.type]);
switch (config.type) {
case DynamicFormItemType.INT:
case DynamicFormItemType.FLOAT:
@@ -1397,6 +1412,43 @@ export default function DynamicFormItemComponent({
</Select>
);
case DynamicFormItemType.WORKFLOW_SELECTOR:
return (
<Select value={field.value ?? ''} onValueChange={field.onChange}>
<SelectTrigger className="bg-[#ffffff] dark:bg-[#2a2a2e]">
{field.value ? (
(() => {
const selectedWorkflow = workflows.find(
(workflow) => workflow.uuid === field.value,
);
return (
<span className="truncate">
{selectedWorkflow?.name ?? field.value}
</span>
);
})()
) : (
<SelectValue placeholder={t('workflows.selectWorkflow')} />
)}
</SelectTrigger>
<SelectContent>
<SelectGroup>
{workflows.length === 0 ? (
<div className="px-2 py-3 text-sm text-muted-foreground">
{t('workflows.noWorkflowsFound')}
</div>
) : (
workflows.map((workflow) => (
<SelectItem key={workflow.uuid} value={workflow.uuid ?? ''}>
{workflow.name}
</SelectItem>
))
)}
</SelectGroup>
</SelectContent>
</Select>
);
case DynamicFormItemType.TOOLS_SELECTOR:
return (
<>

View File

@@ -39,6 +39,7 @@ export enum DynamicFormItemType {
EMBEDDING_MODEL_SELECTOR = 'embedding-model-selector',
RERANK_MODEL_SELECTOR = 'rerank-model-selector',
PIPELINE_SELECTOR = 'pipeline-selector',
WORKFLOW_SELECTOR = 'workflow-selector',
MODEL_FALLBACK_SELECTOR = 'model-fallback-selector',
PROMPT_EDITOR = 'prompt-editor',
UNKNOWN = 'unknown',

View File

@@ -2181,6 +2181,10 @@ const enUS = {
intent: 'Intent',
entities: 'Entities',
},
// Workflow selector for dynamic forms
selectWorkflow: 'Select Workflow',
noWorkflowsFound: 'No workflows found',
loadWorkflowsFailed: 'Failed to load workflows: ',
},
unifiedBinding: {
bindingType: 'Binding Type',

View File

@@ -2131,6 +2131,10 @@ const zhHans = {
coze_bot_id: '机器人ID',
coze_api_base: 'API基础URL',
},
// Workflow selector for dynamic forms
selectWorkflow: '选择工作流',
noWorkflowsFound: '暂无工作流',
loadWorkflowsFailed: '加载工作流列表失败:',
},
unifiedBinding: {
bindingType: '绑定类型',