test(translation): add claude-haiku-5-5 vertex ai cases (#47136)

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 17:53:59 +00:00 • committed by GitHub
parent 3c19b4149b
commit 656c63c0b4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 417 additions and 0 deletions

View file

@ -473,6 +473,13 @@ model_list:
vertex_project: synthetic-vertex-project
vertex_location: global
vertex_credentials: '{"type": "external_account", "audience": "synthetic-vertex-audience", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "http://127.0.0.1:8190/_oauth/token", "credential_source": {"url": "http://127.0.0.1:8190/health"}}'
- model_name: vertex_ai/claude-haiku-5-5@default
litellm_params:
model: vertex_ai/claude-haiku-5-5@default
api_base: http://127.0.0.1:8191
vertex_project: synthetic-vertex-project
vertex_location: global
vertex_credentials: '{"type": "external_account", "audience": "synthetic-vertex-audience", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "http://127.0.0.1:8190/_oauth/token", "credential_source": {"url": "http://127.0.0.1:8190/health"}}'
- model_name: vertex_ai/claude-opus-5-5@default
litellm_params:
model: vertex_ai/claude-opus-5-5@default

View file

@ -577,6 +577,154 @@ CLAUDE_SONNET_5_5_TEST_CASE: Final = TranslationTestCase(
)
CLAUDE_HAIKU_5_5_THINKING_SIGNATURE: Final = (
"CAQS8gcKEggSEAIYAjgBQgh0aGlua2luZxIMKxM+8GdyGfxkJrU6Ggw3AMSc5G/SaulUVJkiMJgPNRytmwmfF4bj7WugkKlRxBr+SRwcL9iQ"
"+S5uvmIi/D8thAXX+oVg67diUo3rxiqNB0KrfSB/DXD50OomDcy90ai3a+RMcwIy9wEMzOdOIFqQ24tUMm1YorcQLQpresEnXA9ItiMAzP+P"
"8NMJ1br7O3JHYLIi/12UzVr36AKPrMJQk86VBn5fVxo0xcphyl071Y30m3wO0INGtU+d37IXSrYCJzQdnUSKxekBK28fxsA4tmxx1BE/1Hfl"
"UTsq36+CE2MatE0ymL2pQA+povoJ1iVlB/PBZvkOvpRcQubSwm8RqJrBfmse8baU2UJot0VNNC7OprQ3wYx1j3BGmXOQCGkvCn6jd2lPLjLS"
"F1CjbWQs7X18gB69y2sUosm3aI+MnQNHkUqe8JtIaii42uu3Xe/JheeRTRrcsuAdMZJ76ID9wRZnf3/QCHaMyrYwHXf5SsoUjX3Ofs5MuQT0"
"ISf4T7q+QGf51Bxb4jdfF879h061ZSejzknCHI3fV3SwuldjIIV+FD50d63iLqM/D8GOjaGfDrYugkkdBjCNEQkTpn9NQmqalsrJWOdQQrhc"
"L8TDZG4HBasd/kGr7EnlEbLKrGaWbAWYo4vssoUE7Q57wPumuMrYh4OKInksQTnB0OV9OIZEiTgb9fyaxJBCUiypuQDGMlAP8nb0TQF1vxjR"
"vsXV/qnN0ovR6/7raePN4NM4nMEXESRQyC22Ml88z+WZhe2VG5CLH8tFNapisH+msyqtGyDa+SEie/e6xcDfI1fLAZwEHM34/YjW+C1E1PPd"
"RsGBE9Ms6JUaPrcITwImVKMLGH1pj+TsS+qK7JTGjH8FKwR1Eds/dJTFDEQaAYcmjXWxDR5HBknx7xv90K2uoKt4KmAgulWCQv/LaEAt27lm"
"aGP+4PQ9tpb/Otsub8spmcXKfNqdjWTDH3aEF5MsJ5eSddn92pFV9JAo4oFcj1fUTujfwumGCYDADjLBmyvQao9S42zpO5idmYrHWHt7h7m6"
"BoU5b4uKVS4w4ELEl8y+Oq1uiQLSB8e0cxLarWfCiiTL6v6aJUDEvUTQU+O3XiOxNMCkc00J7e1TnNnnoFqs0sqhV0mMT346vLHocBMVn2iE"
"ZSwFb9OWlHO1e9Y7ccd8XL7KjXtoZeuBTrdYlxrf3g6QHVZg3OOM3OVSOWawFU0tBZUUgH6rYH4oHh8JqwGmbTI1mtAtUX89KrHzGWgUs619"
"SPbFptVh8Vfb3zr0D0OzDqjzv1KCNW/tZcJnCaL9Zl6tAt2v5FiBTOjIbBgB"
)
CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
litellm_endpoint="/v1/chat/completions",
litellm_request={**CHAT_COMPLETIONS_REQUEST, "model": "vertex_ai/claude-haiku-5-5@default"},
expected_provider_endpoint="/v1/projects/synthetic-vertex-project/locations/global/publishers/anthropic/models/claude-haiku-5-5@default:rawPredict",
expected_provider_headers={
"authorization": "Bearer scripted-token",
"anthropic-version": "2023-06-01",
"content-type": "application/json",
"x-api-key": "scripted-token",
},
expected_provider_request=VERTEX_AI_ANTHROPIC_MESSAGES_REQUEST,
mock_provider_response={
**VERTEX_AI_ANTHROPIC_MESSAGES_RESPONSE,
"model": "claude-haiku-5-5",
"id": "msg_vrtx_011Cg8AfAmbYAQCTSseeQSZJ",
"content": [
{
"type": "thinking",
"thinking": (
"The system prompt mentions a chat_completions client for this review, but that's not actually in my "
"available toolset — I only have search_files and read_file. I'll note that discrepancy and proceed by "
"explaining which file I need, then calling read_file on shop/validation.py, probably starting around the "
"first 60 lines to get context near line 18.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_THINKING_SIGNATURE,
},
{
"type": "text",
"text": (
"I'll read `shop/validation.py` next, starting at the `validate_quantity` definition on line 18 and "
"including the surrounding context. The project instructions mention a chat_completions client, but none "
"is available in my tools, so I'm using the read-only file tools."
),
},
{
"type": "tool_use",
"id": "toolu_vrtx_017jjdVAoN8bus5ng5NkzafQ",
"name": "read_file",
"input": {"path": "shop/validation.py", "start_line": 1, "end_line": 60},
},
],
"usage": {
"input_tokens": 4,
"cache_creation_input_tokens": 876,
"cache_read_input_tokens": 0,
"cache_creation": {"ephemeral_5m_input_tokens": 876, "ephemeral_1h_input_tokens": 0},
"output_tokens": 348,
"output_tokens_details": {"thinking_tokens": 168},
},
},
expected_litellm_response={
**CHAT_COMPLETIONS_RESPONSE,
"model": "vertex_ai/claude-haiku-5-5@default",
"choices": [
{
"finish_reason": "tool_calls",
"index": 0,
"message": {
"content": (
"I'll read `shop/validation.py` next, starting at the `validate_quantity` definition on line 18 and "
"including the surrounding context. The project instructions mention a chat_completions client, but "
"none is available in my tools, so I'm using the read-only file tools."
),
"role": "assistant",
"tool_calls": [
{
"index": 2,
"function": {
"arguments": '{"path": "shop/validation.py", "start_line": 1, "end_line": 60}',
"name": "read_file",
},
"id": "toolu_vrtx_017jjdVAoN8bus5ng5NkzafQ",
"type": "function",
}
],
"reasoning_content": (
"The system prompt mentions a chat_completions client for this review, but that's not actually in my "
"available toolset — I only have search_files and read_file. I'll note that discrepancy and proceed "
"by explaining which file I need, then calling read_file on shop/validation.py, probably starting "
"around the first 60 lines to get context near line 18.\n\n"
),
"thinking_blocks": [
{
"type": "thinking",
"thinking": (
"The system prompt mentions a chat_completions client for this review, but that's not actually "
"in my available toolset — I only have search_files and read_file. I'll note that discrepancy "
"and proceed by explaining which file I need, then calling read_file on shop/validation.py, "
"probably starting around the first 60 lines to get context near line 18.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_THINKING_SIGNATURE,
}
],
"provider_specific_fields": {
"citations": None,
"thinking_blocks": [
{
"type": "thinking",
"thinking": (
"The system prompt mentions a chat_completions client for this review, but that's not "
"actually in my available toolset — I only have search_files and read_file. I'll note "
"that discrepancy and proceed by explaining which file I need, then calling read_file on "
"shop/validation.py, probably starting around the first 60 lines to get context near "
"line 18.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_THINKING_SIGNATURE,
}
],
},
},
}
],
"usage": {
"completion_tokens": 348,
"prompt_tokens": 880,
"total_tokens": 1228,
"completion_tokens_details": {"reasoning_tokens": 168, "text_tokens": 180},
"prompt_tokens_details": {
"cached_tokens": 0,
"text_tokens": 4,
"cache_write_tokens": 876,
"cache_creation_tokens": 876,
"cache_creation_token_details": {"ephemeral_5m_input_tokens": 876, "ephemeral_1h_input_tokens": 0},
},
"cache_creation_input_tokens": 876,
"cache_read_input_tokens": 0,
},
},
)
CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
litellm_endpoint="/v1/chat/completions",

View file

@ -5,6 +5,7 @@ from integration.translation.case import TranslationTestCase
from integration.translation.chat_completions.bases.vertex_ai import (
CLAUDE_FABLE_5_1_TEST_CASE,
CLAUDE_HAIKU_4_5_TEST_CASE,
CLAUDE_HAIKU_5_5_TEST_CASE,
CLAUDE_OPUS_4_8_TEST_CASE,
CLAUDE_OPUS_5_5_TEST_CASE,
CLAUDE_SONNET_4_6_TEST_CASE,
@ -26,6 +27,7 @@ from integration.translation.runner import assert_translation
CLAUDE_SONNET_5_TEST_CASE,
CLAUDE_OPUS_4_8_TEST_CASE,
CLAUDE_SONNET_5_5_TEST_CASE,
CLAUDE_HAIKU_5_5_TEST_CASE,
CLAUDE_OPUS_5_5_TEST_CASE,
CLAUDE_FABLE_5_1_TEST_CASE,
GEMINI_3_5_FLASH_TEST_CASE,

View file

@ -10,6 +10,7 @@ from integration.translation.templates.vertex_ai import (
)
GEMINI_3_5_FLASH_THOUGHT_SIGNATURE: Final = "AY89a1+kriNs9YsPegJQxgjTWsMlxsqPU/UkHDyz4EK+3FRrE52ygqPIHTvkblgKKiO5Fn8R9D3iu//i+YnuuZ+e7W0yxUoFScas89b5rn3vZHsihnUA7VTe3b7beth1IftteoTGZ3F8OSLrSIP8HKn4xTIx35eeNEt5oiD3K5rTQrdklqO277HvTDhu/LuZhZ0pzaWciGQEc61epIBBpC2ygu8V4L8TekUVZnz6qzSzxipdiQStQ8dZou43334hMnxOR6JjJCGxqt/1K+C0vXX6YP6f+Bph5VhPSnvy2Z1uApi3TUxAcsDDyVewIr+ha2G6DPhN1Oi5uZZNhmbvH01Uq5OOquF1uEICq2m/35LhJIbDNM9N7oI1Z6L94P9xdugeFXM2S7wdJfc8sdg09vEzNeA++GK25zRuB4hU7XyaG4XnWjmu2kswi4sf+EyrO/K0P2tb/ZCJu7kJTtWTiD1wgSIl1eqS8ORKKsXDN2hIbFrtsNR50WIvVzd6"
CLAUDE_HAIKU_5_5_MESSAGES_THINKING_SIGNATURE: Final = "CAQS4wYKEggSEAIYAjgBQgh0aGlua2luZxIMgzBnOw4aYVVqPKRPGgyphQhlJ0pt7tgasWIiMOWM4ATud/TWad7qo/Eh9ZSXhK3IcgnwdgqVeXog9D1q/y69qnyrHdN3a8RYUrAgtyr+BYkQvRW/cF0vH0l86vIM95N77usMXdZKRX3I8XW68KpQedYwFoR12sS9q7A24CcN5UMyQljcF76GhmAFnvpk4yEs7pk8b7ZRSXzBsU6wJfMYCoGXC9r3hZN8m4sBHLJGJRv5ekzEVGVvGCYooE1fBZ8ik/j2DCNOyVdDs4/7xzkqRo7dgFsNJI9Nm7+HgwEdvb1rORObJWooeYb8tfofTFVO43qvNdvM2p2d1Dcf6lsQmvE5fgDFc0t75AuvSZUrgDNe2bMXd2USxxL9YtJ1I9ae96hZAnyOqYZlyiuZf5lZtQQSRouVIdZvFUNonOHLy/Uyw/BGF2bO1/5rIFJBDJC8C6BpbyfDQPpal4YkALulDdgeJWI6dmJYUiK+A+3zcVgQh7at5JPbG5n0tQgO2IFkayqLjCf67AaGS6Xq8J97F+FSwppKvS0TvRbTEvIK1iO3HZZRwcRIcFBn5Llvv6R9JFknXEtohUqvfTnZfuPQ104vxqm91G2rFK1R6C1md6Ze3pJWD0wgkgZyQ7PIKsAmBF1qNoniFi5GVRJx6XHSzr4ZAPDDO1aYABIRl5OWilrkQP3xedj5pcAjJqFuto3cXlhQSNUrocOpEV5IIXxSJc5g5VwYAybpMU4FVImzkCJGJaHLWQKRo0k4IcvXLxBPNXZhop2CkEeazZskF4de0jn1dJa3sQ9rT+7fNVEWPvP+lkBqu/lfObBPVh5jGeouDrRcJvyeYKNZ0NQBdznM5rv4rN8HczeYg1WaYuNOMBvkqT5Zg/UhLHhHV7NWBSa0zt9DPevU/S3OBR1E0YIzCtPFTa0Ia4gGTX40hEc+supCA3h4HpehqMqETGe++Ah+U10HRhlb6lVfRhkU0ypdPqtpodgw/OdUOy7f3/sc31xknudQMoEQqv48F4gR34ee18Op+w1MGn0FAzAFE95D2BuJObRqUhZ6N6nWtlWOqJjCPR+0OrwR3JlxWh19Vxps/ASL6HaJKjClVG2ffojvmVnY8aHjEfI8ifbHE6EYAQ=="
CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
@ -486,6 +487,106 @@ CLAUDE_SONNET_5_5_TEST_CASE: Final = TranslationTestCase(
)
CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
litellm_endpoint="/v1/messages",
litellm_request={**MESSAGES_REQUEST, "model": "vertex_ai/claude-haiku-5-5@default"},
expected_provider_endpoint="/v1/projects/synthetic-vertex-project/locations/global/publishers/anthropic/models/claude-haiku-5-5@default:rawPredict",
expected_provider_headers={"authorization": "Bearer scripted-token", "content-type": "application/json"},
expected_provider_request={
**VERTEX_AI_ANTHROPIC_MESSAGES_REQUEST,
"messages": MESSAGES_REQUEST["messages"],
"stream": False,
"system": [
{
"type": "text",
"text": (
"You help maintain a synthetic Python project. Read the relevant files before suggesting a fix. "
"Explain which file you need next, then call a read-only tool. Never change files. Use the messages "
"client for this project review. Consider zero, negative and non-integer quantities before choosing "
"the next file to inspect."
),
},
],
"tools": MESSAGES_REQUEST["tools"],
},
mock_provider_response={
**VERTEX_AI_ANTHROPIC_MESSAGES_RESPONSE,
"model": "claude-haiku-5-5",
"id": "msg_vrtx_011Cg8BfjWDUi4ZYQxpy6aVM",
"content": [
{
"type": "thinking",
"thinking": (
"I found validate_quantity defined around line 18, so I'll read the validation.py file from the start "
"through roughly line 60 to capture the full context, keeping in mind I'll need to check how it handles "
"zero, negative, and non-integer cases.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_MESSAGES_THINKING_SIGNATURE,
},
{
"type": "text",
"text": (
"I'll read `shop/validation.py` first. The search put `validate_quantity` at line 18, so I'll start "
"there and include the lines around it to see how zero, negative, and non-integer values are handled."
),
},
{
"type": "tool_use",
"id": "toolu_vrtx_01YSY1kAV4ayCLVdBJkSv4dt",
"name": "read_file",
"input": {"path": "shop/validation.py", "start_line": 1, "end_line": 60},
},
],
"usage": {
"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": 292,
"output_tokens_details": {"thinking_tokens": 129},
},
},
expected_litellm_response={
**VERTEX_AI_ANTHROPIC_MESSAGES_RESPONSE,
"model": "vertex_ai/claude-haiku-5-5@default",
"id": "msg_vrtx_011Cg8BfjWDUi4ZYQxpy6aVM",
"content": [
{
"type": "thinking",
"thinking": (
"I found validate_quantity defined around line 18, so I'll read the validation.py file from the start "
"through roughly line 60 to capture the full context, keeping in mind I'll need to check how it handles "
"zero, negative, and non-integer cases.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_MESSAGES_THINKING_SIGNATURE,
},
{
"type": "text",
"text": (
"I'll read `shop/validation.py` first. The search put `validate_quantity` at line 18, so I'll start "
"there and include the lines around it to see how zero, negative, and non-integer values are handled."
),
},
{
"type": "tool_use",
"id": "toolu_vrtx_01YSY1kAV4ayCLVdBJkSv4dt",
"name": "read_file",
"input": {"path": "shop/validation.py", "start_line": 1, "end_line": 60},
},
],
"usage": {
"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": 292,
"output_tokens_details": {"thinking_tokens": 129},
},
},
)
CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
litellm_endpoint="/v1/messages",

View file

@ -5,6 +5,7 @@ from integration.translation.case import TranslationTestCase
from integration.translation.messages.bases.vertex_ai import (
CLAUDE_FABLE_5_1_TEST_CASE,
CLAUDE_HAIKU_4_5_TEST_CASE,
CLAUDE_HAIKU_5_5_TEST_CASE,
CLAUDE_OPUS_4_8_TEST_CASE,
CLAUDE_OPUS_5_5_TEST_CASE,
CLAUDE_SONNET_4_6_TEST_CASE,
@ -26,6 +27,7 @@ from integration.translation.runner import assert_translation
CLAUDE_SONNET_5_TEST_CASE,
CLAUDE_OPUS_4_8_TEST_CASE,
CLAUDE_SONNET_5_5_TEST_CASE,
CLAUDE_HAIKU_5_5_TEST_CASE,
CLAUDE_OPUS_5_5_TEST_CASE,
CLAUDE_FABLE_5_1_TEST_CASE,
GEMINI_3_5_FLASH_TEST_CASE,

View file

@ -12,6 +12,7 @@ from integration.translation.templates.vertex_ai import (
)
GEMINI_3_5_FLASH_THOUGHT_SIGNATURE: Final = "AY89a1+kriNs9YsPegJQxgjTWsMlxsqPU/UkHDyz4EK+3FRrE52ygqPIHTvkblgKKiO5Fn8R9D3iu//i+YnuuZ+e7W0yxUoFScas89b5rn3vZHsihnUA7VTe3b7beth1IftteoTGZ3F8OSLrSIP8HKn4xTIx35eeNEt5oiD3K5rTQrdklqO277HvTDhu/LuZhZ0pzaWciGQEc61epIBBpC2ygu8V4L8TekUVZnz6qzSzxipdiQStQ8dZou43334hMnxOR6JjJCGxqt/1K+C0vXX6YP6f+Bph5VhPSnvy2Z1uApi3TUxAcsDDyVewIr+ha2G6DPhN1Oi5uZZNhmbvH01Uq5OOquF1uEICq2m/35LhJIbDNM9N7oI1Z6L94P9xdugeFXM2S7wdJfc8sdg09vEzNeA++GK25zRuB4hU7XyaG4XnWjmu2kswi4sf+EyrO/K0P2tb/ZCJu7kJTtWTiD1wgSIl1eqS8ORKKsXDN2hIbFrtsNR50WIvVzd6"
CLAUDE_HAIKU_5_5_RESPONSES_THINKING_SIGNATURE: Final = "CAQS0gYKEggSEAIYAjgBQgh0aGlua2luZxIMcbnLkNvj2D6NoBl7Ggw+Qgax2/68TAR1maEiMH6XEeKEqR1ewAiuj01fMNuD1KI7pCTXUsWWr6H7nSzP5BiRGXRrDCIxPYu2Xbvx7yrtBbbyId4ReZzx21wZ2+d0vkkpZM82PXY72wQRJOHLR4JNLRjiR2Jn+FrZ8mBo2mofFrlTSuioOVHc1hheiH4InRK57w2X9xaTXa+mwoWW5epPieHD26+NNJirF9vB832fvqDVOd+f8N0ZDUXUut8zl/Jxx+0BMOktMqyfehIOGumQmyv49E3JHVQGrx+Dd3KZjaQXrsRFf1K3AJ7p5XElR+cYis40W7EL3DE9EAtriZuDEt0fTct79fzZIZgHd6Dnua/rGRnjNjaaZKxGjnhfkVHwsZW4HqTNgwWQiD3lt2ncoLfsfd2IWwMEI5uWpN3GtvRkQvfzidmgGmx3dI8g0nBvLPuq0jzVIuuoKIKqzT7A5ae3Gs9eTlSDr2wOGfdyNf6Q2TLw0w7EegI4wYSExKhFkx0EytCGHJcbN0WClXXmHsRtrXnP7sxCMMY7B8TIpAoN7SXyNjJizOGgzoYL7PNUgqp5nVz/C9vTvudhSWbjLITdxFJ5hearL2rMhryfHBKvRGYC9RMy/EjjtINNwYpxdVX29mUE+8KT+41HymtJ1Ewjtoo8V/7XQnQk3cB7X2RFHcR89hAM/pSsB14ofMFoDk+jJitS+sCDZI0Xh7/ySU0o/OI4l+oD/yctZTHx/mIOiWRtnAOrveNT1ms0/2+4tcO0wi3pRrOB2s5ugYc1I3+GcRwILEIM3a4ABd5Dw2nW2fgUhfSTTGURm4Z91ciih8pKUS1ZPatFTOJ1ehKeUCXflkqY2PHnftiNB/8GzlomsQ2NoRw8UXD00oMmBvSvZpPN7khFLxWHtxLjleKkeKCzN7QZkOqvjAnUwy9TacT2ZvSXIxrvaep7dOyrlMEta/1KsYEcWuBxLr87Va4txXnmoV4RqGgaauNcR2wOGyRFJppxKAgYbmMnxams7cv/7IY2RVSgSQf2k4hFQYzRwrHngjapuZzgNS7UCMjvJJs4VdIypVOATsZdPzJToMgWaiEoRZ3zApQDgYhhGAE="
CLAUDE_HAIKU_4_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
@ -790,6 +791,160 @@ CLAUDE_SONNET_5_5_TEST_CASE: Final = TranslationTestCase(
)
CLAUDE_HAIKU_5_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
litellm_endpoint="/v1/responses",
litellm_request={**RESPONSES_REQUEST, "model": "vertex_ai/claude-haiku-5-5@default"},
expected_provider_endpoint="/v1/projects/synthetic-vertex-project/locations/global/publishers/anthropic/models/claude-haiku-5-5@default:rawPredict",
expected_provider_headers={
"authorization": "Bearer scripted-token",
"anthropic-version": "2023-06-01",
"content-type": "application/json",
"x-api-key": "scripted-token",
},
expected_provider_request={
**VERTEX_AI_ANTHROPIC_MESSAGES_REQUEST,
"system": [
{
"type": "text",
"text": (
"You help maintain a synthetic Python project. Read the relevant files before suggesting a fix. "
"Explain which file you need next, then call a read-only tool. Never change files. Use the responses "
"client for this project review. Consider zero, negative and non-integer quantities before choosing "
"the next file to inspect."
),
},
],
},
mock_provider_response={
**VERTEX_AI_ANTHROPIC_MESSAGES_RESPONSE,
"model": "claude-haiku-5-5",
"id": "msg_vrtx_011Cg8BhBrWmiX5ZtMxpM9zA",
"content": [
{
"type": "thinking",
"thinking": (
"I should read shop/validation.py to check how it handles zero, negative, and non-integer values "
"before moving to the next file—I'll grab the first 60 lines since I don't know the full length yet.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_RESPONSES_THINKING_SIGNATURE,
},
{
"type": "text",
"text": (
"I'll read the validation function in `shop/validation.py`, starting around the match on line 18."
),
},
{
"type": "tool_use",
"id": "toolu_vrtx_01Jxxsojf34b9skuGH47XkJd",
"name": "read_file",
"input": {"path": "shop/validation.py", "start_line": 1, "end_line": 60},
},
],
"usage": {
"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": 255,
"output_tokens_details": {"thinking_tokens": 126},
},
},
expected_litellm_response={
**RESPONSES_RESPONSE,
"model": "vertex_ai/claude-haiku-5-5@default",
"output": [
{
"type": "reasoning",
"id": ANY,
"status": "completed",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": (
"I should read shop/validation.py to check how it handles zero, negative, and non-integer "
"values before moving to the next file—I'll grab the first 60 lines since I don't know the "
"full length yet.\n\n"
),
"annotations": [],
},
],
"phase": None,
"encrypted_content": json.dumps(
[
{
"type": "thinking",
"thinking": (
"I should read shop/validation.py to check how it handles zero, negative, and non-integer "
"values before moving to the next file—I'll grab the first 60 lines since I don't know the "
"full length yet.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_RESPONSES_THINKING_SIGNATURE,
},
],
separators=(",", ":"),
),
},
{
"type": "message",
"id": ANY,
"status": "completed",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "I'll read the validation function in `shop/validation.py`, starting around the match on line 18.",
"annotations": [],
},
],
"phase": None,
},
{
"arguments": '{"path": "shop/validation.py", "start_line": 1, "end_line": 60}',
"call_id": "toolu_vrtx_01Jxxsojf34b9skuGH47XkJd",
"name": "read_file",
"type": "function_call",
"id": "fc_toolu_vrtx_01Jxxsojf34b9skuGH47XkJd",
"namespace": None,
"status": "completed",
},
],
"usage": {
"input_tokens": 877,
"input_tokens_details": {
"audio_tokens": None,
"cached_tokens": 0,
"cached_tokens_details": None,
"image_tokens": None,
"text_tokens": 4,
"video_tokens": None,
"cache_write_tokens": 873,
},
"output_tokens": 255,
"output_tokens_details": {"audio_tokens": None, "reasoning_tokens": 126, "text_tokens": 129},
"total_tokens": 1132,
"cost": None,
},
"provider_specific_fields": {
"citations": None,
"thinking_blocks": [
{
"type": "thinking",
"thinking": (
"I should read shop/validation.py to check how it handles zero, negative, and non-integer "
"values before moving to the next file—I'll grab the first 60 lines since I don't know the "
"full length yet.\n\n"
),
"signature": CLAUDE_HAIKU_5_5_RESPONSES_THINKING_SIGNATURE,
},
],
},
},
)
CLAUDE_OPUS_5_5_TEST_CASE: Final = TranslationTestCase(
scenario="basic",
litellm_endpoint="/v1/responses",

View file

@ -5,6 +5,7 @@ from integration.translation.case import TranslationTestCase
from integration.translation.responses.bases.vertex_ai import (
CLAUDE_FABLE_5_1_TEST_CASE,
CLAUDE_HAIKU_4_5_TEST_CASE,
CLAUDE_HAIKU_5_5_TEST_CASE,
CLAUDE_OPUS_4_8_TEST_CASE,
CLAUDE_OPUS_5_5_TEST_CASE,
CLAUDE_SONNET_4_6_TEST_CASE,
@ -26,6 +27,7 @@ from integration.translation.runner import assert_translation
CLAUDE_SONNET_5_TEST_CASE,
CLAUDE_OPUS_4_8_TEST_CASE,
CLAUDE_SONNET_5_5_TEST_CASE,
CLAUDE_HAIKU_5_5_TEST_CASE,
CLAUDE_OPUS_5_5_TEST_CASE,
CLAUDE_FABLE_5_1_TEST_CASE,
GEMINI_3_5_FLASH_TEST_CASE,