evofabric.core.factory._function 源代码

# -*- coding: utf-8 -*-
# Copyright (c) 2025 Huawei Technologies Co., Ltd. All Rights Reserved.
import base64
import importlib
import threading
from typing import Any, Callable, List, Optional, Protocol
from ...logger import get_logger


logger = get_logger()


DESERIALIZER_MODULES = [
    "evofabric.logger",
    "evofabric.core.agent",
    "evofabric.core.clients",
    "evofabric.core.factory",
    "evofabric.core.graph",
    "evofabric.core.mem",
    "evofabric.core.multi_agent",
    "evofabric.core.tool",
    "evofabric.core.trace",
    "evofabric.core.typing",
    "evofabric.core.vectorstore"
]


[文档] def register_deserialize_modules(modules: List[str]) -> None: """Register some modules that deserialization may need""" global DESERIALIZER_MODULES for module in modules: DESERIALIZER_MODULES.append(module)
[文档] class FunctionSerializerProto(Protocol): """Defines serialization and deserialization methods for Python function handles in the module, used for storing and reloading DSL files. """
[文档] def serialize(self, obj: Any) -> str: ...
[文档] def deserialize(self, s: str) -> Any: ...
class _FunctionSerializerProxy: __slots__ = ("_impl", "_lock") def __init__(self, impl: FunctionSerializerProto): self._impl = impl self._lock = threading.RLock() def serialize(self, obj: Any) -> str: with self._lock: return self._impl.serialize(obj) def deserialize(self, s: str) -> Any: with self._lock: return self._impl.deserialize(s) def _swap(self, new_impl: FunctionSerializerProto) -> None: with self._lock: self._impl = new_impl
[文档] class FunctionSerializerCloudPickle(FunctionSerializerProto): def __init__(self): try: from cloudpickle import dumps, loads except ImportError as e: raise ImportError( "Cannot find package named cloudpickle, " "use `pip install cloudpickle` to install it.") from e self.dumps = dumps self.loads = loads
[文档] def serialize(self, function: Callable) -> str: pickled_bytes = self.dumps(function) base64_bytes = base64.b64encode(pickled_bytes) base64_string = base64_bytes.decode('ascii') return base64_string
[文档] def deserialize(self, string: str, required_modules: Optional[List[str]] = None) -> Callable: """ Deserializes a string into a function. Args: string: The serialized function string. required_modules: A list of module names to import before deserialization. e.g., ['my_project.my_classes', 'another.module'] """ required_modules = required_modules or DESERIALIZER_MODULES if required_modules: for module_name in required_modules: try: importlib.import_module(module_name) except ImportError as e: logger.warning(f"Warning: Could not import required module '{module_name}'. {e}") restored_base64_bytes = string.encode('utf-8') restored_string = base64.b64decode(restored_base64_bytes) return self.loads(restored_string)
FUNC_SERIALIZER: _FunctionSerializerProxy = _FunctionSerializerProxy(FunctionSerializerCloudPickle())
[文档] def set_func_serializer(impl: Optional[FunctionSerializerProto]) -> None: if impl is None: impl = FunctionSerializerCloudPickle() FUNC_SERIALIZER._swap(impl)
[文档] def get_func_serializer() -> FunctionSerializerProto: return FUNC_SERIALIZER