Spaces:
Running
Running
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)
|