Skip to content

Commit 6eb3aa8

Browse files
committed
feat: add workflow template handling in tool.py and ToolStoreDialog.vue
1 parent b43e150 commit 6eb3aa8

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

apps/tools/serializers/tool.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from common.exception.app_exception import AppApiException
3434
from common.field.common import UploadedImageField
3535
from common.result import result
36-
from common.utils.common import get_file_content, generate_uuid
36+
from common.utils.common import get_file_content, generate_uuid, bytes_to_uploaded_file
3737
from common.utils.logger import maxkb_logger
3838
from common.utils.rsa_util import rsa_long_decrypt, rsa_long_encrypt
3939
from common.utils.tool_code import ToolExecutor
@@ -400,6 +400,25 @@ def insert(self, instance, with_valid=True):
400400
if instance.get('tool_type') == ToolType.MCP:
401401
ToolExecutor().validate_mcp_transport(instance.get('code', ''))
402402

403+
# 处理 work_flow_template
404+
if instance.get('work_flow_template') is not None:
405+
template_instance = instance.get('work_flow_template')
406+
download_url = template_instance.get('downloadUrl')
407+
# 查找匹配的版本名称
408+
res = requests.get(download_url, timeout=5)
409+
tool = ToolSerializer.Import(data={
410+
'file': bytes_to_uploaded_file(res.content, 'file.tool'),
411+
'user_id': self.data.get('user_id'),
412+
'workspace_id': self.data.get('workspace_id'),
413+
'folder_id': str(instance.get('folder_id', self.data.get('workspace_id'))),
414+
}).import_()
415+
416+
try:
417+
requests.get(template_instance.get('downloadCallbackUrl'), timeout=5)
418+
except Exception as e:
419+
maxkb_logger.error(f"callback appstore tool download error: {e}")
420+
return tool
421+
403422
tool_id = uuid.uuid7()
404423
Tool(
405424
id=tool_id,
@@ -860,7 +879,9 @@ def import_(self, scope=ToolScope.WORKSPACE):
860879
'auth_target_type': AuthTargetType.TOOL.value
861880
}).auth_resource(str(tool_id))
862881

863-
return True
882+
return ToolSerializer.Operate(data={
883+
'id': tool_id, 'workspace_id': self.data.get('workspace_id')
884+
}).one()
864885

865886
class IconOperate(serializers.Serializer):
866887
id = serializers.UUIDField(required=True, label=_("function ID"))

ui/src/views/tool/tool-store/ToolStoreDialog.vue

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ const addLoading = ref(false)
243243
async function handleAdd(tool: any) {
244244
if (tool.tool_type === 'INTERNAL') {
245245
await handleInternalAdd(tool)
246+
} else if (tool.label === 'workflow_template') {
247+
await handleTemplateAdd(tool)
246248
} else {
247249
await handleStoreAdd(tool)
248250
}
@@ -287,6 +289,31 @@ async function handleStoreAdd(tool: any) {
287289
}
288290
}
289291
292+
async function handleTemplateAdd(tool: any) {
293+
try {
294+
const obj = {
295+
name: tool.name,
296+
folder_id: folderId.value,
297+
code: '{}',
298+
work_flow_template: tool
299+
}
300+
await loadSharedApi({ type: 'tool', systemType: props.apiType })
301+
.postTool(obj)
302+
.then((res: any) => {
303+
MsgSuccess(t('common.addSuccess'))
304+
emit('refresh')
305+
return user.profile().then(() => {
306+
dialogVisible.value = false
307+
})
308+
})
309+
.finally(() => {
310+
loading.value = false
311+
})
312+
} catch (error) {
313+
console.error(error)
314+
}
315+
}
316+
290317
291318
defineExpose({ open })
292319
</script>

0 commit comments

Comments
 (0)