Конфигурация ИИ-провайдера сейчас — личная настройка тенанта: во вкладке «ИИ» своих настроек
пользователь сам выбирает провайдера, модель и вводит API-ключ (AiTab.vue). Данные лежат
в KV-настройках тенанта (ключи aiProvider, aiConfigs, ключ шифруется с префиксом enc:),
и при каждом вызове AiProviderConfigBuilder собирает ProviderConfig для ai-service
(его используют GrpcAiClassifier, GrpcAiTools).
Решение владельца (2026-09-14): выбор и настройка моделей — забота оператора. Пользователь
должен получать те же ИИ-функции (классификация, фильтр, ключи поиска, карточки), но без
выбора провайдера/модели и ввода ключей.
Готовый образец в системе уже есть: глобальные ключи Telegram (GlobalSettingsKeys, IGlobalSettingsStore + ISecretCipher, ручки /api/operator/settings/telegram-keys,
секция «Telegram» в панели оператора) — повторяем этот путь.
Что сделать
Хранение: глобальный ключ настроек по образцу GlobalSettingsKeys.TelegramKeys, сервис
поверх IGlobalSettingsStore + ISecretCipher: провайдер (из каталога AiProviders),
модель, baseUrl, API-ключ (enc:), маскированное чтение.
Ручки оператора: GET/PUT в OperatorSettingsEndpoints (маскированный ключ на чтение,
валидация на запись — как у telegram-keys).
Панель оператора: новая секция «ИИ» в OperatorConsole.vue — форма конфигурации плюс
проверка связи (переиспользовать механизм ai-check).
Перевод вызовов: AiProviderConfigBuilder и все, кто строит ProviderConfig
(GrpcAiClassifier, GrpcAiTools, проверка связи), читают глобальную конфигурацию
оператора, а не настройки тенанта. Все экземпляры ИИ работают на одной конфигурации;
персональные переопределения по тенантам не делаем.
Вкладка «ИИ» пользователя: убрать блок провайдера/модели/baseUrl/ключа; остальное оставить
как есть — переключатель ИИ, промпты, ниша и описание. Если конфигурация оператором ещё
не задана — понятное состояние («ИИ настраивается оператором»), без ошибок.
Старые тенантовые ключи aiProvider/aiConfigs перестать читать (данные не удалять);
действующий конфиг при внедрении перенести в операторскую панель.
Аудит: изменение конфигурации ИИ оператором писать в операторский аудит
(по образцу settings_updated у тенантов).
Доки: обновить вики (Техническая документация, Инструкция пользователя, api-map)
и зеркало в docs/.
Критерии приёмки
Оператор в панели задаёт провайдера/модель/baseUrl/ключ; ключ зашифрован, на чтение маскируется
Классификация, фильтр, ключи поиска и карточки работают на конфигурации оператора (проверено живым вызовом ИИ)
Во вкладке «ИИ» у пользователя нет выбора провайдера/модели и поля ключа; остальные функции вкладки не изменились
Конфигурация не задана — ИИ-функции деградируют понятным состоянием, ошибок 500 нет
Изменение конфигурации видно в операторском аудите
Сборка и тесты core зелёные; фронтенд build + lint:i18n чисто
Вики и docs/ обновлены
Затрагивает
модули: core (Deal.Modules.Settings, Deal.Infrastructure/Integrations, Deal.Api/Endpoints),
frontend (панель оператора, вкладка «ИИ»), ai (каталог AiProviders; контракт ProviderConfig в ai.proto не меняем), docs
Не трогаем: ai-service, ml-service, контракт промптов пользователя.
Источники
Решение владельца 2026-09-14
Связано: задача #4 «Подключить живой ключ LLM и проверить классификацию»; образец — секция «Telegram» панели оператора
## Контекст
Конфигурация ИИ-провайдера сейчас — личная настройка тенанта: во вкладке «ИИ» своих настроек
пользователь сам выбирает провайдера, модель и вводит API-ключ (`AiTab.vue`). Данные лежат
в KV-настройках тенанта (ключи `aiProvider`, `aiConfigs`, ключ шифруется с префиксом `enc:`),
и при каждом вызове `AiProviderConfigBuilder` собирает `ProviderConfig` для ai-service
(его используют `GrpcAiClassifier`, `GrpcAiTools`).
Решение владельца (2026-09-14): выбор и настройка моделей — забота оператора. Пользователь
должен получать те же ИИ-функции (классификация, фильтр, ключи поиска, карточки), но без
выбора провайдера/модели и ввода ключей.
Готовый образец в системе уже есть: глобальные ключи Telegram (`GlobalSettingsKeys`,
`IGlobalSettingsStore` + `ISecretCipher`, ручки `/api/operator/settings/telegram-keys`,
секция «Telegram» в панели оператора) — повторяем этот путь.
## Что сделать
1. Хранение: глобальный ключ настроек по образцу `GlobalSettingsKeys.TelegramKeys`, сервис
поверх `IGlobalSettingsStore` + `ISecretCipher`: провайдер (из каталога `AiProviders`),
модель, baseUrl, API-ключ (`enc:`), маскированное чтение.
2. Ручки оператора: GET/PUT в `OperatorSettingsEndpoints` (маскированный ключ на чтение,
валидация на запись — как у telegram-keys).
3. Панель оператора: новая секция «ИИ» в `OperatorConsole.vue` — форма конфигурации плюс
проверка связи (переиспользовать механизм ai-check).
4. Перевод вызовов: `AiProviderConfigBuilder` и все, кто строит `ProviderConfig`
(`GrpcAiClassifier`, `GrpcAiTools`, проверка связи), читают глобальную конфигурацию
оператора, а не настройки тенанта. Все экземпляры ИИ работают на одной конфигурации;
персональные переопределения по тенантам не делаем.
5. Вкладка «ИИ» пользователя: убрать блок провайдера/модели/baseUrl/ключа; остальное оставить
как есть — переключатель ИИ, промпты, ниша и описание. Если конфигурация оператором ещё
не задана — понятное состояние («ИИ настраивается оператором»), без ошибок.
6. Старые тенантовые ключи `aiProvider`/`aiConfigs` перестать читать (данные не удалять);
действующий конфиг при внедрении перенести в операторскую панель.
7. Аудит: изменение конфигурации ИИ оператором писать в операторский аудит
(по образцу `settings_updated` у тенантов).
8. Доки: обновить вики (Техническая документация, Инструкция пользователя, api-map)
и зеркало в `docs/`.
## Критерии приёмки
- [x] Оператор в панели задаёт провайдера/модель/baseUrl/ключ; ключ зашифрован, на чтение маскируется
- [x] Классификация, фильтр, ключи поиска и карточки работают на конфигурации оператора (проверено живым вызовом ИИ)
- [x] Во вкладке «ИИ» у пользователя нет выбора провайдера/модели и поля ключа; остальные функции вкладки не изменились
- [x] Конфигурация не задана — ИИ-функции деградируют понятным состоянием, ошибок 500 нет
- [x] Изменение конфигурации видно в операторском аудите
- [x] Сборка и тесты core зелёные; фронтенд build + lint:i18n чисто
- [x] Вики и docs/ обновлены
## Затрагивает
- модули: core (Deal.Modules.Settings, Deal.Infrastructure/Integrations, Deal.Api/Endpoints),
frontend (панель оператора, вкладка «ИИ»), ai (каталог `AiProviders`; контракт
`ProviderConfig` в ai.proto не меняем), docs
- Не трогаем: ai-service, ml-service, контракт промптов пользователя.
## Источники
- Решение владельца 2026-09-14
- Связано: задача #4 «Подключить живой ключ LLM и проверить классификацию»; образец — секция «Telegram» панели оператора
- Вики: Техническая документация (настройки ИИ), Инструкция пользователя (вкладка «ИИ»)
Глобальная конфигурация ИИ (public.global_settings, ключ aiConfig) + сервис AiGlobalConfigService;
операторские ручки GET/PUT /api/operator/settings/ai-config и POST .../check, аудит ai_config_changed.
AiProviderConfigBuilder читает глобальную конфигурацию: на неё работают классификация, фильтр,
ключи поиска и карточки всех тенантов; не задана — понятный AiUnavailableException, без 500.
Из настроек тенанта убраны aiProvider/aiConfigs/providers, удалён пользовательский POST /api/ai/check.
Консоль оператора: раздел «ИИ» (провайдер, модель, baseUrl, ключ, проверка связи, маска ключа).
Вкладка «ИИ» пользователя: без выбора провайдера/модели и поля ключа; тумблеры ИИ, промпты,
библиотека и «Мои промпты» без изменений.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Контекст
Конфигурация ИИ-провайдера сейчас — личная настройка тенанта: во вкладке «ИИ» своих настроек
пользователь сам выбирает провайдера, модель и вводит API-ключ (
AiTab.vue). Данные лежатв KV-настройках тенанта (ключи
aiProvider,aiConfigs, ключ шифруется с префиксомenc:),и при каждом вызове
AiProviderConfigBuilderсобираетProviderConfigдля ai-service(его используют
GrpcAiClassifier,GrpcAiTools).Решение владельца (2026-09-14): выбор и настройка моделей — забота оператора. Пользователь
должен получать те же ИИ-функции (классификация, фильтр, ключи поиска, карточки), но без
выбора провайдера/модели и ввода ключей.
Готовый образец в системе уже есть: глобальные ключи Telegram (
GlobalSettingsKeys,IGlobalSettingsStore+ISecretCipher, ручки/api/operator/settings/telegram-keys,секция «Telegram» в панели оператора) — повторяем этот путь.
Что сделать
GlobalSettingsKeys.TelegramKeys, сервисповерх
IGlobalSettingsStore+ISecretCipher: провайдер (из каталогаAiProviders),модель, baseUrl, API-ключ (
enc:), маскированное чтение.OperatorSettingsEndpoints(маскированный ключ на чтение,валидация на запись — как у telegram-keys).
OperatorConsole.vue— форма конфигурации плюспроверка связи (переиспользовать механизм ai-check).
AiProviderConfigBuilderи все, кто строитProviderConfig(
GrpcAiClassifier,GrpcAiTools, проверка связи), читают глобальную конфигурациюоператора, а не настройки тенанта. Все экземпляры ИИ работают на одной конфигурации;
персональные переопределения по тенантам не делаем.
как есть — переключатель ИИ, промпты, ниша и описание. Если конфигурация оператором ещё
не задана — понятное состояние («ИИ настраивается оператором»), без ошибок.
aiProvider/aiConfigsперестать читать (данные не удалять);действующий конфиг при внедрении перенести в операторскую панель.
(по образцу
settings_updatedу тенантов).и зеркало в
docs/.Критерии приёмки
Затрагивает
frontend (панель оператора, вкладка «ИИ»), ai (каталог
AiProviders; контрактProviderConfigв ai.proto не меняем), docsИсточники
План (взято в работу):
GlobalSettingsKeys+ сервис поверхIGlobalSettingsStore/ISecretCipher(ключenc:), по образцуTelegramKeysService.OperatorSettingsEndpoints(маскирование ключа, валидация).AiProviderConfigBuilder(и всех вызовов ИИ) на глобальный конфиг; тенантовыеaiProvider/aiConfigsперестают читаться.Готово (MR #31)
#31
public.global_settings, ключaiConfig) + сервисAiGlobalConfigService;операторские ручки
GET/PUT /api/operator/settings/ai-configиPOST .../check, аудитai_config_changed.AiProviderConfigBuilderчитает глобальную конфигурацию: на неё работают классификация, фильтр,ключи поиска и карточки всех тенантов; не задана — понятный
AiUnavailableException, без 500.aiProvider/aiConfigs/providers, удалён пользовательскийPOST /api/ai/check.библиотека и «Мои промпты» без изменений.
Проверки: сборка core 0/0; тесты core 1375 (новые
AiGlobalConfigServiceTests,OperatorAiConfigEndpointsHttpTests,TestAiConfig) — зелёные; фронтенд build + lint:i18n чисто;документация обновлена (docs/ и вики).
Нюанс: живая проверка в локальном докере не выполнена — докер-демон не запущен.