test(e2e): bump claude code compat matrix tiers to sonnet-5 and opus-4-8

Anthropic and both Bedrock surfaces move their mid and large tiers from
claude-sonnet-4-6 / claude-opus-4-7 to claude-sonnet-5 / claude-opus-4-8.
The haiku-4-5 small tier is unchanged everywhere.

Vertex AI stays fully on the old tiers and Azure keeps sonnet-4-6 in its
sonnet slot (opus does bump to 4-8): live validation showed both new base
models 429 with 0 TPM quota in the suite's Vertex project/region, and the
Foundry subscription has a hard 0 TPM quota limit for Claude Sonnet 5, so
a sonnet-5 deployment cannot be created yet. test_v0_layout now encodes
the per-provider tier expectations so the pins are enforced and documented.
This commit is contained in:
mateo-berri 2026-07-15 16:47:31 -07:00
parent ff4a40f017
commit 3befa3afc3
69 changed files with 190 additions and 174 deletions

View file

@ -26,7 +26,7 @@
"providers": {
"anthropic": {
"status": "fail",
"error": "[claude-sonnet-4-6] tool call dropped"
"error": "[claude-sonnet-5] tool call dropped"
},
"bedrock_invoke": {
"status": "not_applicable",

View file

@ -10,13 +10,13 @@
{
"feature_id": "basic_messaging_non_streaming",
"provider": "anthropic",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-sonnet-4-6]",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-sonnet-5]",
"result": {"status": "pass"}
},
{
"feature_id": "basic_messaging_non_streaming",
"provider": "anthropic",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-opus-4-7]",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-opus-4-8]",
"result": {"status": "pass"}
},
{
@ -28,8 +28,8 @@
{
"feature_id": "tool_use",
"provider": "anthropic",
"nodeid": "tests/e2e/claude_code/tool_use/test_anthropic.py::test_x[claude-sonnet-4-6]",
"result": {"status": "fail", "error": "[claude-sonnet-4-6] tool call dropped"}
"nodeid": "tests/e2e/claude_code/tool_use/test_anthropic.py::test_x[claude-sonnet-5]",
"result": {"status": "fail", "error": "[claude-sonnet-5] tool call dropped"}
},
{
"feature_id": "tool_use",

View file

@ -74,7 +74,7 @@ def test_build_matrix_any_fail_makes_cell_fail():
{
"feature_id": "f",
"provider": "anthropic",
"result": {"status": "fail", "error": "[claude-opus-4-7] timeout"},
"result": {"status": "fail", "error": "[claude-opus-4-8] timeout"},
},
{"feature_id": "f", "provider": "anthropic", "result": {"status": "pass"}},
]
@ -87,7 +87,7 @@ def test_build_matrix_any_fail_makes_cell_fail():
)
cell = matrix["features"][0]["providers"]["anthropic"]
assert cell["status"] == "fail"
assert cell["error"] == "[claude-opus-4-7] timeout"
assert cell["error"] == "[claude-opus-4-8] timeout"
def test_build_matrix_joins_all_failure_errors_in_one_cell():
@ -110,7 +110,7 @@ def test_build_matrix_joins_all_failure_errors_in_one_cell():
{
"feature_id": "f",
"provider": "anthropic",
"result": {"status": "fail", "error": "[claude-opus-4-7] timeout"},
"result": {"status": "fail", "error": "[claude-opus-4-8] timeout"},
},
]
matrix = build_matrix(
@ -123,7 +123,7 @@ def test_build_matrix_joins_all_failure_errors_in_one_cell():
cell = matrix["features"][0]["providers"]["anthropic"]
assert cell["status"] == "fail"
assert "[claude-haiku-4-5] 429" in cell["error"]
assert "[claude-opus-4-7] timeout" in cell["error"]
assert "[claude-opus-4-8] timeout" in cell["error"]
def test_build_matrix_mixed_pass_and_not_tested_surfaces_pass():
@ -393,7 +393,7 @@ def test_build_matrix_6x5_grid_matches_published_sample():
feature_ids = [feature["id"] for feature in manifest["features"]]
providers = manifest["providers"]
models = ["claude-haiku-4-5", "claude-sonnet-4-6", "claude-opus-4-7"]
models = ["claude-haiku-4-5", "claude-sonnet-5", "claude-opus-4-8"]
results = []
for feature_id in feature_ids:
@ -440,7 +440,7 @@ def test_build_matrix_1x5_grid_one_failing_model_breaks_cell():
"provider": "bedrock_invoke",
"result": {
"status": "fail",
"error": "[claude-opus-4-7-bedrock-invoke] claude CLI exited 1: throttled",
"error": "[claude-opus-4-8-bedrock-invoke] claude CLI exited 1: throttled",
},
},
{
@ -459,7 +459,7 @@ def test_build_matrix_1x5_grid_one_failing_model_breaks_cell():
)
cell = matrix["features"][0]["providers"]["bedrock_invoke"]
assert cell["status"] == "fail"
assert "claude-opus-4-7-bedrock-invoke" in cell["error"]
assert "claude-opus-4-8-bedrock-invoke" in cell["error"]
def test_build_from_paths_writes_output(tmp_path):

View file

@ -141,18 +141,37 @@ def test_every_manifest_feature_has_per_provider_test_file(feature_id, provider)
assert test_file.is_file(), f"missing per-provider test file: {test_file}"
DEFAULT_TIERS = ("haiku-4-5", "sonnet-5", "opus-4-8")
PROVIDER_TIER_OVERRIDES = {
"vertex_ai": ("haiku-4-5", "sonnet-4-6", "opus-4-7"),
"azure": ("haiku-4-5", "sonnet-4-6", "opus-4-8"),
}
@pytest.mark.parametrize("feature_id", EXPECTED_FEATURE_IDS)
@pytest.mark.parametrize("provider", EXPECTED_PROVIDERS)
def test_per_provider_test_file_imports_and_parametrizes_three_models(
feature_id, provider
):
"""Every test file must reference the three Claude tiers required
by the PRD: Haiku 4.5, Sonnet 4.6, Opus 4.7. Implementations may
use plain aliases or per-provider-suffixed aliases (e.g.
`claude-opus-4-7-bedrock-invoke`), so we check for the tier
substrings rather than exact alias names."""
by the PRD: small, mid, and large; Haiku 4.5, Sonnet 5, and Opus
4.8 as of the 2026-07 tier bump. Implementations may use plain
aliases or per-provider-suffixed aliases (e.g.
`claude-opus-4-8-bedrock-invoke`), so we check for the tier
substrings rather than exact alias names.
Two provider columns are pinned to older tiers until quota is
granted: Vertex AI has 0 TPM for the sonnet-5 / opus-4-8 base
models in the suite's project+region (deterministic 429), and
Microsoft Foundry has a hard 0 TPM quota limit for Claude Sonnet 5
in the suite's subscription, so its sonnet slot stays on
sonnet-4-6 while its opus slot runs the deployed opus-4-8. Once
quota requests land, flip the overrides here and the matching
aliases in `test_config.yaml` and the per-provider test files."""
tiers = PROVIDER_TIER_OVERRIDES.get(provider, DEFAULT_TIERS)
text = (REPO_ROOT / feature_id / f"test_{provider}.py").read_text()
for tier in ("haiku-4-5", "sonnet-4-6", "opus-4-7"):
for tier in tiers:
assert (
tier in text
), f"{feature_id}/test_{provider}.py does not reference {tier}"
@ -179,5 +198,5 @@ def test_azure_test_file_drives_the_proxy(feature_id):
)
assert '"status": "not_applicable"' not in text, (
f"{feature_id}/test_azure.py still reports not_applicable; Microsoft Foundry "
"now hosts Claude (Haiku 4.5, Sonnet 4.6, Opus 4.7), so this row must run."
"now hosts Claude (Haiku 4.5, Sonnet 4.6, Opus 4.8), so this row must run."
)

View file

@ -184,8 +184,8 @@ def test_verify_streaming_requires_all_models_to_stream(monkeypatch):
fake_result = _FakeResult()
outcomes = {
"claude-haiku-4-5": DriverResult(text="ok", events=_streamed_events(5)),
"claude-sonnet-4-6": DriverResult(text="ok", events=_buffered_events()),
"claude-opus-4-7": DriverResult(text="ok", events=_streamed_events(5)),
"claude-sonnet-5": DriverResult(text="ok", events=_buffered_events()),
"claude-opus-4-8": DriverResult(text="ok", events=_streamed_events(5)),
}
_install_fake_runner(monkeypatch, outcomes_by_model=outcomes)

View file

@ -97,7 +97,7 @@ def test_run_claude_overlays_proxy_env():
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://proxy.example:4000",
api_key="sk-abc",
runner=runner,
@ -112,7 +112,7 @@ def test_run_claude_extra_env_is_added_to_subprocess_env():
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
extra_env={"MAX_THINKING_TOKENS": "4096"},
@ -146,7 +146,7 @@ def test_run_claude_inherits_only_allowlisted_os_environ(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
@ -178,7 +178,7 @@ def test_run_claude_uses_isolated_per_invocation_home(monkeypatch, tmp_path):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
@ -209,7 +209,7 @@ def test_run_claude_isolated_home_is_distinct_per_invocation(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
@ -219,7 +219,7 @@ def test_run_claude_isolated_home_is_distinct_per_invocation(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
@ -243,7 +243,7 @@ def test_run_claude_isolated_home_cleaned_up_after_run(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
@ -275,7 +275,7 @@ def test_run_claude_isolated_home_cleaned_up_on_subprocess_failure(monkeypatch):
with pytest.raises(ClaudeCLIError):
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
@ -294,7 +294,7 @@ def test_run_claude_extra_env_can_pass_through_otherwise_blocked_var(monkeypatch
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
extra_env={"ANTHROPIC_API_KEY": "from-arg"},

View file

@ -60,11 +60,11 @@ from claude_code.rate_limiter import (
"model, expected",
[
("claude-haiku-4-5", PROVIDER_ANTHROPIC),
("claude-sonnet-4-6", PROVIDER_ANTHROPIC),
("claude-opus-4-7", PROVIDER_ANTHROPIC),
("claude-sonnet-5", PROVIDER_ANTHROPIC),
("claude-opus-4-8", PROVIDER_ANTHROPIC),
("claude-haiku-4-5-azure", PROVIDER_AZURE),
("claude-sonnet-4-6-azure", PROVIDER_AZURE),
("claude-opus-4-7-vertex", PROVIDER_VERTEX_AI),
("claude-sonnet-5-azure", PROVIDER_AZURE),
("claude-opus-4-8-vertex", PROVIDER_VERTEX_AI),
("claude-haiku-4-5-bedrock-converse", PROVIDER_BEDROCK_CONVERSE),
("claude-haiku-4-5-bedrock-invoke", PROVIDER_BEDROCK_INVOKE),
],
@ -87,7 +87,7 @@ def test_infer_provider_rejects_empty_string():
def test_infer_provider_is_case_insensitive():
"""Aliases in the proxy config sometimes drift between cases; we
should still route them to the right column."""
assert infer_provider("CLAUDE-OPUS-4-7-AZURE") == PROVIDER_AZURE
assert infer_provider("CLAUDE-OPUS-4-8-AZURE") == PROVIDER_AZURE
# ---------------------------------------------------------------------------

View file

@ -11,8 +11,8 @@ The (feature, provider) for this cell is inferred from the file path by
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^
feature_id provider
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 5, and Opus
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
@ -27,8 +27,8 @@ from claude_code._basic_messaging import run_basic_messaging_cell
# routing config; the driver only sends the alias.
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]

View file

@ -17,7 +17,7 @@ The (feature, provider) for this cell is inferred from the file path by
feature_id provider
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
@ -34,7 +34,7 @@ from claude_code._basic_messaging import run_basic_messaging_cell
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]

View file

@ -11,8 +11,8 @@ The (feature, provider) for this cell is inferred from the file path by
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
feature_id provider
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 5, and Opus
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
@ -28,8 +28,8 @@ from claude_code._basic_messaging import run_basic_messaging_cell
# strategy.
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]

View file

@ -11,8 +11,8 @@ The (feature, provider) for this cell is inferred from the file path by
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
feature_id provider
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 5, and Opus
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
@ -28,8 +28,8 @@ from claude_code._basic_messaging import run_basic_messaging_cell
# routing strategy.
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]

View file

@ -29,8 +29,8 @@ from claude_code._basic_messaging import run_basic_messaging_cell
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]

View file

@ -24,7 +24,7 @@ from claude_code._basic_messaging import run_basic_messaging_cell
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]

View file

@ -19,8 +19,8 @@ from claude_code._basic_messaging import run_basic_messaging_cell
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]

View file

@ -19,8 +19,8 @@ from claude_code._basic_messaging import run_basic_messaging_cell
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]

View file

@ -51,8 +51,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]

View file

@ -52,7 +52,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]

View file

@ -51,8 +51,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]

View file

@ -51,8 +51,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]

View file

@ -68,12 +68,12 @@ from claude_code.cli_driver import (
PROXY_BASE_URL_ENV = "LITELLM_PROXY_BASE_URL"
PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
# Haiku 4.5 is excluded -- only Sonnet 4.6 and Opus 4.7 support the
# Haiku 4.5 is excluded -- only Sonnet 5 and Opus 4.8 support the
# 1M-context beta. See module docstring for the per-cell-aggregator
# rationale.
ANTHROPIC_MODELS: Sequence[str] = (
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
)
# Beta header that opts an Anthropic-shape model into the 1M context

View file

@ -68,12 +68,12 @@ from claude_code.cli_driver import (
PROXY_BASE_URL_ENV = "LITELLM_PROXY_BASE_URL"
PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
# Haiku 4.5 is excluded -- only Sonnet 4.6 and Opus 4.7 support the
# Haiku 4.5 is excluded -- only Sonnet 4.6 and Opus 4.8 support the
# 1M-context beta. See module docstring for the per-cell-aggregator
# rationale.
AZURE_MODELS: Sequence[str] = (
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
)
# Beta header that opts an Anthropic-shape model into the 1M context

View file

@ -68,12 +68,12 @@ from claude_code.cli_driver import (
PROXY_BASE_URL_ENV = "LITELLM_PROXY_BASE_URL"
PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
# Haiku 4.5 is excluded -- only Sonnet 4.6 and Opus 4.7 support the
# Haiku 4.5 is excluded -- only Sonnet 5 and Opus 4.8 support the
# 1M-context beta. See module docstring for the per-cell-aggregator
# rationale.
BEDROCK_CONVERSE_MODELS: Sequence[str] = (
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
)
# Beta header that opts an Anthropic-shape model into the 1M context

View file

@ -68,12 +68,12 @@ from claude_code.cli_driver import (
PROXY_BASE_URL_ENV = "LITELLM_PROXY_BASE_URL"
PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
# Haiku 4.5 is excluded -- only Sonnet 4.6 and Opus 4.7 support the
# Haiku 4.5 is excluded -- only Sonnet 5 and Opus 4.8 support the
# 1M-context beta. See module docstring for the per-cell-aggregator
# rationale.
BEDROCK_INVOKE_MODELS: Sequence[str] = (
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
)
# Beta header that opts an Anthropic-shape model into the 1M context

View file

@ -36,7 +36,7 @@ features:
name: Thinking
# The single row covers both API shapes Anthropic exposes — manual
# `thinking: {type: "enabled", budget_tokens: N}` (Haiku 4.5) and
# `thinking: {type: "adaptive"}` (Opus 4.7); Sonnet 4.6 supports
# `thinking: {type: "adaptive"}` (Opus 4.8); Sonnet 5 supports
# either and Claude Code picks per model. A break in either
# transformer surfaces as a red cell because all three tiers must
# pass for the cell to go green. The row was named
@ -98,6 +98,6 @@ features:
# 200k context window so the request can only succeed when the
# beta header makes it all the way through the proxy to the
# upstream. Haiku 4.5 is intentionally omitted from this row's
# model list (its window is 200k); Sonnet 4.6 and Opus 4.7 are
# the only tiers exercised. Costs roughly $4/cell/run --
# model list (its window is 200k); the Sonnet and Opus tiers are
# the only ones exercised. Costs roughly $4/cell/run --
# tighten the prompt-token target if pricing changes meaningfully.

View file

@ -37,8 +37,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# Smallest valid PDF that renders a single visible word ("PONG"). Built

View file

@ -31,7 +31,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
PDF_MARKER = "PONG"

View file

@ -36,8 +36,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
PDF_MARKER = "PONG"

View file

@ -35,8 +35,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
PDF_MARKER = "PONG"

View file

@ -40,8 +40,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# Per the changelog (2.1.108): `ENABLE_PROMPT_CACHING_1H` flips Claude

View file

@ -32,7 +32,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
CACHE_1H_ENV = {"ENABLE_PROMPT_CACHING_1H": "1"}

View file

@ -36,8 +36,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
CACHE_1H_ENV = {

View file

@ -38,8 +38,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
# Set both the modern and the deprecated-but-honored Bedrock var so we

View file

@ -38,8 +38,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]

View file

@ -39,7 +39,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]

View file

@ -31,8 +31,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]

View file

@ -31,8 +31,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]

View file

@ -65,8 +65,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# Minimal schema with one required integer field. Kept intentionally

View file

@ -66,7 +66,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
# Minimal schema with one required integer field. Kept intentionally

View file

@ -65,8 +65,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
# Minimal schema with one required integer field. Kept intentionally

View file

@ -65,8 +65,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
# Minimal schema with one required integer field. Kept intentionally

View file

@ -21,13 +21,13 @@ model_list:
litellm_params:
model: anthropic/claude-haiku-4-5
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: claude-sonnet-4-6
- model_name: claude-sonnet-5
litellm_params:
model: anthropic/claude-sonnet-4-6
model: anthropic/claude-sonnet-5
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: claude-opus-4-7
- model_name: claude-opus-4-8
litellm_params:
model: anthropic/claude-opus-4-7
model: anthropic/claude-opus-4-8
api_key: os.environ/ANTHROPIC_API_KEY
# ---- Bedrock (InvokeModel) ----
@ -35,13 +35,13 @@ model_list:
litellm_params:
model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0
aws_region_name: us-east-1
- model_name: claude-sonnet-4-6-bedrock-invoke
- model_name: claude-sonnet-5-bedrock-invoke
litellm_params:
model: bedrock/us.anthropic.claude-sonnet-4-6
model: bedrock/us.anthropic.claude-sonnet-5
aws_region_name: us-east-1
- model_name: claude-opus-4-7-bedrock-invoke
- model_name: claude-opus-4-8-bedrock-invoke
litellm_params:
model: bedrock/us.anthropic.claude-opus-4-7
model: bedrock/us.anthropic.claude-opus-4-8
aws_region_name: us-east-1
# ---- Bedrock (Converse) ----
@ -49,13 +49,13 @@ model_list:
litellm_params:
model: bedrock/converse/us.anthropic.claude-haiku-4-5-20251001-v1:0
aws_region_name: us-east-1
- model_name: claude-sonnet-4-6-bedrock-converse
- model_name: claude-sonnet-5-bedrock-converse
litellm_params:
model: bedrock/converse/us.anthropic.claude-sonnet-4-6
model: bedrock/converse/us.anthropic.claude-sonnet-5
aws_region_name: us-east-1
- model_name: claude-opus-4-7-bedrock-converse
- model_name: claude-opus-4-8-bedrock-converse
litellm_params:
model: bedrock/converse/us.anthropic.claude-opus-4-7
model: bedrock/converse/us.anthropic.claude-opus-4-8
aws_region_name: us-east-1
# ---- Vertex AI ----
@ -86,9 +86,9 @@ model_list:
model: azure_ai/claude-sonnet-4-6
api_base: os.environ/AZURE_FOUNDRY_API_BASE
api_key: os.environ/AZURE_FOUNDRY_API_KEY
- model_name: claude-opus-4-7-azure
- model_name: claude-opus-4-8-azure
litellm_params:
model: azure_ai/claude-opus-4-7
model: azure_ai/claude-opus-4-8
api_base: os.environ/AZURE_FOUNDRY_API_BASE
api_key: os.environ/AZURE_FOUNDRY_API_KEY

View file

@ -36,8 +36,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# --effort max maps to the largest thinking budget on every supported
@ -45,15 +45,15 @@ ANTHROPIC_MODELS = [
# use a CLI flag (rather than the legacy MAX_THINKING_TOKENS env var)
# because Claude Code 2.x reads thinking config from --effort, not from
# the env, and silently no-ops the env var. We use `max` rather than
# `high` because Sonnet 4.6 / Opus 4.7 only emit thinking blocks when
# `high` because Sonnet 5 / Opus 4.8 only emit thinking blocks when
# the budget is generous and the prompt is non-trivial.
THINKING_ARGS = ["--effort", "max"]
# A puzzle non-trivial enough that Sonnet/Opus actually engage thinking
# rather than answer from memory. Trivial arithmetic ("3-2=?") is
# optimized away on the modern tiers and arrives without a thinking
# block, which would make this test silently false-fail under
# `--effort max`. Haiku 4.5 thinks even for trivial prompts; Sonnet 4.6
# and Opus 4.7 only emit thinking when the upstream judges it useful.
# `--effort max`. Haiku 4.5 thinks even for trivial prompts; Sonnet 5
# and Opus 4.8 only emit thinking when the upstream judges it useful.
THINKING_PROMPT = (
"I have a 3-gallon jug and a 5-gallon jug. How can I measure "
"exactly 4 gallons of water? Think through the steps carefully."

View file

@ -8,10 +8,7 @@ that the upstream returned a `thinking` content block.
Foundry's Claude deployments advertise `supports_reasoning: true` in
LiteLLM's pricing metadata; the `thinking={"type": "enabled", ...}`
parameter passes through `azure_ai/claude-*` to Foundry's
`/anthropic/v1/messages` endpoint unchanged. Note that
`claude-opus-4-7-preview` documents thinking as not supported on
Foundry; if that lands, this row may flip to a partial pass and we'll
re-evaluate.
`/anthropic/v1/messages` endpoint unchanged.
The (feature, provider) for this cell is inferred from the file path by
`tests/e2e/claude_code/conftest.py`:
@ -40,7 +37,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
THINKING_ARGS = ["--effort", "max"]

View file

@ -31,8 +31,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
THINKING_ARGS = ["--effort", "max"]

View file

@ -31,8 +31,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
THINKING_ARGS = ["--effort", "max"]

View file

@ -40,8 +40,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# Extended thinking on, with a small budget — enough to surface a

View file

@ -35,7 +35,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
THINKING_ARGS = ["--effort", "max"]

View file

@ -39,8 +39,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
THINKING_ARGS = ["--effort", "max"]

View file

@ -41,8 +41,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
THINKING_ARGS = ["--effort", "max"]

View file

@ -57,8 +57,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]

View file

@ -58,7 +58,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]

View file

@ -57,8 +57,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]

View file

@ -57,8 +57,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]

View file

@ -31,8 +31,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# Built-in tool-use prompt: ask Claude to use the `Bash` tool. The CLI

View file

@ -36,7 +36,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
TOOL_USE_PROMPT = (

View file

@ -31,8 +31,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
TOOL_USE_PROMPT = (

View file

@ -31,8 +31,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
TOOL_USE_PROMPT = (

View file

@ -41,8 +41,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# Same shape as the non-streaming `tool_use` cell: ask Claude to call

View file

@ -34,7 +34,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
TOOL_USE_PROMPT = (

View file

@ -39,8 +39,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
TOOL_USE_PROMPT = (

View file

@ -37,8 +37,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
TOOL_USE_PROMPT = (

View file

@ -40,8 +40,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# Minimal 1x1 red PNG, base64-encoded. We embed it directly as the

View file

@ -41,7 +41,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
# Minimal 1x1 red PNG, base64-encoded. We embed it directly as the

View file

@ -40,8 +40,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
# Minimal 1x1 red PNG, base64-encoded. We embed it directly as the

View file

@ -40,8 +40,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
# Minimal 1x1 red PNG, base64-encoded. We embed it directly as the

View file

@ -43,8 +43,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]
# A prompt the model cannot answer from training data alone — it forces

View file

@ -44,7 +44,7 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]
# A prompt the model cannot answer from training data alone — it forces

View file

@ -43,8 +43,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]
# A prompt the model cannot answer from training data alone — it forces

View file

@ -43,8 +43,8 @@ PROXY_API_KEY_ENV = "LITELLM_PROXY_API_KEY"
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]
# A prompt the model cannot answer from training data alone — it forces