mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-24 02:57:13 +00:00
new nofe、、
This commit is contained in:
@@ -64,6 +64,7 @@ class NodeMetadataValidator:
|
|||||||
'plugin-selector',
|
'plugin-selector',
|
||||||
'webhook-url',
|
'webhook-url',
|
||||||
'embed-code',
|
'embed-code',
|
||||||
|
'workflow-selector',
|
||||||
}
|
}
|
||||||
|
|
||||||
def validate(self, metadata: dict[str, Any]) -> list[str]:
|
def validate(self, metadata: dict[str, Any]) -> list[str]:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: call_workflow
|
name: call_workflow
|
||||||
label:
|
label:
|
||||||
en_US: Call Workflow
|
en_US: Call Workflow
|
||||||
zh_Hans: 调用工作流
|
zh_Hans: 调用 工作流
|
||||||
category: action
|
category: action
|
||||||
icon: Workflow
|
icon: Workflow
|
||||||
color: '#8b5cf6'
|
color: '#8b5cf6'
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import {
|
|||||||
RerankModel,
|
RerankModel,
|
||||||
Pipeline,
|
Pipeline,
|
||||||
PluginTool,
|
PluginTool,
|
||||||
|
Workflow,
|
||||||
} from '@/app/infra/entities/api';
|
} from '@/app/infra/entities/api';
|
||||||
import { toast } from 'sonner';
|
import { toast } from 'sonner';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
@@ -114,6 +115,7 @@ export default function DynamicFormItemComponent({
|
|||||||
const [knowledgeBases, setKnowledgeBases] = useState<KnowledgeBase[]>([]);
|
const [knowledgeBases, setKnowledgeBases] = useState<KnowledgeBase[]>([]);
|
||||||
const [bots, setBots] = useState<Bot[]>([]);
|
const [bots, setBots] = useState<Bot[]>([]);
|
||||||
const [pipelines, setPipelines] = useState<Pipeline[]>([]);
|
const [pipelines, setPipelines] = useState<Pipeline[]>([]);
|
||||||
|
const [workflows, setWorkflows] = useState<Workflow[]>([]);
|
||||||
const [tools, setTools] = useState<PluginTool[]>([]);
|
const [tools, setTools] = useState<PluginTool[]>([]);
|
||||||
const [uploading, setUploading] = useState<boolean>(false);
|
const [uploading, setUploading] = useState<boolean>(false);
|
||||||
const [kbDialogOpen, setKbDialogOpen] = useState(false);
|
const [kbDialogOpen, setKbDialogOpen] = useState(false);
|
||||||
@@ -295,6 +297,19 @@ export default function DynamicFormItemComponent({
|
|||||||
}
|
}
|
||||||
}, [config.type]);
|
}, [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) {
|
switch (config.type) {
|
||||||
case DynamicFormItemType.INT:
|
case DynamicFormItemType.INT:
|
||||||
case DynamicFormItemType.FLOAT:
|
case DynamicFormItemType.FLOAT:
|
||||||
@@ -1397,6 +1412,43 @@ export default function DynamicFormItemComponent({
|
|||||||
</Select>
|
</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:
|
case DynamicFormItemType.TOOLS_SELECTOR:
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ export enum DynamicFormItemType {
|
|||||||
EMBEDDING_MODEL_SELECTOR = 'embedding-model-selector',
|
EMBEDDING_MODEL_SELECTOR = 'embedding-model-selector',
|
||||||
RERANK_MODEL_SELECTOR = 'rerank-model-selector',
|
RERANK_MODEL_SELECTOR = 'rerank-model-selector',
|
||||||
PIPELINE_SELECTOR = 'pipeline-selector',
|
PIPELINE_SELECTOR = 'pipeline-selector',
|
||||||
|
WORKFLOW_SELECTOR = 'workflow-selector',
|
||||||
MODEL_FALLBACK_SELECTOR = 'model-fallback-selector',
|
MODEL_FALLBACK_SELECTOR = 'model-fallback-selector',
|
||||||
PROMPT_EDITOR = 'prompt-editor',
|
PROMPT_EDITOR = 'prompt-editor',
|
||||||
UNKNOWN = 'unknown',
|
UNKNOWN = 'unknown',
|
||||||
|
|||||||
@@ -2181,6 +2181,10 @@ const enUS = {
|
|||||||
intent: 'Intent',
|
intent: 'Intent',
|
||||||
entities: 'Entities',
|
entities: 'Entities',
|
||||||
},
|
},
|
||||||
|
// Workflow selector for dynamic forms
|
||||||
|
selectWorkflow: 'Select Workflow',
|
||||||
|
noWorkflowsFound: 'No workflows found',
|
||||||
|
loadWorkflowsFailed: 'Failed to load workflows: ',
|
||||||
},
|
},
|
||||||
unifiedBinding: {
|
unifiedBinding: {
|
||||||
bindingType: 'Binding Type',
|
bindingType: 'Binding Type',
|
||||||
|
|||||||
@@ -2131,6 +2131,10 @@ const zhHans = {
|
|||||||
coze_bot_id: '机器人ID',
|
coze_bot_id: '机器人ID',
|
||||||
coze_api_base: 'API基础URL',
|
coze_api_base: 'API基础URL',
|
||||||
},
|
},
|
||||||
|
// Workflow selector for dynamic forms
|
||||||
|
selectWorkflow: '选择工作流',
|
||||||
|
noWorkflowsFound: '暂无工作流',
|
||||||
|
loadWorkflowsFailed: '加载工作流列表失败:',
|
||||||
},
|
},
|
||||||
unifiedBinding: {
|
unifiedBinding: {
|
||||||
bindingType: '绑定类型',
|
bindingType: '绑定类型',
|
||||||
|
|||||||
Reference in New Issue
Block a user