@@ -13,11 +13,32 @@ import { IModelVendor } from '../vendors/IModelVendor';
13
13
import { findVendorById } from '../vendors/vendors.registry' ;
14
14
15
15
16
- function ModelItem ( props : { llm : DLLM , vendor : IModelVendor , chipChat : boolean , chipFast : boolean , chipFunc : boolean , onClick : ( ) => void } ) {
16
+ function ModelItem ( props : {
17
+ llm : DLLM ,
18
+ vendor : IModelVendor ,
19
+ chipChat : boolean ,
20
+ chipFast : boolean ,
21
+ chipFunc : boolean ,
22
+ onModelClicked : ( llmId : DLLMId ) => void ,
23
+ onModelSetHidden : ( llmId : DLLMId , hidden : boolean ) => void ,
24
+ } ) {
17
25
18
26
// derived
19
- const llm = props . llm ;
27
+ const { llm, onModelClicked, onModelSetHidden } = props ;
28
+
29
+ const handleClick = React . useCallback ( ( event : React . MouseEvent ) => {
30
+ event . stopPropagation ( ) ;
31
+ onModelClicked ( llm . id ) ;
32
+ } , [ llm . id , onModelClicked ] ) ;
33
+
34
+ const handleUnhide = React . useCallback ( ( event : React . MouseEvent ) => {
35
+ event . stopPropagation ( ) ;
36
+ onModelSetHidden ( llm . id , false ) ;
37
+ } , [ llm . id , onModelSetHidden ] ) ;
38
+
39
+
20
40
const label = llm . label ;
41
+
21
42
let tooltip = llm . _source . label ;
22
43
if ( llm . description )
23
44
tooltip += ' - ' + llm . description ;
@@ -30,35 +51,45 @@ function ModelItem(props: { llm: DLLM, vendor: IModelVendor, chipChat: boolean,
30
51
tooltip += 'token count not provided' ;
31
52
32
53
return (
33
- < ListItemButton color = 'primary' onClick = { props . onClick } sx = { { alignItems : 'center' , gap : 1 } } >
54
+ < ListItem >
55
+ < ListItemButton
56
+ color = 'primary'
57
+ aria-label = 'Configure LLM'
58
+ onClick = { handleClick }
59
+ sx = { {
60
+ alignItems : 'center' ,
61
+ gap : 1 ,
62
+ } }
63
+ >
64
+
65
+ { /* Model Name */ }
66
+ < GoodTooltip title = { tooltip } >
67
+ < Typography sx = { llm . hidden ? { color : 'neutral.plainDisabledColor' } : undefined } >
68
+ { label }
69
+ </ Typography >
70
+ </ GoodTooltip >
34
71
35
- { /* Model Name */ }
36
- < GoodTooltip title = { tooltip } >
37
- < Typography sx = { llm . hidden ? { color : 'neutral.plainDisabledColor' } : undefined } >
38
- { label }
39
- </ Typography >
40
- </ GoodTooltip >
72
+ { /* --> */ }
73
+ < Box sx = { { flex : 1 } } />
41
74
42
- { /* --> */ }
43
- < Box sx = { { flex : 1 } } />
75
+ { props . chipChat && < Chip size = 'sm' variant = 'plain' sx = { { boxShadow : 'sm' } } > chat</ Chip > }
44
76
45
- { props . chipChat && < Chip size = 'sm' variant = 'plain' sx = { { boxShadow : 'sm' } } > chat </ Chip > }
77
+ { props . chipFast && < Chip size = 'sm' variant = 'plain' sx = { { boxShadow : 'sm' } } > fast </ Chip > }
46
78
47
- { props . chipFast && < Chip size = 'sm' variant = 'plain' sx = { { boxShadow : 'sm' } } > fast </ Chip > }
79
+ { props . chipFunc && < Chip size = 'sm' variant = 'plain' sx = { { boxShadow : 'sm' } } > 𝑓n </ Chip > }
48
80
49
- { props . chipFunc && < Chip size = 'sm' variant = 'plain' sx = { { boxShadow : 'sm' } } > 𝑓n</ Chip > }
81
+ { llm . hidden && (
82
+ < IconButton aria-label = 'Unhide' size = 'sm' onClick = { handleUnhide } >
83
+ < VisibilityOffOutlinedIcon />
84
+ </ IconButton >
85
+ ) }
50
86
51
- { llm . hidden && (
52
- < IconButton disabled size = 'sm' >
53
- < VisibilityOffOutlinedIcon />
87
+ < IconButton aria-label = 'Configure LLM' size = 'sm' onClick = { handleClick } >
88
+ < SettingsOutlinedIcon />
54
89
</ IconButton >
55
- ) }
56
-
57
- < IconButton size = 'sm' >
58
- < SettingsOutlinedIcon />
59
- </ IconButton >
60
90
61
- </ ListItemButton >
91
+ </ ListItemButton >
92
+ </ ListItem >
62
93
) ;
63
94
}
64
95
@@ -69,12 +100,21 @@ export function ModelsList(props: {
69
100
} ) {
70
101
71
102
// external state
72
- const { chatLLMId, fastLLMId, funcLLMId, llms } = useModelsStore ( state => ( {
103
+ const { chatLLMId, fastLLMId, funcLLMId, llms, updateLLM } = useModelsStore ( state => ( {
73
104
chatLLMId : state . chatLLMId ,
74
105
fastLLMId : state . fastLLMId ,
75
106
funcLLMId : state . funcLLMId ,
76
107
llms : state . llms . filter ( llm => ! props . filterSourceId || llm . sId === props . filterSourceId ) ,
77
- } ) , shallow ) ;
108
+ updateLLM : state . updateLLM ,
109
+ } ) , ( a , b ) => a . chatLLMId === b . chatLLMId && a . fastLLMId === b . fastLLMId && a . funcLLMId === b . funcLLMId && shallow ( a . llms , b . llms ) ) ;
110
+
111
+
112
+ const { onOpenLLMOptions } = props ;
113
+
114
+ const handleModelClicked = React . useCallback ( ( llmId : DLLMId ) => onOpenLLMOptions ( llmId ) , [ onOpenLLMOptions ] ) ;
115
+
116
+ const handleModelSetHidden = React . useCallback ( ( llmId : DLLMId , hidden : boolean ) => updateLLM ( llmId , { hidden } ) , [ updateLLM ] ) ;
117
+
78
118
79
119
// find out if there's more than 1 sourceLabel in the llms array
80
120
const multiSources = llms . length >= 2 && llms . find ( llm => llm . _source !== llms [ 0 ] . _source ) ;
@@ -107,7 +147,8 @@ export function ModelsList(props: {
107
147
chipChat = { llm . id === chatLLMId }
108
148
chipFast = { llm . id === fastLLMId }
109
149
chipFunc = { llm . id === funcLLMId }
110
- onClick = { ( ) => props . onOpenLLMOptions ( llm . id ) }
150
+ onModelClicked = { handleModelClicked }
151
+ onModelSetHidden = { handleModelSetHidden }
111
152
/> ,
112
153
) ;
113
154
}
0 commit comments