|
7 | 7 | @desc: |
8 | 8 | """ |
9 | 9 | import asyncio |
| 10 | +import base64 |
10 | 11 | import hashlib |
11 | 12 | import json |
12 | 13 | import os |
|
43 | 44 | from common.utils.common import get_file_content, restricted_loads, generate_uuid, _remove_empty_lines, \ |
44 | 45 | bytes_to_uploaded_file |
45 | 46 | from common.utils.logger import maxkb_logger |
46 | | -from knowledge.models import Knowledge, KnowledgeScope |
| 47 | +from knowledge.models import Knowledge, KnowledgeScope, File, FileSourceType |
47 | 48 | from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeModelSerializer |
48 | 49 | from maxkb.conf import PROJECT_DIR |
49 | 50 | from models_provider.models import Model |
|
52 | 53 | from system_manage.models.resource_mapping import ResourceMapping |
53 | 54 | from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer |
54 | 55 | from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer |
55 | | -from tools.models import Tool, ToolScope |
| 56 | +from tools.models import Tool, ToolScope, ToolType |
56 | 57 | from tools.serializers.tool import ToolExportModelSerializer |
57 | 58 | from trigger.models import TriggerTask, Trigger |
58 | 59 | from users.models import User |
@@ -637,7 +638,19 @@ def to_tool(tool, workspace_id, user_id): |
637 | 638 | @param tool: 工具 |
638 | 639 | @return: |
639 | 640 | """ |
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 |
641 | 654 | return Tool(id=tool.get('id'), |
642 | 655 | user_id=user_id, |
643 | 656 | name=tool.get('name'), |
@@ -820,9 +833,18 @@ def export(self, with_valid=True): |
820 | 833 | application = QuerySet(Application).filter(id=application_id).first() |
821 | 834 | from application.flow.tools import get_tool_id_list |
822 | 835 | tool_id_list = get_tool_id_list(application.work_flow) |
823 | | - tool_list = [] |
824 | 836 | if len(tool_id_list) > 0: |
825 | 837 | 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') |
826 | 848 | application_dict = ApplicationSerializerModel(application).data |
827 | 849 |
|
828 | 850 | mk_instance = MKInstance(application_dict, |
@@ -897,7 +919,7 @@ def publish(self, instance, with_valid=True): |
897 | 919 | work_flow_version.save() |
898 | 920 | access_token = hashlib.md5( |
899 | 921 | str(uuid.uuid7()).encode()).hexdigest()[ |
900 | | - 8:24] |
| 922 | + 8:24] |
901 | 923 | application_access_token = QuerySet(ApplicationAccessToken).filter( |
902 | 924 | application_id=application.id).first() |
903 | 925 | if application_access_token is None: |
|
0 commit comments