@@ -5,20 +5,27 @@ import Locale from "../locales";
55import { InputRange } from "./input-range" ;
66import { ListItem , Select } from "./ui-lib" ;
77import { useAllModels } from "../utils/hooks" ;
8+ import { groupBy } from "lodash-es" ;
89
910export function ModelConfigList ( props : {
1011 modelConfig : ModelConfig ;
1112 updateConfig : ( updater : ( config : ModelConfig ) => void ) => void ;
1213} ) {
1314 const allModels = useAllModels ( ) ;
15+ const groupModels = groupBy (
16+ allModels . filter ( ( v ) => v . available ) ,
17+ "provider.providerName" ,
18+ ) ;
1419 const value = `${ props . modelConfig . model } @${ props . modelConfig ?. providerName } ` ;
20+ const compressModelValue = `${ props . modelConfig . compressModel } @${ props . modelConfig ?. compressProviderName } ` ;
1521
1622 return (
1723 < >
1824 < ListItem title = { Locale . Settings . Model } >
1925 < Select
2026 aria-label = { Locale . Settings . Model }
2127 value = { value }
28+ align = "left"
2229 onChange = { ( e ) => {
2330 const [ model , providerName ] = e . currentTarget . value . split ( "@" ) ;
2431 props . updateConfig ( ( config ) => {
@@ -27,13 +34,15 @@ export function ModelConfigList(props: {
2734 } ) ;
2835 } }
2936 >
30- { allModels
31- . filter ( ( v ) => v . available )
32- . map ( ( v , i ) => (
33- < option value = { `${ v . name } @${ v . provider ?. providerName } ` } key = { i } >
34- { v . displayName } ({ v . provider ?. providerName } )
35- </ option >
36- ) ) }
37+ { Object . keys ( groupModels ) . map ( ( providerName , index ) => (
38+ < optgroup label = { providerName } key = { index } >
39+ { groupModels [ providerName ] . map ( ( v , i ) => (
40+ < option value = { `${ v . name } @${ v . provider ?. providerName } ` } key = { i } >
41+ { v . displayName }
42+ </ option >
43+ ) ) }
44+ </ optgroup >
45+ ) ) }
3746 </ Select >
3847 </ ListItem >
3948 < ListItem
@@ -228,6 +237,30 @@ export function ModelConfigList(props: {
228237 }
229238 > </ input >
230239 </ ListItem >
240+ < ListItem
241+ title = { Locale . Settings . CompressModel . Title }
242+ subTitle = { Locale . Settings . CompressModel . SubTitle }
243+ >
244+ < Select
245+ aria-label = { Locale . Settings . CompressModel . Title }
246+ value = { compressModelValue }
247+ onChange = { ( e ) => {
248+ const [ model , providerName ] = e . currentTarget . value . split ( "@" ) ;
249+ props . updateConfig ( ( config ) => {
250+ config . compressModel = ModalConfigValidator . model ( model ) ;
251+ config . compressProviderName = providerName as ServiceProvider ;
252+ } ) ;
253+ } }
254+ >
255+ { allModels
256+ . filter ( ( v ) => v . available )
257+ . map ( ( v , i ) => (
258+ < option value = { `${ v . name } @${ v . provider ?. providerName } ` } key = { i } >
259+ { v . displayName } ({ v . provider ?. providerName } )
260+ </ option >
261+ ) ) }
262+ </ Select >
263+ </ ListItem >
231264 </ >
232265 ) ;
233266}
0 commit comments