fix(setup): refresh LLM provider wizard defaults (#3421)

This commit is contained in:
Nan Gao
2026-06-08 02:33:24 +02:00
committed by GitHub
parent 10c1d9f417
commit 3b4c9ff733
3 changed files with 426 additions and 21 deletions
+125 -1
View File
@@ -7,7 +7,8 @@ Run from repo root:
from __future__ import annotations
import yaml
from wizard.providers import LLM_PROVIDERS, SEARCH_PROVIDERS, WEB_FETCH_PROVIDERS
from wizard.providers import LLM_PROVIDERS, SEARCH_PROVIDERS, WEB_FETCH_PROVIDERS, LLMProvider
from wizard.steps import llm as llm_step
from wizard.steps import search as search_step
from wizard.writer import (
build_minimal_config,
@@ -21,6 +22,38 @@ class TestProviders:
def test_llm_providers_not_empty(self):
assert len(LLM_PROVIDERS) >= 8
def test_llm_providers_cover_config_example_families(self):
providers = {provider.name: provider for provider in LLM_PROVIDERS}
expected = {
"volcengine",
"openai",
"openai_responses",
"ollama_qwen",
"ollama_gemma",
"anthropic",
"google",
"gemini_openai_gateway",
"mimo",
"deepseek",
"kimi",
"novita",
"minimax",
"minimax_cn",
"openrouter",
"vllm",
"mindie",
"codex",
"claude_code",
}
assert expected.issubset(providers)
assert providers["openai_responses"].extra_config["use_responses_api"] is True
assert providers["gemini_openai_gateway"].use == "deerflow.models.patched_openai:PatchedChatOpenAI"
assert providers["mimo"].use == "deerflow.models.patched_mimo:PatchedChatMiMo"
assert providers["deepseek"].use == "deerflow.models.patched_deepseek:PatchedChatDeepSeek"
assert providers["volcengine"].extra_config["api_base"] == "https://ark.cn-beijing.volces.com/api/v3"
def test_llm_providers_have_required_fields(self):
for p in LLM_PROVIDERS:
assert p.name
@@ -236,6 +269,97 @@ class TestBuildMinimalConfig:
model = data["models"][0]
assert "api_key" not in model
def test_responses_api_provider_defaults_are_preserved(self):
provider = next(p for p in LLM_PROVIDERS if p.name == "openai_responses")
content = build_minimal_config(
provider_use=provider.use,
model_name=provider.default_model,
display_name=provider.display_name,
api_key_field=provider.api_key_field,
env_var=provider.env_var,
extra_model_config=provider.extra_config,
)
data = yaml.safe_load(content)
model = data["models"][0]
assert model["use_responses_api"] is True
assert model["output_version"] == "responses/v1"
assert model["supports_vision"] is True
def test_patched_thinking_provider_defaults_are_preserved(self):
provider = next(p for p in LLM_PROVIDERS if p.name == "mimo")
content = build_minimal_config(
provider_use=provider.use,
model_name=provider.default_model,
display_name=provider.display_name,
api_key_field=provider.api_key_field,
env_var=provider.env_var,
extra_model_config=provider.extra_config,
)
data = yaml.safe_load(content)
model = data["models"][0]
assert model["use"] == "deerflow.models.patched_mimo:PatchedChatMiMo"
assert model["base_url"] == "https://api.xiaomimimo.com/v1"
assert model["api_key"] == "$MIMO_API_KEY"
assert model["supports_thinking"] is True
assert model["when_thinking_enabled"]["extra_body"]["thinking"]["type"] == "enabled"
assert model["when_thinking_disabled"]["extra_body"]["thinking"]["type"] == "disabled"
class TestLLMStep:
def test_model_selection_defaults_to_provider_default_model(self, monkeypatch):
provider = LLMProvider(
name="test",
display_name="Test",
description="provider",
use="langchain_openai:ChatOpenAI",
models=["first-model", "default-model"],
default_model="default-model",
env_var="TEST_API_KEY",
package="langchain-openai",
)
prompts: list[tuple[str, int | None]] = []
def fake_choice(prompt, options, default=None):
prompts.append((prompt, default))
return default if default is not None else 0
monkeypatch.setattr(llm_step, "LLM_PROVIDERS", [provider])
monkeypatch.setattr(llm_step, "ask_choice", fake_choice)
monkeypatch.setattr(llm_step, "ask_secret", lambda _prompt: "key")
monkeypatch.setattr(llm_step, "print_header", lambda *_args, **_kwargs: None)
monkeypatch.setattr(llm_step, "print_info", lambda *_args, **_kwargs: None)
monkeypatch.setattr(llm_step, "print_success", lambda *_args, **_kwargs: None)
result = llm_step.run_llm_step()
assert result.model_name == "default-model"
assert prompts == [("Enter choice", None), ("Select model", 1)]
def test_base_url_prompt_is_used_for_custom_gateway(self, monkeypatch):
provider = LLMProvider(
name="gateway",
display_name="Gateway",
description="provider",
use="langchain_openai:ChatOpenAI",
models=["gateway/model"],
default_model="gateway/model",
env_var="GATEWAY_API_KEY",
package="langchain-openai",
base_url_prompt="Gateway URL",
)
monkeypatch.setattr(llm_step, "LLM_PROVIDERS", [provider])
monkeypatch.setattr(llm_step, "ask_choice", lambda *_args, **_kwargs: 0)
monkeypatch.setattr(llm_step, "ask_text", lambda *_args, **_kwargs: "https://gateway.example/v1")
monkeypatch.setattr(llm_step, "ask_secret", lambda _prompt: "key")
monkeypatch.setattr(llm_step, "print_header", lambda *_args, **_kwargs: None)
monkeypatch.setattr(llm_step, "print_info", lambda *_args, **_kwargs: None)
monkeypatch.setattr(llm_step, "print_success", lambda *_args, **_kwargs: None)
result = llm_step.run_llm_step()
assert result.base_url == "https://gateway.example/v1"
# ---------------------------------------------------------------------------
# writer.py — env file helpers