import json import re import requests from config import OLLAMA_URL, OLLAMA_MODEL def ask_ollama(prompt, model=OLLAMA_MODEL, system_prompt=None): """Базовая функция отправки запросов к Ollama""" if system_prompt is None: system_prompt = "Ты — офисный аудитор безопасности и кадрового учета." payload = { "model": model, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": prompt} ], "stream": False } try: response = requests.post(OLLAMA_URL, json=payload, timeout=60) if response.status_code == 200: return response.json()['message']['content'] else: return f"Ошибка API Ollama: {response.status_code}" except Exception as e: return f"Ошибка подключения к Ollama: {e}" def ai_verify_scud_against_staff(unrecognized_scud_fios, staff_fios): """ИИ-сверка опечаток и несовпадений ФИО между СКУД и 1С:ЗУП""" if not unrecognized_scud_fios or not staff_fios: return {} prompt = f""" Ты — кадровый аудитор безопасности СКУД. В СКУД записаны неопознанные ФИО: {json.dumps(unrecognized_scud_fios, ensure_ascii=False)} В официальном Штатном расписании 1С записаны ЭТАЛОНЫ: {json.dumps(staff_fios, ensure_ascii=False)} СТРОГИЕ ПРАВИЛА: 1. Запись из Штат 1С — это 100% ПРАВИЛЬНЫЙ эталон. 2. В СКУД допущена опечатка. 3. В поле "warning" описать опечатку. 4. Запрещено выдумывать опечатки! ОТВЕЧАЙ ТОЛЬКО ИСКЛЮЧИТЕЛЬНО В ФОРМАТЕ JSON! Формат ответа: {{ "verified_matches": [ {{ "scud_fio": "ФИО из СКУД", "staff_fio": "эталон ФИО из Штат 1С", "warning": "Описание опечатки в СКУД или 'Точное совпадение (без опечаток)'" }} ] }} """ raw_response = ask_ollama( prompt, system_prompt="Ты — JSON API. Выдавай ТОЛЬКО валидный JSON без markdown-разметки." ) mapping = {} try: match = re.search(r'\{.*\}', raw_response, re.DOTALL) if match: json_str = match.group(0) json_str = re.sub(r'\}\s*[^}\]]*$', '}', json_str) data = json.loads(json_str) for item in data.get("verified_matches", []): scud_f = item.get("scud_fio") staff_f = item.get("staff_fio") warn = item.get("warning", "Точное совпадение (без опечаток)") if scud_f and staff_f: mapping[scud_f] = {"staff_fio": staff_f, "warning": warn} except Exception as e: print(f"[!] Ошибка разбора JSON от ИИ при сверке опечаток: {e}") return mapping