From 7a6dfa37047f087612ff59fcadb9c3dcc378dd08 Mon Sep 17 00:00:00 2001 From: Shreya Keshive Date: Tue, 3 Feb 2026 16:40:41 -0500 Subject: [PATCH] fix(sandbox): propagate GOOGLE_GEMINI_BASE_URL&GOOGLE_VERTEX_BASE_URL env vars (#18231) --- packages/cli/src/utils/sandbox.test.ts | 47 ++++++++++++++++++++++++++ packages/cli/src/utils/sandbox.ts | 14 ++++++++ 2 files changed, 61 insertions(+) diff --git a/packages/cli/src/utils/sandbox.test.ts b/packages/cli/src/utils/sandbox.test.ts index 9f59ca008c..50b1699644 100644 --- a/packages/cli/src/utils/sandbox.test.ts +++ b/packages/cli/src/utils/sandbox.test.ts @@ -374,6 +374,53 @@ describe('sandbox', () => { ); }); + it('should pass through GOOGLE_GEMINI_BASE_URL and GOOGLE_VERTEX_BASE_URL', async () => { + const config: SandboxConfig = { + command: 'docker', + image: 'gemini-cli-sandbox', + }; + process.env['GOOGLE_GEMINI_BASE_URL'] = 'http://gemini.proxy'; + process.env['GOOGLE_VERTEX_BASE_URL'] = 'http://vertex.proxy'; + + // Mock image check to return true + interface MockProcessWithStdout extends EventEmitter { + stdout: EventEmitter; + } + const mockImageCheckProcess = new EventEmitter() as MockProcessWithStdout; + mockImageCheckProcess.stdout = new EventEmitter(); + vi.mocked(spawn).mockImplementationOnce(() => { + setTimeout(() => { + mockImageCheckProcess.stdout.emit('data', Buffer.from('image-id')); + mockImageCheckProcess.emit('close', 0); + }, 1); + return mockImageCheckProcess as unknown as ReturnType; + }); + + const mockSpawnProcess = new EventEmitter() as unknown as ReturnType< + typeof spawn + >; + mockSpawnProcess.on = vi.fn().mockImplementation((event, cb) => { + if (event === 'close') { + setTimeout(() => cb(0), 10); + } + return mockSpawnProcess; + }); + vi.mocked(spawn).mockImplementationOnce(() => mockSpawnProcess); + + await start_sandbox(config); + + expect(spawn).toHaveBeenCalledWith( + 'docker', + expect.arrayContaining([ + '--env', + 'GOOGLE_GEMINI_BASE_URL=http://gemini.proxy', + '--env', + 'GOOGLE_VERTEX_BASE_URL=http://vertex.proxy', + ]), + expect.any(Object), + ); + }); + it('should handle user creation on Linux if needed', async () => { const config: SandboxConfig = { command: 'docker', diff --git a/packages/cli/src/utils/sandbox.ts b/packages/cli/src/utils/sandbox.ts index 2edadae2ad..76641a70b7 100644 --- a/packages/cli/src/utils/sandbox.ts +++ b/packages/cli/src/utils/sandbox.ts @@ -460,6 +460,20 @@ export async function start_sandbox( args.push('--env', `GOOGLE_API_KEY=${process.env['GOOGLE_API_KEY']}`); } + // copy GOOGLE_GEMINI_BASE_URL and GOOGLE_VERTEX_BASE_URL + if (process.env['GOOGLE_GEMINI_BASE_URL']) { + args.push( + '--env', + `GOOGLE_GEMINI_BASE_URL=${process.env['GOOGLE_GEMINI_BASE_URL']}`, + ); + } + if (process.env['GOOGLE_VERTEX_BASE_URL']) { + args.push( + '--env', + `GOOGLE_VERTEX_BASE_URL=${process.env['GOOGLE_VERTEX_BASE_URL']}`, + ); + } + // copy GOOGLE_GENAI_USE_VERTEXAI if (process.env['GOOGLE_GENAI_USE_VERTEXAI']) { args.push(