"""Robot adapter registry. Adding a robot (AgiBot X2, another vendor, a different TTS backend) means writing one adapter and adding one line here. Nothing above this layer changes. """ from __future__ import annotations from typing import Callable, Dict from ..config.settings import Settings from .base import RobotAdapter, RobotError def _mock(settings: Settings) -> RobotAdapter: from .mock_robot import MockRobot return MockRobot(settings) def _agibot_a3(settings: Settings) -> RobotAdapter: from .agibot_a3 import AgibotA3 return AgibotA3(settings) _REGISTRY: Dict[str, Callable[[Settings], RobotAdapter]] = { "mock": _mock, "real": _agibot_a3, } def available_modes() -> list: return sorted(_REGISTRY) def create_robot(settings: Settings) -> RobotAdapter: builder = _REGISTRY.get(settings.robot.mode) if builder is None: raise RobotError( "unknown ROBOT_MODE '{0}'".format(settings.robot.mode), user_message="Unknown ROBOT_MODE '{0}'. Valid values: {1}.".format( settings.robot.mode, ", ".join(available_modes()) ), ) return builder(settings)