flare / intent_api.py
ciyidogan's picture
Update intent_api.py
a4ea736 verified
raw
history blame
5.59 kB
import intent_utils as intent
import requests
import traceback
from log import log
def auth_token_handler(api_name, auth_config, session):
token_info = session.get("auth_tokens", {}).get(api_name)
if token_info and "token" in token_info:
return token_info["token"], session
auth_endpoint = auth_config.get("auth_endpoint")
auth_body = auth_config.get("auth_body", {})
token_path = auth_config.get("auth_token_path")
resolved_body = {
k: intent.resolve_placeholders(str(v), session, session.get("variables", {})) 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_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 = json_resp.get("refresh_token")
session.setdefault("auth_tokens", {})[api_name] = {
"token": token,
"refresh_token": refresh_token
}
return token, session
def refresh_auth_token(api_name, auth_config, session):
refresh_endpoint = auth_config.get("auth_refresh_endpoint")
refresh_body = auth_config.get("refresh_body", {})
token_path = auth_config.get("auth_token_path")
refresh_token = session.get("auth_tokens", {}).get(api_name, {}).get("refresh_token")
if not refresh_token:
raise Exception("Mevcut refresh token bulunamadı")
resolved_body = {
k: intent.resolve_placeholders(str(v), session, session.get("variables", {})) 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()
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}")
new_refresh_token = json_resp.get("refresh_token", refresh_token)
session.setdefault("auth_tokens", {})[api_name] = {
"token": token,
"refresh_token": new_refresh_token
}
log(f"🔁 Token başarıyla yenilendi: {api_name}")
return token, session
def execute_intent(intent_name, user_input, session_dict, project_name, service_config):
session = session_dict
try:
# intent config
project_intents = service_config.get_project_llm_config(project_name)["intents"]
intent_def = next((i for i in project_intents if i["name"] == intent_name), None)
if not intent_def:
raise Exception(f"'{intent_name}' için intent tanımı bulunamadı.")
action_api_name = intent_def.get("action")
api_def = service_config.get_api_config(action_api_name)
if not api_def:
raise Exception(f"API '{action_api_name}' tanımı bulunamadı.")
# API setup
variables = session.get("variables", {})
headers = api_def.get("headers", [])
body = api_def.get("body", {})
method = api_def.get("method", "POST")
url = api_def["url"]
timeout = api_def.get("timeout", 5)
retry_count = api_def.get("retry_count", 0)
auth_config = api_def.get("auth")
tls = api_def.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(action_api_name, auth_config, session)
else:
token = None
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 call with retries
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(action_api_name, auth_config, session)
continue
response.raise_for_status()
break
except requests.Timeout:
fallback = intent_def.get("fallback_timeout_message", "Bu işlem şu anda gerçekleştirilemiyor.")
log(f"⚠️ Timeout → fallback mesajı: {fallback}")
return {"fallback": fallback}
except Exception as e:
log(f"❌ API çağrısı hatası: {e}")
fallback = intent_def.get("fallback_error_message", "Bir hata oluştu.")
return {"fallback": fallback}
# Success
json_resp = response.json()
log("✅ API çağrısı başarılı")
return {
"reply": json_resp
}
except Exception as e:
log(f"❌ execute_intent() hatası: {e}")
traceback.print_exc()
return {
"fallback": "Bir hata oluştu, işlem tamamlanamadı."
}