dhisana 0.0.1.dev215__py3-none-any.whl → 0.0.1.dev217__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/schemas/sales.py CHANGED
@@ -315,6 +315,7 @@ class MessageItem(BaseModel):
315
315
  ...,
316
316
  description="Body of the message in plain text"
317
317
  )
318
+ html_body: Optional[str] = None
318
319
 
319
320
  class MessageResponse(BaseModel):
320
321
  """
@@ -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.dev215
3
+ Version: 0.0.1.dev217
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
@@ -6,7 +6,7 @@ dhisana/cli/models.py,sha256=IzUFZW_X32mL3fpM1_j4q8AF7v5nrxJcxBoqvG-TTgA,706
6
6
  dhisana/cli/predictions.py,sha256=VYgoLK1Ksv6MFImoYZqjQJkds7e5Hso65dHwbxTNNzE,646
7
7
  dhisana/schemas/__init__.py,sha256=jv2YF__bseklT3OWEzlqJ5qE24c4aWd5F4r0TTjOrWQ,65
8
8
  dhisana/schemas/common.py,sha256=WErBbyZAQtkmSOXrMkamJkMptj3uCY1S2CGHJWkB_Ps,9103
9
- dhisana/schemas/sales.py,sha256=Sjs5a6zLUvL10NBKowknimpL5f2IKNg9lGRqXB7IUFc,31900
9
+ dhisana/schemas/sales.py,sha256=CnBi6_YZwqfcd_vDERoMoW8QAa1yfkcOWbFHVr1UcPA,31936
10
10
  dhisana/ui/__init__.py,sha256=jv2YF__bseklT3OWEzlqJ5qE24c4aWd5F4r0TTjOrWQ,65
11
11
  dhisana/ui/components.py,sha256=4NXrAyl9tx2wWwoVYyABO-EOGnreGMvql1AkXWajIIo,14316
12
12
  dhisana/utils/__init__.py,sha256=jv2YF__bseklT3OWEzlqJ5qE24c4aWd5F4r0TTjOrWQ,65
@@ -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.dev215.dist-info/METADATA,sha256=Uwhryk3Uevk_vG5Mv3QFkB-mQ7qSLgKLJkbNgpOO0u0,1190
96
- dhisana-0.0.1.dev215.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
- dhisana-0.0.1.dev215.dist-info/entry_points.txt,sha256=jujxteZmNI9EkEaK-pOCoWuBujU8TCevdkfl9ZcKHek,49
98
- dhisana-0.0.1.dev215.dist-info/top_level.txt,sha256=NETTHt6YifG_P7XtRHbQiXZlgSFk9Qh9aR-ng1XTf4s,8
99
- dhisana-0.0.1.dev215.dist-info/RECORD,,
95
+ dhisana-0.0.1.dev217.dist-info/METADATA,sha256=14YRpC7MaMjhfo_4AsJ3QL9K4ny7sY76AdNTrGzHtaA,1190
96
+ dhisana-0.0.1.dev217.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
+ dhisana-0.0.1.dev217.dist-info/entry_points.txt,sha256=jujxteZmNI9EkEaK-pOCoWuBujU8TCevdkfl9ZcKHek,49
98
+ dhisana-0.0.1.dev217.dist-info/top_level.txt,sha256=NETTHt6YifG_P7XtRHbQiXZlgSFk9Qh9aR-ng1XTf4s,8
99
+ dhisana-0.0.1.dev217.dist-info/RECORD,,