您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

provider_cache.py 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import json
  2. from abc import ABC, abstractmethod
  3. from json import JSONDecodeError
  4. from typing import Any, Optional
  5. from extensions.ext_redis import redis_client
  6. class ProviderCredentialsCache(ABC):
  7. """Base class for provider credentials cache"""
  8. def __init__(self, **kwargs):
  9. self.cache_key = self._generate_cache_key(**kwargs)
  10. @abstractmethod
  11. def _generate_cache_key(self, **kwargs) -> str:
  12. """Generate cache key based on subclass implementation"""
  13. pass
  14. def get(self) -> Optional[dict]:
  15. """Get cached provider credentials"""
  16. cached_credentials = redis_client.get(self.cache_key)
  17. if cached_credentials:
  18. try:
  19. cached_credentials = cached_credentials.decode("utf-8")
  20. return dict(json.loads(cached_credentials))
  21. except JSONDecodeError:
  22. return None
  23. return None
  24. def set(self, config: dict[str, Any]) -> None:
  25. """Cache provider credentials"""
  26. redis_client.setex(self.cache_key, 86400, json.dumps(config))
  27. def delete(self) -> None:
  28. """Delete cached provider credentials"""
  29. redis_client.delete(self.cache_key)
  30. class SingletonProviderCredentialsCache(ProviderCredentialsCache):
  31. """Cache for tool single provider credentials"""
  32. def __init__(self, tenant_id: str, provider_type: str, provider_identity: str):
  33. super().__init__(
  34. tenant_id=tenant_id,
  35. provider_type=provider_type,
  36. provider_identity=provider_identity,
  37. )
  38. def _generate_cache_key(self, **kwargs) -> str:
  39. tenant_id = kwargs["tenant_id"]
  40. provider_type = kwargs["provider_type"]
  41. identity_name = kwargs["provider_identity"]
  42. identity_id = f"{provider_type}.{identity_name}"
  43. return f"{provider_type}_credentials:tenant_id:{tenant_id}:id:{identity_id}"
  44. class ToolProviderCredentialsCache(ProviderCredentialsCache):
  45. """Cache for tool provider credentials"""
  46. def __init__(self, tenant_id: str, provider: str, credential_id: str):
  47. super().__init__(tenant_id=tenant_id, provider=provider, credential_id=credential_id)
  48. def _generate_cache_key(self, **kwargs) -> str:
  49. tenant_id = kwargs["tenant_id"]
  50. provider = kwargs["provider"]
  51. credential_id = kwargs["credential_id"]
  52. return f"tool_credentials:tenant_id:{tenant_id}:provider:{provider}:credential_id:{credential_id}"
  53. class NoOpProviderCredentialCache:
  54. """No-op provider credential cache"""
  55. def get(self) -> Optional[dict]:
  56. """Get cached provider credentials"""
  57. return None
  58. def set(self, config: dict[str, Any]) -> None:
  59. """Cache provider credentials"""
  60. pass
  61. def delete(self) -> None:
  62. """Delete cached provider credentials"""
  63. pass