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