using BS.Shared.DataContracts; using BS.Shared.DataContracts.Feature.AI; using BS.Shared.Extensions; using BS.Shared.Interface; using System.Collections.Generic; using System; using System.Linq; using System.Net.Sockets; using BeWo.ServiceUtils.ApiFacade; using System.Net; namespace AICore.Facade.LLM { public class OllamaApiClient : BaseLLMApiClient { private protected readonly HttpClientFacade _GetClientFacade; private protected readonly JsonHttpClientFacade _PostClientFacade; private protected readonly IApiErrorExtractor _ErrorExtractor; public OllamaApiClient(string base_url, string api_key) { _GetClientFacade = new HttpClientFacade(base_url, api_key, false); _PostClientFacade = new JsonHttpClientFacade(base_url, api_key, false) { Timeout = TimeSpan.FromMinutes(10) }; _ErrorExtractor = new DefaultErrorExtractor(); } public override ApiResponse> GetAiModelle() { var models = new List(); var response_format = new { models = new[] { new { name = "", model = "", details = new { max_context_size = 0 } } } }; var response = _GetClientFacade.GetAnonymousTypeAsync("api/ollama/models", response_format, _ErrorExtractor).GetAwaiter().GetResult(); if (!response.Success) { throw new NotImplementedException(); } var data = response.Data.models.Select(x => new AiModelDC(BS.Shared.AiModelSource.ollama, x.name, x.details.max_context_size)); return ApiResponse>.SuccessResponse(data); } public override ApiResponse SendAiMessageRequest(dynamic payload, out string message, out string model, out int? duration) { message = null; duration = null; model = null; _PostClientFacade.JsonObject = payload; var response_format = new { id = string.Empty, model = string.Empty, message = new { content = string.Empty, role = string.Empty }, done_reason = "stop", done = true, total_duration = 1316754573L, load_duration = 31739136L, prompt_eval_count = 22L, prompt_eval_duration = 2132887L, eval_count = 66L, eval_duration = 1282438235L }; var response = _PostClientFacade.GetAnonymousTypeAsync("api/ollama/chat/completions", response_format, _ErrorExtractor).GetAwaiter().GetResult(); if (!response.Success) return response.Copy(); var json = response.GetResponseData(); if (json.message is object && !string.IsNullOrEmpty(json.message.content)) { var total_ns = json.total_duration; var total_ms = total_ns / 1000000; duration = (int)total_ms; model = json.model; var assi_msg = BS.Shared.Core.Utils.ConvertToISO88591(json.message.content); message = assi_msg; return ApiResponse.SuccessResponse(assi_msg); } return null; } } }