dhisana 0.0.1.dev214__py3-none-any.whl → 0.0.1.dev216__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.
@@ -87,9 +87,9 @@ async def enrich_person_info_from_proxycurl(
87
87
  'Content-Type': 'application/json'
88
88
  }
89
89
 
90
- if not linkedin_url and not email and not phone:
91
- logger.warning("No linkedin_url, email, or phone provided. At least one is required.")
92
- return {'error': "At least one of linkedin_url, email, or phone must be provided"}
90
+ if not linkedin_url:
91
+ logger.warning("No linkedin_url provided.")
92
+ return {'error': "linkedin_url must be provided"}
93
93
 
94
94
  # Check cache if linkedin_url is provided
95
95
  if linkedin_url:
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import json
2
3
  import os
3
4
  from typing import Any, Dict, List, Optional
@@ -129,7 +130,8 @@ async def search_google_serper(
129
130
  all_results: List[Dict[str, Any]] = []
130
131
 
131
132
  # We'll collect results from "organic", converting each to a SerpAPI-like format.
132
- async with aiohttp.ClientSession() as session:
133
+ timeout = aiohttp.ClientTimeout(total=30, connect=10)
134
+ async with aiohttp.ClientSession(timeout=timeout) as session:
133
135
  while len(all_results) < number_of_results:
134
136
  payload = {
135
137
  "q": full_query,
@@ -142,20 +144,57 @@ async def search_google_serper(
142
144
  }
143
145
 
144
146
  logger.debug(f"Requesting Serper.dev page {page} for query '{full_query}'.")
145
- try:
146
- async with session.post(url, headers=headers, json=payload) as response:
147
- if response.status != 200:
148
- try:
149
- error_content = await response.json()
150
- except Exception:
151
- error_content = await response.text()
152
- logger.warning(f"Non-200 response from Serper.dev: {error_content}")
153
- return [json.dumps({"error": error_content})]
154
-
155
- result_json = await response.json()
156
- except Exception as e:
157
- logger.exception("Exception during Serper.dev request.")
158
- return [json.dumps({"error": str(e)})]
147
+ for attempt in range(3):
148
+ try:
149
+ async with session.post(url, headers=headers, json=payload) as response:
150
+ if response.status != 200:
151
+ try:
152
+ error_content = await response.json()
153
+ except Exception:
154
+ error_content = await response.text()
155
+ logger.warning(
156
+ "Non-200 response from Serper.dev: %s (status=%s)",
157
+ error_content,
158
+ response.status,
159
+ )
160
+ return [json.dumps({"error": error_content})]
161
+
162
+ result_json = await response.json()
163
+ break
164
+ except asyncio.TimeoutError:
165
+ logger.warning(
166
+ "Timeout contacting Serper.dev (attempt %s/3) for query '%s'",
167
+ attempt + 1,
168
+ full_query,
169
+ )
170
+ except aiohttp.ClientError as exc:
171
+ logger.warning(
172
+ "Client error contacting Serper.dev (attempt %s/3): %s",
173
+ attempt + 1,
174
+ exc,
175
+ )
176
+ if attempt == 2:
177
+ logger.exception("Exception during Serper.dev request.")
178
+ return [json.dumps({"error": str(exc)})]
179
+ except Exception as e:
180
+ logger.exception("Unexpected exception during Serper.dev request.")
181
+ return [json.dumps({"error": str(e)})]
182
+ else:
183
+ # Successful request, exit retry loop
184
+ break
185
+ await asyncio.sleep(2 ** attempt)
186
+ else:
187
+ logger.error(
188
+ "Failed to retrieve data from Serper.dev after multiple attempts for query '%s'",
189
+ full_query,
190
+ )
191
+ return [
192
+ json.dumps(
193
+ {
194
+ "error": "Serper.dev request timed out after multiple attempts.",
195
+ }
196
+ )
197
+ ]
159
198
 
160
199
  organic_results = result_json.get("organic", [])
161
200
  if not organic_results:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev214
3
+ Version: 0.0.1.dev216
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
@@ -59,7 +59,7 @@ dhisana/utils/openai_helpers.py,sha256=NkTqbdql31GmwTcRd90KsSHpEoAFGpiimchjVTG5R
59
59
  dhisana/utils/openapi_spec_to_tools.py,sha256=oBLVq3WeDWvW9O02NCvY8bxQURQdKwHJHGcX8bC_b2I,1926
60
60
  dhisana/utils/parse_linkedin_messages_txt.py,sha256=g3N_ac70mAEuDDQ7Ott6mkOaBwI3ZvcsJD3R9RlYwPQ,3320
61
61
  dhisana/utils/profile.py,sha256=12IhefaLp3j74zzBzVRe50_KWqtWZ_cdzUKlYNy9T2Y,1192
62
- dhisana/utils/proxy_curl_tools.py,sha256=twsNziN3b2GfnXpNM-97iA2b9FtT84P340RhzlIeTkM,50075
62
+ dhisana/utils/proxy_curl_tools.py,sha256=V54zXOP3K2EWGSYanvw43n45hP_4KG8kw2n_LBiL0ak,49971
63
63
  dhisana/utils/proxycurl_search_leads.py,sha256=6PlraPNYQ4fIDzTYnY-T2g_ip5fPkqHigbGoPD8ZosQ,16131
64
64
  dhisana/utils/python_function_to_tools.py,sha256=jypddM6WTlIQmRWnqAugYJXvaPYaXaMgWAZRYeeGlj4,2682
65
65
  dhisana/utils/research_lead.py,sha256=i7xk3edNzYKeJ_-JzKXwGL-NeeApZuWpx4vd4Uvguw4,7009
@@ -76,7 +76,7 @@ dhisana/utils/serpapi_local_business_search.py,sha256=vinmuXLaQ_0BpEdwnONZ2vLTq5
76
76
  dhisana/utils/serpapi_search_tools.py,sha256=MglMPN9wHkGAHb7YAQXvEDsWK3RGS-zu3wUIvZAYxfo,31738
77
77
  dhisana/utils/serperdev_google_jobs.py,sha256=m5_2f_5y79FOFZz1A_go6m0hIUfbbAoZ0YTjUMO2BSI,4508
78
78
  dhisana/utils/serperdev_local_business.py,sha256=JoZfTg58Hojv61cyuwA2lcnPdLT1lawnWaBNrUYWnuQ,6447
79
- dhisana/utils/serperdev_search.py,sha256=Uv38XN5CKPeD8gipRKjz4PGwB7189MDeRvzKSxgp2nU,7687
79
+ dhisana/utils/serperdev_search.py,sha256=_iBKIfHMq4gFv5StYz58eArriygoi1zW6VnLlux8vto,9363
80
80
  dhisana/utils/smtp_email_tools.py,sha256=kx0VSa0JQyVLD020oARCHhOBZJxDwMIri1Z7jPN0nP4,15843
81
81
  dhisana/utils/test_connect.py,sha256=-BL0BfHsKuD9JMAfKzyWyLolcZomYlKQWYdkQC8TOn8,53970
82
82
  dhisana/utils/trasform_json.py,sha256=s48DoyzVVCI4dTvSUwF5X-exX6VH6nPWrjbUENkYuNE,6979
@@ -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.dev214.dist-info/METADATA,sha256=qfSUHgTeVbhjitTsj_yrgiqhlFxrVLr45hEYd_S-o2w,1190
96
- dhisana-0.0.1.dev214.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
- dhisana-0.0.1.dev214.dist-info/entry_points.txt,sha256=jujxteZmNI9EkEaK-pOCoWuBujU8TCevdkfl9ZcKHek,49
98
- dhisana-0.0.1.dev214.dist-info/top_level.txt,sha256=NETTHt6YifG_P7XtRHbQiXZlgSFk9Qh9aR-ng1XTf4s,8
99
- dhisana-0.0.1.dev214.dist-info/RECORD,,
95
+ dhisana-0.0.1.dev216.dist-info/METADATA,sha256=9AsIIMKtc-BrvNBrKu0lBLRSkcWPjBBcJxpOXa3twkc,1190
96
+ dhisana-0.0.1.dev216.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
+ dhisana-0.0.1.dev216.dist-info/entry_points.txt,sha256=jujxteZmNI9EkEaK-pOCoWuBujU8TCevdkfl9ZcKHek,49
98
+ dhisana-0.0.1.dev216.dist-info/top_level.txt,sha256=NETTHt6YifG_P7XtRHbQiXZlgSFk9Qh9aR-ng1XTf4s,8
99
+ dhisana-0.0.1.dev216.dist-info/RECORD,,