dhisana 0.0.1.dev274__tar.gz → 0.0.1.dev276__tar.gz

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.
Files changed (121) hide show
  1. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/PKG-INFO +1 -1
  2. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/setup.py +1 -1
  3. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_email.py +6 -0
  4. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/smtp_email_tools.py +7 -13
  5. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/test_connect.py +3 -3
  6. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana.egg-info/PKG-INFO +1 -1
  7. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/README.md +0 -0
  8. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/pyproject.toml +0 -0
  9. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/setup.cfg +0 -0
  10. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/__init__.py +0 -0
  11. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/cli/__init__.py +0 -0
  12. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/cli/cli.py +0 -0
  13. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/cli/datasets.py +0 -0
  14. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/cli/models.py +0 -0
  15. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/cli/predictions.py +0 -0
  16. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/schemas/__init__.py +0 -0
  17. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/schemas/common.py +0 -0
  18. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/schemas/sales.py +0 -0
  19. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/ui/__init__.py +0 -0
  20. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/ui/components.py +0 -0
  21. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/__init__.py +0 -0
  22. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/add_mapping.py +0 -0
  23. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/agent_tools.py +0 -0
  24. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/apollo_tools.py +0 -0
  25. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/assistant_tool_tag.py +0 -0
  26. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/built_with_api_tools.py +0 -0
  27. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/cache_output_tools.py +0 -0
  28. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/cache_output_tools_local.py +0 -0
  29. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/check_email_validity_tools.py +0 -0
  30. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/check_for_intent_signal.py +0 -0
  31. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/check_linkedin_url_validity.py +0 -0
  32. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/clay_tools.py +0 -0
  33. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/clean_properties.py +0 -0
  34. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/company_utils.py +0 -0
  35. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/compose_salesnav_query.py +0 -0
  36. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/compose_search_query.py +0 -0
  37. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/compose_three_step_workflow.py +0 -0
  38. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/composite_tools.py +0 -0
  39. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/dataframe_tools.py +0 -0
  40. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/domain_parser.py +0 -0
  41. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/email_body_utils.py +0 -0
  42. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/email_parse_helpers.py +0 -0
  43. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/email_provider.py +0 -0
  44. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/enrich_lead_information.py +0 -0
  45. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/extract_email_content_for_llm.py +0 -0
  46. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/fetch_openai_config.py +0 -0
  47. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/field_validators.py +0 -0
  48. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/g2_tools.py +0 -0
  49. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_content.py +0 -0
  50. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_custom_message.py +0 -0
  51. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_email_response.py +0 -0
  52. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_flow.py +0 -0
  53. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_leads_salesnav.py +0 -0
  54. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_linkedin_connect_message.py +0 -0
  55. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_linkedin_response_message.py +0 -0
  56. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/generate_structured_output_internal.py +0 -0
  57. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/google_custom_search.py +0 -0
  58. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/google_oauth_tools.py +0 -0
  59. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/google_workspace_tools.py +0 -0
  60. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/hubspot_clearbit.py +0 -0
  61. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/hubspot_crm_tools.py +0 -0
  62. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/instantly_tools.py +0 -0
  63. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/linkedin_crawler.py +0 -0
  64. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/lusha_tools.py +0 -0
  65. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/mailgun_tools.py +0 -0
  66. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/mailreach_tools.py +0 -0
  67. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/microsoft365_tools.py +0 -0
  68. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/openai_assistant_and_file_utils.py +0 -0
  69. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/openai_helpers.py +0 -0
  70. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/openapi_spec_to_tools.py +0 -0
  71. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/openapi_tool/__init__.py +0 -0
  72. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/openapi_tool/api_models.py +0 -0
  73. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/openapi_tool/convert_openai_spec_to_tool.py +0 -0
  74. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/openapi_tool/openapi_tool.py +0 -0
  75. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/parse_linkedin_messages_txt.py +0 -0
  76. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/profile.py +0 -0
  77. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/proxy_curl_tools.py +0 -0
  78. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/proxycurl_search_leads.py +0 -0
  79. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/python_function_to_tools.py +0 -0
  80. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/research_lead.py +0 -0
  81. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/sales_navigator_crawler.py +0 -0
  82. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/salesforce_crm_tools.py +0 -0
  83. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/search_router.py +0 -0
  84. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/search_router_jobs.py +0 -0
  85. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/sendgrid_tools.py +0 -0
  86. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serarch_router_local_business.py +0 -0
  87. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serpapi_additional_tools.py +0 -0
  88. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serpapi_google_jobs.py +0 -0
  89. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serpapi_google_search.py +0 -0
  90. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serpapi_local_business_search.py +0 -0
  91. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serpapi_search_tools.py +0 -0
  92. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serperdev_google_jobs.py +0 -0
  93. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serperdev_local_business.py +0 -0
  94. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/serperdev_search.py +0 -0
  95. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/trasform_json.py +0 -0
  96. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/web_download_parse_tools.py +0 -0
  97. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/workflow_code_model.py +0 -0
  98. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/utils/zoominfo_tools.py +0 -0
  99. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/workflow/__init__.py +0 -0
  100. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/workflow/agent.py +0 -0
  101. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/workflow/flow.py +0 -0
  102. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/workflow/task.py +0 -0
  103. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana/workflow/test.py +0 -0
  104. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana.egg-info/SOURCES.txt +0 -0
  105. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana.egg-info/dependency_links.txt +0 -0
  106. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana.egg-info/entry_points.txt +0 -0
  107. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana.egg-info/requires.txt +0 -0
  108. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/src/dhisana.egg-info/top_level.txt +0 -0
  109. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_agent_tools.py +0 -0
  110. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_apollo_company_search.py +0 -0
  111. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_apollo_lead_search.py +0 -0
  112. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_connectivity.py +0 -0
  113. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_email_body_utils.py +0 -0
  114. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_google_document.py +0 -0
  115. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_hubspot_call_logs.py +0 -0
  116. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_linkedin_serper.py +0 -0
  117. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_mailreach.py +0 -0
  118. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_mcp_connectivity.py +0 -0
  119. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_proxycurl_get_company_search_id.py +0 -0
  120. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_proxycurl_job_count.py +0 -0
  121. {dhisana-0.0.1.dev274 → dhisana-0.0.1.dev276}/tests/test_structured_output_with_mcp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev274
3
+ Version: 0.0.1.dev276
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
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='dhisana',
5
- version='0.0.1-dev274',
5
+ version='0.0.1-dev276',
6
6
  description='A Python SDK for Dhisana AI Platform',
7
7
  author='Admin',
8
8
  author_email='contact@dhisana.ai',
@@ -231,6 +231,10 @@ async def generate_email_from_instructions(
231
231
  - If there is a link provided, use it as is without wrapping in any HTML tags.
232
232
  """
233
233
 
234
+ html_template_note = ""
235
+ if allow_html and getattr(message_instructions, "html_template", None):
236
+ html_template_note = f"\nHTML Template to follow: {message_instructions.html_template}"
237
+
234
238
  email_prompt = f"""
235
239
  Generate a personalized business email based on these specifications:
236
240
 
@@ -258,6 +262,8 @@ CALL TO ACTION:
258
262
  FORMATTING REQUIREMENTS:
259
263
  {instructions.formatting_requirements}
260
264
 
265
+ {html_template_note}
266
+
261
267
  {output_requirements}
262
268
 
263
269
  ADDITIONAL REQUIREMENTS:
@@ -1,9 +1,8 @@
1
- # dhisana/email_io.py
1
+ # dhisana/smtp_email_tools.py
2
2
  # ─────────────────────────────────────────────────────────────────────────────
3
3
  # Standard library
4
4
  # ─────────────────────────────────────────────────────────────────────────────
5
5
  import asyncio
6
- import datetime
7
6
  import email
8
7
  import email.utils
9
8
  import hashlib
@@ -105,11 +104,6 @@ def _to_datetime(val: Union[datetime, str]) -> datetime:
105
104
  ) from exc
106
105
 
107
106
 
108
- def _looks_like_html(text: str) -> bool:
109
- """Heuristically determine whether the body contains HTML markup."""
110
- return bool(text and re.search(r"<[a-zA-Z][^>]*>", text))
111
-
112
-
113
107
  def _html_to_plain_text(html: str) -> str:
114
108
  """
115
109
  Produce a very lightweight plain-text version of an HTML fragment.
@@ -186,18 +180,18 @@ async def send_email_via_smtp_async(
186
180
  username=username,
187
181
  password=password,
188
182
  )
189
- # Decide whether to use STARTTLS or TLS
183
+ # Decide whether to use STARTTLS or implicit TLS; otherwise connect plaintext.
190
184
  if use_starttls:
191
185
  smtp_kwargs["start_tls"] = True
192
- else:
193
- smtp_kwargs["tls"] = True
186
+ elif smtp_port == 465:
187
+ # aiosmtplib expects `use_tls` for implicit TLS (e.g., port 465)
188
+ smtp_kwargs["use_tls"] = True
194
189
 
195
190
  try:
196
191
  # aiosmtplib.send returns a (code, response) tuple, but no server message ID.
197
192
  # We rely on the real Message-ID we have just set.
198
193
  await aiosmtplib.send(msg, **smtp_kwargs)
199
194
  logging.info("SMTP send OK – msg id %s", generated_id)
200
- await asyncio.sleep(20)
201
195
  return generated_id
202
196
  except Exception:
203
197
  logging.exception("SMTP send failed")
@@ -557,8 +551,8 @@ async def reply_to_email_via_smtp_async(
557
551
  )
558
552
  if use_starttls_smtp:
559
553
  smtp_kwargs["start_tls"] = True
560
- else:
561
- smtp_kwargs["tls"] = True
554
+ elif smtp_port == 465:
555
+ smtp_kwargs["use_tls"] = True
562
556
 
563
557
  await aiosmtplib.send(msg, **smtp_kwargs)
564
558
 
@@ -17,7 +17,6 @@ from googleapiclient.discovery import build
17
17
  import imaplib
18
18
  import aiosmtplib
19
19
  from simple_salesforce import Salesforce
20
- from urllib.parse import urljoin, urlparse
21
20
 
22
21
  from dhisana.utils.clay_tools import push_to_clay_table
23
22
 
@@ -1030,9 +1029,10 @@ async def test_smtp_accounts(
1030
1029
  try:
1031
1030
  smtp_kwargs = dict(hostname=smtp_host, port=smtp_port, timeout=10)
1032
1031
  if smtp_port == 587:
1033
- smtp_kwargs["start_tls"] = True # STARTTLS upgrade
1032
+ smtp_kwargs["start_tls"] = True # STARTTLS upgrade on submission port
1034
1033
  else:
1035
- smtp_kwargs["tls"] = (smtp_port == 465) # implicit SSL on 465
1034
+ # aiosmtplib uses `use_tls` for implicit TLS (e.g., port 465)
1035
+ smtp_kwargs["use_tls"] = (smtp_port == 465)
1036
1036
 
1037
1037
  smtp = aiosmtplib.SMTP(**smtp_kwargs)
1038
1038
  await smtp.connect()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev274
3
+ Version: 0.0.1.dev276
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
File without changes
File without changes