Files
Deal/src/core/Deal.Modules.Settings/Application/Models/PublicSettingsDto.cs
T
stepan 78fe64f531 Перенести настройку ИИ-провайдера в глобальные настройки оператора
Провайдера, модель, baseUrl и API-ключ задаёт оператор: конфигурация хранится в public.global_settings (ключ aiConfig, шифрование enc:), читается общей для всех тенантов и используется AiProviderConfigBuilder во всех ИИ-вызовах. Настройки тенанта больше не содержат aiProvider/aiConfigs, пользовательский POST /api/ai/check удалён. Добавлены операторские ручки GET/PUT /api/operator/settings/ai-config и POST .../check с аудитом ai_config_changed.
2026-09-15 21:56:11 +03:00

214 lines
7.1 KiB
C#

namespace Deal.Modules.Settings.Application.Models;
/// <summary>
/// Публичный снимок настроек тенанта — тело ответа GET/PATCH /api/settings.
/// </summary>
public sealed record PublicSettingsDto
{
/// <summary>
/// Авто-архивация выполненных/отклонённых карточек.
/// </summary>
public bool AutoArchive { get; init; }
/// <summary>
/// Дней до авто-архивации карточки
/// </summary>
public int ArchiveAfterDays { get; init; }
/// <summary>
/// Дней хранения в архиве до очистки.
/// </summary>
public int ArchiveClearDays { get; init; }
/// <summary>
/// Дней хранения в корзине до очистки.
/// </summary>
public int TrashClearDays { get; init; }
/// <summary>
/// Минимальная длина сообщения для -1 фильтра
/// </summary>
public int MinLen { get; init; }
/// <summary>
/// Стоп-фразы -1 фильтра.
/// </summary>
public IReadOnlyList<string> StopPhrases { get; init; } = Array.Empty<string>();
/// <summary>
/// Локальный ML-слой включён.
/// </summary>
public bool MlEnabled { get; init; }
/// <summary>
/// Полный выключатель ИИ
/// </summary>
public bool AiEnabled { get; init; }
/// <summary>
/// ИИ-фильтр (страж) входящих включён.
/// </summary>
public bool AiFilterEnabled { get; init; }
/// <summary>
/// Промпт классификатора входящих
/// </summary>
public string AiPrompt { get; init; } = string.Empty;
/// <summary>
/// Промпт ИИ-фильтра входящих.
/// </summary>
public string AiFilterPrompt { get; init; } = string.Empty;
/// <summary>
/// Промпт структуры карточки
/// </summary>
public string CardPrompt { get; init; } = string.Empty;
/// <summary>
/// Тип собираемых заявок
/// </summary>
public string WantedType { get; init; } = string.Empty;
/// <summary>
/// Без указания суммы не создавать карточку найма.
/// </summary>
public bool BudgetRequiredHire { get; init; }
/// <summary>
/// Без указания суммы не создавать карточку заказа.
/// </summary>
public bool BudgetRequiredOrder { get; init; }
/// <summary>
/// Подпись найма на карточке.
/// </summary>
public string HireLabel { get; init; } = string.Empty;
/// <summary>
/// Подпись разового заказа на карточке.
/// </summary>
public string OrderLabel { get; init; } = string.Empty;
/// <summary>
/// Описание сферы
/// </summary>
public string DomainDescription { get; init; } = string.Empty;
/// <summary>
/// Общие слова-маркеры заявок сферы.
/// </summary>
public IReadOnlyList<string> DomainKeywords { get; init; } = Array.Empty<string>();
/// <summary>
/// Маркеры найма
/// </summary>
public IReadOnlyList<string> HireMarkers { get; init; } = Array.Empty<string>();
/// <summary>
/// Термины грейдов/уровней.
/// </summary>
public IReadOnlyList<string> LevelTerms { get; init; } = Array.Empty<string>();
/// <summary>
/// Маркеры резюме соискателей.
/// </summary>
public IReadOnlyList<string> ResumeMarkers { get; init; } = Array.Empty<string>();
/// <summary>
/// Отсекать резюме соискателей на.
/// </summary>
public bool BlockResumes { get; init; }
/// <summary>
/// Глобальные исключения по ключевым словам/фразам/технологиям
/// </summary>
public IReadOnlyList<string> ExcludeKeywords { get; init; } = Array.Empty<string>();
/// <summary>
/// Глобальные исключения по локации/языку
/// </summary>
public IReadOnlyList<string> ExcludeLocations { get; init; } = Array.Empty<string>();
/// <summary>
/// Глобальные исключения по типу заявки
/// </summary>
public IReadOnlyList<string> ExcludeTypes { get; init; } = Array.Empty<string>();
/// <summary>
/// Нижняя граница глобального исключения по бюджету
/// </summary>
public int ExcludeBudgetFrom { get; init; }
/// <summary>
/// Верхняя граница глобального исключения по бюджету
/// </summary>
public int ExcludeBudgetTo { get; init; }
/// <summary>
/// Личная библиотека промптов пользователя.
/// </summary>
public IReadOnlyList<MyPromptDto> MyPrompts { get; init; } = Array.Empty<MyPromptDto>();
/// <summary>
/// Общие напоминания включены.
/// </summary>
public bool RemindersEnabled { get; init; }
/// <summary>
/// Конвертация бюджетов карточек включена.
/// </summary>
public bool ConversionOn { get; init; }
/// <summary>
/// Целевая валюта конвертации.
/// </summary>
public string TargetCurrency { get; init; } = string.Empty;
/// <summary>
/// Источник курсов
/// </summary>
public string RateSource { get; init; } = string.Empty;
/// <summary>
/// Авто-мониторинг новых чатов/каналов.
/// </summary>
public bool AutoMonitorNew { get; init; }
/// <summary>
/// Суточный лимит авто-вступлений Discovery
/// </summary>
public int DiscJoinLimit { get; init; }
/// <summary>
/// Нижняя граница паузы между авто-вступлениями, сек
/// </summary>
public int DiscJoinDelayMin { get; init; }
/// <summary>
/// Верхняя граница паузы между авто-вступлениями, сек
/// </summary>
public int DiscJoinDelayMax { get; init; }
/// <summary>
/// Размер выборки сообщений при оценке канала
/// </summary>
public int DiscEvalSample { get; init; }
/// <summary>
/// Процент подходящих сообщений для оценки канала
/// </summary>
public int DiscEvalThreshold { get; init; }
/// <summary>
/// Стоп-кран авто-вступлений Discovery.
/// </summary>
public bool DiscPaused { get; init; }
/// <summary>
/// Состояние колонок канбана.
/// </summary>
public IReadOnlyDictionary<string, object?> ColState { get; init; } =
new Dictionary<string, object?>();
}