mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-19 00:01:29 +00:00
test: restore synthetic behavior tests dropped as catalog pins
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
parent
eff323682e
commit
bb768573cf
4 changed files with 105 additions and 0 deletions
|
|
@ -859,6 +859,27 @@ def test_router_registration_does_not_shadow_shipped_rules(shipped_cost_map):
|
|||
assert litellm.supports_reasoning(model="claude-opus-9", custom_llm_provider="anthropic") is True
|
||||
|
||||
|
||||
def test_deployment_model_info_beats_the_seeded_rule_defaults(shipped_cost_map):
|
||||
"""Seeding a registration from the rules is a floor, not an override: an explicit
|
||||
model_info on the deployment still wins, so a non-reasoning model can be configured
|
||||
under a reasoning-first namespace."""
|
||||
from litellm import Router
|
||||
|
||||
model = "wandb/some-org/NoThink-1"
|
||||
Router(
|
||||
model_list=[
|
||||
{
|
||||
"model_name": model,
|
||||
"litellm_params": {"model": model, "api_key": "fake"},
|
||||
"model_info": {"supports_reasoning": False},
|
||||
}
|
||||
]
|
||||
)
|
||||
|
||||
assert litellm.model_cost[model]["supports_reasoning"] is False
|
||||
assert litellm.supports_reasoning(model="some-org/NoThink-1", custom_llm_provider="wandb") is False
|
||||
|
||||
|
||||
def test_shipped_rules_flag_unmapped_openai_reasoning_families(shipped_cost_map):
|
||||
for model in (
|
||||
"gpt-5.7-nova",
|
||||
|
|
|
|||
|
|
@ -441,6 +441,34 @@ def test_explicit_invoke_route_does_not_match_async_invoke():
|
|||
)
|
||||
|
||||
|
||||
def test_capability_lookups_fall_back_to_base_model_when_regional_entry_lacks_field(monkeypatch):
|
||||
"""
|
||||
Regression test: a regional model_cost entry without the capability field
|
||||
must not shadow a base entry that has it (`get(model) or get(base)` used to
|
||||
short-circuit on the truthy regional dict and drop the capability).
|
||||
"""
|
||||
import litellm
|
||||
from litellm.llms.bedrock.common_utils import (
|
||||
bedrock_converse_supports_parallel_tool_use_config,
|
||||
is_claude_4_5_on_bedrock,
|
||||
)
|
||||
|
||||
base = "anthropic.claude-fallback-test"
|
||||
regional = f"eu.{base}"
|
||||
monkeypatch.setitem(litellm.model_cost, regional, {"input_cost_per_token": 1e-06})
|
||||
monkeypatch.setitem(
|
||||
litellm.model_cost,
|
||||
base,
|
||||
{
|
||||
"cache_creation_input_token_cost_above_1hr": 1e-05,
|
||||
"supports_parallel_tool_use_config": True,
|
||||
},
|
||||
)
|
||||
|
||||
assert is_claude_4_5_on_bedrock(regional) is True
|
||||
assert bedrock_converse_supports_parallel_tool_use_config(regional) is True
|
||||
|
||||
|
||||
def test_merge_bedrock_aws_request_params_strips_caller_identity_when_deployment_has_static_credentials():
|
||||
from litellm.llms.bedrock.common_utils import merge_bedrock_aws_request_params
|
||||
|
||||
|
|
|
|||
|
|
@ -143,6 +143,24 @@ def test_anyof_with_excessive_nesting():
|
|||
convert_anyof_null_to_nullable(schema)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_supports_system_message():
|
||||
"""Test get_supports_system_message with different models"""
|
||||
from litellm.llms.vertex_ai.common_utils import get_supports_system_message
|
||||
|
||||
# fine-tuned vertex gemini models will specifiy they are in the /gemini spec format
|
||||
result = get_supports_system_message(
|
||||
model="gemini/1234567890", custom_llm_provider="vertex_ai"
|
||||
)
|
||||
assert result == True
|
||||
|
||||
# non-fine-tuned vertex gemini models will not specifiy they are in the /gemini spec format
|
||||
result = get_supports_system_message(
|
||||
model="random-model-name", custom_llm_provider="vertex_ai"
|
||||
)
|
||||
assert result == False
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"model, expected",
|
||||
[
|
||||
|
|
|
|||
|
|
@ -452,6 +452,44 @@ def test_vertex_claude_completion_does_not_mutate_shared_extra_headers():
|
|||
assert shared_extra_headers == {}, "extra_headers must not be mutated by completion()"
|
||||
|
||||
|
||||
def test_messages_thinking_shape_follows_exact_vertex_entry_flag(local_model_cost_map, monkeypatch):
|
||||
"""The Vertex messages config must probe capabilities under ``vertex_ai`` so an
|
||||
operator setting ``supports_adaptive_thinking: false`` on the exact
|
||||
``vertex_ai/claude-opus-4-8`` entry beats the unmodified ``anthropic`` entry.
|
||||
With the inherited ``"anthropic"`` provider default the flip was ignored and
|
||||
the transform kept emitting ``thinking.type='adaptive'``."""
|
||||
import litellm
|
||||
|
||||
config = VertexAIPartnerModelsAnthropicMessagesConfig()
|
||||
|
||||
def transform():
|
||||
return config.transform_anthropic_messages_request(
|
||||
model="claude-opus-4-8",
|
||||
messages=[{"role": "user", "content": "Hello"}],
|
||||
anthropic_messages_optional_request_params={
|
||||
"max_tokens": 4096,
|
||||
"reasoning_effort": "medium",
|
||||
},
|
||||
litellm_params=GenericLiteLLMParams(),
|
||||
headers={},
|
||||
)
|
||||
|
||||
result = transform()
|
||||
assert result.get("thinking") == {"type": "adaptive", "display": "summarized"}
|
||||
assert result.get("output_config") == {"effort": "medium"}
|
||||
|
||||
monkeypatch.setitem(litellm.model_cost["vertex_ai/claude-opus-4-8"], "supports_adaptive_thinking", False)
|
||||
litellm.get_model_info.cache_clear()
|
||||
assert litellm.model_cost["claude-opus-4-8"]["supports_adaptive_thinking"] is True
|
||||
|
||||
flipped = transform()
|
||||
thinking = flipped.get("thinking")
|
||||
assert isinstance(thinking, dict)
|
||||
assert thinking.get("type") == "enabled"
|
||||
assert isinstance(thinking.get("budget_tokens"), int)
|
||||
assert "output_config" not in flipped
|
||||
|
||||
|
||||
def _vertex_transform(model, messages, system=None):
|
||||
config = VertexAIPartnerModelsAnthropicMessagesConfig()
|
||||
params = {"max_tokens": 256}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue