test(integration): per-parameter translation cases for every chat endpoint and provider route

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
mateo 2026-10-31 21:52:13 +00:00
parent 6aa546303e
commit 27c9db8f63
19 changed files with 1014 additions and 0 deletions

View file

@ -0,0 +1,53 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.chat_completions.bases.anthropic import CLAUDE_SONNET_4_6_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="temperature",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
)
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_p",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
)
CLAUDE_SONNET_4_6_STOP_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="stop",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "stop": ["<<HALT>>"]},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("stop_sequences",), ["<<HALT>>"]
),
)
CLAUDE_SONNET_4_6_USER_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="user",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "user": "user-sentinel-01"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("metadata", "user_id"), "user-sentinel-01"
),
)
CASES: Final = (
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE,
CLAUDE_SONNET_4_6_STOP_TEST_CASE,
CLAUDE_SONNET_4_6_USER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_chat_completions_params_anthropic(
case: TranslationTestCase, gateway: Gateway, provider: SharedProvider
) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,93 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.chat_completions.bases.azure import GPT_5_4_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GPT_5_4_TEMPERATURE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="temperature",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
)
GPT_5_4_TOP_P_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="top_p",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
)
GPT_5_4_N_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="n",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "n": 2},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("n",), 2),
)
GPT_5_4_SEED_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="seed",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "seed": 4242},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("seed",), 4242),
)
GPT_5_4_USER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="user",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "user": "user-sentinel-01"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("user",), "user-sentinel-01"),
)
GPT_5_4_SERVICE_TIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="service_tier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("service_tier",), "flex"),
)
GPT_5_4_PROMPT_CACHE_KEY_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="prompt_cache_key",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "prompt_cache_key": "pck-sentinel-01"},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("prompt_cache_key",), "pck-sentinel-01"
),
)
GPT_5_4_SAFETY_IDENTIFIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="safety_identifier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "safety_identifier": "safety-sentinel-01"},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("safety_identifier",), "safety-sentinel-01"
),
)
GPT_5_4_STORE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="store",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "store": False},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("store",), False),
)
GPT_5_4_VERBOSITY_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="verbosity",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "verbosity": "low"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("verbosity",), "low"),
)
CASES: Final = (
GPT_5_4_TEMPERATURE_TEST_CASE,
GPT_5_4_TOP_P_TEST_CASE,
GPT_5_4_N_TEST_CASE,
GPT_5_4_SEED_TEST_CASE,
GPT_5_4_USER_TEST_CASE,
GPT_5_4_SERVICE_TIER_TEST_CASE,
GPT_5_4_PROMPT_CACHE_KEY_TEST_CASE,
GPT_5_4_SAFETY_IDENTIFIER_TEST_CASE,
GPT_5_4_STORE_TEST_CASE,
GPT_5_4_VERBOSITY_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_chat_completions_params_azure(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,57 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.chat_completions.bases.bedrock_converse import CLAUDE_SONNET_4_6_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="temperature",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "temperature"), 0.37
),
)
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_p",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "topP"), 0.83
),
)
CLAUDE_SONNET_4_6_STOP_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="stop",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "stop": ["<<HALT>>"]},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "stopSequences"), ["<<HALT>>"]
),
)
CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="service_tier",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("serviceTier", "type"), "flex"
),
)
CASES: Final = (
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE,
CLAUDE_SONNET_4_6_STOP_TEST_CASE,
CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_chat_completions_params_bedrock_converse(
case: TranslationTestCase, gateway: Gateway, provider: SharedProvider
) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,73 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.chat_completions.bases.gemini import GEMINI_3_5_FLASH_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GEMINI_3_5_FLASH_TEMPERATURE_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="temperature",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "temperature"), 0.37
),
)
GEMINI_3_5_FLASH_TOP_P_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="top_p",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "top_p"), 0.83
),
)
GEMINI_3_5_FLASH_N_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="n",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "n": 2},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "candidate_count"), 2
),
)
GEMINI_3_5_FLASH_STOP_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="stop",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "stop": ["<<HALT>>"]},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "stop_sequences"), ["<<HALT>>"]
),
)
GEMINI_3_5_FLASH_SEED_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="seed",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "seed": 4242},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "seed"), 4242
),
)
GEMINI_3_5_FLASH_SERVICE_TIER_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="service_tier",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("serviceTier",), "flex"
),
)
CASES: Final = (
GEMINI_3_5_FLASH_TEMPERATURE_TEST_CASE,
GEMINI_3_5_FLASH_TOP_P_TEST_CASE,
GEMINI_3_5_FLASH_N_TEST_CASE,
GEMINI_3_5_FLASH_STOP_TEST_CASE,
GEMINI_3_5_FLASH_SEED_TEST_CASE,
GEMINI_3_5_FLASH_SERVICE_TIER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_chat_completions_params_gemini(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,93 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.chat_completions.bases.openai import GPT_5_4_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GPT_5_4_TEMPERATURE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="temperature",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
)
GPT_5_4_TOP_P_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="top_p",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
)
GPT_5_4_N_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="n",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "n": 2},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("n",), 2),
)
GPT_5_4_SEED_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="seed",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "seed": 4242},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("seed",), 4242),
)
GPT_5_4_USER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="user",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "user": "user-sentinel-01"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("user",), "user-sentinel-01"),
)
GPT_5_4_SERVICE_TIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="service_tier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("service_tier",), "flex"),
)
GPT_5_4_PROMPT_CACHE_KEY_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="prompt_cache_key",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "prompt_cache_key": "pck-sentinel-01"},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("prompt_cache_key",), "pck-sentinel-01"
),
)
GPT_5_4_SAFETY_IDENTIFIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="safety_identifier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "safety_identifier": "safety-sentinel-01"},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("safety_identifier",), "safety-sentinel-01"
),
)
GPT_5_4_STORE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="store",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "store": False},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("store",), False),
)
GPT_5_4_VERBOSITY_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="verbosity",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "verbosity": "low"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("verbosity",), "low"),
)
CASES: Final = (
GPT_5_4_TEMPERATURE_TEST_CASE,
GPT_5_4_TOP_P_TEST_CASE,
GPT_5_4_N_TEST_CASE,
GPT_5_4_SEED_TEST_CASE,
GPT_5_4_USER_TEST_CASE,
GPT_5_4_SERVICE_TIER_TEST_CASE,
GPT_5_4_PROMPT_CACHE_KEY_TEST_CASE,
GPT_5_4_SAFETY_IDENTIFIER_TEST_CASE,
GPT_5_4_STORE_TEST_CASE,
GPT_5_4_VERBOSITY_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_chat_completions_params_openai(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,69 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.chat_completions.bases.openai_responses import GPT_5_6_SOL_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GPT_5_6_SOL_USER_TEST_CASE: Final = replace(
GPT_5_6_SOL_TEST_CASE,
scenario="user",
litellm_request={**GPT_5_6_SOL_TEST_CASE.litellm_request, "user": "user-sentinel-01"},
expected_provider_request=with_field(
GPT_5_6_SOL_TEST_CASE.expected_provider_request, ("user",), "user-sentinel-01"
),
)
GPT_5_6_SOL_SERVICE_TIER_TEST_CASE: Final = replace(
GPT_5_6_SOL_TEST_CASE,
scenario="service_tier",
litellm_request={**GPT_5_6_SOL_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(GPT_5_6_SOL_TEST_CASE.expected_provider_request, ("service_tier",), "flex"),
)
GPT_5_6_SOL_PROMPT_CACHE_KEY_TEST_CASE: Final = replace(
GPT_5_6_SOL_TEST_CASE,
scenario="prompt_cache_key",
litellm_request={**GPT_5_6_SOL_TEST_CASE.litellm_request, "prompt_cache_key": "pck-sentinel-01"},
expected_provider_request=with_field(
GPT_5_6_SOL_TEST_CASE.expected_provider_request, ("prompt_cache_key",), "pck-sentinel-01"
),
)
GPT_5_6_SOL_SAFETY_IDENTIFIER_TEST_CASE: Final = replace(
GPT_5_6_SOL_TEST_CASE,
scenario="safety_identifier",
litellm_request={**GPT_5_6_SOL_TEST_CASE.litellm_request, "safety_identifier": "safety-sentinel-01"},
expected_provider_request=with_field(
GPT_5_6_SOL_TEST_CASE.expected_provider_request, ("safety_identifier",), "safety-sentinel-01"
),
)
GPT_5_6_SOL_STORE_TEST_CASE: Final = replace(
GPT_5_6_SOL_TEST_CASE,
scenario="store",
litellm_request={**GPT_5_6_SOL_TEST_CASE.litellm_request, "store": False},
expected_provider_request=with_field(GPT_5_6_SOL_TEST_CASE.expected_provider_request, ("store",), False),
)
GPT_5_6_SOL_VERBOSITY_TEST_CASE: Final = replace(
GPT_5_6_SOL_TEST_CASE,
scenario="verbosity",
litellm_request={**GPT_5_6_SOL_TEST_CASE.litellm_request, "verbosity": "low"},
expected_provider_request=with_field(GPT_5_6_SOL_TEST_CASE.expected_provider_request, ("text", "verbosity"), "low"),
)
CASES: Final = (
GPT_5_6_SOL_USER_TEST_CASE,
GPT_5_6_SOL_SERVICE_TIER_TEST_CASE,
GPT_5_6_SOL_PROMPT_CACHE_KEY_TEST_CASE,
GPT_5_6_SOL_SAFETY_IDENTIFIER_TEST_CASE,
GPT_5_6_SOL_STORE_TEST_CASE,
GPT_5_6_SOL_VERBOSITY_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_chat_completions_params_openai_responses(
case: TranslationTestCase, gateway: Gateway, provider: SharedProvider
) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,85 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.anthropic import CLAUDE_SONNET_4_6_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="temperature",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
)
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_p",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
)
CLAUDE_SONNET_4_6_TOP_K_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_k",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_k": 7},
expected_provider_request=with_field(CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("top_k",), 7),
)
CLAUDE_SONNET_4_6_STOP_SEQUENCES_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="stop_sequences",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "stop_sequences": ["<<HALT>>"]},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("stop_sequences",), ["<<HALT>>"]
),
)
CLAUDE_SONNET_4_6_METADATA_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="metadata",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "metadata": {"user_id": "meta-sentinel-01"}},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("metadata", "user_id"), "meta-sentinel-01"
),
)
CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="service_tier",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "service_tier": "auto"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("service_tier",), "auto"
),
)
CLAUDE_SONNET_4_6_INFERENCE_GEO_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="inference_geo",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "inference_geo": "us"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inference_geo",), "us"
),
)
CLAUDE_SONNET_4_6_CONTAINER_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="container",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "container": "container_sentinel01"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("container",), "container_sentinel01"
),
)
CASES: Final = (
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_K_TEST_CASE,
CLAUDE_SONNET_4_6_STOP_SEQUENCES_TEST_CASE,
CLAUDE_SONNET_4_6_METADATA_TEST_CASE,
CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE,
CLAUDE_SONNET_4_6_INFERENCE_GEO_TEST_CASE,
CLAUDE_SONNET_4_6_CONTAINER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_messages_params_anthropic(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,47 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.azure import GPT_5_4_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GPT_5_4_TEMPERATURE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="temperature",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
)
GPT_5_4_TOP_P_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="top_p",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
)
GPT_5_4_METADATA_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="metadata",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "metadata": {"user_id": "meta-sentinel-01"}},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("user",), "meta-sentinel-01"),
)
GPT_5_4_SERVICE_TIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="service_tier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "service_tier": "auto"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("service_tier",), "auto"),
)
CASES: Final = (
GPT_5_4_TEMPERATURE_TEST_CASE,
GPT_5_4_TOP_P_TEST_CASE,
GPT_5_4_METADATA_TEST_CASE,
GPT_5_4_SERVICE_TIER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_messages_params_azure(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,66 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.bedrock_converse import CLAUDE_SONNET_4_6_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="temperature",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "temperature"), 0.37
),
)
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_p",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "topP"), 0.83
),
)
CLAUDE_SONNET_4_6_TOP_K_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_k",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_k": 7},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("additionalModelRequestFields", "top_k"), 7
),
)
CLAUDE_SONNET_4_6_STOP_SEQUENCES_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="stop_sequences",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "stop_sequences": ["<<HALT>>"]},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "stopSequences"), ["<<HALT>>"]
),
)
CLAUDE_SONNET_4_6_INFERENCE_GEO_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="inference_geo",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "inference_geo": "us"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("additionalModelRequestFields", "inference_geo"), "us"
),
)
CASES: Final = (
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_K_TEST_CASE,
CLAUDE_SONNET_4_6_STOP_SEQUENCES_TEST_CASE,
CLAUDE_SONNET_4_6_INFERENCE_GEO_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_messages_params_bedrock_converse(
case: TranslationTestCase, gateway: Gateway, provider: SharedProvider
) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,55 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.gemini import GEMINI_3_5_FLASH_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GEMINI_3_5_FLASH_TEMPERATURE_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="temperature",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "temperature"), 0.37
),
)
GEMINI_3_5_FLASH_TOP_P_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="top_p",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "top_p"), 0.83
),
)
GEMINI_3_5_FLASH_TOP_K_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="top_k",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "top_k": 7},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "top_k"), 7
),
)
GEMINI_3_5_FLASH_STOP_SEQUENCES_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="stop_sequences",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "stop_sequences": ["<<HALT>>"]},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "stop_sequences"), ["<<HALT>>"]
),
)
CASES: Final = (
GEMINI_3_5_FLASH_TEMPERATURE_TEST_CASE,
GEMINI_3_5_FLASH_TOP_P_TEST_CASE,
GEMINI_3_5_FLASH_TOP_K_TEST_CASE,
GEMINI_3_5_FLASH_STOP_SEQUENCES_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_messages_params_gemini(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,47 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.openai import GPT_5_4_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GPT_5_4_TEMPERATURE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="temperature",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
)
GPT_5_4_TOP_P_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="top_p",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
)
GPT_5_4_METADATA_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="metadata",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "metadata": {"user_id": "meta-sentinel-01"}},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("user",), "meta-sentinel-01"),
)
GPT_5_4_SERVICE_TIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="service_tier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "service_tier": "auto"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("service_tier",), "auto"),
)
CASES: Final = (
GPT_5_4_TEMPERATURE_TEST_CASE,
GPT_5_4_TOP_P_TEST_CASE,
GPT_5_4_METADATA_TEST_CASE,
GPT_5_4_SERVICE_TIER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_messages_params_openai(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,13 @@
from collections.abc import Mapping, Sequence
from typing import Final
from pydantic import JsonValue
def with_field(mapping: Mapping[str, JsonValue], path: Sequence[str], value: JsonValue) -> Mapping[str, JsonValue]:
"""Return a copy of `mapping` with the nested key `path` set to `value`, creating intermediate objects."""
head: Final = path[0]
if len(path) == 1:
return {**mapping, head: value}
inner: Final = mapping.get(head)
return {**mapping, head: with_field(inner if isinstance(inner, dict) else {}, path[1:], value)}

View file

@ -0,0 +1,45 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.responses.bases.anthropic import CLAUDE_SONNET_4_6_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="temperature",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
expected_litellm_response={**CLAUDE_SONNET_4_6_TEST_CASE.expected_litellm_response, "temperature": 0.37},
)
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_p",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
expected_litellm_response={**CLAUDE_SONNET_4_6_TEST_CASE.expected_litellm_response, "top_p": 0.83},
)
CLAUDE_SONNET_4_6_USER_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="user",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "user": "user-sentinel-01"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("metadata", "user_id"), "user-sentinel-01"
),
expected_litellm_response={**CLAUDE_SONNET_4_6_TEST_CASE.expected_litellm_response, "user": "user-sentinel-01"},
)
CASES: Final = (
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE,
CLAUDE_SONNET_4_6_USER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_responses_params_anthropic(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,50 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.responses.bases.bedrock_converse import CLAUDE_SONNET_4_6_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="temperature",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "temperature"), 0.37
),
expected_litellm_response={**CLAUDE_SONNET_4_6_TEST_CASE.expected_litellm_response, "temperature": 0.37},
)
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="top_p",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("inferenceConfig", "topP"), 0.83
),
expected_litellm_response={**CLAUDE_SONNET_4_6_TEST_CASE.expected_litellm_response, "top_p": 0.83},
)
CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="service_tier",
litellm_request={**CLAUDE_SONNET_4_6_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(
CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request, ("serviceTier", "type"), "flex"
),
)
CASES: Final = (
CLAUDE_SONNET_4_6_TEMPERATURE_TEST_CASE,
CLAUDE_SONNET_4_6_TOP_P_TEST_CASE,
CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_responses_params_bedrock_converse(
case: TranslationTestCase, gateway: Gateway, provider: SharedProvider
) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,48 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.responses.bases.gemini import GEMINI_3_5_FLASH_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GEMINI_3_5_FLASH_TEMPERATURE_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="temperature",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "temperature"), 0.37
),
expected_litellm_response={**GEMINI_3_5_FLASH_TEST_CASE.expected_litellm_response, "temperature": 0.37},
)
GEMINI_3_5_FLASH_TOP_P_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="top_p",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("generationConfig", "top_p"), 0.83
),
expected_litellm_response={**GEMINI_3_5_FLASH_TEST_CASE.expected_litellm_response, "top_p": 0.83},
)
GEMINI_3_5_FLASH_SERVICE_TIER_TEST_CASE: Final = replace(
GEMINI_3_5_FLASH_TEST_CASE,
scenario="service_tier",
litellm_request={**GEMINI_3_5_FLASH_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(
GEMINI_3_5_FLASH_TEST_CASE.expected_provider_request, ("serviceTier",), "flex"
),
)
CASES: Final = (
GEMINI_3_5_FLASH_TEMPERATURE_TEST_CASE,
GEMINI_3_5_FLASH_TOP_P_TEST_CASE,
GEMINI_3_5_FLASH_SERVICE_TIER_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_responses_params_gemini(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)

View file

@ -0,0 +1,120 @@
from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import Gateway
from integration._support.provider import SharedProvider
from integration.translation.case import TranslationTestCase
from integration.translation.responses.bases.openai import GPT_5_4_TEST_CASE
from integration.translation.params import with_field
from integration.translation.runner import assert_translation
GPT_5_4_TEMPERATURE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="temperature",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "temperature": 0.37},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("temperature",), 0.37),
)
GPT_5_4_TOP_P_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="top_p",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "top_p": 0.83},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("top_p",), 0.83),
)
GPT_5_4_METADATA_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="metadata",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "metadata": {"trace_id": "meta-sentinel-01"}},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("metadata", "trace_id"), "meta-sentinel-01"
),
)
GPT_5_4_USER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="user",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "user": "user-sentinel-01"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("user",), "user-sentinel-01"),
)
GPT_5_4_SAFETY_IDENTIFIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="safety_identifier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "safety_identifier": "safety-sentinel-01"},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("safety_identifier",), "safety-sentinel-01"
),
)
GPT_5_4_PROMPT_CACHE_KEY_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="prompt_cache_key",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "prompt_cache_key": "pck-sentinel-01"},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("prompt_cache_key",), "pck-sentinel-01"
),
)
GPT_5_4_TEXT_VERBOSITY_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="text_verbosity",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "text": {"verbosity": "low"}},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("text", "verbosity"), "low"),
)
GPT_5_4_STORE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="store",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "store": False},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("store",), False),
)
GPT_5_4_INCLUDE_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="include",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "include": ["reasoning.encrypted_content"]},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("include",), ["reasoning.encrypted_content"]
),
)
GPT_5_4_TRUNCATION_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="truncation",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "truncation": "auto"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("truncation",), "auto"),
)
GPT_5_4_SERVICE_TIER_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="service_tier",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "service_tier": "flex"},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("service_tier",), "flex"),
)
GPT_5_4_TOP_LOGPROBS_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="top_logprobs",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "top_logprobs": 3},
expected_provider_request=with_field(GPT_5_4_TEST_CASE.expected_provider_request, ("top_logprobs",), 3),
)
GPT_5_4_PROMPT_CACHE_RETENTION_TEST_CASE: Final = replace(
GPT_5_4_TEST_CASE,
scenario="prompt_cache_retention",
litellm_request={**GPT_5_4_TEST_CASE.litellm_request, "prompt_cache_retention": "24h"},
expected_provider_request=with_field(
GPT_5_4_TEST_CASE.expected_provider_request, ("prompt_cache_retention",), "24h"
),
)
CASES: Final = (
GPT_5_4_TEMPERATURE_TEST_CASE,
GPT_5_4_TOP_P_TEST_CASE,
GPT_5_4_METADATA_TEST_CASE,
GPT_5_4_USER_TEST_CASE,
GPT_5_4_SAFETY_IDENTIFIER_TEST_CASE,
GPT_5_4_PROMPT_CACHE_KEY_TEST_CASE,
GPT_5_4_TEXT_VERBOSITY_TEST_CASE,
GPT_5_4_STORE_TEST_CASE,
GPT_5_4_INCLUDE_TEST_CASE,
GPT_5_4_TRUNCATION_TEST_CASE,
GPT_5_4_SERVICE_TIER_TEST_CASE,
GPT_5_4_TOP_LOGPROBS_TEST_CASE,
GPT_5_4_PROMPT_CACHE_RETENTION_TEST_CASE,
)
@pytest.mark.parametrize("case", CASES, ids=lambda case: case.id)
def test_responses_params_openai(case: TranslationTestCase, gateway: Gateway, provider: SharedProvider) -> None:
assert_translation(case, gateway, provider)