- OpenAI als vollwertiger Chat-Provider (Modell-Auswahl, Key-Routing, StreamChat) - Hardcoded OpenAI-Modelle im Cache (gpt-5.x, gpt-4.1, o3, o4-mini etc.) - /api/models/openai Endpoint, OpenAI-Optgroup im Agent-Dropdown - Key-Routing: OpenAI-Key aus api_keys-Tabelle, Fallback via GetFirstActiveKeyByProvider - OpenAI-Checker: 2-Schritt-Check (Models + chat/completions mit max_tokens=1) - Google-Checker: 2-Schritt-Check (Models + generateContent mit maxOutputTokens=1) - 429 insufficient_quota und billing_not_active korrekt als quota_exceeded erkannt - Provider-Erkennung beim Adopt via KeyPatterns.DetectType() statt hardcoded anthropic - HandleCheck/HandleCheckAll unterstützt jetzt Anthropic, OpenAI und Google - Neue scanner_logs-Tabelle mit details-Spalte (JSON) für strukturierte Auswertung - GitHubEventScannerService: AddLog persistiert in DB, detaillierte Key-Fund-Logs - KeyScannerService: AddLog-Methode mit DB-Persistierung, detaillierte Logs - Frontend: Ungeprüfte-prüfen-Button (sequenziell, stoppt bei valid) - Frontend: Provider-Indicator im Key-Switch-Modal (Anthropic/OpenAI/Google) - Frontend: Check-Button für alle Provider (nicht nur Anthropic)
59 lines
2.0 KiB
C#
59 lines
2.0 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.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 async Task<IResult> HandleRefresh(OpenAiService openAiService)
|
|
{
|
|
await openAiService.RefreshModelsFromApis();
|
|
return Results.Json(new { success = true, message = "Modelle neu geladen und gecacht." });
|
|
}
|
|
}
|