google-genai 1.53.0 built `{location}-aiplatform.googleapis.com` for every Vertex AI location, a host that does not exist for the multi-region codes "eu" and "us", so those regions 404'd on every call. Raise the floor to >=1.72.0 (the upstream fix, googleapis/python-genai#2498) and re-lock to 2.18.1, plus a regression test on the resolved endpoint per region kind.
This commit is contained in:
@@ -50,7 +50,7 @@ dependencies = [
|
||||
"opentelemetry-exporter-otlp-proto-http>=1.44.0",
|
||||
"opentelemetry-semantic-conventions>=0.65b0",
|
||||
"dateparser>=1.4.2",
|
||||
"google-genai>=1.0.0",
|
||||
"google-genai>=1.72.0",
|
||||
"google-auth>=2.0.0",
|
||||
"anthropic>=0.40.0",
|
||||
"typer>=0.9.0",
|
||||
|
||||
@@ -145,6 +145,40 @@ def test_llm_wrapper_vertexai_no_prefix_model():
|
||||
assert provider.model == "gemini-2.0-flash-001"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"region,expected_base_url",
|
||||
[
|
||||
# Multi-region codes resolve to the "rep" hosts. The single-region host
|
||||
# pattern ("eu-aiplatform.googleapis.com") does not exist for these, so
|
||||
# an SDK without multi-region handling 404s every call (issue #3567).
|
||||
("eu", "https://aiplatform.eu.rep.googleapis.com/"),
|
||||
("us", "https://aiplatform.us.rep.googleapis.com/"),
|
||||
("europe-west1", "https://europe-west1-aiplatform.googleapis.com/"),
|
||||
("global", "https://aiplatform.googleapis.com/"),
|
||||
],
|
||||
)
|
||||
def test_llm_wrapper_vertexai_region_endpoint(region, expected_base_url):
|
||||
"""Regression guard on the resolved Vertex AI endpoint per region kind.
|
||||
|
||||
Uses a real genai.Client (no network: passing an explicit project skips ADC
|
||||
and the base URL is computed at construction) so a google-genai downgrade
|
||||
below the multi-region fix fails here instead of in production.
|
||||
"""
|
||||
from hindsight_api.engine.llm_wrapper import LLMProvider
|
||||
|
||||
provider = LLMProvider(
|
||||
provider="vertexai",
|
||||
api_key="",
|
||||
base_url="",
|
||||
model="gemini-2.5-flash",
|
||||
vertexai_project_id="test-project",
|
||||
vertexai_region=region,
|
||||
)
|
||||
|
||||
api_client = provider._gemini_client._api_client
|
||||
assert api_client._http_options.base_url == expected_base_url
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.skipif(
|
||||
not os.getenv("HINDSIGHT_API_LLM_VERTEXAI_PROJECT_ID"),
|
||||
|
||||
@@ -1462,16 +1462,15 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "google-auth"
|
||||
version = "2.43.0"
|
||||
version = "2.56.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "cachetools" },
|
||||
{ name = "cryptography" },
|
||||
{ name = "pyasn1-modules" },
|
||||
{ name = "rsa" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ff/ef/66d14cf0e01b08d2d51ffc3c20410c4e134a1548fc246a6081eae585a4fe/google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483", size = 296359, upload-time = "2025-11-06T00:13:36.587Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/db/4c/fa42116a48bab3f7a143cf5042ecff7df9c8b73f8a376203cd534d1dc966/google_auth-2.56.3.tar.gz", hash = "sha256:40e229fc901f0a305b553050e5fce562d509bee0435be053abfa91582b51b90c", size = 367110, upload-time = "2026-08-06T06:24:01.36Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/6f/d1/385110a9ae86d91cc14c5282c61fe9f4dc41c0b9f7d423c6ad77038c4448/google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16", size = 223114, upload-time = "2025-11-06T00:13:35.209Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bc/b3/6117b2f24065cd7e2c4f140e9a193e215f089ca8ba314cf91eb9d0b7fe0a/google_auth-2.56.3-py3-none-any.whl", hash = "sha256:8ec438808f813ad034535000261eed1067475d229d05bbf4216e78c3f2362e53", size = 259116, upload-time = "2026-08-06T06:22:51.788Z" },
|
||||
]
|
||||
|
||||
[package.optional-dependencies]
|
||||
@@ -1481,21 +1480,23 @@ requests = [
|
||||
|
||||
[[package]]
|
||||
name = "google-genai"
|
||||
version = "1.53.0"
|
||||
version = "2.18.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "anyio" },
|
||||
{ name = "distro" },
|
||||
{ name = "google-auth", extra = ["requests"] },
|
||||
{ name = "httpx" },
|
||||
{ name = "pydantic" },
|
||||
{ name = "requests" },
|
||||
{ name = "sniffio" },
|
||||
{ name = "tenacity" },
|
||||
{ name = "typing-extensions" },
|
||||
{ name = "websockets" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/de/b3/36fbfde2e21e6d3bc67780b61da33632f495ab1be08076cf0a16af74098f/google_genai-1.53.0.tar.gz", hash = "sha256:938a26d22f3fd32c6eeeb4276ef204ef82884e63af9842ce3eac05ceb39cbd8d", size = 260102, upload-time = "2025-12-03T17:21:23.233Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/19/e3/1dd592243a0dfc3487ddfff7995f12686d0557ec953173dd9bdbeba2cb96/google_genai-2.18.1.tar.gz", hash = "sha256:a1e2be75c16234adc6641afd1ad4dd44218c9eec005d938bdc428585a048918a", size = 659694, upload-time = "2026-08-13T22:13:50.226Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/40/f2/97fefdd1ad1f3428321bac819ae7a83ccc59f6439616054736b7819fa56c/google_genai-1.53.0-py3-none-any.whl", hash = "sha256:65a3f99e5c03c372d872cda7419f5940e723374bb12a2f3ffd5e3e56e8eb2094", size = 262015, upload-time = "2025-12-03T17:21:21.934Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/30/7d/5310f7a1cf290a6cb22eab37059610bf338ab7595892902591d2220cf825/google_genai-2.18.1-py3-none-any.whl", hash = "sha256:36a5949233e64a60f6cc4521bff7a76b7c569d0aa227bbe9fa642213b8a3a3b2", size = 1051129, upload-time = "2026-08-13T22:13:48.083Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1819,7 +1820,7 @@ requires-dist = [
|
||||
{ name = "filelock", marker = "extra == 'test'", specifier = ">=3.20.1" },
|
||||
{ name = "flashrank", marker = "extra == 'local-ml'", specifier = ">=0.2.0" },
|
||||
{ name = "google-auth", specifier = ">=2.0.0" },
|
||||
{ name = "google-genai", specifier = ">=1.0.0" },
|
||||
{ name = "google-genai", specifier = ">=1.72.0" },
|
||||
{ name = "greenlet", specifier = ">=3.2.4,<3.4.0" },
|
||||
{ name = "hindsight-api-slim", extras = ["local-ml", "local-onnx", "embedded-db"], marker = "extra == 'all'" },
|
||||
{ name = "httpx", specifier = ">=0.27.0" },
|
||||
@@ -4912,18 +4913,6 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/ed/d2/4a73b18821fd4669762c855fd1f4e80ceb66fb72d71162d14da58444a763/rpds_py-0.28.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5d0145edba8abd3db0ab22b5300c99dc152f5c9021fab861be0f0544dc3cbc5f", size = 552199, upload-time = "2025-10-22T22:24:26.54Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rsa"
|
||||
version = "4.9.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "pyasn1" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ruff"
|
||||
version = "0.14.9"
|
||||
|
||||
Reference in New Issue
Block a user