fix: окна авторасчёта/сравнения не обрезают текст; СЗИ перенесены в «Безопасность»; ИИ-рекомендации по СЗИ; ИИ-проверка категорий ПП 127; пояснения к полям 8/9; упрощение панели угроз
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user