Skip to content

Commit 3e4b10f

Browse files
authored
fix: strip Google provider prefix from Gemini paths (#91125)
* fix: strip Google provider prefix from Gemini paths * test: align qa exit code type
1 parent e5a9c60 commit 3e4b10f

4 files changed

Lines changed: 37 additions & 4 deletions

File tree

extensions/google/model-id.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22
const ANTIGRAVITY_BARE_PRO_IDS = new Set(["gemini-3-pro", "gemini-3.1-pro", "gemini-3-1-pro"]);
33
const GOOGLE_PROVIDER_PREFIX = "google/";
44

5+
export function stripGoogleProviderPrefix(id: string): string {
6+
return id.startsWith(GOOGLE_PROVIDER_PREFIX) ? id.slice(GOOGLE_PROVIDER_PREFIX.length) : id;
7+
}
8+
59
export function normalizeGoogleModelId(id: string): string {
610
if (id.startsWith(GOOGLE_PROVIDER_PREFIX)) {
7-
const modelId = id.slice(GOOGLE_PROVIDER_PREFIX.length);
11+
const modelId = stripGoogleProviderPrefix(id);
812
const normalizedModelId = normalizeGoogleModelId(modelId);
913
return normalizedModelId === modelId ? id : `${GOOGLE_PROVIDER_PREFIX}${normalizedModelId}`;
1014
}

extensions/google/transport-stream.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,31 @@ describe("google transport stream", () => {
447447
expect(result.content[2]).toHaveProperty("thoughtSignature", "Y2FsbF9zaWdfMQ==");
448448
});
449449

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+
450475
it("merges tool-call thought signatures from sibling SSE parts", async () => {
451476
guardedFetchMock.mockResolvedValueOnce(
452477
buildSseResponse([

extensions/google/transport-stream.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
normalizeOptionalString,
2929
} from "openclaw/plugin-sdk/string-coerce-runtime";
3030
import { parseGeminiAuth } from "./gemini-auth.js";
31+
import { stripGoogleProviderPrefix } from "./model-id.js";
3132
import { normalizeGoogleApiBaseUrl } from "./provider-policy.js";
3233
import {
3334
isGoogleGemini25ThinkingBudgetModel,
@@ -323,7 +324,7 @@ function resolveGoogleModelPath(modelId: string): string {
323324
if (modelId.startsWith("models/") || modelId.startsWith("tunedModels/")) {
324325
return modelId;
325326
}
326-
return `models/${modelId}`;
327+
return `models/${stripGoogleProviderPrefix(modelId)}`;
327328
}
328329

329330
function buildGoogleGenerativeAiRequestUrl(model: GoogleTransportModel): string {
@@ -356,7 +357,10 @@ function resolveGoogleVertexLocation(options: GoogleTransportOptions | undefined
356357
return location;
357358
}
358359

359-
export function resolveGoogleVertexBaseOrigin(model: GoogleTransportModel, location: string): string {
360+
export function resolveGoogleVertexBaseOrigin(
361+
model: GoogleTransportModel,
362+
location: string,
363+
): string {
360364
const configured = normalizeOptionalString(model.baseUrl);
361365
if (configured && !configured.includes("{location}")) {
362366
try {

extensions/qa-lab/src/live-transports/whatsapp/cli.runtime.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ vi.mock("./whatsapp-live.runtime.js", () => ({
2525
}));
2626

2727
const tempDirs: string[] = [];
28-
let originalExitCode: string | number | undefined;
28+
let originalExitCode: typeof process.exitCode;
2929

3030
afterEach(async () => {
3131
process.exitCode = originalExitCode;

0 commit comments

Comments
 (0)