35 lines
1.1 KiB
Python
35 lines
1.1 KiB
Python
"""Load an :class:`A2AAgent` subclass from a string entrypoint."""
|
|
from __future__ import annotations
|
|
|
|
import importlib
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from ..agent import A2AAgent
|
|
|
|
|
|
def load_agent_class(entrypoint: str, *, project_dir: Path | None = None) -> type[A2AAgent]:
|
|
"""Resolve ``module:ClassName`` to an :class:`A2AAgent` subclass.
|
|
|
|
If ``project_dir`` is given, it is prepended to ``sys.path`` so a local
|
|
``agent.py`` can be imported without packaging.
|
|
"""
|
|
if ":" not in entrypoint:
|
|
raise ValueError(
|
|
f"entrypoint must be 'module:ClassName' (got {entrypoint!r})"
|
|
)
|
|
module_name, class_name = entrypoint.split(":", 1)
|
|
|
|
if project_dir is not None:
|
|
path = str(project_dir.resolve())
|
|
if path not in sys.path:
|
|
sys.path.insert(0, path)
|
|
|
|
module = importlib.import_module(module_name)
|
|
obj = getattr(module, class_name, None)
|
|
if obj is None:
|
|
raise AttributeError(f"{module_name} has no attribute {class_name!r}")
|
|
if not isinstance(obj, type) or not issubclass(obj, A2AAgent):
|
|
raise TypeError(f"{entrypoint} is not an A2AAgent subclass")
|
|
return obj
|