Skip to content

Commit b50a57d

Browse files
authored
Merge branch 'v2' into pr@v2@fix_task_record
2 parents c0992cb + 9022ae0 commit b50a57d

File tree

29 files changed

+314
-125
lines changed

29 files changed

+314
-125
lines changed

apps/application/flow/step_node/tool_lib_node/impl/base_tool_lib_node.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
from common.utils.logger import maxkb_logger
2828
from common.utils.rsa_util import rsa_long_decrypt
2929
from common.utils.tool_code import ToolExecutor
30-
from knowledge.models import FileSourceType, State
30+
from knowledge.models import FileSourceType
31+
from knowledge.models.knowledge_action import State
3132
from oss.serializers.file import FileSerializer
3233
from tools.models import Tool, ToolRecord, ToolTaskTypeChoices
3334

@@ -265,7 +266,7 @@ def tool_exec_record(self, tool_lib, all_params):
265266
result = function_executor.exec_code(tool_lib.code, all_params)
266267
result_dict = _get_result_detail(result)
267268
QuerySet(ToolRecord).filter(id=task_record_id).update(
268-
state=State.SUCCESS.value,
269+
state=State.SUCCESS,
269270
run_time=time.time() - start_time,
270271
meta={'input': all_params, 'output': result_dict}
271272
)
@@ -274,7 +275,7 @@ def tool_exec_record(self, tool_lib, all_params):
274275
except Exception as e:
275276
maxkb_logger.error(f"Tool execution error: {traceback.format_exc()}")
276277
QuerySet(ToolRecord).filter(id=task_record_id).update(
277-
state=State.FAILURE.value,
278+
state=State.FAILURE,
278279
run_time=time.time() - start_time,
279280
meta={'input': all_params, 'output': 'Error: ' + str(e)}
280281
)

apps/chat/mcp/tools.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ def _get_chat_id(self):
5757
'application_id': self.application.id,
5858
'chat_user_id': str(uuid.uuid7()),
5959
'chat_user_type': ChatUserType.ANONYMOUS_USER,
60+
'ip_address': '-',
61+
'source': {"type": ChatSourceChoices.ONLINE.value},
6062
'debug': False
6163
}).open()
6264

apps/tools/migrations/0005_taskrecord.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,99 @@
55
import uuid_utils.compat
66
from django.db import migrations, models
77

8+
old = [
9+
"https://apps-assets.fit2cloud.com/stable/maxkb/md2docx/logo.png",
10+
"https://apps-assets.fit2cloud.com/stable/maxkb/mcp_output/logo.png",
11+
"https://apps-assets.fit2cloud.com/stable/maxkb/feishubot/logo.png",
12+
"https://apps-assets.fit2cloud.com/stable/maxkb/mongo/logo.png",
13+
"https://apps-assets.fit2cloud.com/stable/maxkb/OFD_Parse/logo.png",
14+
"https://apps-assets.fit2cloud.com/stable/maxkb/html_to_pdf/logo.png",
15+
"https://apps-assets.fit2cloud.com/stable/maxkb/feishu_datasource/logo.png",
16+
"https://apps-assets.fit2cloud.com/stable/maxkb/quotation_generation_agent/logo.png",
17+
"https://apps-assets.fit2cloud.com/stable/maxkb/html2pdf/logo.png",
18+
"https://apps-assets.fit2cloud.com/stable/maxkb/sqlbot_ai/logo.png",
19+
"https://apps-assets.fit2cloud.com/stable/maxkb/metaso/logo.png",
20+
"https://apps-assets.fit2cloud.com/stable/maxkb/registry/logo.png",
21+
"https://apps-assets.fit2cloud.com/stable/maxkb/smtp_email/logo.png",
22+
"https://apps-assets.fit2cloud.com/stable/maxkb/wecomrobot/logo.png",
23+
"https://apps-assets.fit2cloud.com/stable/maxkb/paperx/logo.png",
24+
"https://apps-assets.fit2cloud.com/stable/maxkb/case_inquire/logo.png",
25+
"https://apps-assets.fit2cloud.com/stable/maxkb/data_analysis_assistant/logo.png",
26+
"https://apps-assets.fit2cloud.com/stable/maxkb/crm_intelligent_search/logo.png",
27+
"https://apps-assets.fit2cloud.com/stable/maxkb/case_collection/logo.png",
28+
"https://apps-assets.fit2cloud.com/stable/maxkb/knowledge_self_assessment/logo.png",
29+
"https://apps-assets.fit2cloud.com/stable/maxkb/minerU_util/logo.png",
30+
"https://apps-assets.fit2cloud.com/stable/maxkb/invoice_recognition/logo.png",
31+
"https://apps-assets.fit2cloud.com/stable/maxkb/fragment/logo.png",
32+
"https://apps-assets.fit2cloud.com/stable/maxkb/contract_review/logo.png",
33+
"https://apps-assets.fit2cloud.com/stable/maxkb/echart_to_svg/logo.png",
34+
"https://apps-assets.fit2cloud.com/stable/maxkb/extract/logo.png",
35+
"https://apps-assets.fit2cloud.com/stable/maxkb/big_order/logo.png",
36+
"https://apps-assets.fit2cloud.com/stable/maxkb/crm_intelligent_recording/logo.png",
37+
"https://apps-assets.fit2cloud.com/stable/maxkb/dingrobot/logo.png",
38+
"https://apps-assets.fit2cloud.com/stable/maxkb/timestamp/logo.png",
39+
"https://apps-assets.fit2cloud.com/stable/maxkb/knowledge_workflow/logo.png",
40+
"https://apps-assets.fit2cloud.com/stable/maxkb/household_registration_policy_qa_assistant/logo.png",
41+
"https://apps-assets.fit2cloud.com/stable/maxkb/httputils/logo.png",
42+
"https://apps-assets.fit2cloud.com/stable/maxkb/html_compression/logo.png",
43+
"https://apps-assets.fit2cloud.com/stable/maxkb/crm_customer_entry_ai_agent/logo.png",
44+
"https://apps-assets.fit2cloud.com/stable/maxkb/anspire/logo.png",
45+
"https://apps-assets.fit2cloud.com/stable/maxkb/application_template/logo.png",
46+
"https://apps-assets.fit2cloud.com/stable/maxkb/baidu-translate/logo.png",
47+
"https://apps-assets.fit2cloud.com/stable/maxkb/website_translation/logo.png",
48+
]
49+
new = [
50+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_md2docx/logo.png",
51+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_mcp_output/logo.png",
52+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_feishubot/logo.png",
53+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_mongo/logo.png",
54+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_OFD_Parse/logo.png",
55+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_html_to_pdf/logo.png",
56+
"https://apps-assets.fit2cloud.com/stable/maxkb/db_feishu_datasource/logo.png",
57+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_quotation_generation_agent/logo.png",
58+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_html2pdf/logo.png",
59+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_sqlbot_ai/logo.png",
60+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_metaso/logo.png",
61+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_registry/logo.png",
62+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_smtp_email/logo.png",
63+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_wecomrobot/logo.png",
64+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_paperx/logo.png",
65+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_case_inquire/logo.png",
66+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_data_analysis_assistant/logo.png",
67+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_crm_intelligent_search/logo.png",
68+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_case_collection/logo.png",
69+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_knowledge_self_assessment/logo.png",
70+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_minerU_util/logo.png",
71+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_invoice_recognition/logo.png",
72+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_fragment/logo.png",
73+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_contract_review/logo.png",
74+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_echart_to_svg/logo.png",
75+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_extract/logo.png",
76+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_big_order/logo.png",
77+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_crm_intelligent_recording/logo.png",
78+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_dingrobot/logo.png",
79+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_timestamp/logo.png",
80+
"https://apps-assets.fit2cloud.com/stable/maxkb/kbwf_knowledge_workflow/logo.png",
81+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_household_registration_policy_qa_assistant/logo.png",
82+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_httputils/logo.png",
83+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_html_compression/logo.png",
84+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_crm_customer_entry_ai_agent/logo.png",
85+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_anspire/logo.png",
86+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_application_template/logo.png",
87+
"https://apps-assets.fit2cloud.com/stable/maxkb/tool_baidu-translate/logo.png",
88+
"https://apps-assets.fit2cloud.com/stable/maxkb/app_website_translation/logo.png",
89+
]
90+
91+
def _replace_tool_icons(apps, schema_editor):
92+
if len(old) != len(new):
93+
raise ValueError("`old` 与 `new` 长度不一致,无法一一替换")
94+
95+
Tool = apps.get_model("tools", "Tool")
96+
mapping = dict(zip(old, new))
97+
98+
# 逐个 update,避免依赖数据库对 CASE/WHEN 的兼容差异
99+
for old_icon, new_icon in mapping.items():
100+
Tool.objects.filter(icon=old_icon).update(icon=new_icon)
8101

9102
class Migration(migrations.Migration):
10103

@@ -31,4 +124,5 @@ class Migration(migrations.Migration):
31124
'db_table': 'tool_record',
32125
},
33126
),
127+
migrations.RunPython(_replace_tool_icons, reverse_code=migrations.RunPython.noop),
34128
]

apps/tools/serializers/tool.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
from common.utils.tool_code import ToolExecutor
3535
from knowledge.models import File, FileSourceType, Knowledge
3636
from maxkb.const import PROJECT_DIR
37-
from role_setting.models import Workspace
3837
from system_manage.models import AuthTargetType, WorkspaceUserResourcePermission
3938
from system_manage.models.resource_mapping import ResourceMapping
4039
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
@@ -908,7 +907,7 @@ def get_tool_records(self, current_page: int, page_size: int):
908907
application_subquery = Application.objects.filter(id=OuterRef('source_id')).values('name')[:1]
909908
knowledge_subquery = Knowledge.objects.filter(id=OuterRef('source_id')).values('name')[:1]
910909
trigger_subquery = Trigger.objects.filter(id=OuterRef('source_id')).values('name')[:1]
911-
workspace_subquery = Workspace.objects.filter(id=OuterRef('workspace_id')).values('name')[:1]
910+
trigger_type_subquery = Trigger.objects.filter(id=OuterRef('source_id')).values('trigger_type')[:1]
912911

913912
query_set = QuerySet(ToolRecord)
914913
query_set = query_set.filter(
@@ -922,7 +921,19 @@ def get_tool_records(self, current_page: int, page_size: int):
922921
output_field=CharField()
923922
)
924923
).annotate(
925-
workspace_name=Subquery(workspace_subquery)
924+
trigger_type=Case(
925+
When(source_type='TRIGGER', then=Subquery(trigger_type_subquery)),
926+
default=Value(''),
927+
output_field=CharField()
928+
)
929+
).annotate(
930+
tool_name=Subquery(
931+
Tool.objects.filter(id=OuterRef('tool_id')).values('name')[:1]
932+
)
933+
).annotate(
934+
tool_icon=Subquery(
935+
Tool.objects.filter(id=OuterRef('tool_id')).values('icon')[:1]
936+
)
926937
)
927938
if self.data.get('source_type'):
928939
query_set = query_set.filter(Q(source_type=self.data.get('source_type', '')))
@@ -941,7 +952,9 @@ def get_tool_records(self, current_page: int, page_size: int):
941952
lambda record: {
942953
**ToolRecordModelSerializer(record).data,
943954
'source_name': record.source_name,
944-
'workspace_name': record.workspace_name,
955+
'tool_name': record.tool_name,
956+
'tool_icon': record.tool_icon,
957+
'trigger_type': record.trigger_type,
945958
}
946959
)
947960

ui/src/api/system-resource-management/tool.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,27 @@ const postPylint: (code: string, loading?: Ref<boolean>) => Promise<Result<any>>
129129
return post(`${prefix}/pylint`, { code }, {}, loading)
130130
}
131131

132+
const pageToolRecord = (
133+
tool_id: string,
134+
page: pageRequest,
135+
param: any,
136+
loading?: Ref<boolean>,
137+
) => {
138+
return get(
139+
`${prefix}/${tool_id}/tool_record/${page.current_page}/${page.page_size}`,
140+
param,
141+
loading,
142+
)
143+
}
144+
145+
const getToolRecordDetail = (
146+
tool_id: string,
147+
record_id: string
148+
) => {
149+
return get(`${prefix}/${tool_id}/tool_record/${record_id}`)
150+
}
151+
152+
132153
export default {
133154
getToolListPage,
134155
getToolList,
@@ -140,5 +161,7 @@ export default {
140161
exportTool,
141162
putToolIcon,
142163
delTool,
143-
postToolTestConnection
164+
postToolTestConnection,
165+
pageToolRecord,
166+
getToolRecordDetail,
144167
}

ui/src/components/ai-chat/component/knowledge-source-component/ExecutionDetailContent.vue

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,16 @@
6666
</div>
6767
</div>
6868
</div>
69+
<div v-if="errStepMsg" class="card-never border-r-6 mb-12">
70+
<h5 class="p-8-12">
71+
{{ $t('chat.executionDetails.errLog') }}
72+
</h5>
73+
<div class="p-8-12 border-t-dashed lighter">
74+
<div>
75+
<span>{{ errStepMsg }}</span>
76+
</div>
77+
</div>
78+
</div>
6979
</template>
7080
</div>
7181
</template>
@@ -80,6 +90,14 @@ const props = defineProps<{
8090
appType?: string
8191
}>()
8292
93+
const errStepMsg = computed(() => {
94+
const err_step = props.detail?.find((item) => item.status === 500)
95+
if (err_step) {
96+
return `${err_step.step_type}: ${err_step.err_message}`
97+
}
98+
return undefined
99+
})
100+
83101
const messageList = computed(() => {
84102
const chat_step = props.detail?.find((item) => item.step_type == 'chat_step')
85103
if (chat_step) {
@@ -144,5 +162,4 @@ const AiResponse = computed(() => {
144162
return messages.slice(messages.length - 1, messages.length)
145163
})
146164
</script>
147-
<style lang="scss" scoped>
148-
</style>
165+
<style lang="scss" scoped></style>

ui/src/locales/lang/en-US/ai-chat.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ export default {
127127
paragraphRules: 'Segmentation Rules',
128128
writeContent: 'Content Written',
129129
cancel: 'Cancel Execution',
130+
errLog: 'Error Log',
130131
cancelExecutionTip: 'Are you sure you want to cancel the selected task? ',
131132
},
132133
KnowledgeSource: {

ui/src/locales/lang/en-US/common.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,8 @@ export default {
144144
next: 'Next',
145145
},
146146
use: 'Use',
147+
ExecutionRecord: {
148+
title: 'Execution Record',
149+
subTitle: 'View Execution Record',
150+
},
147151
}

ui/src/locales/lang/en-US/views/trigger.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export default {
44
task: 'Task',
55
triggerTask: 'Trigger Task',
66
taskExecution: 'Task Execution',
7+
triggerSource: 'Trigger Source',
78
delete: {
89
confirmTitle: 'Confirm deleting trigger:',
910
confirmTitle2: 'triggers?',

ui/src/locales/lang/en-US/workflow.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,6 @@ You are a master of problem optimization, adept at accurately inferring user int
537537
},
538538
SystemPromptPlaceholder: 'System Prompt, can reference variables in the system, such as',
539539
UserPromptPlaceholder: 'User Prompt, can reference variables in the system, such as',
540-
ExecutionRecord: 'Execution Record',
541540
initiator: 'Iniiator',
542541
abnormalInformation: 'Abnormal Information',
543542
}

0 commit comments

Comments
 (0)