dhisana 0.0.1.dev278__tar.gz → 0.0.1.dev279__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.dev278 → dhisana-0.0.1.dev279}/PKG-INFO +1 -1
  2. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/setup.py +1 -1
  3. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/test_connect.py +197 -0
  4. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana.egg-info/PKG-INFO +1 -1
  5. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/README.md +0 -0
  6. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/pyproject.toml +0 -0
  7. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/setup.cfg +0 -0
  8. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/__init__.py +0 -0
  9. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/cli/__init__.py +0 -0
  10. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/cli/cli.py +0 -0
  11. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/cli/datasets.py +0 -0
  12. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/cli/models.py +0 -0
  13. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/cli/predictions.py +0 -0
  14. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/schemas/__init__.py +0 -0
  15. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/schemas/common.py +0 -0
  16. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/schemas/sales.py +0 -0
  17. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/ui/__init__.py +0 -0
  18. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/ui/components.py +0 -0
  19. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/__init__.py +0 -0
  20. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/add_mapping.py +0 -0
  21. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/agent_tools.py +0 -0
  22. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/apollo_tools.py +0 -0
  23. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/assistant_tool_tag.py +0 -0
  24. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/built_with_api_tools.py +0 -0
  25. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/cache_output_tools.py +0 -0
  26. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/cache_output_tools_local.py +0 -0
  27. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/check_email_validity_tools.py +0 -0
  28. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/check_for_intent_signal.py +0 -0
  29. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/check_linkedin_url_validity.py +0 -0
  30. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/clay_tools.py +0 -0
  31. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/clean_properties.py +0 -0
  32. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/company_utils.py +0 -0
  33. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/compose_salesnav_query.py +0 -0
  34. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/compose_search_query.py +0 -0
  35. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/compose_three_step_workflow.py +0 -0
  36. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/composite_tools.py +0 -0
  37. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/dataframe_tools.py +0 -0
  38. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/domain_parser.py +0 -0
  39. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/email_body_utils.py +0 -0
  40. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/email_parse_helpers.py +0 -0
  41. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/email_provider.py +0 -0
  42. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/enrich_lead_information.py +0 -0
  43. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/extract_email_content_for_llm.py +0 -0
  44. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/fetch_openai_config.py +0 -0
  45. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/field_validators.py +0 -0
  46. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/g2_tools.py +0 -0
  47. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_content.py +0 -0
  48. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_custom_message.py +0 -0
  49. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_email.py +0 -0
  50. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_email_response.py +0 -0
  51. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_flow.py +0 -0
  52. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_leads_salesnav.py +0 -0
  53. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_linkedin_connect_message.py +0 -0
  54. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_linkedin_response_message.py +0 -0
  55. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/generate_structured_output_internal.py +0 -0
  56. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/google_custom_search.py +0 -0
  57. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/google_oauth_tools.py +0 -0
  58. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/google_workspace_tools.py +0 -0
  59. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/hubspot_clearbit.py +0 -0
  60. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/hubspot_crm_tools.py +0 -0
  61. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/instantly_tools.py +0 -0
  62. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/linkedin_crawler.py +0 -0
  63. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/lusha_tools.py +0 -0
  64. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/mailgun_tools.py +0 -0
  65. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/mailreach_tools.py +0 -0
  66. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/microsoft365_tools.py +0 -0
  67. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/openai_assistant_and_file_utils.py +0 -0
  68. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/openai_helpers.py +0 -0
  69. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/openapi_spec_to_tools.py +0 -0
  70. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/openapi_tool/__init__.py +0 -0
  71. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/openapi_tool/api_models.py +0 -0
  72. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/openapi_tool/convert_openai_spec_to_tool.py +0 -0
  73. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/openapi_tool/openapi_tool.py +0 -0
  74. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/parse_linkedin_messages_txt.py +0 -0
  75. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/profile.py +0 -0
  76. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/proxy_curl_tools.py +0 -0
  77. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/proxycurl_search_leads.py +0 -0
  78. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/python_function_to_tools.py +0 -0
  79. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/research_lead.py +0 -0
  80. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/sales_navigator_crawler.py +0 -0
  81. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/salesforce_crm_tools.py +0 -0
  82. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/search_router.py +0 -0
  83. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/search_router_jobs.py +0 -0
  84. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/sendgrid_tools.py +0 -0
  85. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serarch_router_local_business.py +0 -0
  86. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serpapi_additional_tools.py +0 -0
  87. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serpapi_google_jobs.py +0 -0
  88. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serpapi_google_search.py +0 -0
  89. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serpapi_local_business_search.py +0 -0
  90. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serpapi_search_tools.py +0 -0
  91. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serperdev_google_jobs.py +0 -0
  92. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serperdev_local_business.py +0 -0
  93. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/serperdev_search.py +0 -0
  94. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/smtp_email_tools.py +0 -0
  95. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/trasform_json.py +0 -0
  96. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/web_download_parse_tools.py +0 -0
  97. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/workflow_code_model.py +0 -0
  98. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/utils/zoominfo_tools.py +0 -0
  99. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/workflow/__init__.py +0 -0
  100. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/workflow/agent.py +0 -0
  101. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/workflow/flow.py +0 -0
  102. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/workflow/task.py +0 -0
  103. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana/workflow/test.py +0 -0
  104. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana.egg-info/SOURCES.txt +0 -0
  105. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana.egg-info/dependency_links.txt +0 -0
  106. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana.egg-info/entry_points.txt +0 -0
  107. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana.egg-info/requires.txt +0 -0
  108. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/src/dhisana.egg-info/top_level.txt +0 -0
  109. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_agent_tools.py +0 -0
  110. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_apollo_company_search.py +0 -0
  111. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_apollo_lead_search.py +0 -0
  112. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_connectivity.py +0 -0
  113. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_email_body_utils.py +0 -0
  114. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_google_document.py +0 -0
  115. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_hubspot_call_logs.py +0 -0
  116. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_linkedin_serper.py +0 -0
  117. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_mailreach.py +0 -0
  118. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_mcp_connectivity.py +0 -0
  119. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_proxycurl_get_company_search_id.py +0 -0
  120. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/tests/test_proxycurl_job_count.py +0 -0
  121. {dhisana-0.0.1.dev278 → dhisana-0.0.1.dev279}/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.dev278
3
+ Version: 0.0.1.dev279
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-dev278',
5
+ version='0.0.1-dev279',
6
6
  description='A Python SDK for Dhisana AI Platform',
7
7
  author='Admin',
8
8
  author_email='contact@dhisana.ai',
@@ -1869,6 +1869,151 @@ async def test_datagma(api_key: str) -> Dict[str, Any]:
1869
1869
  return {"success": False, "status_code": 0, "error_message": str(e)}
1870
1870
 
1871
1871
 
1872
+ ###############################################################################
1873
+ # MICROSOFT DATAVERSE CONNECTIVITY
1874
+ ###############################################################################
1875
+
1876
+ async def test_dataverse(
1877
+ environment_url: str,
1878
+ tenant_id: str,
1879
+ client_id: str,
1880
+ client_secret: str,
1881
+ api_version: str = "v9.2",
1882
+ ) -> Dict[str, Any]:
1883
+ """
1884
+ Validate Microsoft Dataverse connectivity using client credentials OAuth.
1885
+
1886
+ Uses the OAuth 2.0 client credentials flow to obtain an access token from
1887
+ Microsoft Entra ID, then makes a test API call to fetch sample accounts.
1888
+
1889
+ Required:
1890
+ • environment_url (e.g. https://org12345.crm.dynamics.com)
1891
+ • tenant_id (Microsoft Entra tenant GUID)
1892
+ • client_id (Application/client ID from app registration)
1893
+ • client_secret (Client secret from app registration)
1894
+
1895
+ Optional:
1896
+ • api_version (default: v9.2)
1897
+ """
1898
+ if not environment_url:
1899
+ return {
1900
+ "success": False,
1901
+ "status_code": 0,
1902
+ "error_message": "Missing environment_url for Dataverse.",
1903
+ }
1904
+ if not tenant_id:
1905
+ return {
1906
+ "success": False,
1907
+ "status_code": 0,
1908
+ "error_message": "Missing tenant_id for Dataverse.",
1909
+ }
1910
+ if not client_id:
1911
+ return {
1912
+ "success": False,
1913
+ "status_code": 0,
1914
+ "error_message": "Missing client_id for Dataverse.",
1915
+ }
1916
+ if not client_secret:
1917
+ return {
1918
+ "success": False,
1919
+ "status_code": 0,
1920
+ "error_message": "Missing client_secret for Dataverse.",
1921
+ }
1922
+
1923
+ # Normalize environment URL
1924
+ environment_url = environment_url.rstrip("/")
1925
+
1926
+ # Token endpoint and scope for client credentials flow
1927
+ token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
1928
+ scope = f"{environment_url}/.default"
1929
+
1930
+ try:
1931
+ timeout = aiohttp.ClientTimeout(total=15)
1932
+ async with aiohttp.ClientSession(timeout=timeout) as session:
1933
+ # Step 1: Get access token using client credentials
1934
+ token_data = {
1935
+ "client_id": client_id,
1936
+ "client_secret": client_secret,
1937
+ "grant_type": "client_credentials",
1938
+ "scope": scope,
1939
+ }
1940
+
1941
+ async with session.post(
1942
+ token_url,
1943
+ data=token_data,
1944
+ headers={"Content-Type": "application/x-www-form-urlencoded"},
1945
+ ) as token_response:
1946
+ token_status = token_response.status
1947
+ token_json = await safe_json(token_response)
1948
+
1949
+ if token_status != 200:
1950
+ error_msg = None
1951
+ if isinstance(token_json, dict):
1952
+ error_msg = (
1953
+ token_json.get("error_description")
1954
+ or token_json.get("error")
1955
+ or token_json.get("message")
1956
+ )
1957
+ return {
1958
+ "success": False,
1959
+ "status_code": token_status,
1960
+ "error_message": error_msg or f"Token acquisition failed: {token_status}",
1961
+ }
1962
+
1963
+ access_token = token_json.get("access_token") if token_json else None
1964
+ if not access_token:
1965
+ return {
1966
+ "success": False,
1967
+ "status_code": token_status,
1968
+ "error_message": "No access_token in token response.",
1969
+ }
1970
+
1971
+ # Step 2: Test API access by fetching sample accounts
1972
+ api_url = f"{environment_url}/api/data/{api_version}/accounts"
1973
+ headers = {
1974
+ "Authorization": f"Bearer {access_token}",
1975
+ "Accept": "application/json",
1976
+ "OData-MaxVersion": "4.0",
1977
+ "OData-Version": "4.0",
1978
+ }
1979
+ params = {"$top": "5", "$select": "name,accountid"}
1980
+
1981
+ async with session.get(api_url, headers=headers, params=params) as api_response:
1982
+ api_status = api_response.status
1983
+ api_data = await safe_json(api_response)
1984
+
1985
+ if api_status != 200:
1986
+ error_msg = None
1987
+ if isinstance(api_data, dict):
1988
+ # Dataverse error format
1989
+ error_obj = api_data.get("error", {})
1990
+ if isinstance(error_obj, dict):
1991
+ error_msg = error_obj.get("message")
1992
+ else:
1993
+ error_msg = api_data.get("message") or api_data.get("error")
1994
+ return {
1995
+ "success": False,
1996
+ "status_code": api_status,
1997
+ "error_message": error_msg or f"Dataverse API error: {api_status}",
1998
+ }
1999
+
2000
+ # Success - check if we got valid data
2001
+ if isinstance(api_data, dict) and "value" in api_data:
2002
+ record_count = len(api_data.get("value", []))
2003
+ return {
2004
+ "success": True,
2005
+ "status_code": api_status,
2006
+ "error_message": None,
2007
+ "message": f"Connected successfully. Found {record_count} sample accounts.",
2008
+ }
2009
+
2010
+ return {"success": True, "status_code": api_status, "error_message": None}
2011
+
2012
+ except Exception as exc:
2013
+ logger.error(f"Dataverse connectivity test failed: {exc}")
2014
+ return {"success": False, "status_code": 0, "error_message": str(exc)}
2015
+
2016
+
1872
2017
  ###############################################################################
1873
2018
  # MAIN CONNECTIVITY FUNCTION
1874
2019
  ###############################################################################
@@ -1902,6 +2047,7 @@ async def test_connectivity(tool_config: List[Dict[str, Any]]) -> Dict[str, Dict
1902
2047
  "hunter": test_hunter,
1903
2048
  "findymail": test_findyemail,
1904
2049
  "datagma": test_datagma,
2050
+ "dataverse": test_dataverse,
1905
2051
  "jinaai": test_jinaai,
1906
2052
  "firefliesai": test_firefliesai,
1907
2053
  "firecrawl": test_firecrawl,
@@ -2145,6 +2291,57 @@ async def test_connectivity(tool_config: List[Dict[str, Any]]) -> Dict[str, Dict
2145
2291
  results[tool_name] = await test_twilio(account_sid, auth_token)
2146
2292
  continue
2147
2293
 
2294
+ # ------------------------------------------------------------------ #
2295
+ # Special-case: Dataverse (client credentials OAuth)
2296
+ # ------------------------------------------------------------------ #
2297
+ if tool_name == "dataverse":
2298
+ environment_url = next(
2299
+ (c["value"] for c in config_entries if c["name"] in ("environment_url", "environmentUrl")),
2300
+ None,
2301
+ )
2302
+ tenant_id = next(
2303
+ (c["value"] for c in config_entries if c["name"] in ("tenant_id", "tenantId")),
2304
+ None,
2305
+ )
2306
+ client_id = next(
2307
+ (c["value"] for c in config_entries if c["name"] in ("client_id", "clientId")),
2308
+ None,
2309
+ )
2310
+ client_secret = next(
2311
+ (c["value"] for c in config_entries if c["name"] in ("client_secret", "clientSecret")),
2312
+ None,
2313
+ )
2314
+ api_version = next(
2315
+ (c["value"] for c in config_entries if c["name"] in ("api_version", "apiVersion")),
2316
+ "v9.2",
2317
+ )
2318
+
2319
+ if not all([environment_url, tenant_id, client_id, client_secret]):
2320
+ missing = []
2321
+ if not environment_url:
2322
+ missing.append("environment_url")
2323
+ if not tenant_id:
2324
+ missing.append("tenant_id")
2325
+ if not client_id:
2326
+ missing.append("client_id")
2327
+ if not client_secret:
2328
+ missing.append("client_secret")
2329
+ results[tool_name] = {
2330
+ "success": False,
2331
+ "status_code": 0,
2332
+ "error_message": f"Missing required fields: {', '.join(missing)}",
2333
+ }
2334
+ else:
2335
+ logger.info("Testing connectivity for Dataverse…")
2336
+ results[tool_name] = await test_dataverse(
2337
+ environment_url,
2338
+ tenant_id,
2339
+ client_id,
2340
+ client_secret,
2341
+ api_version,
2342
+ )
2343
+ continue
2344
+
2148
2345
  # ------------------------------------------------------------------ #
2149
2346
  # All other tools – expect an apiKey by default
2150
2347
  # ------------------------------------------------------------------ #
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev278
3
+ Version: 0.0.1.dev279
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