|
1 | 1 | # coding=utf-8 |
2 | 2 | import asyncio |
| 3 | +import base64 |
3 | 4 | import json |
4 | 5 | import pickle |
5 | 6 | from functools import reduce |
|
31 | 32 | from common.utils.logger import maxkb_logger |
32 | 33 | from common.utils.rsa_util import rsa_long_decrypt |
33 | 34 | from common.utils.tool_code import ToolExecutor |
34 | | -from knowledge.models import KnowledgeScope, Knowledge, KnowledgeType, KnowledgeWorkflow, KnowledgeWorkflowVersion |
| 35 | +from knowledge.models import KnowledgeScope, Knowledge, KnowledgeType, KnowledgeWorkflow, KnowledgeWorkflowVersion, \ |
| 36 | + File, FileSourceType |
35 | 37 | from knowledge.models.knowledge_action import KnowledgeAction, State |
36 | 38 | from knowledge.serializers.common import update_resource_mapping_by_knowledge |
37 | 39 | from knowledge.serializers.knowledge import KnowledgeModelSerializer |
@@ -60,6 +62,10 @@ def hand_node(node, update_tool_map): |
60 | 62 | tool_ids = node_data.get('tool_ids') or [] |
61 | 63 | node_data['tool_ids'] = [update_tool_map.get(tool_id, |
62 | 64 | tool_id) for tool_id in tool_ids] |
| 65 | + |
| 66 | + skill_tool_ids = node_data.get('skill_tool_ids') or [] |
| 67 | + node_data['skill_tool_ids'] = [update_tool_map.get(tool_id, |
| 68 | + tool_id) for tool_id in skill_tool_ids] |
63 | 69 | if node.get('type') == 'mcp-node': |
64 | 70 | mcp_tool_id = (node.get('properties', {}).get('node_data', {}).get('mcp_tool_id') or '') |
65 | 71 | node.get('properties', {}).get('node_data', {})['mcp_tool_id'] = update_tool_map.get(mcp_tool_id, |
@@ -395,6 +401,19 @@ def reset_workflow(work_flow, update_tool_map): |
395 | 401 |
|
396 | 402 | @staticmethod |
397 | 403 | def to_tool(tool, workspace_id, user_id): |
| 404 | + # 如果是技能类型的工具,需要将code保存为文件 |
| 405 | + code = tool.get('code') |
| 406 | + if tool.get('tool_type') == ToolType.SKILL: |
| 407 | + skill_file_id = uuid.uuid7() |
| 408 | + skill_file = File( |
| 409 | + id=skill_file_id, |
| 410 | + file_name=f"{tool.get('name')}.zip", |
| 411 | + source_type=FileSourceType.TOOL, |
| 412 | + source_id=tool.get('id'), |
| 413 | + meta={} |
| 414 | + ) |
| 415 | + skill_file.save(base64.b64decode(code)) |
| 416 | + tool['code'] = skill_file_id |
398 | 417 | return Tool(id=tool.get('id'), |
399 | 418 | user_id=user_id, |
400 | 419 | name=tool.get('name'), |
@@ -428,6 +447,14 @@ def export(self, with_valid=True): |
428 | 447 | tw_dict = {tw.tool_id: tw |
429 | 448 | for tw in QuerySet(ToolWorkflow).filter( |
430 | 449 | tool_id__in=[tool.id for tool in tool_list if tool.tool_type == ToolType.WORKFLOW])} |
| 450 | + |
| 451 | + # 如果是技能工具,则需要将code字段转换为文件内容的base64字符串 |
| 452 | + for tool in tool_list: |
| 453 | + if tool.tool_type == ToolType.SKILL: |
| 454 | + skill_file = QuerySet(File).filter(id=tool.code).first() |
| 455 | + if skill_file: |
| 456 | + tool.code = base64.b64encode(skill_file.get_bytes()).decode('utf-8') |
| 457 | + |
431 | 458 | knowledge_workflow_dict = KnowledgeWorkflowModelSerializer(knowledge_workflow).data |
432 | 459 |
|
433 | 460 | kbwf_instance = KBWFInstance( |
|
0 commit comments