From 361a71ffad9464e7eb63a2fc0a0e35f192a32524 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 15:23:05 +0200 Subject: [PATCH] fix(opencode): route Vertex multi-regions through REP (#42648) Co-authored-by: Aiden Cline Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com> --- packages/opencode/src/provider/provider.ts | 9 ++++-- .../opencode/test/provider/provider.test.ts | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 0200b212b..dba9cbece 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -98,6 +98,12 @@ function googleVertexAnthropicBaseURL(project: string | undefined, location: str return `https://aiplatform.${location}.rep.googleapis.com/v1/projects/${project}/locations/${location}/publishers/anthropic/models` } +function googleVertexEndpoint(location: string) { + if (location === "global") return "aiplatform.googleapis.com" + if (location === "eu" || location === "us") return `aiplatform.${location}.rep.googleapis.com` + return `${location}-aiplatform.googleapis.com` +} + type BundledSDK = { languageModel(modelId: string): LanguageModelV3 chat?: (modelId: string) => LanguageModelV3 @@ -519,11 +525,10 @@ function custom(dep: CustomDep): Record { return { autoload: true, vars(_options: Record) { - const endpoint = location === "global" ? "aiplatform.googleapis.com" : `${location}-aiplatform.googleapis.com` return { ...(project && { GOOGLE_VERTEX_PROJECT: project }), GOOGLE_VERTEX_LOCATION: location, - GOOGLE_VERTEX_ENDPOINT: endpoint, + GOOGLE_VERTEX_ENDPOINT: googleVertexEndpoint(location), } }, options: { diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts index df23a5c49..844027b76 100644 --- a/packages/opencode/test/provider/provider.test.ts +++ b/packages/opencode/test/provider/provider.test.ts @@ -1909,6 +1909,38 @@ it.instance("Google Vertex: keeps regional Claude endpoints unchanged", () => }), ) +it.instance("Google Vertex: uses REP endpoint for Gemini continental multi-regions", () => + Effect.gen(function* () { + yield* set("GOOGLE_CLOUD_PROJECT", "test-project") + yield* set("VERTEX_LOCATION", "eu") + const provider = yield* Provider.Service + const model = yield* provider.getModel( + ProviderV2.ID.make("google-vertex"), + ModelV2.ID.make("gemini-3.5-flash"), + ) + const language = yield* provider.getLanguage(model) + expect(languageBaseURL(language)).toBe( + "https://aiplatform.eu.rep.googleapis.com/v1beta1/projects/test-project/locations/eu/publishers/google", + ) + }), +) + +it.instance("Google Vertex: keeps regional Gemini endpoints unchanged", () => + Effect.gen(function* () { + yield* set("GOOGLE_CLOUD_PROJECT", "test-project") + yield* set("VERTEX_LOCATION", "europe-west1") + const provider = yield* Provider.Service + const model = yield* provider.getModel( + ProviderV2.ID.make("google-vertex"), + ModelV2.ID.make("gemini-3.5-flash"), + ) + const language = yield* provider.getLanguage(model) + expect(languageBaseURL(language)).toBe( + "https://europe-west1-aiplatform.googleapis.com/v1beta1/projects/test-project/locations/europe-west1/publishers/google", + ) + }), +) + it.instance("cloudflare-ai-gateway loads with env variables", () => Effect.gen(function* () { yield* set("CLOUDFLARE_ACCOUNT_ID", "test-account")