89 lines
3.2 KiB
Python
89 lines
3.2 KiB
Python
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
# SPDX-License-Identifier: MIT
|
|
import logging
|
|
import os
|
|
from typing import Any, Optional, Union
|
|
|
|
from ..import_utils import optional_import_block
|
|
from .abstract_cache_base import AbstractCache
|
|
from .disk_cache import DiskCache
|
|
|
|
|
|
class CacheFactory:
|
|
@staticmethod
|
|
def cache_factory(
|
|
seed: Union[str, int],
|
|
redis_url: Optional[str] = None,
|
|
cache_path_root: str = ".cache",
|
|
cosmosdb_config: Optional[dict[str, Any]] = None,
|
|
) -> AbstractCache:
|
|
"""Factory function for creating cache instances.
|
|
|
|
This function decides whether to create a RedisCache, DiskCache, or CosmosDBCache instance
|
|
based on the provided parameters. If RedisCache is available and a redis_url is provided,
|
|
a RedisCache instance is created. If connection_string, database_id, and container_id
|
|
are provided, a CosmosDBCache is created. Otherwise, a DiskCache instance is used.
|
|
|
|
Args:
|
|
seed (Union[str, int]): Used as a seed or namespace for the cache.
|
|
redis_url (Optional[str]): URL for the Redis server.
|
|
cache_path_root (str): Root path for the disk cache.
|
|
cosmosdb_config (Optional[Dict[str, str]]): Dictionary containing 'connection_string',
|
|
'database_id', and 'container_id' for Cosmos DB cache.
|
|
|
|
Returns:
|
|
An instance of RedisCache, DiskCache, or CosmosDBCache.
|
|
|
|
Examples:
|
|
Creating a Redis cache
|
|
|
|
```python
|
|
redis_cache = cache_factory("myseed", "redis://localhost:6379/0")
|
|
```
|
|
Creating a Disk cache
|
|
|
|
```python
|
|
disk_cache = cache_factory("myseed", None)
|
|
```
|
|
|
|
Creating a Cosmos DB cache:
|
|
```python
|
|
cosmos_cache = cache_factory(
|
|
"myseed",
|
|
cosmosdb_config={
|
|
"connection_string": "your_connection_string",
|
|
"database_id": "your_database_id",
|
|
"container_id": "your_container_id",
|
|
},
|
|
)
|
|
```
|
|
|
|
"""
|
|
if redis_url:
|
|
with optional_import_block() as result:
|
|
from .redis_cache import RedisCache
|
|
|
|
if result.is_successful:
|
|
return RedisCache(seed, redis_url)
|
|
else:
|
|
logging.warning(
|
|
"RedisCache is not available. Checking other cache options. The last fallback is DiskCache."
|
|
)
|
|
|
|
if cosmosdb_config:
|
|
with optional_import_block() as result:
|
|
from .cosmos_db_cache import CosmosDBCache
|
|
|
|
if result.is_successful:
|
|
return CosmosDBCache.create_cache(seed, cosmosdb_config)
|
|
else:
|
|
logging.warning("CosmosDBCache is not available. Fallback to DiskCache.")
|
|
|
|
# Default to DiskCache if neither Redis nor Cosmos DB configurations are provided
|
|
path = os.path.join(cache_path_root, str(seed))
|
|
return DiskCache(os.path.join(".", path))
|