feat: подбор характеристик объекта КИИ — программа и ИИ

Вкладка «Основное», кнопки под полем типового объекта:
- ⚙️ «Подобрать типовой объект (программа)»: скоринг по совпадению
  значимых слов названия/назначения объекта с перечнем 392 типовых
  отраслевых объектов (Распоряжение 360-р), IDF-веса (редкие слова
  важнее общих) → окно с вариантами, оператор выбирает и применяет
  (заполняет сферу + типовой объект)
- 🤖 «Подобрать характеристики (ИИ)»: DeepSeek предлагает назначение,
  сферу, тип, архитектуру и типовой объект (из перечня 360-р) как
  рекомендацию → окно с полями, оператор подтверждает/правит

Примеры: СКУД → «ИС, АСУ, ИТКС, обеспечивающие контроль и управление
доступом на территорию»; 1С:УПП → «ИС для ведения бухгалтерского учета»
This commit is contained in:
2026-08-04 22:43:04 +04:00
parent b9968449ef
commit dadec02665
3 changed files with 389 additions and 0 deletions
+57
View File
@@ -519,6 +519,63 @@ def suggest_threats_ai(security_data, api_key, model='deepseek-chat', base_url=N
return threats_out, None
def suggest_object_params_ai(object_data, api_key, model='deepseek-chat', base_url=None,
typical_objects=None):
"""ИИ предлагает характеристики объекта КИИ: назначение, сферу, тип, архитектуру,
типовой отраслевой объект — как рекомендацию оператору.
object_data — dict: name, description, purpose (что известно об объекте).
typical_objects — перечень типовых отраслевых объектов (из 360-р) для выбора.
Возвращает (dict, ошибка): dict с полями
purpose / sphere / object_type / architecture / typical_object / обоснование.
"""
if not api_key:
return None, "Не задан API-ключ ИИ (Файл → Настройки → API)"
if typical_objects:
to_text = "\n".join(f"{i+1}. {t}" for i, t in enumerate(typical_objects[:400]))
else:
to_text = "(перечень не предоставлен)"
system = (
"Ты — эксперт ФСТЭК по категорированию объектов критической информационной инфраструктуры "
"(187-ФЗ, ПП РФ № 127, Распоряжение ПРФ № 360-р, приказ ФСТЭК № 236). "
"По описанию объекта КИИ предложи его характеристики. Верни ТОЛЬКО JSON: "
'{"назначение": "короткое назначение объекта", '
'"сфера": "одна из сфер: Здравоохранение, Наука, Транспорт, Связь, Энергетика, '
'Государственная регистрация прав, Банковская сфера и финансовый рынок, '
'Топливно-энергетический комплекс, Атомная энергетика, Оборонная промышленность, '
'Ракетно-космическая промышленность, Горнодобывающая промышленность, '
'Металлургическая промышленность, Химическая промышленность, Иная сфера деятельности", '
'"тип": "Информационная система | Автоматизированные системы управления | '
'Информационно-телекоммуникационная сеть", '
'"архитектура": "одно из: клиент-серверная система, автономная (standalone), '
'распределенная система, иное", '
'"типовой_объект": "полная строка из предоставленного перечня, наиболее подходящая, '
'или пустая строка", '
'"обоснование": "почему выбраны такие характеристики (1-2 предложения)"} '
"Не выдумывай типовой объект — бери только из перечня."
)
user = (
"Информация об объекте КИИ:\n"
f"{json.dumps(object_data, ensure_ascii=False)}\n\n"
"Перечень типовых отраслевых объектов КИИ (Распоряжение ПРФ № 360-р):\n"
f"{to_text}"
)
js, err = _ai_json(api_key, model, base_url, system, user)
if err:
return None, err
return {
'назначение': str(js.get('назначение', '') or '').strip(),
'сфера': str(js.get('сфера', '') or '').strip(),
'тип': str(js.get('тип', '') or '').strip(),
'архитектура': str(js.get('архитектура', '') or '').strip(),
'типовой_объект': str(js.get('типовой_объект', '') or '').strip(),
'обоснование': str(js.get('обоснование', '') or '').strip(),
}, None
def check_security_ai(security_data, api_key, model='deepseek-chat', base_url=None):
"""ИИ-проверка заполненной вкладки «Безопасность» объекта КИИ (236 приказ).