dhisana 0.0.1.dev223__py3-none-any.whl → 0.0.1.dev224__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dhisana/utils/test_connect.py +104 -0
- {dhisana-0.0.1.dev223.dist-info → dhisana-0.0.1.dev224.dist-info}/METADATA +1 -1
- {dhisana-0.0.1.dev223.dist-info → dhisana-0.0.1.dev224.dist-info}/RECORD +6 -6
- {dhisana-0.0.1.dev223.dist-info → dhisana-0.0.1.dev224.dist-info}/WHEEL +0 -0
- {dhisana-0.0.1.dev223.dist-info → dhisana-0.0.1.dev224.dist-info}/entry_points.txt +0 -0
- {dhisana-0.0.1.dev223.dist-info → dhisana-0.0.1.dev224.dist-info}/top_level.txt +0 -0
dhisana/utils/test_connect.py
CHANGED
|
@@ -1055,6 +1055,109 @@ async def test_jinaai(api_key: str) -> Dict[str, Any]:
|
|
|
1055
1055
|
return {"success": False, "status_code": 0, "error_message": str(exc)}
|
|
1056
1056
|
|
|
1057
1057
|
|
|
1058
|
+
async def test_firefliesai(api_key: str) -> Dict[str, Any]:
|
|
1059
|
+
"""Validate Fireflies.ai API key by querying user metadata via GraphQL."""
|
|
1060
|
+
url = "https://api.fireflies.ai/graphql"
|
|
1061
|
+
headers = {
|
|
1062
|
+
"Authorization": f"Bearer {api_key}",
|
|
1063
|
+
"Content-Type": "application/json",
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
# Try a couple of documented/observed query shapes — Fireflies occasionally
|
|
1067
|
+
# aliases the viewer field, so we fall back if the first choice is rejected.
|
|
1068
|
+
queries = [
|
|
1069
|
+
("users", {"query": "{ users { name user_id } }"}, ("data", "users")),
|
|
1070
|
+
("viewer", {"query": "query { viewer { id email } }"}, ("data", "viewer")),
|
|
1071
|
+
("me", {"query": "query { me { id email } }"}, ("data", "me")),
|
|
1072
|
+
("currentUser", {"query": "query { currentUser { id email } }"}, ("data", "currentUser")),
|
|
1073
|
+
]
|
|
1074
|
+
|
|
1075
|
+
def extract_error(payload: Optional[Dict[str, Any]]) -> Optional[str]:
|
|
1076
|
+
if not isinstance(payload, dict):
|
|
1077
|
+
return None
|
|
1078
|
+
errors = payload.get("errors")
|
|
1079
|
+
if isinstance(errors, list):
|
|
1080
|
+
messages = [
|
|
1081
|
+
err.get("message") for err in errors
|
|
1082
|
+
if isinstance(err, dict) and err.get("message")
|
|
1083
|
+
]
|
|
1084
|
+
if messages:
|
|
1085
|
+
return "; ".join(messages)
|
|
1086
|
+
elif errors:
|
|
1087
|
+
return str(errors)
|
|
1088
|
+
return (
|
|
1089
|
+
payload.get("message")
|
|
1090
|
+
or payload.get("error_description")
|
|
1091
|
+
or payload.get("error")
|
|
1092
|
+
)
|
|
1093
|
+
|
|
1094
|
+
try:
|
|
1095
|
+
timeout = aiohttp.ClientTimeout(total=10)
|
|
1096
|
+
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
1097
|
+
last_error: Optional[str] = None
|
|
1098
|
+
|
|
1099
|
+
for query_name, payload, data_path in queries:
|
|
1100
|
+
async with session.post(url, headers=headers, json=payload) as response:
|
|
1101
|
+
status = response.status
|
|
1102
|
+
data = await safe_json(response)
|
|
1103
|
+
|
|
1104
|
+
if status != 200:
|
|
1105
|
+
error_message = extract_error(data)
|
|
1106
|
+
if (
|
|
1107
|
+
error_message
|
|
1108
|
+
and "Cannot query field" in error_message
|
|
1109
|
+
and query_name != queries[-1][0]
|
|
1110
|
+
):
|
|
1111
|
+
last_error = error_message
|
|
1112
|
+
continue
|
|
1113
|
+
return {
|
|
1114
|
+
"success": False,
|
|
1115
|
+
"status_code": status,
|
|
1116
|
+
"error_message": error_message or f"Non-200 from Fireflies.ai ({query_name})",
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
if not isinstance(data, dict):
|
|
1120
|
+
return {
|
|
1121
|
+
"success": False,
|
|
1122
|
+
"status_code": status,
|
|
1123
|
+
"error_message": "Fireflies.ai returned non-JSON response.",
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
error_message = extract_error(data)
|
|
1127
|
+
if error_message:
|
|
1128
|
+
last_error = error_message
|
|
1129
|
+
# If the error indicates the field is unknown, try the next query option.
|
|
1130
|
+
if "Cannot query field" in error_message and query_name != queries[-1][0]:
|
|
1131
|
+
continue
|
|
1132
|
+
return {
|
|
1133
|
+
"success": False,
|
|
1134
|
+
"status_code": status,
|
|
1135
|
+
"error_message": error_message,
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
# Walk the data path to ensure the expected field exists.
|
|
1139
|
+
cursor: Any = data
|
|
1140
|
+
for key in data_path:
|
|
1141
|
+
if not isinstance(cursor, dict):
|
|
1142
|
+
cursor = None
|
|
1143
|
+
break
|
|
1144
|
+
cursor = cursor.get(key)
|
|
1145
|
+
|
|
1146
|
+
if cursor is not None:
|
|
1147
|
+
return {"success": True, "status_code": status, "error_message": None}
|
|
1148
|
+
|
|
1149
|
+
last_error = f"Fireflies.ai {query_name} response missing expected fields."
|
|
1150
|
+
|
|
1151
|
+
return {
|
|
1152
|
+
"success": False,
|
|
1153
|
+
"status_code": 200,
|
|
1154
|
+
"error_message": last_error or "Fireflies.ai queries did not return user data.",
|
|
1155
|
+
}
|
|
1156
|
+
except Exception as exc:
|
|
1157
|
+
logger.error(f"Fireflies.ai connectivity test failed: {exc}")
|
|
1158
|
+
return {"success": False, "status_code": 0, "error_message": str(exc)}
|
|
1159
|
+
|
|
1160
|
+
|
|
1058
1161
|
async def test_firecrawl(api_key: str) -> Dict[str, Any]:
|
|
1059
1162
|
"""Quick check for Firecrawl API key validity."""
|
|
1060
1163
|
url = "https://api.firecrawl.com/v1/scrape"
|
|
@@ -1250,6 +1353,7 @@ async def test_connectivity(tool_config: List[Dict[str, Any]]) -> Dict[str, Dict
|
|
|
1250
1353
|
"findymail": test_findyemail,
|
|
1251
1354
|
"datagma": test_datagma,
|
|
1252
1355
|
"jinaai": test_jinaai,
|
|
1356
|
+
"firefliesai": test_firefliesai,
|
|
1253
1357
|
"firecrawl": test_firecrawl,
|
|
1254
1358
|
"youtube": test_youtube,
|
|
1255
1359
|
"salesforce": test_salesforce,
|
|
@@ -78,7 +78,7 @@ dhisana/utils/serperdev_google_jobs.py,sha256=m5_2f_5y79FOFZz1A_go6m0hIUfbbAoZ0Y
|
|
|
78
78
|
dhisana/utils/serperdev_local_business.py,sha256=JoZfTg58Hojv61cyuwA2lcnPdLT1lawnWaBNrUYWnuQ,6447
|
|
79
79
|
dhisana/utils/serperdev_search.py,sha256=_iBKIfHMq4gFv5StYz58eArriygoi1zW6VnLlux8vto,9363
|
|
80
80
|
dhisana/utils/smtp_email_tools.py,sha256=kx0VSa0JQyVLD020oARCHhOBZJxDwMIri1Z7jPN0nP4,15843
|
|
81
|
-
dhisana/utils/test_connect.py,sha256
|
|
81
|
+
dhisana/utils/test_connect.py,sha256=AhaGFV1-E5YhzkWyDtXypuAeFxgB6tIBHAs5eSSL-6k,65210
|
|
82
82
|
dhisana/utils/trasform_json.py,sha256=s48DoyzVVCI4dTvSUwF5X-exX6VH6nPWrjbUENkYuNE,6979
|
|
83
83
|
dhisana/utils/web_download_parse_tools.py,sha256=ouXwH7CmjcRjoBfP5BWat86MvcGO-8rLCmWQe_eZKjc,7810
|
|
84
84
|
dhisana/utils/workflow_code_model.py,sha256=YPWse5vBb3O6Km2PvKh1Q3AB8qBkzLt1CrR5xOL9Mro,99
|
|
@@ -92,8 +92,8 @@ dhisana/workflow/agent.py,sha256=esv7_i_XuMkV2j1nz_UlsHov_m6X5WZZiZm_tG4OBHU,565
|
|
|
92
92
|
dhisana/workflow/flow.py,sha256=xWE3qQbM7j2B3FH8XnY3zOL_QXX4LbTW4ArndnEYJE0,1638
|
|
93
93
|
dhisana/workflow/task.py,sha256=HlWz9mtrwLYByoSnePOemBUBrMEcj7KbgNjEE1oF5wo,1830
|
|
94
94
|
dhisana/workflow/test.py,sha256=kwW8jWqSBNcRmoyaxlTuZCMOpGJpTbJQgHI7gSjwdzM,3399
|
|
95
|
-
dhisana-0.0.1.
|
|
96
|
-
dhisana-0.0.1.
|
|
97
|
-
dhisana-0.0.1.
|
|
98
|
-
dhisana-0.0.1.
|
|
99
|
-
dhisana-0.0.1.
|
|
95
|
+
dhisana-0.0.1.dev224.dist-info/METADATA,sha256=KjVLbvbvTN_2Gsf_Q3mP3vINRSR2Nvkhi78oN5uk6R8,1190
|
|
96
|
+
dhisana-0.0.1.dev224.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
97
|
+
dhisana-0.0.1.dev224.dist-info/entry_points.txt,sha256=jujxteZmNI9EkEaK-pOCoWuBujU8TCevdkfl9ZcKHek,49
|
|
98
|
+
dhisana-0.0.1.dev224.dist-info/top_level.txt,sha256=NETTHt6YifG_P7XtRHbQiXZlgSFk9Qh9aR-ng1XTf4s,8
|
|
99
|
+
dhisana-0.0.1.dev224.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|