Der Modell-Refresh war fuer OpenAI faktisch ein No-Op: der Key wurde nur aus
der api_keys-Tabelle geholt, und ohne Key blieb die alte Liste im Speicher
stehen und wurde direkt wieder in models_cache.json geschrieben - waehrend der
Endpoint pauschal Erfolg meldete.
- ServerSettingsService: neues Setting OpenAiApiKey (OpenAI war der einzige
Provider ohne Server-Key, analog Gemini/MiniMax/z.ai)
- OpenAiService: ResolveOpenAiKey() (Setting -> api_keys), HasServerOpenAiKey(),
ResolveProviderConfig zieht den Setting-Key auch im Chat
- OpenAiService: IsOpenAiChatModel() erfasst die o-Reihe inkl. bare IDs
(o1, o3, kuenftig o5) - StartsWith("o3-") hat die verschluckt
- RefreshModelsFromApis() liefert ProviderRefreshResult[] pro Provider;
ModelsEndpoint gibt providers[] zurueck, agent-page.js meldet uebersprungene
Provider als Fehler-Toast statt pauschalem Erfolg
- ChatEndpoint/TelegramService/CronjobService: OpenAI ohne Agent-Key faellt auf
den Server-Key zurueck statt hart abzubrechen
- ARCHITECTURE.md nachgezogen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
90 lines
3.2 KiB
C#
90 lines
3.2 KiB
C#
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Gott.Services;
|
|
using Microsoft.AspNetCore.Builder;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Routing;
|
|
|
|
namespace Gott.Endpoints;
|
|
|
|
public static class ModelsEndpoint
|
|
{
|
|
public static void MapModelsEndpoint(this IEndpointRouteBuilder app)
|
|
{
|
|
app.MapGet("/api/models/nvidia", HandleNvidiaModels);
|
|
app.MapGet("/api/models/pollinations", HandlePollinationsModels);
|
|
app.MapGet("/api/models/gemini", HandleGeminiModels);
|
|
app.MapGet("/api/models/openai", HandleOpenAiModels);
|
|
app.MapGet("/api/models/minimax", HandleMinimaxModels);
|
|
app.MapGet("/api/models/glm", HandleGlmModels);
|
|
app.MapPost("/api/models/refresh", HandleRefresh);
|
|
}
|
|
|
|
private static IResult HandleNvidiaModels(OpenAiService openAiService)
|
|
{
|
|
var models = openAiService.GetNvidiaModels()
|
|
.Select(m => new { id = m.Id, displayName = m.DisplayName })
|
|
.ToList();
|
|
return Results.Json(new { models });
|
|
}
|
|
|
|
private static IResult HandlePollinationsModels(OpenAiService openAiService)
|
|
{
|
|
var models = openAiService.GetPollinationsModels()
|
|
.Select(m => new { id = m.Id, displayName = m.DisplayName })
|
|
.ToList();
|
|
return Results.Json(new { models });
|
|
}
|
|
|
|
private static IResult HandleGeminiModels(OpenAiService openAiService)
|
|
{
|
|
var models = openAiService.GetGeminiModels()
|
|
.Select(m => new { id = m.Id, displayName = m.DisplayName })
|
|
.ToList();
|
|
return Results.Json(new { models });
|
|
}
|
|
|
|
private static IResult HandleOpenAiModels(OpenAiService openAiService)
|
|
{
|
|
var models = openAiService.GetOpenAiModels()
|
|
.Select(m => new { id = m.Id, displayName = m.DisplayName })
|
|
.ToList();
|
|
return Results.Json(new { models });
|
|
}
|
|
|
|
private static IResult HandleMinimaxModels(OpenAiService openAiService)
|
|
{
|
|
var models = openAiService.GetMinimaxModels()
|
|
.Select(m => new { id = m.Id, displayName = m.DisplayName })
|
|
.ToList();
|
|
return Results.Json(new { models });
|
|
}
|
|
|
|
private static IResult HandleGlmModels(OpenAiService openAiService)
|
|
{
|
|
var models = openAiService.GetGlmModels()
|
|
.Select(m => new { id = m.Id, displayName = m.DisplayName })
|
|
.ToList();
|
|
return Results.Json(new { models });
|
|
}
|
|
|
|
private static async Task<IResult> HandleRefresh(OpenAiService openAiService)
|
|
{
|
|
var report = await openAiService.RefreshModelsFromApis();
|
|
var loaded = report.Where(r => r.Loaded).ToList();
|
|
var skipped = report.Where(r => !r.Loaded).ToList();
|
|
|
|
var message = $"{loaded.Count} Provider neu geladen"
|
|
+ (skipped.Count > 0
|
|
? $", {skipped.Count} übersprungen: {string.Join(", ", skipped.Select(r => $"{r.Provider} ({r.Note})"))}"
|
|
: ".");
|
|
|
|
return Results.Json(new
|
|
{
|
|
success = true,
|
|
message,
|
|
providers = report.Select(r => new { provider = r.Provider, loaded = r.Loaded, count = r.Count, note = r.Note }).ToList()
|
|
});
|
|
}
|
|
}
|