Spaces:
Build error
Build error
| import importlib | |
| from functools import lru_cache | |
| from typing import TypeVar | |
| T = TypeVar('T') | |
| def import_from(qual_name: str): | |
| """Import a value from its fully qualified name. | |
| This function is a utility to dynamically import any Python value (class, function, variable) | |
| from its fully qualified name. For example, 'openhands.server.user_auth.UserAuth' would | |
| import the UserAuth class from the openhands.server.user_auth module. | |
| Args: | |
| qual_name: A fully qualified name in the format 'module.submodule.name' | |
| e.g. 'openhands.server.user_auth.UserAuth' | |
| Returns: | |
| The imported value (class, function, or variable) | |
| Example: | |
| >>> UserAuth = import_from('openhands.server.user_auth.UserAuth') | |
| >>> auth = UserAuth() | |
| """ | |
| parts = qual_name.split('.') | |
| module_name = '.'.join(parts[:-1]) | |
| module = importlib.import_module(module_name) | |
| result = getattr(module, parts[-1]) | |
| return result | |
| def get_impl(cls: type[T], impl_name: str | None) -> type[T]: | |
| """Import and validate a named implementation of a base class. | |
| This function is an extensibility mechanism in OpenHands that allows runtime substitution | |
| of implementations. It enables applications to customize behavior by providing their own | |
| implementations of OpenHands base classes. | |
| The function ensures type safety by validating that the imported class is either the same as | |
| or a subclass of the specified base class. | |
| Args: | |
| cls: The base class that defines the interface | |
| impl_name: Fully qualified name of the implementation class, or None to use the base class | |
| e.g. 'openhands.server.conversation_manager.StandaloneConversationManager' | |
| Returns: | |
| The implementation class, which is guaranteed to be a subclass of cls | |
| Example: | |
| >>> # Get default implementation | |
| >>> ConversationManager = get_impl(ConversationManager, None) | |
| >>> # Get custom implementation | |
| >>> CustomManager = get_impl(ConversationManager, 'myapp.CustomConversationManager') | |
| Common Use Cases: | |
| - Server components (ConversationManager, UserAuth, etc.) | |
| - Storage implementations (ConversationStore, SettingsStore, etc.) | |
| - Service integrations (GitHub, GitLab services) | |
| The implementation is cached to avoid repeated imports of the same class. | |
| """ | |
| if impl_name is None: | |
| return cls | |
| impl_class = import_from(impl_name) | |
| assert cls == impl_class or issubclass(impl_class, cls) | |
| return impl_class | |