mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-06-10 17:35:57 +00:00
fix(setup): refresh LLM provider wizard defaults (#3421)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user