Skip to content

Commit 946de67

Browse files
committed
feat: add model setting
1 parent 934871f commit 946de67

File tree

277 files changed

+15472
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

277 files changed

+15472
-3
lines changed

apps/common/cache/file_cache.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# coding=utf-8
2+
"""
3+
@project: qabot
4+
@Author:虎
5+
@file: file_cache.py
6+
@date:2023/9/11 15:58
7+
@desc: 文件缓存
8+
"""
9+
import datetime
10+
import math
11+
import os
12+
import time
13+
14+
from diskcache import Cache
15+
from django.core.cache.backends.base import BaseCache
16+
17+
18+
class FileCache(BaseCache):
19+
def __init__(self, dir, params):
20+
super().__init__(params)
21+
self._dir = os.path.abspath(dir)
22+
self._createdir()
23+
self.cache = Cache(self._dir)
24+
25+
def _createdir(self):
26+
old_umask = os.umask(0o077)
27+
try:
28+
os.makedirs(self._dir, 0o700, exist_ok=True)
29+
finally:
30+
os.umask(old_umask)
31+
32+
def add(self, key, value, timeout=None, version=None):
33+
expire = timeout if isinstance(timeout, int) or isinstance(timeout,
34+
float) or timeout is None else timeout.total_seconds()
35+
return self.cache.add(self.get_key(key, version), value=value, expire=expire)
36+
37+
def set(self, key, value, timeout=None, version=None):
38+
expire = timeout if isinstance(timeout, int) or isinstance(timeout,
39+
float) or timeout is None else timeout.total_seconds()
40+
return self.cache.set(self.get_key(key, version), value=value, expire=expire)
41+
42+
def get(self, key, default=None, version=None):
43+
return self.cache.get(self.get_key(key, version), default=default)
44+
45+
@staticmethod
46+
def get_key(key, version):
47+
if version is None:
48+
return f"default:{key}"
49+
return f"{version}:{key}"
50+
51+
def delete(self, key, version=None):
52+
return self.cache.delete(self.get_key(key, version))
53+
54+
def touch(self, key, timeout=None, version=None):
55+
expire = timeout if isinstance(timeout, int) or isinstance(timeout,
56+
float) else timeout.total_seconds()
57+
58+
return self.cache.touch(self.get_key(key, version), expire=expire)
59+
60+
def ttl(self, key, version=None):
61+
"""
62+
获取key的剩余时间
63+
:param key: key
64+
:return: 剩余时间
65+
@param version:
66+
"""
67+
value, expire_time = self.cache.get(self.get_key(key, version), expire_time=True)
68+
if value is None:
69+
return None
70+
return datetime.timedelta(seconds=math.ceil(expire_time - time.time()))
71+
72+
def clear_by_application_id(self, application_id):
73+
delete_keys = []
74+
for key in self.cache.iterkeys():
75+
value = self.cache.get(key)
76+
if (hasattr(value,
77+
'application') and value.application is not None and value.application.id is not None and
78+
str(
79+
value.application.id) == application_id):
80+
delete_keys.append(key)
81+
for key in delete_keys:
82+
self.cache.delete(key)
83+
84+
def clear_timeout_data(self):
85+
for key in self.cache.iterkeys():
86+
self.get(key)

apps/common/cache/mem_cache.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# coding=utf-8
2+
"""
3+
@project: maxkb
4+
@Author:虎
5+
@file: mem_cache.py
6+
@date:2024/3/6 11:20
7+
@desc:
8+
"""
9+
from django.core.cache.backends.base import DEFAULT_TIMEOUT
10+
from django.core.cache.backends.locmem import LocMemCache
11+
12+
13+
class MemCache(LocMemCache):
14+
def __init__(self, name, params):
15+
super().__init__(name, params)
16+
17+
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
18+
key = self.make_and_validate_key(key, version=version)
19+
pickled = value
20+
with self._lock:
21+
self._set(key, pickled, timeout)
22+
23+
def get(self, key, default=None, version=None):
24+
key = self.make_and_validate_key(key, version=version)
25+
with self._lock:
26+
if self._has_expired(key):
27+
self._delete(key)
28+
return default
29+
pickled = self._cache[key]
30+
self._cache.move_to_end(key, last=False)
31+
return pickled
32+
33+
def clear_by_application_id(self, application_id):
34+
delete_keys = []
35+
for key in self._cache.keys():
36+
value = self._cache.get(key)
37+
if (hasattr(value,
38+
'application') and value.application is not None and value.application.id is not None and
39+
str(
40+
value.application.id) == application_id):
41+
delete_keys.append(key)
42+
for key in delete_keys:
43+
self._delete(key)
44+
45+
def clear_timeout_data(self):
46+
for key in self._cache.keys():
47+
self.get(key)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# coding=utf-8
2+
"""
3+
@project: maxkb
4+
@Author:虎
5+
@file: embedding_config.py
6+
@date:2023/10/23 16:03
7+
@desc:
8+
"""
9+
import threading
10+
import time
11+
12+
from common.cache.mem_cache import MemCache
13+
14+
lock = threading.Lock()
15+
16+
17+
class ModelManage:
18+
cache = MemCache('model', {})
19+
up_clear_time = time.time()
20+
21+
@staticmethod
22+
def get_model(_id, get_model):
23+
# 获取锁
24+
lock.acquire()
25+
try:
26+
model_instance = ModelManage.cache.get(_id)
27+
if model_instance is None or not model_instance.is_cache_model():
28+
model_instance = get_model(_id)
29+
ModelManage.cache.set(_id, model_instance, timeout=60 * 30)
30+
return model_instance
31+
# 续期
32+
ModelManage.cache.touch(_id, timeout=60 * 30)
33+
ModelManage.clear_timeout_cache()
34+
return model_instance
35+
finally:
36+
# 释放锁
37+
lock.release()
38+
39+
@staticmethod
40+
def clear_timeout_cache():
41+
if time.time() - ModelManage.up_clear_time > 60:
42+
ModelManage.cache.clear_timeout_data()
43+
44+
@staticmethod
45+
def delete_key(_id):
46+
if ModelManage.cache.has_key(_id):
47+
ModelManage.cache.delete(_id)
48+
49+
50+
class VectorStore:
51+
from embedding.vector.pg_vector import PGVector
52+
from embedding.vector.base_vector import BaseVectorStore
53+
instance_map = {
54+
'pg_vector': PGVector,
55+
}
56+
instance = None
57+
58+
@staticmethod
59+
def get_embedding_vector() -> BaseVectorStore:
60+
from embedding.vector.pg_vector import PGVector
61+
if VectorStore.instance is None:
62+
from maxkb.const import CONFIG
63+
vector_store_class = VectorStore.instance_map.get(CONFIG.get("VECTOR_STORE_NAME"),
64+
PGVector)
65+
VectorStore.instance = vector_store_class()
66+
return VectorStore.instance
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# coding=utf-8
2+
"""
3+
@project: maxkb
4+
@Author:虎
5+
@file: tokenizer_manage_config.py
6+
@date:2024/4/28 10:17
7+
@desc:
8+
"""
9+
10+
11+
class TokenizerManage:
12+
tokenizer = None
13+
14+
@staticmethod
15+
def get_tokenizer():
16+
from transformers import BertTokenizer
17+
if TokenizerManage.tokenizer is None:
18+
TokenizerManage.tokenizer = BertTokenizer.from_pretrained(
19+
'bert-base-cased',
20+
cache_dir="/opt/maxkb/model/tokenizer",
21+
local_files_only=True,
22+
resume_download=False,
23+
force_download=False)
24+
return TokenizerManage.tokenizer

apps/common/constants/permission_constants.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ class PermissionConstants(Enum):
111111
USER_DELETE = Permission(group=Group.USER, operate=Operate.DELETE, role_list=[RoleConstants.ADMIN])
112112
TOOL_CREATE = Permission(group=Group.USER, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN,
113113
RoleConstants.USER])
114+
MODEL_CREATE = Permission(group=Group.USER, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN,
115+
RoleConstants.USER])
116+
MODEL_READ = Permission(group=Group.USER, operate=Operate.READ, role_list=[RoleConstants.ADMIN,
117+
RoleConstants.USER])
118+
MODEL_EDIT = Permission(group=Group.USER, operate=Operate.EDIT, role_list=[RoleConstants.ADMIN, RoleConstants.USER])
119+
MODEL_DELETE = Permission(group=Group.USER, operate=Operate.DELETE,
120+
role_list=[RoleConstants.ADMIN, RoleConstants.USER])
114121

115122
def get_workspace_application_permission(self):
116123
return lambda r, kwargs: Permission(group=self.value.group, operate=self.value.operate,

apps/common/forms/__init__.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# coding=utf-8
2+
"""
3+
@project: maxkb
4+
@Author:虎
5+
@file: __init__.py
6+
@date:2023/10/31 17:56
7+
@desc:
8+
"""
9+
from .array_object_card import *
10+
from .base_field import *
11+
from .base_form import *
12+
from .multi_select import *
13+
from .object_card import *
14+
from .password_input import *
15+
from .radio_field import *
16+
from .single_select_field import *
17+
from .tab_card import *
18+
from .table_radio import *
19+
from .text_input_field import *
20+
from .radio_button_field import *
21+
from .table_checkbox import *
22+
from .radio_card_field import *
23+
from .label import *
24+
from .slider_field import *
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# coding=utf-8
2+
"""
3+
@project: maxkb
4+
@Author:虎
5+
@file: array_object_card.py
6+
@date:2023/10/31 18:03
7+
@desc:
8+
"""
9+
from typing import Dict
10+
11+
from common.forms.base_field import BaseExecField, TriggerType
12+
13+
14+
class ArrayCard(BaseExecField):
15+
"""
16+
收集List[Object]
17+
"""
18+
19+
def __init__(self,
20+
label: str,
21+
text_field: str,
22+
value_field: str,
23+
provider: str,
24+
method: str,
25+
required: bool = False,
26+
default_value: object = None,
27+
relation_show_field_dict: Dict = None,
28+
relation_trigger_field_dict: Dict = None,
29+
trigger_type: TriggerType = TriggerType.OPTION_LIST,
30+
attrs: Dict[str, object] = None,
31+
props_info: Dict[str, object] = None):
32+
super().__init__("ArrayObjectCard", label, text_field, value_field, provider, method, required, default_value,
33+
relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info)

0 commit comments

Comments
 (0)