mirror of
https://github.com/NCBM/plyngent.git
synced 2026-11-07 07:17:54 +08:00
101 lines
3.7 KiB
Python
101 lines
3.7 KiB
Python
|
|
"""Tests for thinking-strength resolution across config layers and surfaces."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from plyngent.config.models import (
|
||
|
|
AgentConfig,
|
||
|
|
AnthropicProvider,
|
||
|
|
DeepseekProvider,
|
||
|
|
ModelConfig,
|
||
|
|
OpenAICompatibleProvider,
|
||
|
|
OpenAIProvider,
|
||
|
|
)
|
||
|
|
from plyngent.config.reasoning import resolve_reasoning
|
||
|
|
|
||
|
|
|
||
|
|
def _compat() -> OpenAICompatibleProvider:
|
||
|
|
return OpenAICompatibleProvider(access_key_or_token="sk-test", url="https://example.com/v1")
|
||
|
|
|
||
|
|
|
||
|
|
def test_agent_layer_only() -> None:
|
||
|
|
reasoning = resolve_reasoning(
|
||
|
|
AgentConfig(reasoning_effort="high", thinking_budget_tokens=9000),
|
||
|
|
_compat(),
|
||
|
|
"gpt-4o-mini",
|
||
|
|
)
|
||
|
|
assert reasoning.effort == "high"
|
||
|
|
assert reasoning.thinking_budget_tokens == 9000
|
||
|
|
|
||
|
|
|
||
|
|
def test_provider_overrides_agent_and_model_overrides_provider() -> None:
|
||
|
|
provider = OpenAICompatibleProvider(
|
||
|
|
access_key_or_token="sk-test",
|
||
|
|
url="https://example.com/v1",
|
||
|
|
reasoning_effort="low",
|
||
|
|
models={"gpt-4o-mini": ModelConfig(reasoning_effort="xhigh")},
|
||
|
|
)
|
||
|
|
agent = AgentConfig(reasoning_effort="minimal")
|
||
|
|
assert resolve_reasoning(agent, provider, "gpt-4o-mini").effort == "xhigh"
|
||
|
|
assert resolve_reasoning(agent, provider, "other-model").effort == "low"
|
||
|
|
assert resolve_reasoning(agent, provider, None).effort == "low"
|
||
|
|
|
||
|
|
|
||
|
|
def test_fields_fall_back_independently() -> None:
|
||
|
|
provider = OpenAICompatibleProvider(
|
||
|
|
access_key_or_token="sk-test",
|
||
|
|
url="https://example.com/v1",
|
||
|
|
reasoning_effort="high",
|
||
|
|
thinking_budget_tokens=20000,
|
||
|
|
models={"gpt-4o-mini": ModelConfig(thinking_budget_tokens=4000)},
|
||
|
|
)
|
||
|
|
reasoning = resolve_reasoning(AgentConfig(reasoning_effort="low"), provider, "gpt-4o-mini")
|
||
|
|
# Model sets the budget only → the effort still comes from the provider.
|
||
|
|
assert reasoning.effort == "high"
|
||
|
|
assert reasoning.thinking_budget_tokens == 4000
|
||
|
|
|
||
|
|
|
||
|
|
def test_agent_layer_optional() -> None:
|
||
|
|
provider = OpenAICompatibleProvider(
|
||
|
|
access_key_or_token="sk-test",
|
||
|
|
url="https://example.com/v1",
|
||
|
|
reasoning_effort="medium",
|
||
|
|
)
|
||
|
|
assert resolve_reasoning(None, provider, "gpt-4o-mini").effort == "medium"
|
||
|
|
|
||
|
|
|
||
|
|
def test_unset_layers_stay_unspecified() -> None:
|
||
|
|
reasoning = resolve_reasoning(None, _compat(), "gpt-4o-mini")
|
||
|
|
assert reasoning.effort == ""
|
||
|
|
assert reasoning.thinking_budget_tokens == 0
|
||
|
|
|
||
|
|
|
||
|
|
def test_non_positive_budget_is_ignored() -> None:
|
||
|
|
provider = OpenAICompatibleProvider(
|
||
|
|
access_key_or_token="sk-test",
|
||
|
|
url="https://example.com/v1",
|
||
|
|
thinking_budget_tokens=0,
|
||
|
|
)
|
||
|
|
resolved = resolve_reasoning(AgentConfig(thinking_budget_tokens=-5), provider, "gpt-4o-mini")
|
||
|
|
assert resolved.thinking_budget_tokens == 0
|
||
|
|
|
||
|
|
|
||
|
|
def test_max_survives_only_on_deepseek_chat() -> None:
|
||
|
|
chat = DeepseekProvider(access_key_or_token="sk-test", reasoning_effort="max")
|
||
|
|
assert resolve_reasoning(None, chat, "deepseek-v4-pro").effort == "max"
|
||
|
|
|
||
|
|
responses = DeepseekProvider(access_key_or_token="sk-test", convention="responses", reasoning_effort="max")
|
||
|
|
assert resolve_reasoning(None, responses, "deepseek-v4-pro").effort == "xhigh"
|
||
|
|
|
||
|
|
anthropic = AnthropicProvider(access_key_or_token="sk-test", reasoning_effort="max")
|
||
|
|
assert resolve_reasoning(None, anthropic, "claude-test").effort == "xhigh"
|
||
|
|
|
||
|
|
openai = OpenAIProvider(access_key_or_token="sk-test", reasoning_effort="max")
|
||
|
|
assert resolve_reasoning(None, openai, "gpt-5.4").effort == "xhigh"
|
||
|
|
|
||
|
|
|
||
|
|
def test_effort_levels_pass_through_unchanged() -> None:
|
||
|
|
provider = _compat()
|
||
|
|
for effort in ("none", "minimal", "low", "medium", "high", "xhigh"):
|
||
|
|
resolved = resolve_reasoning(AgentConfig(reasoning_effort=effort), provider, "gpt-4o-mini")
|
||
|
|
assert resolved.effort == effort
|