@@ -12,6 +12,8 @@ describe('claude-provider.ts', () => {
1212 vi . clearAllMocks ( ) ;
1313 provider = new ClaudeProvider ( ) ;
1414 delete process . env . ANTHROPIC_API_KEY ;
15+ delete process . env . ANTHROPIC_BASE_URL ;
16+ delete process . env . ANTHROPIC_AUTH_TOKEN ;
1517 } ) ;
1618
1719 describe ( 'getName' , ( ) => {
@@ -286,6 +288,93 @@ describe('claude-provider.ts', () => {
286288 } ) ;
287289 } ) ;
288290
291+ describe ( 'environment variable passthrough' , ( ) => {
292+ afterEach ( ( ) => {
293+ delete process . env . ANTHROPIC_BASE_URL ;
294+ delete process . env . ANTHROPIC_AUTH_TOKEN ;
295+ } ) ;
296+
297+ it ( 'should pass ANTHROPIC_BASE_URL to SDK env' , async ( ) => {
298+ process . env . ANTHROPIC_BASE_URL = 'https://custom.example.com/v1' ;
299+
300+ vi . mocked ( sdk . query ) . mockReturnValue (
301+ ( async function * ( ) {
302+ yield { type : 'text' , text : 'test' } ;
303+ } ) ( )
304+ ) ;
305+
306+ const generator = provider . executeQuery ( {
307+ prompt : 'Test' ,
308+ cwd : '/test' ,
309+ } ) ;
310+
311+ await collectAsyncGenerator ( generator ) ;
312+
313+ expect ( sdk . query ) . toHaveBeenCalledWith ( {
314+ prompt : 'Test' ,
315+ options : expect . objectContaining ( {
316+ env : expect . objectContaining ( {
317+ ANTHROPIC_BASE_URL : 'https://custom.example.com/v1' ,
318+ } ) ,
319+ } ) ,
320+ } ) ;
321+ } ) ;
322+
323+ it ( 'should pass ANTHROPIC_AUTH_TOKEN to SDK env' , async ( ) => {
324+ process . env . ANTHROPIC_AUTH_TOKEN = 'custom-auth-token' ;
325+
326+ vi . mocked ( sdk . query ) . mockReturnValue (
327+ ( async function * ( ) {
328+ yield { type : 'text' , text : 'test' } ;
329+ } ) ( )
330+ ) ;
331+
332+ const generator = provider . executeQuery ( {
333+ prompt : 'Test' ,
334+ cwd : '/test' ,
335+ } ) ;
336+
337+ await collectAsyncGenerator ( generator ) ;
338+
339+ expect ( sdk . query ) . toHaveBeenCalledWith ( {
340+ prompt : 'Test' ,
341+ options : expect . objectContaining ( {
342+ env : expect . objectContaining ( {
343+ ANTHROPIC_AUTH_TOKEN : 'custom-auth-token' ,
344+ } ) ,
345+ } ) ,
346+ } ) ;
347+ } ) ;
348+
349+ it ( 'should pass both custom endpoint vars together' , async ( ) => {
350+ process . env . ANTHROPIC_BASE_URL = 'https://gateway.example.com' ;
351+ process . env . ANTHROPIC_AUTH_TOKEN = 'gateway-token' ;
352+
353+ vi . mocked ( sdk . query ) . mockReturnValue (
354+ ( async function * ( ) {
355+ yield { type : 'text' , text : 'test' } ;
356+ } ) ( )
357+ ) ;
358+
359+ const generator = provider . executeQuery ( {
360+ prompt : 'Test' ,
361+ cwd : '/test' ,
362+ } ) ;
363+
364+ await collectAsyncGenerator ( generator ) ;
365+
366+ expect ( sdk . query ) . toHaveBeenCalledWith ( {
367+ prompt : 'Test' ,
368+ options : expect . objectContaining ( {
369+ env : expect . objectContaining ( {
370+ ANTHROPIC_BASE_URL : 'https://gateway.example.com' ,
371+ ANTHROPIC_AUTH_TOKEN : 'gateway-token' ,
372+ } ) ,
373+ } ) ,
374+ } ) ;
375+ } ) ;
376+ } ) ;
377+
289378 describe ( 'getAvailableModels' , ( ) => {
290379 it ( 'should return 4 Claude models' , ( ) => {
291380 const models = provider . getAvailableModels ( ) ;
0 commit comments