Spaces:
Sleeping
Sleeping
File size: 3,813 Bytes
325b400 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
import asyncio
import os
import uuid
import py_compile
from .execute_query import execute_query_user
from .pipeline import run_pipeline
from .merge_output import parse_step_data_blocks
from .prompt_databse import prompt_user as prompt_user1
from .prompt_query import query as prompt_query1
from .return_code_python import return_code_python
import google.generativeai as genai
from .gemini.result_sql import generate_step
from models.Database_Entity import StopSignal
async def check_should_stop(chat_id: str, stop_event: object = None):
await asyncio.sleep(0.1)
if stop_event and stop_event.is_set():
print("🛑 Dừng qua stop_event.")
return {"status": "cancelled"}
await asyncio.sleep(0.1)
if StopSignal.objects(chat_history=chat_id, is_stopped=True).first():
print("🛑 Dừng vì có StopSignal trong DB.")
return {"status": "cancelled"}
return None
async def analyze(query: str, user_id, languages, role, chat_id: str = "", stop_event: object = None):
result_check = await check_should_stop(chat_id, stop_event)
if result_check:
return result_check
data2 = generate_step(prompt_query1.format(question=query, prompt_user=prompt_user1))
result_check = await check_should_stop(chat_id, stop_event)
if result_check:
return result_check
data_test3 = await run_pipeline(data2, execute_query_user, user_id, role, languages)
result_check = await check_should_stop(chat_id, stop_event)
if result_check:
return result_check
data_final = data2
result_check = await check_should_stop(chat_id, stop_event)
if result_check:
return result_check
parsed_steps = parse_step_data_blocks(data_final)
output = ""
result_check = await check_should_stop(chat_id, stop_event)
if result_check:
return result_check
for step in parsed_steps:
step_id = step["id"]
output += f"Yêu cầu {step_id} : {step['content']}\n"
if step_id in data_test3:
data = data_test3[step_id][0]
result_str = "\n".join([f"{item}" for item in data])
output += f"Kết quả yêu cầu {step_id} :\n{result_str}\n"
else:
output += "Kết quả:\nKhông có dữ liệu tương ứng.\n"
output += "-"*50 + "\n\n"
folder = "test5"
result_check = await check_should_stop(chat_id, stop_event)
if result_check:
return result_check
# Gọi sinh code
code_python = return_code_python(output, folder=folder)
code_clean = code_python.strip()
if code_clean.startswith("```python"):
code_clean = code_clean[9:].strip()
if code_clean.endswith("```"):
code_clean = code_clean[:-3].strip()
code_clean = code_clean.replace("os_path:", "os.path").strip()
encoding_fix = 'import sys\nsys.stdout.reconfigure(encoding="utf-8")\n\n'
encoding_fix1= 'import numpy as np\n\n'
code_clean = encoding_fix + encoding_fix1 + code_clean
code_python=code_clean
# Ghi ra file tạm để kiểm tra syntax
temp_file_name = f"{uuid.uuid4().hex[:8]}.py"
os.makedirs(folder, exist_ok=True)
temp_path = os.path.join(folder, temp_file_name)
with open(temp_path, "w", encoding="utf-8") as f:
f.write(code_python)
# Kiểm tra cú pháp
try:
py_compile.compile(temp_path, doraise=True)
except py_compile.PyCompileError as e:
print(f"❌ Lỗi cú pháp, tạo lại code: {e}")
code_python = return_code_python(output, folder=folder)
result_check = await check_should_stop(chat_id, stop_event)
if result_check:
return result_check
return code_python, folder
|