@@ -5,6 +5,10 @@ interface OpenTinyModel {
55 display_name : string ;
66 capabilities ?: {
77 vision ?: boolean ;
8+ reasoning ?: {
9+ enable_thinking ?: boolean ;
10+ [ key : string ] : any ;
11+ } ;
812 fileUpload ?: {
913 supportDirectImage ?: boolean ;
1014 [ key : string ] : any ;
@@ -13,6 +17,17 @@ interface OpenTinyModel {
1317 } ;
1418}
1519
20+ const EXTRA_BODY_THINKING_DISABLED = { thinking : { type : 'disabled' as const } } ;
21+ const EXTRA_BODY_THINKING_ENABLED = { thinking : { type : 'enabled' as const } } ;
22+
23+ function shouldSplitThinkingModel ( capabilities ?: OpenTinyModel [ 'capabilities' ] ) : boolean {
24+ const reasoning = capabilities ?. reasoning ;
25+ if ( reasoning == null || typeof reasoning !== 'object' || Array . isArray ( reasoning ) ) {
26+ return false ;
27+ }
28+ return reasoning . enable_thinking === true ;
29+ }
30+
1631interface OpenTinyModelsResponse {
1732 models : OpenTinyModel [ ] ;
1833 [ key : string ] : any ;
@@ -25,28 +40,33 @@ interface OpenTinyModelsResponse {
2540export function convertOpenTinyToProviderModelsData ( resp : OpenTinyModelsResponse ) : Record < string , any > {
2641 const models = Array . isArray ( resp ?. models ) ? resp . models : [ ] ;
2742
28- const convertedModels = models . map ( ( m ) => {
43+ const convertedModels = models . flatMap ( ( model ) => {
44+ const { display_name, id, type, capabilities, provider } = model ;
2945 const supportImage =
30- m . type === 'vision' || m . capabilities ?. vision === true || m . capabilities ?. fileUpload ?. supportDirectImage === true ;
31-
32- const model : any = {
33- name : m . display_name || m . id ,
34- id : m . id ,
35- } ;
46+ type === 'vision' || capabilities ?. vision === true || capabilities ?. fileUpload ?. supportDirectImage === true ;
3647
48+ const modelName = display_name && provider ? `${ provider } _${ display_name } ` : id ;
49+ const base : any = { id } ;
3750 if ( supportImage ) {
38- model . features = { supportImage : true } ;
51+ base . features = { supportImage : true } ;
52+ }
53+
54+ if ( ! shouldSplitThinkingModel ( capabilities ) ) {
55+ return [ { name : modelName , ...base } ] ;
3956 }
4057
41- return model ;
58+ return [
59+ { name : modelName , ...base , extraBody : EXTRA_BODY_THINKING_DISABLED } ,
60+ { name : `${ modelName } -thinking` , ...base , extraBody : EXTRA_BODY_THINKING_ENABLED } ,
61+ ] ;
4262 } ) ;
4363
4464 // 为了与现有 opentiny-models.json 保持一致,统一放在 deepseek 提供商下
4565 return {
4666 dynamic : {
4767 name : 'deepseek' ,
48- apiKeyEnvName : 'API_KEY ' ,
49- baseUrlEnvName : 'BASE_URL ' ,
68+ apiKeyEnvName : 'DYNAMIC_API_KEY ' ,
69+ baseUrlEnvName : 'DYNAMIC_BASE_URL ' ,
5070 models : convertedModels ,
5171 } ,
5272 } ;
0 commit comments