chore: add redis for builtin plugin service

pull/20118/head
G.Wood-Sun 1 year ago
parent 916c415b4b
commit 813d156382

@ -16,6 +16,7 @@ from core.tools.tool_label_manager import ToolLabelManager
from core.tools.tool_manager import ToolManager from core.tools.tool_manager import ToolManager
from core.tools.utils.configuration import ProviderConfigEncrypter from core.tools.utils.configuration import ProviderConfigEncrypter
from extensions.ext_database import db from extensions.ext_database import db
from extensions.ext_redis import redis_client
from models.tools import BuiltinToolProvider from models.tools import BuiltinToolProvider
from services.tools.tools_transform_service import ToolTransformService from services.tools.tools_transform_service import ToolTransformService
@ -23,6 +24,16 @@ logger = logging.getLogger(__name__)
class BuiltinToolManageService: class BuiltinToolManageService:
REDIS_KEY_PREFIX = "builtin_tools:user:{user_id}:tenant:{tenant_id}"
REDIS_TTL = 60 * 10 # Cache expires in 10 minutes
@staticmethod
def get_redis_key(user_id: str, tenant_id: str) -> str:
"""
Generate the Redis key for caching.
"""
return BuiltinToolManageService.REDIS_KEY_PREFIX.format(user_id=user_id, tenant_id=tenant_id)
@staticmethod @staticmethod
def list_builtin_tool_provider_tools(tenant_id: str, provider: str) -> list[ToolApiEntity]: def list_builtin_tool_provider_tools(tenant_id: str, provider: str) -> list[ToolApiEntity]:
""" """
@ -166,6 +177,8 @@ class BuiltinToolManageService:
tool_configuration.delete_tool_credentials_cache() tool_configuration.delete_tool_credentials_cache()
db.session.commit() db.session.commit()
redis_key = BuiltinToolManageService.get_redis_key(user_id, tenant_id)
redis_client.delete(redis_key)
return {"result": "success"} return {"result": "success"}
@staticmethod @staticmethod
@ -201,6 +214,8 @@ class BuiltinToolManageService:
db.session.delete(provider_obj) db.session.delete(provider_obj)
db.session.commit() db.session.commit()
redis_key = BuiltinToolManageService.get_redis_key(user_id, tenant_id)
redis_client.delete(redis_key)
# delete cache # delete cache
provider_controller = ToolManager.get_builtin_provider(provider_name, tenant_id) provider_controller = ToolManager.get_builtin_provider(provider_name, tenant_id)
@ -229,6 +244,20 @@ class BuiltinToolManageService:
""" """
list builtin tools list builtin tools
""" """
redis_key = BuiltinToolManageService.get_redis_key(user_id, tenant_id)
result: list[ToolProviderApiEntity] = []
try:
# Try to get from Redis cache
cached_data = redis_client.get(redis_key)
if cached_data:
try:
# Deserialize cached data directly into a list of dictionaries
deserialized_data = json.loads(cached_data)
return [ToolProviderApiEntity(**item) for item in deserialized_data]
except (json.JSONDecodeError, TypeError) as e:
raise ValueError(f"Failed to deserialize cached data: {e}")
# get all builtin providers # get all builtin providers
provider_controllers = ToolManager.list_builtin_providers(tenant_id) provider_controllers = ToolManager.list_builtin_providers(tenant_id)
@ -246,8 +275,6 @@ class BuiltinToolManageService:
def find_provider(provider): def find_provider(provider):
return next(filter(lambda db_provider: db_provider.provider == provider, db_providers), None) return next(filter(lambda db_provider: db_provider.provider == provider, db_providers), None)
result: list[ToolProviderApiEntity] = []
for provider_controller in provider_controllers: for provider_controller in provider_controllers:
try: try:
# handle include, exclude # handle include, exclude
@ -283,8 +310,14 @@ class BuiltinToolManageService:
result.append(user_builtin_provider) result.append(user_builtin_provider)
except Exception as e: except Exception as e:
raise e raise e
result = BuiltinToolProviderSort.sort(result)
return BuiltinToolProviderSort.sort(result) # Serialize and store in Redis
serialized_result = json.dumps([jsonable_encoder(item) for item in result])
redis_client.setex(redis_key, BuiltinToolManageService.REDIS_TTL, serialized_result)
except Exception as e:
raise ValueError(str(e))
return result
@staticmethod @staticmethod
def _fetch_builtin_provider(provider_name: str, tenant_id: str) -> BuiltinToolProvider | None: def _fetch_builtin_provider(provider_name: str, tenant_id: str) -> BuiltinToolProvider | None:

Loading…
Cancel
Save