Files
intendant/Intendant/Intendant.Shared/Services/OpenAiResponsesService.cs
T
2026-10-06 01:27:51 +02:00

78 lines
2.4 KiB
C#

#pragma warning disable OPENAI001
using OpenAI.Responses;
using System.ClientModel;
namespace Intendant.Shared.Services;
public sealed class OpenAiResponsesService : IOpenAiResponsesService
{
private readonly IOpenAiSettingsService _settingsService;
public OpenAiResponsesService(IOpenAiSettingsService settingsService)
{
_settingsService = settingsService;
}
public async Task<string> GenerateTextAsync(string prompt, CancellationToken cancellationToken = default)
{
if (string.IsNullOrWhiteSpace(prompt))
{
throw new ArgumentException("Le prompt ne peut pas être vide.", nameof(prompt));
}
OpenAiResponsesOptions settings = await _settingsService.GetAsync(cancellationToken);
string apiKey = settings.ApiKey?.Trim() ?? string.Empty;
if (string.IsNullOrWhiteSpace(apiKey))
{
throw new InvalidOperationException("La clé API OpenAI est requise pour appeler la Responses API.");
}
string model = string.IsNullOrWhiteSpace(settings.Model)
? "gpt-5-mini"
: settings.Model;
ResponsesClient client = CreateClient(apiKey, settings.Endpoint);
CreateResponseOptions options = new()
{
Model = model,
};
options.InputItems.Add(ResponseItem.CreateUserMessageItem(prompt));
ResponseResult response = await client.CreateResponseAsync(options, cancellationToken);
string text = string.Join(
Environment.NewLine,
response.OutputItems
.OfType<MessageResponseItem>()
.SelectMany(message => message.Content)
.Select(content => content.Text)
.Where(value => !string.IsNullOrWhiteSpace(value)));
return text;
}
private static ResponsesClient CreateClient(string apiKey, string endpoint)
{
if (string.IsNullOrWhiteSpace(endpoint))
{
return new ResponsesClient(apiKey);
}
if (!Uri.TryCreate(endpoint, UriKind.Absolute, out Uri? endpointUri))
{
throw new InvalidOperationException("L'endpoint OpenAI configuré est invalide.");
}
ResponsesClientOptions clientOptions = new()
{
Endpoint = endpointUri,
};
return new ResponsesClient(new ApiKeyCredential(apiKey), clientOptions);
}
}
#pragma warning restore OPENAI001