Spaces:
Paused
Paused
File size: 7,245 Bytes
a38473c 2ed269d a38473c a75822a e585b9f a38473c e585b9f a38473c 221c79a e585b9f 221c79a e585b9f 221c79a e585b9f a38473c e585b9f a38473c 1d396a5 a38473c 45bfb3a a38473c ca2a223 d646e4b 1d396a5 a38473c ca2a223 |
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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
from fastapi import Request
from fastapi.responses import JSONResponse
import traceback
import random
from intent_utils import extract_parameters, validate_variable_formats, detect_intent
from intent_api import execute_intent
from log import log
from llm_model import Message, LLMModel
async def handle_chat(msg: Message, request: Request, app, service_config, session, llm_model: LLMModel):
try:
user_input = msg.user_input.strip()
log(f"💬 Kullanıcı input'u: '{user_input}'")
project_name = session.project_name
project_config = service_config.get_project_llm_config(project_name)
project_intents = service_config.get_project_intents(project_name)
intent_conf_threshold = project_config["intent_confidence_treshold"]
if llm_model.model is None or llm_model.tokenizer is None:
return {"error": f"{project_name} için model yüklenmedi."}
current_intent = session.last_intent
awaiting_variable = session.awaiting_variable
# 🧩 1. PARAMETRE TAMAMLAMA MODU
if awaiting_variable and current_intent:
log(f"🔄 Parametre tamamlama modu: intent={current_intent}, beklenen={awaiting_variable}")
intent_def = next(i for i in project_intents if i["name"] == current_intent)
pattern_list = intent_def.get("variables", [])
variable_format_map = intent_def.get("variable_formats", {})
data_formats = service_config.data_formats
extracted = extract_parameters(pattern_list, user_input)
if extracted:
for p in extracted:
session.variables[p["key"]] = p["value"]
log(f"✅ Parametre dolduruldu: {p['key']} = {p['value']}")
session.awaiting_variable = None
# Doğrulama + execute_intent’e geçiş
is_valid, validation_errors = validate_variable_formats(session.variables, variable_format_map, data_formats)
log(f"📛 Validasyon hataları: {validation_errors}")
expected_vars = list(variable_format_map.keys())
missing_vars = [v for v in expected_vars if v not in session.variables]
log(f"📌 Beklenen parametreler: {expected_vars}, Eksik: {missing_vars}")
if not is_valid:
session.awaiting_variable = list(validation_errors.keys())[0]
return {"response": list(validation_errors.values())[0]}
if missing_vars:
if len(missing_vars) > 1:
ordered_list = ", ".join(missing_vars)
return {"response": f"Lütfen şu bilgileri sırayla belirtir misiniz: {ordered_list}."}
else:
session.awaiting_variable = missing_vars[0]
return {"response": f"Lütfen {missing_vars[0]} bilgisini belirtir misiniz?"}
log("🚀 execute_intent() çağrılıyor...")
result = execute_intent(
current_intent,
user_input,
session.__dict__,
{i["name"]: i for i in project_intents},
data_formats,
project_name,
service_config
)
if "reply" in result:
return {"reply": result["reply"]}
elif "errors" in result:
return {"response": list(result["errors"].values())[0]}
else:
return {"response": random.choice(project_config["fallback_answers"])}
else:
# ❌ Parametre yine çıkarılamadı → konu değişmiş olabilir
log("⚠️ Parametre bulunamadı → intent detect tetikleniyor")
session.awaiting_variable = None
session.variables = {}
# 🧩 2. NORMAL INTENT DEĞERLENDİRMESİ
detected_intent, intent_conf = await detect_intent(user_input, project_name)
log(f"🎯 Intent tespit edildi: {detected_intent}, Confidence: {intent_conf:.2f}")
intent_is_valid = (
detected_intent and
intent_conf > intent_conf_threshold and
any(i["name"] == detected_intent for i in project_intents)
)
log(f"✅ Intent geçerli mi?: {intent_is_valid}")
if intent_is_valid:
session.last_intent = detected_intent
intent_def = next(i for i in project_intents if i["name"] == detected_intent)
pattern_list = intent_def.get("variables", [])
variable_format_map = intent_def.get("variable_formats", {})
data_formats = service_config.data_formats
extracted = extract_parameters(pattern_list, user_input)
variables = {p["key"]: p["value"] for p in extracted}
session.variables.update(variables)
is_valid, validation_errors = validate_variable_formats(session.variables, variable_format_map, data_formats)
log(f"📛 Validasyon hataları: {validation_errors}")
expected_vars = list(variable_format_map.keys())
missing_vars = [v for v in expected_vars if v not in session.variables]
log(f"📌 Beklenen parametreler: {expected_vars}, Eksik: {missing_vars}")
if not is_valid:
session.awaiting_variable = list(validation_errors.keys())[0]
return {"response": list(validation_errors.values())[0]}
if missing_vars:
if len(missing_vars) > 1:
ordered_list = ", ".join(missing_vars)
return {"response": f"Lütfen şu bilgileri sırayla belirtir misiniz: {ordered_list}."}
else:
session.awaiting_variable = missing_vars[0]
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.__dict__,
{i["name"]: i for i in project_intents},
data_formats,
project_name,
service_config
)
if "reply" in result:
return {"reply": result["reply"]}
elif "errors" in result:
return {"response": list(result["errors"].values())[0]}
else:
return {"response": random.choice(project_config["fallback_answers"])}
log("🤖 execute_intent çağrılmadı → LLM fallback devrede")
session.awaiting_variable = None
session.variables = {}
response, response_conf = await llm_model.generate_response(user_input, project_config)
if response_conf is not None and response_conf < project_config["llm_confidence_treshold"]:
return {"response": random.choice(project_config["fallback_answers"])}
return {"response": response}
except Exception as e:
traceback.print_exc()
return JSONResponse(content={"error": str(e)}, status_code=500)
|