test(translation): recapture anthropic claude bases after usage speed field (#47116)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
devin-ai-integration[bot] 2026-10-17 09:29:56 -07:00 • committed by GitHub
parent c143954493
commit b578dcf278
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 235 additions and 65 deletions

View file

@ -42,7 +42,7 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-haiku-4-5-20251001",
"id": "msg_011CfgDzBnuPYc7TdysZFRpo",
"id": "msg_011Cg7v1TRmiNAjM2RRxcxF8",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -58,6 +58,7 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "not_available",
"speed": "standard",
},
"diagnostics": None,
},
@ -93,6 +94,7 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "not_available",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -123,7 +125,7 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-sonnet-4-6",
"id": "msg_011CfgDzH3AcaSNXtvurLgAG",
"id": "msg_011Cg7v28wK6VaszM4tL4D6n",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello!"}],
@ -139,6 +141,7 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -174,6 +177,7 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -223,6 +227,7 @@ CLAUDE_FABLE_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -272,6 +277,7 @@ CLAUDE_FABLE_5_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -321,6 +327,7 @@ CLAUDE_OPUS_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -370,6 +377,7 @@ CLAUDE_OPUS_5_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -400,7 +408,7 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-sonnet-5",
"id": "msg_011CfgDzPkj2HxBq8qGJsGSi",
"id": "msg_011Cg7v2SdRUNPAvGScTF7au",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -417,6 +425,7 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -452,6 +461,7 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -482,7 +492,7 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-opus-4-8",
"id": "msg_011CfgDzV9vZCkuQJt15n3Z1",
"id": "msg_011Cg7v1hPQMJ1QhaC8HaSfQ",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -499,6 +509,7 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -534,6 +545,7 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -549,8 +561,16 @@ CLAUDE_SONNET_5_5_TEST_CASE: Final = TranslationTestCase(
"content-type": "application/json",
},
expected_provider_request={**ANTHROPIC_MESSAGES_REQUEST, "model": "claude-sonnet-5-5"},
mock_provider_response={**ANTHROPIC_MESSAGES_RESPONSE, "model": "claude-sonnet-5-5"},
expected_litellm_response={**CHAT_COMPLETIONS_RESPONSE, "model": "anthropic/claude-sonnet-5-5"},
mock_provider_response={
**ANTHROPIC_MESSAGES_RESPONSE,
"model": "claude-sonnet-5-5",
"usage": {**object_value(ANTHROPIC_MESSAGES_RESPONSE["usage"]), "speed": "standard"},
},
expected_litellm_response={
**CHAT_COMPLETIONS_RESPONSE,
"model": "anthropic/claude-sonnet-5-5",
"usage": {**object_value(CHAT_COMPLETIONS_RESPONSE["usage"]), "speed": "standard"},
},
)
@ -618,6 +638,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 149},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
},
expected_litellm_response={
@ -641,7 +662,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
},
"id": "toolu_015ndrvU4VqqoMBzK35jt4TX",
"type": "function",
},
}
],
"reasoning_content": "There's a mention of a chat_completions client I don't actually have access "
"to, so I'll ignore that and stick to my available tools. I'll proceed by "
@ -658,7 +679,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"examine next.\n"
"\n",
"signature": CLAUDE_HAIKU_5_5_THINKING_SIGNATURE_0,
},
}
],
"provider_specific_fields": {
"citations": None,
@ -672,11 +693,11 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"deciding what to examine next.\n"
"\n",
"signature": CLAUDE_HAIKU_5_5_THINKING_SIGNATURE_0,
},
}
],
},
},
},
}
],
"usage": {
"completion_tokens": 288,
@ -694,6 +715,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -757,6 +779,7 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 66},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
},
expected_litellm_response={
@ -780,7 +803,7 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
},
"id": "toolu_01Ew2u9E9j2mkT6RbwSw13uR",
"type": "function",
},
}
],
"reasoning_content": "I'll focus on reading the validation file first, around line 18, since that's "
"what was specifically requested before looking at the tests.\n"
@ -793,7 +816,7 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
"tests.\n"
"\n",
"signature": CLAUDE_OPUS_5_5_THINKING_SIGNATURE_0,
},
}
],
"provider_specific_fields": {
"citations": None,
@ -805,11 +828,11 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
"the tests.\n"
"\n",
"signature": CLAUDE_OPUS_5_5_THINKING_SIGNATURE_0,
},
}
],
},
},
},
}
],
"usage": {
"completion_tokens": 215,
@ -827,6 +850,7 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)
@ -869,6 +893,7 @@ CLAUDE_FABLE_5_1_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
},
expected_litellm_response={
@ -892,11 +917,11 @@ CLAUDE_FABLE_5_1_TEST_CASE: Final = TranslationTestCase(
},
"id": "toolu_01XMSjzRvHCE753Wx4dU2Vxo",
"type": "function",
},
}
],
"provider_specific_fields": {"citations": None, "thinking_blocks": None},
},
},
}
],
"usage": {
"completion_tokens": 143,
@ -914,6 +939,7 @@ CLAUDE_FABLE_5_1_TEST_CASE: Final = TranslationTestCase(
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
"speed": "standard",
},
},
)

View file

@ -2,10 +2,7 @@ from dataclasses import replace
from typing import Final
from integration._support.client import list_value, object_value
from integration.translation.case import (
SSEFrame,
StreamingTranslationTestCase,
)
from integration.translation.case import SSEFrame, StreamingTranslationTestCase
from integration.translation.chat_completions.cross_model.contracts import followup_request
from integration.translation.chat_completions.bases.anthropic import (
CLAUDE_FABLE_5_1_TEST_CASE,
@ -20,9 +17,84 @@ from integration.translation.chat_completions.templates import (
coding_agent_stream_message,
CODING_AGENT_RESPONSE,
)
from integration.translation.templates.anthropic import (
ANTHROPIC_AGENT_REQUEST,
ANTHROPIC_AGENT_RESPONSE,
from integration.translation.templates.anthropic import ANTHROPIC_AGENT_REQUEST, ANTHROPIC_AGENT_RESPONSE
CLAUDE_FABLE_5_AGENT_CROSS_MODEL_PROVIDER_USAGE: Final = {
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation": {"ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0},
"input_tokens": 1184,
"output_tokens": 105,
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
}
CLAUDE_FABLE_5_AGENT_CROSS_MODEL_CLIENT_USAGE: Final = {
"completion_tokens": 105,
"prompt_tokens": 1184,
"total_tokens": 1289,
"completion_tokens_details": {"reasoning_tokens": 0, "text_tokens": 105},
"prompt_tokens_details": {
"cached_tokens": 0,
"text_tokens": 1184,
"cache_write_tokens": 0,
"cache_creation_tokens": 0,
"cache_creation_token_details": {"ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0},
},
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
}
CLAUDE_FABLE_5_AGENT_CROSS_MODEL_TEST_CASE: Final = replace(
CLAUDE_FABLE_5_TEST_CASE,
mock_provider_response={
**CLAUDE_FABLE_5_TEST_CASE.mock_provider_response,
"usage": CLAUDE_FABLE_5_AGENT_CROSS_MODEL_PROVIDER_USAGE,
},
expected_litellm_response={
**CLAUDE_FABLE_5_TEST_CASE.expected_litellm_response,
"usage": CLAUDE_FABLE_5_AGENT_CROSS_MODEL_CLIENT_USAGE,
},
)
CLAUDE_OPUS_5_AGENT_CROSS_MODEL_PROVIDER_USAGE: Final = {
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation": {"ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0},
"input_tokens": 1180,
"output_tokens": 105,
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
}
CLAUDE_OPUS_5_AGENT_CROSS_MODEL_CLIENT_USAGE: Final = {
"completion_tokens": 105,
"prompt_tokens": 1180,
"total_tokens": 1285,
"completion_tokens_details": {"reasoning_tokens": 0, "text_tokens": 105},
"prompt_tokens_details": {
"cached_tokens": 0,
"text_tokens": 1180,
"cache_write_tokens": 0,
"cache_creation_tokens": 0,
"cache_creation_token_details": {"ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0},
},
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"inference_geo": "global",
"service_tier": "standard",
}
CLAUDE_OPUS_5_AGENT_CROSS_MODEL_TEST_CASE: Final = replace(
CLAUDE_OPUS_5_TEST_CASE,
mock_provider_response={
**CLAUDE_OPUS_5_TEST_CASE.mock_provider_response,
"usage": CLAUDE_OPUS_5_AGENT_CROSS_MODEL_PROVIDER_USAGE,
},
expected_litellm_response={
**CLAUDE_OPUS_5_TEST_CASE.expected_litellm_response,
"usage": CLAUDE_OPUS_5_AGENT_CROSS_MODEL_CLIENT_USAGE,
},
)
CLAUDE_FABLE_5_1_AGENT_TEST_CASE: Final = replace(
@ -350,7 +422,7 @@ CLAUDE_FABLE_5_1_AGENT_STREAMING_TEST_CASE: Final = StreamingTranslationTestCase
SSEFrame(data={"type": "message_stop"}, event="message_stop"),
),
expected_litellm_message=coding_agent_stream_message(
("toolu_01324ezmdSmGSpmxGX55GvYF", "toolu_01MxHYehH7UYVY2A8WkRJZPu"),
("toolu_01324ezmdSmGSpmxGX55GvYF", "toolu_01MxHYehH7UYVY2A8WkRJZPu")
),
expected_litellm_usage={
"prompt_tokens": 1184,
@ -596,7 +668,7 @@ CLAUDE_FABLE_5_AGENT_STREAMING_TEST_CASE: Final = StreamingTranslationTestCase(
SSEFrame(data={"type": "message_stop"}, event="message_stop"),
),
expected_litellm_message=coding_agent_stream_message(
("toolu_01UXBJZGdCaY4vxon1j4uapy", "toolu_0124RYbAPnwVoGtdzfPCNPc6"),
("toolu_01UXBJZGdCaY4vxon1j4uapy", "toolu_0124RYbAPnwVoGtdzfPCNPc6")
),
expected_litellm_usage={
"prompt_tokens": 1184,
@ -1494,7 +1566,7 @@ CLAUDE_HAIKU_5_5_AGENT_STREAMING_TEST_CASE: Final = StreamingTranslationTestCase
SSEFrame(data={"type": "message_stop"}, event="message_stop"),
),
expected_litellm_message=coding_agent_stream_message(
("toolu_0177HUb25ArysRAu8eF3u4DJ", "toolu_011gegGWvYoxPwxWY7LSK4Uk"),
("toolu_0177HUb25ArysRAu8eF3u4DJ", "toolu_011gegGWvYoxPwxWY7LSK4Uk")
),
expected_litellm_usage={
"prompt_tokens": 1184,
@ -1837,7 +1909,7 @@ CLAUDE_OPUS_5_5_AGENT_STREAMING_TEST_CASE: Final = StreamingTranslationTestCase(
SSEFrame(data={"type": "message_stop"}, event="message_stop"),
),
expected_litellm_message=coding_agent_stream_message(
("toolu_013mPRCxrKKH6KzYGHKPukwv", "toolu_01FkXiaw4cTiXua3PoMd4wCu"),
("toolu_013mPRCxrKKH6KzYGHKPukwv", "toolu_01FkXiaw4cTiXua3PoMd4wCu")
),
expected_litellm_usage={
"prompt_tokens": 1184,
@ -2088,7 +2160,7 @@ CLAUDE_OPUS_5_AGENT_STREAMING_TEST_CASE: Final = StreamingTranslationTestCase(
SSEFrame(data={"type": "message_stop"}, event="message_stop"),
),
expected_litellm_message=coding_agent_stream_message(
("toolu_017r3PoQsgodP2mgcgDnDLxU", "toolu_01T8ECEb4XwFyozSnCKUiuB2"),
("toolu_017r3PoQsgodP2mgcgDnDLxU", "toolu_01T8ECEb4XwFyozSnCKUiuB2")
),
expected_litellm_usage={
"prompt_tokens": 1180,

View file

@ -1,9 +1,6 @@
from typing import Final
from integration.translation.case import (
StreamingTranslationTestCase,
TranslationTestCase,
)
from integration.translation.case import StreamingTranslationTestCase, TranslationTestCase
from integration.translation.chat_completions.cross_model import (
anthropic,
azure,
@ -105,7 +102,7 @@ MID: Final[tuple[AgentCases, ...]] = (
anthropic.CLAUDE_OPUS_5_5_AGENT_STREAMING_TEST_CASE,
),
(
anthropic.CLAUDE_OPUS_5_TEST_CASE,
anthropic.CLAUDE_OPUS_5_AGENT_CROSS_MODEL_TEST_CASE,
anthropic.CLAUDE_OPUS_5_AGENT_FOLLOWUP_TEST_CASE,
anthropic.CLAUDE_OPUS_5_AGENT_STREAMING_TEST_CASE,
),
@ -189,7 +186,7 @@ HIGH: Final[tuple[AgentCases, ...]] = (
anthropic.CLAUDE_FABLE_5_1_AGENT_STREAMING_TEST_CASE,
),
(
anthropic.CLAUDE_FABLE_5_TEST_CASE,
anthropic.CLAUDE_FABLE_5_AGENT_CROSS_MODEL_TEST_CASE,
anthropic.CLAUDE_FABLE_5_AGENT_FOLLOWUP_TEST_CASE,
anthropic.CLAUDE_FABLE_5_AGENT_STREAMING_TEST_CASE,
),

View file

@ -1,6 +1,7 @@
from collections.abc import Mapping
from typing import Final
from integration._support.client import object_value
from integration.translation.case import TranslationTestCase
from integration.translation.messages.templates import MESSAGES_REQUEST, MESSAGES_RESPONSE
from integration.translation.templates.anthropic import ANTHROPIC_MESSAGES_REQUEST, ANTHROPIC_MESSAGES_RESPONSE
@ -31,7 +32,7 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-sonnet-4-6",
"id": "msg_011CffzUNHaEfzVxCh5hskBG",
"id": "msg_011Cg7v1w1xZexMrWpf5GU75",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello!"}],
@ -47,12 +48,13 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
expected_litellm_response={
"model": "anthropic/claude-sonnet-4-6",
"id": "msg_011CffzUNHaEfzVxCh5hskBG",
"id": "msg_011Cg7v1w1xZexMrWpf5GU75",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello!"}],
@ -68,6 +70,7 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -98,10 +101,10 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-haiku-4-5-20251001",
"id": "msg_011CfgDz9Vj8wXvKzhoM4MQA",
"id": "msg_011Cg7v1Mt9Eid844XTV8AMc",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
"content": [{"type": "text", "text": "Hello!"}],
"container": None,
"stop_reason": "end_turn",
"stop_sequence": None,
@ -114,15 +117,16 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "not_available",
"speed": "standard",
},
"diagnostics": None,
},
expected_litellm_response={
"model": "anthropic/claude-haiku-4-5",
"id": "msg_011CfgDz9Vj8wXvKzhoM4MQA",
"id": "msg_011Cg7v1Mt9Eid844XTV8AMc",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
"content": [{"type": "text", "text": "Hello!"}],
"container": None,
"stop_reason": "end_turn",
"stop_sequence": None,
@ -135,6 +139,7 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "not_available",
"speed": "standard",
},
"diagnostics": None,
},
@ -165,7 +170,7 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-sonnet-5",
"id": "msg_011CfgDzLXmJmnHRTpeBoDmZ",
"id": "msg_011Cg7v2KRMCpM2FsiVygFAS",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -182,12 +187,13 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
expected_litellm_response={
"model": "anthropic/claude-sonnet-5",
"id": "msg_011CfgDzLXmJmnHRTpeBoDmZ",
"id": "msg_011Cg7v2KRMCpM2FsiVygFAS",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -204,6 +210,7 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -234,7 +241,7 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-opus-4-8",
"id": "msg_011CfgDzSFYYPC3aYE9rH98J",
"id": "msg_011Cg7v1ZPwvewtTtXqjdwzZ",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -251,12 +258,13 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
expected_litellm_response={
"model": "anthropic/claude-opus-4-8",
"id": "msg_011CfgDzSFYYPC3aYE9rH98J",
"id": "msg_011Cg7v1ZPwvewtTtXqjdwzZ",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -273,6 +281,7 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -377,11 +386,13 @@ CLAUDE_SONNET_5_5_TEST_CASE: Final = TranslationTestCase(
**ANTHROPIC_MESSAGES_RESPONSE,
**CLAUDE_SONNET_5_5_RESPONSE_FIELDS,
"model": "claude-sonnet-5-5",
"usage": {**object_value(CLAUDE_SONNET_5_5_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
expected_litellm_response={
**MESSAGES_RESPONSE,
**CLAUDE_SONNET_5_5_RESPONSE_FIELDS,
"model": "anthropic/claude-sonnet-5-5",
"usage": {**object_value(CLAUDE_SONNET_5_5_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
)
@ -460,11 +471,13 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
**ANTHROPIC_MESSAGES_RESPONSE,
**CLAUDE_HAIKU_5_5_RESPONSE_FIELDS,
"model": "claude-haiku-5-5",
"usage": {**object_value(CLAUDE_HAIKU_5_5_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
expected_litellm_response={
**MESSAGES_RESPONSE,
**CLAUDE_HAIKU_5_5_RESPONSE_FIELDS,
"model": "anthropic/claude-haiku-5-5",
"usage": {**object_value(CLAUDE_HAIKU_5_5_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
)
@ -555,11 +568,13 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
**ANTHROPIC_MESSAGES_RESPONSE,
**CLAUDE_OPUS_5_5_RESPONSE_FIELDS,
"model": "claude-opus-5-5",
"usage": {**object_value(CLAUDE_OPUS_5_5_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
expected_litellm_response={
**MESSAGES_RESPONSE,
**CLAUDE_OPUS_5_5_RESPONSE_FIELDS,
"model": "anthropic/claude-opus-5-5",
"usage": {**object_value(CLAUDE_OPUS_5_5_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
)
@ -651,10 +666,12 @@ CLAUDE_FABLE_5_1_TEST_CASE: Final = TranslationTestCase(
**ANTHROPIC_MESSAGES_RESPONSE,
**CLAUDE_FABLE_5_1_RESPONSE_FIELDS,
"model": "claude-fable-5-1",
"usage": {**object_value(CLAUDE_FABLE_5_1_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
expected_litellm_response={
**MESSAGES_RESPONSE,
**CLAUDE_FABLE_5_1_RESPONSE_FIELDS,
"model": "anthropic/claude-fable-5-1",
"usage": {**object_value(CLAUDE_FABLE_5_1_RESPONSE_FIELDS["usage"]), "speed": "standard"},
},
)

View file

@ -3,11 +3,14 @@ from dataclasses import replace
from typing import Final
import pytest
from integration._support.client import JSON_OBJECT, Gateway
from integration._support.client import JSON_OBJECT, Gateway, object_value
from integration._support.provider import SharedProvider
from integration._support.wire import Reply
from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.anthropic import CLAUDE_SONNET_5_5_TEST_CASE
from integration.translation.messages.bases.anthropic import (
CLAUDE_SONNET_5_5_RESPONSE_FIELDS,
CLAUDE_SONNET_5_5_TEST_CASE,
)
from integration.translation.messages.bases.azure_ai import (
CLAUDE_SONNET_5_5_TEST_CASE as AZURE_CLAUDE_SONNET_5_5_TEST_CASE,
)
@ -17,6 +20,18 @@ from integration.translation.response_scenarios import text_completion, two_mess
from integration.translation.runner import assert_provider_request, assert_translation
GPT_6_1_SOL_TWO_MESSAGES_BEFORE_TOOLS_TEST_CASE: Final = two_messages_before_tools(GPT_6_1_SOL_TEST_CASE)
CLAUDE_SONNET_5_5_CROSS_MODEL_NATIVE_TEST_CASE: Final = replace(
CLAUDE_SONNET_5_5_TEST_CASE,
scenario="cross_model_rich_request",
mock_provider_response={
**CLAUDE_SONNET_5_5_TEST_CASE.mock_provider_response,
"usage": object_value(CLAUDE_SONNET_5_5_RESPONSE_FIELDS["usage"]),
},
expected_litellm_response={
**CLAUDE_SONNET_5_5_TEST_CASE.expected_litellm_response,
"usage": object_value(CLAUDE_SONNET_5_5_RESPONSE_FIELDS["usage"]),
},
)
AZURE_CLAUDE_SONNET_5_5_CROSS_MODEL_TEST_CASE: Final = replace(
AZURE_CLAUDE_SONNET_5_5_TEST_CASE,
scenario="cross_model_rich_request",
@ -25,10 +40,14 @@ AZURE_CLAUDE_SONNET_5_5_CROSS_MODEL_TEST_CASE: Final = replace(
**CLAUDE_SONNET_5_5_TEST_CASE.expected_provider_request,
"system": [{"type": "text", "text": CLAUDE_SONNET_5_5_TEST_CASE.expected_provider_request["system"]}],
},
mock_provider_response=CLAUDE_SONNET_5_5_TEST_CASE.mock_provider_response,
mock_provider_response={
**CLAUDE_SONNET_5_5_TEST_CASE.mock_provider_response,
"usage": object_value(CLAUDE_SONNET_5_5_RESPONSE_FIELDS["usage"]),
},
expected_litellm_response={
**CLAUDE_SONNET_5_5_TEST_CASE.expected_litellm_response,
"model": "azure_ai/claude-sonnet-5-5",
"usage": object_value(CLAUDE_SONNET_5_5_RESPONSE_FIELDS["usage"]),
},
)
@ -44,7 +63,7 @@ def test_messages_keep_the_same_public_contract_on_native_and_bridged_routes(
assert {key: value for key, value in case.litellm_request.items() if key != "model"} == {
key: value for key, value in CLAUDE_SONNET_5_5_TEST_CASE.litellm_request.items() if key != "model"
}
native: Final = assert_translation(CLAUDE_SONNET_5_5_TEST_CASE, gateway, provider)
native: Final = assert_translation(CLAUDE_SONNET_5_5_CROSS_MODEL_NATIVE_TEST_CASE, gateway, provider)
compared: Final = assert_translation(case, gateway, provider)
assert messages_structure(compared) == messages_structure(native)

View file

@ -8,6 +8,19 @@ from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.anthropic import CLAUDE_SONNET_4_6_TEST_CASE, CLAUDE_SONNET_5_5_TEST_CASE
from integration.translation.runner import assert_translation
CLAUDE_SONNET_4_6_SERVICE_TIER_RESPONSE_FIELDS: Final = {
"content": [{"type": "text", "text": "Hello!"}],
"usage": {
"input_tokens": 18,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation": {"ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0},
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "global",
},
}
CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE: Final = replace(
CLAUDE_SONNET_4_6_TEST_CASE,
scenario="service_tier",
@ -16,9 +29,14 @@ CLAUDE_SONNET_4_6_SERVICE_TIER_TEST_CASE: Final = replace(
**CLAUDE_SONNET_4_6_TEST_CASE.expected_provider_request,
"service_tier": "standard_only",
},
mock_provider_response={**CLAUDE_SONNET_4_6_TEST_CASE.mock_provider_response, "id": "msg_011Cg1RG36pCcTLE26htFFqC"},
mock_provider_response={
**CLAUDE_SONNET_4_6_TEST_CASE.mock_provider_response,
**CLAUDE_SONNET_4_6_SERVICE_TIER_RESPONSE_FIELDS,
"id": "msg_011Cg1RG36pCcTLE26htFFqC",
},
expected_litellm_response={
**CLAUDE_SONNET_4_6_TEST_CASE.expected_litellm_response,
**CLAUDE_SONNET_4_6_SERVICE_TIER_RESPONSE_FIELDS,
"id": "msg_011Cg1RG36pCcTLE26htFFqC",
},
)

View file

@ -35,7 +35,7 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-haiku-4-5-20251001",
"id": "msg_011CfgDzBnuPYc7TdysZFRpo",
"id": "msg_011Cg7v1CTrRytLeZfaZojBR",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -51,6 +51,7 @@ CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens": 5,
"service_tier": "standard",
"inference_geo": "not_available",
"speed": "standard",
},
"diagnostics": None,
},
@ -130,10 +131,10 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-sonnet-4-6",
"id": "msg_011CfgDzH3AcaSNXtvurLgAG",
"id": "msg_011Cg7v1kr1sYXyQA143nsda",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello!"}],
"content": [{"type": "text", "text": "Hello! How can I help you?"}],
"container": None,
"stop_reason": "end_turn",
"stop_sequence": None,
@ -143,9 +144,10 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation": {"ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0},
"output_tokens": 5,
"output_tokens": 11,
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -164,7 +166,7 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
"id": ANY,
"status": "completed",
"role": "assistant",
"content": [{"type": "output_text", "text": "Hello!", "annotations": []}],
"content": [{"type": "output_text", "text": "Hello! How can I help you?", "annotations": []}],
"phase": None,
}
],
@ -190,9 +192,9 @@ CLAUDE_SONNET_4_6_TEST_CASE: Final = TranslationTestCase(
"video_tokens": None,
"cache_write_tokens": 0,
},
"output_tokens": 5,
"output_tokens_details": {"audio_tokens": None, "reasoning_tokens": 0, "text_tokens": 5},
"total_tokens": 23,
"output_tokens": 11,
"output_tokens_details": {"audio_tokens": None, "reasoning_tokens": 0, "text_tokens": 11},
"total_tokens": 29,
"cost": None,
},
"user": None,
@ -225,7 +227,7 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-sonnet-5",
"id": "msg_011CfgDzPkj2HxBq8qGJsGSi",
"id": "msg_011Cg7v215mkRTDBRoPcerLf",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -242,6 +244,7 @@ CLAUDE_SONNET_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -321,7 +324,7 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
},
mock_provider_response={
"model": "claude-opus-4-8",
"id": "msg_011CfgDzV9vZCkuQJt15n3Z1",
"id": "msg_011Cg7v1PgnYbGrw8eGpka6f",
"type": "message",
"role": "assistant",
"content": [{"type": "text", "text": "Hello."}],
@ -338,6 +341,7 @@ CLAUDE_OPUS_4_8_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
"diagnostics": None,
},
@ -462,6 +466,7 @@ CLAUDE_SONNET_5_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 313},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
},
expected_litellm_response={**RESPONSES_RESPONSE, "model": "anthropic/claude-sonnet-5-5"},
@ -534,6 +539,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 67},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
},
expected_litellm_response={
@ -553,7 +559,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"requested.\n"
"\n",
"annotations": [],
},
}
],
"phase": None,
"encrypted_content": json.dumps(
@ -565,7 +571,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"requested.\n"
"\n",
"signature": CLAUDE_HAIKU_5_5_THINKING_SIGNATURE_0,
},
}
],
separators=(",", ":"),
),
@ -605,7 +611,7 @@ CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
"range near the top of the file since no specific lines were requested.\n"
"\n",
"signature": CLAUDE_HAIKU_5_5_THINKING_SIGNATURE_0,
},
}
],
},
},
@ -698,6 +704,7 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 130},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
},
expected_litellm_response={
@ -719,7 +726,7 @@ CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
"zero, negative, and non-integer inputs before moving to the test file.\n"
"\n",
"annotations": [],
},
}
],
"phase": None,
"encrypted_content": json.dumps(
@ -842,6 +849,7 @@ CLAUDE_FABLE_5_1_TEST_CASE: Final = TranslationTestCase(
"output_tokens_details": {"thinking_tokens": 0},
"service_tier": "standard",
"inference_geo": "global",
"speed": "standard",
},
},
expected_litellm_response={
@ -860,7 +868,7 @@ CLAUDE_FABLE_5_1_TEST_CASE: Final = TranslationTestCase(
"rejection, then I'll read the test file in a separate step since there's "
"nothing to derive from it for the read.",
"annotations": [],
},
}
],
"phase": None,
},

View file

@ -22,12 +22,25 @@ from integration.translation.responses.bases.openai_responses import GPT_5_6_SOL
from integration.translation.runner import assert_translation
GPT_6_1_SOL_TWO_MESSAGES_BEFORE_TOOLS_TEST_CASE: Final = two_messages_before_tools(GPT_6_1_SOL_TEST_CASE)
CLAUDE_SONNET_5_5_CROSS_MODEL_PROVIDER_USAGE: Final = {
"input_tokens": 4,
"cache_creation_input_tokens": 873,
"cache_read_input_tokens": 0,
"cache_creation": {"ephemeral_5m_input_tokens": 873, "ephemeral_1h_input_tokens": 0},
"output_tokens": 509,
"output_tokens_details": {"thinking_tokens": 313},
"service_tier": "standard",
"inference_geo": "global",
}
AZURE_CLAUDE_SONNET_5_5_CROSS_MODEL_TEST_CASE: Final = replace(
AZURE_CLAUDE_SONNET_5_5_TEST_CASE,
scenario="cross_model_rich_request",
litellm_request={**CLAUDE_SONNET_5_5_TEST_CASE.litellm_request, "model": "azure_ai/claude-sonnet-5-5"},
expected_provider_request=CLAUDE_SONNET_5_5_TEST_CASE.expected_provider_request,
mock_provider_response=CLAUDE_SONNET_5_5_TEST_CASE.mock_provider_response,
mock_provider_response={
**CLAUDE_SONNET_5_5_TEST_CASE.mock_provider_response,
"usage": CLAUDE_SONNET_5_5_CROSS_MODEL_PROVIDER_USAGE,
},
expected_litellm_response={
**CLAUDE_SONNET_5_5_TEST_CASE.expected_litellm_response,
"model": "azure_ai/claude-sonnet-5-5",