Skip to content

Commit 7f04536

Browse files
committed
feat: add file handling for skill type tools and update code storage
--bug=1066978@tapd-62980211 --user=刘瑞斌 【应用】导出简易应用时,没有同步导出引用的MCP、工具、技能,导入后相关资源没有创建,引用为空 https://www.tapd.cn/62980211/s/1869932 --bug=1066977@tapd-62980211 --user=刘瑞斌 【工具】导入智能体时同步创建的技能,缺少技能文件 https://www.tapd.cn/62980211/s/1869934
1 parent acf02db commit 7f04536

1 file changed

Lines changed: 27 additions & 5 deletions

File tree

apps/application/serializers/application.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
@desc:
88
"""
99
import asyncio
10+
import base64
1011
import hashlib
1112
import json
1213
import os
@@ -43,7 +44,7 @@
4344
from common.utils.common import get_file_content, restricted_loads, generate_uuid, _remove_empty_lines, \
4445
bytes_to_uploaded_file
4546
from common.utils.logger import maxkb_logger
46-
from knowledge.models import Knowledge, KnowledgeScope
47+
from knowledge.models import Knowledge, KnowledgeScope, File, FileSourceType
4748
from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeModelSerializer
4849
from maxkb.conf import PROJECT_DIR
4950
from models_provider.models import Model
@@ -52,7 +53,7 @@
5253
from system_manage.models.resource_mapping import ResourceMapping
5354
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
5455
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
55-
from tools.models import Tool, ToolScope
56+
from tools.models import Tool, ToolScope, ToolType
5657
from tools.serializers.tool import ToolExportModelSerializer
5758
from trigger.models import TriggerTask, Trigger
5859
from users.models import User
@@ -637,7 +638,19 @@ def to_tool(tool, workspace_id, user_id):
637638
@param tool: 工具
638639
@return:
639640
"""
640-
641+
# 如果是技能类型的工具,需要将code保存为文件
642+
code = tool.get('code')
643+
if tool.get('tool_type') == ToolType.SKILL:
644+
skill_file_id = uuid.uuid7()
645+
skill_file = File(
646+
id=skill_file_id,
647+
file_name=f"{tool.get('name')}.zip",
648+
source_type=FileSourceType.TOOL,
649+
source_id=tool.get('id'),
650+
meta={}
651+
)
652+
skill_file.save(base64.b64decode(code))
653+
tool['code'] = skill_file_id
641654
return Tool(id=tool.get('id'),
642655
user_id=user_id,
643656
name=tool.get('name'),
@@ -820,9 +833,18 @@ def export(self, with_valid=True):
820833
application = QuerySet(Application).filter(id=application_id).first()
821834
from application.flow.tools import get_tool_id_list
822835
tool_id_list = get_tool_id_list(application.work_flow)
823-
tool_list = []
824836
if len(tool_id_list) > 0:
825837
tool_list = QuerySet(Tool).filter(id__in=tool_id_list).exclude(scope=ToolScope.SHARED)
838+
else:
839+
tool_list = QuerySet(Tool).filter(
840+
id__in=application.tool_ids + application.mcp_tool_ids + application.skill_tool_ids
841+
).exclude(scope=ToolScope.SHARED)
842+
# 如果是技能工具,则需要将code字段转换为文件内容的base64字符串
843+
for tool in tool_list:
844+
if tool.tool_type == ToolType.SKILL:
845+
skill_file = QuerySet(File).filter(id=tool.code).first()
846+
if skill_file:
847+
tool.code = base64.b64encode(skill_file.get_bytes()).decode('utf-8')
826848
application_dict = ApplicationSerializerModel(application).data
827849

828850
mk_instance = MKInstance(application_dict,
@@ -897,7 +919,7 @@ def publish(self, instance, with_valid=True):
897919
work_flow_version.save()
898920
access_token = hashlib.md5(
899921
str(uuid.uuid7()).encode()).hexdigest()[
900-
8:24]
922+
8:24]
901923
application_access_token = QuerySet(ApplicationAccessToken).filter(
902924
application_id=application.id).first()
903925
if application_access_token is None:

0 commit comments

Comments
 (0)