diff --git a/scripts/release.py b/scripts/release.py index 31f7d62563..77cb18baa6 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -102,6 +102,7 @@ AUTHOR_MAP = { "50561768+zhanggttry@users.noreply.github.com": "zhanggttry", "formulahendry@gmail.com": "formulahendry", "93757150+bogerman1@users.noreply.github.com": "bogerman1", + "132852777+rob-maron@users.noreply.github.com": "rob-maron", # Matrix parity salvage batch (April 2026) "sr@samirusani": "samrusani", "angelclaw@AngelMacBook.local": "angel12", diff --git a/tests/agent/test_arcee_trinity_overrides.py b/tests/agent/test_arcee_trinity_overrides.py new file mode 100644 index 0000000000..f5b7c84870 --- /dev/null +++ b/tests/agent/test_arcee_trinity_overrides.py @@ -0,0 +1,76 @@ +"""Tests for Arcee Trinity Large Thinking per-model overrides. + +Arcee Trinity Large Thinking is a reasoning model that wants: +- Fixed temperature=0.5 (vs the global default) +- Compression threshold=0.75 (delay compression to preserve reasoning context) + +The helpers must match the bare model name, including when it arrives via +OpenRouter as ``arcee-ai/trinity-large-thinking``, but must NOT hit sibling +Arcee models like trinity-large-preview or trinity-mini. +""" + +from __future__ import annotations + +import pytest + +from agent.auxiliary_client import ( + _compression_threshold_for_model, + _fixed_temperature_for_model, + _is_arcee_trinity_thinking, +) + + +@pytest.mark.parametrize( + "model", + [ + "trinity-large-thinking", + "arcee-ai/trinity-large-thinking", + "Arcee-AI/Trinity-Large-Thinking", # case-insensitive + " trinity-large-thinking ", # whitespace tolerant + ], +) +def test_is_arcee_trinity_thinking_matches(model: str) -> None: + assert _is_arcee_trinity_thinking(model) is True + + +@pytest.mark.parametrize( + "model", + [ + None, + "", + "trinity-large-preview", + "arcee-ai/trinity-large-preview:free", + "trinity-mini", + "arcee-ai/trinity-mini", + "trinity-large", # prefix-only must not match + "claude-sonnet-4.6", + "gpt-5.4", + ], +) +def test_is_arcee_trinity_thinking_rejects_non_matches(model) -> None: + assert _is_arcee_trinity_thinking(model) is False + + +def test_fixed_temperature_for_trinity_thinking() -> None: + assert _fixed_temperature_for_model("trinity-large-thinking") == 0.5 + assert _fixed_temperature_for_model("arcee-ai/trinity-large-thinking") == 0.5 + + +def test_fixed_temperature_sibling_arcee_models_unaffected() -> None: + # Preview and mini do not pin temperature — caller chooses its default. + assert _fixed_temperature_for_model("trinity-large-preview") is None + assert _fixed_temperature_for_model("trinity-mini") is None + + +def test_compression_threshold_for_trinity_thinking() -> None: + assert _compression_threshold_for_model("trinity-large-thinking") == 0.75 + assert _compression_threshold_for_model("arcee-ai/trinity-large-thinking") == 0.75 + + +def test_compression_threshold_default_none_for_other_models() -> None: + # None means "leave the user's config value unchanged". + assert _compression_threshold_for_model(None) is None + assert _compression_threshold_for_model("") is None + assert _compression_threshold_for_model("trinity-large-preview") is None + assert _compression_threshold_for_model("claude-sonnet-4.6") is None + assert _compression_threshold_for_model("kimi-k2") is None