diff --git a/EvoScientist/llm/model_config.py b/EvoScientist/llm/model_config.py index 0e066d8..5bea899 100644 --- a/EvoScientist/llm/model_config.py +++ b/EvoScientist/llm/model_config.py @@ -1385,7 +1385,7 @@ def _parse_v3_config( allowed=_REASONING_EFFORTS - {"disabled"}, ) default_reasoning_effort = str( - reasoning_policy.get("default_effort") or "high" + reasoning_policy.get("default_effort") or "medium" ) if default_reasoning_effort not in allowed_reasoning_efforts: raise EvoRuntimeError( diff --git a/EvoScientist/llm/models.py b/EvoScientist/llm/models.py index 84a33b6..520db30 100644 --- a/EvoScientist/llm/models.py +++ b/EvoScientist/llm/models.py @@ -593,7 +593,7 @@ def get_chat_model( # passback (OpenRouter's `/responses` beta is stateless, store=false — # "Item with id 'rs_...' not found"); the patch strips them on passback, # so enabling `summary` is safe. See langchain-ai/langchain#37777. - kwargs.setdefault("reasoning", {"effort": "high", "summary": "auto"}) + kwargs.setdefault("reasoning", {"effort": "medium", "summary": "auto"}) # App attribution (issue #339): identify EvoScientist to OpenRouter so # usage is credited to the project (app rankings, model app tabs, # analytics) rather than langchain-openrouter's LangChain-branded diff --git a/tests/test_llm.py b/tests/test_llm.py index dc604bb..6fd848c 100644 --- a/tests/test_llm.py +++ b/tests/test_llm.py @@ -459,7 +459,7 @@ class TestThirdPartyRouting: call_kwargs = mock_init.call_args[1] assert call_kwargs["model_provider"] == "openrouter" assert call_kwargs["api_key"] == "or-key-456" - assert call_kwargs["reasoning"] == {"effort": "high", "summary": "auto"} + assert call_kwargs["reasoning"] == {"effort": "medium", "summary": "auto"} @patch("EvoScientist.llm.models.init_chat_model") def test_openrouter_reasoning_user_override(self, mock_init, monkeypatch): @@ -488,7 +488,7 @@ class TestThirdPartyRouting: get_chat_model("x-ai/grok-4.3", provider="openrouter") call_kwargs = mock_init.call_args[1] - assert call_kwargs["reasoning"] == {"effort": "high", "summary": "auto"} + assert call_kwargs["reasoning"] == {"effort": "medium", "summary": "auto"} # --- OpenRouter app attribution (issue #339) --- @@ -599,7 +599,7 @@ class TestThirdPartyRouting: call_kwargs = mock_init.call_args[1] # Existing behavior intact. - assert call_kwargs["reasoning"] == {"effort": "high", "summary": "auto"} + assert call_kwargs["reasoning"] == {"effort": "medium", "summary": "auto"} assert call_kwargs["model_kwargs"]["cache_control"] == {"type": "ephemeral"} # Attribution added alongside. assert call_kwargs["app_url"] == "https://github.com/EvoScientist/EvoScientist" diff --git a/tests/test_provider_model_config_v3.py b/tests/test_provider_model_config_v3.py index 0d07d6d..c53a0a0 100644 --- a/tests/test_provider_model_config_v3.py +++ b/tests/test_provider_model_config_v3.py @@ -802,6 +802,20 @@ def test_model_reasoning_policy_can_restrict_efforts_and_enable_max() -> None: assert parsed.reasoning_enabled_params == {"reasoning": "high"} +def test_model_reasoning_policy_defaults_to_medium_without_explicit_effort() -> None: + payload = v3_payload() + provider = next(item for item in payload["providers"] if item["adapter_id"] == "openai") + model = provider["models"][0] + model["capabilities"]["thinking"] = True + # 不设置 reasoning_policy.default_effort → 兜底应为 medium + + config = EvoModelConfig.parse(payload, require_evidence=False) + parsed = config.providers[provider["provider_id"]].models[model["model_key"]] + + assert parsed.supports_reasoning is True + assert parsed.reasoning_enabled_params == {"reasoning": "medium"} + + def test_generic_openai_compatible_adapter_supports_standard_model_discovery() -> None: registration = get_adapter_registry().get( "generic-openai-compatible", "generic-openai-compatible-v1"