|
2 | 2 | import json |
3 | 3 | import os |
4 | 4 | import re |
| 5 | +import tempfile |
5 | 6 | import traceback |
| 7 | +import zipfile |
6 | 8 | from collections import defaultdict |
7 | 9 | from functools import reduce |
8 | 10 | from tempfile import TemporaryDirectory |
9 | 11 | from typing import Dict, List |
10 | 12 |
|
| 13 | +import requests |
11 | 14 | import uuid_utils.compat as uuid |
12 | 15 | from celery_once import AlreadyQueued |
13 | 16 | from django.core import validators |
|
19 | 22 | from django.utils.translation import gettext_lazy as _ |
20 | 23 | from rest_framework import serializers |
21 | 24 |
|
22 | | -from application.flow.tools import get_workflow_resource, get_node_handle_callback, save_workflow_mapping |
23 | 25 | from application.models import ApplicationKnowledgeMapping |
24 | 26 | from common.config.embedding_config import VectorStore |
25 | 27 | from common.database_model_manage.database_model_manage import DatabaseModelManage |
|
32 | 34 | from common.utils.logger import maxkb_logger |
33 | 35 | from common.utils.split_model import get_split_model |
34 | 36 | from knowledge.models import Knowledge, KnowledgeScope, KnowledgeType, Document, Paragraph, Problem, \ |
35 | | - ProblemParagraphMapping, TaskType, State, SearchMode, KnowledgeFolder, File, Tag, KnowledgeWorkflow |
| 37 | + ProblemParagraphMapping, TaskType, State, SearchMode, KnowledgeFolder, File, Tag |
36 | 38 | from knowledge.serializers.common import ProblemParagraphManage, drop_knowledge_index, \ |
37 | 39 | get_embedding_model_id_by_knowledge_id, MetaSerializer, \ |
38 | 40 | GenerateRelatedSerializer, get_embedding_model_by_knowledge_id, list_paragraph, write_image, zip_dir, \ |
|
44 | 46 | from maxkb.conf import PROJECT_DIR |
45 | 47 | from models_provider.models import Model |
46 | 48 | from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType |
47 | | -from system_manage.models.resource_mapping import ResourceType, ResourceMapping |
48 | 49 | from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer |
49 | 50 | from users.serializers.user import is_workspace_manage |
50 | 51 |
|
@@ -768,6 +769,55 @@ def hit_test(self): |
768 | 769 | } for p in p_list |
769 | 770 | ] |
770 | 771 |
|
| 772 | + class StoreKnowledge(serializers.Serializer): |
| 773 | + user_id = serializers.UUIDField(required=True, label=_("User ID")) |
| 774 | + name = serializers.CharField(required=False, label=_("tool name"), allow_null=True, allow_blank=True) |
| 775 | + |
| 776 | + def get_appstore_templates(self): |
| 777 | + self.is_valid(raise_exception=True) |
| 778 | + # 下载zip文件 |
| 779 | + try: |
| 780 | + res = requests.get('https://apps-assets.fit2cloud.com/stable/maxkb.json.zip', timeout=5) |
| 781 | + res.raise_for_status() |
| 782 | + # 创建临时文件保存zip |
| 783 | + with tempfile.NamedTemporaryFile(delete=False, suffix='.zip') as temp_zip: |
| 784 | + temp_zip.write(res.content) |
| 785 | + temp_zip_path = temp_zip.name |
| 786 | + |
| 787 | + try: |
| 788 | + # 解压zip文件 |
| 789 | + with zipfile.ZipFile(temp_zip_path, 'r') as zip_ref: |
| 790 | + # 获取zip中的第一个文件(假设只有一个json文件) |
| 791 | + json_filename = zip_ref.namelist()[0] |
| 792 | + json_content = zip_ref.read(json_filename) |
| 793 | + |
| 794 | + # 将json转换为字典 |
| 795 | + tool_store = json.loads(json_content.decode('utf-8')) |
| 796 | + tag_dict = {tag['name']: tag['key'] for tag in tool_store['additionalProperties']['tags']} |
| 797 | + filter_apps = [] |
| 798 | + for tool in tool_store['apps']: |
| 799 | + if self.data.get('name', '') != '': |
| 800 | + if self.data.get('name').lower() not in tool.get('name', '').lower(): |
| 801 | + continue |
| 802 | + if not tool['downloadUrl'].endswith('.kbwf'): |
| 803 | + continue |
| 804 | + versions = tool.get('versions', []) |
| 805 | + tool['label'] = tag_dict[tool.get('tags')[0]] if tool.get('tags') else '' |
| 806 | + tool['version'] = next( |
| 807 | + (version.get('name') for version in versions if |
| 808 | + version.get('downloadUrl') == tool['downloadUrl']), |
| 809 | + ) |
| 810 | + filter_apps.append(tool) |
| 811 | + |
| 812 | + tool_store['apps'] = filter_apps |
| 813 | + return tool_store |
| 814 | + finally: |
| 815 | + # 清理临时文件 |
| 816 | + os.unlink(temp_zip_path) |
| 817 | + except Exception as e: |
| 818 | + maxkb_logger.error(f"fetch appstore tools error: {e}") |
| 819 | + return {'apps': [], 'additionalProperties': {'tags': []}} |
| 820 | + |
771 | 821 | class Tags(serializers.Serializer): |
772 | 822 | workspace_id = serializers.CharField(required=True, label=_('workspace id')) |
773 | 823 | user_id = serializers.UUIDField(required=True, label=_('user id')) |
|
0 commit comments