fix: strip Google provider prefix from Gemini paths (#91125) · openclaw/openclaw@3e4b10f
steipete
·
2026-06-07
·
via Recent Commits to openclaw:main
File tree
qa-lab/src/live-transports/whatsapp
| Original file line number | Diff line number | Diff line change |
|---|
@@ -2,9 +2,13 @@
|
2 | 2 | const ANTIGRAVITY_BARE_PRO_IDS = new Set(["gemini-3-pro", "gemini-3.1-pro", "gemini-3-1-pro"]); |
3 | 3 | const GOOGLE_PROVIDER_PREFIX = "google/"; |
4 | 4 | |
| 5 | +export function stripGoogleProviderPrefix(id: string): string { |
| 6 | +return id.startsWith(GOOGLE_PROVIDER_PREFIX) ? id.slice(GOOGLE_PROVIDER_PREFIX.length) : id; |
| 7 | +} |
| 8 | + |
5 | 9 | export function normalizeGoogleModelId(id: string): string { |
6 | 10 | if (id.startsWith(GOOGLE_PROVIDER_PREFIX)) { |
7 | | -const modelId = id.slice(GOOGLE_PROVIDER_PREFIX.length); |
| 11 | +const modelId = stripGoogleProviderPrefix(id); |
8 | 12 | const normalizedModelId = normalizeGoogleModelId(modelId); |
9 | 13 | return normalizedModelId === modelId ? id : `${GOOGLE_PROVIDER_PREFIX}${normalizedModelId}`; |
10 | 14 | } |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -447,6 +447,31 @@ describe("google transport stream", () => {
|
447 | 447 | expect(result.content[2]).toHaveProperty("thoughtSignature", "Y2FsbF9zaWdfMQ=="); |
448 | 448 | }); |
449 | 449 | |
| 450 | +it("strips redundant google provider prefixes from Gemini API model paths", async () => { |
| 451 | +guardedFetchMock.mockResolvedValueOnce(buildSseResponse([])); |
| 452 | + |
| 453 | +const model = buildGeminiModel({ |
| 454 | +id: "google/gemini-3-flash-preview", |
| 455 | +name: "Gemini 3 Flash Preview", |
| 456 | +}); |
| 457 | +const streamFn = createGoogleGenerativeAiTransportStreamFn(); |
| 458 | +const stream = await Promise.resolve( |
| 459 | +streamFn( |
| 460 | +model, |
| 461 | +{ |
| 462 | +messages: [{ role: "user", content: "hello", timestamp: 0 }], |
| 463 | +} as Parameters<typeof streamFn>[1], |
| 464 | +{ apiKey: "gemini-api-key" } as Parameters<typeof streamFn>[2], |
| 465 | +), |
| 466 | +); |
| 467 | +await stream.result(); |
| 468 | + |
| 469 | +const guardedCall = requireMockCall(guardedFetchMock, 0, "guarded fetch"); |
| 470 | +expect(guardedCall[0]).toBe( |
| 471 | +"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse", |
| 472 | +); |
| 473 | +}); |
| 474 | + |
450 | 475 | it("merges tool-call thought signatures from sibling SSE parts", async () => { |
451 | 476 | guardedFetchMock.mockResolvedValueOnce( |
452 | 477 | buildSseResponse([ |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -28,6 +28,7 @@ import {
|
28 | 28 | normalizeOptionalString, |
29 | 29 | } from "openclaw/plugin-sdk/string-coerce-runtime"; |
30 | 30 | import { parseGeminiAuth } from "./gemini-auth.js"; |
| 31 | +import { stripGoogleProviderPrefix } from "./model-id.js"; |
31 | 32 | import { normalizeGoogleApiBaseUrl } from "./provider-policy.js"; |
32 | 33 | import { |
33 | 34 | isGoogleGemini25ThinkingBudgetModel, |
@@ -323,7 +324,7 @@ function resolveGoogleModelPath(modelId: string): string {
|
323 | 324 | if (modelId.startsWith("models/") || modelId.startsWith("tunedModels/")) { |
324 | 325 | return modelId; |
325 | 326 | } |
326 | | -return `models/${modelId}`; |
| 327 | +return `models/${stripGoogleProviderPrefix(modelId)}`; |
327 | 328 | } |
328 | 329 | |
329 | 330 | function buildGoogleGenerativeAiRequestUrl(model: GoogleTransportModel): string { |
@@ -356,7 +357,10 @@ function resolveGoogleVertexLocation(options: GoogleTransportOptions | undefined
|
356 | 357 | return location; |
357 | 358 | } |
358 | 359 | |
359 | | -export function resolveGoogleVertexBaseOrigin(model: GoogleTransportModel, location: string): string { |
| 360 | +export function resolveGoogleVertexBaseOrigin( |
| 361 | +model: GoogleTransportModel, |
| 362 | +location: string, |
| 363 | +): string { |
360 | 364 | const configured = normalizeOptionalString(model.baseUrl); |
361 | 365 | if (configured && !configured.includes("{location}")) { |
362 | 366 | try { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -25,7 +25,7 @@ vi.mock("./whatsapp-live.runtime.js", () => ({
|
25 | 25 | })); |
26 | 26 | |
27 | 27 | const tempDirs: string[] = []; |
28 | | -let originalExitCode: string | number | undefined; |
| 28 | +let originalExitCode: typeof process.exitCode; |
29 | 29 | |
30 | 30 | afterEach(async () => { |
31 | 31 | process.exitCode = originalExitCode; |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。