Spaces:
Paused
Paused
| 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ı." | |
| } | |