backstory/src/utils/__init__.py

66 lines
2.2 KiB
Python

from __future__ import annotations
import importlib
from pydantic import BaseModel # type: ignore
from . import defines
from . context import Context
from . conversation import Conversation
from . message import Message
from . rag import ChromaDBFileWatcher, start_file_watcher
from . setup_logging import setup_logging
from .agents import class_registry, AnyAgent, Agent, __all__ as agents_all
__all__ = [
'Agent',
'Context',
'Conversation',
'Message',
'ChromaDBFileWatcher',
'start_file_watcher',
'logger',
]
__all__.extend(agents_all) # type: ignore
# Resolve circular dependencies by rebuilding models
# Call model_rebuild() on Agent and Context
Agent.model_rebuild()
Context.model_rebuild()
# Assuming class_registry is available from agents/__init__.py
logger = setup_logging(level=defines.logging_level)
def rebuild_models():
for class_name, (module_name, _) in class_registry.items():
try:
module = importlib.import_module(module_name)
cls = getattr(module, class_name, None)
logger.debug(f"Checking: {class_name} in module {module_name}")
logger.debug(f" cls: {True if cls else False}")
logger.debug(f" isinstance(cls, type): {isinstance(cls, type)}")
logger.debug(f" issubclass(cls, BaseModel): {issubclass(cls, BaseModel) if cls else False}")
logger.debug(f" issubclass(cls, AnyAgent): {issubclass(cls, AnyAgent) if cls else False}")
logger.debug(f" cls is not AnyAgent: {cls is not AnyAgent if cls else True}")
if (
cls
and isinstance(cls, type)
and issubclass(cls, BaseModel)
and issubclass(cls, AnyAgent)
and cls is not AnyAgent
):
logger.debug(f"Rebuilding {class_name} from {module_name}")
from . agents import Agent
from . context import Context
cls.model_rebuild()
except ImportError as e:
logger.error(f"Failed to import module {module_name}: {e}")
except Exception as e:
logger.error(f"Error processing {class_name} in {module_name}: {e}")
# Call this after all modules are imported
rebuild_models()