Skip to content

Commit e6d7413

Browse files
committed
refactor(应用): 优化嵌入应用
1 parent ec4f844 commit e6d7413

File tree

7 files changed

+111
-13
lines changed

7 files changed

+111
-13
lines changed

apps/application/flow/step_node/application_node/i_application_node.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class ApplicationNodeSerializer(serializers.Serializer):
1212
question_reference_address = serializers.ListField(required=True, error_messages=ErrMessage.list("用户问题"))
1313
api_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.list("api输入字段"))
1414
user_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.uuid("用户输入字段"))
15+
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片"))
16+
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档"))
1517

1618

1719
class IApplicationNode(INode):
@@ -31,10 +33,27 @@ def _run(self):
3133
for user_input_field in self.node_params_serializer.data.get('user_input_field_list', []):
3234
kwargs[user_input_field['field']] = self.workflow_manage.get_reference_field(user_input_field['value'][0],
3335
user_input_field['value'][1:])
34-
36+
# 判断是否包含这个属性
37+
app_document_list = self.node_params_serializer.data.get('document_list', [])
38+
if app_document_list and len(app_document_list) > 0:
39+
app_document_list = self.workflow_manage.get_reference_field(
40+
app_document_list[0],
41+
app_document_list[1:])
42+
for document in app_document_list:
43+
if 'file_id' not in document:
44+
raise ValueError("参数值错误: 上传的文档中缺少file_id")
45+
app_image_list = self.node_params_serializer.data.get('image_list', [])
46+
if app_image_list and len(app_image_list) > 0:
47+
app_image_list = self.workflow_manage.get_reference_field(
48+
app_image_list[0],
49+
app_image_list[1:])
50+
for image in app_image_list:
51+
if 'file_id' not in image:
52+
raise ValueError("参数值错误: 上传的图片中缺少file_id")
3553
return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data,
54+
app_document_list=app_document_list, app_image_list=app_image_list,
3655
message=str(question), **kwargs)
3756

3857
def execute(self, application_id, message, chat_id, chat_record_id, stream, re_chat, client_id, client_type,
39-
**kwargs) -> NodeResult:
58+
app_document_list=None, app_image_list=None, **kwargs) -> NodeResult:
4059
pass

apps/application/flow/step_node/application_node/impl/base_application_node.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def save_context(self, details, workflow_manage):
7171
self.answer_text = details.get('answer')
7272

7373
def execute(self, application_id, message, chat_id, chat_record_id, stream, re_chat, client_id, client_type,
74+
app_document_list=None, app_image_list=None,
7475
**kwargs) -> NodeResult:
7576
from application.serializers.chat_message_serializers import ChatMessageSerializer
7677
# 生成嵌入应用的chat_id
@@ -79,13 +80,20 @@ def execute(self, application_id, message, chat_id, chat_record_id, stream, re_c
7980
'application_id': application_id,
8081
'abstract': message
8182
})
83+
if app_document_list is None:
84+
app_document_list = []
85+
if app_image_list is None:
86+
app_image_list = []
8287
response = ChatMessageSerializer(
8388
data={'chat_id': current_chat_id, 'message': message,
8489
're_chat': re_chat,
8590
'stream': stream,
8691
'application_id': application_id,
8792
'client_id': client_id,
88-
'client_type': client_type, 'form_data': kwargs}).chat(base_to_response=OpenaiToResponse())
93+
'client_type': client_type,
94+
'document_list': app_document_list,
95+
'image_list': app_image_list,
96+
'form_data': kwargs}).chat(base_to_response=OpenaiToResponse())
8997
if response.status_code == 200:
9098
if stream:
9199
content_generator = response.streaming_content

ui/src/views/application-workflow/component/DropdownMenu.vue

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,20 @@ function clickNodes(item: any, data?: any, type?: string) {
149149
}
150150
if (type == 'application') {
151151
if (isWorkFlow(data.type)) {
152-
console.log(data.work_flow.nodes[0].properties.api_input_field_list)
152+
const nodeData = data.work_flow.nodes[0].properties.node_data
153+
const fileUploadSetting = nodeData.file_upload_setting
153154
item['properties']['node_data'] = {
154155
name: data.name,
155156
icon: data.icon,
156157
application_id: data.id,
157158
api_input_field_list: data.work_flow.nodes[0].properties.api_input_field_list,
158-
user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list
159+
user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list,
160+
...(!fileUploadSetting
161+
? {}
162+
: {
163+
...(fileUploadSetting.document ? { document_list: [] } : {}),
164+
...(fileUploadSetting.image ? { image_list: [] } : {})
165+
})
159166
}
160167
} else {
161168
item['properties']['node_data'] = {
@@ -186,12 +193,20 @@ function onmousedown(item: any, data?: any, type?: string) {
186193
}
187194
if (type == 'application') {
188195
if (isWorkFlow(data.type)) {
196+
const nodeData = data.work_flow.nodes[0].properties.node_data
197+
const fileUploadSetting = nodeData.file_upload_setting
189198
item['properties']['node_data'] = {
190199
name: data.name,
191200
icon: data.icon,
192201
application_id: data.id,
193202
api_input_field_list: data.work_flow.nodes[0].properties.api_input_field_list,
194-
user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list
203+
user_input_field_list: data.work_flow.nodes[0].properties.user_input_field_list,
204+
...(!fileUploadSetting
205+
? {}
206+
: {
207+
...(fileUploadSetting.document ? { document_list: [] } : {}),
208+
...(fileUploadSetting.image ? { image_list: [] } : {})
209+
})
195210
}
196211
} else {
197212
item['properties']['node_data'] = {

ui/src/views/application/index.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
<div class="flex-between mb-16">
44
<h4>{{ $t('views.application.applicationList.title') }}</h4>
55
<div class="flex-between">
6-
<el-select v-model="selectUserId" class="mr-12 w-120" @change="searchHandle">
6+
<el-select
7+
v-model="selectUserId"
8+
class="mr-12"
9+
@change="searchHandle"
10+
style="max-width: 240px; width: 150px"
11+
>
712
<el-option
813
v-for="item in userOptions"
914
:key="item.value"
@@ -17,6 +22,7 @@
1722
:placeholder="$t('views.application.applicationList.searchBar.placeholder')"
1823
prefix-icon="Search"
1924
class="w-240"
25+
style="min-width: 240px"
2026
clearable
2127
/>
2228
</div>

ui/src/views/dataset/index.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
<div class="flex-between mb-16">
44
<h4>知识库</h4>
55
<div class="flex-between">
6-
<el-select v-model="selectUserId" class="mr-12 w-120" @change="searchHandle">
6+
<el-select
7+
v-model="selectUserId"
8+
class="mr-12"
9+
@change="searchHandle"
10+
style="max-width: 240px; width: 150px"
11+
>
712
<el-option
813
v-for="item in userOptions"
914
:key="item.value"
@@ -17,6 +22,7 @@
1722
:placeholder="$t('views.application.applicationList.searchBar.placeholder')"
1823
prefix-icon="Search"
1924
class="w-240"
25+
style="max-width: 240px"
2026
clearable
2127
/>
2228
</div>

ui/src/views/function-lib/index.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
<div class="flex-between mb-16">
44
<h4>函数库</h4>
55
<div class="flex-between">
6-
<el-select v-model="selectUserId" class="mr-12 w-120" @change="searchHandle">
6+
<el-select
7+
v-model="selectUserId"
8+
class="mr-12"
9+
style="max-width: 240px; width: 150px"
10+
@change="searchHandle"
11+
>
712
<el-option
813
v-for="item in userOptions"
914
:key="item.value"
@@ -17,6 +22,7 @@
1722
placeholder="按函数名称搜索"
1823
prefix-icon="Search"
1924
class="w-240"
25+
style="max-width: 240px"
2026
clearable
2127
/>
2228
</div>

ui/src/workflow/nodes/application-node/index.vue

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,44 @@
2727
v-model="form_data.question_reference_address"
2828
/>
2929
</el-form-item>
30+
31+
<el-form-item
32+
v-if="form_data.hasOwnProperty('document_list') || 'document_list' in form_data"
33+
label="选择文档"
34+
prop="document_list"
35+
:rules="{
36+
message: '请选择检索问题',
37+
trigger: 'blur',
38+
required: false
39+
}"
40+
>
41+
<NodeCascader
42+
ref="nodeCascaderRef"
43+
:nodeModel="nodeModel"
44+
class="w-full"
45+
placeholder="请选择检索问题"
46+
v-model="form_data.document_list"
47+
/>
48+
</el-form-item>
49+
50+
<el-form-item
51+
v-if="form_data.hasOwnProperty('image_list') || 'image_list' in form_data"
52+
label="选择图片"
53+
prop="image_list"
54+
:rules="{
55+
message: '请选择检索问题',
56+
trigger: 'blur',
57+
required: false
58+
}"
59+
>
60+
<NodeCascader
61+
ref="nodeCascaderRef"
62+
:nodeModel="nodeModel"
63+
class="w-full"
64+
placeholder="请选择检索问题"
65+
v-model="form_data.image_list"
66+
/>
67+
</el-form-item>
3068
<div v-for="(field, index) in form_data.api_input_field_list" :key="'api-input-' + index">
3169
<el-form-item
3270
:label="field.variable"
@@ -45,7 +83,6 @@
4583
</el-form-item>
4684
</div>
4785

48-
<!-- Loop through dynamic fields for user_input_field_list -->
4986
<div v-for="(field, index) in form_data.user_input_field_list" :key="'user-input-' + index">
5087
<el-form-item
5188
:label="field.label"
@@ -94,9 +131,11 @@ import NodeCascader from '@/workflow/common/NodeCascader.vue'
94131
import type { FormInstance } from 'element-plus'
95132
96133
const form = {
97-
question_reference_address: [],
134+
question_reference_address: ['start-node', 'question'],
98135
api_input_field_list: [],
99-
user_input_field_list: []
136+
user_input_field_list: [],
137+
document_list: ['start-node', 'document'],
138+
image_list: ['start-node', 'image']
100139
}
101140
102141
const applicationNodeFormRef = ref<FormInstance>()
@@ -124,7 +163,6 @@ const validate = () => {
124163
}
125164
126165
onMounted(() => {
127-
console.log(applicationNodeFormRef.value)
128166
set(props.nodeModel, 'validate', validate)
129167
})
130168
</script>

0 commit comments

Comments
 (0)