@@ -11,6 +11,9 @@ import {
11
11
LinkButton ,
12
12
Text ,
13
13
TextField ,
14
+ Tooltip ,
15
+ TooltipInfoButton ,
16
+ TooltipTrigger ,
14
17
} from "@stacklok/ui-kit" ;
15
18
import { twMerge } from "tailwind-merge" ;
16
19
import { useMutationPreferredModelWorkspace } from "../hooks/use-mutation-preferred-model-workspace" ;
@@ -59,6 +62,7 @@ type SortableItemProps = {
59
62
models : V1ListAllModelsForAllProvidersResponse ;
60
63
isArchived : boolean ;
61
64
showRemoveButton : boolean ;
65
+ isDefaultRule : boolean ;
62
66
setRuleItem : ( rule : PreferredMuxRule ) => void ;
63
67
removeRule : ( index : number ) => void ;
64
68
} ;
@@ -71,21 +75,23 @@ function SortableItem({
71
75
models,
72
76
showRemoveButton,
73
77
isArchived,
78
+ isDefaultRule,
74
79
} : SortableItemProps ) {
80
+ const placeholder = isDefaultRule ? "Catch All" : "eg file type, file name" ;
75
81
return (
76
82
< div className = "flex items-center gap-2" key = { rule . id } >
77
83
< div className = "flex w-full justify-between" >
78
84
< TextField
79
85
aria-labelledby = "filter-by-label-id"
80
86
onFocus = { ( event ) => event . preventDefault ( ) }
81
87
value = { rule ?. matcher ?? "" }
82
- isDisabled = { isArchived }
88
+ isDisabled = { isArchived || isDefaultRule }
83
89
name = "matcher"
84
90
onChange = { ( matcher ) => {
85
91
setRuleItem ( { ...rule , matcher } ) ;
86
92
} }
87
93
>
88
- < Input placeholder = "eg file type, file name" />
94
+ < Input placeholder = { placeholder } />
89
95
</ TextField >
90
96
</ div >
91
97
< div className = "flex w-3/5 gap-2" >
@@ -97,7 +103,7 @@ function SortableItem({
97
103
setRuleItem ( { ...rule , provider_id, model } )
98
104
}
99
105
/>
100
- { showRemoveButton && (
106
+ { showRemoveButton && ! isDefaultRule && (
101
107
< Button
102
108
aria-label = "remove mux rule"
103
109
isIcon
@@ -177,8 +183,8 @@ export function WorkspaceMuxingModel({
177
183
< div className = "flex flex-col justify-start" >
178
184
< Text className = "text-primary" > Model Muxing</ Text >
179
185
< Text className = "flex items-center gap-1 text-secondary mb-0 text-balance" >
180
- Filters will be applied in order (top to bottom), empty filters
181
- will apply to all .
186
+ Select the model you would like to use in this workspace. This
187
+ section applies only if you are using the MUX endpoint .
182
188
< Link
183
189
variant = "primary"
184
190
className = "flex items-center gap-1 no-underline"
@@ -194,25 +200,43 @@ export function WorkspaceMuxingModel({
194
200
< div className = "flex gap-2" >
195
201
< div className = "w-12" > </ div >
196
202
< div className = "w-full" >
197
- < Label id = "filter-by-label-id" > Filter by</ Label >
203
+ < Label id = "filter-by-label-id" className = "flex items-center" >
204
+ Filter by
205
+ < TooltipTrigger delay = { 0 } >
206
+ < TooltipInfoButton aria-label = "Filter by description" />
207
+ < Tooltip >
208
+ Filters are applied in top-down order. The first rule that
209
+ matches each prompt determines the chosen model. An empty
210
+ filter applies to all prompts.
211
+ </ Tooltip >
212
+ </ TooltipTrigger >
213
+ </ Label >
198
214
</ div >
199
215
< div className = "w-3/5" >
200
216
< Label id = "preferred-model-id" > Preferred Model</ Label >
201
217
</ div >
202
218
</ div >
203
- < SortableArea items = { rules } setItems = { setRules } >
204
- { ( rule , index ) => (
205
- < SortableItem
206
- key = { rule . id }
207
- index = { index }
208
- rule = { rule }
209
- setRuleItem = { setRuleItem }
210
- removeRule = { removeRule }
211
- models = { providerModels }
212
- showRemoveButton = { showRemoveButton }
213
- isArchived = { ! ! isArchived }
214
- />
215
- ) }
219
+ < SortableArea
220
+ items = { rules }
221
+ setItems = { setRules }
222
+ disableDragByIndex = { rules . length - 1 }
223
+ >
224
+ { ( rule , index ) => {
225
+ const isDefaultRule = rules . length - 1 === index ;
226
+ return (
227
+ < SortableItem
228
+ key = { rule . id }
229
+ index = { index }
230
+ rule = { rule }
231
+ setRuleItem = { setRuleItem }
232
+ removeRule = { removeRule }
233
+ models = { providerModels }
234
+ showRemoveButton = { showRemoveButton }
235
+ isArchived = { ! ! isArchived }
236
+ isDefaultRule = { isDefaultRule }
237
+ />
238
+ ) ;
239
+ } }
216
240
</ SortableArea >
217
241
</ div >
218
242
</ CardBody >
0 commit comments