diff --git a/openbb_sdk/sdk/core/openbb_core/app/command_runner.py b/openbb_sdk/sdk/core/openbb_core/app/command_runner.py index a501eda68b7..fd0209ef0e0 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/command_runner.py +++ b/openbb_sdk/sdk/core/openbb_core/app/command_runner.py @@ -18,6 +18,7 @@ from openbb_core.app.model.command_context import CommandContext from openbb_core.app.model.obbject import OBBject from openbb_core.app.model.system_settings import SystemSettings from openbb_core.app.model.user_settings import UserSettings +from openbb_core.app.provider_interface import get_provider_interface from openbb_core.app.router import CommandMap from openbb_core.app.service.system_service import SystemService from openbb_core.app.service.user_service import UserService @@ -112,17 +113,24 @@ class ParametersBuilder: provider_choices = kwargs.get("provider_choices", None) if provider_choices and isinstance(provider_choices, dict): provider = provider_choices.get("provider", None) - if provider is None and route in command_map.command_coverage: - route_defaults = user_settings.defaults.routes.get(route, None) - random_choice = command_map.command_coverage[route][0] - provider = ( - random_choice - if route_defaults is None - or route_defaults.get("provider", None) is None - else route_defaults.get("provider", random_choice) - ) - kwargs["provider_choices"] = {"provider": provider} - return kwargs + if provider is None: + if route in command_map.command_coverage: + route_defaults = user_settings.defaults.routes.get(route, None) + random_choice = command_map.command_coverage[route][0] + provider = ( + random_choice + if route_defaults is None + or route_defaults.get("provider", None) is None + else route_defaults.get("provider", random_choice) + ) + kwargs["provider_choices"] = {"provider": provider} + else: + available_providers = get_provider_interface().available_providers + kwargs["provider_choices"] = { + "provider": available_providers[0] + if available_providers + else None + } return kwargs @classmethod diff --git a/openbb_sdk/sdk/core/openbb_core/app/model/obbject.py b/openbb_sdk/sdk/core/openbb_core/app/model/obbject.py index 0ba081402f5..feeb7d1a192 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/model/obbject.py +++ b/openbb_sdk/sdk/core/openbb_core/app/model/obbject.py @@ -1,4 +1,4 @@ -from typing import Dict, Generic, List, Optional, TypeVar, Union +from typing import Dict, Generic, List, Literal, Optional, TypeVar, Union import pandas as pd from pydantic import Field @@ -14,7 +14,7 @@ from openbb_core.app.provider_interface import get_provider_interface from openbb_core.app.utils import basemodel_to_df T = TypeVar("T") -PROVIDERS = get_provider_interface().providers_literal +PROVIDERS = Literal[tuple(get_provider_interface().available_providers)] # type: ignore class OBBject(GenericModel, Generic[T], Tagged): diff --git a/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py b/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py index 03ec48e20ef..389f38318d4 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py +++ b/openbb_sdk/sdk/core/openbb_core/app/provider_interface.py @@ -60,8 +60,8 @@ class ProviderInterface: Dictionary of params by model. return_schema : Dict[str, Type[BaseModel]] Dictionary of return data schema by model. - providers_literal : type - Literal of provider names. + providers_literal : List[str] + List of available providers. provider_choices : ProviderChoices Dataclass with literal of provider names. models : List[str] @@ -89,10 +89,8 @@ class ProviderInterface: self._data = self._generate_data_dc(self._map) self._return_schema = self._generate_return_schema(self._data) - self._providers_literal = self._get_provider_literal( - self._registry_map.available_providers - ) - self._provider_choices = self._get_provider_choices(self._providers_literal) + self._available_providers = self._registry_map.available_providers + self._provider_choices = self._get_provider_choices(self._available_providers) @property def map(self) -> MapType: @@ -125,9 +123,9 @@ class ProviderInterface: return self._return_schema @property - def providers_literal(self) -> type: - """Literal of provider names.""" - return self._providers_literal + def available_providers(self) -> List[str]: + """List of available providers.""" + return self._available_providers @property def provider_choices(self) -> type: @@ -455,13 +453,10 @@ class ProviderInterface: return result - def _get_provider_literal(self, available_providers: List[str]) -> type: - return Literal[tuple(available_providers)] # type: ignore - - def _get_provider_choices(self, providers_literal: type) -> type: + def _get_provider_choices(self, available_providers: List[str]) -> type: return make_dataclass( cls_name="ProviderChoices", - fields=[("provider", providers_literal)], + fields=[("provider", Literal[tuple(available_providers)])], # type: ignore bases=(ProviderChoices,), ) diff --git a/openbb_sdk/sdk/core/tests/app/test_provider_interface.py b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py index 56483d23571..dd3a655d0ea 100644 --- a/openbb_sdk/sdk/core/tests/app/test_provider_interface.py +++ b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py @@ -63,12 +63,12 @@ def test_data(provider_interface): assert "StockEOD" in data -def test_providers_literal(provider_interface): +def test_available_providers(provider_interface): """Test providers literal.""" - providers_literal = provider_interface.providers_literal - assert isinstance(type(providers_literal), type) - assert len(providers_literal.__args__) > 0 - assert "openbb" not in providers_literal.__args__ + available_providers = provider_interface.available_providers + assert isinstance(available_providers, list) + assert len(available_providers) > 0 + assert "openbb" not in available_providers def test_provider_choices(provider_interface):