wujingjing
2025-02-18 67e50265b5cdae1c28f39b924ccb277857f4acea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<template>
    <NodeBasicLayout
        v-model:title="data.title"
        :type="NodeType.LLM"
        :description="VueFlowHelper.getConfigValue(data, 'description', '调用大模型回答用户问题或者处理任务。')"
        :isViewMode="isViewMode"
    >
        <Handle :id="targetHandleId" type="target" :position="Position.Left" />
        <el-form ref="formRef" :model="data" :rules="formRules" label-position="right" label-width="60px" :show-message="false">
            <FieldLayout :title="VueFlowHelper.getConfigValue(modelSetting, 'name', '模型设置')">
                <div class="w-full flex-items-center gap-x-2">
                    <div class="flex-column gap-y-1.5">
                        <el-form-item
                            labelPosition="top"
                            :label="VueFlowHelper.getParams(modelSetting, 'llm_model').label"
                            prop="group_params.0.params.0.value"
                        >
                            <el-tree-select
                                v-model="VueFlowHelper.getParams(modelSetting, 'llm_model').value"
                                :data="llmInfoList"
                                :props="{ label: 'name', value: 'id' }"
                                :render-after-expand="false"
                                :check-strictly="false"
                                :show-checkbox="false"
                                :accordion="true"
                                :disabled="isViewMode"
                                filterable
                                clearable
                                :placeholder="VueFlowHelper.getParams(modelSetting, 'llm_model').placeholder"
                            />
                        </el-form-item>
                    </div>
                    <div class="flex-column gap-y-1.5">
                        <el-form-item
                            labelPosition="top"
                            :label="VueFlowHelper.getParams(modelSetting, 'temperature').label"
                            prop="group_params.0.params.1.value"
                        >
                            <el-input-number
                                class="w-full"
                                controls-position="right"
                                v-model="VueFlowHelper.getParams(modelSetting, 'temperature').value"
                                :readonly="isViewMode"
                                placeholder=""
                            ></el-input-number>
                        </el-form-item>
                    </div>
                </div>
            </FieldLayout>
            <FieldLayout :title="prompt.name" required>
                <el-form-item labelWidth="0" prop="group_params.1.params.0.value">
                    <CodeEditor
                        :title="prompt.name"
                        class="nowheel w-full"
                        v-model:editValue="VueFlowHelper.getParams(prompt, 'prompt').value"
                        :maxHeight="180"
                        :disabled="isViewMode"
                    />
                </el-form-item>
            </FieldLayout>
            <FieldLayout :title="outputParam.name" required>
                <el-form-item labelWidth="0" prop="group_params.2.params.0.value">
                    <el-input
                        class="w-full flex-0"
                        v-model="outputParam.params[0].value"
                        placeholder="输出参数名"
                        :readonly="isViewMode"
                    ></el-input>
                </el-form-item>
            </FieldLayout>
        </el-form>
 
        <Handle :id="sourceHandleId" type="source" :position="Position.Right" />
    </NodeBasicLayout>
</template>
 
<script setup lang="ts">
import type { NodeProps } from '@vue-flow/core';
import { Handle, Position, useNode } from '@vue-flow/core';
import { onMounted, ref } from 'vue';
import { VueFlowHelper } from '../../VueFlowHelper';
import { NodeType } from '../../vueFlowEnum';
import FieldLayout from './components/FieldLayout.vue';
import NodeBasicLayout from './components/NodeBasicLayout.vue';
import type { LLMNodeData, LLMNodeEvents } from './index';
import CodeEditor from '/@/components/input/codeEditor/index.vue';
import { invalid } from 'moment';
import { validateForm } from './utils';
 
defineProps<
    NodeProps<LLMNodeData, LLMNodeEvents> & {
        isViewMode?: boolean;
        llmInfoList: any[];
    }
>();
 
const node = useNode();
const sourceHandleId = ref(VueFlowHelper.getHandleId(node.node, 'source'));
const targetHandleId = ref(VueFlowHelper.getHandleId(node.node, 'target'));
 
const data = ref(node.node.data);
const modelSetting = ref(VueFlowHelper.getGroupParam(data.value, 0));
const prompt = ref(VueFlowHelper.getGroupParam(data.value, 1));
const outputParam = ref(VueFlowHelper.getGroupParam(data.value, 2));
VueFlowHelper.getConfigValue(VueFlowHelper.getParams(prompt.value, 'prompt'), 'label', '');
 
const formRules = ref({
    'group_params.0.params.0.value': [{ required: true, message: '请选择模型', trigger: 'change' }],
    'group_params.1.params.0.value': [{ required: true, message: '请输入提示词', trigger: 'blur' }],
    'group_params.2.params.0.value': [{ required: true, message: '请输入输出参数名', trigger: 'blur' }],
 
});
 
const emit = defineEmits(['register']);
const formRef = ref();
 
// 表单验证方法
 
// 注册节点实例
onMounted(() => {
    emit('register', {
        validateForm: validateForm(formRef),
    });
});
</script>