feat: ИИ-проверка объекта по частям (временные файлы вход/выход по блокам)

This commit is contained in:
2026-08-05 01:33:43 +04:00
parent d376a28184
commit b3ae4c22cf
2 changed files with 123 additions and 0 deletions
+44
View File
@@ -816,3 +816,47 @@ def check_criteria_ai(criteria_data, api_key, model='deepseek-chat', base_url=No
'final_category': js.get('итоговая_категория', ''),
},
}, None
def check_object_partial(blocks, api_key, model='deepseek-chat', base_url=None, workdir=None):
"""ИИ-проверка объекта КИИ по частям.
blocks: список [{'name': 'Реквизиты организации', 'prompt': 'check_company', 'data': {...}}, ...]
Для каждого блока: данные пишутся во временный файл (вход), вызывается ИИ,
ответ пишется во временный файл (выход). Возвращает (results, errors):
results — [{name, ok, text, files: {in: путь, out: путь}}].
"""
import tempfile
import os
if not api_key:
return None, "Не задан API-ключ ИИ (Файл → Настройки → API)"
if workdir is None:
workdir = tempfile.mkdtemp(prefix='dokogen_ai_')
results = []
for i, blk in enumerate(blocks, 1):
name = blk.get('name', f'Блок {i}')
prompt_name = blk.get('prompt', 'check_security')
data = blk.get('data', {})
f_in = os.path.join(workdir, f'block_{i}_input.json')
f_out = os.path.join(workdir, f'block_{i}_output.json')
try:
with open(f_in, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
except Exception:
pass
pr = _load_prompt(prompt_name)
system = pr.get('system', 'Ты — эксперт по КИИ (187-ФЗ). Проверь данные и дай рекомендации.')
system = system + ' ' + pr.get('response_format', 'Верни ТОЛЬКО JSON с результатом проверки.')
user = json.dumps(data, ensure_ascii=False)
js, err = _ai_json(api_key, model, base_url, system, user)
if err:
results.append({'name': name, 'ok': False, 'text': f'Ошибка: {err}', 'files': {'in': f_in, 'out': f_out}})
continue
try:
with open(f_out, 'w', encoding='utf-8') as f:
json.dump(js, f, ensure_ascii=False, indent=2)
except Exception:
pass
text = json.dumps(js, ensure_ascii=False, indent=2)
results.append({'name': name, 'ok': True, 'text': text, 'files': {'in': f_in, 'out': f_out}})
return results, None