Skip to content

Commit 64b0675

Browse files
authored
fix: trigger task record (#4743)
1 parent 9022ae0 commit 64b0675

File tree

5 files changed

+132
-60
lines changed

5 files changed

+132
-60
lines changed

apps/trigger/handler/impl/task/application_task.py

Lines changed: 60 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
@desc:
88
"""
99
import json
10-
from functools import reduce
10+
import time
11+
import traceback
1112

1213
import uuid_utils.compat as uuid
1314
from django.db.models import QuerySet
1415

1516
from application.models import ChatUserType, Chat, ChatRecord, ChatSourceChoices, Application
1617
from chat.serializers.chat import ChatSerializers
18+
from common.utils.logger import maxkb_logger
1719
from knowledge.models.knowledge_action import State
1820
from trigger.handler.base_task import BaseTriggerTask
1921
from trigger.models import TaskRecord, TriggerTask
@@ -30,9 +32,7 @@ def get_reference(fields, obj):
3032

3133

3234
def conversion_custom_value(value, _type):
33-
if ['array', 'dict', 'float', 'int', 'boolean'].__contains__(_type):
34-
return json.loads(value)
35-
if _type == 'any':
35+
if ['array', 'dict', 'float', 'int', 'boolean', 'any'].__contains__(_type):
3636
try:
3737
return json.loads(value)
3838
except Exception as e:
@@ -86,7 +86,7 @@ def get_application_execute_parameters(parameter_setting, application_parameters
8686
_setting = setting.get(ck)
8787
if _setting:
8888
_value = get_field_value(_setting, kwargs, cv.get('type'), cv.get('required'),
89-
cv.get('default_value'), cv.get('field'))
89+
cv.get('default_value'), ck)
9090
parameters['form_data'][ck] = _value
9191
else:
9292
if cv.get('default_value'):
@@ -96,7 +96,7 @@ def get_application_execute_parameters(parameter_setting, application_parameters
9696
raise Exception(f'{ck} is required')
9797
else:
9898
value = get_field_value(setting, kwargs, value.get('type'), value.get('required'),
99-
value.get('default_value'), value.get('field'))
99+
value.get('default_value'), key)
100100
parameters['message' if key == 'question' else key] = value
101101
else:
102102
if value.get('default_value'):
@@ -145,7 +145,7 @@ def get_application_parameters_setting(application):
145145
else:
146146
base_node_list = [n for n in application.work_flow.get('nodes') if n.get('type') == "base-node"]
147147
if len(base_node_list) == 0:
148-
raise Exception('错误的应用工作流信息')
148+
raise Exception('Incorrect application workflow information')
149149
base_node = base_node_list[0]
150150
api_input_field_list = base_node.get('properties').get('api_input_field_list') or []
151151
api_input_field_list = {user_field.get('variable'): {
@@ -178,39 +178,43 @@ def support(self, trigger_task, **kwargs):
178178

179179
def execute(self, trigger_task, **kwargs):
180180
parameter_setting = trigger_task.get('parameter')
181-
application = QuerySet(Application).filter(id=trigger_task.get('source_id')).only('type', 'work_flow').first()
182-
if application is None:
183-
QuerySet(TriggerTask).filter(id=trigger_task.get('id')).delete()
184-
return
185-
application_parameters_setting = get_application_parameters_setting(application)
186-
parameters = get_application_execute_parameters(parameter_setting, application_parameters_setting, kwargs)
187-
parameters['re_chat'] = False
188-
parameters['stream'] = True
189-
chat_id = uuid.uuid7()
190-
chat_user_id = str(uuid.uuid7())
191-
chat_record_id = str(uuid.uuid7())
192-
parameters['chat_record_id'] = chat_record_id
193-
application_id = trigger_task.get('source_id')
194-
message = parameters.get('message')
195-
Chat.objects.get_or_create(id=chat_id, defaults={
196-
'application_id': application_id,
197-
'abstract': message,
198-
'chat_user_id': chat_user_id,
199-
'chat_user_type': ChatUserType.ANONYMOUS_USER.value,
200-
'asker': {'username': "游客"},
201-
'ip_address': kwargs.get('body')['ip_address'],
202-
'source': {
203-
'type': ChatSourceChoices.TRIGGER.value
204-
},
205-
})
206181
task_record_id = uuid.uuid7()
207-
TaskRecord(id=task_record_id, trigger_id=trigger_task.get('trigger'), trigger_task_id=trigger_task.get('id'),
208-
source_type="APPLICATION",
209-
source_id=application_id,
210-
task_record_id=chat_record_id,
211-
meta={'chat_id': chat_id},
212-
state=State.STARTED).save()
182+
start_time = time.time()
213183
try:
184+
application = QuerySet(Application).filter(id=trigger_task.get('source_id')).only('type',
185+
'work_flow').first()
186+
if application is None:
187+
QuerySet(TriggerTask).filter(id=trigger_task.get('id')).delete()
188+
return
189+
application_id = trigger_task.get('source_id')
190+
chat_id = uuid.uuid7()
191+
chat_user_id = str(uuid.uuid7())
192+
chat_record_id = str(uuid.uuid7())
193+
TaskRecord(id=task_record_id, trigger_id=trigger_task.get('trigger'),
194+
trigger_task_id=trigger_task.get('id'),
195+
source_type="APPLICATION",
196+
source_id=application_id,
197+
task_record_id=chat_record_id,
198+
meta={'chat_id': chat_id},
199+
state=State.STARTED).save()
200+
application_parameters_setting = get_application_parameters_setting(application)
201+
parameters = get_application_execute_parameters(parameter_setting, application_parameters_setting, kwargs)
202+
parameters['re_chat'] = False
203+
parameters['stream'] = True
204+
parameters['chat_record_id'] = chat_record_id
205+
message = parameters.get('message')
206+
Chat.objects.get_or_create(id=chat_id, defaults={
207+
'application_id': application_id,
208+
'abstract': message,
209+
'chat_user_id': chat_user_id,
210+
'chat_user_type': ChatUserType.ANONYMOUS_USER.value,
211+
'asker': {'username': "游客"},
212+
'ip_address': kwargs.get('body')['ip_address'],
213+
'source': {
214+
'type': ChatSourceChoices.TRIGGER.value
215+
},
216+
})
217+
214218
list(ChatSerializers(data={
215219
"chat_id": chat_id,
216220
"chat_user_id": chat_user_id,
@@ -223,8 +227,22 @@ def execute(self, trigger_task, **kwargs):
223227
'debug': False
224228
}).chat(instance=parameters))
225229
chat_record = QuerySet(ChatRecord).filter(id=chat_record_id).first()
226-
state = get_workflow_state(chat_record.details)
227-
QuerySet(TaskRecord).filter(id=task_record_id).update(state=state, run_time=chat_record.run_time)
230+
if chat_record:
231+
state = get_workflow_state(chat_record.details)
232+
QuerySet(TaskRecord).filter(id=task_record_id).update(state=state, run_time=chat_record.run_time,
233+
meta={'parameter_setting': parameter_setting,
234+
'input': parameters, 'output': None})
235+
else:
236+
QuerySet(TaskRecord).filter(id=task_record_id).update(state=State.FAILURE,
237+
run_time=time.time() - start_time,
238+
meta={'parameter_setting': parameter_setting,
239+
'input': parameters, 'output': None,
240+
'err_message': 'Error: An unknown error occurred during the execution of the conversation'})
228241
except Exception as e:
229-
state = State.FAILURE
230-
QuerySet(TaskRecord).filter(id=task_record_id).update(state=state, run_time=0)
242+
maxkb_logger.error(f"Application execution error: {traceback.format_exc()}")
243+
QuerySet(TaskRecord).filter(id=task_record_id).update(
244+
state=State.FAILURE,
245+
run_time=time.time() - start_time,
246+
meta={'input': {'parameter_setting': parameter_setting, **kwargs}, 'output': None,
247+
'err_message': 'Error: ' + str(e)}
248+
)

apps/trigger/handler/impl/task/tool_task.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,10 @@ def execute(self, trigger_task, **kwargs):
184184
QuerySet(TaskRecord).filter(id=task_record_id).update(
185185
state=State.FAILURE,
186186
run_time=time.time() - start_time,
187-
meta={'input': parameter_setting, 'output': 'Error: ' + str(e)}
187+
meta={'input': parameter_setting, 'output': 'Error: ' + str(e), 'err_message': 'Error: ' + str(e)}
188188
)
189189
QuerySet(ToolRecord).filter(id=task_record_id).update(
190190
state=State.FAILURE,
191191
run_time=time.time() - start_time,
192-
meta={'input': parameter_setting, 'output': 'Error: ' + str(e)}
192+
meta={'input': parameter_setting, 'output': 'Error: ' + str(e), 'err_message': 'Error: ' + str(e)}
193193
)
194-

apps/trigger/serializers/trigger_task.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
from common.db.search import native_page_search, get_dynamics_model
1818
from common.exception.app_exception import AppApiException
1919
from common.utils.common import get_file_content
20+
from knowledge.models.knowledge_action import State
2021
from maxkb.conf import PROJECT_DIR
22+
from tools.models import ToolRecord
2123
from trigger.models import TriggerTask, TaskRecord, Trigger
2224

2325

@@ -85,10 +87,39 @@ def get_execution_details(self, is_valid=True):
8587
raise AppApiException(500, _('Trigger task record id does not exist'))
8688
if task_record.source_type == 'APPLICATION':
8789
chat_record = QuerySet(ChatRecord).filter(id=task_record.task_record_id).first()
88-
return ChatRecordSerializerModel(chat_record).data
90+
if chat_record:
91+
return ChatRecordSerializerModel(chat_record).data
92+
return {
93+
'state': 'TRIGGER_ERROR',
94+
'meta': task_record.meta
95+
}
8996
if task_record.source_type == 'TOOL':
90-
pass
91-
return None
97+
tool_record = QuerySet(ToolRecord).filter(id=task_record.task_record_id).first()
98+
if tool_record:
99+
return {
100+
'id': tool_record.id,
101+
'tool_id': tool_record.tool_id,
102+
'workspace_id': tool_record.workspace_id,
103+
'source_type': tool_record.source_type,
104+
'source_id': tool_record.source_id,
105+
'meta': tool_record.meta,
106+
'state': tool_record.state,
107+
'run_time': tool_record.run_time,
108+
'details': {
109+
'tool_call': {
110+
'index': 0,
111+
'result': tool_record.meta.get('output'),
112+
'params': tool_record.meta.get('input'),
113+
'status': 500 if tool_record.state == State.FAILURE else 200 if tool_record.state == State.SUCCESS else 201,
114+
'type': 'tool-node',
115+
'err_message': tool_record.meta.get('err_message')
116+
}
117+
}
118+
}
119+
return {
120+
'state': 'TRIGGER_ERROR',
121+
'meta': task_record.meta
122+
}
92123

93124

94125
class TriggerTaskRecordQuerySerializer(serializers.Serializer):

ui/src/views/trigger/component/ApplicationParameter.vue

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -267,29 +267,36 @@ const base_field_list = computed<Array<any>>(() => {
267267
return result
268268
})
269269
const init_parameters = () => {
270-
const parameter: any = {}
270+
const parameter: any = { ...props.modelValue }
271271
base_field_list.value.forEach((f) => {
272-
parameter[f.field] = { source: 'custom', value: f.default_value }
272+
if (!parameter[f.field]) {
273+
parameter[f.field] = { source: 'custom', value: f.default_value }
274+
}
273275
})
274276
api_input_field_list.value.forEach((f) => {
275277
if (!parameter.api_input_field_list) {
276278
parameter['api_input_field_list'] = {}
277279
}
278-
parameter['api_input_field_list'][f.field] = {
279-
source: 'custom',
280-
value: f.default_value ? f.default_value : '',
280+
if (!parameter['api_input_field_list'][f.field]) {
281+
parameter['api_input_field_list'][f.field] = {
282+
source: 'custom',
283+
value: f.default_value ? f.default_value : '',
284+
}
281285
}
282286
})
283287
user_input_field_list.value.forEach((f) => {
284288
if (!parameter['user_input_field_list']) {
285289
parameter['user_input_field_list'] = {}
286290
}
287-
parameter['user_input_field_list'][f.field] = {
288-
source: 'custom',
289-
value: f.default_value ? f.default_value : '',
291+
if (!parameter['user_input_field_list'][f.field]) {
292+
parameter['user_input_field_list'][f.field] = {
293+
source: 'custom',
294+
value: f.default_value ? f.default_value : '',
295+
}
290296
}
291297
})
292-
emit('update:modelValue', { ...parameter, ...props.modelValue })
298+
299+
emit('update:modelValue', { ...parameter })
293300
}
294301
295302
init_parameters()

ui/src/views/trigger/execution-record/ExecutionDetailDrawer.vue

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,21 @@
103103
<h4 class="title-decoration-1 mb-16 mt-4">
104104
{{ $t('chat.executionDetails.title') }}
105105
</h4>
106-
<template v-for="(item, index) in arraySort(detail ?? [], 'index')" :key="index">
106+
<template v-if="taskRecordDetails && taskRecordDetails.state === 'TRIGGER_ERROR'">
107+
<div class="card-never border-r-6 mb-12">
108+
<h5 class="p-8-12">触发器入参</h5>
109+
<div class="p-8-12 border-t-dashed lighter">
110+
{{ taskRecordDetails.meta.input }}
111+
</div>
112+
</div>
113+
<div class="card-never border-r-6 mb-12">
114+
<h5 class="p-8-12">错误信息</h5>
115+
<div class="p-8-12 border-t-dashed lighter">
116+
{{ taskRecordDetails.meta.err_message }}
117+
</div>
118+
</div>
119+
</template>
120+
<template v-else v-for="(item, index) in arraySort(detail ?? [], 'index')" :key="index">
107121
<ExecutionDetailCard :data="item"> </ExecutionDetailCard>
108122
</template>
109123
</el-scrollbar>
@@ -165,7 +179,7 @@ const apiType = computed(() => {
165179
return 'workspace'
166180
}
167181
})
168-
182+
const taskRecordDetails = ref<any>()
169183
const detail = ref<any>(null)
170184
171185
const loading = ref(false)
@@ -197,7 +211,10 @@ function getDetail() {
197211
props.currentContent?.id,
198212
)
199213
.then((ok) => {
200-
detail.value = Object.values(ok.data.details)
214+
if (ok.data.details) {
215+
detail.value = Object.values(ok.data.details)
216+
}
217+
taskRecordDetails.value = ok.data
201218
})
202219
}
203220

0 commit comments

Comments
 (0)