Skip to content

Commit e85f534

Browse files
committed
Upgrade to latest llms.py version
1 parent 0a6f9dc commit e85f534

26 files changed

Lines changed: 6244 additions & 401 deletions

ServiceStack/src/ServiceStack.AI.Chat/ChatFeature.cs

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Net;
2+
using System.Runtime.Serialization;
23
using System.Security.Claims;
34
using Microsoft.Extensions.DependencyInjection;
45
using Microsoft.Extensions.DependencyInjection.Extensions;
@@ -355,10 +356,28 @@ public List<KeyValuePair<string, OpenAiProviderBase>> GetModelProviders(ChatComp
355356
}
356357

357358
[ExcludeMetadata, Route("/chat/models")]
358-
public class ChatModels : IGet, IReturn<string[]>
359+
public class ChatModels : IGet, IReturn<ModelInfo[]>
359360
{
360361
}
361362

363+
[DataContract]
364+
public class ModelInfo
365+
{
366+
[DataMember]
367+
public string Id { get; set; }
368+
[DataMember]
369+
public string Provider { get; set; }
370+
[DataMember(Name = "provider_model")]
371+
public string ProviderModel { get; set; }
372+
[DataMember]
373+
public ModelPrice? Pricing { get; set; }
374+
}
375+
public class ModelPrice
376+
{
377+
public string? Input { get; set; }
378+
public string? Output { get; set; }
379+
}
380+
362381
[ExcludeMetadata, Route("/chat/config")]
363382
public class ChatConfig : IGet, IReturn<string>
364383
{
@@ -492,12 +511,27 @@ public async Task<object> Get(ChatModels request)
492511
{
493512
var (feature, error) = await AssertAccessAsync();
494513
if (error != null) return error;
495-
var models = new HashSet<string>();
514+
var existingModels = new HashSet<string>();
515+
var ret = new List<ModelInfo>();
496516
foreach (var entry in feature.Providers)
497517
{
498-
models.AddDistinctRange(entry.Value.Models.Keys);
518+
var providerId = entry.Key;
519+
var provider = entry.Value;
520+
foreach (var model in provider.Models)
521+
{
522+
if (!existingModels.Add(model.Key))
523+
continue;
524+
existingModels.Add(model.Key);
525+
ret.Add(new ModelInfo
526+
{
527+
Id = model.Key,
528+
Provider = providerId,
529+
ProviderModel = model.Value,
530+
Pricing = provider.Pricing?.GetValueOrDefault(model.Key) ?? provider.DefaultPricing,
531+
});
532+
}
499533
}
500-
return models;
534+
return ret;
501535
}
502536

503537
public async Task<object> Get(ChatConfig request)

ServiceStack/src/ServiceStack.AI.Chat/OpenAiProviderBase.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public abstract class OpenAiProviderBase(ILogger log, IHttpClientFactory factory
3030
public double? TopP { get; set; }
3131
public string? Verbosity { get; set; }
3232
public bool? EnableThinking { get; set; }
33+
public ModelPrice DefaultPricing { get; set; }
34+
public Dictionary<string, ModelPrice> Pricing { get; set; } = [];
3335

3436
public ILogger Log { get; set; } = log;
3537
public IHttpClientFactory Factory { get; set; } = factory;
@@ -174,6 +176,29 @@ public void Populate(Dictionary<string, object?> definition)
174176
{
175177
EnableThinking = enableThinking;
176178
}
179+
if (definition.TryGetObject("pricing", out Dictionary<string, object?> pricing))
180+
{
181+
Pricing = new();
182+
foreach (var entry in pricing)
183+
{
184+
if (entry.Value is Dictionary<string, object?> modelPrice)
185+
{
186+
Pricing[entry.Key] = new ModelPrice
187+
{
188+
Input = modelPrice.GetValueOrDefault("input") as string,
189+
Output = modelPrice.GetValueOrDefault("output") as string,
190+
};
191+
}
192+
}
193+
}
194+
if (definition.TryGetObject("default_pricing", out var defaultPricing))
195+
{
196+
DefaultPricing = new ModelPrice
197+
{
198+
Input = defaultPricing.GetValueOrDefault("input") as string,
199+
Output = defaultPricing.GetValueOrDefault("output") as string,
200+
};
201+
}
177202
}
178203

179204
public virtual Task LoadAsync(CancellationToken token=default) => Task.CompletedTask;

0 commit comments

Comments
 (0)