import asyncio import json import logging import sys from pathlib import Path # Add project root to sys.path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from app.config import settings from app.bale.client import BaleClient from app.api.client import ErpClient from app.runtime import BotContext, LinkedUser from app.nlu import understand from app.handlers import quote from app.defaults import AUTHORIZED_USERS logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s — %(message)s") logger = logging.getLogger("send_analysis") CHAT_ID = 1461166742 TRANSCRIPTS = [ { "name": "مدل 1 (Whisper)", "text": "الان شبت بخیر می خواستیم که بیست و پنج تا کیسه عرض به خدمت شما که گچ و خاک از مصطفوی بخریم و کنارش هم یه پنجاه تا کیسه سیمان پنجاه کیلویی که اونا تقریبا در می آد پامون دونه ای بیست و پنج میلیون سیمانی ها پامون در می آد حدودا چهل میلیون اینا دونه ای بهمون گفته که می تونین سه قسط بهم بدید کلی پولش ها در طول زمان و یا بیاید یه بار پولش رو امروز بهم بدین یه تخفیف ده درصدی تقریبا براتون لحاظ می کنم عددش رو کم می کنم خریدمون هم عمدتا برای منشیانه و دفتر پیش فاکتورم گفته تا حدودا بیست روزی نامه براتون اوکیه همین", }, { "name": "مدل 2 (Vosk)", "text": "سلام شبت بخیر. میخواستیم که 25 تا کیسه عرض به خدمت شما که گچ و خاک از مستفدی بخریم و کنارشم یه 50 تا کیسه سیمان 50 کیلویی که اونا تقریباً در میاد پامون دونهای 25 میلیون، سیمانیا پامون در میاد حدوداً 40 میلیون اینا دونهای. بهمون گفته که میتونین سه قسم بدین کلی پولشا در طول زمان و یا بیاین یه باره پولشو امروز بم بدین یه تخفیف 10 درصدی تقریباً بره دون، لحاظ میکنم عددشو کم میکنم. خریدم اونم اومدن برای منشیانه و دفتر. پیشفاکتورم گفته تا حدود یه 20 روز اینا برادون اوکیه. همین.", }, ] async def run(): print(f"Connecting to Bale and ERP API for Chat ID: {CHAT_ID}...") bale = BaleClient(settings.BALE_API_BASE, settings.BOT_TOKEN) api = ErpClient(settings.API_BASE_URL, settings.API_TIMEOUT_SECONDS, settings.SERVICE_TOKEN) ctx = BotContext(bale, api) user_info = AUTHORIZED_USERS.get(CHAT_ID, {}) user = LinkedUser( chat_id=CHAT_ID, user_id=user_info.get("user_id"), display_name=user_info.get("display_name", "مدیر تدارکات"), role=user_info.get("role", "procurement_manager"), is_admin=user_info.get("is_admin", True), ) print("Sending transcripts to NLU (LLM) for multi-model consensus and entity extraction...") result = await understand(settings, TRANSCRIPTS) print("NLU Result:") print(json.dumps(result, ensure_ascii=False, indent=2)) consensus_text = result.get("consensus_text") or "" patch = result.get("patch") or {} intro_msg = ( f"🤖 **تحلیل هوشمند فایل صوتی (تجمیع خروجی چند مدل STT):**\n\n" f"📝 **متن استخراج‌شده و تصحیح‌شده (Consensus):**\n«{consensus_text}»\n\n" f"📋 پیش‌نویس استعلام خرید با مشخصات استخراج‌شده صادر گردید:" ) await ctx.send(CHAT_ID, intro_msg) # Create and render the draft quote await quote.handle_entities( ctx, CHAT_ID, user, patch, source="voice", ) print("Draft quote sent successfully to Bale chat!") if __name__ == "__main__": asyncio.run(run())