MindsDB 25.5.3.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 (310) hide show
  1. mindsdb/__about__.py +1 -1
  2. mindsdb/__main__.py +127 -79
  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 +47 -27
  20. mindsdb/api/executor/datahub/classes/response.py +5 -2
  21. mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
  22. mindsdb/api/executor/planner/query_planner.py +10 -1
  23. mindsdb/api/executor/sql_query/result_set.py +185 -52
  24. mindsdb/api/executor/sql_query/sql_query.py +1 -1
  25. mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
  26. mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
  27. mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
  28. mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
  29. mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
  30. mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
  31. mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
  32. mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
  33. mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
  34. mindsdb/api/http/initialize.py +99 -83
  35. mindsdb/api/http/namespaces/analysis.py +3 -3
  36. mindsdb/api/http/namespaces/file.py +8 -2
  37. mindsdb/api/http/namespaces/sql.py +13 -27
  38. mindsdb/api/mcp/start.py +42 -5
  39. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
  40. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
  41. mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
  42. mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
  43. mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
  44. mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
  45. mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
  46. mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
  47. mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
  48. mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
  49. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
  50. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
  51. mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
  52. mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
  53. mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
  54. mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
  55. mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
  56. mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
  57. mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
  58. mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
  59. mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
  60. mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
  61. mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
  62. mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
  63. mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
  64. mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
  65. mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
  66. mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
  67. mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
  68. mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
  69. mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
  70. mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
  71. mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
  72. mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
  73. mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
  74. mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
  75. mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
  76. mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
  77. mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
  78. mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
  79. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
  80. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
  81. mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
  82. mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
  83. mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
  84. mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
  85. mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
  86. mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
  87. mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
  88. mindsdb/integrations/handlers/email_handler/settings.py +0 -1
  89. mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
  90. mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
  91. mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
  92. mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
  93. mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
  94. mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
  95. mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
  96. mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
  97. mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
  98. mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
  99. mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
  100. mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
  101. mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
  102. mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
  103. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
  104. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
  105. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
  106. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
  107. mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
  108. mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
  109. mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
  110. mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
  111. mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
  112. mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
  113. mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
  114. mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
  115. mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
  116. mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
  117. mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
  118. mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
  119. mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
  120. mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
  121. mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
  122. mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
  123. mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
  124. mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
  125. mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
  126. mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
  127. mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
  128. mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
  129. mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
  130. mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
  131. mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
  132. mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
  133. mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
  134. mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
  135. mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
  136. mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
  137. mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
  138. mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
  139. mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
  140. mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
  141. mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
  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/response.py +67 -52
  279. mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
  280. mindsdb/integrations/utilities/handler_utils.py +15 -3
  281. mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
  282. mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
  283. mindsdb/integrations/utilities/utils.py +3 -3
  284. mindsdb/interfaces/agents/agents_controller.py +164 -1
  285. mindsdb/interfaces/agents/constants.py +15 -0
  286. mindsdb/interfaces/agents/langchain_agent.py +16 -4
  287. mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
  288. mindsdb/interfaces/knowledge_base/controller.py +25 -0
  289. mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
  290. mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
  291. mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
  292. mindsdb/interfaces/query_context/context_controller.py +66 -10
  293. mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
  294. mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
  295. mindsdb/interfaces/skills/skill_tool.py +202 -57
  296. mindsdb/interfaces/skills/sql_agent.py +205 -17
  297. mindsdb/interfaces/storage/fs.py +1 -0
  298. mindsdb/interfaces/variables/__init__.py +0 -0
  299. mindsdb/interfaces/variables/variables_controller.py +97 -0
  300. mindsdb/migrations/env.py +5 -7
  301. mindsdb/migrations/migrate.py +47 -7
  302. mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
  303. mindsdb/utilities/config.py +331 -219
  304. mindsdb/utilities/starters.py +13 -0
  305. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +641 -695
  306. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +309 -288
  307. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
  308. mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
  309. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
  310. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
@@ -34,6 +34,7 @@ from mindsdb_sql_parser.ast import (
34
34
  Use,
35
35
  Tuple,
36
36
  Function,
37
+ Variable,
37
38
  )
38
39
 
39
40
  # typed models
@@ -49,6 +50,7 @@ from mindsdb_sql_parser.ast.mindsdb import (
49
50
  CreateSkill,
50
51
  CreateTrigger,
51
52
  CreateView,
53
+ CreateKnowledgeBaseIndex,
52
54
  DropAgent,
53
55
  DropChatBot,
54
56
  DropDatasource,
@@ -101,6 +103,7 @@ from mindsdb.interfaces.model.functions import (
101
103
  )
102
104
  from mindsdb.interfaces.query_context.context_controller import query_context_controller
103
105
  from mindsdb.interfaces.triggers.triggers_controller import TriggersController
106
+ from mindsdb.interfaces.variables.variables_controller import variables_controller
104
107
  from mindsdb.utilities.context import context as ctx
105
108
  from mindsdb.utilities.functions import mark_process, resolve_model_identifier, get_handler_install_message
106
109
  from mindsdb.utilities.exception import EntityExistsError, EntityNotExistsError
@@ -336,7 +339,7 @@ class ExecuteCommands:
336
339
  df2 = query_df(df, new_statement)
337
340
 
338
341
  return ExecuteAnswer(
339
- data=ResultSet().from_df(df2, table_name="session_variables")
342
+ data=ResultSet.from_df(df2, table_name="session_variables")
340
343
  )
341
344
  elif sql_category == "search_path":
342
345
  return ExecuteAnswer(
@@ -511,28 +514,30 @@ class ExecuteCommands:
511
514
  return ExecuteAnswer()
512
515
  elif statement_type is Set:
513
516
  category = (statement.category or "").lower()
514
- if category == "" and isinstance(statement.name, Identifier):
515
- param = statement.name.parts[0].lower()
516
-
517
- value = None
518
- if isinstance(statement.value, Constant):
519
- value = statement.value.value
520
-
521
- if param == "profiling":
522
- self.session.profiling = value in (1, True)
523
- if self.session.profiling is True:
524
- profiler.enable()
525
- else:
526
- profiler.disable()
527
- elif param == "predictor_cache":
528
- self.session.predictor_cache = value in (1, True)
529
- elif param == "context":
530
- if value in (0, False, None):
531
- # drop context
532
- query_context_controller.drop_query_context(None)
533
- elif param == "show_secrets":
534
- self.session.show_secrets = value in (1, True)
535
-
517
+ if category == "":
518
+ if isinstance(statement.name, Identifier):
519
+ param = statement.name.parts[0].lower()
520
+
521
+ value = None
522
+ if isinstance(statement.value, Constant):
523
+ value = statement.value.value
524
+
525
+ if param == "profiling":
526
+ self.session.profiling = value in (1, True)
527
+ if self.session.profiling is True:
528
+ profiler.enable()
529
+ else:
530
+ profiler.disable()
531
+ elif param == "predictor_cache":
532
+ self.session.predictor_cache = value in (1, True)
533
+ elif param == "context":
534
+ if value in (0, False, None):
535
+ # drop context
536
+ query_context_controller.drop_query_context(None)
537
+ elif param == "show_secrets":
538
+ self.session.show_secrets = value in (1, True)
539
+ elif isinstance(statement.name, Variable):
540
+ variables_controller.set_variable(statement.name.value, statement.value)
536
541
  return ExecuteAnswer()
537
542
  elif category == "autocommit":
538
543
  return ExecuteAnswer()
@@ -649,6 +654,8 @@ class ExecuteCommands:
649
654
  elif statement_type is Evaluate:
650
655
  statement.data = parse_sql(statement.query_str)
651
656
  return self.answer_evaluate_metric(statement, database_name)
657
+ elif statement_type is CreateKnowledgeBaseIndex:
658
+ return self.answer_create_kb_index(statement, database_name)
652
659
  else:
653
660
  logger.warning(f"Unknown SQL statement: {sql}")
654
661
  raise NotSupportedYet(f"Unknown SQL statement: {sql}")
@@ -936,8 +943,18 @@ class ExecuteCommands:
936
943
  )
937
944
 
938
945
  return ExecuteAnswer(
939
- data=ResultSet().from_df(df, table_name="")
946
+ data=ResultSet.from_df(df, table_name="")
947
+ )
948
+
949
+ def answer_create_kb_index(self, statement, database_name):
950
+ table_name = statement.name.parts[-1]
951
+ project_name = (
952
+ statement.name.parts[0]
953
+ if len(statement.name.parts) > 1
954
+ else database_name
940
955
  )
956
+ self.session.kb_controller.create_index(table_name=table_name, project_name=project_name)
957
+ return ExecuteAnswer()
941
958
 
942
959
  def _get_model_info(self, identifier, except_absent=True, database_name=None):
943
960
  if len(identifier.parts) == 1:
@@ -968,6 +985,9 @@ class ExecuteCommands:
968
985
  """Checks if there is already a predictor retraining or fine-tuning
969
986
  Do not allow to run retrain if there is another model in training process in less that 1h
970
987
  """
988
+ if ctx.company_id is None:
989
+ # bypass for tests
990
+ return
971
991
  is_cloud = self.session.config.get("cloud", False)
972
992
  if is_cloud and ctx.user_class == 0:
973
993
  models = get_model_records(active=None)
@@ -1032,7 +1052,7 @@ class ExecuteCommands:
1032
1052
  df = self.session.model_controller.retrain_model(statement, ml_handler)
1033
1053
 
1034
1054
  return ExecuteAnswer(
1035
- data=ResultSet().from_df(df)
1055
+ data=ResultSet.from_df(df)
1036
1056
  )
1037
1057
 
1038
1058
  @profiler.profile()
@@ -1062,7 +1082,7 @@ class ExecuteCommands:
1062
1082
  df = self.session.model_controller.finetune_model(statement, ml_handler)
1063
1083
 
1064
1084
  return ExecuteAnswer(
1065
- data=ResultSet().from_df(df)
1085
+ data=ResultSet.from_df(df)
1066
1086
  )
1067
1087
 
1068
1088
  def _create_integration(self, name: str, engine: str, connection_args: dict):
@@ -1572,7 +1592,7 @@ class ExecuteCommands:
1572
1592
  try:
1573
1593
  df = self.session.model_controller.create_model(statement, ml_handler)
1574
1594
 
1575
- return ExecuteAnswer(data=ResultSet().from_df(df))
1595
+ return ExecuteAnswer(data=ResultSet.from_df(df))
1576
1596
  except EntityExistsError:
1577
1597
  if getattr(statement, "if_not_exists", False) is True:
1578
1598
  return ExecuteAnswer()
@@ -1,11 +1,14 @@
1
1
  from dataclasses import dataclass, field
2
- from typing import Optional, List, Dict
2
+ from typing import List, Dict
3
3
 
4
4
  import pandas as pd
5
5
 
6
+ from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
7
+
6
8
 
7
9
  @dataclass
8
10
  class DataHubResponse:
9
11
  data_frame: pd.DataFrame = field(default_factory=pd.DataFrame)
10
12
  columns: List[Dict] = field(default_factory=list)
11
- affected_rows: Optional[int] = None
13
+ affected_rows: int | None = None
14
+ mysql_types: list[MYSQL_DATA_TYPE] | None = None
@@ -1,13 +1,12 @@
1
1
  import time
2
2
  import inspect
3
3
  from dataclasses import astuple
4
+ from typing import Iterable
4
5
 
5
6
  import numpy as np
6
- from numpy import dtype as np_dtype
7
7
  import pandas as pd
8
- from pandas.api import types as pd_types
9
8
  from sqlalchemy.types import (
10
- Integer, Float, Text
9
+ Integer, Float
11
10
  )
12
11
 
13
12
  from mindsdb_sql_parser.ast.base import ASTNode
@@ -121,9 +120,7 @@ class IntegrationDataNode(DataNode):
121
120
  tables=[name],
122
121
  if_exists=if_exists
123
122
  )
124
- result = self._query(drop_ast)
125
- if result.type == RESPONSE_TYPE.ERROR:
126
- raise Exception(result.error_message)
123
+ self.query(drop_ast)
127
124
 
128
125
  def create_table(self, table_name: Identifier, result_set: ResultSet = None, columns=None,
129
126
  is_replace=False, is_create=False, **kwargs) -> DataHubResponse:
@@ -138,27 +135,11 @@ class IntegrationDataNode(DataNode):
138
135
 
139
136
  df = result_set.get_raw_df()
140
137
 
141
- for idx, col in enumerate(result_set.columns):
142
- dtype = col.type
143
- # assume this is pandas type
144
- column_type = Text
145
- if isinstance(dtype, np_dtype):
146
- if pd_types.is_object_dtype(dtype):
147
- # try to infer
148
- dtype = df[idx].infer_objects().dtype
149
-
150
- if pd_types.is_integer_dtype(dtype):
151
- column_type = Integer
152
- elif pd_types.is_numeric_dtype(dtype):
153
- column_type = Float
154
-
155
- columns.append(
156
- TableColumn(
157
- name=col.alias,
158
- type=column_type
159
- )
160
- )
161
- table_columns_meta[col.alias] = column_type
138
+ columns: list[TableColumn] = result_set.get_ast_columns()
139
+ table_columns_meta = {
140
+ column.name: column.type
141
+ for column in columns
142
+ }
162
143
 
163
144
  if is_replace:
164
145
  # drop
@@ -166,9 +147,7 @@ class IntegrationDataNode(DataNode):
166
147
  tables=[table_name],
167
148
  if_exists=True
168
149
  )
169
- result = self._query(drop_ast)
170
- if result.type == RESPONSE_TYPE.ERROR:
171
- raise Exception(result.error_message)
150
+ self.query(drop_ast)
172
151
  is_create = True
173
152
 
174
153
  if is_create:
@@ -177,9 +156,7 @@ class IntegrationDataNode(DataNode):
177
156
  columns=columns,
178
157
  is_replace=is_replace
179
158
  )
180
- result = self._query(create_table_ast)
181
- if result.type == RESPONSE_TYPE.ERROR:
182
- raise Exception(result.error_message)
159
+ self.query(create_table_ast)
183
160
 
184
161
  if result_set is None:
185
162
  # it is just a 'create table'
@@ -224,56 +201,44 @@ class IntegrationDataNode(DataNode):
224
201
  )
225
202
 
226
203
  try:
227
- result = self._query(insert_ast)
204
+ result: DataHubResponse = self.query(insert_ast)
228
205
  except Exception as e:
229
206
  msg = f'[{self.ds_type}/{self.integration_name}]: {str(e)}'
230
207
  raise DBHandlerException(msg) from e
231
208
 
232
- if result.type == RESPONSE_TYPE.ERROR:
233
- raise Exception(result.error_message)
234
-
235
209
  return DataHubResponse(affected_rows=result.affected_rows)
236
210
 
237
- def _query(self, query) -> HandlerResponse:
238
- time_before_query = time.perf_counter()
239
- result = self.integration_handler.query(query)
240
- elapsed_seconds = time.perf_counter() - time_before_query
241
- query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
242
- get_class_name(self.integration_handler), result.type)
243
- query_time_with_labels.observe(elapsed_seconds)
244
-
245
- num_rows = 0
246
- if result.data_frame is not None:
247
- num_rows = len(result.data_frame.index)
248
- response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
249
- get_class_name(self.integration_handler), result.type)
250
- response_size_with_labels.observe(num_rows)
251
- return result
252
-
253
- def _native_query(self, native_query) -> HandlerResponse:
254
- time_before_query = time.perf_counter()
255
- result = self.integration_handler.native_query(native_query)
256
- elapsed_seconds = time.perf_counter() - time_before_query
257
- query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
258
- get_class_name(self.integration_handler), result.type)
259
- query_time_with_labels.observe(elapsed_seconds)
260
-
261
- num_rows = 0
262
- if result.data_frame is not None:
263
- num_rows = len(result.data_frame.index)
264
- response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
265
- get_class_name(self.integration_handler), result.type)
266
- response_size_with_labels.observe(num_rows)
267
- return result
211
+ def has_support_stream(self) -> bool:
212
+ # checks if data handler has query_stream method
213
+ return hasattr(self.integration_handler, 'query_stream') and callable(self.integration_handler.query_stream)
214
+
215
+ @profiler.profile()
216
+ def query_stream(self, query: ASTNode, fetch_size: int = None) -> Iterable:
217
+ # returns generator of results from handler (split by chunks)
218
+ return self.integration_handler.query_stream(query, fetch_size=fetch_size)
268
219
 
269
220
  @profiler.profile()
270
221
  def query(self, query: ASTNode | None = None, native_query: str | None = None, session=None) -> DataHubResponse:
271
222
  try:
223
+ time_before_query = time.perf_counter()
272
224
  if query is not None:
273
- result: HandlerResponse = self._query(query)
225
+ result: HandlerResponse = self.integration_handler.query(query)
274
226
  else:
275
227
  # try to fetch native query
276
- result: HandlerResponse = self._native_query(native_query)
228
+ result: HandlerResponse = self.integration_handler.native_query(native_query)
229
+
230
+ # metrics
231
+ elapsed_seconds = time.perf_counter() - time_before_query
232
+ query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
233
+ get_class_name(self.integration_handler), result.type)
234
+ query_time_with_labels.observe(elapsed_seconds)
235
+
236
+ num_rows = 0
237
+ if result.data_frame is not None:
238
+ num_rows = len(result.data_frame.index)
239
+ response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
240
+ get_class_name(self.integration_handler), result.type)
241
+ response_size_with_labels.observe(num_rows)
277
242
  except Exception as e:
278
243
  msg = str(e).strip()
279
244
  if msg == '':
@@ -294,7 +259,8 @@ class IntegrationDataNode(DataNode):
294
259
 
295
260
  try:
296
261
  # replace python's Nan, np.NaN, np.nan and pd.NA to None
297
- df.replace([np.NaN, pd.NA], None, inplace=True)
262
+ # TODO keep all NAN to the end of processing, bacause replacing also changes dtypes
263
+ df.replace([np.NaN, pd.NA, pd.NaT], None, inplace=True)
298
264
  except Exception as e:
299
265
  logger.error(f"Issue with clearing DF from NaN values: {e}")
300
266
  # endregion
@@ -310,5 +276,6 @@ class IntegrationDataNode(DataNode):
310
276
  return DataHubResponse(
311
277
  data_frame=df,
312
278
  columns=columns_info,
313
- affected_rows=result.affected_rows
279
+ affected_rows=result.affected_rows,
280
+ mysql_types=result.mysql_types
314
281
  )
@@ -848,11 +848,12 @@ class QueryPlanner:
848
848
  """
849
849
 
850
850
  # handle fetchdataframe partitioning
851
+ steps_in = plan.steps
851
852
  steps_out = []
852
853
 
853
854
  step = None
854
855
  partition_step = None
855
- for step in plan.steps:
856
+ for step in steps_in:
856
857
  if isinstance(step, FetchDataframeStep) and step.params is not None:
857
858
  batch_size = step.params.get('batch_size')
858
859
  if batch_size is not None:
@@ -905,6 +906,14 @@ class QueryPlanner:
905
906
 
906
907
  if plan.is_resumable and isinstance(step, InsertToTable):
907
908
  plan.is_async = True
909
+ else:
910
+ # special case: register insert from select (it is the same as mark resumable)
911
+ if (
912
+ len(steps_in) == 2
913
+ and isinstance(steps_in[0], FetchDataframeStep)
914
+ and isinstance(steps_in[1], InsertToTable)
915
+ ):
916
+ plan.is_resumable = True
908
917
 
909
918
  plan.steps = steps_out
910
919
  return plan