Skip to content

Commit 6a5288e

Browse files
committed
add model loader
1 parent 3778b9f commit 6a5288e

File tree

9 files changed

+75
-14
lines changed

9 files changed

+75
-14
lines changed

src/BE/Controllers/Admin/AdminModels/AdminModelsController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public async Task<ActionResult> DeleteModel(short modelId, CancellationToken can
182182
[HttpPost("models/validate")]
183183
public async Task<ActionResult<ModelValidateResult>> ValidateModel(
184184
[FromBody] ValidateModelRequest req,
185-
[FromServices] ModelFactory conversationFactory,
185+
[FromServices] ChatFactory chatFactory,
186186
CancellationToken cancellationToken)
187187
{
188188
ModelKey? modelKey = await db.ModelKeys
@@ -204,7 +204,7 @@ public async Task<ActionResult<ModelValidateResult>> ValidateModel(
204204
return this.BadRequestMessage($"Model reference id: {req.ModelReferenceId} not found");
205205
}
206206

207-
ModelValidateResult result = await conversationFactory.ValidateModel(modelKey, modelReference, req.DeploymentName, cancellationToken);
207+
ModelValidateResult result = await chatFactory.ValidateModel(modelKey, modelReference, req.DeploymentName, cancellationToken);
208208
return Ok(result);
209209
}
210210

src/BE/Controllers/Admin/ModelKeys/ModelKeysController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public async Task<ActionResult> DeleteModelKey(short modelKeyId, CancellationTok
115115
}
116116

117117
[HttpPost("{modelKeyId:int}/auto-create-models")]
118-
public async Task<ActionResult<AutoCreateModelResult[]>> AutoCreateModels(short modelKeyId, [FromServices] ModelFactory conversationFactory, CancellationToken cancellationToken)
118+
public async Task<ActionResult<AutoCreateModelResult[]>> AutoCreateModels(short modelKeyId, [FromServices] ChatFactory chatFactory, CancellationToken cancellationToken)
119119
{
120120
ModelKey? modelKey = await db
121121
.ModelKeys
@@ -140,7 +140,7 @@ public async Task<ActionResult<AutoCreateModelResult[]>> AutoCreateModels(short
140140
ParepareAutoCreateModelResult[] scanedModels = await Task.WhenAll(readyRefs
141141
.Select(async r => existingModelRefIds.Contains(r.Id)
142142
? ParepareAutoCreateModelResult.ModelAlreadyExists(r)
143-
: ParepareAutoCreateModelResult.FromModelValidateResult(await conversationFactory.ValidateModel(modelKey, r, r.Name, cancellationToken), r)));
143+
: ParepareAutoCreateModelResult.FromModelValidateResult(await chatFactory.ValidateModel(modelKey, r, r.Name, cancellationToken), r)));
144144

145145
FileService? fileService = await db.FileServices
146146
.OrderByDescending(x => x.Id)

src/BE/Controllers/Chats/Chats/ChatController.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public async Task<IActionResult> FreshChat(
3131
[FromServices] ILogger<ChatController> logger,
3232
[FromServices] IUrlEncryptionService idEncryption,
3333
[FromServices] BalanceService balanceService,
34-
[FromServices] ModelFactory chatFactory,
34+
[FromServices] ChatFactory chatFactory,
3535
[FromServices] UserModelManager userModelManager,
3636
[FromServices] ClientInfoManager clientInfoManager,
3737
[FromServices] FileUrlProvider fup,
@@ -62,7 +62,7 @@ public async Task<IActionResult> RegenerateMessage(
6262
[FromServices] ILogger<ChatController> logger,
6363
[FromServices] IUrlEncryptionService idEncryption,
6464
[FromServices] BalanceService balanceService,
65-
[FromServices] ModelFactory chatFactory,
65+
[FromServices] ChatFactory chatFactory,
6666
[FromServices] UserModelManager userModelManager,
6767
[FromServices] ClientInfoManager clientInfoManager,
6868
[FromServices] FileUrlProvider fup,
@@ -87,7 +87,7 @@ public async Task<IActionResult> GeneralChat(
8787
[FromServices] ILogger<ChatController> logger,
8888
[FromServices] IUrlEncryptionService idEncryption,
8989
[FromServices] BalanceService balanceService,
90-
[FromServices] ModelFactory chatFactory,
90+
[FromServices] ChatFactory chatFactory,
9191
[FromServices] UserModelManager userModelManager,
9292
[FromServices] ClientInfoManager clientInfoManager,
9393
[FromServices] FileUrlProvider fup,
@@ -131,7 +131,7 @@ private async Task<IActionResult> ChatPrivate(
131131
ILogger<ChatController> logger,
132132
IUrlEncryptionService idEncryption,
133133
BalanceService balanceService,
134-
ModelFactory chatFactory,
134+
ChatFactory chatFactory,
135135
UserModelManager userModelManager,
136136
ClientInfoManager clientInfoManager,
137137
FileUrlProvider fup,
@@ -366,7 +366,7 @@ private static async Task<Message> MakeDbUserMessage(Chat chat, FileUrlProvider
366366
private static async Task<ChatSpanResponse> ProcessChatSpan(
367367
CurrentUser currentUser,
368368
ILogger<ChatController> logger,
369-
ModelFactory chatFactory,
369+
ChatFactory chatFactory,
370370
FileUrlProvider fup,
371371
ChatSpanRequest span,
372372
long firstTick,
@@ -399,7 +399,7 @@ private static async Task<ChatSpanResponse> ProcessChatSpan(
399399
string? errorText = null;
400400
try
401401
{
402-
using ChatService s = chatFactory.CreateConversationService(userModel.Model);
402+
using ChatService s = chatFactory.CreateChatService(userModel.Model);
403403
await foreach (InternalChatSegment seg in icc.Run(userBalance.Balance, userModel, s.ChatStreamedFEProcessed(messageToSend, cco, extraDetails, cancellationToken)))
404404
{
405405
if (seg.TextSegment == string.Empty) continue;

src/BE/Controllers/OpenAICompatible/OpenAICompatibleController.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
namespace Chats.BE.Controllers.OpenAICompatible;
1818

1919
[Route("v1"), Authorize(AuthenticationSchemes = "OpenAIApiKey")]
20-
public partial class OpenAICompatibleController(ChatsDB db, CurrentApiKey currentApiKey, ModelFactory cf, UserModelManager userModelManager, ILogger<OpenAICompatibleController> logger, BalanceService balanceService) : ControllerBase
20+
public partial class OpenAICompatibleController(ChatsDB db, CurrentApiKey currentApiKey, ChatFactory cf, UserModelManager userModelManager, ILogger<OpenAICompatibleController> logger, BalanceService balanceService) : ControllerBase
2121
{
2222
[HttpPost("chat/completions")]
2323
public async Task<ActionResult> ChatCompletion([FromBody] JsonObject json, [FromServices] ClientInfoManager clientInfoManager, CancellationToken cancellationToken)
@@ -37,7 +37,7 @@ public async Task<ActionResult> ChatCompletion([FromBody] JsonObject json, [From
3737
if (userModel == null) return InvalidModel(cco.Model);
3838

3939
Model cm = userModel.Model;
40-
using ChatService s = cf.CreateConversationService(cm);
40+
using ChatService s = cf.CreateChatService(cm);
4141

4242
UserBalance userBalance = await db.UserBalances
4343
.Where(x => x.UserId == currentApiKey.User.Id)

src/BE/DB/Enums/DBModelProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ public enum DBModelProvider
1616
xAI = 11,
1717
GithubModels = 12,
1818
GoogleAI = 13,
19+
Ollama = 14,
20+
MiniMax = 15,
1921
}

src/BE/Services/Models/ChatFactory.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55
using Chats.BE.Services.Models.ChatServices.OpenAI;
66
using Chats.BE.Services.Models.ChatServices.QianFan;
77
using Chats.BE.Services.Models.ChatServices.Test;
8+
using Chats.BE.Services.Models.ModelLoaders;
89
using OpenAI.Chat;
910

1011
namespace Chats.BE.Services.Models;
1112

1213
public class ChatFactory(ILogger<ChatFactory> logger)
1314
{
14-
public ChatService CreateConversationService(Model model)
15+
public ChatService CreateChatService(Model model)
1516
{
1617
DBModelProvider modelProvider = (DBModelProvider)model.ModelKey.ModelProviderId;
1718
ChatService cs = modelProvider switch
@@ -30,14 +31,41 @@ public ChatService CreateConversationService(Model model)
3031
DBModelProvider.xAI => new XAIChatService(model),
3132
DBModelProvider.GithubModels => new GithubModelsChatService(model),
3233
DBModelProvider.GoogleAI => new GoogleAIChatService(model),
34+
DBModelProvider.Ollama => new OllamaChatService(model),
35+
DBModelProvider.MiniMax => new MiniMaxChatService(model),
3336
_ => throw new NotSupportedException($"Unknown model provider: {modelProvider}")
3437
};
3538
return cs;
3639
}
3740

41+
public ModelLoader? CreateModelLoader(DBModelProvider modelProvider)
42+
{
43+
ModelLoader? ml = modelProvider switch
44+
{
45+
DBModelProvider.Test => null,
46+
DBModelProvider.OpenAI => null,
47+
DBModelProvider.AzureOpenAI => null,
48+
DBModelProvider.WenXinQianFan => null,
49+
DBModelProvider.AliyunDashscope => null,
50+
DBModelProvider.ZhiPuAI => null,
51+
DBModelProvider.Moonshot => null,
52+
DBModelProvider.HunYuan => null,
53+
DBModelProvider.Sparkdesk => null,
54+
DBModelProvider.LingYi => null,
55+
DBModelProvider.DeepSeek => null,
56+
DBModelProvider.xAI => null,
57+
DBModelProvider.GithubModels => null,
58+
DBModelProvider.GoogleAI => null,
59+
DBModelProvider.Ollama => new OpenAIModelLoader(),
60+
DBModelProvider.MiniMax => null,
61+
_ => throw new NotSupportedException($"Unknown model provider: {modelProvider}")
62+
};
63+
return ml;
64+
}
65+
3866
public async Task<ModelValidateResult> ValidateModel(ModelKey modelKey, ModelReference modelReference, string? deploymentName, CancellationToken cancellationToken)
3967
{
40-
using ChatService cs = CreateConversationService(new Model
68+
using ChatService cs = CreateChatService(new Model
4169
{
4270
ModelKey = modelKey,
4371
ModelReference = modelReference,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
using Chats.BE.DB;
2+
3+
namespace Chats.BE.Services.Models.ChatServices.OpenAI;
4+
5+
public class MiniMaxChatService(Model model) : OpenAIChatService(model, new Uri("https://api.minimax.chat/v1"));
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
using Chats.BE.DB;
2+
3+
namespace Chats.BE.Services.Models.ChatServices.OpenAI;
4+
5+
public class OllamaChatService(Model model) : OpenAIChatService(model);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Chats.BE.DB;
2+
using OpenAI;
3+
using OpenAI.Models;
4+
using System.ClientModel;
5+
6+
namespace Chats.BE.Services.Models.ModelLoaders;
7+
8+
public class OpenAIModelLoader : ModelLoader
9+
{
10+
public override async Task<string[]> ListModels(ModelKey modelKey, CancellationToken cancellationToken)
11+
{
12+
ArgumentException.ThrowIfNullOrWhiteSpace(modelKey.Secret, nameof(modelKey.Secret));
13+
14+
OpenAIClient api = new(new ApiKeyCredential(modelKey.Secret), new OpenAIClientOptions()
15+
{
16+
Endpoint = !string.IsNullOrWhiteSpace(modelKey.Host) ? new Uri(modelKey.Host) : null,
17+
});
18+
ClientResult<OpenAIModelCollection> result = await api.GetOpenAIModelClient().GetModelsAsync(cancellationToken);
19+
return result.Value.Select(m => m.Id).ToArray();
20+
}
21+
}

0 commit comments

Comments
 (0)