using System.Text; using Azaion.Common.Database; using Azaion.Common.DTO.Config; using Azaion.CommonSecurity; using Azaion.CommonSecurity.DTO.Commands; using Azaion.CommonSecurity.Services; using MessagePack; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace Azaion.Common.Services; public interface IInferenceService { Task RunInference(List mediaPaths, Func processAnnotation, CancellationToken detectToken = default); void StopInference(); } public class InferenceService(ILogger logger, [FromKeyedServices(SecurityConstants.EXTERNAL_INFERENCE_PATH)] IExternalClient externalClient, IOptions aiConfigOptions) : IInferenceService { public async Task RunInference(List mediaPaths, Func processAnnotation, CancellationToken detectToken = default) { var aiConfig = aiConfigOptions.Value; aiConfig.Paths = mediaPaths; externalClient.Send(RemoteCommand.Create(CommandType.Inference, aiConfig)); while (!detectToken.IsCancellationRequested) { try { var bytes = externalClient.GetBytes(ct: detectToken); if (bytes == null) throw new Exception("Can't get bytes from inference client"); if (bytes.Length == 4 && Encoding.UTF8.GetString(bytes) == "DONE") return; var annotationImage = MessagePackSerializer.Deserialize(bytes, cancellationToken: detectToken); await processAnnotation(annotationImage); } catch (Exception e) { logger.LogError(e, e.Message); break; } } } public void StopInference() { externalClient.Send(RemoteCommand.Create(CommandType.StopInference)); } }