import { HandleType, useNode, useVueFlow } from '@vue-flow/core';
|
import { v4 as uuid } from 'uuid';
|
import { VueFlowConstant } from './VueFlowConstant';
|
import { CompareOperation, ConditionOperator, NodeType, VarType, nodeTypeMap } from './vueFlowEnum';
|
import { get } from 'lodash';
|
|
export class VueFlowHelper {
|
static genId() {
|
return uuid().slice(0, 8);
|
}
|
|
static genGeometryId() {
|
return uuid().slice(0, 12);
|
}
|
|
static getDefaultData = (type: NodeType) => {
|
let data: any = {
|
title: nodeTypeMap[type],
|
};
|
switch (type) {
|
case NodeType.Start:
|
data[VueFlowConstant.GROUP_PARAMS_KEY] = [
|
{
|
[VueFlowConstant.PARAMS_KEY]: [
|
{
|
key: 'var_list',
|
label: '',
|
type: 'var_list',
|
value: [],
|
},
|
],
|
},
|
];
|
break;
|
case NodeType.Condition:
|
data[VueFlowConstant.GROUP_PARAMS_KEY] = [
|
{
|
[VueFlowConstant.PARAMS_KEY]: [
|
{
|
key: 'condition',
|
label: '',
|
type: 'condition',
|
value: [ConditionHelper.getDefaultConditionGroup(), ConditionHelper.getDefaultConditionGroup(true)],
|
},
|
],
|
},
|
];
|
break;
|
case NodeType.LLM:
|
data[VueFlowConstant.GROUP_PARAMS_KEY] = [
|
{
|
name: '模型设置',
|
|
[VueFlowConstant.PARAMS_KEY]: [
|
{
|
key: 'llm_model',
|
label: '模型',
|
type: 'llm_model',
|
value: '',
|
required: true,
|
placeholder: '请选择模型',
|
},
|
{ key: 'temperature', label: '温度', type: 'slide', scope: [0, 2], step: 0.1, value: 0.6 },
|
],
|
},
|
{
|
name: '提示词',
|
[VueFlowConstant.PARAMS_KEY]: [{ key: 'prompt', label: '提示词', type: 'textarea', value: '' }],
|
},
|
];
|
break;
|
|
case NodeType.Agent:
|
data[VueFlowConstant.GROUP_PARAMS_KEY] = [
|
{
|
[VueFlowConstant.PARAMS_KEY]: [
|
{
|
key: 'agent',
|
label: '代理',
|
type: 'agent_select',
|
value: '',
|
// value_label:'',
|
required: true,
|
placeholder: '代理',
|
},
|
],
|
},
|
];
|
break;
|
|
case NodeType.Func:
|
data[VueFlowConstant.GROUP_PARAMS_KEY] = [
|
{
|
[VueFlowConstant.PARAMS_KEY]: [
|
{
|
key: 'func_name',
|
label: '函数名称',
|
type: 'func_name_select',
|
value: '',
|
// value_label:'',
|
required: true,
|
placeholder: '函数名称',
|
},
|
],
|
},
|
];
|
break;
|
case NodeType.Output:
|
data[VueFlowConstant.GROUP_PARAMS_KEY] = [
|
{
|
[VueFlowConstant.PARAMS_KEY]: [
|
{
|
key: 'output_msg',
|
label: '消息内容',
|
type: 'var_textarea_file',
|
required: true,
|
placeholder:
|
'输入需要发送给用户的消息,例如“接下来我将执行 XX 操作,请您确认”,“以下是我的初版草稿,您可以在其基础上进行修改”',
|
value: { msg: '', files: [] },
|
},
|
{
|
key: 'output_result',
|
label: '交互类型',
|
global: 'value.type=input',
|
type: 'output_form',
|
required: true,
|
value: { type: 'none', value: '' },
|
options: [],
|
},
|
],
|
},
|
];
|
|
default:
|
break;
|
}
|
return data;
|
};
|
|
static getHandleId = (node: any, handleType: HandleType, order?: number) => {
|
const orderSuffix = order == undefined ? '' : `__${order + ''}`;
|
return `${node.id}__handle-${handleType}${orderSuffix}`;
|
};
|
|
static getFieldValue = (data, key, index = 0) => {
|
let varList = [];
|
const group = data?.[VueFlowConstant.GROUP_PARAMS_KEY];
|
if (group && group.length > 0) {
|
if (index !== null) {
|
const val = group?.[index]?.[VueFlowConstant.PARAMS_KEY]?.find((item) => item.key === key)?.value;
|
if (val) {
|
varList.push(val);
|
}
|
} else {
|
for (const item of group) {
|
if (item[VueFlowConstant.PARAMS_KEY].key === key) {
|
varList.push(item[VueFlowConstant.PARAMS_KEY].value);
|
}
|
}
|
}
|
}
|
if (varList.length === 0) {
|
return null;
|
} else if (varList.length === 1) {
|
return varList[0];
|
} else {
|
return varList;
|
}
|
};
|
|
static getGroupParam = (data, index = 0) => {
|
const group = data?.[VueFlowConstant.GROUP_PARAMS_KEY]?.[index];
|
return group;
|
};
|
|
static getParams = (group, key) => {
|
return group?.[VueFlowConstant.PARAMS_KEY]?.find((item) => item.key === key);
|
};
|
}
|
|
export class StartNodeHelper {
|
// static getDefaultData = () => {
|
// return {
|
// title: nodeTypeMap[NodeType.Start],
|
// };
|
// };
|
|
static getVarList = (data) => {
|
const varList = data[VueFlowConstant.GROUP_PARAMS_KEY][0][VueFlowConstant.PARAMS_KEY].find(
|
(item) => item.key === 'condition'
|
).value;
|
return varList;
|
};
|
}
|
|
export class ConditionHelper {
|
static getConditionItem = (
|
left?: {
|
var: string;
|
label: string;
|
value: string;
|
},
|
right?: {
|
type: VarType;
|
value: string;
|
label: string;
|
},
|
operation?: CompareOperation
|
) => {
|
return {
|
id: VueFlowHelper.genId(),
|
left_var: left?.var ?? '',
|
left_label: left?.label ?? '',
|
left_value: left?.var ?? '',
|
comparison_operation: operation ?? '',
|
// right_value_type: right?.type ?? VarType.Input,
|
// 固定选择 input
|
right_value_type: VarType.Input,
|
|
right_value: right?.value ?? '',
|
right_label: right?.label ?? '',
|
};
|
};
|
|
static getDefaultConditionGroup = (isElse = false) => {
|
return isElse
|
? {
|
id: VueFlowHelper.genId(),
|
}
|
: {
|
id: VueFlowHelper.genId(),
|
operator: ConditionOperator.And,
|
conditions: [ConditionHelper.getConditionItem()],
|
};
|
};
|
}
|