Skip to content

Commit 308b370

Browse files
committed
feat: add file handling for skill tools in knowledge workflow
1 parent 6a84537 commit 308b370

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

apps/knowledge/serializers/knowledge_workflow.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# coding=utf-8
22
import asyncio
3+
import base64
34
import json
45
import pickle
56
from functools import reduce
@@ -31,7 +32,8 @@
3132
from common.utils.logger import maxkb_logger
3233
from common.utils.rsa_util import rsa_long_decrypt
3334
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
3537
from knowledge.models.knowledge_action import KnowledgeAction, State
3638
from knowledge.serializers.common import update_resource_mapping_by_knowledge
3739
from knowledge.serializers.knowledge import KnowledgeModelSerializer
@@ -60,6 +62,10 @@ def hand_node(node, update_tool_map):
6062
tool_ids = node_data.get('tool_ids') or []
6163
node_data['tool_ids'] = [update_tool_map.get(tool_id,
6264
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]
6369
if node.get('type') == 'mcp-node':
6470
mcp_tool_id = (node.get('properties', {}).get('node_data', {}).get('mcp_tool_id') or '')
6571
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):
395401

396402
@staticmethod
397403
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
398417
return Tool(id=tool.get('id'),
399418
user_id=user_id,
400419
name=tool.get('name'),
@@ -428,6 +447,14 @@ def export(self, with_valid=True):
428447
tw_dict = {tw.tool_id: tw
429448
for tw in QuerySet(ToolWorkflow).filter(
430449
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+
431458
knowledge_workflow_dict = KnowledgeWorkflowModelSerializer(knowledge_workflow).data
432459

433460
kbwf_instance = KBWFInstance(

0 commit comments

Comments
 (0)