11import logger from '@shared/logger'
22import { ModelConfig , MODEL_META } from '@shared/presenter'
3- import { ModelType , resolveNewApiSelectableEndpointTypes } from '@shared/model'
3+ import {
4+ isNewApiEndpointType ,
5+ ModelType ,
6+ resolveNewApiModelTypeFromMetadata ,
7+ resolveNewApiSelectableEndpointTypes
8+ } from '@shared/model'
49import { resolveVideoGenerationCompatType } from '@shared/videoGenerationSettings'
510import ElectronStore from 'electron-store'
611import path from 'path'
@@ -30,6 +35,16 @@ interface ProviderModelHelperOptions {
3035
3136type ProviderModelStore = StoreLike < IModelStore & Record < string , unknown > >
3237
38+ const MODEL_TYPE_VALUES = new Set < string > ( Object . values ( ModelType ) )
39+
40+ function isModelType ( value : unknown ) : value is ModelType {
41+ return typeof value === 'string' && MODEL_TYPE_VALUES . has ( value )
42+ }
43+
44+ function isNonChatModelType ( type : ModelType | undefined ) : type is ModelType {
45+ return type !== undefined && type !== ModelType . Chat
46+ }
47+
3348export class ProviderModelHelper {
3449 private readonly userDataPath : string
3550 private readonly getModelConfig : ModelConfigResolver
@@ -127,6 +142,38 @@ export class ProviderModelHelper {
127142 return normalizedModel
128143 }
129144
145+ private resolveNewApiEffectiveModelType ( model : MODEL_META , config ?: ModelConfig ) : ModelType {
146+ const userConfigType =
147+ config ?. isUserDefined === true && isModelType ( config . type ) ? config . type : undefined
148+ if ( userConfigType ) {
149+ return userConfigType
150+ }
151+
152+ if ( isModelType ( model . type ) ) {
153+ return model . type
154+ }
155+
156+ const supportedEndpointTypes = ( model . supportedEndpointTypes ?? [ ] ) . filter ( isNewApiEndpointType )
157+ const routeEndpointTypes =
158+ supportedEndpointTypes . length > 0
159+ ? supportedEndpointTypes
160+ : isNewApiEndpointType ( model . endpointType )
161+ ? [ model . endpointType ]
162+ : [ ]
163+ const metadataType = resolveNewApiModelTypeFromMetadata ( routeEndpointTypes , model . id , undefined )
164+ if ( metadataType ) {
165+ return metadataType
166+ }
167+
168+ const providerConfigType =
169+ config ?. isUserDefined !== true && isModelType ( config ?. type ) ? config . type : undefined
170+ if ( isNonChatModelType ( providerConfigType ) ) {
171+ return providerConfigType
172+ }
173+
174+ return ModelType . Chat
175+ }
176+
130177 private applyResolvedModelConfig ( model : MODEL_META , providerId : string ) : MODEL_META {
131178 const normalizedModel = this . cloneModel ( model )
132179 const config = this . getModelConfig ( normalizedModel . id , providerId )
@@ -146,6 +193,11 @@ export class ProviderModelHelper {
146193 : config . reasoning || false
147194 normalizedModel . endpointType = config . endpointType ?? normalizedModel . endpointType
148195 normalizedModel . ownedBy = normalizedModel . ownedBy ?? config . ownedBy
196+ if ( providerId === 'new-api' ) {
197+ normalizedModel . type = this . resolveNewApiEffectiveModelType ( normalizedModel , config )
198+ return normalizedModel
199+ }
200+
149201 normalizedModel . type =
150202 resolveVideoGenerationCompatType ( {
151203 modelId : normalizedModel . id ,
@@ -161,6 +213,11 @@ export class ProviderModelHelper {
161213 normalizedModel . vision = normalizedModel . vision || false
162214 normalizedModel . functionCall = normalizedModel . functionCall || false
163215 normalizedModel . reasoning = normalizedModel . reasoning || false
216+ if ( providerId === 'new-api' ) {
217+ normalizedModel . type = this . resolveNewApiEffectiveModelType ( normalizedModel )
218+ return normalizedModel
219+ }
220+
164221 normalizedModel . type =
165222 resolveVideoGenerationCompatType ( {
166223 modelId : normalizedModel . id ,
@@ -173,16 +230,15 @@ export class ProviderModelHelper {
173230 }
174231
175232 private applyNewApiEndpointCompatibility ( model : MODEL_META , providerId : string ) : MODEL_META {
176- if ( providerId !== 'new-api' || model . selectableEndpointTypes ?. length ) {
233+ if ( providerId !== 'new-api' ) {
177234 return model
178235 }
179236
180237 const selectableEndpointTypes = resolveNewApiSelectableEndpointTypes (
181238 model . supportedEndpointTypes ,
182239 model . id ,
183240 {
184- type : model . type ,
185- ownedBy : model . ownedBy
241+ type : model . type
186242 }
187243 )
188244 return selectableEndpointTypes ? { ...model , selectableEndpointTypes } : model
@@ -217,8 +273,8 @@ export class ProviderModelHelper {
217273 }
218274
219275 const result = normalizedStoredModels . map ( ( model ) =>
220- this . applyResolvedModelConfig (
221- this . applyNewApiEndpointCompatibility ( model , providerId ) ,
276+ this . applyNewApiEndpointCompatibility (
277+ this . applyResolvedModelConfig ( model , providerId ) ,
222278 providerId
223279 )
224280 )
0 commit comments