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
@@ -55,7 +55,7 @@ class SubSelectStepCall(BaseStepCall):
55
55
 
56
56
  for col_name in query_cols:
57
57
  if col_name not in result_cols:
58
- result.add_column(Column(col_name))
58
+ result.add_column(Column(name=col_name))
59
59
 
60
60
  # inject previous step values
61
61
  if isinstance(query, Select):
@@ -69,12 +69,10 @@ class SubSelectStepCall(BaseStepCall):
69
69
  df = result.to_df()
70
70
  res = query_df(df, query, session=self.session)
71
71
 
72
- result2 = ResultSet()
73
72
  # get database from first column
74
73
  database = result.columns[0].database
75
- result2.from_df(res, database, table_name)
76
74
 
77
- return result2
75
+ return ResultSet.from_df(res, database, table_name)
78
76
 
79
77
 
80
78
  class QueryStepCall(BaseStepCall):
@@ -86,7 +84,7 @@ class QueryStepCall(BaseStepCall):
86
84
 
87
85
  if step.from_table is not None:
88
86
  if isinstance(step.from_table, pd.DataFrame):
89
- result_set = ResultSet().from_df(step.from_table)
87
+ result_set = ResultSet.from_df(step.from_table)
90
88
  else:
91
89
  result_set = self.steps_data[step.from_table.step_num]
92
90
  else:
@@ -208,6 +206,4 @@ class QueryStepCall(BaseStepCall):
208
206
  query.from_table = Identifier('df_table')
209
207
  res = query_df(df, query, session=self.session)
210
208
 
211
- data = ResultSet().from_df_cols(res, col_names, strict=False)
212
-
213
- return data
209
+ return ResultSet.from_df_cols(df=res, columns_dict=col_names, strict=False)
@@ -48,6 +48,4 @@ class UnionStepCall(BaseStepCall):
48
48
  })
49
49
  resp_df.replace({np.nan: None}, inplace=True)
50
50
 
51
- data = ResultSet().from_df_cols(resp_df, col_names=names)
52
-
53
- return data
51
+ return ResultSet.from_df_cols(df=resp_df, columns_dict=names)
@@ -4,9 +4,11 @@ import mimetypes
4
4
  import threading
5
5
  import traceback
6
6
  import webbrowser
7
+
7
8
  from pathlib import Path
8
9
  from http import HTTPStatus
9
10
 
11
+
10
12
  import requests
11
13
  from flask import Flask, url_for, make_response, request, send_from_directory
12
14
  from flask.json import dumps
@@ -50,17 +52,37 @@ from mindsdb.utilities.json_encoder import CustomJSONProvider
50
52
  from mindsdb.utilities.ps import is_pid_listen_port, wait_func_is_true
51
53
  from mindsdb.utilities.sentry import sentry_sdk # noqa: F401
52
54
  from mindsdb.utilities.otel import trace # noqa: F401
53
- from opentelemetry.instrumentation.flask import FlaskInstrumentor # noqa: F401
54
- from opentelemetry.instrumentation.requests import RequestsInstrumentor # noqa: F401
55
55
 
56
56
  logger = log.getLogger(__name__)
57
57
 
58
58
 
59
+ class _NoOpFlaskInstrumentor:
60
+ def instrument_app(self, app):
61
+ pass
62
+
63
+
64
+ class _NoOpRequestsInstrumentor:
65
+ def instrument(self):
66
+ pass
67
+
68
+
69
+ try:
70
+ from opentelemetry.instrumentation.flask import FlaskInstrumentor
71
+ from opentelemetry.instrumentation.requests import RequestsInstrumentor
72
+ except ImportError:
73
+ logger.debug(
74
+ "OpenTelemetry is not avaiable. Please run `pip install -r requirements/requirements-opentelemetry.txt` to use it."
75
+ )
76
+ FlaskInstrumentor = _NoOpFlaskInstrumentor
77
+ RequestsInstrumentor = _NoOpRequestsInstrumentor
78
+
79
+
59
80
  class Swagger_Api(Api):
60
81
  """
61
82
  This is a modification of the base Flask Restplus Api class due to the issue described here
62
83
  https://github.com/noirbizarre/flask-restplus/issues/223
63
84
  """
85
+
64
86
  @property
65
87
  def specs_url(self):
66
88
  return url_for(self.endpoint("specs"), _external=False)
@@ -75,7 +97,10 @@ def custom_output_json(data, code, headers=None):
75
97
  def get_last_compatible_gui_version() -> Version:
76
98
  logger.debug("Getting last compatible frontend..")
77
99
  try:
78
- res = requests.get('https://mindsdb-web-builds.s3.amazonaws.com/compatible-config.json', timeout=5)
100
+ res = requests.get(
101
+ "https://mindsdb-web-builds.s3.amazonaws.com/compatible-config.json",
102
+ timeout=5,
103
+ )
79
104
  except (ConnectionError, requests.exceptions.ConnectionError) as e:
80
105
  logger.error(f"Is no connection. {e}")
81
106
  return False
@@ -101,13 +126,16 @@ def get_last_compatible_gui_version() -> Version:
101
126
  gui_versions = {}
102
127
  max_mindsdb_lv = None
103
128
  max_gui_lv = None
104
- for el in versions['mindsdb']:
105
- if el['mindsdb_version'] is None:
106
- gui_lv = parse_version(el['gui_version'])
129
+ for el in versions["mindsdb"]:
130
+ if el["mindsdb_version"] is None:
131
+ gui_lv = parse_version(el["gui_version"])
107
132
  else:
108
- mindsdb_lv = parse_version(el['mindsdb_version'])
109
- gui_lv = parse_version(el['gui_version'])
110
- if mindsdb_lv.base_version not in gui_versions or gui_lv > gui_versions[mindsdb_lv.base_version]:
133
+ mindsdb_lv = parse_version(el["mindsdb_version"])
134
+ gui_lv = parse_version(el["gui_version"])
135
+ if (
136
+ mindsdb_lv.base_version not in gui_versions
137
+ or gui_lv > gui_versions[mindsdb_lv.base_version]
138
+ ):
111
139
  gui_versions[mindsdb_lv.base_version] = gui_lv
112
140
  if max_mindsdb_lv is None or max_mindsdb_lv < mindsdb_lv:
113
141
  max_mindsdb_lv = mindsdb_lv
@@ -122,7 +150,11 @@ def get_last_compatible_gui_version() -> Version:
122
150
  elif current_mindsdb_lv > all_mindsdb_lv[-1]:
123
151
  gui_version_lv = max_gui_lv
124
152
  else:
125
- lower_versions = {key: value for key, value in gui_versions.items() if parse_version(key) < current_mindsdb_lv}
153
+ lower_versions = {
154
+ key: value
155
+ for key, value in gui_versions.items()
156
+ if parse_version(key) < current_mindsdb_lv
157
+ }
126
158
  if len(lower_versions) == 0:
127
159
  gui_version_lv = gui_versions[all_mindsdb_lv[0].base_version]
128
160
  else:
@@ -139,12 +171,12 @@ def get_last_compatible_gui_version() -> Version:
139
171
  def get_current_gui_version() -> Version:
140
172
  logger.debug("Getting current frontend version..")
141
173
  config = Config()
142
- static_path = Path(config['paths']['static'])
143
- version_txt_path = static_path.joinpath('version.txt')
174
+ static_path = Path(config["paths"]["static"])
175
+ version_txt_path = static_path.joinpath("version.txt")
144
176
 
145
177
  current_gui_version = None
146
178
  if version_txt_path.is_file():
147
- with open(version_txt_path, 'rt') as f:
179
+ with open(version_txt_path, "rt") as f:
148
180
  current_gui_version = f.readline()
149
181
 
150
182
  current_gui_lv = (
@@ -160,7 +192,7 @@ def initialize_static():
160
192
  config = Config()
161
193
  last_gui_version_lv = get_last_compatible_gui_version()
162
194
  current_gui_version_lv = get_current_gui_version()
163
- required_gui_version = config['gui'].get('version')
195
+ required_gui_version = config["gui"].get("version")
164
196
 
165
197
  if required_gui_version is not None:
166
198
  required_gui_version_lv = parse_version(required_gui_version)
@@ -176,7 +208,10 @@ def initialize_static():
176
208
  return False
177
209
 
178
210
  # ignore versions like '23.9.2.2'
179
- if current_gui_version_lv is not None and len(current_gui_version_lv.release) < 3:
211
+ if (
212
+ current_gui_version_lv is not None
213
+ and len(current_gui_version_lv.release) < 3
214
+ ):
180
215
  if current_gui_version_lv == last_gui_version_lv:
181
216
  return True
182
217
  logger.debug("Updating gui..")
@@ -187,37 +222,40 @@ def initialize_static():
187
222
 
188
223
 
189
224
  def initialize_app(config, no_studio):
190
- static_root = config['paths']['static']
225
+ static_root = config["paths"]["static"]
191
226
  logger.debug(f"Static route: {static_root}")
192
- gui_exists = Path(static_root).joinpath('index.html').is_file()
227
+ gui_exists = Path(static_root).joinpath("index.html").is_file()
193
228
  logger.debug(f"Does GUI already exist.. {'YES' if gui_exists else 'NO'}")
194
229
  init_static_thread = None
195
- if (
196
- no_studio is False
197
- and (
198
- config['gui']['autoupdate'] is True
199
- or gui_exists is False
200
- )
230
+ if no_studio is False and (
231
+ config["gui"]["autoupdate"] is True or gui_exists is False
201
232
  ):
202
- init_static_thread = threading.Thread(target=initialize_static, name='initialize_static')
233
+ init_static_thread = threading.Thread(
234
+ target=initialize_static, name="initialize_static"
235
+ )
203
236
  init_static_thread.start()
204
237
 
238
+ # Wait for static initialization.
239
+ if not no_studio and init_static_thread is not None:
240
+ init_static_thread.join()
241
+
205
242
  app, api = initialize_flask(config, init_static_thread, no_studio)
206
243
  Compress(app)
244
+
207
245
  initialize_interfaces(app)
208
246
 
209
247
  if os.path.isabs(static_root) is False:
210
248
  static_root = os.path.join(os.getcwd(), static_root)
211
249
  static_root = Path(static_root)
212
250
 
213
- @app.route('/', defaults={'path': ''}, methods=['GET'])
214
- @app.route('/<path:path>', methods=['GET'])
251
+ @app.route("/", defaults={"path": ""}, methods=["GET"])
252
+ @app.route("/<path:path>", methods=["GET"])
215
253
  def root_index(path):
216
- if path.startswith('api/'):
254
+ if path.startswith("api/"):
217
255
  return http_error(
218
256
  HTTPStatus.NOT_FOUND,
219
- 'Not found',
220
- 'The endpoint you are trying to access does not exist on the server.'
257
+ "Not found",
258
+ "The endpoint you are trying to access does not exist on the server.",
221
259
  )
222
260
 
223
261
  # Normalize the path.
@@ -227,14 +265,14 @@ def initialize_app(config, no_studio):
227
265
  if not full_path.startswith(str(static_root)):
228
266
  return http_error(
229
267
  HTTPStatus.FORBIDDEN,
230
- 'Forbidden',
231
- 'You are not allowed to access the requested resource.'
268
+ "Forbidden",
269
+ "You are not allowed to access the requested resource.",
232
270
  )
233
271
 
234
272
  if os.path.isfile(full_path):
235
273
  return send_from_directory(static_root, path)
236
274
  else:
237
- return send_from_directory(static_root, 'index.html')
275
+ return send_from_directory(static_root, "index.html")
238
276
 
239
277
  protected_namespaces = [
240
278
  tab_ns,
@@ -253,7 +291,7 @@ def initialize_app(config, no_studio):
253
291
  skills_ns,
254
292
  agents_ns,
255
293
  jobs_ns,
256
- knowledge_bases_ns
294
+ knowledge_bases_ns,
257
295
  ]
258
296
 
259
297
  for ns in protected_namespaces:
@@ -268,20 +306,20 @@ def initialize_app(config, no_studio):
268
306
  # pass through HTTP errors
269
307
  # NOTE flask_restx require 'message', also it modyfies 'application/problem+json' to 'application/json'
270
308
  if isinstance(e, HTTPException):
271
- return ({
272
- 'title': e.name,
273
- 'detail': e.description,
274
- 'message': e.description
275
- }, e.code, {
276
- 'Content-Type': 'application/problem+json'
277
- })
278
- return ({
279
- 'title': getattr(type(e), "__name__") or "Unknown error",
280
- 'detail': str(e),
281
- 'message': str(e)
282
- }, 500, {
283
- 'Content-Type': 'application/problem+json'
284
- })
309
+ return (
310
+ {"title": e.name, "detail": e.description, "message": e.description},
311
+ e.code,
312
+ {"Content-Type": "application/problem+json"},
313
+ )
314
+ return (
315
+ {
316
+ "title": getattr(type(e), "__name__") or "Unknown error",
317
+ "detail": str(e),
318
+ "message": str(e),
319
+ },
320
+ 500,
321
+ {"Content-Type": "application/problem+json"},
322
+ )
285
323
 
286
324
  @app.teardown_appcontext
287
325
  def remove_session(*args, **kwargs):
@@ -295,31 +333,34 @@ def initialize_app(config, no_studio):
295
333
 
296
334
  # region routes where auth is required
297
335
  if (
298
- config['auth']['http_auth_enabled'] is True
299
- and any(request.path.startswith(f'/api{ns.path}') for ns in protected_namespaces)
336
+ config["auth"]["http_auth_enabled"] is True
337
+ and any(
338
+ request.path.startswith(f"/api{ns.path}") for ns in protected_namespaces
339
+ )
300
340
  and check_auth() is False
301
341
  ):
302
342
  return http_error(
303
- HTTPStatus.UNAUTHORIZED, 'Unauthorized',
304
- 'Authorization is required to complete the request'
343
+ HTTPStatus.UNAUTHORIZED,
344
+ "Unauthorized",
345
+ "Authorization is required to complete the request",
305
346
  )
306
347
  # endregion
307
348
 
308
- company_id = request.headers.get('company-id')
309
- user_class = request.headers.get('user-class')
349
+ company_id = request.headers.get("company-id")
350
+ user_class = request.headers.get("user-class")
310
351
 
311
352
  try:
312
- email_confirmed = int(request.headers.get('email-confirmed', 1))
353
+ email_confirmed = int(request.headers.get("email-confirmed", 1))
313
354
  except Exception:
314
355
  email_confirmed = 1
315
356
 
316
357
  try:
317
- user_id = int(request.headers.get('user-id', 0))
358
+ user_id = int(request.headers.get("user-id", 0))
318
359
  except Exception:
319
360
  user_id = 0
320
361
 
321
362
  try:
322
- session_id = request.cookies.get('session')
363
+ session_id = request.cookies.get("session")
323
364
  except Exception:
324
365
  session_id = "unknown"
325
366
 
@@ -349,10 +390,6 @@ def initialize_app(config, no_studio):
349
390
  ctx.user_class = user_class
350
391
  ctx.email_confirmed = email_confirmed
351
392
 
352
- # Wait for static initialization.
353
- if not no_studio and init_static_thread is not None:
354
- init_static_thread.join()
355
-
356
393
  logger.debug("Done initializing app.")
357
394
  return app
358
395
 
@@ -360,13 +397,13 @@ def initialize_app(config, no_studio):
360
397
  def initialize_flask(config, init_static_thread, no_studio):
361
398
  logger.debug("Initializing flask..")
362
399
  # region required for windows https://github.com/mindsdb/mindsdb/issues/2526
363
- mimetypes.add_type('text/css', '.css')
364
- mimetypes.add_type('text/javascript', '.js')
400
+ mimetypes.add_type("text/css", ".css")
401
+ mimetypes.add_type("text/javascript", ".js")
365
402
  # endregion
366
403
 
367
404
  kwargs = {}
368
405
  if no_studio is not True:
369
- static_path = os.path.join(config['paths']['static'], 'static/')
406
+ static_path = os.path.join(config["paths"]["static"], "static/")
370
407
  if os.path.isabs(static_path) is False:
371
408
  static_path = os.path.join(os.getcwd(), static_path)
372
409
  kwargs["static_url_path"] = "/static"
@@ -376,39 +413,35 @@ def initialize_flask(config, init_static_thread, no_studio):
376
413
  app = Flask(__name__, **kwargs)
377
414
  init_metrics(app)
378
415
 
379
- # Instrument Flask app for OpenTelemetry
416
+ # Instrument Flask app and requests using either real or no-op instrumentors
380
417
  FlaskInstrumentor().instrument_app(app)
381
418
  RequestsInstrumentor().instrument()
382
419
 
383
- app.config['SECRET_KEY'] = os.environ.get('FLASK_SECRET_KEY', secrets.token_hex(32))
384
- app.config['SESSION_COOKIE_NAME'] = 'session'
385
- app.config['PERMANENT_SESSION_LIFETIME'] = config['auth']['http_permanent_session_lifetime']
386
- app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 60
387
- app.config['SWAGGER_HOST'] = 'http://localhost:8000/mindsdb'
420
+ app.config["SECRET_KEY"] = os.environ.get("FLASK_SECRET_KEY", secrets.token_hex(32))
421
+ app.config["SESSION_COOKIE_NAME"] = "session"
422
+ app.config["PERMANENT_SESSION_LIFETIME"] = config["auth"][
423
+ "http_permanent_session_lifetime"
424
+ ]
425
+ app.config["SEND_FILE_MAX_AGE_DEFAULT"] = 60
426
+ app.config["SWAGGER_HOST"] = "http://localhost:8000/mindsdb"
388
427
  app.json = CustomJSONProvider()
389
428
 
390
- authorizations = {
391
- 'apikey': {
392
- 'type': 'session',
393
- 'in': 'query',
394
- 'name': 'session'
395
- }
396
- }
429
+ authorizations = {"apikey": {"type": "session", "in": "query", "name": "session"}}
397
430
 
398
431
  logger.debug("Creating swagger API..")
399
432
  api = Swagger_Api(
400
433
  app,
401
434
  authorizations=authorizations,
402
- security=['apikey'],
403
- url_prefix=':8000',
404
- prefix='/api',
405
- doc='/doc/'
435
+ security=["apikey"],
436
+ url_prefix=":8000",
437
+ prefix="/api",
438
+ doc="/doc/",
406
439
  )
407
440
 
408
- api.representations['application/json'] = custom_output_json
441
+ api.representations["application/json"] = custom_output_json
409
442
 
410
- port = config['api']['http']['port']
411
- host = config['api']['http']['host']
443
+ port = config["api"]["http"]["port"]
444
+ host = config["api"]["http"]["host"]
412
445
 
413
446
  # NOTE rewrite it, that hotfix to see GUI link
414
447
  if not no_studio:
@@ -421,9 +454,9 @@ def initialize_flask(config, init_static_thread, no_studio):
421
454
  pid = os.getpid()
422
455
  thread = threading.Thread(
423
456
  target=_open_webbrowser,
424
- args=(url, pid, port, init_static_thread, config['paths']['static']),
457
+ args=(url, pid, port, init_static_thread, config["paths"]["static"]),
425
458
  daemon=True,
426
- name='open_webbrowser'
459
+ name="open_webbrowser",
427
460
  )
428
461
  thread.start()
429
462
 
@@ -77,9 +77,16 @@ class QueryAnalysis(Resource):
77
77
  if result.type != SQL_RESPONSE_TYPE.TABLE:
78
78
  return http_error(500, "Error", "Query does not return data")
79
79
 
80
- column_names = [x["name"] for x in result.columns]
81
- df = DataFrame(result.data, columns=column_names)
82
- analysis = analyze_df(df)
80
+ column_names = [column.name for column in result.result_set.columns]
81
+ df = result.result_set.to_df()
82
+ try:
83
+ analysis = analyze_df(df)
84
+ except ImportError:
85
+ return {
86
+ 'analysis': {},
87
+ 'timestamp': time.time(),
88
+ 'error': 'To use this feature, please install the "dataprep_ml" package.'
89
+ }
83
90
 
84
91
  query_tables = [
85
92
  table.to_string() for table in get_query_tables(ast)
@@ -88,7 +95,7 @@ class QueryAnalysis(Resource):
88
95
  return {
89
96
  "analysis": analysis,
90
97
  "column_names": column_names,
91
- "row_count": len(result.data),
98
+ "row_count": len(result.result_set),
92
99
  "timestamp": time.time(),
93
100
  "tables": query_tables,
94
101
  }
@@ -107,6 +114,12 @@ class DataAnalysis(Resource):
107
114
  try:
108
115
  analysis = analyze_df(DataFrame(data, columns=column_names))
109
116
  return {"analysis": analysis, "timestamp": time.time()}
117
+ except ImportError:
118
+ return {
119
+ 'analysis': {},
120
+ 'timestamp': timestamp,
121
+ 'error': 'To use this feature, please install the "dataprep_ml" package.'
122
+ }
110
123
  except Exception as e:
111
124
  # Don't want analysis exceptions to show up on UI.
112
125
  # TODO: Fix analysis so it doesn't throw exceptions at all.
@@ -84,8 +84,14 @@ class File(Resource):
84
84
  parser.finalize()
85
85
  parser.close()
86
86
 
87
- if file_object is not None and not file_object.closed:
88
- file_object.close()
87
+ if file_object is not None:
88
+ if not file_object.closed:
89
+ try:
90
+ file_object.flush()
91
+ except (AttributeError, ValueError, OSError):
92
+ logger.debug("Failed to flush file_object before closing.", exc_info=True)
93
+ file_object.close()
94
+ file_object = None
89
95
  else:
90
96
  data = request.json
91
97
 
@@ -8,6 +8,7 @@ import mindsdb.utilities.hooks as hooks
8
8
  import mindsdb.utilities.profiler as profiler
9
9
  from mindsdb.api.http.utils import http_error
10
10
  from mindsdb.api.http.namespaces.configs.sql import ns_conf
11
+ from mindsdb.api.mysql.mysql_proxy.mysql_proxy import SQLAnswer
11
12
  from mindsdb.api.mysql.mysql_proxy.classes.fake_mysql_proxy import FakeMysqlProxy
12
13
  from mindsdb.api.executor.data_types.response_type import (
13
14
  RESPONSE_TYPE as SQL_RESPONSE_TYPE,
@@ -56,23 +57,8 @@ class Query(Resource):
56
57
  mysql_proxy = FakeMysqlProxy()
57
58
  mysql_proxy.set_context(context)
58
59
  try:
59
- result = mysql_proxy.process_query(query)
60
-
61
- if result.type == SQL_RESPONSE_TYPE.OK:
62
- query_response = {
63
- "type": SQL_RESPONSE_TYPE.OK,
64
- "affected_rows": result.affected_rows
65
- }
66
- elif result.type == SQL_RESPONSE_TYPE.TABLE:
67
- data = result.data.to_lists(json_types=True)
68
- query_response = {
69
- "type": SQL_RESPONSE_TYPE.TABLE,
70
- "data": data,
71
- "column_names": [
72
- x["alias"] or x["name"] if "alias" in x else x["name"]
73
- for x in result.columns
74
- ],
75
- }
60
+ result: SQLAnswer = mysql_proxy.process_query(query)
61
+ query_response: dict = result.dump_http_response()
76
62
  except ExecutorException as e:
77
63
  # classified error
78
64
  error_type = "expected"
@@ -134,7 +120,7 @@ class ListDatabases(Resource):
134
120
  listing_query = "SHOW DATABASES"
135
121
  mysql_proxy = FakeMysqlProxy()
136
122
  try:
137
- result = mysql_proxy.process_query(listing_query)
123
+ result: SQLAnswer = mysql_proxy.process_query(listing_query)
138
124
 
139
125
  # iterate over result.data and perform a query on each item to get the name of the tables
140
126
  if result.type == SQL_RESPONSE_TYPE.ERROR:
@@ -147,15 +133,15 @@ class ListDatabases(Resource):
147
133
  listing_query_response = {"type": "ok"}
148
134
  elif result.type == SQL_RESPONSE_TYPE.TABLE:
149
135
  listing_query_response = {
150
- "data": [
151
- {
152
- "name": x[0],
153
- "tables": mysql_proxy.process_query(
154
- "SHOW TABLES FROM `{}`".format(x[0])
155
- ).data,
156
- }
157
- for x in result.data
158
- ]
136
+ "data": [{
137
+ "name": db_row[0],
138
+ "tables": [
139
+ table_row[0]
140
+ for table_row in mysql_proxy.process_query(
141
+ "SHOW TABLES FROM `{}`".format(db_row[0])
142
+ ).result_set.to_lists()
143
+ ]
144
+ } for db_row in result.result_set.to_lists()]
159
145
  }
160
146
  except Exception as e:
161
147
  listing_query_response = {
@@ -94,7 +94,7 @@ class GetLeaf(Resource):
94
94
  } for key, val in schemas.items()]
95
95
  elif db['type'] == 'system':
96
96
  system_db = ca.database_controller.get_system_db(db_name)
97
- tables = system_db.get_tables()
97
+ tables = system_db.get_tree_tables()
98
98
  tables = [{
99
99
  'name': table.name,
100
100
  'class': table.kind,
mindsdb/api/http/start.py CHANGED
@@ -1,3 +1,6 @@
1
+ import gc
2
+ gc.disable()
3
+
1
4
  from flask import Flask
2
5
  from waitress import serve
3
6
 
@@ -8,6 +11,8 @@ from mindsdb.utilities.config import config
8
11
  from mindsdb.utilities.functions import init_lexer_parsers
9
12
  from mindsdb.integrations.libs.ml_exec_base import process_cache
10
13
 
14
+ gc.enable()
15
+
11
16
  logger = log.getLogger(__name__)
12
17
 
13
18
 
@@ -26,7 +31,7 @@ def start(verbose, no_studio, app: Flask = None):
26
31
  process_cache.init()
27
32
 
28
33
  if server_type == "waitress":
29
- logger.debug("Serving HTTP app with waitress..")
34
+ logger.debug("Serving HTTP app with waitress...")
30
35
  serve(
31
36
  app,
32
37
  host='*' if host in ('', '0.0.0.0') else host,
@@ -34,7 +39,7 @@ def start(verbose, no_studio, app: Flask = None):
34
39
  **server_config
35
40
  )
36
41
  elif server_type == "flask":
37
- logger.debug("Serving HTTP app with flask..")
42
+ logger.debug("Serving HTTP app with flask...")
38
43
  # that will 'disable access' log in console
39
44
 
40
45
  app.run(debug=False, port=port, host=host, **server_config)