From db68fc1c09c79579fc1ef1efa919562e1acd652b Mon Sep 17 00:00:00 2001 From: chengyongru Date: Thu, 18 Jun 2026 17:44:15 +0800 Subject: [PATCH] Use provider registry in quick start --- nanobot/cli/onboard.py | 27 ++++++++++++++------------- tests/agent/test_onboard_logic.py | 12 ++++++++++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/nanobot/cli/onboard.py b/nanobot/cli/onboard.py index 2a792e75..ad26f6ba 100644 --- a/nanobot/cli/onboard.py +++ b/nanobot/cli/onboard.py @@ -62,17 +62,6 @@ _QUICK_START_TARGETS = { "Discord": "discord", } -_QUICK_START_PROVIDER_CHOICES = { - "OpenRouter": "openrouter", - "Anthropic": "anthropic", - "OpenAI": "openai", - "DeepSeek": "deepseek", - "DashScope": "dashscope", - "Gemini": "gemini", - "Ollama (local)": "ollama", - "Custom OpenAI-compatible": "custom", -} - _QUICK_START_CHANNEL_FIELDS = { "telegram": (("token", "Telegram bot token from BotFather"),), "feishu": ( @@ -1054,6 +1043,17 @@ def _get_provider_names() -> dict[str, str]: return {name: data[0] for name, data in info.items() if name} +def _get_quick_start_provider_choices() -> dict[str, str]: + """Return display-name -> provider key choices for chat-capable providers.""" + from nanobot.providers.registry import PROVIDERS + + return { + spec.display_name or spec.name: spec.name + for spec in PROVIDERS + if not spec.is_oauth and not spec.is_transcription_only + } + + def _configure_provider(config: Config, provider_name: str) -> None: """Configure a single LLM provider.""" provider_config = getattr(config.providers, provider_name, None) @@ -1370,16 +1370,17 @@ def _show_quick_start_progress(active_step: int) -> None: def _configure_quick_start_provider(config: Config) -> bool: """Configure the minimum needed provider + primary model preset.""" _show_quick_start_progress(2) + provider_choices = _get_quick_start_provider_choices() answer = _select_with_back( "Choose your AI provider:", - list(_QUICK_START_PROVIDER_CHOICES), + list(provider_choices), default="OpenRouter", ) if answer is _BACK_PRESSED or answer is None: return False assert isinstance(answer, str) - provider_name = _QUICK_START_PROVIDER_CHOICES[answer] + provider_name = provider_choices[answer] provider_config = getattr(config.providers, provider_name, None) if provider_config is None: console.print(f"[red]Unknown provider: {provider_name}[/red]") diff --git a/tests/agent/test_onboard_logic.py b/tests/agent/test_onboard_logic.py index 9a794852..ef045ef2 100644 --- a/tests/agent/test_onboard_logic.py +++ b/tests/agent/test_onboard_logic.py @@ -417,6 +417,18 @@ class TestProviderChannelInfo: assert isinstance(value, tuple) assert len(value) == 4 # (display_name, needs_api_key, needs_api_base, env_var) + def test_quick_start_provider_choices_cover_chat_registry(self): + from nanobot.cli.onboard import _get_quick_start_provider_choices + + choices = _get_quick_start_provider_choices() + + assert choices["OpenRouter"] == "openrouter" + assert choices["Moonshot"] == "moonshot" + assert choices["NVIDIA NIM"] == "nvidia" + assert "OpenAI Codex" not in choices + assert "Github Copilot" not in choices + assert "AssemblyAI" not in choices + class _SimpleDraftModel(BaseModel): api_key: str = ""