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.
@@ -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,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev223
3
+ Version: 0.0.1.dev224
4
4
  Summary: A Python SDK for Dhisana AI Platform
5
5
  Home-page: https://github.com/dhisana-ai/dhisana-python-sdk
6
6
  Author: Admin
@@ -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=-5Wxc1D4KyCuNJjf9UvIXqK-eXmcr_1MpUg4u_B06SQ,60749
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.dev223.dist-info/METADATA,sha256=29qd5ggtvK6g1x6hIG1OOqm8sJPwn8OnPaMgRp60W0k,1190
96
- dhisana-0.0.1.dev223.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
- dhisana-0.0.1.dev223.dist-info/entry_points.txt,sha256=jujxteZmNI9EkEaK-pOCoWuBujU8TCevdkfl9ZcKHek,49
98
- dhisana-0.0.1.dev223.dist-info/top_level.txt,sha256=NETTHt6YifG_P7XtRHbQiXZlgSFk9Qh9aR-ng1XTf4s,8
99
- dhisana-0.0.1.dev223.dist-info/RECORD,,
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,,