Files
BeWoPlaner/Server/Components/AICore/Facade/LLM/OpenWebApiClient.cs
2025-12-02 17:13:49 +01:00

128 lines
2.8 KiB
C#

using BeWo.ServerUtils.ApiFacade;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Feature.AI;
using BS.Shared.Extensions;
using BS.Shared.Interface;
using BS.Shared.Logger;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
namespace AICore.Facade.LLM
{
public class OpenWebApiClient : BaseLLMApiClient
{
public OpenWebApiClient(string base_url, string api_key) : base(base_url, api_key)
{
}
public override ApiResponse<IEnumerable<AiModelDC>> GetAiModelle()
{
var models = new List<AiModelDC>();
var response_format = new
{
data = new[]
{
new
{
id = "",
name = "",
details = new
{
max_context_size = 0
}
}
}
};
var response = _GetClientFacade.GetAnonymousTypeAsync("api/models", response_format, _ErrorExtractor).GetAwaiter().GetResult();
if (!response.Success)
{
throw new NotImplementedException();
}
var data = response.Data.data.Select(x => new AiModelDC(AiModelSource.openwebui, x.name, x.details?.max_context_size ?? -2));
return ApiResponse<IEnumerable<AiModelDC>>.SuccessResponse(data);
}
public override ApiResponse<string> SendAiMessageRequest(dynamic payload, out string message, out string model, out int? duration, FileLogger logger = null)
{
message = null;
duration = null;
model = null;
_PostClientFacade.JsonObject = payload;
if (logger is object)
{
logger.Log(LogLevel.Info, "Request:");
logger.LogJson(LogLevel.Info, _PostClientFacade.JsonObject);
}
var response_format = new
{
id = string.Empty,
model = string.Empty,
choices = new[]
{
new
{
index = 0,
message = new
{
content = string.Empty,
role = string.Empty
}
}
},
usage = new
{
total_duration = 0L,
total_tokens = 68L
}
};
var response = _PostClientFacade.GetAnonymousTypeAsync("api/chat/completions", response_format, _ErrorExtractor).GetAwaiter().GetResult();
if (logger is object)
{
logger.Log(LogLevel.Info, "Response:");
logger.LogJson(LogLevel.Info, response);
}
if (!response.Success)
return response.Copy<string>();
var json = response.GetResponseData();
foreach (var choice in json.choices)
{
if (choice?.message is object && !string.IsNullOrEmpty(choice.message.content))
{
var total_ns = json.usage.total_duration;
var total_ms = total_ns / 1000000;
duration = (int)total_ms;
model = json.model;
var assi_msg = BS.Shared.Core.Utils.ConvertToISO88591(choice.message.content);
message = assi_msg;
return ApiResponse<string>.SuccessResponse(assi_msg);
}
}
return ApiResponse<string>.FailureResponse("Keine Antwort");
}
}
}