File size: 5,838 Bytes
16134a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from fastapi import Request
from fastapi.responses import JSONResponse
import traceback, random
from intent import extract_parameters, validate_variable_formats, detect_intent
from intent_api import execute_intent
from llm_model import generate_response, get_model, get_tokenizer, Message
from log import log

DEBUG = True

async def handle_chat(msg: Message, request: Request, app, s_config):
    user_input = msg.user_input.strip()
    session_id = request.headers.get("X-Session-ID", "demo-session")

    if not hasattr(app.state, "session_store"):
        app.state.session_store = {}

    session_store = getattr(app.state, "session_store", {})
    session = session_store.get(session_id, {
        "session_id": session_id,
        "variables": {},
        "auth_tokens": {},
        "last_intent": None,
        "awaiting_variable": None
    })

    try:
        if get_model() is None or get_tokenizer() is None:
            return {"error": "Model yüklenmedi."}

        detected_intent, intent_conf = await detect_intent(user_input)
        if DEBUG:
            log(f"🎯 Intent tespiti: {detected_intent}, Confidence: {intent_conf:.2f}")

        current_intent = session.get("last_intent")
        awaiting_variable = session.get("awaiting_variable")

        if DEBUG:
            log(f"📦 Session: {session}")
            log(f"🧩 Awaiting: {awaiting_variable}, Last Intent: {current_intent}")

        if (
            awaiting_variable and
            detected_intent and
            detected_intent != current_intent and
            intent_conf > s_config.INTENT_CONFIDENCE_THRESHOLD
        ):
            log("🧹 Konu değişikliği algılandı → context sıfırlanıyor")
            session["awaiting_variable"] = None
            session["variables"] = {}
            session["last_intent"] = detected_intent
            current_intent = detected_intent

        intent_is_valid = (
            detected_intent and
            intent_conf > s_config.INTENT_CONFIDENCE_THRESHOLD and
            detected_intent in s_config.INTENT_DEFINITIONS
        )
        if DEBUG:
            log(f"✅ Intent geçerli mi?: {intent_is_valid}")

        if intent_is_valid:
            session["last_intent"] = detected_intent
            definition = s_config.INTENT_DEFINITIONS[detected_intent]
            pattern_list = definition.get("variables", [])
            data_formats = s_config.DATA_FORMATS
            variable_format_map = definition.get("variable_formats", {})

            if awaiting_variable:
                extracted = extract_parameters(pattern_list, user_input)
                for p in extracted:
                    if p["key"] == awaiting_variable:
                        session["variables"][awaiting_variable] = p["value"]
                        session["awaiting_variable"] = None
                        log(f"✅ Awaiting parametre tamamlandı: {awaiting_variable} = {p['value']}")
                        break

            extracted = extract_parameters(pattern_list, user_input)
            variables = {p["key"]: p["value"] for p in extracted}
            session.setdefault("variables", {}).update(variables)

            if DEBUG:
                log(f"🧪 Tespit edilen parametreler: {variables}")

            is_valid, validation_errors = validate_variable_formats(session["variables"], variable_format_map, data_formats)
            if DEBUG:
                log(f"📛 Validasyon hataları: {validation_errors}")

            if not is_valid:
                session["awaiting_variable"] = list(validation_errors.keys())[0]
                session_store[session_id] = session
                app.state.session_store = session_store
                return {"response": list(validation_errors.values())[0]}

            expected_vars = list(variable_format_map.keys())
            missing_vars = [v for v in expected_vars if v not in session["variables"]]
            if DEBUG:
                log(f"📌 Beklenen parametreler: {expected_vars}, Eksik: {missing_vars}")

            if missing_vars:
                session["awaiting_variable"] = missing_vars[0]
                session_store[session_id] = session
                app.state.session_store = session_store
                return {"response": f"Lütfen {missing_vars[0]} bilgisini belirtir misiniz?"}

            log("🚀 execute_intent() çağrılıyor...")
            result = execute_intent(
                detected_intent,
                user_input,
                session,
                s_config.INTENT_DEFINITIONS,
                s_config.DATA_FORMATS
            )
            if "reply" in result:
                session_store[session_id] = result["session"]
                app.state.session_store = session_store
                return {"reply": result["reply"]}
            elif "errors" in result:
                session_store[session_id] = result["session"]
                app.state.session_store = session_store
                return {"response": list(result["errors"].values())[0]}
            else:
                return {"response": random.choice(s_config.FALLBACK_ANSWERS)}

        log("🤖 execute_intent çağrılmadı → LLM fallback devrede")
        session["awaiting_variable"] = None
        session["variables"] = {}
        response, response_conf = await generate_response(user_input, s_config)
        if response_conf is not None and response_conf < s_config.LLM_CONFIDENCE_THRESHOLD:
            return {"response": random.choice(s_config.FALLBACK_ANSWERS)}
        return {"response": response}

    except Exception as e:
        traceback.print_exc()
        return JSONResponse(content={"error": str(e)}, status_code=500)