File size: 5,585 Bytes
aeddf52
 
 
 
 
 
a4ea736
 
 
aeddf52
a4ea736
 
 
aeddf52
a4ea736
 
 
aeddf52
a4ea736
 
 
aeddf52
a4ea736
 
 
 
 
 
aeddf52
a4ea736
 
 
 
 
aeddf52
a4ea736
aeddf52
 
a4ea736
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aeddf52
a4ea736
 
 
aeddf52
 
 
 
 
 
 
 
a4ea736
aeddf52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4ea736
aeddf52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4ea736
 
 
 
 
 
 
 
 
 
aeddf52
a4ea736
aeddf52
a4ea736
aeddf52
 
 
 
 
 
a4ea736
aeddf52
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
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ı."
        }