@@ -9,6 +9,7 @@ import { BunProc } from "../bun"
99import { Hash } from "../util/hash"
1010import { Plugin } from "../plugin"
1111import { NamedError } from "@opencode-ai/util/error"
12+ import { type LanguageModelV3 } from "@ai-sdk/provider"
1213import { ModelsDev } from "./models"
1314import { Auth } from "../auth"
1415import { Env } from "../env"
@@ -28,7 +29,7 @@ import { createVertex } from "@ai-sdk/google-vertex"
2829import { createVertexAnthropic } from "@ai-sdk/google-vertex/anthropic"
2930import { createOpenAI } from "@ai-sdk/openai"
3031import { createOpenAICompatible } from "@ai-sdk/openai-compatible"
31- import { createOpenRouter , type LanguageModelV2 } from "@openrouter/ai-sdk-provider"
32+ import { createOpenRouter } from "@openrouter/ai-sdk-provider"
3233import { createOpenaiCompatible as createGitHubCopilotOpenAICompatible } from "./sdk/copilot"
3334import { createXai } from "@ai-sdk/xai"
3435import { createMistral } from "@ai-sdk/mistral"
@@ -109,7 +110,11 @@ export namespace Provider {
109110 } )
110111 }
111112
112- const BUNDLED_PROVIDERS : Record < string , ( options : any ) => SDK > = {
113+ type BundledSDK = {
114+ languageModel ( modelId : string ) : LanguageModelV3
115+ }
116+
117+ const BUNDLED_PROVIDERS : Record < string , ( options : any ) => BundledSDK > = {
113118 "@ai-sdk/amazon-bedrock" : createAmazonBedrock ,
114119 "@ai-sdk/anthropic" : createAnthropic ,
115120 "@ai-sdk/azure" : createAzure ,
@@ -130,7 +135,6 @@ export namespace Provider {
130135 "@ai-sdk/perplexity" : createPerplexity ,
131136 "@ai-sdk/vercel" : createVercel ,
132137 "gitlab-ai-provider" : createGitLab ,
133- // @ts -ignore (TODO: kill this code so we dont have to maintain it)
134138 "@ai-sdk/github-copilot" : createGitHubCopilotOpenAICompatible ,
135139 }
136140
@@ -591,7 +595,12 @@ export namespace Provider {
591595
592596 if ( ! result . models . length ) {
593597 log . info ( "gitlab model discovery skipped: no models found" , {
594- project : result . project ? { id : result . project . id , path : result . project . pathWithNamespace } : null ,
598+ project : result . project
599+ ? {
600+ id : result . project . id ,
601+ path : result . project . pathWithNamespace ,
602+ }
603+ : null ,
595604 } )
596605 return { }
597606 }
@@ -619,8 +628,20 @@ export namespace Provider {
619628 reasoning : true ,
620629 attachment : true ,
621630 toolcall : true ,
622- input : { text : true , audio : false , image : true , video : false , pdf : true } ,
623- output : { text : true , audio : false , image : false , video : false , pdf : false } ,
631+ input : {
632+ text : true ,
633+ audio : false ,
634+ image : true ,
635+ video : false ,
636+ pdf : true ,
637+ } ,
638+ output : {
639+ text : true ,
640+ audio : false ,
641+ image : false ,
642+ video : false ,
643+ pdf : false ,
644+ } ,
624645 interleaved : false ,
625646 } ,
626647 release_date : "" ,
@@ -930,17 +951,17 @@ export namespace Provider {
930951 }
931952
932953 const providers : Record < ProviderID , Info > = { } as Record < ProviderID , Info >
933- const languages = new Map < string , LanguageModelV2 > ( )
954+ const languages = new Map < string , LanguageModelV3 > ( )
934955 const modelLoaders : {
935956 [ providerID : string ] : CustomModelLoader
936957 } = { }
937958 const varsLoaders : {
938959 [ providerID : string ] : CustomVarsLoader
939960 } = { }
961+ const sdk = new Map < string , BundledSDK > ( )
940962 const discoveryLoaders : {
941963 [ providerID : string ] : CustomDiscoverModels
942964 } = { }
943- const sdk = new Map < string , SDK > ( )
944965
945966 log . info ( "init" )
946967
@@ -1232,7 +1253,13 @@ export namespace Provider {
12321253 ...model . headers ,
12331254 }
12341255
1235- const key = Hash . fast ( JSON . stringify ( { providerID : model . providerID , npm : model . api . npm , options } ) )
1256+ const key = Hash . fast (
1257+ JSON . stringify ( {
1258+ providerID : model . providerID ,
1259+ npm : model . api . npm ,
1260+ options,
1261+ } ) ,
1262+ )
12361263 const existing = s . sdk . get ( key )
12371264 if ( existing ) return existing
12381265
@@ -1285,7 +1312,10 @@ export namespace Provider {
12851312
12861313 const bundledFn = BUNDLED_PROVIDERS [ model . api . npm ]
12871314 if ( bundledFn ) {
1288- log . info ( "using bundled provider" , { providerID : model . providerID , pkg : model . api . npm } )
1315+ log . info ( "using bundled provider" , {
1316+ providerID : model . providerID ,
1317+ pkg : model . api . npm ,
1318+ } )
12891319 const loaded = bundledFn ( {
12901320 name : model . providerID ,
12911321 ...options ,
@@ -1325,22 +1355,28 @@ export namespace Provider {
13251355 const provider = s . providers [ providerID ]
13261356 if ( ! provider ) {
13271357 const availableProviders = Object . keys ( s . providers )
1328- const matches = fuzzysort . go ( providerID , availableProviders , { limit : 3 , threshold : - 10000 } )
1358+ const matches = fuzzysort . go ( providerID , availableProviders , {
1359+ limit : 3 ,
1360+ threshold : - 10000 ,
1361+ } )
13291362 const suggestions = matches . map ( ( m ) => m . target )
13301363 throw new ModelNotFoundError ( { providerID, modelID, suggestions } )
13311364 }
13321365
13331366 const info = provider . models [ modelID ]
13341367 if ( ! info ) {
13351368 const availableModels = Object . keys ( provider . models )
1336- const matches = fuzzysort . go ( modelID , availableModels , { limit : 3 , threshold : - 10000 } )
1369+ const matches = fuzzysort . go ( modelID , availableModels , {
1370+ limit : 3 ,
1371+ threshold : - 10000 ,
1372+ } )
13371373 const suggestions = matches . map ( ( m ) => m . target )
13381374 throw new ModelNotFoundError ( { providerID, modelID, suggestions } )
13391375 }
13401376 return info
13411377 }
13421378
1343- export async function getLanguage ( model : Model ) : Promise < LanguageModelV2 > {
1379+ export async function getLanguage ( model : Model ) : Promise < LanguageModelV3 > {
13441380 const s = await state ( )
13451381 const key = `${ model . providerID } /${ model . id } `
13461382 if ( s . models . has ( key ) ) return s . models . get ( key ) !
@@ -1350,7 +1386,10 @@ export namespace Provider {
13501386
13511387 try {
13521388 const language = s . modelLoaders [ model . providerID ]
1353- ? await s . modelLoaders [ model . providerID ] ( sdk , model . api . id , { ...provider . options , ...model . options } )
1389+ ? await s . modelLoaders [ model . providerID ] ( sdk , model . api . id , {
1390+ ...provider . options ,
1391+ ...model . options ,
1392+ } )
13541393 : sdk . languageModel ( model . api . id )
13551394 s . models . set ( key , language )
13561395 return language
@@ -1457,9 +1496,9 @@ export namespace Provider {
14571496 if ( cfg . model ) return parseModel ( cfg . model )
14581497
14591498 const providers = await list ( )
1460- const recent = ( await Filesystem . readJson < { recent ?: { providerID : ProviderID ; modelID : ModelID } [ ] } > (
1461- path . join ( Global . Path . state , "model.json" ) ,
1462- )
1499+ const recent = ( await Filesystem . readJson < {
1500+ recent ?: { providerID : ProviderID ; modelID : ModelID } [ ]
1501+ } > ( path . join ( Global . Path . state , "model.json" ) )
14631502 . then ( ( x ) => ( Array . isArray ( x . recent ) ? x . recent : [ ] ) )
14641503 . catch ( ( ) => [ ] ) ) as { providerID : ProviderID ; modelID : ModelID } [ ]
14651504 for ( const entry of recent ) {
0 commit comments