mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-13 03:59:12 +00:00
* refactor(rust_bridge): group the Python modules Rust imports by name under rust_bridge/host Rust reads Python-owned state (legacy callback registries, model capabilities) through modules it imports by path. Put them in one folder with an AGENTS.md that states the contract, and update the module path constants on the Rust side. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * refactor(rust_bridge): route Python state reads through host accessors * docs(rust_bridge): point test_support at the moved host contract test Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(rust_bridge): move secret manager, transport and timeout accessors under host Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * chore(greptile): register rust_bridge/host AGENTS.md in files.json Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
from typing import Final
|
|
|
|
import pytest
|
|
|
|
import litellm
|
|
from litellm.rust_bridge.host.model_capabilities import anthropic_model_capabilities
|
|
|
|
pytestmark = pytest.mark.usefixtures("local_model_cost_map")
|
|
|
|
|
|
def _flag_model(monkeypatch: pytest.MonkeyPatch, name: str, **flags: bool) -> None:
|
|
monkeypatch.setitem(
|
|
litellm.model_cost,
|
|
name,
|
|
{
|
|
"litellm_provider": "anthropic",
|
|
"mode": "chat",
|
|
"input_cost_per_token": 0,
|
|
"output_cost_per_token": 0,
|
|
**flags,
|
|
},
|
|
)
|
|
|
|
|
|
def test_capabilities_come_from_the_model_map_under_the_callers_provider(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
_flag_model(
|
|
monkeypatch,
|
|
"claude-test-adaptive",
|
|
supports_reasoning=True,
|
|
supports_adaptive_thinking=True,
|
|
supports_output_config=True,
|
|
supports_xhigh_reasoning_effort=True,
|
|
supports_sampling_params=False,
|
|
supports_mid_conversation_system=True,
|
|
)
|
|
|
|
capabilities: Final = anthropic_model_capabilities("anthropic/claude-test-adaptive", None)
|
|
|
|
assert capabilities["supports_adaptive_thinking"]
|
|
assert capabilities["supports_output_config"]
|
|
assert capabilities["supports_mid_conversation_system"]
|
|
assert not capabilities["supports_legacy_thinking"]
|
|
assert not capabilities["supports_sampling_params"]
|
|
assert capabilities["effort_tiers"] == {
|
|
"minimal": False,
|
|
"low": False,
|
|
"medium": False,
|
|
"high": False,
|
|
"xhigh": True,
|
|
"max": False,
|
|
}
|
|
|
|
|
|
def test_unmapped_model_keeps_sampling_params_and_no_reasoning_features() -> None:
|
|
capabilities: Final = anthropic_model_capabilities("anthropic/not-a-real-model", None)
|
|
|
|
assert capabilities["supports_sampling_params"]
|
|
assert not capabilities["supports_reasoning"]
|
|
assert not capabilities["supports_adaptive_thinking"]
|
|
assert not capabilities["supports_mid_conversation_system"]
|
|
assert capabilities["effort_tiers"] == dict.fromkeys(("minimal", "low", "medium", "high", "xhigh", "max"), False)
|
|
|
|
|
|
def test_capability_source_observes_runtime_registration_changes(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
model: Final = "claude-test-runtime-registration"
|
|
_flag_model(monkeypatch, model, supports_reasoning=True, supports_output_config=True)
|
|
before: Final = anthropic_model_capabilities(model, "anthropic")
|
|
|
|
_flag_model(monkeypatch, model, supports_reasoning=False, supports_output_config=False)
|
|
after: Final = anthropic_model_capabilities(model, "anthropic")
|
|
|
|
assert before["supports_reasoning"] is True
|
|
assert before["supports_output_config"] is True
|
|
assert after["supports_reasoning"] is False
|
|
assert after["supports_output_config"] is False
|