litellm/tests/integration/translation/messages/templates.py
Kerry Lu 7b7604f0ed
test(translation): share rich fixtures across Claude, GPT and Gemini providers (#46585)
* test(integration): add rich anthropic claude haiku 5.5, opus 5.5 and fable 5.1 translation cases

Capture-backed basic cases on /v1/chat/completions, /v1/messages and /v1/responses for claude-haiku-5-5, claude-opus-5-5 and claude-fable-5-1, reusing the shared client templates and ANTHROPIC_MESSAGES_REQUEST/RESPONSE with model-specific id, content and usage overrides. The minimal Opus 5.5 hello cases are replaced by the rich conversation. Sonnet 5.5 and legacy models are unchanged

* test(translation): rich OpenAI captures for gpt-6.1-sol, gpt-6-luna, gpt-6-astra and gpt-5.6-terra

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(translation): rich Azure gpt-6.1-sol, gpt-6-luna, gpt-6-astra and gpt-5.6-terra cases

* test(translation): rich azure_ai Claude cases for haiku-5-5 and fable-5-1

Bind the shared chat_completions, messages and responses client templates and the anthropic provider templates to azure_ai/claude-haiku-5-5 and azure_ai/claude-fable-5-1 from real Azure AI Foundry captures, keeping the Azure dialect exact (/anthropic/v1/messages, x-api-key plus api-key on chat_completions and responses, system as a text block list on /v1/messages). Add prompt_cache_hit variants for both models from the second call inside the cache window. The two deployments need rows in tests/integration/proxy_config.yaml

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(translation): rich Gemini bases for gemini-3.8-flash, gemini-3.1-pro-preview and gemini-4-argon

Add the shared generateContent provider templates in templates/gemini.py from
real captures and bind the three target models on chat completions, messages
and responses with explicit per-model response overrides. gemini-4-argon is
registered in the three basic lists. gemini-3.5-flash is unchanged

* test(translation): enrich vertex_ai claude and gemini cases from live captures

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(integration): rich Bedrock converse, invoke and mantle translation cases from real captures

* test(integration): register the rich translation deployments and follow the rich Gemini 3.8 Flash cases

Add the synthetic deployments the rich provider cases bind (anthropic, openai, azure, azure_ai, gemini, vertex_ai, bedrock converse, invoke and mantle) to tests/integration/proxy_config.yaml, all pointed at the fake provider on 127.0.0.1:8191 with synthetic keys. The Gemini omitted-temperature contract now takes its expected generationConfig and reply text from the rich GEMINI_3_8_FLASH_TEST_CASE literals instead of the retired minimal hello cases

* test(translation): reuse bridged and native response templates

---------

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: kerry <kerry@berri.ai>
2026-10-14 19:53:09 -07:00

89 lines
3.4 KiB
Python

from collections.abc import Mapping
from typing import Final
from integration.translation.templates.anthropic import ANTHROPIC_MESSAGES_RESPONSE
from pydantic import JsonValue
MESSAGES_REQUEST: Final[Mapping[str, JsonValue]] = {
"cache": {"no-cache": True},
"max_tokens": 1024,
"system": "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.",
"messages": [
{
"role": "user",
"content": "The checkout rejects quantities of zero. Find the validation code and its tests.",
},
{
"role": "assistant",
"content": [
{"type": "text", "text": "I will locate the quantity validation and its tests."},
{
"type": "tool_use",
"id": "toolu_synthetic_search_01",
"name": "search_files",
"input": {"query": "quantity", "paths": ["shop/", "tests/"]},
},
],
},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_synthetic_search_01",
"content": '{"matches": [{"path": "shop/validation.py", "line": 18, '
'"text": "def validate_quantity(quantity):"}, {"path": '
'"tests/test_validation.py", "line": 7, "text": "def '
'test_zero_quantity():"}]}',
},
{
"type": "text",
"text": "Read the validation file first so we can understand how zero and "
"negative quantities are handled.",
"cache_control": {"type": "ephemeral", "ttl": "5m"},
},
],
},
],
"tools": [
{
"name": "search_files",
"description": "Search source and test files for a literal term.",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"},
"paths": {"type": "array", "items": {"type": "string"}},
},
"required": ["query", "paths"],
"additionalProperties": False,
},
},
{
"name": "read_file",
"description": "Read a range of lines from a project file.",
"input_schema": {
"type": "object",
"properties": {
"path": {"type": "string"},
"start_line": {"type": "integer", "minimum": 1},
"end_line": {"type": "integer", "minimum": 1},
},
"required": ["path", "start_line", "end_line"],
"additionalProperties": False,
},
},
],
"thinking": {"type": "adaptive", "display": "summarized"},
"output_config": {"effort": "high"},
}
MESSAGES_RESPONSE: Final[Mapping[str, JsonValue]] = ANTHROPIC_MESSAGES_RESPONSE
MESSAGES_BRIDGE_RESPONSE: Final[Mapping[str, JsonValue]] = {
key: value for key, value in MESSAGES_RESPONSE.items() if key not in {"container", "diagnostics"}
}