@@ -398,7 +398,7 @@ export namespace Provider {
398398 return state ( ) . then ( ( state ) => state . providers )
399399 }
400400
401- async function getSDK ( provider : ModelsDev . Provider , model : ModelsDev . Model ) {
401+ async function getSDK ( provider : ModelsDev . Provider , model : ModelsDev . Model , runtimeOptions ?: Record < string , any > ) {
402402 return ( async ( ) => {
403403 using _ = log . time ( "getSDK" , {
404404 providerID : provider . id ,
@@ -422,14 +422,15 @@ export namespace Provider {
422422 const modPath =
423423 provider . id === "google-vertex-anthropic" ? `${ installedPath } /dist/anthropic/index.mjs` : installedPath
424424 const mod = await import ( modPath )
425- if ( options [ "timeout" ] !== undefined && options [ "timeout" ] !== null ) {
425+ const timeout = runtimeOptions ?. timeout ?? options [ "timeout" ]
426+ if ( timeout !== undefined && timeout !== null ) {
426427 // Only override fetch if user explicitly sets timeout
427428 options [ "fetch" ] = async ( input : any , init ?: BunFetchRequestInit ) => {
428429 const { signal, ...rest } = init ?? { }
429430
430431 const signals : AbortSignal [ ] = [ ]
431432 if ( signal ) signals . push ( signal )
432- if ( options [ " timeout" ] !== false ) signals . push ( AbortSignal . timeout ( options [ " timeout" ] ) )
433+ if ( timeout !== false ) signals . push ( AbortSignal . timeout ( timeout ) )
433434
434435 const combined = signals . length > 1 ? AbortSignal . any ( signals ) : signals [ 0 ]
435436
@@ -457,10 +458,16 @@ export namespace Provider {
457458 return state ( ) . then ( ( s ) => s . providers [ providerID ] )
458459 }
459460
460- export async function getModel ( providerID : string , modelID : string ) {
461- const key = `${ providerID } /${ modelID } `
461+ export async function getModel ( providerID : string , modelID : string , runtimeOptions ?: Record < string , any > ) {
462462 const s = await state ( )
463- if ( s . models . has ( key ) ) return s . models . get ( key ) !
463+
464+ // Include runtime options in cache key
465+ // Runtime options are only used from `opencode run` command
466+ const cacheKey = runtimeOptions
467+ ? `${ providerID } /${ modelID } :${ Bun . hash . xxHash32 ( JSON . stringify ( runtimeOptions ) ) } `
468+ : `${ providerID } /${ modelID } `
469+
470+ if ( s . models . has ( cacheKey ) ) return s . models . get ( cacheKey ) !
464471
465472 log . info ( "getModel" , {
466473 providerID,
@@ -471,7 +478,7 @@ export namespace Provider {
471478 if ( ! provider ) throw new ModelNotFoundError ( { providerID, modelID } )
472479 const info = provider . info . models [ modelID ]
473480 if ( ! info ) throw new ModelNotFoundError ( { providerID, modelID } )
474- const sdk = await getSDK ( provider . info , info )
481+ const sdk = await getSDK ( provider . info , info , runtimeOptions )
475482
476483 try {
477484 const keyReal = `${ providerID } /${ modelID } `
@@ -480,7 +487,7 @@ export namespace Provider {
480487 ? await provider . getModel ( sdk , realID , provider . options )
481488 : sdk . languageModel ( realID )
482489 log . info ( "found" , { providerID, modelID } )
483- s . models . set ( key , {
490+ s . models . set ( cacheKey , {
484491 providerID,
485492 modelID,
486493 info,
0 commit comments