dhisana 0.0.1.dev308__tar.gz → 0.0.1.dev309__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 (128) hide show
  1. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/PKG-INFO +1 -1
  2. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/setup.py +1 -1
  3. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/test_connect.py +43 -20
  4. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana.egg-info/PKG-INFO +1 -1
  5. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/README.md +0 -0
  6. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/pyproject.toml +0 -0
  7. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/setup.cfg +0 -0
  8. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/__init__.py +0 -0
  9. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/cli/__init__.py +0 -0
  10. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/cli/cli.py +0 -0
  11. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/cli/datasets.py +0 -0
  12. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/cli/models.py +0 -0
  13. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/cli/predictions.py +0 -0
  14. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/schemas/__init__.py +0 -0
  15. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/schemas/common.py +0 -0
  16. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/schemas/sales.py +0 -0
  17. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/ui/__init__.py +0 -0
  18. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/ui/components.py +0 -0
  19. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/__init__.py +0 -0
  20. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/add_mapping.py +0 -0
  21. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/agent_tools.py +0 -0
  22. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/apollo_tools.py +0 -0
  23. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/assistant_tool_tag.py +0 -0
  24. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/built_with_api_tools.py +0 -0
  25. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/cache_output_tools.py +0 -0
  26. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/cache_output_tools_local.py +0 -0
  27. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/check_email_validity_tools.py +0 -0
  28. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/check_for_intent_signal.py +0 -0
  29. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/check_linkedin_url_validity.py +0 -0
  30. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/clay_tools.py +0 -0
  31. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/clean_properties.py +0 -0
  32. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/company_utils.py +0 -0
  33. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/compose_salesnav_query.py +0 -0
  34. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/compose_search_query.py +0 -0
  35. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/compose_three_step_workflow.py +0 -0
  36. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/composite_tools.py +0 -0
  37. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/dataframe_tools.py +0 -0
  38. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/domain_parser.py +0 -0
  39. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/email_body_utils.py +0 -0
  40. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/email_parse_helpers.py +0 -0
  41. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/email_provider.py +0 -0
  42. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/enrich_lead_information.py +0 -0
  43. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/extract_email_content_for_llm.py +0 -0
  44. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/fetch_openai_config.py +0 -0
  45. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/field_validators.py +0 -0
  46. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/g2_tools.py +0 -0
  47. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_content.py +0 -0
  48. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_custom_message.py +0 -0
  49. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_email.py +0 -0
  50. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_email_response.py +0 -0
  51. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_flow.py +0 -0
  52. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_leads_salesnav.py +0 -0
  53. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_linkedin_connect_message.py +0 -0
  54. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_linkedin_response_message.py +0 -0
  55. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_sms_whatsapp.py +0 -0
  56. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/generate_structured_output_internal.py +0 -0
  57. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/google_custom_search.py +0 -0
  58. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/google_oauth_tools.py +0 -0
  59. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/google_workspace_tools.py +0 -0
  60. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/hubspot_clearbit.py +0 -0
  61. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/hubspot_crm_tools.py +0 -0
  62. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/instantly_tools.py +0 -0
  63. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/linkedin_crawler.py +0 -0
  64. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/lusha_tools.py +0 -0
  65. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/mailgun_tools.py +0 -0
  66. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/mailreach_tools.py +0 -0
  67. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/microsoft365_tools.py +0 -0
  68. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/openai_assistant_and_file_utils.py +0 -0
  69. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/openai_helpers.py +0 -0
  70. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/openapi_spec_to_tools.py +0 -0
  71. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/openapi_tool/__init__.py +0 -0
  72. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/openapi_tool/api_models.py +0 -0
  73. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/openapi_tool/convert_openai_spec_to_tool.py +0 -0
  74. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/openapi_tool/openapi_tool.py +0 -0
  75. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/parse_linkedin_messages_txt.py +0 -0
  76. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/profile.py +0 -0
  77. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/proxy_curl_tools.py +0 -0
  78. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/proxycurl_search_leads.py +0 -0
  79. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/python_function_to_tools.py +0 -0
  80. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/research_lead.py +0 -0
  81. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/sales_navigator_crawler.py +0 -0
  82. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/salesforce_crm_tools.py +0 -0
  83. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/search_router.py +0 -0
  84. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/search_router_jobs.py +0 -0
  85. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/sendgrid_tools.py +0 -0
  86. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serarch_router_local_business.py +0 -0
  87. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serpapi_additional_tools.py +0 -0
  88. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serpapi_google_jobs.py +0 -0
  89. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serpapi_google_search.py +0 -0
  90. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serpapi_local_business_search.py +0 -0
  91. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serpapi_search_tools.py +0 -0
  92. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serperdev_google_jobs.py +0 -0
  93. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serperdev_local_business.py +0 -0
  94. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/serperdev_search.py +0 -0
  95. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/smtp_email_tools.py +0 -0
  96. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/trasform_json.py +0 -0
  97. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/web_download_parse_tools.py +0 -0
  98. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/workflow_code_model.py +0 -0
  99. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/utils/zoominfo_tools.py +0 -0
  100. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/workflow/__init__.py +0 -0
  101. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/workflow/agent.py +0 -0
  102. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/workflow/flow.py +0 -0
  103. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/workflow/task.py +0 -0
  104. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana/workflow/test.py +0 -0
  105. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana.egg-info/SOURCES.txt +0 -0
  106. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana.egg-info/dependency_links.txt +0 -0
  107. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana.egg-info/entry_points.txt +0 -0
  108. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana.egg-info/requires.txt +0 -0
  109. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/src/dhisana.egg-info/top_level.txt +0 -0
  110. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_agent_tools.py +0 -0
  111. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_apollo_company_search.py +0 -0
  112. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_apollo_json_error_handling.py +0 -0
  113. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_apollo_lead_search.py +0 -0
  114. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_connectivity.py +0 -0
  115. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_email_body_utils.py +0 -0
  116. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_generate_email.py +0 -0
  117. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_generate_sms_whatsapp.py +0 -0
  118. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_google_document.py +0 -0
  119. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_hubspot_call_logs.py +0 -0
  120. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_linkedin_serper.py +0 -0
  121. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_mailreach.py +0 -0
  122. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_mcp_connectivity.py +0 -0
  123. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_normalize_graph_datetime.py +0 -0
  124. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_proxycurl_get_company_search_id.py +0 -0
  125. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_proxycurl_job_count.py +0 -0
  126. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_reply_thread_fallback.py +0 -0
  127. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/tests/test_send_email_recipients.py +0 -0
  128. {dhisana-0.0.1.dev308 → dhisana-0.0.1.dev309}/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.dev308
3
+ Version: 0.0.1.dev309
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-dev308',
5
+ version='0.0.1-dev309',
6
6
  description='A Python SDK for Dhisana AI Platform',
7
7
  author='Admin',
8
8
  author_email='contact@dhisana.ai',
@@ -3,7 +3,7 @@ import logging
3
3
  import asyncio
4
4
  import os
5
5
  from datetime import datetime, timedelta, timezone
6
- from typing import Awaitable, Callable, Dict, List, Any, Optional
6
+ from typing import Awaitable, Callable, Dict, List, Any, Optional, Union
7
7
  import requests
8
8
 
9
9
  try:
@@ -2106,17 +2106,17 @@ async def test_dataverse(
2106
2106
 
2107
2107
 
2108
2108
  async def test_gemini(
2109
- api_key: str = "",
2109
+ api_key: Union[str, Dict[str, Any]] = "",
2110
2110
  use_vertex_ai: bool = False,
2111
2111
  project: str = "",
2112
2112
  location: str = "us-central1",
2113
2113
  ) -> Dict[str, Any]:
2114
- """Verify Gemini connectivity by issuing a minimal generate_content call.
2114
+ """Verify Gemini connectivity by listing available models.
2115
2115
 
2116
2116
  Args:
2117
- api_key: A Gemini API key *or* a service-account JSON string.
2118
- When a service-account JSON is detected, Vertex AI mode is
2119
- enabled automatically.
2117
+ api_key: A Gemini API key, a service-account JSON string, or an
2118
+ already-parsed service-account ``dict``. When a service-account
2119
+ JSON is detected, Vertex AI mode is enabled automatically.
2120
2120
  use_vertex_ai: Explicitly enable Vertex AI mode.
2121
2121
  project: GCP project ID (required for Vertex AI).
2122
2122
  location: GCP region for Vertex AI (default ``us-central1``).
@@ -2131,15 +2131,28 @@ async def test_gemini(
2131
2131
  }
2132
2132
 
2133
2133
  try:
2134
- # Try to parse service account JSON from the api_key field
2135
- sa_info = None
2136
- if api_key and api_key.strip().startswith("{"):
2137
- try:
2138
- parsed = json.loads(api_key)
2139
- if isinstance(parsed, dict) and parsed.get("type") == "service_account":
2140
- sa_info = parsed
2141
- except (json.JSONDecodeError, TypeError):
2142
- pass
2134
+ # Normalise api_key: it may arrive as a dict (already-parsed
2135
+ # service-account JSON from Pydantic config deserialization).
2136
+ if isinstance(api_key, dict):
2137
+ if api_key.get("type") == "service_account":
2138
+ sa_info = api_key
2139
+ else:
2140
+ return {
2141
+ "success": False,
2142
+ "status_code": 0,
2143
+ "error_message": "api_key is a dict but not a valid service account JSON (missing \"type\": \"service_account\").",
2144
+ }
2145
+ api_key = "" # not a plain API key string
2146
+ else:
2147
+ # Try to parse service account JSON from the api_key field
2148
+ sa_info = None
2149
+ if api_key and api_key.strip().startswith("{"):
2150
+ try:
2151
+ parsed = json.loads(api_key)
2152
+ if isinstance(parsed, dict) and parsed.get("type") == "service_account":
2153
+ sa_info = parsed
2154
+ except (json.JSONDecodeError, TypeError):
2155
+ pass
2143
2156
 
2144
2157
  # Validate required fields in service-account JSON
2145
2158
  if sa_info:
@@ -2195,17 +2208,27 @@ async def test_gemini(
2195
2208
  "error_message": "No API key or Vertex AI project configured.",
2196
2209
  }
2197
2210
 
2198
- response = await client.aio.models.generate_content(
2199
- model="gemini-2.0-flash-lite",
2200
- contents="Reply with exactly: OK",
2201
- )
2211
+ # Use models.list to verify credentials without depending on a
2212
+ # specific model being available in the configured location.
2213
+ found_any = False
2214
+ models_iter = await client.aio.models.list(config={"page_size": 1})
2215
+ async for _ in models_iter:
2216
+ found_any = True
2217
+ break
2218
+ if not found_any:
2219
+ return {
2220
+ "success": False,
2221
+ "status_code": 0,
2222
+ "error_message": "Authentication succeeded but no models are accessible. "
2223
+ "Check your GCP project permissions or API key.",
2224
+ }
2202
2225
  # Any successful API response proves connectivity, regardless of
2203
2226
  # whether the model returned text (safety filters may suppress it).
2204
2227
  return {"success": True, "status_code": 200, "error_message": None}
2205
2228
  except Exception as exc:
2206
2229
  err_msg = str(exc)
2207
2230
  # Avoid leaking credentials in error messages
2208
- if api_key and api_key in err_msg:
2231
+ if isinstance(api_key, str) and api_key and api_key in err_msg:
2209
2232
  err_msg = err_msg.replace(api_key, "<REDACTED>")
2210
2233
  logger.error(f"Gemini connectivity test failed: {err_msg}")
2211
2234
  return {"success": False, "status_code": 0, "error_message": err_msg}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev308
3
+ Version: 0.0.1.dev309
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