flare / intent_api.py
ciyidogan's picture
Update intent_api.py
8f06ef3 verified
raw
history blame
7.09 kB
import intent, requests, traceback
from log import log
def auth_token_handler(intent_name, auth_config, session):
try:
token_info = session.get("auth_tokens", {}).get(intent_name)
if token_info and "token" in token_info:
return token_info["token"], session # Token zaten mevcut
# Auth token alınmamışsa:
auth_endpoint = auth_config.get("auth_endpoint")
auth_body = auth_config.get("auth_body", {})
token_path = auth_config.get("auth_token_path")
if not auth_endpoint or not token_path:
raise Exception("auth_endpoint veya token_path tanımsız")
# Placeholder çözümü (auth_body içinde {session.xxx} varsa çözülür)
resolved_body = {
k: intent.resolve_placeholders(str(v), session, {}) for k, v in auth_body.items()
}
response = requests.post(auth_endpoint, json=resolved_body, timeout=5)
response.raise_for_status()
json_resp = response.json()
# Token path (örnek: "token" → json_resp["token"], "data.access_token" → json_resp["data"]["access_token"])
token_parts = token_path.split(".")
token = json_resp
for part in token_parts:
token = token.get(part)
if token is None:
raise Exception(f"Token path çözülemedi: {token_path}")
# Refresh token varsa
refresh_token = json_resp.get("refresh_token")
# Session’a kaydet
session.setdefault("auth_tokens", {})[intent_name] = {
"token": token,
"refresh_token": refresh_token
}
return token, session
except Exception as e:
log(f"❌ Auth token alınamadı: {e}")
raise e
def refresh_auth_token(intent_name, auth_config, session):
try:
refresh_endpoint = auth_config.get("auth_refresh_endpoint")
refresh_body = auth_config.get("refresh_body", {})
token_path = auth_config.get("auth_token_path")
if not refresh_endpoint or not token_path:
raise Exception("Refresh yapılandırması eksik")
# Refresh token mevcut mu?
refresh_token = session.get("auth_tokens", {}).get(intent_name, {}).get("refresh_token")
if not refresh_token:
raise Exception("Mevcut refresh token bulunamadı")
# Refresh body içinde placeholder varsa çöz
resolved_body = {
k: intent.resolve_placeholders(str(v), session, {}) for k, v in refresh_body.items()
}
response = requests.post(refresh_endpoint, json=resolved_body, timeout=5)
response.raise_for_status()
json_resp = response.json()
# Yeni token çıkar
token_parts = token_path.split(".")
token = json_resp
for part in token_parts:
token = token.get(part)
if token is None:
raise Exception(f"Token path çözülemedi: {token_path}")
# Yeni refresh_token varsa onu da al
new_refresh_token = json_resp.get("refresh_token", refresh_token)
# Güncelle
session["auth_tokens"][intent_name] = {
"token": token,
"refresh_token": new_refresh_token
}
log(f"🔁 Token başarıyla yenilendi: {intent_name}")
return token, session
except Exception as e:
log(f"❌ Token yenileme başarısız: {e}")
raise e
def execute_intent(intent_name, user_input, session, intent_definitions, data_formats):
try:
definition = intent_definitions[intent_name]
variables_raw = intent.extract_parameters(definition.get("variables", []), user_input)
variables = {item["key"]: item["value"] for item in variables_raw}
log(f"🚀 execute_intent('{intent_name}')")
log(f"🔍 Çıkarılan parametreler: {variables}")
# Validasyon
variable_format_map = definition.get("variable_formats", {})
is_valid, validation_errors = intent.validate_variable_formats(variables, variable_format_map, data_formats)
if not is_valid:
log(f"⚠️ Validasyon hatası: {validation_errors}")
return {
"errors": validation_errors,
"awaiting_variable": list(validation_errors.keys())[0],
"session": session
}
# Auth
headers = definition["action"].get("headers", [])
body = definition["action"].get("body", {})
method = definition["action"].get("method", "POST")
url = definition["action"]["url"]
timeout = definition["action"].get("timeout", 5)
retry_count = definition["action"].get("retry_count", 0)
auth_config = definition["action"].get("auth", None)
tls = definition["action"].get("tls", {})
verify = tls.get("verify", True)
verify_path = tls.get("ca_bundle") if verify and tls.get("ca_bundle") else verify
if auth_config:
token, session = auth_token_handler(intent_name, auth_config, session)
# Header ve Body placeholder çöz
resolved_headers = {
h["key"]: intent.resolve_placeholders(h["value"], session, variables)
for h in headers
}
resolved_body = {
k: intent.resolve_placeholders(str(v), session, variables)
for k, v in body.items()
}
# API çağrısı
for attempt in range(retry_count + 1):
try:
response = requests.request(
method=method,
url=url,
headers=resolved_headers,
json=resolved_body,
timeout=timeout,
verify=verify_path
)
if response.status_code == 401 and auth_config and attempt < retry_count:
log("🔁 Token expired. Yenileniyor...")
token, session = refresh_auth_token(intent_name, auth_config, session)
continue
response.raise_for_status()
break
except requests.HTTPError as e:
if response.status_code != 401 or attempt == retry_count:
raise e
log("✅ API çağrısı başarılı")
json_resp = response.json()
# Yanıtı parse et
field = definition["action"].get("response_parser", {}).get("field")
rate = json_resp.get(field) if field else json_resp
template = definition["action"].get("reply_template", str(rate))
reply = intent.resolve_placeholders(template, session, {**variables, field: str(rate)})
# Session güncelle
session.setdefault("variables", {}).update(variables)
session["last_intent"] = intent_name
return {
"reply": reply,
"session": session
}
except Exception as e:
log(f"❌ execute_intent() hatası: {e}")
traceback.print_exc()
return {
"error": str(e),
"session": session
}