litellm/tests/integration/cost_calculation/cases/gemini.py
Kerry Lu 0eff31ae4e
fix(gemini): bill context cache creation tokens from cachedContents responses (#46144)
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-13 03:18:50 +00:00

3628 lines
150 KiB
Python

"""gemini cost tracking cases, one CostTrackingTestCase literal per request shape (moved from cost_tracking_cases.json).
PARITY pairs the streamed case with its plain twin where both bill the same row."""
from typing import Final
from integration.cost_calculation.cost_tracking_case import (
CostTrackingTestCase,
ExactExpected,
JsonResponse,
RecountExpected,
RecountRates,
RoutedResponse,
SseResponse,
)
from integration.cost_calculation.stream_parity.case import StreamParityTestCase, sse_frames
# gemini/gemini-3.1-pro
GEMINI_GEMINI_3_1_PRO_INPUT_TEXT: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-input_text",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "15e6a9747fd2 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 15e6a9747fd2"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.008624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_CACHE_READ: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-cache_read",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "722017e8e394 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 722017e8e394"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 12928,
"candidatesTokenCount": 380,
"totalTokenCount": 13308,
"cachedContentTokenCount": 12288,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 12928}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.0082976, input_cost=0.0037376, output_cost=0.00456, prompt_tokens=12928, completion_tokens=380
),
)
GEMINI_GEMINI_3_1_PRO_AUDIO_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-audio_input",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "f03ad3a1bb53 summarize the attached material in one line and name the city weather",
},
{
"type": "input_audio",
"input_audio": {
"data": "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",
"format": "wav",
},
},
],
},
],
"stream": False,
"modalities": ["text"],
"allowed_openai_params": ["modalities"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer f03ad3a1bb53"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1546,
"candidatesTokenCount": 210,
"totalTokenCount": 1756,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 96},
{"modality": "AUDIO", "tokenCount": 1450},
],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.006482, input_cost=0.003962, output_cost=0.00252, prompt_tokens=1546, completion_tokens=210
),
)
GEMINI_GEMINI_3_1_PRO_IMAGE_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-image_input",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "0c05c06c97fa summarize the attached material in one line and name the city weather",
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,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",
"detail": "high",
},
},
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 0c05c06c97fa"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 2116,
"candidatesTokenCount": 240,
"totalTokenCount": 2356,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 310},
{"modality": "IMAGE", "tokenCount": 1806},
],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.0074732, input_cost=0.0045932, output_cost=0.00288, prompt_tokens=2116, completion_tokens=240
),
)
GEMINI_GEMINI_3_1_PRO_VIDEO_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-video_input",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "7c49c7c888f4 summarize the attached material in one line and name the city weather",
},
{
"type": "file",
"file": {
"file_data": "data:video/mp4;base64,AAAAGGZ0eXBpc29tAAACAGlzb21pc282AAACCG1kYXQNFBsiKTA3PkVMU1phaG92fYSLkpmgp661vMPK0djf5u30+wIJEBceJSwzOkFIT1ZdZGtyeYCHjpWco6qxuL/GzdTb4unw9/4FDBMaISgvNj1ES1JZYGdudXyDipGYn6attLvCydDX3uXs8/oBCA8WHSQrMjlAR05VXGNqcXh/ho2Um6KpsLe+xczT2uHo7/b9BAsSGSAnLjU8Q0pRWF9mbXR7gomQl56lrLO6wcjP1t3k6/L5AAcOFRwjKjE4P0ZNVFtiaXB3foWMk5qhqK+2vcTL0tng5+71/AMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXc4+rx+P8GDRQbIikwNz5FTFNaYWhvdn2Ei5KZoKeutbzDytHY3+bt9PsCCRAXHiUsMzpBSE9WXWRrcnmAh46VnKOqsbi/xs3U2+Lp8Pf+BQwTGiEoLzY9REtSWWBnbnV8g4qRmJ+mrbS7wsnQ197l7PP6AQgPFh0kKzI5QEdOVVxjanF4f4aNlJuiqbC3vsXM09rh6O/2/QQLEhkgJy41PENKUVhfZm10e4KJkJeepayzusHIz9bd5Ovy+QAHDhUcIyoxOD9GTVRbYmlwd36FjJOaoaivtr3Ey9LZ4Ofu9fwDChEYHyYtNDtCSVBXXmVsc3qBiI+WnaSrsrnAx87V3OPq8fj/Bg==",
"format": "mp4",
},
},
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 7c49c7c888f4"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 8060,
"candidatesTokenCount": 300,
"totalTokenCount": 8360,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 140},
{"modality": "VIDEO", "tokenCount": 7920},
],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.022888, input_cost=0.019288, output_cost=0.0036, prompt_tokens=8060, completion_tokens=300
),
)
GEMINI_GEMINI_3_1_PRO_REASONING: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-reasoning",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "000113942d5d summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"reasoning_effort": "medium",
"allowed_openai_params": ["reasoning_effort"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 000113942d5d"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1240,
"candidatesTokenCount": 560,
"thoughtsTokenCount": 3480,
"totalTokenCount": 5280,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1240}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.05444, input_cost=0.00248, output_cost=0.05196, prompt_tokens=1240, completion_tokens=4040
),
)
GEMINI_GEMINI_3_1_PRO_TIERED_INPUT_ABOVE_200K: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-tiered_input_above_200k",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "1dc16abc4658 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 1dc16abc4658"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 204800,
"candidatesTokenCount": 620,
"totalTokenCount": 205420,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 204800}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.83036, input_cost=0.8192, output_cost=0.01116, prompt_tokens=204800, completion_tokens=620
),
)
GEMINI_GEMINI_3_1_PRO_TIERED_CACHE_READ_ABOVE_200K: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-tiered_cache_read_above_200k",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "e0ceec272f4b summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer e0ceec272f4b"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 205824,
"candidatesTokenCount": 480,
"totalTokenCount": 206304,
"cachedContentTokenCount": 201728,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 205824}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.1057152, input_cost=0.0970752, output_cost=0.00864, prompt_tokens=205824, completion_tokens=480
),
)
GEMINI_GEMINI_3_1_PRO_SERVICE_TIER_FLEX: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-service_tier_flex",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "888d93f4c060 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 888d93f4c060"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
"trafficType": "ON_DEMAND_FLEX",
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.004312, input_cost=0.00184, output_cost=0.002472, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_SERVICE_TIER_PRIORITY: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-service_tier_priority",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "68dfafa41eed summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 68dfafa41eed"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
"trafficType": "ON_DEMAND_PRIORITY",
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.01078, input_cost=0.0046, output_cost=0.00618, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_WEB_SEARCH_MEDIUM: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-web_search_medium",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "3d8a4ab5a9b2 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [{"googleSearch": {}}],
"allowed_openai_params": ["web_search_options"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 3d8a4ab5a9b2"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
"groundingMetadata": {"webSearchQueries": ["query 0", "query 1", "query 2"]},
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.113624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_GOOGLE_MAPS_GROUNDING: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-google_maps_grounding",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "982de823fd3b summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [{"googleMaps": {}}],
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 982de823fd3b"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
"groundingMetadata": {
"webSearchQueries": ["maps query 0"],
"groundingChunks": [{"maps": {"uri": "https://maps.google.com/?cid=0"}}],
"googleMapsWidgetContextToken": "token_$REQUEST_ID",
},
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.033624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_STREAM: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "93682132cbf8 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 93682132cbf8"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.1-pro",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
),
expected=ExactExpected(
spend=0.008624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_STREAM_NO_USAGE: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream_no_usage",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "661f87e3dcf5 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 661f87e3dcf5"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.1-pro",
}
),
),
expected=RecountExpected(recount=RecountRates(input_cost_per_token=2e-06, output_cost_per_token=1.2e-05)),
)
GEMINI_GEMINI_3_1_PRO_STREAM_NO_USAGE_TOOL_CALL: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream_no_usage_tool_call",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "9fc58c44c867 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather and a short forecast for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"days": {"type": "integer", "description": "Forecast horizon in days"},
"units": {"type": "string", "enum": ["metric", "imperial"]},
},
"required": ["city"],
},
},
}
],
"tool_choice": "auto",
"allowed_openai_params": ["tool_choice"],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "Berlin",
"days": 7,
"units": "metric",
"notes": "filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler ",
},
}
}
],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.1-pro",
}
),
),
expected=RecountExpected(recount=RecountRates(input_cost_per_token=2e-06, output_cost_per_token=1.2e-05)),
)
GEMINI_GEMINI_3_1_PRO_STREAM_NO_USAGE_IMAGE_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream_no_usage_image_input",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "5aced106bb93 summarize the attached material in one line and name the city weather",
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,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",
"detail": "high",
},
},
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 5aced106bb93"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.1-pro",
}
),
),
expected=RecountExpected(recount=RecountRates(input_cost_per_token=2e-06, output_cost_per_token=1.2e-05)),
)
GEMINI_GEMINI_3_1_PRO_PROMPT_BLOCKED: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-prompt_blocked",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "0b401759be94 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"promptFeedback": {
"blockReason": "SAFETY",
"safetyRatings": [{"category": "HARM_CATEGORY_HARASSMENT", "probability": "HIGH", "blocked": True}],
},
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 0,
"totalTokenCount": 1840,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(spend=0.00368, input_cost=0.00368, output_cost=0.0, prompt_tokens=1840, completion_tokens=0),
)
GEMINI_GEMINI_3_1_PRO_STREAM_PROMPT_BLOCKED: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream_prompt_blocked",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "46376a43606c summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"promptFeedback": {
"blockReason": "SAFETY",
"safetyRatings": [{"category": "HARM_CATEGORY_HARASSMENT", "probability": "HIGH", "blocked": True}],
},
"modelVersion": "gemini-3.1-pro",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 0,
"totalTokenCount": 1840,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
),
expected=ExactExpected(spend=0.00368, input_cost=0.00368, output_cost=0.0, prompt_tokens=1840, completion_tokens=0),
)
GEMINI_GEMINI_3_1_PRO_RESPONSE_MODEL_OVERRIDE: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-response_model_override",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "da151058cfb9 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer da151058cfb9"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.002156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_STREAM_RESPONSE_MODEL_OVERRIDE: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream_response_model_override",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "d2aaa2ca1279 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer d2aaa2ca1279"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.8-flash",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
),
expected=ExactExpected(
spend=0.002156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_TOOL_CALL: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-tool_call",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "4fe80308a236 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather and a short forecast for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"days": {"type": "integer", "description": "Forecast horizon in days"},
"units": {"type": "string", "enum": ["metric", "imperial"]},
},
"required": ["city"],
},
},
}
],
"tool_choice": "auto",
"allowed_openai_params": ["tool_choice"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "Berlin",
"days": 7,
"units": "metric",
"notes": "filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler ",
},
}
}
],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.008624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_STREAM_TOOL_CALL: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream_tool_call",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "f0ddadf59ebc summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather and a short forecast for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"days": {"type": "integer", "description": "Forecast horizon in days"},
"units": {"type": "string", "enum": ["metric", "imperial"]},
},
"required": ["city"],
},
},
}
],
"tool_choice": "auto",
"allowed_openai_params": ["tool_choice"],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "Berlin",
"days": 7,
"units": "metric",
"notes": "filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler ",
},
}
}
],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.1-pro",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
),
expected=ExactExpected(
spend=0.008624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_1_PRO_STREAM_FULL_USAGE: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-stream_full_usage",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "47de5dc94825 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 47de5dc94825"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.1-pro",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 8314,
"candidatesTokenCount": 412,
"thoughtsTokenCount": 900,
"totalTokenCount": 9626,
"cachedContentTokenCount": 6144,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 7984},
{"modality": "AUDIO", "tokenCount": 330},
],
},
"modelVersion": "gemini-3.1-pro",
},
),
),
expected=ExactExpected(
spend=0.0224108, input_cost=0.0057668, output_cost=0.016644, prompt_tokens=8314, completion_tokens=1312
),
)
GEMINI_3_1_PRO_PASSTHROUGH_GENERATE_CONTENT_PRICED_VIA_GEMINI_KEY: Final = CostTrackingTestCase(
name="gemini-3.1-pro-passthrough-generate_content_priced_via_gemini_key",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
endpoint="/gemini/v1beta/models/$MODEL:generateContent",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "5fdf6b7dd9b9 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 5fdf6b7dd9b9"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.008624,
input_cost=0.00368,
output_cost=0.004944,
prompt_tokens=1840,
completion_tokens=412,
breakdown_persisted=False,
cost_header=False,
),
)
# gemini/gemini-3.8-flash
GEMINI_GEMINI_3_8_FLASH_INPUT_TEXT: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-input_text",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "3944829b75e5 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 3944829b75e5"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.002156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_CACHE_READ: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-cache_read",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "24a568396212 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 24a568396212"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 12928,
"candidatesTokenCount": 380,
"totalTokenCount": 13308,
"cachedContentTokenCount": 12288,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 12928}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.0020744, input_cost=0.0009344, output_cost=0.00114, prompt_tokens=12928, completion_tokens=380
),
)
GEMINI_GEMINI_3_8_FLASH_AUDIO_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-audio_input",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "99e65f16c4b4 summarize the attached material in one line and name the city weather",
},
{
"type": "input_audio",
"input_audio": {
"data": "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",
"format": "wav",
},
},
],
},
],
"stream": False,
"modalities": ["text"],
"allowed_openai_params": ["modalities"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 99e65f16c4b4"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1546,
"candidatesTokenCount": 210,
"totalTokenCount": 1756,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 96},
{"modality": "AUDIO", "tokenCount": 1450},
],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.002128, input_cost=0.001498, output_cost=0.00063, prompt_tokens=1546, completion_tokens=210
),
)
GEMINI_GEMINI_3_8_FLASH_AUDIO_OUTPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-audio_output",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "6fc6e4823e02 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"modalities": ["text", "audio"],
"audio": {"voice": "alloy", "format": "pcm16"},
"allowed_openai_params": ["modalities", "audio"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 6fc6e4823e02"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 220,
"candidatesTokenCount": 1300,
"totalTokenCount": 1520,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 220}],
"candidatesTokensDetails": [
{"modality": "TEXT", "tokenCount": 180},
{"modality": "AUDIO", "tokenCount": 1120},
],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.00737, input_cost=0.00011, output_cost=0.00726, prompt_tokens=220, completion_tokens=1300
),
)
GEMINI_GEMINI_3_8_FLASH_IMAGE_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-image_input",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "ca377dd90846 summarize the attached material in one line and name the city weather",
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,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",
"detail": "high",
},
},
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer ca377dd90846"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 2116,
"candidatesTokenCount": 240,
"totalTokenCount": 2356,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 310},
{"modality": "IMAGE", "tokenCount": 1806},
],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.0018683, input_cost=0.0011483, output_cost=0.00072, prompt_tokens=2116, completion_tokens=240
),
)
GEMINI_GEMINI_3_8_FLASH_VIDEO_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-video_input",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "030071a5c80f summarize the attached material in one line and name the city weather",
},
{
"type": "file",
"file": {
"file_data": "data:video/mp4;base64,AAAAGGZ0eXBpc29tAAACAGlzb21pc282AAACCG1kYXQNFBsiKTA3PkVMU1phaG92fYSLkpmgp661vMPK0djf5u30+wIJEBceJSwzOkFIT1ZdZGtyeYCHjpWco6qxuL/GzdTb4unw9/4FDBMaISgvNj1ES1JZYGdudXyDipGYn6attLvCydDX3uXs8/oBCA8WHSQrMjlAR05VXGNqcXh/ho2Um6KpsLe+xczT2uHo7/b9BAsSGSAnLjU8Q0pRWF9mbXR7gomQl56lrLO6wcjP1t3k6/L5AAcOFRwjKjE4P0ZNVFtiaXB3foWMk5qhqK+2vcTL0tng5+71/AMKERgfJi00O0JJUFdeZWxzeoGIj5adpKuyucDHztXc4+rx+P8GDRQbIikwNz5FTFNaYWhvdn2Ei5KZoKeutbzDytHY3+bt9PsCCRAXHiUsMzpBSE9WXWRrcnmAh46VnKOqsbi/xs3U2+Lp8Pf+BQwTGiEoLzY9REtSWWBnbnV8g4qRmJ+mrbS7wsnQ197l7PP6AQgPFh0kKzI5QEdOVVxjanF4f4aNlJuiqbC3vsXM09rh6O/2/QQLEhkgJy41PENKUVhfZm10e4KJkJeepayzusHIz9bd5Ovy+QAHDhUcIyoxOD9GTVRbYmlwd36FjJOaoaivtr3Ey9LZ4Ofu9fwDChEYHyYtNDtCSVBXXmVsc3qBiI+WnaSrsrnAx87V3OPq8fj/Bg==",
"format": "mp4",
},
},
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 030071a5c80f"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 8060,
"candidatesTokenCount": 300,
"totalTokenCount": 8360,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 140},
{"modality": "VIDEO", "tokenCount": 7920},
],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.005722, input_cost=0.004822, output_cost=0.0009, prompt_tokens=8060, completion_tokens=300
),
)
GEMINI_GEMINI_3_8_FLASH_REASONING: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-reasoning",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "518ba3ee4c33 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"reasoning_effort": "medium",
"allowed_openai_params": ["reasoning_effort"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 518ba3ee4c33"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1240,
"candidatesTokenCount": 560,
"thoughtsTokenCount": 3480,
"totalTokenCount": 5280,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1240}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.01448, input_cost=0.00062, output_cost=0.01386, prompt_tokens=1240, completion_tokens=4040
),
)
GEMINI_GEMINI_3_8_FLASH_SERVICE_TIER_FLEX: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-service_tier_flex",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "ed5fc114b878 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer ed5fc114b878"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
"trafficType": "ON_DEMAND_FLEX",
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.001078, input_cost=0.00046, output_cost=0.000618, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_SERVICE_TIER_PRIORITY: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-service_tier_priority",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "c8b02e840d2c summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer c8b02e840d2c"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
"trafficType": "ON_DEMAND_PRIORITY",
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.002695, input_cost=0.00115, output_cost=0.001545, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_WEB_SEARCH_PER_PROMPT: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-web_search_per_prompt",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "4c0023a5b762 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [{"googleSearch": {}}],
"allowed_openai_params": ["web_search_options"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 4c0023a5b762"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
"groundingMetadata": {"webSearchQueries": ["query 0", "query 1", "query 2"]},
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.037156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_GOOGLE_MAPS_GROUNDING: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-google_maps_grounding",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "b8da7a958abf summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [{"googleMaps": {}}],
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer b8da7a958abf"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
"groundingMetadata": {
"webSearchQueries": ["maps query 0"],
"groundingChunks": [{"maps": {"uri": "https://maps.google.com/?cid=0"}}],
"googleMapsWidgetContextToken": "token_$REQUEST_ID",
},
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.027156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_STREAM: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "eacbb9f405ad summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer eacbb9f405ad"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.8-flash",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
),
expected=ExactExpected(
spend=0.002156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_STREAM_NO_USAGE: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream_no_usage",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "837d58c93751 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 837d58c93751"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.8-flash",
}
),
),
expected=RecountExpected(recount=RecountRates(input_cost_per_token=5e-07, output_cost_per_token=3e-06)),
)
GEMINI_GEMINI_3_8_FLASH_STREAM_NO_USAGE_TOOL_CALL: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream_no_usage_tool_call",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "5d097120da02 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather and a short forecast for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"days": {"type": "integer", "description": "Forecast horizon in days"},
"units": {"type": "string", "enum": ["metric", "imperial"]},
},
"required": ["city"],
},
},
}
],
"tool_choice": "auto",
"allowed_openai_params": ["tool_choice"],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "Berlin",
"days": 7,
"units": "metric",
"notes": "filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler ",
},
}
}
],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.8-flash",
}
),
),
expected=RecountExpected(recount=RecountRates(input_cost_per_token=5e-07, output_cost_per_token=3e-06)),
)
GEMINI_GEMINI_3_8_FLASH_STREAM_NO_USAGE_IMAGE_INPUT: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream_no_usage_image_input",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "5fca57bc9ae9 summarize the attached material in one line and name the city weather",
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,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",
"detail": "high",
},
},
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 5fca57bc9ae9"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.8-flash",
}
),
),
expected=RecountExpected(recount=RecountRates(input_cost_per_token=5e-07, output_cost_per_token=3e-06)),
)
GEMINI_GEMINI_3_8_FLASH_PROMPT_BLOCKED: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-prompt_blocked",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "7dc69adaf49c summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"promptFeedback": {
"blockReason": "SAFETY",
"safetyRatings": [{"category": "HARM_CATEGORY_HARASSMENT", "probability": "HIGH", "blocked": True}],
},
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 0,
"totalTokenCount": 1840,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(spend=0.00092, input_cost=0.00092, output_cost=0.0, prompt_tokens=1840, completion_tokens=0),
)
GEMINI_GEMINI_3_8_FLASH_STREAM_PROMPT_BLOCKED: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream_prompt_blocked",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "23065669b96e summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"promptFeedback": {
"blockReason": "SAFETY",
"safetyRatings": [{"category": "HARM_CATEGORY_HARASSMENT", "probability": "HIGH", "blocked": True}],
},
"modelVersion": "gemini-3.8-flash",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 0,
"totalTokenCount": 1840,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
),
expected=ExactExpected(spend=0.00092, input_cost=0.00092, output_cost=0.0, prompt_tokens=1840, completion_tokens=0),
)
GEMINI_GEMINI_3_8_FLASH_RESPONSE_MODEL_OVERRIDE: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-response_model_override",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "290ca0555ee8 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 290ca0555ee8"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
expected=ExactExpected(
spend=0.008624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_STREAM_RESPONSE_MODEL_OVERRIDE: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream_response_model_override",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "ec61060b88e9 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer ec61060b88e9"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.1-pro",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.1-pro",
},
),
),
expected=ExactExpected(
spend=0.008624, input_cost=0.00368, output_cost=0.004944, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_TOOL_CALL: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-tool_call",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "670f41936a6d summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather and a short forecast for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"days": {"type": "integer", "description": "Forecast horizon in days"},
"units": {"type": "string", "enum": ["metric", "imperial"]},
},
"required": ["city"],
},
},
}
],
"tool_choice": "auto",
"allowed_openai_params": ["tool_choice"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "Berlin",
"days": 7,
"units": "metric",
"notes": "filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler ",
},
}
}
],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
expected=ExactExpected(
spend=0.002156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_STREAM_TOOL_CALL: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream_tool_call",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "8cdfceec775e summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather and a short forecast for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"days": {"type": "integer", "description": "Forecast horizon in days"},
"units": {"type": "string", "enum": ["metric", "imperial"]},
},
"required": ["city"],
},
},
}
],
"tool_choice": "auto",
"allowed_openai_params": ["tool_choice"],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "Berlin",
"days": 7,
"units": "metric",
"notes": "filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler ",
},
}
}
],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.8-flash",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 1840,
"candidatesTokenCount": 412,
"totalTokenCount": 2252,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1840}],
},
"modelVersion": "gemini-3.8-flash",
},
),
),
expected=ExactExpected(
spend=0.002156, input_cost=0.00092, output_cost=0.001236, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_STREAM_FULL_USAGE: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-stream_full_usage",
covers="quota_management.spend_tracking.scripted_wire.logs_cost",
model="gemini/gemini-3.8-flash",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "0b11ac8b4a63 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": True,
"stream_options": {"include_usage": True},
"allowed_openai_params": [],
},
response=SseResponse(
content_type="text/event-stream",
frames=sse_frames(
{
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 0b11ac8b4a63"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"modelVersion": "gemini-3.8-flash",
},
{
"candidates": [],
"usageMetadata": {
"promptTokenCount": 8314,
"candidatesTokenCount": 692,
"thoughtsTokenCount": 900,
"totalTokenCount": 9906,
"cachedContentTokenCount": 6144,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 7984},
{"modality": "AUDIO", "tokenCount": 330},
],
"candidatesTokensDetails": [
{"modality": "TEXT", "tokenCount": 412},
{"modality": "AUDIO", "tokenCount": 280},
],
},
"modelVersion": "gemini-3.8-flash",
},
),
),
expected=ExactExpected(
spend=0.0076232, input_cost=0.0015572, output_cost=0.006066, prompt_tokens=8314, completion_tokens=1592
),
)
# gemini/gemini-embedding-002
GEMINI_EMBEDDINGS_002: Final = CostTrackingTestCase(
name="gemini-embeddings-002",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-embedding-002",
endpoint="/v1/embeddings",
request={"model": "$MODEL", "input": "gemini embedding"},
response=JsonResponse(
content_type="application/json",
body={
"embeddings": [{"values": [0.1, 0.2, 0.3]}],
"usageMetadata": {"promptTokenCount": 7, "totalTokenCount": 7},
},
),
expected=ExactExpected(spend=3.24e-06, input_cost=3.24e-06, output_cost=0.0, prompt_tokens=3, completion_tokens=0),
)
# gemini/gemini-3.8-flash-lite
GEMINI_GEMINI_3_8_FLASH_LITE_INPUT_BELOW_128K: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-lite-input_below_128k",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash-lite",
request={
"model": "$MODEL",
"messages": [{"role": "user", "content": "base pricing"}],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{"content": {"parts": [{"text": "ok"}], "role": "model"}, "finishReason": "STOP", "index": 0}
],
"usageMetadata": {"promptTokenCount": 1840, "candidatesTokenCount": 412, "totalTokenCount": 2252},
"modelVersion": "gemini-3.8-flash-lite",
},
),
expected=ExactExpected(
spend=0.00038368, input_cost=0.0002024, output_cost=0.00018128, prompt_tokens=1840, completion_tokens=412
),
)
GEMINI_GEMINI_3_8_FLASH_LITE_INPUT_ABOVE_128K: Final = CostTrackingTestCase(
name="gemini-gemini-3.8-flash-lite-input_above_128k",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.8-flash-lite",
request={
"model": "$MODEL",
"messages": [{"role": "user", "content": "above threshold"}],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{"content": {"parts": [{"text": "ok"}], "role": "model"}, "finishReason": "STOP", "index": 0}
],
"usageMetadata": {"promptTokenCount": 130000, "candidatesTokenCount": 412, "totalTokenCount": 130412},
"modelVersion": "gemini-3.8-flash-lite",
},
),
expected=ExactExpected(
spend=0.02896256, input_cost=0.0286, output_cost=0.00036256, prompt_tokens=130000, completion_tokens=412
),
)
# gemini/gemini-nano-banana-2.1
GEMINI_NANO_BANANA_2_1_INPUT_TEXT: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-input_text",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "8e41cbb0a701 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 8e41cbb0a701"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 2000,
"candidatesTokenCount": 100,
"totalTokenCount": 2100,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 2000}],
"candidatesTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.00375, input_cost=0.003, output_cost=0.00075, prompt_tokens=2000, completion_tokens=100
),
)
GEMINI_NANO_BANANA_2_1_IMAGE_INPUT: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-image_input",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "3f6c2d91a40e summarize the attached material in one line and name the city weather",
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+yVWQAAAAASUVORK5CYII=",
"detail": "high",
},
},
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 3f6c2d91a40e"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1680,
"candidatesTokenCount": 100,
"totalTokenCount": 1780,
"promptTokensDetails": [
{"modality": "TEXT", "tokenCount": 560},
{"modality": "IMAGE", "tokenCount": 1120},
],
"candidatesTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.00327, input_cost=0.00252, output_cost=0.00075, prompt_tokens=1680, completion_tokens=100
),
)
GEMINI_NANO_BANANA_2_1_OUTPUT_TEXT: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-output_text",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "d05a38c7e219 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer d05a38c7e219"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 4000,
"totalTokenCount": 4100,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [{"modality": "TEXT", "tokenCount": 4000}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.03015, input_cost=0.00015, output_cost=0.03, prompt_tokens=100, completion_tokens=4000
),
)
GEMINI_NANO_BANANA_2_1_REASONING: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-reasoning",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "c71e4f0092ba summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"reasoning_effort": "medium",
"allowed_openai_params": ["reasoning_effort"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer c71e4f0092ba"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 200,
"thoughtsTokenCount": 1800,
"totalTokenCount": 2100,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [{"modality": "TEXT", "tokenCount": 200}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.01515, input_cost=0.00015, output_cost=0.015, prompt_tokens=100, completion_tokens=2000
),
)
GEMINI_NANO_BANANA_2_1_IMAGE_OUTPUT_1K: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-image_output_1k",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "6a9f2c13b847 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {
"parts": [{"inlineData": {"mimeType": "image/png", "data": "aGVsbG8="}}],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 1120,
"totalTokenCount": 1220,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [{"modality": "IMAGE", "tokenCount": 1120}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.03375, input_cost=0.00015, output_cost=0.0336, prompt_tokens=100, completion_tokens=1120
),
)
GEMINI_NANO_BANANA_2_1_IMAGE_OUTPUT_2K: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-image_output_2k",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "24df708bc351 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {
"parts": [{"inlineData": {"mimeType": "image/png", "data": "aGVsbG8="}}],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 1680,
"totalTokenCount": 1780,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [{"modality": "IMAGE", "tokenCount": 1680}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.05055, input_cost=0.00015, output_cost=0.0504, prompt_tokens=100, completion_tokens=1680
),
)
GEMINI_NANO_BANANA_2_1_IMAGE_OUTPUT_4K: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-image_output_4k",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "b8a315e4706c summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {
"parts": [{"inlineData": {"mimeType": "image/png", "data": "aGVsbG8="}}],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 2520,
"totalTokenCount": 2620,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [{"modality": "IMAGE", "tokenCount": 2520}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.07575, input_cost=0.00015, output_cost=0.0756, prompt_tokens=100, completion_tokens=2520
),
)
GEMINI_NANO_BANANA_2_1_MIXED_TEXT_IMAGE_OUTPUT: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-mixed_text_image_output",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "91ce62a50d3b summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {
"parts": [
{"text": "scripted answer 91ce62a50d3b"},
{"inlineData": {"mimeType": "image/png", "data": "aGVsbG8="}},
],
"role": "model",
},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 1220,
"thoughtsTokenCount": 300,
"totalTokenCount": 1620,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [
{"modality": "TEXT", "tokenCount": 100},
{"modality": "IMAGE", "tokenCount": 1120},
],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.03675, input_cost=0.00015, output_cost=0.0366, prompt_tokens=100, completion_tokens=1520
),
)
GEMINI_NANO_BANANA_2_1_WEB_SEARCH_SINGLE_QUERY: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-web_search_single_query",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "f407b19d8e26 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [{"googleSearch": {}}],
"allowed_openai_params": ["web_search_options"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer f407b19d8e26"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
"groundingMetadata": {"webSearchQueries": ["query 0"]},
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 100,
"totalTokenCount": 200,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.0149,
input_cost=0.00015,
output_cost=0.00075,
tool_usage_cost=0.014,
prompt_tokens=100,
completion_tokens=100,
),
)
GEMINI_NANO_BANANA_2_1_WEB_SEARCH_MULTIPLE_QUERIES: Final = CostTrackingTestCase(
name="gemini-nano-banana-2.1-web_search_multiple_queries",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-nano-banana-2.1",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are a deterministic pricing-harness assistant. Keep answers to a single short line.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "a36d5f80c297 summarize the attached material in one line and name the city weather",
}
],
},
],
"stream": False,
"tools": [{"googleSearch": {}}],
"allowed_openai_params": ["web_search_options"],
},
response=JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer a36d5f80c297"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
"groundingMetadata": {"webSearchQueries": ["query 0", "query 1", "query 2", "query 3"]},
}
],
"usageMetadata": {
"promptTokenCount": 100,
"candidatesTokenCount": 100,
"totalTokenCount": 200,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
"candidatesTokensDetails": [{"modality": "TEXT", "tokenCount": 100}],
},
"modelVersion": "gemini-nano-banana-2.1",
},
),
expected=ExactExpected(
spend=0.0569,
input_cost=0.00015,
output_cost=0.00075,
tool_usage_cost=0.056,
prompt_tokens=100,
completion_tokens=100,
),
)
GEMINI_GEMINI_3_1_PRO_CACHE_CREATION: Final = CostTrackingTestCase(
name="gemini-gemini-3.1-pro-cache_creation",
covers="quota_management.spend_tracking.cost_matrix.logs_cost",
model="gemini/gemini-3.1-pro",
request={
"model": "$MODEL",
"messages": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "cacheable pricing-harness prefix " * 1000,
"cache_control": {"type": "ephemeral"},
}
],
},
{
"role": "user",
"content": [{"type": "text", "text": "9c1d4e7a2b60 answer from the cached prefix in one line"}],
},
],
"stream": False,
"allowed_openai_params": [],
},
response=RoutedResponse(
content_type="application/x-routed",
routes={
"GET /models/gemini-3.1-pro:cachedContents": JsonResponse(
content_type="application/json", body={"cachedContents": []}
),
"POST /models/gemini-3.1-pro:cachedContents": JsonResponse(
content_type="application/json",
body={
"name": "cachedContents/$REQUEST_ID",
"model": "models/gemini-3.1-pro",
"createTime": "2026-10-13T00:00:00Z",
"expireTime": "2026-10-13T01:00:00Z",
"usageMetadata": {"totalTokenCount": 1280},
},
),
"POST /models/gemini-3.1-pro:generateContent": JsonResponse(
content_type="application/json",
body={
"candidates": [
{
"content": {"parts": [{"text": "scripted answer 9c1d4e7a2b60"}], "role": "model"},
"finishReason": "STOP",
"index": 0,
}
],
"usageMetadata": {
"promptTokenCount": 1536,
"candidatesTokenCount": 40,
"totalTokenCount": 1576,
"cachedContentTokenCount": 1280,
"promptTokensDetails": [{"modality": "TEXT", "tokenCount": 1536}],
},
"modelVersion": "gemini-3.1-pro",
},
),
},
),
expected=ExactExpected(
spend=0.003808,
input_cost=0.003328,
output_cost=0.00048,
cache_read_cost=0.000256,
cache_creation_cost=0.00256,
prompt_tokens=2816,
completion_tokens=40,
),
)
CASES: Final[tuple[CostTrackingTestCase, ...]] = (
GEMINI_GEMINI_3_1_PRO_INPUT_TEXT,
GEMINI_GEMINI_3_1_PRO_CACHE_READ,
GEMINI_GEMINI_3_1_PRO_AUDIO_INPUT,
GEMINI_GEMINI_3_1_PRO_IMAGE_INPUT,
GEMINI_GEMINI_3_1_PRO_VIDEO_INPUT,
GEMINI_GEMINI_3_1_PRO_REASONING,
GEMINI_GEMINI_3_1_PRO_TIERED_INPUT_ABOVE_200K,
GEMINI_GEMINI_3_1_PRO_TIERED_CACHE_READ_ABOVE_200K,
GEMINI_GEMINI_3_1_PRO_SERVICE_TIER_FLEX,
GEMINI_GEMINI_3_1_PRO_SERVICE_TIER_PRIORITY,
GEMINI_GEMINI_3_1_PRO_WEB_SEARCH_MEDIUM,
GEMINI_GEMINI_3_1_PRO_GOOGLE_MAPS_GROUNDING,
GEMINI_GEMINI_3_1_PRO_STREAM,
GEMINI_GEMINI_3_1_PRO_STREAM_NO_USAGE,
GEMINI_GEMINI_3_1_PRO_STREAM_NO_USAGE_TOOL_CALL,
GEMINI_GEMINI_3_1_PRO_STREAM_NO_USAGE_IMAGE_INPUT,
GEMINI_GEMINI_3_1_PRO_PROMPT_BLOCKED,
GEMINI_GEMINI_3_1_PRO_STREAM_PROMPT_BLOCKED,
GEMINI_GEMINI_3_1_PRO_RESPONSE_MODEL_OVERRIDE,
GEMINI_GEMINI_3_1_PRO_STREAM_RESPONSE_MODEL_OVERRIDE,
GEMINI_GEMINI_3_1_PRO_TOOL_CALL,
GEMINI_GEMINI_3_1_PRO_STREAM_TOOL_CALL,
GEMINI_GEMINI_3_1_PRO_STREAM_FULL_USAGE,
GEMINI_GEMINI_3_8_FLASH_INPUT_TEXT,
GEMINI_GEMINI_3_8_FLASH_CACHE_READ,
GEMINI_GEMINI_3_8_FLASH_AUDIO_INPUT,
GEMINI_GEMINI_3_8_FLASH_AUDIO_OUTPUT,
GEMINI_GEMINI_3_8_FLASH_IMAGE_INPUT,
GEMINI_GEMINI_3_8_FLASH_VIDEO_INPUT,
GEMINI_GEMINI_3_8_FLASH_REASONING,
GEMINI_GEMINI_3_8_FLASH_SERVICE_TIER_FLEX,
GEMINI_GEMINI_3_8_FLASH_SERVICE_TIER_PRIORITY,
GEMINI_GEMINI_3_8_FLASH_WEB_SEARCH_PER_PROMPT,
GEMINI_GEMINI_3_8_FLASH_GOOGLE_MAPS_GROUNDING,
GEMINI_GEMINI_3_8_FLASH_STREAM,
GEMINI_GEMINI_3_8_FLASH_STREAM_NO_USAGE,
GEMINI_GEMINI_3_8_FLASH_STREAM_NO_USAGE_TOOL_CALL,
GEMINI_GEMINI_3_8_FLASH_STREAM_NO_USAGE_IMAGE_INPUT,
GEMINI_GEMINI_3_8_FLASH_PROMPT_BLOCKED,
GEMINI_GEMINI_3_8_FLASH_STREAM_PROMPT_BLOCKED,
GEMINI_GEMINI_3_8_FLASH_RESPONSE_MODEL_OVERRIDE,
GEMINI_GEMINI_3_8_FLASH_STREAM_RESPONSE_MODEL_OVERRIDE,
GEMINI_GEMINI_3_8_FLASH_TOOL_CALL,
GEMINI_GEMINI_3_8_FLASH_STREAM_TOOL_CALL,
GEMINI_GEMINI_3_8_FLASH_STREAM_FULL_USAGE,
GEMINI_EMBEDDINGS_002,
GEMINI_3_1_PRO_PASSTHROUGH_GENERATE_CONTENT_PRICED_VIA_GEMINI_KEY,
GEMINI_GEMINI_3_8_FLASH_LITE_INPUT_BELOW_128K,
GEMINI_GEMINI_3_8_FLASH_LITE_INPUT_ABOVE_128K,
GEMINI_NANO_BANANA_2_1_INPUT_TEXT,
GEMINI_NANO_BANANA_2_1_IMAGE_INPUT,
GEMINI_NANO_BANANA_2_1_OUTPUT_TEXT,
GEMINI_NANO_BANANA_2_1_REASONING,
GEMINI_NANO_BANANA_2_1_IMAGE_OUTPUT_1K,
GEMINI_NANO_BANANA_2_1_IMAGE_OUTPUT_2K,
GEMINI_NANO_BANANA_2_1_IMAGE_OUTPUT_4K,
GEMINI_NANO_BANANA_2_1_MIXED_TEXT_IMAGE_OUTPUT,
GEMINI_NANO_BANANA_2_1_WEB_SEARCH_SINGLE_QUERY,
GEMINI_NANO_BANANA_2_1_WEB_SEARCH_MULTIPLE_QUERIES,
GEMINI_GEMINI_3_1_PRO_CACHE_CREATION,
)
PARITY: Final[tuple[StreamParityTestCase, ...]] = (
StreamParityTestCase(plain=GEMINI_GEMINI_3_1_PRO_INPUT_TEXT, streamed=GEMINI_GEMINI_3_1_PRO_STREAM),
StreamParityTestCase(
plain=GEMINI_GEMINI_3_1_PRO_PROMPT_BLOCKED, streamed=GEMINI_GEMINI_3_1_PRO_STREAM_PROMPT_BLOCKED
),
StreamParityTestCase(
plain=GEMINI_GEMINI_3_1_PRO_RESPONSE_MODEL_OVERRIDE,
streamed=GEMINI_GEMINI_3_1_PRO_STREAM_RESPONSE_MODEL_OVERRIDE,
),
StreamParityTestCase(plain=GEMINI_GEMINI_3_1_PRO_TOOL_CALL, streamed=GEMINI_GEMINI_3_1_PRO_STREAM_TOOL_CALL),
StreamParityTestCase(plain=GEMINI_GEMINI_3_8_FLASH_INPUT_TEXT, streamed=GEMINI_GEMINI_3_8_FLASH_STREAM),
StreamParityTestCase(
plain=GEMINI_GEMINI_3_8_FLASH_PROMPT_BLOCKED, streamed=GEMINI_GEMINI_3_8_FLASH_STREAM_PROMPT_BLOCKED
),
StreamParityTestCase(
plain=GEMINI_GEMINI_3_8_FLASH_RESPONSE_MODEL_OVERRIDE,
streamed=GEMINI_GEMINI_3_8_FLASH_STREAM_RESPONSE_MODEL_OVERRIDE,
),
StreamParityTestCase(plain=GEMINI_GEMINI_3_8_FLASH_TOOL_CALL, streamed=GEMINI_GEMINI_3_8_FLASH_STREAM_TOOL_CALL),
)