Skip to content

feat(google-vertex): update model YAMLs [bot]#1113

Merged
harshiv-26 merged 3 commits into
mainfrom
bot/update-google-vertex-20260520-023247
May 21, 2026
Merged

feat(google-vertex): update model YAMLs [bot]#1113
harshiv-26 merged 3 commits into
mainfrom
bot/update-google-vertex-20260520-023247

Conversation

@models-bot
Copy link
Copy Markdown
Contributor

@models-bot models-bot Bot commented May 20, 2026

Auto-generated by poc-agent for provider google-vertex.


Note

Medium Risk
Primarily data/config changes, but updates to per-token/per-second pricing, limits, and deprecation flags can affect downstream cost estimation and model availability selection.

Overview
Refreshes Google Vertex model YAML metadata across multiple providers, updating pricing fields (including new cache_creation_input_token_cost_per_hour and additional regional cost entries) and capability flags (e.g., parallel_function_calling, system_messages, structured_output, modality support such as pdf/code/image inputs).

Adds/adjusts lifecycle and limits metadata (new deprecationDate/isDeprecated/status changes like text-embedding-004 to retired and gemini-2.5-flash-lite-preview-09-2025 deprecated, plus token/output limit tweaks), and expands sources/provisioning/supportedModes for several models.

Reviewed by Cursor Bugbot for commit b6858ce. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions
Copy link
Copy Markdown
Contributor

/test-models

Comment thread providers/google-vertex/google/gemini-3.1-flash-lite-preview.yaml
Comment thread providers/google-vertex/gemini-2.5-flash-lite-preview-09-2025.yaml Outdated
@harshiv-26
Copy link
Copy Markdown
Collaborator

Gateway test results

  • Total: 248
  • Passed: 231
  • Failed: 0
  • Validation failed: 6
  • Errored: 0
  • Skipped: 11
  • Success rate: 97.47%
Provider Model Scenarios
google-vertex anthropic/claude-haiku-4-5 success: tool-call, tool-call:stream, params, params:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-haiku-4-5@20251001 success: reasoning, tool-call, params, structured-output, structured-output:stream, tool-call:stream, params:stream, reasoning:stream
google-vertex anthropic/claude-opus-4 success: tool-call, tool-call:stream, params:stream, params, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-1 success: params, tool-call:stream, parallel-tool-call:stream, params:stream, tool-call, parallel-tool-call, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-1@20250805 success: tool-call, tool-call:stream, params, params:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-5 success: structured-output:stream, params:stream, tool-call:stream, tool-call, structured-output, params, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-5@20251101 success: tool-call:stream, tool-call, parallel-tool-call:stream, parallel-tool-call, structured-output:stream, structured-output, params, params:stream, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-6 success: tool-call, structured-output:stream, structured-output, tool-call:stream, params:stream, params, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-6@default success: structured-output, tool-call:stream, parallel-tool-call, params, structured-output:stream, parallel-tool-call:stream, params:stream, tool-call, reasoning, reasoning:stream
google-vertex anthropic/claude-sonnet-4-5 success: tool-call, tool-call:stream, structured-output, params:stream, structured-output:stream, params, reasoning:stream, reasoning
google-vertex anthropic/claude-sonnet-4-5@20250929 success: tool-call, params:stream, structured-output:stream, tool-call:stream, params, structured-output, reasoning:stream, reasoning
google-vertex anthropic/claude-sonnet-4-6 success: structured-output, structured-output:stream, params, tool-call, tool-call:stream, params:stream, parallel-tool-call, parallel-tool-call:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-sonnet-4-6@default success: params:stream, tool-call, params, structured-output:stream, parallel-tool-call:stream, parallel-tool-call, structured-output, tool-call:stream, reasoning, reasoning:stream
google-vertex gemini-2.5-flash-lite success: structured-output, parallel-tool-call:stream, tool-call, tool-call:stream, params:stream, params, parallel-tool-call, structured-output:stream, tool-call:stream:google-genai, reasoning:stream, tool-call:google-genai, params:google-genai, parallel-tool-call:stream:google-genai, structured-output:google-genai, parallel-tool-call:google-genai, params:stream:google-genai, reasoning, structured-output:stream:google-genai, reasoning:google-genai, reasoning:stream:google-genai
google-vertex gemini-2.5-flash-lite-preview-09-2025 skipped: skip-check
google-vertex gemini-2.5-flash-tts success: params
google-vertex gemini-2.5-pro success: tool-call, tool-call:stream, structured-output:stream, params, params:stream, structured-output, params:google-genai, tool-call:stream:google-genai, structured-output:stream:google-genai, params:stream:google-genai, structured-output:google-genai, tool-call:google-genai, reasoning, reasoning:stream, reasoning:google-genai, reasoning:stream:google-genai
google-vertex gemini-3-pro-image-preview skipped: skip-check
google-vertex gemini-3.1-flash-lite-preview success: structured-output:stream, tool-call, json-output, params:stream, structured-output, tool-call:stream, json-output:stream, params, reasoning:stream, params:stream:google-genai, json-output:stream:google-genai, json-output:google-genai, structured-output:google-genai, structured-output:stream:google-genai, tool-call:google-genai, params:google-genai, tool-call:stream:google-genai, reasoning, reasoning:stream:google-genai, reasoning:google-genai
google-vertex google/automl-vision-image-object-detection skipped: skip-check
google-vertex google/gemini-2.5-flash-image success: params, params:stream, params:stream:google-genai, params:google-genai
google-vertex google/gemini-3-pro-image-preview success: params, params:stream, params:stream:google-genai, params:google-genai, reasoning, reasoning:stream:google-genai, reasoning:stream, reasoning:google-genai
google-vertex google/gemini-3.1-flash-image-preview success: params:stream, params, params:google-genai, reasoning:stream, params:stream:google-genai, reasoning

validation_failure: reasoning:google-genai, reasoning:stream:google-genai
google-vertex google/gemini-3.1-flash-lite-preview success: tool-call:stream, tool-call, structured-output:stream, json-output:stream, json-output, structured-output, params, params:stream, json-output:stream:google-genai, json-output:google-genai, structured-output:stream:google-genai, tool-call:stream:google-genai, reasoning:stream, tool-call:google-genai, reasoning, params:google-genai, structured-output:google-genai, params:stream:google-genai, reasoning:stream:google-genai, reasoning:google-genai
google-vertex google/gemini-embedding-2-preview success: params
google-vertex google/gemma4 skipped: skip-check
google-vertex google/object-detector skipped: skip-check
google-vertex google/people-blur skipped: skip-check
google-vertex google/translate-llm skipped: skip-check
google-vertex google/veo-3.0-fast-generate-001 skipped: skip-check
google-vertex imagen-4.0-generate-001 skipped: skip-check
google-vertex imagen-4.0-ultra-generate-001 skipped: skip-check
google-vertex meta/llama-3.3-70b-instruct-maas success: structured-output, tool-call:stream, tool-call, params:stream, structured-output:stream, params
google-vertex meta/llama-4-scout-17b-16e-instruct-maas success: params:stream, params

validation_failure: structured-output:stream, tool-call, tool-call:stream, structured-output
google-vertex mistralai/codestral-2 success: tool-call:stream, tool-call, structured-output, params:stream, params, structured-output:stream
google-vertex openai/gpt-oss-120b-maas success: tool-call, params:stream, tool-call:stream, params, structured-output, structured-output:stream, reasoning, reasoning:stream
google-vertex qwen/qwen3-coder-480b-a35b-instruct-maas success: tool-call, params, tool-call:stream, params:stream, structured-output, structured-output:stream
google-vertex text-embedding-004 skipped: skip-check
google-vertex text-embedding-005 success: params
Failures (6)

google-vertex/google/gemini-3.1-flash-image-preview — reasoning:google-genai (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpdfqtktsk/snippet.py", line 67, in <module>
    raise Exception("VALIDATION FAILED: reasoning - no thinking information in GenAI response")
Exception: VALIDATION FAILED: reasoning - no thinking information in GenAI response
Code snippet
from google import genai
from google.genai import types

_endpoint = "https://internal.devtest.truefoundry.tech/api/llm"
_api_key = "***"
_full_model = "test-v2-vertex/google/gemini-3.1-flash-image-preview"

_parts = _full_model.split("/")
_provider_account = _parts[0]
_model_id = "/".join(_parts[1:])
if "/" in _model_id:
    _model_id = _model_id.rsplit("/", 1)[-1]

_base_url = f"{_endpoint}/gemini/{_provider_account}/proxy"

client = genai.Client(
    api_key=_api_key,
    http_options=types.HttpOptions(base_url=_base_url),
)

contents = [
    types.Content(role="user", parts=[types.Part.from_text(text="Hi")]),
    types.Content(role="model", parts=[types.Part.from_text(text="Hi, how can I help you")]),
    types.Content(role="user", parts=[types.Part.from_text(text="How to calculate 3^3^3^3? Think step by step and show all reasoning.")]),
]

config = types.GenerateContentConfig(
    system_instruction="You are a helpful assistant. You MUST think step by step and show your reasoning. Never skip reasoning steps.",
    thinking_config=types.ThinkingConfig(
        include_thoughts=True,
        thinking_budget=5000,
    ),
)

response = client.models.generate_content(
    model=_model_id,
    contents=contents,
    config=config,
)

for part in response.candidates[0].content.parts:
    if not part.text:
        continue
    if part.thought:
        print(f"[Thinking] {part.text}")
    else:
        print(part.text)

_parts = response.candidates[0].content.parts
_thought_detected = False

for _part in _parts:
    if not _part.text:
        continue
    if _part.thought:
        _thought_detected = True
        print(f"Thinking: {_part.text[:200]}...")
    else:
        print(_part.text)

_usage = getattr(response, "usage_metadata", None)
if _usage and getattr(_usage, "thoughts_token_count", 0):
    _thought_detected = True

if not _thought_detected:
    print("Response: ", response)
    raise Exception("VALIDATION FAILED: reasoning - no thinking information in GenAI response")
print("VALIDATION: reasoning SUCCESS")

google-vertex/google/gemini-3.1-flash-image-preview — reasoning:stream:google-genai (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmp4hcvr6i0/snippet.py", line 70, in <module>
    raise Exception("VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream")
Exception: VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream
Code snippet
from google import genai
from google.genai import types

_endpoint = "https://internal.devtest.truefoundry.tech/api/llm"
_api_key = "***"
_full_model = "test-v2-vertex/google/gemini-3.1-flash-image-preview"

_parts = _full_model.split("/")
_provider_account = _parts[0]
_model_id = "/".join(_parts[1:])
if "/" in _model_id:
    _model_id = _model_id.rsplit("/", 1)[-1]

_base_url = f"{_endpoint}/gemini/{_provider_account}/proxy"

client = genai.Client(
    api_key=_api_key,
    http_options=types.HttpOptions(base_url=_base_url),
)

contents = [
    types.Content(role="user", parts=[types.Part.from_text(text="Hi")]),
    types.Content(role="model", parts=[types.Part.from_text(text="Hi, how can I help you")]),
    types.Content(role="user", parts=[types.Part.from_text(text="How to calculate 3^3^3^3? Think step by step and show all reasoning.")]),
]

config = types.GenerateContentConfig(
    system_instruction="You are a helpful assistant. You MUST think step by step and show your reasoning. Never skip reasoning steps.",
    thinking_config=types.ThinkingConfig(
        include_thoughts=True,
        thinking_budget=5000,
    ),
)

_chunks = []
for chunk in client.models.generate_content_stream(
    model=_model_id,
    contents=contents,
    config=config,
):
    _chunks.append(chunk)
    if chunk.candidates and chunk.candidates[0].content and chunk.candidates[0].content.parts:
        for part in chunk.candidates[0].content.parts:
            if not part.text:
                continue
            if part.thought:
                print(f"[Thinking] {part.text}", end="", flush=True)
            else:
                print(part.text, end="", flush=True)

_thought_detected = False
for _chunk in _chunks:
    if not _chunk.candidates or not _chunk.candidates[0].content:
        continue
    for _part in _chunk.candidates[0].content.parts:
        if not _part.text:
            continue
        if _part.thought:
            _thought_detected = True
            print(_part.text, end="", flush=True)
        else:
            print(_part.text, end="", flush=True)

if not _thought_detected:
    _usage = getattr(_chunks[-1], "usage_metadata", None) if _chunks else None
    if _usage and getattr(_usage, "thoughts_token_count", 0):
        _thought_detected = True

if not _thought_detected:
    raise Exception("VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream")
print("\nVALIDATION: reasoning stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — structured-output:stream (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmp4mf8hivh/snippet.py", line 44, in <module>
    raise Exception("VALIDATION FAILED: structured-output stream - no content received")
Exception: VALIDATION FAILED: structured-output stream - no content received
Code snippet
from openai import OpenAI
import json

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

response_schema = json.loads('''{
  "title": "CalendarEvent",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "date": { "type": "string" },
    "participants": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["name", "date", "participants"],
  "additionalProperties": false
}''')

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "Extract the event information as JSON."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday. Extract the event details as JSON."},
    ],
    response_format={"type": "json_schema", "json_schema": {"name": "CalendarEvent", "schema": response_schema}},
    stream=True,
)

import json as _json

_accumulated = ""
for chunk in response:
    if chunk.choices and len(chunk.choices) > 0:
        delta = chunk.choices[0].delta
        if delta.content is not None:
            _accumulated += delta.content
            print(delta.content, end="", flush=True)

if not _accumulated:
    raise Exception("VALIDATION FAILED: structured-output stream - no content received")

_parsed = _json.loads(_accumulated)

if "name" not in _parsed or "date" not in _parsed or "participants" not in _parsed:
    raise Exception("VALIDATION FAILED: structured-output stream - missing expected fields (name, date, participants)")

if not isinstance(_parsed.get("participants"), list):
    raise Exception("VALIDATION FAILED: structured-output stream - 'participants' is not a list, schema not enforced")

if set(_parsed.keys()) != {"name", "date", "participants"}:
    raise Exception(
        f"VALIDATION FAILED: structured-output stream - unexpected keys present: {set(_parsed.keys())}"
    )

print("\nVALIDATION: structured-output stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — tool-call (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpyjngfeh1/snippet.py", line 49, in <module>
    raise Exception("VALIDATION FAILED: tool-call - no tool calls in response")
Exception: VALIDATION FAILED: tool-call - no tool calls in response
Code snippet
from openai import OpenAI

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a location.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city name, e.g. London",
                    },
                },
                "required": ["location"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    },
]

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "You are a helpful assistant with access to tools. You MUST strictly use the provided tools to answer. Never respond with plain text when a tool is available."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Use the get_weather tool to check the weather in London. You must call the tool, do not respond with plain text."},
    ],
    tools=tools,
    tool_choice="auto",
    stream=False,
)

_message = response.choices[0].message
if _message.tool_calls:
    for _tc in _message.tool_calls:
        print(f"Function: {_tc.function.name}")
        print(f"Arguments: {_tc.function.arguments}")
else:
    print(_message.content)

if not _message.tool_calls or len(_message.tool_calls) == 0:
    raise Exception("VALIDATION FAILED: tool-call - no tool calls in response")
print("VALIDATION: tool-call SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — tool-call:stream (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpg8xft_fk/snippet.py", line 53, in <module>
    raise Exception("VALIDATION FAILED: tool-call stream - no tool calls received")
Exception: VALIDATION FAILED: tool-call stream - no tool calls received
Code snippet
from openai import OpenAI

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a location.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city name, e.g. London",
                    },
                },
                "required": ["location"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    },
]

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "You are a helpful assistant with access to tools. You MUST strictly use the provided tools to answer. Never respond with plain text when a tool is available."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Use the get_weather tool to check the weather in London. You must call the tool, do not respond with plain text."},
    ],
    tools=tools,
    tool_choice="auto",
    stream=True,
)

_tool_calls_made = False
for chunk in response:
    if chunk.choices and len(chunk.choices) > 0:
        delta = chunk.choices[0].delta
        if delta.content is not None:
            print(delta.content, end="", flush=True)
        if delta.tool_calls:
            _tool_calls_made = True
            for _tc in delta.tool_calls:
                if _tc.function:
                    print(_tc.function.arguments or "", end="", flush=True)

if not _tool_calls_made:
    raise Exception("VALIDATION FAILED: tool-call stream - no tool calls received")
print("\nVALIDATION: tool-call stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — structured-output (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpzlm59czx/snippet.py", line 39, in <module>
    raise Exception("VALIDATION FAILED: structured-output - response content is empty")
Exception: VALIDATION FAILED: structured-output - response content is empty
Code snippet
from openai import OpenAI
import json

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

response_schema = json.loads('''{
  "title": "CalendarEvent",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "date": { "type": "string" },
    "participants": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["name", "date", "participants"],
  "additionalProperties": false
}''')

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "Extract the event information as JSON."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday. Extract the event details as JSON."},
    ],
    response_format={"type": "json_schema", "json_schema": {"name": "CalendarEvent", "schema": response_schema}},
    stream=False,
)

import json as _json

_content = response.choices[0].message.content
print(_content)

if not _content:
    raise Exception("VALIDATION FAILED: structured-output - response content is empty")

_parsed = _json.loads(_content)

if "name" not in _parsed or "date" not in _parsed or "participants" not in _parsed:
    raise Exception("VALIDATION FAILED: structured-output - missing expected fields (name, date, participants)")

if not isinstance(_parsed.get("participants"), list):
    raise Exception("VALIDATION FAILED: structured-output - 'participants' is not a list, schema not enforced")

if set(_parsed.keys()) != {"name", "date", "participants"}:
    raise Exception(
        f"VALIDATION FAILED: structured-output - unexpected keys present: {set(_parsed.keys())}"
    )

print("VALIDATION: structured-output SUCCESS")
Skipped (11)

google-vertex/gemini-2.5-flash-lite-preview-09-2025 — skip-check (skipped)

Skip reason:

deprecated or retired model

google-vertex/gemini-3-pro-image-preview — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/google/automl-vision-image-object-detection — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/google/gemma4 — skip-check (skipped)

Skip reason:

Provisioned model

google-vertex/google/object-detector — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/google/people-blur — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/google/translate-llm — skip-check (skipped)

Skip reason:

Provisioned model

google-vertex/google/veo-3.0-fast-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/imagen-4.0-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/imagen-4.0-ultra-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/text-embedding-004 — skip-check (skipped)

Skip reason:

deprecated or retired model

@github-actions
Copy link
Copy Markdown
Contributor

/test-models

@harshiv-26 harshiv-26 enabled auto-merge (squash) May 21, 2026 06:04
@github-actions
Copy link
Copy Markdown
Contributor

/test-models

@harshiv-26
Copy link
Copy Markdown
Collaborator

Gateway test results

  • Total: 247
  • Passed: 231
  • Failed: 0
  • Validation failed: 6
  • Errored: 0
  • Skipped: 10
  • Success rate: 97.47%
Provider Model Scenarios
google-vertex anthropic/claude-haiku-4-5 success: tool-call:stream, params, tool-call, params:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-haiku-4-5@20251001 success: structured-output, tool-call, reasoning:stream, params, tool-call:stream, params:stream, structured-output:stream, reasoning
google-vertex anthropic/claude-opus-4 success: params, tool-call, tool-call:stream, params:stream, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-1 success: params:stream, params, parallel-tool-call:stream, parallel-tool-call, tool-call:stream, tool-call, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-1@20250805 success: params, params:stream, tool-call:stream, tool-call, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-5 success: tool-call, tool-call:stream, structured-output, params, params:stream, structured-output:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-5@20251101 success: parallel-tool-call:stream, structured-output, parallel-tool-call, tool-call:stream, params, params:stream, structured-output:stream, tool-call, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-6 success: tool-call, params, tool-call:stream, structured-output:stream, params:stream, structured-output, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-6@default success: params:stream, parallel-tool-call:stream, structured-output:stream, parallel-tool-call, structured-output, tool-call:stream, tool-call, params, reasoning, reasoning:stream
google-vertex anthropic/claude-sonnet-4-5 success: structured-output, structured-output:stream, params, params:stream, tool-call, tool-call:stream, reasoning, reasoning:stream
google-vertex anthropic/claude-sonnet-4-5@20250929 success: params:stream, tool-call, structured-output, tool-call:stream, params, structured-output:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-sonnet-4-6 success: parallel-tool-call:stream, params:stream, structured-output:stream, tool-call, tool-call:stream, structured-output, parallel-tool-call, params, reasoning, reasoning:stream
google-vertex anthropic/claude-sonnet-4-6@default success: structured-output, tool-call, tool-call:stream, parallel-tool-call:stream, structured-output:stream, parallel-tool-call, params, params:stream, reasoning, reasoning:stream
google-vertex gemini-2.5-flash-lite success: structured-output:stream, parallel-tool-call, tool-call, params, structured-output, parallel-tool-call:stream, params:stream, tool-call:stream, reasoning:stream, reasoning, structured-output:google-genai, parallel-tool-call:stream:google-genai, structured-output:stream:google-genai, params:stream:google-genai, parallel-tool-call:google-genai, params:google-genai, tool-call:google-genai, tool-call:stream:google-genai, reasoning:google-genai, reasoning:stream:google-genai
google-vertex gemini-2.5-flash-lite-preview-09-2025 skipped: skip-check
google-vertex gemini-2.5-flash-tts success: params
google-vertex gemini-2.5-pro success: tool-call, tool-call:stream, params, structured-output, params:stream, structured-output:stream, structured-output:stream:google-genai, tool-call:stream:google-genai, params:google-genai, tool-call:google-genai, params:stream:google-genai, structured-output:google-genai, reasoning, reasoning:stream, reasoning:google-genai, reasoning:stream:google-genai
google-vertex gemini-3-pro-image-preview skipped: skip-check
google-vertex gemini-3.1-flash-lite-preview success: tool-call, json-output, tool-call:stream, params, json-output:stream, structured-output, structured-output:stream, reasoning:stream, reasoning, params:google-genai, tool-call:stream:google-genai, tool-call:google-genai, structured-output:stream:google-genai, json-output:google-genai, structured-output:google-genai, json-output:stream:google-genai, params:stream:google-genai, reasoning:stream:google-genai, reasoning:google-genai, params:stream
google-vertex google/automl-vision-image-object-detection skipped: skip-check
google-vertex google/gemini-2.5-flash-image success: params, params:stream, params:google-genai, params:stream:google-genai
google-vertex google/gemini-3-pro-image-preview success: params, params:stream, params:stream:google-genai, params:google-genai, reasoning, reasoning:stream, reasoning:google-genai, reasoning:stream:google-genai
google-vertex google/gemini-3.1-flash-image-preview success: params:stream, params, params:google-genai, reasoning, reasoning:stream, params:stream:google-genai

validation_failure: reasoning:google-genai, reasoning:stream:google-genai
google-vertex google/gemini-3.1-flash-lite-preview success: tool-call, tool-call:stream, json-output, params, structured-output:stream, json-output:stream, params:stream, structured-output, reasoning:stream, reasoning, json-output:google-genai, structured-output:google-genai, json-output:stream:google-genai, structured-output:stream:google-genai, params:google-genai, tool-call:stream:google-genai, tool-call:google-genai, params:stream:google-genai, reasoning:stream:google-genai, reasoning:google-genai
google-vertex google/gemini-embedding-2-preview success: params
google-vertex google/gemma4 skipped: skip-check
google-vertex google/object-detector skipped: skip-check
google-vertex google/people-blur skipped: skip-check
google-vertex google/veo-3.0-fast-generate-001 skipped: skip-check
google-vertex imagen-4.0-generate-001 skipped: skip-check
google-vertex imagen-4.0-ultra-generate-001 skipped: skip-check
google-vertex meta/llama-3.3-70b-instruct-maas success: params:stream, tool-call, tool-call:stream, structured-output, structured-output:stream, params
google-vertex meta/llama-4-scout-17b-16e-instruct-maas success: params, params:stream

validation_failure: tool-call:stream, tool-call, structured-output:stream, structured-output
google-vertex mistralai/codestral-2 success: tool-call:stream, tool-call, params, structured-output:stream, params:stream, structured-output
google-vertex openai/gpt-oss-120b-maas success: tool-call, params, params:stream, structured-output, tool-call:stream, structured-output:stream, reasoning, reasoning:stream
google-vertex qwen/qwen3-coder-480b-a35b-instruct-maas success: tool-call:stream, params, tool-call, structured-output, structured-output:stream, params:stream
google-vertex text-embedding-004 skipped: skip-check
google-vertex text-embedding-005 success: params
Failures (6)

google-vertex/google/gemini-3.1-flash-image-preview — reasoning:google-genai (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpeny9vy2g/snippet.py", line 67, in <module>
    raise Exception("VALIDATION FAILED: reasoning - no thinking information in GenAI response")
Exception: VALIDATION FAILED: reasoning - no thinking information in GenAI response
Code snippet
from google import genai
from google.genai import types

_endpoint = "https://internal.devtest.truefoundry.tech/api/llm"
_api_key = "***"
_full_model = "test-v2-vertex/google/gemini-3.1-flash-image-preview"

_parts = _full_model.split("/")
_provider_account = _parts[0]
_model_id = "/".join(_parts[1:])
if "/" in _model_id:
    _model_id = _model_id.rsplit("/", 1)[-1]

_base_url = f"{_endpoint}/gemini/{_provider_account}/proxy"

client = genai.Client(
    api_key=_api_key,
    http_options=types.HttpOptions(base_url=_base_url),
)

contents = [
    types.Content(role="user", parts=[types.Part.from_text(text="Hi")]),
    types.Content(role="model", parts=[types.Part.from_text(text="Hi, how can I help you")]),
    types.Content(role="user", parts=[types.Part.from_text(text="How to calculate 3^3^3^3? Think step by step and show all reasoning.")]),
]

config = types.GenerateContentConfig(
    system_instruction="You are a helpful assistant. You MUST think step by step and show your reasoning. Never skip reasoning steps.",
    thinking_config=types.ThinkingConfig(
        include_thoughts=True,
        thinking_budget=5000,
    ),
)

response = client.models.generate_content(
    model=_model_id,
    contents=contents,
    config=config,
)

for part in response.candidates[0].content.parts:
    if not part.text:
        continue
    if part.thought:
        print(f"[Thinking] {part.text}")
    else:
        print(part.text)

_parts = response.candidates[0].content.parts
_thought_detected = False

for _part in _parts:
    if not _part.text:
        continue
    if _part.thought:
        _thought_detected = True
        print(f"Thinking: {_part.text[:200]}...")
    else:
        print(_part.text)

_usage = getattr(response, "usage_metadata", None)
if _usage and getattr(_usage, "thoughts_token_count", 0):
    _thought_detected = True

if not _thought_detected:
    print("Response: ", response)
    raise Exception("VALIDATION FAILED: reasoning - no thinking information in GenAI response")
print("VALIDATION: reasoning SUCCESS")

google-vertex/google/gemini-3.1-flash-image-preview — reasoning:stream:google-genai (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpar1xck0o/snippet.py", line 70, in <module>
    raise Exception("VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream")
Exception: VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream
Code snippet
from google import genai
from google.genai import types

_endpoint = "https://internal.devtest.truefoundry.tech/api/llm"
_api_key = "***"
_full_model = "test-v2-vertex/google/gemini-3.1-flash-image-preview"

_parts = _full_model.split("/")
_provider_account = _parts[0]
_model_id = "/".join(_parts[1:])
if "/" in _model_id:
    _model_id = _model_id.rsplit("/", 1)[-1]

_base_url = f"{_endpoint}/gemini/{_provider_account}/proxy"

client = genai.Client(
    api_key=_api_key,
    http_options=types.HttpOptions(base_url=_base_url),
)

contents = [
    types.Content(role="user", parts=[types.Part.from_text(text="Hi")]),
    types.Content(role="model", parts=[types.Part.from_text(text="Hi, how can I help you")]),
    types.Content(role="user", parts=[types.Part.from_text(text="How to calculate 3^3^3^3? Think step by step and show all reasoning.")]),
]

config = types.GenerateContentConfig(
    system_instruction="You are a helpful assistant. You MUST think step by step and show your reasoning. Never skip reasoning steps.",
    thinking_config=types.ThinkingConfig(
        include_thoughts=True,
        thinking_budget=5000,
    ),
)

_chunks = []
for chunk in client.models.generate_content_stream(
    model=_model_id,
    contents=contents,
    config=config,
):
    _chunks.append(chunk)
    if chunk.candidates and chunk.candidates[0].content and chunk.candidates[0].content.parts:
        for part in chunk.candidates[0].content.parts:
            if not part.text:
                continue
            if part.thought:
                print(f"[Thinking] {part.text}", end="", flush=True)
            else:
                print(part.text, end="", flush=True)

_thought_detected = False
for _chunk in _chunks:
    if not _chunk.candidates or not _chunk.candidates[0].content:
        continue
    for _part in _chunk.candidates[0].content.parts:
        if not _part.text:
            continue
        if _part.thought:
            _thought_detected = True
            print(_part.text, end="", flush=True)
        else:
            print(_part.text, end="", flush=True)

if not _thought_detected:
    _usage = getattr(_chunks[-1], "usage_metadata", None) if _chunks else None
    if _usage and getattr(_usage, "thoughts_token_count", 0):
        _thought_detected = True

if not _thought_detected:
    raise Exception("VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream")
print("\nVALIDATION: reasoning stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — tool-call:stream (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpggvv1xk2/snippet.py", line 53, in <module>
    raise Exception("VALIDATION FAILED: tool-call stream - no tool calls received")
Exception: VALIDATION FAILED: tool-call stream - no tool calls received
Code snippet
from openai import OpenAI

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a location.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city name, e.g. London",
                    },
                },
                "required": ["location"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    },
]

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "You are a helpful assistant with access to tools. You MUST strictly use the provided tools to answer. Never respond with plain text when a tool is available."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Use the get_weather tool to check the weather in London. You must call the tool, do not respond with plain text."},
    ],
    tools=tools,
    tool_choice="auto",
    stream=True,
)

_tool_calls_made = False
for chunk in response:
    if chunk.choices and len(chunk.choices) > 0:
        delta = chunk.choices[0].delta
        if delta.content is not None:
            print(delta.content, end="", flush=True)
        if delta.tool_calls:
            _tool_calls_made = True
            for _tc in delta.tool_calls:
                if _tc.function:
                    print(_tc.function.arguments or "", end="", flush=True)

if not _tool_calls_made:
    raise Exception("VALIDATION FAILED: tool-call stream - no tool calls received")
print("\nVALIDATION: tool-call stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — tool-call (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpo9srdm53/snippet.py", line 49, in <module>
    raise Exception("VALIDATION FAILED: tool-call - no tool calls in response")
Exception: VALIDATION FAILED: tool-call - no tool calls in response
Code snippet
from openai import OpenAI

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a location.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city name, e.g. London",
                    },
                },
                "required": ["location"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    },
]

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "You are a helpful assistant with access to tools. You MUST strictly use the provided tools to answer. Never respond with plain text when a tool is available."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Use the get_weather tool to check the weather in London. You must call the tool, do not respond with plain text."},
    ],
    tools=tools,
    tool_choice="auto",
    stream=False,
)

_message = response.choices[0].message
if _message.tool_calls:
    for _tc in _message.tool_calls:
        print(f"Function: {_tc.function.name}")
        print(f"Arguments: {_tc.function.arguments}")
else:
    print(_message.content)

if not _message.tool_calls or len(_message.tool_calls) == 0:
    raise Exception("VALIDATION FAILED: tool-call - no tool calls in response")
print("VALIDATION: tool-call SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — structured-output:stream (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpoutmw691/snippet.py", line 44, in <module>
    raise Exception("VALIDATION FAILED: structured-output stream - no content received")
Exception: VALIDATION FAILED: structured-output stream - no content received
Code snippet
from openai import OpenAI
import json

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

response_schema = json.loads('''{
  "title": "CalendarEvent",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "date": { "type": "string" },
    "participants": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["name", "date", "participants"],
  "additionalProperties": false
}''')

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "Extract the event information as JSON."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday. Extract the event details as JSON."},
    ],
    response_format={"type": "json_schema", "json_schema": {"name": "CalendarEvent", "schema": response_schema}},
    stream=True,
)

import json as _json

_accumulated = ""
for chunk in response:
    if chunk.choices and len(chunk.choices) > 0:
        delta = chunk.choices[0].delta
        if delta.content is not None:
            _accumulated += delta.content
            print(delta.content, end="", flush=True)

if not _accumulated:
    raise Exception("VALIDATION FAILED: structured-output stream - no content received")

_parsed = _json.loads(_accumulated)

if "name" not in _parsed or "date" not in _parsed or "participants" not in _parsed:
    raise Exception("VALIDATION FAILED: structured-output stream - missing expected fields (name, date, participants)")

if not isinstance(_parsed.get("participants"), list):
    raise Exception("VALIDATION FAILED: structured-output stream - 'participants' is not a list, schema not enforced")

if set(_parsed.keys()) != {"name", "date", "participants"}:
    raise Exception(
        f"VALIDATION FAILED: structured-output stream - unexpected keys present: {set(_parsed.keys())}"
    )

print("\nVALIDATION: structured-output stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — structured-output (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmptudc_qkj/snippet.py", line 39, in <module>
    raise Exception("VALIDATION FAILED: structured-output - response content is empty")
Exception: VALIDATION FAILED: structured-output - response content is empty
Code snippet
from openai import OpenAI
import json

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

response_schema = json.loads('''{
  "title": "CalendarEvent",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "date": { "type": "string" },
    "participants": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["name", "date", "participants"],
  "additionalProperties": false
}''')

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "Extract the event information as JSON."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday. Extract the event details as JSON."},
    ],
    response_format={"type": "json_schema", "json_schema": {"name": "CalendarEvent", "schema": response_schema}},
    stream=False,
)

import json as _json

_content = response.choices[0].message.content
print(_content)

if not _content:
    raise Exception("VALIDATION FAILED: structured-output - response content is empty")

_parsed = _json.loads(_content)

if "name" not in _parsed or "date" not in _parsed or "participants" not in _parsed:
    raise Exception("VALIDATION FAILED: structured-output - missing expected fields (name, date, participants)")

if not isinstance(_parsed.get("participants"), list):
    raise Exception("VALIDATION FAILED: structured-output - 'participants' is not a list, schema not enforced")

if set(_parsed.keys()) != {"name", "date", "participants"}:
    raise Exception(
        f"VALIDATION FAILED: structured-output - unexpected keys present: {set(_parsed.keys())}"
    )

print("VALIDATION: structured-output SUCCESS")
Skipped (10)

google-vertex/gemini-2.5-flash-lite-preview-09-2025 — skip-check (skipped)

Skip reason:

deprecated or retired model

google-vertex/gemini-3-pro-image-preview — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/google/automl-vision-image-object-detection — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/google/gemma4 — skip-check (skipped)

Skip reason:

Provisioned model

google-vertex/google/object-detector — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/google/people-blur — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/google/veo-3.0-fast-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/imagen-4.0-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/imagen-4.0-ultra-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/text-embedding-004 — skip-check (skipped)

Skip reason:

deprecated or retired model

@harshiv-26
Copy link
Copy Markdown
Collaborator

Gateway test results

  • Total: 247
  • Passed: 229
  • Failed: 1
  • Validation failed: 7
  • Errored: 0
  • Skipped: 10
  • Success rate: 96.62%
Provider Model Scenarios
google-vertex anthropic/claude-haiku-4-5 success: tool-call, params, params:stream, tool-call:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-haiku-4-5@20251001 success: params:stream, reasoning, structured-output, params, structured-output:stream, tool-call, tool-call:stream, reasoning:stream
google-vertex anthropic/claude-opus-4 success: tool-call:stream, params, params:stream, tool-call, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-1 success: params:stream, parallel-tool-call:stream, tool-call, parallel-tool-call, tool-call:stream, params, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-1@20250805 success: tool-call, params:stream, params, tool-call:stream, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-5 success: params:stream, structured-output, tool-call, tool-call:stream, structured-output:stream, params, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-5@20251101 success: parallel-tool-call, parallel-tool-call:stream, tool-call, structured-output:stream, tool-call:stream, structured-output, params, params:stream, reasoning, reasoning:stream
google-vertex anthropic/claude-opus-4-6 success: tool-call:stream, structured-output:stream, params:stream, structured-output, tool-call, params, reasoning:stream, reasoning
google-vertex anthropic/claude-opus-4-6@default success: structured-output:stream, params, structured-output, tool-call, tool-call:stream, params:stream, parallel-tool-call:stream, parallel-tool-call, reasoning, reasoning:stream
google-vertex anthropic/claude-sonnet-4-5 success: params:stream, params, tool-call, structured-output, structured-output:stream, tool-call:stream, reasoning:stream, reasoning
google-vertex anthropic/claude-sonnet-4-5@20250929 success: tool-call, tool-call:stream, params, structured-output:stream, params:stream, structured-output, reasoning:stream, reasoning
google-vertex anthropic/claude-sonnet-4-6 success: tool-call:stream, parallel-tool-call:stream, parallel-tool-call, params:stream, tool-call, structured-output:stream, structured-output, params, reasoning:stream, reasoning
google-vertex anthropic/claude-sonnet-4-6@default success: structured-output, parallel-tool-call:stream, parallel-tool-call, tool-call:stream, params:stream, params, tool-call, structured-output:stream, reasoning:stream, reasoning
google-vertex gemini-2.5-flash-lite success: parallel-tool-call:stream, params, structured-output:stream, structured-output, parallel-tool-call, tool-call, tool-call:stream, params:stream, reasoning, reasoning:stream, params:google-genai, parallel-tool-call:stream:google-genai, structured-output:google-genai, params:stream:google-genai, tool-call:stream:google-genai, parallel-tool-call:google-genai, structured-output:stream:google-genai, tool-call:google-genai, reasoning:google-genai, reasoning:stream:google-genai
google-vertex gemini-2.5-flash-lite-preview-09-2025 skipped: skip-check
google-vertex gemini-2.5-flash-tts success: params
google-vertex gemini-2.5-pro success: tool-call:stream, tool-call, structured-output:stream, params:stream, structured-output, params, structured-output:stream:google-genai, tool-call:stream:google-genai, tool-call:google-genai, params:google-genai, params:stream:google-genai, structured-output:google-genai, reasoning:stream, reasoning, reasoning:stream:google-genai, reasoning:google-genai
google-vertex gemini-3-pro-image-preview skipped: skip-check
google-vertex gemini-3.1-flash-lite-preview success: structured-output, params, json-output:stream, json-output, tool-call, tool-call:stream, structured-output:stream, params:stream, reasoning:stream, reasoning, params:google-genai, tool-call:google-genai, structured-output:stream:google-genai, tool-call:stream:google-genai, structured-output:google-genai, json-output:google-genai, json-output:stream:google-genai, params:stream:google-genai, reasoning:stream:google-genai, reasoning:google-genai
google-vertex google/automl-vision-image-object-detection skipped: skip-check
google-vertex google/gemini-2.5-flash-image success: params:stream, params, params:google-genai, params:stream:google-genai
google-vertex google/gemini-3-pro-image-preview success: params:stream, params, params:stream:google-genai, params:google-genai, reasoning:stream, reasoning, reasoning:stream:google-genai, reasoning:google-genai
google-vertex google/gemini-3.1-flash-image-preview success: params:stream, params, reasoning:stream, reasoning, params:google-genai, params:stream:google-genai

validation_failure: reasoning:google-genai, reasoning:stream:google-genai
google-vertex google/gemini-3.1-flash-lite-preview success: tool-call, structured-output:stream, tool-call:stream, structured-output, json-output:stream, params, json-output, reasoning, tool-call:stream:google-genai, params:stream, structured-output:google-genai, json-output:stream:google-genai, tool-call:google-genai, params:google-genai, reasoning:stream:google-genai, params:stream:google-genai, reasoning:google-genai, reasoning:stream, structured-output:stream:google-genai

failure: json-output:google-genai
google-vertex google/gemini-embedding-2-preview success: params
google-vertex google/gemma4 skipped: skip-check
google-vertex google/object-detector skipped: skip-check
google-vertex google/people-blur skipped: skip-check
google-vertex google/veo-3.0-fast-generate-001 skipped: skip-check
google-vertex imagen-4.0-generate-001 skipped: skip-check
google-vertex imagen-4.0-ultra-generate-001 skipped: skip-check
google-vertex meta/llama-3.3-70b-instruct-maas success: structured-output:stream, tool-call:stream, structured-output, params:stream, params, tool-call
google-vertex meta/llama-4-scout-17b-16e-instruct-maas success: params, params:stream

validation_failure: structured-output, tool-call:stream, structured-output:stream, tool-call
google-vertex mistralai/codestral-2 success: params:stream, tool-call, structured-output:stream, structured-output, params, tool-call:stream
google-vertex openai/gpt-oss-120b-maas success: params, params:stream, tool-call, tool-call:stream, reasoning, reasoning:stream, structured-output:stream

validation_failure: structured-output
google-vertex qwen/qwen3-coder-480b-a35b-instruct-maas success: tool-call, tool-call:stream, structured-output, structured-output:stream, params, params:stream
google-vertex text-embedding-004 skipped: skip-check
google-vertex text-embedding-005 success: params
Failures (8)

google-vertex/google/gemini-3.1-flash-lite-preview — json-output:google-genai (failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpwm9h8c8a/snippet.py", line 32, in <module>
    response = client.models.generate_content(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/google/genai/models.py", line 6405, in generate_content
    response = self._generate_content(
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/google/genai/models.py", line 4841, in _generate_content
    response = self._api_client.request(
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/google/genai/_api_client.py", line 1611, in request
    response = self._request(http_request, http_options, stream=False)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/google/genai/_api_client.py", line 1404, in _request
    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/tenacity/__init__.py", line 470, in __call__
    do = self.iter(retry_state=retry_state)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/tenacity/__init__.py", line 371, in iter
    result = action(retry_state)
             ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/tenacity/__init__.py", line 413, in exc_check
    raise retry_exc.reraise()
          ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/tenacity/__init__.py", line 184, in reraise
    raise self.last_attempt.result()
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/local/lib/python3.11/site-packages/tenacity/__init__.py", line 473, in __call__
    result = fn(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/google/genai/_api_client.py", line 1381, in _request_once
    errors.APIError.raise_for_response(response)
  File "/usr/local/lib/python3.11/site-packages/google/genai/errors.py", line 155, in raise_for_response
    cls.raise_error(response.status_code, response_json, response)
  File "/usr/local/lib/python3.11/site-packages/google/genai/errors.py", line 184, in raise_error
    raise ClientError(status_code, response_json, response)
google.genai.errors.ClientError: 403 failure. {'status': 'failure', 'message': 'User gateway-tester-v2-a7aa6fd5-9 is not authorized to access model test-v2-vertex/gemini-3.1-flash-lite-preview or model does not exist', 'error': {'message': 'User gateway-tester-v2-a7aa6fd5-9 is not authorized to access model test-v2-vertex/gemini-3.1-flash-lite-preview or model does not exist', 'type': 'AuthorizationError', 'code': '403'}, 'error_origin_level': 'authorization'}
Code snippet
from google import genai
from google.genai import types

_endpoint = "https://internal.devtest.truefoundry.tech/api/llm"
_api_key = "***"
_full_model = "test-v2-vertex/google/gemini-3.1-flash-lite-preview"

_parts = _full_model.split("/")
_provider_account = _parts[0]
_model_id = "/".join(_parts[1:])
if "/" in _model_id:
    _model_id = _model_id.rsplit("/", 1)[-1]

_base_url = f"{_endpoint}/gemini/{_provider_account}/proxy"

client = genai.Client(
    api_key=_api_key,
    http_options=types.HttpOptions(base_url=_base_url),
)

contents = [
    types.Content(role="user", parts=[types.Part.from_text(text="Hi")]),
    types.Content(role="model", parts=[types.Part.from_text(text="Hi, how can I help you")]),
    types.Content(role="user", parts=[types.Part.from_text(text="List 3 colors with their hex codes in JSON.")]),
]

config = types.GenerateContentConfig(
    system_instruction="You are a helpful assistant. Respond in JSON format.",
    response_mime_type="application/json",
)

response = client.models.generate_content(
    model=_model_id,
    contents=contents,
    config=config,
)

print(response.text)

import json as _json

_text = response.text
print(_text)

if not _text:
    raise Exception("VALIDATION FAILED: json-output - GenAI response text is empty")

_json.loads(_text)
print("VALIDATION: json-output SUCCESS")

google-vertex/google/gemini-3.1-flash-image-preview — reasoning:google-genai (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpk2a9gylz/snippet.py", line 67, in <module>
    raise Exception("VALIDATION FAILED: reasoning - no thinking information in GenAI response")
Exception: VALIDATION FAILED: reasoning - no thinking information in GenAI response
Code snippet
from google import genai
from google.genai import types

_endpoint = "https://internal.devtest.truefoundry.tech/api/llm"
_api_key = "***"
_full_model = "test-v2-vertex/google/gemini-3.1-flash-image-preview"

_parts = _full_model.split("/")
_provider_account = _parts[0]
_model_id = "/".join(_parts[1:])
if "/" in _model_id:
    _model_id = _model_id.rsplit("/", 1)[-1]

_base_url = f"{_endpoint}/gemini/{_provider_account}/proxy"

client = genai.Client(
    api_key=_api_key,
    http_options=types.HttpOptions(base_url=_base_url),
)

contents = [
    types.Content(role="user", parts=[types.Part.from_text(text="Hi")]),
    types.Content(role="model", parts=[types.Part.from_text(text="Hi, how can I help you")]),
    types.Content(role="user", parts=[types.Part.from_text(text="How to calculate 3^3^3^3? Think step by step and show all reasoning.")]),
]

config = types.GenerateContentConfig(
    system_instruction="You are a helpful assistant. You MUST think step by step and show your reasoning. Never skip reasoning steps.",
    thinking_config=types.ThinkingConfig(
        include_thoughts=True,
        thinking_budget=5000,
    ),
)

response = client.models.generate_content(
    model=_model_id,
    contents=contents,
    config=config,
)

for part in response.candidates[0].content.parts:
    if not part.text:
        continue
    if part.thought:
        print(f"[Thinking] {part.text}")
    else:
        print(part.text)

_parts = response.candidates[0].content.parts
_thought_detected = False

for _part in _parts:
    if not _part.text:
        continue
    if _part.thought:
        _thought_detected = True
        print(f"Thinking: {_part.text[:200]}...")
    else:
        print(_part.text)

_usage = getattr(response, "usage_metadata", None)
if _usage and getattr(_usage, "thoughts_token_count", 0):
    _thought_detected = True

if not _thought_detected:
    print("Response: ", response)
    raise Exception("VALIDATION FAILED: reasoning - no thinking information in GenAI response")
print("VALIDATION: reasoning SUCCESS")

google-vertex/google/gemini-3.1-flash-image-preview — reasoning:stream:google-genai (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpva_qt_2l/snippet.py", line 70, in <module>
    raise Exception("VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream")
Exception: VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream
Code snippet
from google import genai
from google.genai import types

_endpoint = "https://internal.devtest.truefoundry.tech/api/llm"
_api_key = "***"
_full_model = "test-v2-vertex/google/gemini-3.1-flash-image-preview"

_parts = _full_model.split("/")
_provider_account = _parts[0]
_model_id = "/".join(_parts[1:])
if "/" in _model_id:
    _model_id = _model_id.rsplit("/", 1)[-1]

_base_url = f"{_endpoint}/gemini/{_provider_account}/proxy"

client = genai.Client(
    api_key=_api_key,
    http_options=types.HttpOptions(base_url=_base_url),
)

contents = [
    types.Content(role="user", parts=[types.Part.from_text(text="Hi")]),
    types.Content(role="model", parts=[types.Part.from_text(text="Hi, how can I help you")]),
    types.Content(role="user", parts=[types.Part.from_text(text="How to calculate 3^3^3^3? Think step by step and show all reasoning.")]),
]

config = types.GenerateContentConfig(
    system_instruction="You are a helpful assistant. You MUST think step by step and show your reasoning. Never skip reasoning steps.",
    thinking_config=types.ThinkingConfig(
        include_thoughts=True,
        thinking_budget=5000,
    ),
)

_chunks = []
for chunk in client.models.generate_content_stream(
    model=_model_id,
    contents=contents,
    config=config,
):
    _chunks.append(chunk)
    if chunk.candidates and chunk.candidates[0].content and chunk.candidates[0].content.parts:
        for part in chunk.candidates[0].content.parts:
            if not part.text:
                continue
            if part.thought:
                print(f"[Thinking] {part.text}", end="", flush=True)
            else:
                print(part.text, end="", flush=True)

_thought_detected = False
for _chunk in _chunks:
    if not _chunk.candidates or not _chunk.candidates[0].content:
        continue
    for _part in _chunk.candidates[0].content.parts:
        if not _part.text:
            continue
        if _part.thought:
            _thought_detected = True
            print(_part.text, end="", flush=True)
        else:
            print(_part.text, end="", flush=True)

if not _thought_detected:
    _usage = getattr(_chunks[-1], "usage_metadata", None) if _chunks else None
    if _usage and getattr(_usage, "thoughts_token_count", 0):
        _thought_detected = True

if not _thought_detected:
    raise Exception("VALIDATION FAILED: reasoning stream - no thinking information in GenAI stream")
print("\nVALIDATION: reasoning stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — structured-output (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmp5xbgqks1/snippet.py", line 39, in <module>
    raise Exception("VALIDATION FAILED: structured-output - response content is empty")
Exception: VALIDATION FAILED: structured-output - response content is empty
Code snippet
from openai import OpenAI
import json

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

response_schema = json.loads('''{
  "title": "CalendarEvent",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "date": { "type": "string" },
    "participants": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["name", "date", "participants"],
  "additionalProperties": false
}''')

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "Extract the event information as JSON."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday. Extract the event details as JSON."},
    ],
    response_format={"type": "json_schema", "json_schema": {"name": "CalendarEvent", "schema": response_schema}},
    stream=False,
)

import json as _json

_content = response.choices[0].message.content
print(_content)

if not _content:
    raise Exception("VALIDATION FAILED: structured-output - response content is empty")

_parsed = _json.loads(_content)

if "name" not in _parsed or "date" not in _parsed or "participants" not in _parsed:
    raise Exception("VALIDATION FAILED: structured-output - missing expected fields (name, date, participants)")

if not isinstance(_parsed.get("participants"), list):
    raise Exception("VALIDATION FAILED: structured-output - 'participants' is not a list, schema not enforced")

if set(_parsed.keys()) != {"name", "date", "participants"}:
    raise Exception(
        f"VALIDATION FAILED: structured-output - unexpected keys present: {set(_parsed.keys())}"
    )

print("VALIDATION: structured-output SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — tool-call:stream (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpbj2dg13b/snippet.py", line 53, in <module>
    raise Exception("VALIDATION FAILED: tool-call stream - no tool calls received")
Exception: VALIDATION FAILED: tool-call stream - no tool calls received
Code snippet
from openai import OpenAI

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a location.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city name, e.g. London",
                    },
                },
                "required": ["location"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    },
]

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "You are a helpful assistant with access to tools. You MUST strictly use the provided tools to answer. Never respond with plain text when a tool is available."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Use the get_weather tool to check the weather in London. You must call the tool, do not respond with plain text."},
    ],
    tools=tools,
    tool_choice="auto",
    stream=True,
)

_tool_calls_made = False
for chunk in response:
    if chunk.choices and len(chunk.choices) > 0:
        delta = chunk.choices[0].delta
        if delta.content is not None:
            print(delta.content, end="", flush=True)
        if delta.tool_calls:
            _tool_calls_made = True
            for _tc in delta.tool_calls:
                if _tc.function:
                    print(_tc.function.arguments or "", end="", flush=True)

if not _tool_calls_made:
    raise Exception("VALIDATION FAILED: tool-call stream - no tool calls received")
print("\nVALIDATION: tool-call stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — structured-output:stream (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpckdj6gqp/snippet.py", line 44, in <module>
    raise Exception("VALIDATION FAILED: structured-output stream - no content received")
Exception: VALIDATION FAILED: structured-output stream - no content received
Code snippet
from openai import OpenAI
import json

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

response_schema = json.loads('''{
  "title": "CalendarEvent",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "date": { "type": "string" },
    "participants": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["name", "date", "participants"],
  "additionalProperties": false
}''')

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "Extract the event information as JSON."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday. Extract the event details as JSON."},
    ],
    response_format={"type": "json_schema", "json_schema": {"name": "CalendarEvent", "schema": response_schema}},
    stream=True,
)

import json as _json

_accumulated = ""
for chunk in response:
    if chunk.choices and len(chunk.choices) > 0:
        delta = chunk.choices[0].delta
        if delta.content is not None:
            _accumulated += delta.content
            print(delta.content, end="", flush=True)

if not _accumulated:
    raise Exception("VALIDATION FAILED: structured-output stream - no content received")

_parsed = _json.loads(_accumulated)

if "name" not in _parsed or "date" not in _parsed or "participants" not in _parsed:
    raise Exception("VALIDATION FAILED: structured-output stream - missing expected fields (name, date, participants)")

if not isinstance(_parsed.get("participants"), list):
    raise Exception("VALIDATION FAILED: structured-output stream - 'participants' is not a list, schema not enforced")

if set(_parsed.keys()) != {"name", "date", "participants"}:
    raise Exception(
        f"VALIDATION FAILED: structured-output stream - unexpected keys present: {set(_parsed.keys())}"
    )

print("\nVALIDATION: structured-output stream SUCCESS")

google-vertex/meta/llama-4-scout-17b-16e-instruct-maas — tool-call (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmpe0trpcnx/snippet.py", line 49, in <module>
    raise Exception("VALIDATION FAILED: tool-call - no tool calls in response")
Exception: VALIDATION FAILED: tool-call - no tool calls in response
Code snippet
from openai import OpenAI

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a location.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city name, e.g. London",
                    },
                },
                "required": ["location"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    },
]

response = client.chat.completions.create(
    model="test-v2-vertex/meta-llama-4-scout-17b-16e-instruct-maas",
    messages=[
        {"role": "system", "content": "You are a helpful assistant with access to tools. You MUST strictly use the provided tools to answer. Never respond with plain text when a tool is available."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Use the get_weather tool to check the weather in London. You must call the tool, do not respond with plain text."},
    ],
    tools=tools,
    tool_choice="auto",
    stream=False,
)

_message = response.choices[0].message
if _message.tool_calls:
    for _tc in _message.tool_calls:
        print(f"Function: {_tc.function.name}")
        print(f"Arguments: {_tc.function.arguments}")
else:
    print(_message.content)

if not _message.tool_calls or len(_message.tool_calls) == 0:
    raise Exception("VALIDATION FAILED: tool-call - no tool calls in response")
print("VALIDATION: tool-call SUCCESS")

google-vertex/openai/gpt-oss-120b-maas — structured-output (validation_failure)

Error:

Traceback (most recent call last):
  File "/tmp/tmp0mpra63d/snippet.py", line 44, in <module>
    raise Exception("VALIDATION FAILED: structured-output - missing expected fields (name, date, participants)")
Exception: VALIDATION FAILED: structured-output - missing expected fields (name, date, participants)
Code snippet
from openai import OpenAI
import json

client = OpenAI(api_key="***", base_url="https://internal.devtest.truefoundry.tech/api/llm")

response_schema = json.loads('''{
  "title": "CalendarEvent",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "date": { "type": "string" },
    "participants": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["name", "date", "participants"],
  "additionalProperties": false
}''')

response = client.chat.completions.create(
    model="test-v2-vertex/openai-gpt-oss-120b-maas",
    messages=[
        {"role": "system", "content": "Extract the event information as JSON."},
        {"role": "user", "content": "Hi"},
        {"role": "assistant", "content": "Hi, how can I help you"},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday. Extract the event details as JSON."},
    ],
    response_format={"type": "json_schema", "json_schema": {"name": "CalendarEvent", "schema": response_schema}},
    stream=False,
)

import json as _json

_content = response.choices[0].message.content
print(_content)

if not _content:
    raise Exception("VALIDATION FAILED: structured-output - response content is empty")

_parsed = _json.loads(_content)

if "name" not in _parsed or "date" not in _parsed or "participants" not in _parsed:
    raise Exception("VALIDATION FAILED: structured-output - missing expected fields (name, date, participants)")

if not isinstance(_parsed.get("participants"), list):
    raise Exception("VALIDATION FAILED: structured-output - 'participants' is not a list, schema not enforced")

if set(_parsed.keys()) != {"name", "date", "participants"}:
    raise Exception(
        f"VALIDATION FAILED: structured-output - unexpected keys present: {set(_parsed.keys())}"
    )

print("VALIDATION: structured-output SUCCESS")
Skipped (10)

google-vertex/gemini-2.5-flash-lite-preview-09-2025 — skip-check (skipped)

Skip reason:

deprecated or retired model

google-vertex/gemini-3-pro-image-preview — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/google/automl-vision-image-object-detection — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/google/gemma4 — skip-check (skipped)

Skip reason:

Provisioned model

google-vertex/google/object-detector — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/google/people-blur — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/google/veo-3.0-fast-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'video'

google-vertex/imagen-4.0-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/imagen-4.0-ultra-generate-001 — skip-check (skipped)

Skip reason:

unsupported mode 'image'

google-vertex/text-embedding-004 — skip-check (skipped)

Skip reason:

deprecated or retired model

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 4 potential issues.

There are 5 total unresolved issues (including 1 from previous review).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit b6858ce. Configure here.

Comment thread providers/google-vertex/anthropic/claude-sonnet-4-6@default.yaml
Comment thread providers/google-vertex/gemini-3.1-flash-lite-preview.yaml
Comment thread providers/google-vertex/text-embedding-005.yaml
Comment thread providers/google-vertex/google/veo-3.1-lite-generate-001.yaml
@harshiv-26 harshiv-26 merged commit e67da4b into main May 21, 2026
8 checks passed
@harshiv-26 harshiv-26 deleted the bot/update-google-vertex-20260520-023247 branch May 21, 2026 06:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant