feat: ИИ-проверка объекта по частям (временные файлы вход/выход по блокам)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user