fix: окна авторасчёта/сравнения не обрезают текст; СЗИ перенесены в «Безопасность»; ИИ-рекомендации по СЗИ; ИИ-проверка категорий ПП 127; пояснения к полям 8/9; упрощение панели угроз

This commit is contained in:
2026-08-05 01:31:13 +04:00
parent fafeea4fcf
commit d376a28184
4 changed files with 329 additions and 21 deletions
+83
View File
@@ -733,3 +733,86 @@ def check_company_ai(company_data, api_key, model='deepseek-chat', base_url=None
},
'apply': {'company': {k: v for k, v in proposals.items() if v}},
}, None
def suggest_defense_ai(defense_data, api_key, model='deepseek-chat', base_url=None):
"""ИИ-рекомендации по средствам защиты информации (СЗИ).
По категории значимости, угрозам и текущему списку СЗИ ИИ подсказывает,
чего не хватает (например, антивирус, СКЗИ, SIEM и т.п.).
Возвращает (результат, ошибка).
"""
if not api_key:
return None, "Не задан API-ключ ИИ (Файл → Настройки → API)"
pr = _load_prompt('suggest_defense')
system = pr.get('system', (
"Ты — эксперт по безопасности КИИ (187-ФЗ, приказ ФСТЭК № 239). "
"По категории значимости объекта и актуальным угрозам определи, каких "
"средств защиты информации (СЗИ) не хватает, и дай рекомендации."
))
system = system + " " + pr.get('response_format',
'Верни ТОЛЬКО JSON: {"рекомендации": [{"сзи": "...", "зачем": "..."}], '
'"общие_советы": ["..."]}')
user = json.dumps(defense_data, ensure_ascii=False)
js, err = _ai_json(api_key, model, base_url, system, user)
if err:
return None, err
recs = js.get('рекомендации') or []
if not isinstance(recs, list):
recs = []
tips = js.get('общие_советы') or []
if isinstance(tips, str):
tips = [tips]
return {
'source': 'ИИ',
'source_url': 'openai-совместимый API',
'disclaimer': AI_DISCLAIMER,
'kind': 'defense',
'data': {
'рекомендации': recs,
'общие_советы': tips,
},
}, None
def check_criteria_ai(criteria_data, api_key, model='deepseek-chat', base_url=None):
"""ИИ-проверка категорий значимости по ПП РФ № 127.
По данным объекта КИИ (назначение, сфера, категории по показателям,
обоснования) ИИ проверяет корректность присвоенных категорий.
Возвращает (результат, ошибка).
"""
if not api_key:
return None, "Не задан API-ключ ИИ (Файл → Настройки → API)"
pr = _load_prompt('check_criteria')
system = pr.get('system', (
"Ты — эксперт по категорированию объектов КИИ (187-ФЗ, ПП РФ № 127). "
"Проверь присвоенные категории значимости по показателям критериев."
))
system = system + " " + pr.get('response_format',
'Верни ТОЛЬКО JSON: {"оценка": "ok|warning|error", '
'"замечания": [{"показатель": "...", "категория": "...", "комментарий": "..."}], '
'"предложения": {"criteria_values": "...", "criteria_justification": "..."}, '
'"итоговая_категория": "I|II|III|—"}')
user = json.dumps(criteria_data, ensure_ascii=False)
js, err = _ai_json(api_key, model, base_url, system, user)
if err:
return None, err
notes = js.get('замечания') or []
if isinstance(notes, str):
notes = [notes]
proposals = js.get('предложения') or {}
if not isinstance(proposals, dict):
proposals = {}
return {
'source': 'ИИ',
'source_url': 'openai-совместимый API',
'disclaimer': AI_DISCLAIMER,
'kind': 'criteria',
'data': {
'rating': js.get('оценка', 'warning'),
'notes': notes,
'proposals': proposals,
'final_category': js.get('итоговая_категория', ''),
},
}, None