MindsDB 25.5.3.0__py3-none-any.whl → 25.5.4.1__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 (313) hide show
  1. mindsdb/__about__.py +8 -8
  2. mindsdb/__main__.py +127 -79
  3. mindsdb/api/a2a/__init__.py +0 -0
  4. mindsdb/api/a2a/__main__.py +144 -0
  5. mindsdb/api/a2a/agent.py +308 -0
  6. mindsdb/api/a2a/common/__init__.py +0 -0
  7. mindsdb/api/a2a/common/server/__init__.py +4 -0
  8. mindsdb/api/a2a/common/server/server.py +164 -0
  9. mindsdb/api/a2a/common/server/task_manager.py +287 -0
  10. mindsdb/api/a2a/common/server/utils.py +28 -0
  11. mindsdb/api/a2a/common/types.py +365 -0
  12. mindsdb/api/a2a/constants.py +9 -0
  13. mindsdb/api/a2a/run_a2a.py +86 -0
  14. mindsdb/api/a2a/task_manager.py +560 -0
  15. mindsdb/api/executor/command_executor.py +185 -309
  16. mindsdb/api/executor/datahub/classes/response.py +5 -2
  17. mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
  18. mindsdb/api/executor/planner/query_planner.py +10 -1
  19. mindsdb/api/executor/sql_query/result_set.py +185 -52
  20. mindsdb/api/executor/sql_query/sql_query.py +1 -1
  21. mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
  22. mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
  23. mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
  24. mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
  25. mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
  26. mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
  27. mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
  28. mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
  29. mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
  30. mindsdb/api/http/initialize.py +99 -83
  31. mindsdb/api/http/namespaces/analysis.py +3 -3
  32. mindsdb/api/http/namespaces/config.py +61 -86
  33. mindsdb/api/http/namespaces/file.py +8 -2
  34. mindsdb/api/http/namespaces/sql.py +13 -27
  35. mindsdb/api/mcp/start.py +42 -5
  36. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
  37. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
  38. mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
  39. mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
  40. mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
  41. mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
  42. mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
  43. mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
  44. mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
  45. mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
  46. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
  47. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
  48. mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
  49. mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
  50. mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
  51. mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
  52. mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
  53. mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
  54. mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
  55. mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
  56. mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
  57. mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
  58. mindsdb/integrations/handlers/byom_handler/requirements.txt +1 -2
  59. mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
  60. mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
  61. mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
  62. mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
  63. mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
  64. mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
  65. mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
  66. mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
  67. mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
  68. mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
  69. mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
  70. mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
  71. mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
  72. mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
  73. mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
  74. mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
  75. mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
  76. mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
  77. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
  78. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
  79. mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
  80. mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
  81. mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
  82. mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
  83. mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
  84. mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
  85. mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
  86. mindsdb/integrations/handlers/email_handler/settings.py +0 -1
  87. mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
  88. mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
  89. mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
  90. mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
  91. mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
  92. mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
  93. mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
  94. mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
  95. mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
  96. mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
  97. mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
  98. mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
  99. mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
  100. mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
  101. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
  102. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
  103. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
  104. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
  105. mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
  106. mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
  107. mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
  108. mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
  109. mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
  110. mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
  111. mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
  112. mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
  113. mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
  114. mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
  115. mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
  116. mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
  117. mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
  118. mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
  119. mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
  120. mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
  121. mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
  122. mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
  123. mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
  124. mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
  125. mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
  126. mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
  127. mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
  128. mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
  129. mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
  130. mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
  131. mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
  132. mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
  133. mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
  134. mindsdb/integrations/handlers/lancedb_handler/requirements.txt +0 -1
  135. mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
  136. mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
  137. mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
  138. mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
  139. mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
  140. mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
  141. mindsdb/integrations/handlers/litellm_handler/litellm_handler.py +37 -20
  142. mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
  143. mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
  144. mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
  145. mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
  146. mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
  147. mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
  148. mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
  149. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
  150. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
  151. mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
  152. mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
  153. mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
  154. mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
  155. mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
  156. mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
  157. mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
  158. mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
  159. mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
  160. mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
  161. mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
  162. mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
  163. mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
  164. mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
  165. mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
  166. mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
  167. mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
  168. mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
  169. mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
  170. mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
  171. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
  172. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
  173. mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
  174. mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
  175. mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
  176. mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
  177. mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
  178. mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
  179. mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
  180. mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
  181. mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
  182. mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
  183. mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
  184. mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
  185. mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
  186. mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
  187. mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
  188. mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
  189. mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
  190. mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
  191. mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
  192. mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
  193. mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
  194. mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
  195. mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
  196. mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
  197. mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
  198. mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
  199. mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
  200. mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
  201. mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
  202. mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
  203. mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
  204. mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
  205. mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
  206. mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
  207. mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
  208. mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
  209. mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
  210. mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
  211. mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
  212. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
  213. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
  214. mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
  215. mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
  216. mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
  217. mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
  218. mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
  219. mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
  220. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
  221. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
  222. mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
  223. mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
  224. mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
  225. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
  226. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
  227. mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
  228. mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
  229. mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
  230. mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
  231. mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
  232. mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
  233. mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
  234. mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
  235. mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
  236. mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
  237. mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
  238. mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
  239. mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
  240. mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
  241. mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
  242. mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
  243. mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
  244. mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
  245. mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
  246. mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
  247. mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
  248. mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
  249. mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
  250. mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
  251. mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
  252. mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
  253. mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
  254. mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
  255. mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
  256. mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
  257. mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
  258. mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
  259. mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
  260. mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
  261. mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
  262. mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
  263. mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
  264. mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
  265. mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
  266. mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
  267. mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
  268. mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
  269. mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
  270. mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
  271. mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
  272. mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
  273. mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
  274. mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
  275. mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
  276. mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
  277. mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
  278. mindsdb/integrations/libs/llm/config.py +13 -0
  279. mindsdb/integrations/libs/llm/utils.py +37 -65
  280. mindsdb/integrations/libs/response.py +67 -52
  281. mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
  282. mindsdb/integrations/utilities/handler_utils.py +15 -3
  283. mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
  284. mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
  285. mindsdb/integrations/utilities/rag/rerankers/base_reranker.py +230 -227
  286. mindsdb/integrations/utilities/utils.py +3 -3
  287. mindsdb/interfaces/agents/agents_controller.py +164 -1
  288. mindsdb/interfaces/agents/constants.py +32 -13
  289. mindsdb/interfaces/agents/langchain_agent.py +106 -95
  290. mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
  291. mindsdb/interfaces/knowledge_base/controller.py +250 -216
  292. mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
  293. mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
  294. mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
  295. mindsdb/interfaces/query_context/context_controller.py +66 -10
  296. mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
  297. mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
  298. mindsdb/interfaces/skills/skill_tool.py +202 -57
  299. mindsdb/interfaces/skills/sql_agent.py +205 -17
  300. mindsdb/interfaces/storage/fs.py +1 -0
  301. mindsdb/interfaces/variables/__init__.py +0 -0
  302. mindsdb/interfaces/variables/variables_controller.py +97 -0
  303. mindsdb/migrations/env.py +5 -7
  304. mindsdb/migrations/migrate.py +47 -7
  305. mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
  306. mindsdb/utilities/config.py +287 -216
  307. mindsdb/utilities/starters.py +13 -0
  308. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/METADATA +646 -698
  309. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/RECORD +312 -295
  310. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/WHEEL +1 -1
  311. mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
  312. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/licenses/LICENSE +0 -0
  313. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/top_level.txt +0 -0
@@ -10,16 +10,17 @@ from mindsdb.integrations.libs.base import DatabaseHandler
10
10
  from mindsdb.integrations.libs.response import (
11
11
  HandlerStatusResponse as StatusResponse,
12
12
  HandlerResponse as Response,
13
- RESPONSE_TYPE
13
+ RESPONSE_TYPE,
14
14
  )
15
15
  from mindsdb.integrations.handlers.mysql_handler.settings import ConnectionConfig
16
16
  from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
17
+ from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import C_TYPES, DATA_C_TYPE_MAP
17
18
 
18
19
  logger = log.getLogger(__name__)
19
20
 
20
21
 
21
22
  def _map_type(mysql_type_text: str) -> MYSQL_DATA_TYPE:
22
- """ Map MySQL text types names to MySQL types as enum.
23
+ """Map MySQL text types names to MySQL types as enum.
23
24
 
24
25
  Args:
25
26
  mysql_type_text (str): The name of the MySQL type to map.
@@ -30,23 +31,95 @@ def _map_type(mysql_type_text: str) -> MYSQL_DATA_TYPE:
30
31
  try:
31
32
  return MYSQL_DATA_TYPE(mysql_type_text.upper())
32
33
  except Exception:
33
- logger.warning(f'MySQL handler: unknown type: {mysql_type_text}, use TEXT as fallback.')
34
+ logger.warning(
35
+ f"MySQL handler: unknown type: {mysql_type_text}, use TEXT as fallback."
36
+ )
34
37
  return MYSQL_DATA_TYPE.TEXT
35
38
 
36
39
 
40
+ def _make_table_response(result: list[dict], cursor: mysql.connector.cursor.MySQLCursor) -> Response:
41
+ """Build response from result and cursor.
42
+
43
+ Args:
44
+ result (list[dict]): result of the query.
45
+ cursor (mysql.connector.cursor.MySQLCursor): cursor object.
46
+
47
+ Returns:
48
+ Response: response object.
49
+ """
50
+ description = cursor.description
51
+ reverse_c_type_map = {v.code: k for k, v in DATA_C_TYPE_MAP.items() if v.code != C_TYPES.MYSQL_TYPE_BLOB}
52
+ mysql_types: list[MYSQL_DATA_TYPE] = []
53
+ for col in description:
54
+ type_int = col[1]
55
+ if isinstance(type_int, int) is False:
56
+ mysql_types.append(MYSQL_DATA_TYPE.TEXT)
57
+ continue
58
+
59
+ if type_int == C_TYPES.MYSQL_TYPE_TINY:
60
+ # There are 3 types that returns as TINYINT: TINYINT, BOOL, BOOLEAN.
61
+ mysql_types.append(MYSQL_DATA_TYPE.TINYINT)
62
+ continue
63
+
64
+ if type_int in reverse_c_type_map:
65
+ mysql_types.append(reverse_c_type_map[type_int])
66
+ continue
67
+
68
+ if type_int != C_TYPES.MYSQL_TYPE_BLOB:
69
+ raise ValueError(f'Unknown MySQL type id={type_int} in column {col[0]}')
70
+
71
+ # region determine text/blob type by flags
72
+ # Unfortunately, there is no way to determine particular type of text/blob column by flags.
73
+ # Subtype have to be determined by 8-s element of description tuple, but mysql.conector
74
+ # return the same value for all text types (TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT), and for
75
+ # all blob types (TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB).
76
+ if col[7] == 16: # and col[8] == 45
77
+ mysql_types.append(MYSQL_DATA_TYPE.TEXT)
78
+ elif col[7] == 144: # and col[8] == 63
79
+ mysql_types.append(MYSQL_DATA_TYPE.BLOB)
80
+ else:
81
+ logger.debug(f'MySQL handler: unknown type code {col[7]}, use TEXT as fallback.')
82
+ mysql_types.append(MYSQL_DATA_TYPE.TEXT)
83
+ # endregion
84
+
85
+ # region cast int and bool to nullable types
86
+ serieses = []
87
+ for i, mysql_type in enumerate(mysql_types):
88
+ expected_dtype = None
89
+ column_name = description[i][0]
90
+ if mysql_type in (
91
+ MYSQL_DATA_TYPE.SMALLINT, MYSQL_DATA_TYPE.INT, MYSQL_DATA_TYPE.MEDIUMINT,
92
+ MYSQL_DATA_TYPE.BIGINT, MYSQL_DATA_TYPE.TINYINT
93
+ ):
94
+ expected_dtype = 'Int64'
95
+ elif mysql_type in (MYSQL_DATA_TYPE.BOOL, MYSQL_DATA_TYPE.BOOLEAN):
96
+ expected_dtype = 'boolean'
97
+ serieses.append(pd.Series([row[column_name] for row in result], dtype=expected_dtype, name=description[i][0]))
98
+ df = pd.concat(serieses, axis=1, copy=False)
99
+ # endregion
100
+
101
+ response = Response(
102
+ RESPONSE_TYPE.TABLE,
103
+ df,
104
+ affected_rows=cursor.rowcount,
105
+ mysql_types=mysql_types
106
+ )
107
+ return response
108
+
109
+
37
110
  class MySQLHandler(DatabaseHandler):
38
111
  """
39
112
  This handler handles connection and execution of the MySQL statements.
40
113
  """
41
114
 
42
- name = 'mysql'
115
+ name = "mysql"
43
116
 
44
117
  def __init__(self, name, **kwargs):
45
118
  super().__init__(name)
46
119
  self.parser = parse_sql
47
- self.dialect = 'mysql'
48
- self.connection_data = kwargs.get('connection_data', {})
49
- self.database = self.connection_data.get('database')
120
+ self.dialect = "mysql"
121
+ self.connection_data = kwargs.get("connection_data", {})
122
+ self.database = self.connection_data.get("database")
50
123
 
51
124
  self.connection = None
52
125
 
@@ -91,28 +164,28 @@ class MySQLHandler(DatabaseHandler):
91
164
  if self.is_connected and self.connection.is_connected():
92
165
  return self.connection
93
166
  config = self._unpack_config()
94
- if 'conn_attrs' in self.connection_data:
95
- config['conn_attrs'] = self.connection_data['conn_attrs']
167
+ if "conn_attrs" in self.connection_data:
168
+ config["conn_attrs"] = self.connection_data["conn_attrs"]
96
169
 
97
- if 'connection_timeout' not in config:
98
- config['connection_timeout'] = 10
170
+ if "connection_timeout" not in config:
171
+ config["connection_timeout"] = 10
99
172
 
100
- ssl = self.connection_data.get('ssl')
173
+ ssl = self.connection_data.get("ssl")
101
174
  if ssl is True:
102
- ssl_ca = self.connection_data.get('ssl_ca')
103
- ssl_cert = self.connection_data.get('ssl_cert')
104
- ssl_key = self.connection_data.get('ssl_key')
105
- config['client_flags'] = [mysql.connector.constants.ClientFlag.SSL]
175
+ ssl_ca = self.connection_data.get("ssl_ca")
176
+ ssl_cert = self.connection_data.get("ssl_cert")
177
+ ssl_key = self.connection_data.get("ssl_key")
178
+ config["client_flags"] = [mysql.connector.constants.ClientFlag.SSL]
106
179
  if ssl_ca is not None:
107
180
  config["ssl_ca"] = ssl_ca
108
181
  if ssl_cert is not None:
109
182
  config["ssl_cert"] = ssl_cert
110
183
  if ssl_key is not None:
111
184
  config["ssl_key"] = ssl_key
112
- if 'collation' not in config:
113
- config['collation'] = 'utf8mb4_general_ci'
114
- if 'use_pure' not in config:
115
- config['use_pure'] = True
185
+ if "collation" not in config:
186
+ config["collation"] = "utf8mb4_general_ci"
187
+ if "use_pure" not in config:
188
+ config["use_pure"] = True
116
189
  try:
117
190
  connection = mysql.connector.connect(**config)
118
191
  connection.autocommit = True
@@ -146,7 +219,9 @@ class MySQLHandler(DatabaseHandler):
146
219
  connection = self.connect()
147
220
  result.success = connection.is_connected()
148
221
  except mysql.connector.Error as e:
149
- logger.error(f'Error connecting to MySQL {self.connection_data["database"]}, {e}!')
222
+ logger.error(
223
+ f'Error connecting to MySQL {self.connection_data["database"]}, {e}!'
224
+ )
150
225
  result.error_message = str(e)
151
226
 
152
227
  if result.success and need_to_close:
@@ -173,22 +248,14 @@ class MySQLHandler(DatabaseHandler):
173
248
  cur.execute(query)
174
249
  if cur.with_rows:
175
250
  result = cur.fetchall()
176
- response = Response(
177
- RESPONSE_TYPE.TABLE,
178
- pd.DataFrame(
179
- result,
180
- columns=[x[0] for x in cur.description]
181
- ),
182
- affected_rows=cur.rowcount
183
- )
251
+ response = _make_table_response(result, cur)
184
252
  else:
185
253
  response = Response(RESPONSE_TYPE.OK, affected_rows=cur.rowcount)
186
254
  except mysql.connector.Error as e:
187
- logger.error(f'Error running query: {query} on {self.connection_data["database"]}!')
188
- response = Response(
189
- RESPONSE_TYPE.ERROR,
190
- error_message=str(e)
255
+ logger.error(
256
+ f'Error running query: {query} on {self.connection_data["database"]}!'
191
257
  )
258
+ response = Response(RESPONSE_TYPE.ERROR, error_message=str(e))
192
259
  if connection is not None and connection.is_connected():
193
260
  connection.rollback()
194
261
 
@@ -201,7 +268,7 @@ class MySQLHandler(DatabaseHandler):
201
268
  """
202
269
  Retrieve the data from the SQL statement.
203
270
  """
204
- renderer = SqlalchemyRender('mysql')
271
+ renderer = SqlalchemyRender("mysql")
205
272
  query_str = renderer.get_string(query, with_failback=True)
206
273
  return self.native_query(query_str)
207
274
 
@@ -14,29 +14,31 @@ class ConnectionConfig(BaseModel):
14
14
  @model_validator(mode="before")
15
15
  def check_db_params(cls, values):
16
16
  """Ensures either URL is provided or all individual parameters are provided."""
17
- url = values.get('url')
18
- host = values.get('host')
19
- user = values.get('user')
20
- password = values.get('password')
21
- database = values.get('database')
17
+ url = values.get("url")
18
+ host = values.get("host")
19
+ user = values.get("user")
20
+ password = values.get("password")
21
+ database = values.get("database")
22
22
  if not url and not (host and user and password and database):
23
- raise ValueError("Either a valid URL or required parameters (host, user, password, database) must be provided.")
23
+ raise ValueError(
24
+ "Either a valid URL or required parameters (host, user, password, database) must be provided."
25
+ )
24
26
 
25
27
  if url:
26
28
  parsed = urlparse(url)
27
- values['host'] = parsed.hostname or host
28
- values['port'] = parsed.port if parsed.port is not None else 3306
29
- values['user'] = parsed.username or user
30
- values['password'] = parsed.password or password
31
- values['database'] = parsed.path[1:] if parsed.path else database
29
+ values["host"] = parsed.hostname or host
30
+ values["port"] = parsed.port if parsed.port is not None else 3306
31
+ values["user"] = parsed.username or user
32
+ values["password"] = parsed.password or password
33
+ values["database"] = parsed.path[1:] if parsed.path else database
32
34
 
33
35
  # mysql connector raise error if url is provided
34
- values.pop('url', None)
36
+ values.pop("url", None)
35
37
 
36
38
  return values
37
39
 
38
40
  if not url:
39
- for param in ['host', 'user', 'password', 'database']:
41
+ for param in ["host", "user", "password", "database"]:
40
42
  if not values.get(param):
41
43
  raise ValueError(f"{param} is required when URL is not provided.")
42
44
  return values
@@ -41,7 +41,7 @@ class NeuralForecastHandler(BaseMLEngine):
41
41
  time_settings = args["timeseries_settings"]
42
42
  using_args = args["using"]
43
43
  assert time_settings["is_timeseries"], "Specify time series settings in your query"
44
- ###### store model args and time series settings in the model folder
44
+ # store model args and time series settings in the model folder
45
45
  model_args = {}
46
46
  model_args["target"] = target
47
47
  model_args["horizon"] = time_settings["horizon"]
@@ -194,7 +194,7 @@ class NewsAPIHandler(APIHandler):
194
194
  try:
195
195
  result = self.api.get_everything(**params)
196
196
  except Exception as e:
197
- raise RuntimeError(f"API call failed: {e}")
197
+ raise RuntimeError(f"API call failed: {e}")
198
198
  articles = result["articles"]
199
199
  for article in articles:
200
200
  article["source_id"] = article["source"]["id"]
@@ -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
+ ])
@@ -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(