ciyidogan commited on
Commit
080cf2c
Β·
verified Β·
1 Parent(s): eca7ebd

Update api_connector.py

Browse files
Files changed (1) hide show
  1. api_connector.py +100 -101
api_connector.py CHANGED
@@ -1,101 +1,100 @@
1
- import requests
2
- from log import log
3
-
4
-
5
- class APIConnector:
6
- def __init__(self, service_config):
7
- self.service_config = service_config
8
-
9
- def resolve_placeholders(self, template, session):
10
- # Replace {variables.xxx} and {auth_tokens.xxx.token}
11
- resolved = template
12
- for key, value in session.variables.items():
13
- resolved = resolved.replace(f"{{variables.{key}}}", str(value))
14
- for api, tokens in session.auth_tokens.items():
15
- resolved = resolved.replace(f"{{auth_tokens.{api}.token}}", tokens.get("token", ""))
16
- return resolved
17
-
18
- def get_auth_token(self, api_name, auth_config, session):
19
- auth_endpoint = auth_config.get("auth_endpoint")
20
- auth_body = {
21
- k: self.resolve_placeholders(str(v), session)
22
- for k, v in auth_config.get("auth_body", {}).items()
23
- }
24
- token_path = auth_config.get("auth_token_path")
25
-
26
- response = requests.post(auth_endpoint, json=auth_body, timeout=5)
27
- response.raise_for_status()
28
- json_resp = response.json()
29
-
30
- token = json_resp
31
- for part in token_path.split("."):
32
- token = token.get(part)
33
- if token is None:
34
- raise Exception(f"Could not resolve token path: {token_path}")
35
-
36
- refresh_token = json_resp.get("refresh_token")
37
- session.auth_tokens[api_name] = {"token": token, "refresh_token": refresh_token}
38
-
39
- log(f"πŸ”‘ Retrieved auth token for {api_name}")
40
- return token
41
-
42
- def refresh_auth_token(self, api_name, auth_config, session):
43
- refresh_endpoint = auth_config.get("auth_refresh_endpoint")
44
- refresh_body = {
45
- k: self.resolve_placeholders(str(v), session)
46
- for k, v in auth_config.get("refresh_body", {}).items()
47
- }
48
- token_path = auth_config.get("auth_token_path")
49
-
50
- response = requests.post(refresh_endpoint, json=refresh_body, timeout=5)
51
- response.raise_for_status()
52
- json_resp = response.json()
53
-
54
- token = json_resp
55
- for part in token_path.split("."):
56
- token = token.get(part)
57
- if token is None:
58
- raise Exception(f"Could not resolve token path: {token_path}")
59
-
60
- new_refresh_token = json_resp.get("refresh_token", session.auth_tokens[api_name].get("refresh_token"))
61
- session.auth_tokens[api_name] = {"token": token, "refresh_token": new_refresh_token}
62
-
63
- log(f"πŸ” Refreshed auth token for {api_name}")
64
- return token
65
-
66
- def call_api(self, intent_def, session):
67
- api_name = intent_def.get("action")
68
- api_def = self.service_config.get_api_config(api_name)
69
- if not api_def:
70
- raise Exception(f"API config not found: {api_name}")
71
-
72
- url = api_def["url"]
73
- method = api_def.get("method", "POST")
74
- headers = {h["key"]: self.resolve_placeholders(h["value"], session) for h in api_def.get("headers", [])}
75
- body = {k: self.resolve_placeholders(str(v), session) for k, v in api_def.get("body", {}).items()}
76
- timeout = api_def.get("timeout", 5)
77
- retry_count = api_def.get("retry_count", 0)
78
- auth_config = api_def.get("auth")
79
-
80
- # Get auth token if needed
81
- if auth_config and api_name not in session.auth_tokens:
82
- self.get_auth_token(api_name, auth_config, session)
83
-
84
- for attempt in range(retry_count + 1):
85
- try:
86
- response = requests.request(method, url, headers=headers, json=body, timeout=timeout)
87
- if response.status_code == 401 and auth_config and attempt < retry_count:
88
- log(f"πŸ” Token expired for {api_name}, refreshing...")
89
- self.refresh_auth_token(api_name, auth_config, session)
90
- continue
91
- response.raise_for_status()
92
- log(f"βœ… API call successful: {api_name}")
93
- return response.json()
94
- except requests.Timeout:
95
- fallback = intent_def.get("fallback_timeout_message", "This operation is currently unavailable.")
96
- log(f"⚠️ API timeout for {api_name} β†’ {fallback}")
97
- return {"fallback": fallback}
98
- except Exception as e:
99
- log(f"❌ API call error for {api_name}: {e}")
100
- fallback = intent_def.get("fallback_error_message", "An error occurred during the operation.")
101
- return {"fallback": fallback}
 
1
+ import requests
2
+ from log import log
3
+
4
+
5
+ class APIConnector:
6
+ def __init__(self, service_config):
7
+ self.service_config = service_config
8
+
9
+ def resolve_placeholders(self, template, session):
10
+ resolved = template
11
+ for key, value in session.variables.items():
12
+ resolved = resolved.replace(f"{{variables.{key}}}", str(value))
13
+ for api, tokens in session.auth_tokens.items():
14
+ resolved = resolved.replace(f"{{auth_tokens.{api}.token}}", tokens.get("token", ""))
15
+ return resolved
16
+
17
+ def get_auth_token(self, api_name, auth_config, session):
18
+ auth_endpoint = auth_config.get("auth_endpoint")
19
+ auth_body = {
20
+ k: self.resolve_placeholders(str(v), session)
21
+ for k, v in auth_config.get("auth_body", {}).items()
22
+ }
23
+ token_path = auth_config.get("auth_token_path")
24
+
25
+ response = requests.post(auth_endpoint, json=auth_body, timeout=5)
26
+ response.raise_for_status()
27
+ json_resp = response.json()
28
+
29
+ token = json_resp
30
+ for part in token_path.split("."):
31
+ token = token.get(part)
32
+ if token is None:
33
+ raise Exception(f"Could not resolve token path: {token_path}")
34
+
35
+ refresh_token = json_resp.get("refresh_token")
36
+ session.auth_tokens[api_name] = {"token": token, "refresh_token": refresh_token}
37
+
38
+ log(f"πŸ”‘ Retrieved auth token for {api_name}")
39
+ return token
40
+
41
+ def refresh_auth_token(self, api_name, auth_config, session):
42
+ refresh_endpoint = auth_config.get("auth_refresh_endpoint")
43
+ refresh_body = {
44
+ k: self.resolve_placeholders(str(v), session)
45
+ for k, v in auth_config.get("refresh_body", {}).items()
46
+ }
47
+ token_path = auth_config.get("auth_token_path")
48
+
49
+ response = requests.post(refresh_endpoint, json=refresh_body, timeout=5)
50
+ response.raise_for_status()
51
+ json_resp = response.json()
52
+
53
+ token = json_resp
54
+ for part in token_path.split("."):
55
+ token = token.get(part)
56
+ if token is None:
57
+ raise Exception(f"Could not resolve token path: {token_path}")
58
+
59
+ new_refresh_token = json_resp.get("refresh_token", session.auth_tokens[api_name].get("refresh_token"))
60
+ session.auth_tokens[api_name] = {"token": token, "refresh_token": new_refresh_token}
61
+
62
+ log(f"πŸ” Refreshed auth token for {api_name}")
63
+ return token
64
+
65
+ def call_api(self, intent_def, session):
66
+ api_name = intent_def.get("action")
67
+ api_def = self.service_config.get_api_config(api_name)
68
+ if not api_def:
69
+ raise Exception(f"API config not found: {api_name}")
70
+
71
+ url = api_def["url"]
72
+ method = api_def.get("method", "POST")
73
+ headers = {h["key"]: self.resolve_placeholders(h["value"], session) for h in api_def.get("headers", [])}
74
+ body = {k: self.resolve_placeholders(str(v), session) for k, v in api_def.get("body", {}).items()}
75
+ timeout = api_def.get("timeout", 5)
76
+ retry_count = api_def.get("retry_count", 0)
77
+ auth_config = api_def.get("auth")
78
+
79
+ # Get auth token if needed
80
+ if auth_config and api_name not in session.auth_tokens:
81
+ self.get_auth_token(api_name, auth_config, session)
82
+
83
+ for attempt in range(retry_count + 1):
84
+ try:
85
+ response = requests.request(method, url, headers=headers, json=body, timeout=timeout)
86
+ if response.status_code == 401 and auth_config and attempt < retry_count:
87
+ log(f"πŸ” Token expired for {api_name}, refreshing...")
88
+ self.refresh_auth_token(api_name, auth_config, session)
89
+ continue
90
+ response.raise_for_status()
91
+ log(f"βœ… API call successful: {api_name}")
92
+ return response.json()
93
+ except requests.Timeout:
94
+ fallback = intent_def.get("fallback_timeout_message", "This operation is currently unavailable.")
95
+ log(f"⚠️ API timeout for {api_name} β†’ {fallback}")
96
+ return {"fallback": fallback}
97
+ except Exception as e:
98
+ log(f"❌ API call error for {api_name}: {e}")
99
+ fallback = intent_def.get("fallback_error_message", "An error occurred during the operation.")
100
+ return {"fallback": fallback}