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
@@ -14,12 +14,12 @@ from mindsdb.utilities.config import Config
14
14
 
15
15
  from googleapiclient.discovery import build
16
16
 
17
- from mindsdb.integrations.utilities.handlers.auth_utilities import GoogleUserOAuth2Manager
17
+ from mindsdb.integrations.utilities.handlers.auth_utilities.google import GoogleUserOAuth2Manager
18
18
 
19
19
  DEFAULT_SCOPES = [
20
- 'https://www.googleapis.com/auth/youtube',
21
- 'https://www.googleapis.com/auth/youtube.force-ssl',
22
- 'https://www.googleapis.com/auth/youtubepartner'
20
+ 'https://www.googleapis.com/auth/youtube',
21
+ 'https://www.googleapis.com/auth/youtube.force-ssl',
22
+ 'https://www.googleapis.com/auth/youtubepartner'
23
23
  ]
24
24
 
25
25
  logger = log.getLogger(__name__)
@@ -81,7 +81,7 @@ class YoutubeHandler(APIHandler):
81
81
  """
82
82
  if self.is_connected is True:
83
83
  return self.connection
84
-
84
+
85
85
  google_oauth2_manager = GoogleUserOAuth2Manager(self.handler_storage, self.scopes, self.credentials_file, self.credentials_url, self.connection_data.get('code'))
86
86
  creds = google_oauth2_manager.get_oauth2_credentials()
87
87
 
@@ -1,7 +1,6 @@
1
1
  from typing import List
2
2
 
3
3
  from mindsdb.integrations.libs.api_handler import APITable
4
- from mindsdb.integrations.utilities.sql_utils import extract_comparison_conditions
5
4
  from mindsdb.utilities import log
6
5
 
7
6
  from mindsdb_sql_parser import ast
@@ -61,21 +60,21 @@ class YoutubeCommentsTable(APITable):
61
60
 
62
61
  if not video_id and not channel_id:
63
62
  raise ValueError("Either video_id or channel_id has to be present in where clause.")
64
-
63
+
65
64
  comments_df = self.get_comments(video_id=video_id, channel_id=channel_id)
66
65
 
67
66
  select_statement_executor = SELECTQueryExecutor(
68
- comments_df,
69
- selected_columns,
70
- [where_condition for where_condition in where_conditions if where_condition[1] not in ['video_id', 'channel_id']],
71
- order_by_conditions,
67
+ comments_df,
68
+ selected_columns,
69
+ [where_condition for where_condition in where_conditions if where_condition[1] not in ['video_id', 'channel_id']],
70
+ order_by_conditions,
72
71
  result_limit if query.limit else None
73
72
  )
74
73
 
75
74
  comments_df = select_statement_executor.execute_query()
76
75
 
77
76
  return comments_df
78
-
77
+
79
78
  def insert(self, query: ast.Insert) -> None:
80
79
  """Inserts data into the YouTube POST /commentThreads API endpoint.
81
80
 
@@ -93,7 +92,7 @@ class YoutubeCommentsTable(APITable):
93
92
  ValueError
94
93
  If the query contains an unsupported condition
95
94
  """
96
-
95
+
97
96
  insert_query_parser = INSERTQueryParser(query, self.get_columns())
98
97
 
99
98
  values_to_insert = insert_query_parser.parse_query()
@@ -101,13 +100,13 @@ class YoutubeCommentsTable(APITable):
101
100
  for value in values_to_insert:
102
101
  if not value.get('comment_id'):
103
102
  if not value.get('comment'):
104
- raise ValueError(f"comment is mandatory for inserting a top-level comment.")
103
+ raise ValueError("comment is mandatory for inserting a top-level comment.")
105
104
  else:
106
105
  self.insert_comment(video_id=value['video_id'], text=value['comment'])
107
106
 
108
107
  else:
109
108
  if not value.get('reply'):
110
- raise ValueError(f"reply is mandatory for inserting a reply.")
109
+ raise ValueError("reply is mandatory for inserting a reply.")
111
110
  else:
112
111
  self.insert_comment(comment_id=value['comment_id'], text=value['reply'])
113
112
 
@@ -178,7 +177,7 @@ class YoutubeCommentsTable(APITable):
178
177
  replies = []
179
178
  if 'replies' in comment:
180
179
  for reply in comment["replies"]["comments"]:
181
- replies.append(
180
+ replies.append(
182
181
  {
183
182
  "reply_author": reply["snippet"]["authorDisplayName"],
184
183
  "user_id": reply["snippet"]["authorChannelId"]["value"],
@@ -225,7 +224,7 @@ class YoutubeCommentsTable(APITable):
225
224
 
226
225
  youtube_comments_df = pd.json_normalize(data, 'replies', ['comment_id', 'channel_id', 'video_id', 'user_id', 'display_name', 'comment', "published_at", "updated_at"], record_prefix='replies.')
227
226
  youtube_comments_df = youtube_comments_df.rename(columns={'replies.user_id': 'reply_user_id', 'replies.reply_author': 'reply_author', 'replies.reply': 'reply'})
228
-
227
+
229
228
  # check if DataFrame is empty
230
229
  if youtube_comments_df.empty:
231
230
  return youtube_comments_df
@@ -262,10 +261,10 @@ class YoutubeChannelsTable(APITable):
262
261
  channel_df = self.get_channel_details(channel_id)
263
262
 
264
263
  select_statement_executor = SELECTQueryExecutor(
265
- channel_df,
266
- selected_columns,
267
- [where_condition for where_condition in where_conditions if where_condition[1] == 'channel_id'],
268
- order_by_conditions,
264
+ channel_df,
265
+ selected_columns,
266
+ [where_condition for where_condition in where_conditions if where_condition[1] == 'channel_id'],
267
+ order_by_conditions,
269
268
  result_limit if query.limit else None
270
269
  )
271
270
 
@@ -325,7 +324,7 @@ class YoutubeVideosTable(APITable):
325
324
  video_id = arg2
326
325
  else:
327
326
  raise NotImplementedError("Only '=' operator is supported for video_id column.")
328
-
327
+
329
328
  elif arg1 == "channel_id":
330
329
  if op == "=":
331
330
  channel_id = arg2
@@ -334,24 +333,24 @@ class YoutubeVideosTable(APITable):
334
333
 
335
334
  if not video_id and not channel_id:
336
335
  raise ValueError("Either video_id or channel_id has to be present in where clause.")
337
-
336
+
338
337
  if video_id:
339
338
  video_df = self.get_videos_by_video_ids([video_id])
340
339
  else:
341
340
  video_df = self.get_videos_by_channel_id(channel_id)
342
341
 
343
342
  select_statement_executor = SELECTQueryExecutor(
344
- video_df,
345
- selected_columns,
346
- [where_condition for where_condition in where_conditions if where_condition[1] not in ['video_id', 'channel_id']],
347
- order_by_conditions,
343
+ video_df,
344
+ selected_columns,
345
+ [where_condition for where_condition in where_conditions if where_condition[1] not in ['video_id', 'channel_id']],
346
+ order_by_conditions,
348
347
  result_limit if query.limit else None
349
348
  )
350
349
 
351
350
  video_df = select_statement_executor.execute_query()
352
351
 
353
352
  return video_df
354
-
353
+
355
354
  def get_videos_by_channel_id(self, channel_id):
356
355
  video_ids = []
357
356
  resource = (
@@ -389,7 +388,7 @@ class YoutubeVideosTable(APITable):
389
388
  # loop over 50 video ids at a time
390
389
  # an invalid request error is caused otherwise
391
390
  for i in range(0, len(video_ids), 50):
392
- resource = self.handler.connect().videos().list(part="statistics,snippet,contentDetails", id=",".join(video_ids[i:i+50])).execute()
391
+ resource = self.handler.connect().videos().list(part="statistics,snippet,contentDetails", id=",".join(video_ids[i:i + 50])).execute()
393
392
  for item in resource["items"]:
394
393
  data.append(
395
394
  {
@@ -418,15 +417,15 @@ class YoutubeVideosTable(APITable):
418
417
  except Exception as e:
419
418
  logger.error(f"Encountered an error while fetching transcripts for video ${video_id}: ${e}"),
420
419
  return "Transcript not available for this video"
421
-
420
+
422
421
  def parse_duration(self, video_id, duration):
423
422
  try:
424
- parsed_duration = re.search(f"PT(\d+H)?(\d+M)?(\d+S)", duration).groups()
423
+ parsed_duration = re.search(r"PT(\d+H)?(\d+M)?(\d+S)", duration).groups()
425
424
  duration_str = ""
426
425
  for d in parsed_duration:
427
426
  if d:
428
427
  duration_str += f"{d[:-1]}:"
429
-
428
+
430
429
  return duration_str.strip(":")
431
430
  except Exception as e:
432
431
  logger.error(f"Encountered an error while parsing duration for video ${video_id}: ${e}"),
@@ -35,7 +35,7 @@ class YugabyteHandlerTest(unittest.TestCase):
35
35
  def test_4_get_tables(self):
36
36
  tables = self.handler.get_tables()
37
37
  assert tables.type is not RESPONSE_TYPE.ERROR
38
-
38
+
39
39
  def test_5_select_query(self):
40
40
  query = "SELECT * FROM PREM;"
41
41
  result = self.handler.native_query(query)
@@ -44,6 +44,6 @@ class YugabyteHandlerTest(unittest.TestCase):
44
44
  def test_6_check_connection(self):
45
45
  self.handler.check_connection()
46
46
 
47
-
47
+
48
48
  if __name__ == '__main__':
49
- unittest.main()
49
+ unittest.main()
@@ -1,10 +1,4 @@
1
1
  from collections import OrderedDict
2
- from typing import Optional
3
-
4
- from mindsdb_sql_parser import parse_sql
5
- from mindsdb_sql_parser.ast.base import ASTNode
6
- from mindsdb.utilities.render.sqlalchemy_render import SqlalchemyRender
7
- from pandas import DataFrame
8
2
 
9
3
  from mindsdb.integrations.handlers.postgres_handler.postgres_handler import (
10
4
  PostgresHandler,
@@ -6,6 +6,7 @@ import pandas
6
6
 
7
7
  from mindsdb.utilities import log
8
8
  from mindsdb.api.executor.data_types.response_type import RESPONSE_TYPE
9
+ from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
9
10
  from mindsdb_sql_parser.ast import ASTNode
10
11
 
11
12
 
@@ -18,29 +19,32 @@ class _INFORMATION_SCHEMA_COLUMNS_NAMES:
18
19
  These column names match the standard INFORMATION_SCHEMA.COLUMNS structure
19
20
  used in SQL databases to describe table metadata.
20
21
  """
21
- COLUMN_NAME: str = 'COLUMN_NAME'
22
- DATA_TYPE: str = 'DATA_TYPE'
23
- ORDINAL_POSITION: str = 'ORDINAL_POSITION'
24
- COLUMN_DEFAULT: str = 'COLUMN_DEFAULT'
25
- IS_NULLABLE: str = 'IS_NULLABLE'
26
- CHARACTER_MAXIMUM_LENGTH: str = 'CHARACTER_MAXIMUM_LENGTH'
27
- CHARACTER_OCTET_LENGTH: str = 'CHARACTER_OCTET_LENGTH'
28
- NUMERIC_PRECISION: str = 'NUMERIC_PRECISION'
29
- NUMERIC_SCALE: str = 'NUMERIC_SCALE'
30
- DATETIME_PRECISION: str = 'DATETIME_PRECISION'
31
- CHARACTER_SET_NAME: str = 'CHARACTER_SET_NAME'
32
- COLLATION_NAME: str = 'COLLATION_NAME'
33
- MYSQL_DATA_TYPE: str = 'MYSQL_DATA_TYPE'
22
+
23
+ COLUMN_NAME: str = "COLUMN_NAME"
24
+ DATA_TYPE: str = "DATA_TYPE"
25
+ ORDINAL_POSITION: str = "ORDINAL_POSITION"
26
+ COLUMN_DEFAULT: str = "COLUMN_DEFAULT"
27
+ IS_NULLABLE: str = "IS_NULLABLE"
28
+ CHARACTER_MAXIMUM_LENGTH: str = "CHARACTER_MAXIMUM_LENGTH"
29
+ CHARACTER_OCTET_LENGTH: str = "CHARACTER_OCTET_LENGTH"
30
+ NUMERIC_PRECISION: str = "NUMERIC_PRECISION"
31
+ NUMERIC_SCALE: str = "NUMERIC_SCALE"
32
+ DATETIME_PRECISION: str = "DATETIME_PRECISION"
33
+ CHARACTER_SET_NAME: str = "CHARACTER_SET_NAME"
34
+ COLLATION_NAME: str = "COLLATION_NAME"
35
+ MYSQL_DATA_TYPE: str = "MYSQL_DATA_TYPE"
34
36
 
35
37
 
36
38
  INF_SCHEMA_COLUMNS_NAMES = _INFORMATION_SCHEMA_COLUMNS_NAMES()
37
39
  INF_SCHEMA_COLUMNS_NAMES_SET = set(f.name for f in fields(INF_SCHEMA_COLUMNS_NAMES))
38
40
 
39
41
 
40
-
41
42
  class HandlerResponse:
42
- def __init__(self, resp_type: RESPONSE_TYPE, data_frame: pandas.DataFrame = None, query: ASTNode = 0, error_code: int = 0,
43
- error_message: str | None = None, affected_rows: int | None = None) -> None:
43
+ def __init__(
44
+ self, resp_type: RESPONSE_TYPE, data_frame: pandas.DataFrame = None, query: ASTNode = 0,
45
+ error_code: int = 0, error_message: str | None = None, affected_rows: int | None = None,
46
+ mysql_types: list[MYSQL_DATA_TYPE] | None = None
47
+ ) -> None:
44
48
  self.resp_type = resp_type
45
49
  self.query = query
46
50
  self.data_frame = data_frame
@@ -49,6 +53,7 @@ class HandlerResponse:
49
53
  self.affected_rows = affected_rows
50
54
  if isinstance(self.affected_rows, int) is False or self.affected_rows < 0:
51
55
  self.affected_rows = 0
56
+ self.mysql_types = mysql_types
52
57
 
53
58
  @property
54
59
  def type(self):
@@ -66,7 +71,9 @@ class HandlerResponse:
66
71
  f"Cannot convert {self.resp_type} to {RESPONSE_TYPE.COLUMNS_TABLE}, "
67
72
  f"the error is: {self.error_message}"
68
73
  )
69
- raise ValueError(f"Cannot convert {self.resp_type} to {RESPONSE_TYPE.COLUMNS_TABLE}")
74
+ raise ValueError(
75
+ f"Cannot convert {self.resp_type} to {RESPONSE_TYPE.COLUMNS_TABLE}"
76
+ )
70
77
 
71
78
  self.data_frame.columns = [name.upper() for name in self.data_frame.columns]
72
79
  self.data_frame[INF_SCHEMA_COLUMNS_NAMES.MYSQL_DATA_TYPE] = self.data_frame[
@@ -77,24 +84,26 @@ class HandlerResponse:
77
84
  current_columns_set = set(self.data_frame.columns)
78
85
  if INF_SCHEMA_COLUMNS_NAMES_SET != current_columns_set:
79
86
  raise ValueError(
80
- f'Columns set for INFORMATION_SCHEMA.COLUMNS is wrong: {list(current_columns_set)}'
87
+ f"Columns set for INFORMATION_SCHEMA.COLUMNS is wrong: {list(current_columns_set)}"
81
88
  )
82
89
  # endregion
83
90
 
84
- self.data_frame = self.data_frame.astype({
85
- INF_SCHEMA_COLUMNS_NAMES.COLUMN_NAME: 'string',
86
- INF_SCHEMA_COLUMNS_NAMES.DATA_TYPE: 'string',
87
- INF_SCHEMA_COLUMNS_NAMES.ORDINAL_POSITION: 'Int32',
88
- INF_SCHEMA_COLUMNS_NAMES.COLUMN_DEFAULT: 'string',
89
- INF_SCHEMA_COLUMNS_NAMES.IS_NULLABLE: 'string',
90
- INF_SCHEMA_COLUMNS_NAMES.CHARACTER_MAXIMUM_LENGTH: 'Int32',
91
- INF_SCHEMA_COLUMNS_NAMES.CHARACTER_OCTET_LENGTH: 'Int32',
92
- INF_SCHEMA_COLUMNS_NAMES.NUMERIC_PRECISION: 'Int32',
93
- INF_SCHEMA_COLUMNS_NAMES.NUMERIC_SCALE: 'Int32',
94
- INF_SCHEMA_COLUMNS_NAMES.DATETIME_PRECISION: 'Int32',
95
- INF_SCHEMA_COLUMNS_NAMES.CHARACTER_SET_NAME: 'string',
96
- INF_SCHEMA_COLUMNS_NAMES.COLLATION_NAME: 'string',
97
- })
91
+ self.data_frame = self.data_frame.astype(
92
+ {
93
+ INF_SCHEMA_COLUMNS_NAMES.COLUMN_NAME: "string",
94
+ INF_SCHEMA_COLUMNS_NAMES.DATA_TYPE: "string",
95
+ INF_SCHEMA_COLUMNS_NAMES.ORDINAL_POSITION: "Int32",
96
+ INF_SCHEMA_COLUMNS_NAMES.COLUMN_DEFAULT: "string",
97
+ INF_SCHEMA_COLUMNS_NAMES.IS_NULLABLE: "string",
98
+ INF_SCHEMA_COLUMNS_NAMES.CHARACTER_MAXIMUM_LENGTH: "Int32",
99
+ INF_SCHEMA_COLUMNS_NAMES.CHARACTER_OCTET_LENGTH: "Int32",
100
+ INF_SCHEMA_COLUMNS_NAMES.NUMERIC_PRECISION: "Int32",
101
+ INF_SCHEMA_COLUMNS_NAMES.NUMERIC_SCALE: "Int32",
102
+ INF_SCHEMA_COLUMNS_NAMES.DATETIME_PRECISION: "Int32",
103
+ INF_SCHEMA_COLUMNS_NAMES.CHARACTER_SET_NAME: "string",
104
+ INF_SCHEMA_COLUMNS_NAMES.COLLATION_NAME: "string",
105
+ }
106
+ )
98
107
  self.data_frame.replace([numpy.NaN, pandas.NA], None, inplace=True)
99
108
 
100
109
  self.resp_type = RESPONSE_TYPE.COLUMNS_TABLE
@@ -103,33 +112,39 @@ class HandlerResponse:
103
112
  try:
104
113
  data = None
105
114
  if self.data_frame is not None:
106
- data = self.data_frame.to_json(orient="split", index=False, date_format="iso")
115
+ data = self.data_frame.to_json(
116
+ orient="split", index=False, date_format="iso"
117
+ )
107
118
  except Exception as e:
108
119
  logger.error("%s.to_json: error - %s", self.__class__.__name__, e)
109
120
  data = None
110
- return {"type": self.resp_type,
111
- "query": self.query,
112
- "data_frame": data,
113
- "error_code": self.error_code,
114
- "error": self.error_message}
121
+ return {
122
+ "type": self.resp_type,
123
+ "query": self.query,
124
+ "data_frame": data,
125
+ "error_code": self.error_code,
126
+ "error": self.error_message,
127
+ }
115
128
 
116
129
  def __repr__(self):
117
- return "%s: resp_type=%s, query=%s, data_frame=%s, err_code=%s, error=%s, affected_rows=%s" % (
118
- self.__class__.__name__,
119
- self.resp_type,
120
- self.query,
121
- self.data_frame,
122
- self.error_code,
123
- self.error_message,
124
- self.affected_rows
125
- )
130
+ return "%s: resp_type=%s, query=%s, data_frame=\n%s\nerr_code=%s, error=%s, affected_rows=%s" % (
131
+ self.__class__.__name__,
132
+ self.resp_type,
133
+ self.query,
134
+ self.data_frame,
135
+ self.error_code,
136
+ self.error_message,
137
+ self.affected_rows,
138
+ )
126
139
 
127
140
 
128
141
  class HandlerStatusResponse:
129
- def __init__(self, success: bool = True,
130
- error_message: str = None,
131
- redirect_url: str = None,
132
- copy_storage: str = None
142
+ def __init__(
143
+ self,
144
+ success: bool = True,
145
+ error_message: str = None,
146
+ redirect_url: str = None,
147
+ copy_storage: str = None,
133
148
  ) -> None:
134
149
  self.success = success
135
150
  self.error_message = error_message
@@ -139,7 +154,7 @@ class HandlerStatusResponse:
139
154
  def to_json(self):
140
155
  data = {"success": self.success, "error": self.error_message}
141
156
  if self.redirect_url is not None:
142
- data['redirect_url'] = self.redirect_url
157
+ data["redirect_url"] = self.redirect_url
143
158
  return data
144
159
 
145
160
  def __repr__(self):
@@ -553,3 +553,9 @@ class VectorStoreHandler(BaseHandler):
553
553
  df(pd.DataFrame): Hybrid search result, sorted by hybrid search rank
554
554
  '''
555
555
  raise NotImplementedError(f'Hybrid search not supported for VectorStoreHandler {self.name}')
556
+
557
+ def create_index(self, *args, **kwargs):
558
+ """
559
+ Create an index on the specified table.
560
+ """
561
+ raise NotImplementedError(f'create_index not supported for VectorStoreHandler {self.name}')
@@ -9,8 +9,6 @@ from typing import List
9
9
  import filetype
10
10
  import pandas as pd
11
11
  from charset_normalizer import from_bytes
12
- from langchain_text_splitters import RecursiveCharacterTextSplitter
13
- import fitz # pymupdf
14
12
 
15
13
  from mindsdb.utilities import log
16
14
 
@@ -298,6 +296,8 @@ class FileReader(FormatDetector):
298
296
 
299
297
  @staticmethod
300
298
  def read_txt(file_obj: BytesIO, name=None, **kwargs):
299
+ # the lib is heavy, so import it only when needed
300
+ from langchain_text_splitters import RecursiveCharacterTextSplitter
301
301
  file_obj = decode(file_obj)
302
302
 
303
303
  try:
@@ -326,6 +326,9 @@ class FileReader(FormatDetector):
326
326
 
327
327
  @staticmethod
328
328
  def read_pdf(file_obj: BytesIO, name=None, **kwargs):
329
+ # the libs are heavy, so import it only when needed
330
+ import fitz # pymupdf
331
+ from langchain_text_splitters import RecursiveCharacterTextSplitter
329
332
 
330
333
  with fitz.open(stream=file_obj.read()) as pdf: # open pdf
331
334
  text = chr(12).join([page.get_text() for page in pdf])
@@ -43,6 +43,11 @@ def get_api_key(
43
43
  if f"{api_name.lower()}_api_key" in create_args:
44
44
  return create_args[f"{api_name.lower()}_api_key"]
45
45
 
46
+ # 2.5 - Check in params dictionary if it exists (for agents)
47
+ if "params" in create_args and create_args["params"] is not None:
48
+ if f"{api_name.lower()}_api_key" in create_args["params"]:
49
+ return create_args["params"][f"{api_name.lower()}_api_key"]
50
+
46
51
  # 3
47
52
  if engine_storage is not None:
48
53
  connection_args = engine_storage.get_connection_args()
@@ -68,7 +73,14 @@ def get_api_key(
68
73
  return create_args['api_keys'][api_name]
69
74
 
70
75
  if strict:
71
- raise Exception(
72
- f"Missing API key '{api_name.lower()}_api_key'. Either re-create this ML_ENGINE specifying the '{api_name.lower()}_api_key' parameter, or re-create this model and pass the API key with `USING` syntax."
73
- ) # noqa
76
+ provider_upper = api_name.upper()
77
+ api_key_env_var = f"{provider_upper}_API_KEY"
78
+ api_key_arg = f"{api_name.lower()}_api_key"
79
+ error_message = (
80
+ f"API key for {api_name} not found. Please provide it using one of the following methods:\n"
81
+ f"1. Set the {api_key_env_var} environment variable\n"
82
+ f"2. Provide it as '{api_key_arg}' parameter when creating an agent using the CREATE AGENT syntax\n"
83
+ f" Example: CREATE AGENT my_agent USING model='gpt-4', provider='{api_name}', {api_key_arg}='your-api-key';\n"
84
+ )
85
+ raise Exception(error_message)
74
86
  return None
@@ -1 +0,0 @@
1
- from .microsoft import MSGraphAPIBaseClient
@@ -1,2 +0,0 @@
1
- from .google import GoogleUserOAuth2Manager, GoogleServiceAccountOAuth2Manager
2
- from .microsoft import MSGraphAPIApplicationPermissionsManager, MSGraphAPIDelegatedPermissionsManager
@@ -8,7 +8,7 @@ def format_exception_error(exception):
8
8
  exception_type, _exception_object, exception_traceback = sys.exc_info()
9
9
  filename = exception_traceback.tb_frame.f_code.co_filename
10
10
  line_number = exception_traceback.tb_lineno
11
- error_message = f'{exception_type.__name__}: {exception}, raised at: {filename}#{line_number}'
11
+ error_message = f"{exception_type.__name__}: {exception}, raised at: {filename}#{line_number}"
12
12
  except Exception:
13
13
  error_message = str(exception)
14
14
  return error_message
@@ -26,7 +26,7 @@ def dict_to_yaml(d, indent=0):
26
26
 
27
27
 
28
28
  # Mocks won't always have 'name' attribute.
29
- def get_class_name(instance: Any, default: str = 'unknown'):
30
- if hasattr(instance.__class__, 'name'):
29
+ def get_class_name(instance: Any, default: str = "unknown"):
30
+ if hasattr(instance.__class__, "name"):
31
31
  return instance.__class__.name
32
32
  return default