using System.Net.Http.Json; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace GymLogAI.AI; public sealed class OpenRouterChatClient( HttpClient httpClient, IOptions options, ILogger logger) { private readonly OpenRouterOptions _options = options.Value; public async Task CompleteAsync(string prompt, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(_options.ApiKey)) { logger.LogInformation("OpenRouter API key is not configured. Returning stubbed chat completion."); return null; } using var request = new HttpRequestMessage(HttpMethod.Post, "chat/completions") { Content = JsonContent.Create(new { model = _options.ChatModel, messages = new[] { new { role = "user", content = prompt } } }) }; request.Headers.Authorization = new("Bearer", _options.ApiKey); var response = await httpClient.SendAsync(request, cancellationToken); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(cancellationToken); } }