MindsDB 25.4.5.0__py3-none-any.whl → 25.5.4.0__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.

Potentially problematic release.


This version of MindsDB might be problematic. Click here for more details.

Files changed (350) hide show
  1. mindsdb/__about__.py +1 -1
  2. mindsdb/__main__.py +215 -185
  3. mindsdb/api/a2a/__init__.py +0 -0
  4. mindsdb/api/a2a/__main__.py +114 -0
  5. mindsdb/api/a2a/a2a_client.py +439 -0
  6. mindsdb/api/a2a/agent.py +308 -0
  7. mindsdb/api/a2a/common/__init__.py +0 -0
  8. mindsdb/api/a2a/common/client/__init__.py +4 -0
  9. mindsdb/api/a2a/common/client/card_resolver.py +21 -0
  10. mindsdb/api/a2a/common/client/client.py +86 -0
  11. mindsdb/api/a2a/common/server/__init__.py +4 -0
  12. mindsdb/api/a2a/common/server/server.py +164 -0
  13. mindsdb/api/a2a/common/server/task_manager.py +287 -0
  14. mindsdb/api/a2a/common/server/utils.py +28 -0
  15. mindsdb/api/a2a/common/types.py +365 -0
  16. mindsdb/api/a2a/constants.py +9 -0
  17. mindsdb/api/a2a/run_a2a.py +129 -0
  18. mindsdb/api/a2a/task_manager.py +594 -0
  19. mindsdb/api/executor/command_executor.py +49 -28
  20. mindsdb/api/executor/datahub/classes/response.py +5 -2
  21. mindsdb/api/executor/datahub/datanodes/information_schema_datanode.py +8 -0
  22. mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
  23. mindsdb/api/executor/datahub/datanodes/system_tables.py +10 -13
  24. mindsdb/api/executor/planner/query_planner.py +14 -2
  25. mindsdb/api/executor/sql_query/result_set.py +185 -52
  26. mindsdb/api/executor/sql_query/sql_query.py +1 -1
  27. mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +11 -13
  28. mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
  29. mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
  30. mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
  31. mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
  32. mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
  33. mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
  34. mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
  35. mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
  36. mindsdb/api/http/initialize.py +118 -85
  37. mindsdb/api/http/namespaces/analysis.py +17 -4
  38. mindsdb/api/http/namespaces/file.py +8 -2
  39. mindsdb/api/http/namespaces/sql.py +13 -27
  40. mindsdb/api/http/namespaces/tree.py +1 -1
  41. mindsdb/api/http/start.py +7 -2
  42. mindsdb/api/mcp/start.py +42 -5
  43. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
  44. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
  45. mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
  46. mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
  47. mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +86 -123
  48. mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
  49. mindsdb/api/mysql/mysql_proxy/utilities/exceptions.py +0 -4
  50. mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
  51. mindsdb/api/postgres/postgres_proxy/postgres_packets/postgres_message_formats.py +2 -2
  52. mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
  53. mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
  54. mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
  55. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
  56. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
  57. mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
  58. mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
  59. mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
  60. mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
  61. mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
  62. mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
  63. mindsdb/integrations/handlers/bigquery_handler/requirements.txt +1 -0
  64. mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
  65. mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
  66. mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
  67. mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
  68. mindsdb/integrations/handlers/chromadb_handler/requirements.txt +1 -0
  69. mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
  70. mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
  71. mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
  72. mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
  73. mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
  74. mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
  75. mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
  76. mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
  77. mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
  78. mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
  79. mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
  80. mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
  81. mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
  82. mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
  83. mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
  84. mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
  85. mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
  86. mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
  87. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
  88. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
  89. mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
  90. mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
  91. mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
  92. mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
  93. mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
  94. mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
  95. mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
  96. mindsdb/integrations/handlers/email_handler/settings.py +0 -1
  97. mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
  98. mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
  99. mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
  100. mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
  101. mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
  102. mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
  103. mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
  104. mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
  105. mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
  106. mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
  107. mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
  108. mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
  109. mindsdb/integrations/handlers/gmail_handler/requirements.txt +1 -0
  110. mindsdb/integrations/handlers/google_analytics_handler/requirements.txt +2 -1
  111. mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
  112. mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
  113. mindsdb/integrations/handlers/google_books_handler/requirements.txt +1 -1
  114. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
  115. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
  116. mindsdb/integrations/handlers/google_calendar_handler/requirements.txt +1 -0
  117. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
  118. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
  119. mindsdb/integrations/handlers/google_content_shopping_handler/requirements.txt +1 -1
  120. mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
  121. mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
  122. mindsdb/integrations/handlers/google_fit_handler/requirements.txt +2 -0
  123. mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
  124. mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
  125. mindsdb/integrations/handlers/google_search_handler/requirements.txt +1 -1
  126. mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
  127. mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
  128. mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
  129. mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
  130. mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
  131. mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
  132. mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
  133. mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
  134. mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
  135. mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
  136. mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
  137. mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
  138. mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
  139. mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
  140. mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
  141. mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
  142. mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
  143. mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
  144. mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
  145. mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
  146. mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
  147. mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
  148. mindsdb/integrations/handlers/jira_handler/jira_handler.archived.py +75 -0
  149. mindsdb/integrations/handlers/jira_handler/jira_handler.py +113 -38
  150. mindsdb/integrations/handlers/jira_handler/jira_tables.py +229 -0
  151. mindsdb/integrations/handlers/jira_handler/requirements.txt +1 -0
  152. mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
  153. mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
  154. mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
  155. mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
  156. mindsdb/integrations/handlers/lightfm_handler/requirements.txt +1 -0
  157. mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
  158. mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -3
  159. mindsdb/integrations/handlers/lightwood_handler/requirements.txt +4 -4
  160. mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
  161. mindsdb/integrations/handlers/lindorm_handler/requirements.txt +1 -0
  162. mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
  163. mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
  164. mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
  165. mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
  166. mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
  167. mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
  168. mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
  169. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
  170. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
  171. mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
  172. mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
  173. mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
  174. mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
  175. mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
  176. mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
  177. mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
  178. mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
  179. mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
  180. mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
  181. mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
  182. mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
  183. mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
  184. mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
  185. mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
  186. mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
  187. mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
  188. mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
  189. mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
  190. mindsdb/integrations/handlers/ms_one_drive_handler/requirements.txt +2 -0
  191. mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
  192. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
  193. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
  194. mindsdb/integrations/handlers/ms_teams_handler/requirements.txt +3 -1
  195. mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
  196. mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
  197. mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
  198. mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
  199. mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
  200. mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
  201. mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
  202. mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
  203. mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
  204. mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
  205. mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
  206. mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
  207. mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
  208. mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
  209. mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
  210. mindsdb/integrations/handlers/openai_handler/openai_handler.py +5 -4
  211. mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
  212. mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
  213. mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
  214. mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
  215. mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
  216. mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
  217. mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
  218. mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
  219. mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
  220. mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
  221. mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
  222. mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
  223. mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
  224. mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
  225. mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
  226. mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
  227. mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
  228. mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
  229. mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
  230. mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
  231. mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
  232. mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
  233. mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
  234. mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
  235. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
  236. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
  237. mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
  238. mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
  239. mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
  240. mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
  241. mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
  242. mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
  243. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
  244. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
  245. mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
  246. mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
  247. mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
  248. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
  249. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
  250. mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
  251. mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
  252. mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
  253. mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
  254. mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
  255. mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
  256. mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
  257. mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
  258. mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
  259. mindsdb/integrations/handlers/snowflake_handler/requirements.txt +1 -1
  260. mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
  261. mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
  262. mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
  263. mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
  264. mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
  265. mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
  266. mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
  267. mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
  268. mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
  269. mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
  270. mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
  271. mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
  272. mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
  273. mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
  274. mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
  275. mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
  276. mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
  277. mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
  278. mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
  279. mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
  280. mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
  281. mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
  282. mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
  283. mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
  284. mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
  285. mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
  286. mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
  287. mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
  288. mindsdb/integrations/handlers/vertex_handler/requirements.txt +1 -0
  289. mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
  290. mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
  291. mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
  292. mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
  293. mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
  294. mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
  295. mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
  296. mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
  297. mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
  298. mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
  299. mindsdb/integrations/handlers/youtube_handler/requirements.txt +1 -0
  300. mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
  301. mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
  302. mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
  303. mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
  304. mindsdb/integrations/libs/response.py +67 -52
  305. mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
  306. mindsdb/integrations/utilities/files/file_reader.py +5 -2
  307. mindsdb/integrations/utilities/handler_utils.py +15 -3
  308. mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
  309. mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
  310. mindsdb/integrations/utilities/utils.py +3 -3
  311. mindsdb/interfaces/agents/agents_controller.py +164 -1
  312. mindsdb/interfaces/agents/constants.py +29 -2
  313. mindsdb/interfaces/agents/langchain_agent.py +18 -8
  314. mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
  315. mindsdb/interfaces/database/projects.py +1 -7
  316. mindsdb/interfaces/functions/controller.py +11 -14
  317. mindsdb/interfaces/functions/to_markdown.py +9 -124
  318. mindsdb/interfaces/knowledge_base/controller.py +47 -19
  319. mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +41 -15
  320. mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
  321. mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
  322. mindsdb/interfaces/knowledge_base/utils.py +10 -15
  323. mindsdb/interfaces/model/model_controller.py +0 -2
  324. mindsdb/interfaces/query_context/context_controller.py +66 -10
  325. mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
  326. mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
  327. mindsdb/interfaces/skills/skill_tool.py +202 -57
  328. mindsdb/interfaces/skills/sql_agent.py +238 -28
  329. mindsdb/interfaces/storage/fs.py +1 -0
  330. mindsdb/interfaces/variables/__init__.py +0 -0
  331. mindsdb/interfaces/variables/variables_controller.py +97 -0
  332. mindsdb/migrations/env.py +5 -7
  333. mindsdb/migrations/migrate.py +47 -9
  334. mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
  335. mindsdb/utilities/config.py +333 -220
  336. mindsdb/utilities/context.py +1 -1
  337. mindsdb/utilities/functions.py +0 -36
  338. mindsdb/utilities/langfuse.py +19 -10
  339. mindsdb/utilities/otel/__init__.py +9 -193
  340. mindsdb/utilities/otel/metric_handlers/__init__.py +5 -1
  341. mindsdb/utilities/otel/prepare.py +198 -0
  342. mindsdb/utilities/sql.py +83 -0
  343. mindsdb/utilities/starters.py +13 -0
  344. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +351 -338
  345. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +348 -322
  346. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
  347. mindsdb/api/mysql/mysql_proxy/classes/sql_statement_parser.py +0 -151
  348. mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
  349. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
  350. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
@@ -28,12 +28,12 @@ class NewsApiHandlerTest(unittest.TestCase):
28
28
  def test_3_select(self):
29
29
  # table = self.handler.get_table("article")
30
30
  with self.assertRaises(NewsAPIException):
31
- res = self.handler.native_query("SELECT * FROM article")
31
+ self.handler.native_query("SELECT * FROM article")
32
32
 
33
33
  def test_4_select(self):
34
34
  # table = self.handler.get_table("article")
35
35
  with self.assertRaises(NewsAPIException):
36
- res = self.handler.native_query(
36
+ self.handler.native_query(
37
37
  'SELECT * FROM article WHERE query="google" AND sources="google.com"'
38
38
  )
39
39
 
@@ -46,7 +46,7 @@ class NewsApiHandlerTest(unittest.TestCase):
46
46
 
47
47
  def test_6_select(self):
48
48
  # table = self.handler.get_table("article")
49
- res = self.handler.native_query(
49
+ self.handler.native_query(
50
50
  'SELECT * FROM article WHERE query="google" AND publishedAt >= "2023-03-23" AND publishedAt <= "2023-04-23"'
51
51
  )
52
52
 
@@ -74,7 +74,7 @@ class NewsApiHandlerTest(unittest.TestCase):
74
74
  def test_10_select(self):
75
75
  # table = self.handler.get_table("article")
76
76
  with self.assertRaises(NotImplementedError):
77
- res = self.handler.native_query(
77
+ self.handler.native_query(
78
78
  'SELECT * FROM article WHERE query="google" ORDER BY query'
79
79
  )
80
80
 
@@ -44,8 +44,8 @@ connection_args = OrderedDict(
44
44
  driver_args={
45
45
  'type': ARG_TYPE.STR,
46
46
  'description': """
47
- The extra arguments which can be specified to the driver.
48
- Specify this in the format: "arg1=value1,arg2=value2.
47
+ The extra arguments which can be specified to the driver.
48
+ Specify this in the format: "arg1=value1,arg2=value2.
49
49
  More information on the supported paramters can be found at: https://doc.nuodb.com/nuodb/latest/deployment-models/physical-or-vmware-environments-with-nuodb-admin/reference-information/connection-properties/'
50
50
  """
51
51
  }
@@ -13,11 +13,10 @@ import jaydebeapi as jdbcconnector
13
13
 
14
14
  logger = log.getLogger(__name__)
15
15
 
16
- class NuoHandler(DatabaseHandler):
17
-
18
16
 
19
- name= 'nuo_jdbc'
17
+ class NuoHandler(DatabaseHandler):
20
18
 
19
+ name = 'nuo_jdbc'
21
20
 
22
21
  def __init__(self, name: str, connection_data: Optional[dict], **kwargs):
23
22
  """ Initialize the handler
@@ -27,7 +26,7 @@ class NuoHandler(DatabaseHandler):
27
26
  **kwargs: arbitrary keyword arguments.
28
27
  """
29
28
  super().__init__(name)
30
-
29
+
31
30
  self.kwargs = kwargs
32
31
  self.parser = parse_sql
33
32
  self.database = connection_data['database']
@@ -42,7 +41,7 @@ class NuoHandler(DatabaseHandler):
42
41
  self.schema = None
43
42
 
44
43
  self.jdbc_url = self.construct_jdbc_url()
45
-
44
+
46
45
  def connect(self):
47
46
  """ Set up any connections required by the handler
48
47
  Should return output of check_connection() method after attempting
@@ -56,10 +55,10 @@ class NuoHandler(DatabaseHandler):
56
55
  jdbc_class = "com.nuodb.jdbc.Driver"
57
56
  jar_location = self.connection_config.get('jar_location')
58
57
 
59
- try:
60
- if(jar_location):
58
+ try:
59
+ if (jar_location):
61
60
  self.connection = jdbcconnector.connect(jclassname=jdbc_class, url=self.jdbc_url, jars=jar_location)
62
- else:
61
+ else:
63
62
  self.connection = jdbcconnector.connect(jclassname=jdbc_class, url=self.jdbc_url)
64
63
  except Exception as e:
65
64
  logger.error(f"Error while connecting to {self.database}, {e}")
@@ -68,40 +67,38 @@ class NuoHandler(DatabaseHandler):
68
67
 
69
68
  def construct_jdbc_url(self):
70
69
  """ Constructs the JDBC url based on the paramters provided to the handler class.\
71
- Returns:
72
- The JDBC connection url string.
70
+ Returns:
71
+ The JDBC connection url string.
73
72
  """
74
73
 
75
74
  jdbc_url = "jdbc:com.nuodb://" + self.host
76
75
 
77
- #port is an optional paramter, if found then append
76
+ # port is an optional paramter, if found then append
78
77
  port = self.connection_config.get('port')
79
- if port:
78
+ if port:
80
79
  jdbc_url = jdbc_url + ":" + str(port)
81
-
82
- jdbc_url = jdbc_url + "/" + self.database + "?user=" + self.user + "&password=" + self.password
83
80
 
84
- #check if a schema is provided in the connection args, if provided use the schema to establish connection
81
+ jdbc_url = jdbc_url + "/" + self.database + "?user=" + self.user + "&password=" + self.password
82
+
83
+ # check if a schema is provided in the connection args, if provided use the schema to establish connection
85
84
  schema = self.connection_config.get('schema')
86
- if schema:
85
+ if schema:
87
86
  self.schema = schema
88
87
  jdbc_url = jdbc_url + "&schema=" + schema
89
88
 
90
- #sets direct paramter only if the paramters is specified to be true
91
- if(str(self.is_direct).lower() == 'true'):
89
+ # sets direct paramter only if the paramters is specified to be true
90
+ if (str(self.is_direct).lower() == 'true'):
92
91
  jdbc_url = jdbc_url + "&direct=true"
93
92
 
94
-
95
93
  driver_args = self.connection_config.get('driver_args')
96
94
 
97
- #if driver args are present then construct them in the form: &query=one#qquerytwo=true
98
- #finally append these to the url
99
- if(driver_args):
95
+ # if driver args are present then construct them in the form: &query=one#qquerytwo=true
96
+ # finally append these to the url
97
+ if (driver_args):
100
98
  driver_arg_string = '&'.join(driver_args.split(","))
101
- jdbc_url = jdbc_url + "&" + driver_arg_string
99
+ jdbc_url = jdbc_url + "&" + driver_arg_string
102
100
 
103
- return jdbc_url
104
-
101
+ return jdbc_url
105
102
 
106
103
  def disconnect(self):
107
104
  """ Close any existing connections
@@ -111,12 +108,11 @@ class NuoHandler(DatabaseHandler):
111
108
  return
112
109
  try:
113
110
  self.connection.close()
114
- self.is_connected=False
111
+ self.is_connected = False
115
112
  except Exception as e:
116
113
  logger.error(f"Error while disconnecting to {self.database}, {e}")
117
114
 
118
- return
119
-
115
+ return
120
116
 
121
117
  def check_connection(self) -> StatusResponse:
122
118
  """ Check connection to the handler
@@ -140,7 +136,6 @@ class NuoHandler(DatabaseHandler):
140
136
 
141
137
  return responseCode
142
138
 
143
-
144
139
  def native_query(self, query: str) -> StatusResponse:
145
140
  """Receive raw query and act upon it somehow.
146
141
  Args:
@@ -155,7 +150,7 @@ class NuoHandler(DatabaseHandler):
155
150
  try:
156
151
  cur.execute(query)
157
152
  if cur.description:
158
- result = cur.fetchall()
153
+ result = cur.fetchall()
159
154
  response = Response(
160
155
  RESPONSE_TYPE.TABLE,
161
156
  data_frame=pd.DataFrame(
@@ -179,7 +174,6 @@ class NuoHandler(DatabaseHandler):
179
174
 
180
175
  return response
181
176
 
182
-
183
177
  def query(self, query: ASTNode) -> StatusResponse:
184
178
  """Render and execute a SQL query.
185
179
 
@@ -196,24 +190,22 @@ class NuoHandler(DatabaseHandler):
196
190
 
197
191
  return self.native_query(query_str)
198
192
 
199
-
200
193
  def get_tables(self) -> StatusResponse:
201
194
  """Get a list of all the tables in the database.
202
195
 
203
196
  Returns:
204
197
  Response: Names of the tables in the database.
205
198
  """
206
- if self.schema:
199
+ if self.schema:
207
200
  query = f''' SELECT TABLENAME FROM SYSTEM.TABLES WHERE SCHEMA = '{self.schema}' '''
208
- else:
201
+ else:
209
202
  query = ''' SELECT TABLENAME FROM SYSTEM.TABLES WHERE SCHEMA != 'SYSTEM' '''
210
-
203
+
211
204
  result = self.native_query(query)
212
205
  df = result.data_frame
213
206
  result.data_frame = df.rename(columns={df.columns[0]: 'table_name'})
214
207
  return result
215
208
 
216
-
217
209
  def get_columns(self, table_name: str) -> StatusResponse:
218
210
  """Get details about a table.
219
211
 
@@ -2,6 +2,7 @@ import unittest
2
2
  from mindsdb.integrations.handlers.nuo_jdbc_handler.nuo_jdbc_handler import NuoHandler
3
3
  from mindsdb.api.executor.data_types.response_type import RESPONSE_TYPE
4
4
 
5
+
5
6
  class NuoHandlerTest(unittest.TestCase):
6
7
  @classmethod
7
8
  def setUpClass(cls):
@@ -20,7 +21,7 @@ class NuoHandlerTest(unittest.TestCase):
20
21
 
21
22
  def test_0_connect(self):
22
23
  self.handler.connect()
23
-
24
+
24
25
  def test_1_check_connection(self):
25
26
  self.handler.check_connection()
26
27
 
@@ -35,7 +36,7 @@ class NuoHandlerTest(unittest.TestCase):
35
36
  def test_4_select(self):
36
37
  res = self.handler.query('SELECT * FROM HOCKEY')
37
38
  assert res.type is RESPONSE_TYPE.TABLE
38
-
39
+
39
40
  def test_5_get_tables(self):
40
41
  res = self.handler.get_tables()
41
42
  assert res.type is RESPONSE_TYPE.TABLE
@@ -43,8 +44,7 @@ class NuoHandlerTest(unittest.TestCase):
43
44
  def test_6_get_columns(self):
44
45
  res = self.handler.get_columns("HOCKEY")
45
46
  assert res.type is RESPONSE_TYPE.TABLE
46
-
47
47
 
48
-
48
+
49
49
  if __name__ == '__main__':
50
- unittest.main()
50
+ unittest.main()
@@ -15,7 +15,6 @@ class OceanBaseHandler(MysqlHandler):
15
15
  super().__init__(name, **kwargs)
16
16
 
17
17
 
18
-
19
18
  connection_args = OrderedDict(
20
19
  user={
21
20
  'type': ARG_TYPE.STR,
@@ -2,6 +2,7 @@ import unittest
2
2
  from mindsdb.integrations.handlers.oceanbase_handler.oceanbase_handler import OceanBaseHandler
3
3
  from mindsdb.integrations.libs.response import RESPONSE_TYPE
4
4
 
5
+
5
6
  class OceanBaseHandlerTest(unittest.TestCase):
6
7
  @classmethod
7
8
  def setUpClass(cls):
@@ -21,36 +22,33 @@ class OceanBaseHandlerTest(unittest.TestCase):
21
22
 
22
23
  def test_1_connect(self):
23
24
  assert self.handler.connect()
24
-
25
+
25
26
  def test_2_create_table(self):
26
27
  query = "CREATE Table IF NOT EXISTS Lover(name varchar(101));"
27
28
  result = self.handler.query(query)
28
- assert result.type is not RESPONSE_TYPE.ERROR
29
+ assert result.type is not RESPONSE_TYPE.ERROR
29
30
 
30
31
  def test_3_insert(self):
31
32
  query = "INSERT INTO LOVER VALUES('Shiv Shakti');"
32
33
  result = self.handler.query(query)
33
- assert result.type is not RESPONSE_TYPE.ERROR
34
+ assert result.type is not RESPONSE_TYPE.ERROR
34
35
 
35
36
  def test_4_native_query_select(self):
36
37
  query = "SELECT * FROM LOVER;"
37
38
  result = self.handler.query(query)
38
- assert result.type is RESPONSE_TYPE.TABLE
39
+ assert result.type is RESPONSE_TYPE.TABLE
39
40
 
40
41
  def test_5_get_tables(self):
41
42
  tables = self.handler.get_tables()
42
- assert tables.type is RESPONSE_TYPE.TABLE
43
+ assert tables.type is RESPONSE_TYPE.TABLE
43
44
 
44
45
  def test_6_get_columns(self):
45
46
  columns = self.handler.get_columns('LOVER')
46
-
47
+
47
48
  query = "DROP Table IF EXISTS Lover;"
48
- result = self.handler.query(query)
49
+ self.handler.query(query)
49
50
  assert columns.type is not RESPONSE_TYPE.ERROR
50
51
 
51
52
 
52
53
  if __name__ == '__main__':
53
54
  unittest.main()
54
-
55
-
56
-
@@ -63,7 +63,7 @@ class OllamaHandler(BaseMLEngine):
63
63
  responses = _model_check()
64
64
  if 200 not in responses.values():
65
65
  raise Exception(f"Ollama model `{args['model_name']}` is not working correctly. Please try pulling this model manually, check it works correctly and try again.") # noqa
66
-
66
+
67
67
  supported_modes = {k: True if v == 200 else False for k, v in responses.items()}
68
68
 
69
69
  # check if a mode has been provided and if it is valid
@@ -71,7 +71,7 @@ class OllamaHandler(BaseMLEngine):
71
71
  if 'mode' in args:
72
72
  if args['mode'] not in runnable_modes:
73
73
  raise Exception(f"Mode `{args['mode']}` is not supported by the model `{args['model_name']}`.")
74
-
74
+
75
75
  # if a mode has not been provided, check if the model supports only one mode
76
76
  # if it does, set it as the default mode
77
77
  # if it supports multiple modes, set the default mode to 'generate'
@@ -168,4 +168,4 @@ class OllamaHandler(BaseMLEngine):
168
168
  'modelfile',
169
169
  'parameters',
170
170
  'ollama_base_template',
171
- ])
171
+ ])
@@ -9,6 +9,7 @@ import subprocess
9
9
  import concurrent.futures
10
10
  from typing import Text, Tuple, Dict, List, Optional, Any
11
11
  import openai
12
+ from openai.types.fine_tuning import FineTuningJob
12
13
  from openai import OpenAI, AzureOpenAI, NotFoundError, AuthenticationError
13
14
  import numpy as np
14
15
  import pandas as pd
@@ -1116,7 +1117,7 @@ class OpenAIHandler(BaseMLEngine):
1116
1117
  }
1117
1118
  return {**ft_params, **extra_params}
1118
1119
 
1119
- def _ft_call(self, ft_params: Dict, client: OpenAI, hour_budget: int) -> Tuple[openai.types.fine_tuning.FineTuningJob, Text]:
1120
+ def _ft_call(self, ft_params: Dict, client: OpenAI, hour_budget: int) -> Tuple[FineTuningJob, Text]:
1120
1121
  """
1121
1122
  Submit a fine-tuning job via the OpenAI API.
1122
1123
  This method handles requests to both the legacy and new endpoints.
@@ -1134,7 +1135,7 @@ class OpenAIHandler(BaseMLEngine):
1134
1135
  PendingFT: If the fine-tuning process is still pending.
1135
1136
 
1136
1137
  Returns:
1137
- Tuple[openai.types.fine_tuning.FineTuningJob, Text]: Fine-tuning stats and result file ID.
1138
+ Tuple[FineTuningJob, Text]: Fine-tuning stats and result file ID.
1138
1139
  """
1139
1140
  ft_result = client.fine_tuning.jobs.create(
1140
1141
  **{k: v for k, v in ft_params.items() if v is not None}
@@ -1143,7 +1144,7 @@ class OpenAIHandler(BaseMLEngine):
1143
1144
  @retry_with_exponential_backoff(
1144
1145
  hour_budget=hour_budget,
1145
1146
  )
1146
- def _check_ft_status(job_id: Text) -> openai.types.fine_tuning.FineTuningJob:
1147
+ def _check_ft_status(job_id: Text) -> FineTuningJob:
1147
1148
  """
1148
1149
  Check the status of a fine-tuning job via the OpenAI API.
1149
1150
 
@@ -1154,7 +1155,7 @@ class OpenAIHandler(BaseMLEngine):
1154
1155
  PendingFT: If the fine-tuning process is still pending.
1155
1156
 
1156
1157
  Returns:
1157
- openai.types.fine_tuning.FineTuningJob: Fine-tuning stats.
1158
+ FineTuningJob: Fine-tuning stats.
1158
1159
  """
1159
1160
  ft_retrieved = client.fine_tuning.jobs.retrieve(fine_tuning_job_id=job_id)
1160
1161
  if ft_retrieved.status in ('succeeded', 'failed', 'cancelled'):
@@ -1,5 +1,4 @@
1
1
  import unittest
2
- import pandas as pd
3
2
  from mindsdb.integrations.handlers.opengauss_handler.opengauss_handler import OpenGaussHandler
4
3
 
5
4
 
@@ -42,4 +41,4 @@ class OpenGaussHandlerTest(unittest.TestCase):
42
41
 
43
42
  def test_7_select_query(self):
44
43
  query = "SELECT * FROM dt_test WHERE 'id'='a'"
45
- result = self.handler.native_query(query)
44
+ self.handler.native_query(query)
@@ -4,7 +4,7 @@ from .__about__ import __version__ as version, __description__ as description
4
4
 
5
5
  try:
6
6
  from .openstreetmap_handler import OpenStreetMapHandler as Handler
7
-
7
+
8
8
  import_error = None
9
9
  except Exception as e:
10
10
  Handler = None
@@ -16,12 +16,12 @@ type = HANDLER_TYPE.DATA
16
16
  icon_path = "icon.svg"
17
17
 
18
18
  __all__ = [
19
- "Handler",
20
- "version",
21
- "name",
22
- "type",
23
- "title",
19
+ "Handler",
20
+ "version",
21
+ "name",
22
+ "type",
23
+ "title",
24
24
  "description",
25
- "import_error",
25
+ "import_error",
26
26
  "icon_path",
27
27
  ]
@@ -59,6 +59,12 @@ connection_args = OrderedDict(
59
59
  "required": False,
60
60
  "label": "Auth Mode",
61
61
  },
62
+ thick_mode={
63
+ "type": ARG_TYPE.BOOL,
64
+ "description": "Set to `true` to use thick mode for the connection. Thin mode is used by default.",
65
+ "required": False,
66
+ "label": "Connection mode",
67
+ }
62
68
  )
63
69
 
64
70
  connection_args_example = OrderedDict(
@@ -1,8 +1,8 @@
1
- from typing import Text, Dict, Optional
1
+ from typing import Text, Dict, Optional, Any
2
2
 
3
3
  import oracledb
4
4
  import pandas as pd
5
- from oracledb import connect, Connection, DatabaseError
5
+ from oracledb import connect, Connection, DatabaseError, Cursor
6
6
  from mindsdb_sql_parser.ast.base import ASTNode
7
7
 
8
8
  from mindsdb.integrations.libs.base import DatabaseHandler
@@ -54,10 +54,80 @@ def _map_type(internal_type_name: str) -> MYSQL_DATA_TYPE:
54
54
  if internal_type_name in db_types_list:
55
55
  return mysql_data_type
56
56
 
57
- logger.warning(f"Oracle handler type mapping: unknown type: {internal_type_name}, use VARCHAR as fallback.")
57
+ logger.debug(f"Oracle handler type mapping: unknown type: {internal_type_name}, use VARCHAR as fallback.")
58
58
  return MYSQL_DATA_TYPE.VARCHAR
59
59
 
60
60
 
61
+ def _make_table_response(result: list[tuple[Any]], cursor: Cursor) -> Response:
62
+ """Build response from result and cursor.
63
+
64
+ Args:
65
+ result (list[tuple[Any]]): result of the query.
66
+ cursor (oracledb.Cursor): cursor object.
67
+
68
+ Returns:
69
+ Response: response object.
70
+ """
71
+ description: list[tuple[Any]] = cursor.description
72
+ mysql_types: list[MYSQL_DATA_TYPE] = []
73
+ for column in description:
74
+ db_type = column[1]
75
+ precision = column[4]
76
+ scale = column[5]
77
+ if db_type is oracledb.DB_TYPE_NUMBER:
78
+ if scale != 0:
79
+ mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
80
+ else:
81
+ # python max int is 19 digits, oracle can return more
82
+ if precision > 18:
83
+ mysql_types.append(MYSQL_DATA_TYPE.DECIMAL)
84
+ else:
85
+ mysql_types.append(MYSQL_DATA_TYPE.INT)
86
+ elif db_type is oracledb.DB_TYPE_BINARY_FLOAT:
87
+ mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
88
+ elif db_type is oracledb.DB_TYPE_BINARY_DOUBLE:
89
+ mysql_types.append(MYSQL_DATA_TYPE.FLOAT)
90
+ elif db_type is oracledb.DB_TYPE_BINARY_INTEGER:
91
+ mysql_types.append(MYSQL_DATA_TYPE.INT)
92
+ elif db_type is oracledb.DB_TYPE_BOOLEAN:
93
+ mysql_types.append(MYSQL_DATA_TYPE.BOOLEAN)
94
+ elif db_type in (
95
+ oracledb.DB_TYPE_CHAR, oracledb.DB_TYPE_NCHAR, oracledb.DB_TYPE_LONG,
96
+ oracledb.DB_TYPE_NVARCHAR, oracledb.DB_TYPE_VARCHAR, oracledb.DB_TYPE_LONG_NVARCHAR,
97
+ ):
98
+ mysql_types.append(MYSQL_DATA_TYPE.TEXT)
99
+ elif db_type in (oracledb.DB_TYPE_RAW, oracledb.DB_TYPE_LONG_RAW):
100
+ mysql_types.append(MYSQL_DATA_TYPE.BINARY)
101
+ elif db_type is oracledb.DB_TYPE_DATE:
102
+ mysql_types.append(MYSQL_DATA_TYPE.DATE)
103
+ elif db_type is oracledb.DB_TYPE_TIMESTAMP:
104
+ mysql_types.append(MYSQL_DATA_TYPE.TIMESTAMP)
105
+ else:
106
+ # fallback
107
+ mysql_types.append(MYSQL_DATA_TYPE.TEXT)
108
+
109
+ # region cast int and bool to nullable types
110
+ serieses = []
111
+ for i, mysql_type in enumerate(mysql_types):
112
+ expected_dtype = None
113
+ if mysql_type in (
114
+ MYSQL_DATA_TYPE.SMALLINT, MYSQL_DATA_TYPE.INT, MYSQL_DATA_TYPE.MEDIUMINT,
115
+ MYSQL_DATA_TYPE.BIGINT, MYSQL_DATA_TYPE.TINYINT
116
+ ):
117
+ expected_dtype = 'Int64'
118
+ elif mysql_type in (MYSQL_DATA_TYPE.BOOL, MYSQL_DATA_TYPE.BOOLEAN):
119
+ expected_dtype = 'boolean'
120
+ serieses.append(pd.Series([row[i] for row in result], dtype=expected_dtype, name=description[i][0]))
121
+ df = pd.concat(serieses, axis=1, copy=False)
122
+ # endregion
123
+
124
+ return Response(
125
+ RESPONSE_TYPE.TABLE,
126
+ data_frame=df,
127
+ mysql_types=mysql_types
128
+ )
129
+
130
+
61
131
  class OracleHandler(DatabaseHandler):
62
132
  """
63
133
  This handler handles connection and execution of SQL queries on Oracle.
@@ -98,6 +168,9 @@ class OracleHandler(DatabaseHandler):
98
168
  if not all(key in self.connection_data for key in ['user', 'password']):
99
169
  raise ValueError('Required parameters (user, password) must be provided.')
100
170
 
171
+ if self.connection_data.get('thick_mode', False):
172
+ oracledb.init_oracle_client()
173
+
101
174
  config = {
102
175
  'user': self.connection_data['user'],
103
176
  'password': self.connection_data['password'],
@@ -209,14 +282,7 @@ class OracleHandler(DatabaseHandler):
209
282
  response = Response(RESPONSE_TYPE.OK, affected_rows=cur.rowcount)
210
283
  else:
211
284
  result = cur.fetchall()
212
- response = Response(
213
- RESPONSE_TYPE.TABLE,
214
- data_frame=pd.DataFrame(
215
- result,
216
- columns=[row[0] for row in cur.description],
217
- ),
218
- )
219
-
285
+ response = _make_table_response(result, cur)
220
286
  connection.commit()
221
287
  except DatabaseError as database_error:
222
288
  logger.error(f"Error running query: {query} on Oracle, {database_error}!")
@@ -2,6 +2,7 @@ import unittest
2
2
  from mindsdb.integrations.handlers.orioledb_handler.orioledb_handler import OrioleDBHandler
3
3
  from mindsdb.integrations.libs.response import RESPONSE_TYPE
4
4
 
5
+
5
6
  class OrioleDBHandlerTest(unittest.TestCase):
6
7
  @classmethod
7
8
  def setUpClass(cls):
@@ -21,36 +22,33 @@ class OrioleDBHandlerTest(unittest.TestCase):
21
22
 
22
23
  def test_1_connect(self):
23
24
  assert self.handler.connect()
24
-
25
+
25
26
  def test_2_create_table(self):
26
27
  query = "CREATE Table IF NOT EXISTS Lover(name varchar(101));"
27
28
  result = self.handler.query(query)
28
- assert result.type is not RESPONSE_TYPE.ERROR
29
+ assert result.type is not RESPONSE_TYPE.ERROR
29
30
 
30
31
  def test_3_insert(self):
31
32
  query = "INSERT INTO LOVER VALUES('Shiv Shakti');"
32
33
  result = self.handler.query(query)
33
- assert result.type is not RESPONSE_TYPE.ERROR
34
+ assert result.type is not RESPONSE_TYPE.ERROR
34
35
 
35
36
  def test_4_native_query_select(self):
36
37
  query = "SELECT * FROM LOVER;"
37
38
  result = self.handler.query(query)
38
- assert result.type is RESPONSE_TYPE.TABLE
39
+ assert result.type is RESPONSE_TYPE.TABLE
39
40
 
40
41
  def test_5_get_tables(self):
41
42
  tables = self.handler.get_tables()
42
- assert tables.type is RESPONSE_TYPE.TABLE
43
+ assert tables.type is RESPONSE_TYPE.TABLE
43
44
 
44
45
  def test_6_get_columns(self):
45
46
  columns = self.handler.get_columns('LOVER')
46
-
47
+
47
48
  query = "DROP Table IF EXISTS Lover;"
48
- result = self.handler.query(query)
49
+ self.handler.query(query)
49
50
  assert columns.type is not RESPONSE_TYPE.ERROR
50
51
 
51
52
 
52
53
  if __name__ == '__main__':
53
54
  unittest.main()
54
-
55
-
56
-
@@ -6,4 +6,4 @@ __author__ = 'MindsDB Inc'
6
6
  __github__ = 'https://github.com/mindsdb/mindsdb'
7
7
  __pypi__ = 'https://pypi.org/project/mindsdb/'
8
8
  __license__ = 'MIT'
9
- __copyright__ = 'Copyright 2022- mindsdb'
9
+ __copyright__ = 'Copyright 2022- mindsdb'
@@ -16,4 +16,4 @@ permanent = False
16
16
 
17
17
  __all__ = [
18
18
  'Handler', 'version', 'name', 'type', 'title', 'description', 'import_error', 'icon_path'
19
- ]
19
+ ]
@@ -78,8 +78,6 @@ class PalmHandler(BaseMLEngine):
78
78
  else:
79
79
  args = args["using"]
80
80
 
81
- args_model = PalmHandlerArgs(**args)
82
-
83
81
  if (
84
82
  len(set(args.keys()) & {"question_column", "prompt_template", "prompt"})
85
83
  == 0
@@ -331,7 +329,7 @@ class PalmHandler(BaseMLEngine):
331
329
  def _submit_embedding_completion(kwargs, prompts, api_args):
332
330
  def _tidy(comp):
333
331
  tidy_comps = []
334
- if not "embedding" in comp:
332
+ if "embedding" not in comp:
335
333
  return [f"No completion found, err {comp}"]
336
334
  for c in comp["embedding"]:
337
335
  tidy_comps.append([c])
@@ -9,7 +9,7 @@ from mindsdb.integrations.handlers.paypal_handler.paypal_tables import (
9
9
  )
10
10
  from mindsdb.integrations.libs.api_handler import APIHandler
11
11
  from mindsdb.integrations.libs.response import (
12
- HandlerStatusResponse as StatusResponse,
12
+ HandlerStatusResponse as StatusResponse,
13
13
  )
14
14
 
15
15
  from mindsdb.utilities import log
@@ -95,7 +95,7 @@ class PayPalHandler(APIHandler):
95
95
  connection.get_access_token()
96
96
  response.success = True
97
97
  except Exception as e:
98
- logger.error(f'Error connecting to PayPal!')
98
+ logger.error('Error connecting to PayPal!')
99
99
  response.error_message = str(e)
100
100
 
101
101
  self.is_connected = response.success