namespace Deal.Modules.Settings.Application.Models; /// /// Снимок глобальной конфигурации ИИ-провайдера с расшифрованным ключом (только для внутреннего использования). /// /// Id провайдера из каталога ; пусто — конфигурация не задана. /// Базовый URL API (эффективный: сохранённый или дефолт каталога). /// Активная модель (эффективная: сохранённая или первая из каталога). /// API-ключ открытым текстом (пусто — не задан; локальным провайдерам не нужен). public sealed record AiGlobalConfigSnapshot( string ProviderId, string BaseUrl, string Model, string ApiKey) { /// /// Провайдер каталога по или null для неизвестного/незаданного id /// public AiProviderDefinition? Meta => AiProviders.All.FirstOrDefault(provider => provider.Id == ProviderId); /// /// Конфигурация готова к вызовам ИИ: провайдер известен, адрес и модель непустые, /// ключ задан (или не нужен локальному провайдеру) /// public bool Configured => Meta is not null && BaseUrl.Length > 0 && Model.Length > 0 && (Meta.Local || ApiKey.Length > 0); }