fix(executors): route current Claude generations through Vertex partner endpoint (#8852)

* fix(executors): route current Claude generations through Vertex partner endpoint

PARTNER_MODELS pinned three Claude 3.x prefixes (claude-3-5-sonnet,
claude-3-opus, claude-3-haiku). Every newer Claude generation on Vertex
(claude-sonnet-4-6, claude-haiku-4-5, etc.) fell through to the
Google-publisher branch instead, producing an invalid
publishers/google/models/claude-... path.

Replace the pinned prefixes with a single generic "claude-" prefix:
any Claude model on Vertex is always an Anthropic partner model, never
a Google one, so this can't go stale again the way pinned version
strings did.

Fixes #1985

* docs: add changelog fragment for #8852
This commit is contained in:
Will Gordon
2026-07-28 10:49:52 -04:00
committed by GitHub
parent ed6a19e05b
commit f1fcdbfa6e
3 changed files with 27 additions and 3 deletions

View File

@@ -0,0 +1 @@
- **fix(executors):** Vertex AI now routes current-generation Claude models (`claude-sonnet-4-6`, `claude-haiku-4-5`, etc.) through the partner endpoint instead of misrouting them as Google-publisher models ([#8852](https://github.com/diegosouzapw/OmniRoute/pull/8852)) — thanks @wgordon17

View File

@@ -116,9 +116,10 @@ export async function getAccessToken(sa: ServiceAccount): Promise<string> {
}
const PARTNER_MODELS = new Set([
"claude-3-5-sonnet",
"claude-3-opus",
"claude-3-haiku",
// Generic prefix, not pinned to a version: every Claude model on Vertex is an Anthropic
// partner model, never a Google-publisher one. Pinned prefixes (e.g. "claude-3-5-sonnet")
// silently break every time Anthropic ships a new generation — see issue #1985.
"claude-",
"deepseek-v3",
"deepseek-v3.2",
"deepseek-v4",

View File

@@ -90,6 +90,28 @@ test("VertexExecutor.buildUrl routes partner and org-prefixed models to the glob
);
});
test("VertexExecutor.buildUrl routes current-generation Claude models to the global partner endpoint (#1985)", () => {
const executor = new VertexExecutor();
// These model IDs post-date the old pinned "claude-3-5-sonnet" / "claude-3-opus" /
// "claude-3-haiku" prefixes and were previously misrouted to the Google-publisher path.
const claude4Sonnet = executor.buildUrl("claude-sonnet-4-6", false, 0, {
apiKey: createServiceAccountJson({ projectId: "proj-claude" }),
});
const claude4Haiku = executor.buildUrl("claude-haiku-4-5@20251001", true, 0, {
apiKey: createServiceAccountJson({ projectId: "proj-claude" }),
});
assert.equal(
claude4Sonnet,
"https://aiplatform.googleapis.com/v1/projects/proj-claude/locations/global/endpoints/openapi/chat/completions"
);
assert.equal(
claude4Haiku,
"https://aiplatform.googleapis.com/v1/projects/proj-claude/locations/global/endpoints/openapi/chat/completions"
);
});
test("VertexExecutor.buildHeaders includes Bearer token and SSE Accept only for streaming", () => {
const executor = new VertexExecutor();
const streamHeaders = executor.buildHeaders({ accessToken: "ya29.stream" }, true);