@@ -42,9 +42,7 @@ public object Any(ActiveAiModels request)
42
42
. SelectMany ( x => x . Models . Select ( m => appData . GetQualifiedModel ( m . Model ) ) )
43
43
. Where ( x => x != null )
44
44
. Select ( x => x ! ) // Non-null assertion after filtering out null values
45
- . Distinct ( )
46
- . OrderBy ( x => x )
47
- . ToList ( ) ;
45
+ . ToSet ( ) ;
48
46
49
47
if ( request . Vision == true )
50
48
{
@@ -53,12 +51,32 @@ public object Any(ActiveAiModels request)
53
51
. Where ( x => x . Vision == true )
54
52
. Select ( x => x . Id )
55
53
. ToSet ( ) ;
56
- activeModels = activeModels . Where ( x => allVisionModels . Contains ( x . LeftPart ( ':' ) ) ) . ToList ( ) ;
54
+ activeModels = activeModels . Where ( x => allVisionModels . Contains ( x . LeftPart ( ':' ) ) ) . ToSet ( ) ;
55
+ }
56
+
57
+ var customModels = appData . AiProviders
58
+ . Where ( x => x . AiTypeId == "Custom" )
59
+ . SelectMany ( x => x . SelectedModels ) ;
60
+ foreach ( var customModel in customModels )
61
+ {
62
+ activeModels . Add ( customModel ) ;
57
63
}
58
64
59
65
return new StringsResponse
60
66
{
61
- Results = activeModels
67
+ Results = activeModels . OrderBy ( x => x ) . ToList ( )
68
+ } ;
69
+ }
70
+
71
+ public object Any ( ActiveCustomAiModels request )
72
+ {
73
+ return new StringsResponse
74
+ {
75
+ Results = appData . AiProviders
76
+ . Where ( x => x . AiTypeId == "Custom" )
77
+ . SelectMany ( x => x . SelectedModels )
78
+ . OrderBy ( x => x )
79
+ . ToList ( )
62
80
} ;
63
81
}
64
82
@@ -104,6 +122,23 @@ public object GetModelImage(string model)
104
122
}
105
123
}
106
124
125
+ var customModels = appData . AiProviders
126
+ . Where ( x => x . AiTypeId == "Custom" )
127
+ . SelectMany ( x => x . SelectedModels )
128
+ . ToSet ( StringComparer . OrdinalIgnoreCase ) ;
129
+
130
+ if ( customModels . Contains ( model ) )
131
+ {
132
+ return new HttpResult (
133
+ """
134
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
135
+ <path fill="currentColor" d="M19 22v-2h1v-7h-1v-2h4v2h-1v7h1v2zm-3.5 0h2L14 11h-3L7.503 22h2l.601-2h4.778zm-4.794-4l1.628-5.411l.256-.003L14.264 18zM32 4h-4V0h-2v4h-4v2h4v4h2V6h4zm-2 8h2v2h-2zM18 0h2v2h-2z"/>
136
+ <path fill="currentColor" d="M32 32H0V0h14v2H2v28h28V18h2z"/>
137
+ </svg>
138
+ """ ,
139
+ MimeTypes . ImageSvg ) ;
140
+ }
141
+
107
142
return new HttpResult (
108
143
"""
109
144
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 48 48">
@@ -217,11 +252,19 @@ public QueueOpenAiChatResponse Any(QueueOpenAiChatCompletion request)
217
252
218
253
if ( request . Request . Messages . IsNullOrEmpty ( ) )
219
254
throw new ArgumentNullException ( nameof ( request . Request . Messages ) ) ;
220
-
255
+
221
256
var qualifiedModel = appData . GetQualifiedModel ( request . Request . Model ) ;
222
- if ( qualifiedModel == null )
257
+
258
+ var customModel = appData . AiProviders
259
+ . Where ( x => x . AiTypeId == "Custom" )
260
+ . SelectMany ( x => x . SelectedModels )
261
+ . FirstOrDefault ( x => x == request . Request . Model ) ;
262
+
263
+ if ( qualifiedModel == null && customModel == null )
223
264
throw HttpError . NotFound ( $ "Model { request . Request . Model } not found") ;
224
265
266
+ qualifiedModel ??= customModel ;
267
+
225
268
var queueCounts = jobs . GetWorkerQueueCounts ( ) ;
226
269
var providerQueueCount = int . MaxValue ;
227
270
AiProvider ? useProvider = null ;
@@ -497,13 +540,23 @@ public object Any(CreateAiProvider request)
497
540
request . Models ??= [ ] ;
498
541
foreach ( var selectedModel in request . SelectedModels )
499
542
{
500
- var qualifiedModel = appData . GetQualifiedModel ( selectedModel ) ;
501
- if ( qualifiedModel == null )
502
- continue ;
503
- request . Models . Add ( new ( )
543
+ if ( request . AiTypeId == "Custom" )
544
+ {
545
+ request . Models . Add ( new ( )
546
+ {
547
+ Model = selectedModel
548
+ } ) ;
549
+ }
550
+ else
504
551
{
505
- Model = qualifiedModel
506
- } ) ;
552
+ var qualifiedModel = appData . GetQualifiedModel ( selectedModel ) ;
553
+ if ( qualifiedModel == null )
554
+ continue ;
555
+ request . Models . Add ( new ( )
556
+ {
557
+ Model = qualifiedModel
558
+ } ) ;
559
+ }
507
560
}
508
561
}
509
562
@@ -515,20 +568,34 @@ public object Any(CreateAiProvider request)
515
568
public object Any ( UpdateAiProvider request )
516
569
{
517
570
var ignore = new [ ] { nameof ( request . Id ) , nameof ( request . SelectedModels ) } ;
571
+ var provider = Db . SingleById < AiProvider > ( request . Id ) ;
572
+ if ( provider == null )
573
+ throw HttpError . NotFound ( "Provider not found" ) ;
574
+
518
575
// Only call AutoQuery Update if there's something to update
519
576
IdResponse ? response = null ;
520
577
if ( request . SelectedModels is { Count : > 0 } )
521
578
{
522
579
request . Models ??= [ ] ;
523
580
foreach ( var selectedModel in request . SelectedModels )
524
581
{
525
- var qualifiedModel = appData . GetQualifiedModel ( selectedModel ) ;
526
- if ( qualifiedModel == null )
527
- continue ;
528
- request . Models . Add ( new ( )
582
+ if ( provider . AiTypeId == "Custom" )
529
583
{
530
- Model = qualifiedModel
531
- } ) ;
584
+ request . Models . Add ( new ( )
585
+ {
586
+ Model = selectedModel
587
+ } ) ;
588
+ }
589
+ else
590
+ {
591
+ var qualifiedModel = appData . GetQualifiedModel ( selectedModel ) ;
592
+ if ( qualifiedModel == null )
593
+ continue ;
594
+ request . Models . Add ( new ( )
595
+ {
596
+ Model = qualifiedModel
597
+ } ) ;
598
+ }
532
599
}
533
600
}
534
601
if ( request . ToObjectDictionary ( ) . HasNonDefaultValues ( ignoreKeys : ignore ) || Request ! . QueryString [ Keywords . Reset ] != null )
0 commit comments