ciyidogan commited on
Commit
f7d2bfe
·
verified ·
1 Parent(s): 2ed269d

Update intent_api.py

Browse files
Files changed (1) hide show
  1. intent_api.py +180 -180
intent_api.py CHANGED
@@ -1,181 +1,181 @@
1
- import intent
2
- import requests
3
- import traceback
4
- from log import log
5
-
6
- def auth_token_handler(api_name, auth_config, session):
7
- try:
8
- token_info = session.auth_tokens.get(api_name)
9
- if token_info and "token" in token_info:
10
- return token_info["token"], session
11
-
12
- auth_endpoint = auth_config.get("auth_endpoint")
13
- auth_body = auth_config.get("auth_body", {})
14
- token_path = auth_config.get("auth_token_path")
15
-
16
- if not auth_endpoint or not token_path:
17
- raise Exception("auth_endpoint veya token_path tanımsız")
18
-
19
- resolved_body = {
20
- k: intent.resolve_placeholders(str(v), session.__dict__, session.variables) for k, v in auth_body.items()
21
- }
22
-
23
- response = requests.post(auth_endpoint, json=resolved_body, timeout=5)
24
- response.raise_for_status()
25
- json_resp = response.json()
26
-
27
- token_parts = token_path.split(".")
28
- token = json_resp
29
- for part in token_parts:
30
- token = token.get(part)
31
- if token is None:
32
- raise Exception(f"Token path çözülemedi: {token_path}")
33
-
34
- refresh_token = json_resp.get("refresh_token")
35
- session.auth_tokens[api_name] = {
36
- "token": token,
37
- "refresh_token": refresh_token
38
- }
39
-
40
- return token, session
41
-
42
- except Exception as e:
43
- log(f"❌ Auth token alınamadı: {e}")
44
- raise e
45
-
46
- def refresh_auth_token(api_name, auth_config, session):
47
- try:
48
- refresh_endpoint = auth_config.get("auth_refresh_endpoint")
49
- refresh_body = auth_config.get("refresh_body", {})
50
- token_path = auth_config.get("auth_token_path")
51
-
52
- if not refresh_endpoint or not token_path:
53
- raise Exception("Refresh yapılandırması eksik")
54
-
55
- refresh_token = session.auth_tokens.get(api_name, {}).get("refresh_token")
56
- if not refresh_token:
57
- raise Exception("Mevcut refresh token bulunamadı")
58
-
59
- resolved_body = {
60
- k: intent.resolve_placeholders(str(v), session.__dict__, session.variables) for k, v in refresh_body.items()
61
- }
62
-
63
- response = requests.post(refresh_endpoint, json=resolved_body, timeout=5)
64
- response.raise_for_status()
65
- json_resp = response.json()
66
-
67
- token_parts = token_path.split(".")
68
- token = json_resp
69
- for part in token_parts:
70
- token = token.get(part)
71
- if token is None:
72
- raise Exception(f"Token path çözülemedi: {token_path}")
73
-
74
- new_refresh_token = json_resp.get("refresh_token", refresh_token)
75
-
76
- session.auth_tokens[api_name] = {
77
- "token": token,
78
- "refresh_token": new_refresh_token
79
- }
80
-
81
- log(f"🔁 Token başarıyla yenilendi: {api_name}")
82
- return token, session
83
-
84
- except Exception as e:
85
- log(f"❌ Token yenileme başarısız: {e}")
86
- raise e
87
-
88
- def execute_intent(intent_name, user_input, session_dict, intent_definitions, data_formats):
89
- try:
90
- session = session_dict
91
- intent_def = intent_definitions[intent_name]
92
- action_api_name = intent_def.get("action")
93
-
94
- if not action_api_name:
95
- raise Exception(f"Intent '{intent_name}' için action tanımı eksik.")
96
-
97
- api_def = session["service_config"].get_api_config(action_api_name)
98
- if not api_def:
99
- raise Exception(f"API '{action_api_name}' tanımı bulunamadı.")
100
-
101
- variables_raw = intent.extract_parameters(intent_def.get("variables", []), user_input)
102
- variables = {item["key"]: item["value"] for item in variables_raw}
103
-
104
- log(f"🚀 execute_intent('{intent_name}')")
105
- log(f"🔍 Çıkarılan parametreler: {variables}")
106
-
107
- variable_format_map = intent_def.get("variable_formats", {})
108
- is_valid, validation_errors = intent.validate_variable_formats(variables, variable_format_map, data_formats)
109
- if not is_valid:
110
- log(f"⚠️ Validasyon hatası: {validation_errors}")
111
- return {
112
- "errors": validation_errors,
113
- "awaiting_variable": list(validation_errors.keys())[0],
114
- "session": session
115
- }
116
-
117
- headers = api_def.get("headers", [])
118
- body = api_def.get("body", {})
119
- method = api_def.get("method", "POST")
120
- url = api_def["url"]
121
- timeout = api_def.get("timeout", 5)
122
- retry_count = api_def.get("retry_count", 0)
123
- auth_config = api_def.get("auth")
124
- tls = api_def.get("tls", {})
125
- verify = tls.get("verify", True)
126
- verify_path = tls.get("ca_bundle") if verify and tls.get("ca_bundle") else verify
127
-
128
- if auth_config:
129
- token, session = auth_token_handler(action_api_name, auth_config, session)
130
-
131
- resolved_headers = {
132
- h["key"]: intent.resolve_placeholders(h["value"], session, variables)
133
- for h in headers
134
- }
135
- resolved_body = {
136
- k: intent.resolve_placeholders(str(v), session, variables)
137
- for k, v in body.items()
138
- }
139
-
140
- for attempt in range(retry_count + 1):
141
- try:
142
- response = requests.request(
143
- method=method,
144
- url=url,
145
- headers=resolved_headers,
146
- json=resolved_body,
147
- timeout=timeout,
148
- verify=verify_path
149
- )
150
- if response.status_code == 401 and auth_config and attempt < retry_count:
151
- log("🔁 Token expired. Yenileniyor...")
152
- token, session = refresh_auth_token(action_api_name, auth_config, session)
153
- continue
154
- response.raise_for_status()
155
- break
156
- except requests.HTTPError as e:
157
- if response.status_code != 401 or attempt == retry_count:
158
- raise e
159
-
160
- log("✅ API çağrısı başarılı")
161
- json_resp = response.json()
162
-
163
- field = api_def.get("response_parser", {}).get("field")
164
- value = json_resp.get(field) if field else json_resp
165
- template = api_def.get("reply_template", str(value))
166
- reply = intent.resolve_placeholders(template, session, {**variables, field: str(value)})
167
-
168
- session.setdefault("variables", {}).update(variables)
169
- session["last_intent"] = intent_name
170
- return {
171
- "reply": reply,
172
- "session": session
173
- }
174
-
175
- except Exception as e:
176
- log(f"❌ execute_intent() hatası: {e}")
177
- traceback.print_exc()
178
- return {
179
- "error": str(e),
180
- "session": session
181
  }
 
1
+ from intent_utils
2
+ import requests
3
+ import traceback
4
+ from log import log
5
+
6
+ def auth_token_handler(api_name, auth_config, session):
7
+ try:
8
+ token_info = session.auth_tokens.get(api_name)
9
+ if token_info and "token" in token_info:
10
+ return token_info["token"], session
11
+
12
+ auth_endpoint = auth_config.get("auth_endpoint")
13
+ auth_body = auth_config.get("auth_body", {})
14
+ token_path = auth_config.get("auth_token_path")
15
+
16
+ if not auth_endpoint or not token_path:
17
+ raise Exception("auth_endpoint veya token_path tanımsız")
18
+
19
+ resolved_body = {
20
+ k: intent.resolve_placeholders(str(v), session.__dict__, session.variables) for k, v in auth_body.items()
21
+ }
22
+
23
+ response = requests.post(auth_endpoint, json=resolved_body, timeout=5)
24
+ response.raise_for_status()
25
+ json_resp = response.json()
26
+
27
+ token_parts = token_path.split(".")
28
+ token = json_resp
29
+ for part in token_parts:
30
+ token = token.get(part)
31
+ if token is None:
32
+ raise Exception(f"Token path çözülemedi: {token_path}")
33
+
34
+ refresh_token = json_resp.get("refresh_token")
35
+ session.auth_tokens[api_name] = {
36
+ "token": token,
37
+ "refresh_token": refresh_token
38
+ }
39
+
40
+ return token, session
41
+
42
+ except Exception as e:
43
+ log(f"❌ Auth token alınamadı: {e}")
44
+ raise e
45
+
46
+ def refresh_auth_token(api_name, auth_config, session):
47
+ try:
48
+ refresh_endpoint = auth_config.get("auth_refresh_endpoint")
49
+ refresh_body = auth_config.get("refresh_body", {})
50
+ token_path = auth_config.get("auth_token_path")
51
+
52
+ if not refresh_endpoint or not token_path:
53
+ raise Exception("Refresh yapılandırması eksik")
54
+
55
+ refresh_token = session.auth_tokens.get(api_name, {}).get("refresh_token")
56
+ if not refresh_token:
57
+ raise Exception("Mevcut refresh token bulunamadı")
58
+
59
+ resolved_body = {
60
+ k: intent.resolve_placeholders(str(v), session.__dict__, session.variables) for k, v in refresh_body.items()
61
+ }
62
+
63
+ response = requests.post(refresh_endpoint, json=resolved_body, timeout=5)
64
+ response.raise_for_status()
65
+ json_resp = response.json()
66
+
67
+ token_parts = token_path.split(".")
68
+ token = json_resp
69
+ for part in token_parts:
70
+ token = token.get(part)
71
+ if token is None:
72
+ raise Exception(f"Token path çözülemedi: {token_path}")
73
+
74
+ new_refresh_token = json_resp.get("refresh_token", refresh_token)
75
+
76
+ session.auth_tokens[api_name] = {
77
+ "token": token,
78
+ "refresh_token": new_refresh_token
79
+ }
80
+
81
+ log(f"🔁 Token başarıyla yenilendi: {api_name}")
82
+ return token, session
83
+
84
+ except Exception as e:
85
+ log(f"❌ Token yenileme başarısız: {e}")
86
+ raise e
87
+
88
+ def execute_intent(intent_name, user_input, session_dict, intent_definitions, data_formats):
89
+ try:
90
+ session = session_dict
91
+ intent_def = intent_definitions[intent_name]
92
+ action_api_name = intent_def.get("action")
93
+
94
+ if not action_api_name:
95
+ raise Exception(f"Intent '{intent_name}' için action tanımı eksik.")
96
+
97
+ api_def = session["service_config"].get_api_config(action_api_name)
98
+ if not api_def:
99
+ raise Exception(f"API '{action_api_name}' tanımı bulunamadı.")
100
+
101
+ variables_raw = intent.extract_parameters(intent_def.get("variables", []), user_input)
102
+ variables = {item["key"]: item["value"] for item in variables_raw}
103
+
104
+ log(f"🚀 execute_intent('{intent_name}')")
105
+ log(f"🔍 Çıkarılan parametreler: {variables}")
106
+
107
+ variable_format_map = intent_def.get("variable_formats", {})
108
+ is_valid, validation_errors = intent.validate_variable_formats(variables, variable_format_map, data_formats)
109
+ if not is_valid:
110
+ log(f"⚠️ Validasyon hatası: {validation_errors}")
111
+ return {
112
+ "errors": validation_errors,
113
+ "awaiting_variable": list(validation_errors.keys())[0],
114
+ "session": session
115
+ }
116
+
117
+ headers = api_def.get("headers", [])
118
+ body = api_def.get("body", {})
119
+ method = api_def.get("method", "POST")
120
+ url = api_def["url"]
121
+ timeout = api_def.get("timeout", 5)
122
+ retry_count = api_def.get("retry_count", 0)
123
+ auth_config = api_def.get("auth")
124
+ tls = api_def.get("tls", {})
125
+ verify = tls.get("verify", True)
126
+ verify_path = tls.get("ca_bundle") if verify and tls.get("ca_bundle") else verify
127
+
128
+ if auth_config:
129
+ token, session = auth_token_handler(action_api_name, auth_config, session)
130
+
131
+ resolved_headers = {
132
+ h["key"]: intent.resolve_placeholders(h["value"], session, variables)
133
+ for h in headers
134
+ }
135
+ resolved_body = {
136
+ k: intent.resolve_placeholders(str(v), session, variables)
137
+ for k, v in body.items()
138
+ }
139
+
140
+ for attempt in range(retry_count + 1):
141
+ try:
142
+ response = requests.request(
143
+ method=method,
144
+ url=url,
145
+ headers=resolved_headers,
146
+ json=resolved_body,
147
+ timeout=timeout,
148
+ verify=verify_path
149
+ )
150
+ if response.status_code == 401 and auth_config and attempt < retry_count:
151
+ log("🔁 Token expired. Yenileniyor...")
152
+ token, session = refresh_auth_token(action_api_name, auth_config, session)
153
+ continue
154
+ response.raise_for_status()
155
+ break
156
+ except requests.HTTPError as e:
157
+ if response.status_code != 401 or attempt == retry_count:
158
+ raise e
159
+
160
+ log("✅ API çağrısı başarılı")
161
+ json_resp = response.json()
162
+
163
+ field = api_def.get("response_parser", {}).get("field")
164
+ value = json_resp.get(field) if field else json_resp
165
+ template = api_def.get("reply_template", str(value))
166
+ reply = intent.resolve_placeholders(template, session, {**variables, field: str(value)})
167
+
168
+ session.setdefault("variables", {}).update(variables)
169
+ session["last_intent"] = intent_name
170
+ return {
171
+ "reply": reply,
172
+ "session": session
173
+ }
174
+
175
+ except Exception as e:
176
+ log(f"❌ execute_intent() hatası: {e}")
177
+ traceback.print_exc()
178
+ return {
179
+ "error": str(e),
180
+ "session": session
181
  }