MindsDB 25.5.3.0__py3-none-any.whl → 25.5.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (313) hide show
  1. mindsdb/__about__.py +8 -8
  2. mindsdb/__main__.py +127 -79
  3. mindsdb/api/a2a/__init__.py +0 -0
  4. mindsdb/api/a2a/__main__.py +144 -0
  5. mindsdb/api/a2a/agent.py +308 -0
  6. mindsdb/api/a2a/common/__init__.py +0 -0
  7. mindsdb/api/a2a/common/server/__init__.py +4 -0
  8. mindsdb/api/a2a/common/server/server.py +164 -0
  9. mindsdb/api/a2a/common/server/task_manager.py +287 -0
  10. mindsdb/api/a2a/common/server/utils.py +28 -0
  11. mindsdb/api/a2a/common/types.py +365 -0
  12. mindsdb/api/a2a/constants.py +9 -0
  13. mindsdb/api/a2a/run_a2a.py +86 -0
  14. mindsdb/api/a2a/task_manager.py +560 -0
  15. mindsdb/api/executor/command_executor.py +185 -309
  16. mindsdb/api/executor/datahub/classes/response.py +5 -2
  17. mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
  18. mindsdb/api/executor/planner/query_planner.py +10 -1
  19. mindsdb/api/executor/sql_query/result_set.py +185 -52
  20. mindsdb/api/executor/sql_query/sql_query.py +1 -1
  21. mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
  22. mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
  23. mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
  24. mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
  25. mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
  26. mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
  27. mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
  28. mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
  29. mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
  30. mindsdb/api/http/initialize.py +99 -83
  31. mindsdb/api/http/namespaces/analysis.py +3 -3
  32. mindsdb/api/http/namespaces/config.py +61 -86
  33. mindsdb/api/http/namespaces/file.py +8 -2
  34. mindsdb/api/http/namespaces/sql.py +13 -27
  35. mindsdb/api/mcp/start.py +42 -5
  36. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
  37. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
  38. mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
  39. mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
  40. mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
  41. mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
  42. mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
  43. mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
  44. mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
  45. mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
  46. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
  47. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
  48. mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
  49. mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
  50. mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
  51. mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
  52. mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
  53. mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
  54. mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
  55. mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
  56. mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
  57. mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
  58. mindsdb/integrations/handlers/byom_handler/requirements.txt +1 -2
  59. mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
  60. mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
  61. mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
  62. mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
  63. mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
  64. mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
  65. mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
  66. mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
  67. mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
  68. mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
  69. mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
  70. mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
  71. mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
  72. mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
  73. mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
  74. mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
  75. mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
  76. mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
  77. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
  78. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
  79. mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
  80. mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
  81. mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
  82. mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
  83. mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
  84. mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
  85. mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
  86. mindsdb/integrations/handlers/email_handler/settings.py +0 -1
  87. mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
  88. mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
  89. mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
  90. mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
  91. mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
  92. mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
  93. mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
  94. mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
  95. mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
  96. mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
  97. mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
  98. mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
  99. mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
  100. mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
  101. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
  102. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
  103. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
  104. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
  105. mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
  106. mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
  107. mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
  108. mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
  109. mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
  110. mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
  111. mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
  112. mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
  113. mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
  114. mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
  115. mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
  116. mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
  117. mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
  118. mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
  119. mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
  120. mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
  121. mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
  122. mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
  123. mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
  124. mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
  125. mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
  126. mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
  127. mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
  128. mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
  129. mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
  130. mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
  131. mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
  132. mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
  133. mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
  134. mindsdb/integrations/handlers/lancedb_handler/requirements.txt +0 -1
  135. mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
  136. mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
  137. mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
  138. mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
  139. mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
  140. mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
  141. mindsdb/integrations/handlers/litellm_handler/litellm_handler.py +37 -20
  142. mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
  143. mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
  144. mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
  145. mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
  146. mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
  147. mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
  148. mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
  149. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
  150. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
  151. mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
  152. mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
  153. mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
  154. mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
  155. mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
  156. mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
  157. mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
  158. mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
  159. mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
  160. mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
  161. mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
  162. mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
  163. mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
  164. mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
  165. mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
  166. mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
  167. mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
  168. mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
  169. mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
  170. mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
  171. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
  172. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
  173. mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
  174. mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
  175. mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
  176. mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
  177. mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
  178. mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
  179. mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
  180. mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
  181. mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
  182. mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
  183. mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
  184. mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
  185. mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
  186. mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
  187. mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
  188. mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
  189. mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
  190. mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
  191. mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
  192. mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
  193. mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
  194. mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
  195. mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
  196. mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
  197. mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
  198. mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
  199. mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
  200. mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
  201. mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
  202. mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
  203. mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
  204. mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
  205. mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
  206. mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
  207. mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
  208. mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
  209. mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
  210. mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
  211. mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
  212. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
  213. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
  214. mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
  215. mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
  216. mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
  217. mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
  218. mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
  219. mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
  220. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
  221. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
  222. mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
  223. mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
  224. mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
  225. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
  226. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
  227. mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
  228. mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
  229. mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
  230. mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
  231. mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
  232. mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
  233. mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
  234. mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
  235. mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
  236. mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
  237. mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
  238. mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
  239. mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
  240. mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
  241. mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
  242. mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
  243. mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
  244. mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
  245. mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
  246. mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
  247. mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
  248. mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
  249. mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
  250. mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
  251. mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
  252. mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
  253. mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
  254. mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
  255. mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
  256. mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
  257. mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
  258. mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
  259. mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
  260. mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
  261. mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
  262. mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
  263. mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
  264. mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
  265. mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
  266. mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
  267. mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
  268. mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
  269. mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
  270. mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
  271. mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
  272. mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
  273. mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
  274. mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
  275. mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
  276. mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
  277. mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
  278. mindsdb/integrations/libs/llm/config.py +13 -0
  279. mindsdb/integrations/libs/llm/utils.py +37 -65
  280. mindsdb/integrations/libs/response.py +67 -52
  281. mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
  282. mindsdb/integrations/utilities/handler_utils.py +15 -3
  283. mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
  284. mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
  285. mindsdb/integrations/utilities/rag/rerankers/base_reranker.py +230 -227
  286. mindsdb/integrations/utilities/utils.py +3 -3
  287. mindsdb/interfaces/agents/agents_controller.py +164 -1
  288. mindsdb/interfaces/agents/constants.py +32 -13
  289. mindsdb/interfaces/agents/langchain_agent.py +106 -95
  290. mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
  291. mindsdb/interfaces/knowledge_base/controller.py +250 -216
  292. mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
  293. mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
  294. mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
  295. mindsdb/interfaces/query_context/context_controller.py +66 -10
  296. mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
  297. mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
  298. mindsdb/interfaces/skills/skill_tool.py +202 -57
  299. mindsdb/interfaces/skills/sql_agent.py +205 -17
  300. mindsdb/interfaces/storage/fs.py +1 -0
  301. mindsdb/interfaces/variables/__init__.py +0 -0
  302. mindsdb/interfaces/variables/variables_controller.py +97 -0
  303. mindsdb/migrations/env.py +5 -7
  304. mindsdb/migrations/migrate.py +47 -7
  305. mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
  306. mindsdb/utilities/config.py +287 -216
  307. mindsdb/utilities/starters.py +13 -0
  308. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/METADATA +646 -698
  309. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/RECORD +312 -295
  310. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/WHEEL +1 -1
  311. mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
  312. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/licenses/LICENSE +0 -0
  313. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/top_level.txt +0 -0
@@ -45,14 +45,10 @@ def create_data_dir(path: Path) -> None:
45
45
  try:
46
46
  path.mkdir(mode=0o777, exist_ok=True, parents=True)
47
47
  except Exception as e:
48
- raise Exception(
49
- "MindsDB storage directory could not be created"
50
- ) from e
48
+ raise Exception("MindsDB storage directory could not be created") from e
51
49
 
52
50
  if not os.access(path, os.W_OK):
53
- raise PermissionError(
54
- f"The directory is not allowed for writing: {path}"
55
- )
51
+ raise PermissionError(f"The directory is not allowed for writing: {path}")
56
52
 
57
53
 
58
54
  class Config:
@@ -79,7 +75,8 @@ class Config:
79
75
  _cmd_args (argparse.Namespace): cmd args
80
76
  use_docker_env (bool): is the app run in docker env
81
77
  """
82
- __instance: 'Config' = None
78
+
79
+ __instance: "Config" = None
83
80
 
84
81
  _config: dict = None
85
82
  _user_config: dict = None
@@ -91,11 +88,10 @@ class Config:
91
88
  auto_config_path: Path = None
92
89
  auto_config_mtime: float = 0
93
90
  _cmd_args: argparse.Namespace = None
94
- use_docker_env: bool = os.environ.get('MINDSDB_DOCKER_ENV', False) is not False
91
+ use_docker_env: bool = os.environ.get("MINDSDB_DOCKER_ENV", False) is not False
95
92
 
96
- def __new__(cls, *args, **kwargs) -> 'Config':
97
- """Make class singletone and initialize config.
98
- """
93
+ def __new__(cls, *args, **kwargs) -> "Config":
94
+ """Make class singletone and initialize config."""
99
95
  if cls.__instance is not None:
100
96
  return cls.__instance
101
97
 
@@ -106,15 +102,12 @@ class Config:
106
102
 
107
103
  # region determine root path
108
104
  if self.storage_root_path is None:
109
- if isinstance(os.environ.get('MINDSDB_STORAGE_DIR'), str):
110
- self.storage_root_path = os.environ['MINDSDB_STORAGE_DIR']
111
- elif 'root' in self._user_config.get('paths', {}):
112
- self.storage_root_path = self.user_config['paths']['root']
105
+ if isinstance(os.environ.get("MINDSDB_STORAGE_DIR"), str):
106
+ self.storage_root_path = os.environ["MINDSDB_STORAGE_DIR"]
107
+ elif "root" in self._user_config.get("paths", {}):
108
+ self.storage_root_path = self.user_config["paths"]["root"]
113
109
  else:
114
- self.storage_root_path = os.path.join(
115
- user_data_dir("mindsdb", "mindsdb"),
116
- "var/"
117
- )
110
+ self.storage_root_path = os.path.join(user_data_dir("mindsdb", "mindsdb"), "var/")
118
111
  self.storage_root_path = Path(self.storage_root_path)
119
112
  create_data_dir(self.storage_root_path)
120
113
  # endregion
@@ -122,49 +115,45 @@ class Config:
122
115
  # region prepare default config
123
116
  api_host = "127.0.0.1" if not self.use_docker_env else "0.0.0.0"
124
117
  self._default_config = {
125
- 'permanent_storage': {
126
- 'location': 'absent'
127
- },
118
+ "permanent_storage": {"location": "absent"},
128
119
  "storage_db": (
129
- 'sqlite:///'
130
- + str(self.storage_root_path / 'mindsdb.sqlite3.db')
131
- + '?check_same_thread=False&timeout=30'
120
+ "sqlite:///"
121
+ + str(self.storage_root_path / "mindsdb.sqlite3.db")
122
+ + "?check_same_thread=False&timeout=30"
132
123
  ),
133
- 'paths': {
134
- 'root': self.storage_root_path,
135
- 'content': self.storage_root_path / 'content',
136
- 'storage': self.storage_root_path / 'storage',
137
- 'static': self.storage_root_path / 'static',
138
- 'tmp': self.storage_root_path / 'tmp',
139
- 'log': self.storage_root_path / 'log',
140
- 'cache': self.storage_root_path / 'cache',
141
- 'locks': self.storage_root_path / 'locks',
124
+ "paths": {
125
+ "root": self.storage_root_path,
126
+ "content": self.storage_root_path / "content",
127
+ "storage": self.storage_root_path / "storage",
128
+ "static": self.storage_root_path / "static",
129
+ "tmp": self.storage_root_path / "tmp",
130
+ "log": self.storage_root_path / "log",
131
+ "cache": self.storage_root_path / "cache",
132
+ "locks": self.storage_root_path / "locks",
142
133
  },
143
- 'auth': {
144
- 'http_auth_enabled': False,
134
+ "auth": {
135
+ "http_auth_enabled": False,
145
136
  "http_permanent_session_lifetime": datetime.timedelta(days=31),
146
137
  "username": "mindsdb",
147
- "password": ""
138
+ "password": "",
148
139
  },
149
140
  "logging": {
150
141
  "handlers": {
151
142
  "console": {
152
143
  "enabled": True,
153
144
  "formatter": "default",
154
- "level": "INFO" # MINDSDB_CONSOLE_LOG_LEVEL or MINDSDB_LOG_LEVEL (obsolete)
145
+ "level": "INFO", # MINDSDB_CONSOLE_LOG_LEVEL or MINDSDB_LOG_LEVEL (obsolete)
155
146
  },
156
147
  "file": {
157
148
  "enabled": False,
158
- "level": "INFO", # MINDSDB_FILE_LOG_LEVEL
149
+ "level": "INFO", # MINDSDB_FILE_LOG_LEVEL
159
150
  "filename": "app.log",
160
- "maxBytes": 1 << 19, # 0.5 Mb
161
- "backupCount": 3
162
- }
151
+ "maxBytes": 1 << 19, # 0.5 Mb
152
+ "backupCount": 3,
153
+ },
163
154
  }
164
155
  },
165
- "gui": {
166
- "autoupdate": True
167
- },
156
+ "gui": {"autoupdate": True},
168
157
  "debug": False,
169
158
  "environment": "local",
170
159
  "integrations": {},
@@ -176,13 +165,13 @@ class Config:
176
165
  "max_restart_count": 1,
177
166
  "max_restart_interval_seconds": 60,
178
167
  "server": {
179
- "type": "waitress", # MINDSDB_HTTP_SERVER_TYPE MINDSDB_DEFAULT_SERVER
168
+ "type": "waitress", # MINDSDB_HTTP_SERVER_TYPE MINDSDB_DEFAULT_SERVER
180
169
  "config": {
181
170
  "threads": 16,
182
- "max_request_body_size": (1 << 30) * 10, # 10GB
183
- "inbuf_overflow": (1 << 30) * 10
184
- }
185
- }
171
+ "max_request_body_size": (1 << 30) * 10, # 10GB
172
+ "inbuf_overflow": (1 << 30) * 10,
173
+ },
174
+ },
186
175
  },
187
176
  "mysql": {
188
177
  "host": api_host,
@@ -191,57 +180,51 @@ class Config:
191
180
  "ssl": True,
192
181
  "restart_on_failure": True,
193
182
  "max_restart_count": 1,
194
- "max_restart_interval_seconds": 60
195
- },
196
- "mongodb": {
197
- "host": api_host,
198
- "port": "47336",
199
- "database": "mindsdb"
200
- },
201
- "postgres": {
202
- "host": api_host,
203
- "port": "55432",
204
- "database": "mindsdb"
183
+ "max_restart_interval_seconds": 60,
205
184
  },
185
+ "mongodb": {"host": api_host, "port": "47336", "database": "mindsdb"},
186
+ "postgres": {"host": api_host, "port": "55432", "database": "mindsdb"},
206
187
  "mcp": {
207
188
  "host": api_host,
208
189
  "port": "47337",
209
190
  "enabled": True,
210
191
  "restart_on_failure": True,
211
192
  "max_restart_count": 1,
212
- "max_restart_interval_seconds": 60
193
+ "max_restart_interval_seconds": 60,
213
194
  },
214
195
  "litellm": {
215
196
  "host": "0.0.0.0", # API server binds to all interfaces by default
216
- "port": "8000"
217
- }
218
- },
219
- "cache": {
220
- "type": "local"
221
- },
222
- 'ml_task_queue': {
223
- 'type': 'local'
197
+ "port": "8000",
198
+ },
224
199
  },
200
+ "cache": {"type": "local"},
201
+ "ml_task_queue": {"type": "local"},
225
202
  "file_upload_domains": [],
226
203
  "web_crawling_allowed_sites": [],
227
204
  "cloud": False,
228
- "jobs": {
229
- "disable": False
230
- },
231
- "tasks": {
232
- "disable": False
233
- },
205
+ "jobs": {"disable": False},
206
+ "tasks": {"disable": False},
234
207
  "default_project": "mindsdb",
235
208
  "default_llm": {},
236
- "default_embedding_model": {}
209
+ "default_embedding_model": {},
210
+ "default_reranking_model": {},
211
+ "a2a": {
212
+ "host": "localhost",
213
+ "port": 47338,
214
+ "mindsdb_host": "localhost",
215
+ "mindsdb_port": 47334,
216
+ "agent_name": "my_agent",
217
+ "project_name": "mindsdb",
218
+ "enabled": False,
219
+ },
237
220
  }
238
221
  # endregion
239
222
 
240
223
  # region find 'auto' config file, create if not exists
241
- auto_config_name = 'config.auto.json'
224
+ auto_config_name = "config.auto.json"
242
225
  auto_config_path = self.storage_root_path.joinpath(auto_config_name)
243
226
  if not auto_config_path.is_file():
244
- auto_config_path.write_text('{}')
227
+ auto_config_path.write_text("{}")
245
228
  self.auto_config_path = auto_config_path
246
229
  # endregion
247
230
 
@@ -253,163 +236,156 @@ class Config:
253
236
  return cls.__instance
254
237
 
255
238
  def prepare_env_config(self) -> None:
256
- """Collect config values from env vars to self._env_config
257
- """
239
+ """Collect config values from env vars to self._env_config"""
258
240
  self._env_config = {
259
- 'logging': {
260
- 'handlers': {
261
- 'console': {},
262
- 'file': {}
263
- }
264
- },
265
- "api": {
266
- "http": {
267
- "server": {}
268
- }
269
- },
270
- 'auth': {},
271
- 'paths': {},
272
- 'permanent_storage': {},
273
- 'ml_task_queue': {}
241
+ "logging": {"handlers": {"console": {}, "file": {}}},
242
+ "api": {"http": {"server": {}}},
243
+ "auth": {},
244
+ "paths": {},
245
+ "permanent_storage": {},
246
+ "ml_task_queue": {},
247
+ "a2a": {},
274
248
  }
275
249
 
276
250
  # region storage root path
277
- if os.environ.get('MINDSDB_STORAGE_DIR', '') != '':
278
- self._env_config['paths'] = {
279
- 'root': Path(os.environ['MINDSDB_STORAGE_DIR'])
280
- }
251
+ if os.environ.get("MINDSDB_STORAGE_DIR", "") != "":
252
+ self._env_config["paths"] = {"root": Path(os.environ["MINDSDB_STORAGE_DIR"])}
281
253
  # endregion
282
254
 
283
255
  # region vars: permanent storage disabled?
284
- if os.environ.get('MINDSDB_STORAGE_BACKUP_DISABLED', '').lower() in ('1', 'true'):
285
- self._env_config['permanent_storage'] = {
286
- 'location': 'absent'
287
- }
256
+ if os.environ.get("MINDSDB_STORAGE_BACKUP_DISABLED", "").lower() in (
257
+ "1",
258
+ "true",
259
+ ):
260
+ self._env_config["permanent_storage"] = {"location": "absent"}
288
261
  # endregion
289
262
 
290
263
  # region vars: ml queue
291
- if os.environ.get('MINDSDB_ML_QUEUE_TYPE', '').lower() == 'redis':
292
- self._env_config['ml_task_queue'] = {
293
- 'type': 'redis',
294
- 'host': os.environ.get('MINDSDB_ML_QUEUE_HOST', 'localhost'),
295
- 'port': int(os.environ.get('MINDSDB_ML_QUEUE_PORT', 6379)),
296
- 'db': int(os.environ.get('MINDSDB_ML_QUEUE_DB', 0)),
297
- 'username': os.environ.get('MINDSDB_ML_QUEUE_USERNAME'),
298
- 'password': os.environ.get('MINDSDB_ML_QUEUE_PASSWORD')
264
+ if os.environ.get("MINDSDB_ML_QUEUE_TYPE", "").lower() == "redis":
265
+ self._env_config["ml_task_queue"] = {
266
+ "type": "redis",
267
+ "host": os.environ.get("MINDSDB_ML_QUEUE_HOST", "localhost"),
268
+ "port": int(os.environ.get("MINDSDB_ML_QUEUE_PORT", 6379)),
269
+ "db": int(os.environ.get("MINDSDB_ML_QUEUE_DB", 0)),
270
+ "username": os.environ.get("MINDSDB_ML_QUEUE_USERNAME"),
271
+ "password": os.environ.get("MINDSDB_ML_QUEUE_PASSWORD"),
299
272
  }
300
273
  # endregion
301
274
 
302
275
  # region vars: username and password
303
- http_username = os.environ.get('MINDSDB_USERNAME')
304
- http_password = os.environ.get('MINDSDB_PASSWORD')
276
+ http_username = os.environ.get("MINDSDB_USERNAME")
277
+ http_password = os.environ.get("MINDSDB_PASSWORD")
305
278
 
306
279
  if bool(http_username) != bool(http_password):
307
- raise ValueError('Both MINDSDB_USERNAME and MINDSDB_PASSWORD must be set together and must be non-empty strings.')
280
+ raise ValueError(
281
+ "Both MINDSDB_USERNAME and MINDSDB_PASSWORD must be set together and must be non-empty strings."
282
+ )
308
283
 
309
284
  # If both username and password are set, enable HTTP auth.
310
285
  if http_username and http_password:
311
- self._env_config['auth']['http_auth_enabled'] = True
312
- self._env_config['auth']['username'] = http_username
313
- self._env_config['auth']['password'] = http_password
286
+ self._env_config["auth"]["http_auth_enabled"] = True
287
+ self._env_config["auth"]["username"] = http_username
288
+ self._env_config["auth"]["password"] = http_password
314
289
  # endregion
315
290
 
316
291
  # region permanent session lifetime
317
- for env_name in ('MINDSDB_HTTP_PERMANENT_SESSION_LIFETIME', 'FLASK_PERMANENT_SESSION_LIFETIME'):
292
+ for env_name in (
293
+ "MINDSDB_HTTP_PERMANENT_SESSION_LIFETIME",
294
+ "FLASK_PERMANENT_SESSION_LIFETIME",
295
+ ):
318
296
  env_value = os.environ.get(env_name)
319
297
  if isinstance(env_value, str):
320
298
  try:
321
299
  permanent_session_lifetime = int(env_value)
322
300
  except Exception:
323
- raise ValueError(f'Warning: Can\'t cast env var {env_name} value to int: {env_value}')
324
- self._env_config['auth']['http_permanent_session_lifetime'] = permanent_session_lifetime
301
+ raise ValueError(f"Warning: Can't cast env var {env_name} value to int: {env_value}")
302
+ self._env_config["auth"]["http_permanent_session_lifetime"] = permanent_session_lifetime
325
303
  break
326
304
  # endregion
327
305
 
328
306
  # region logging
329
- if os.environ.get('MINDSDB_LOG_LEVEL', '') != '':
330
- self._env_config['logging']['handlers']['console']['level'] = os.environ['MINDSDB_LOG_LEVEL']
331
- self._env_config['logging']['handlers']['console']['enabled'] = True
332
- if os.environ.get('MINDSDB_CONSOLE_LOG_LEVEL', '') != '':
333
- self._env_config['logging']['handlers']['console']['level'] = os.environ['MINDSDB_LOG_LEVEL']
334
- self._env_config['logging']['handlers']['console']['enabled'] = True
335
- if os.environ.get('MINDSDB_FILE_LOG_LEVEL', '') != '':
336
- self._env_config['logging']['handlers']['file']['level'] = os.environ['MINDSDB_FILE_LOG_LEVEL']
337
- self._env_config['logging']['handlers']['file']['enabled'] = True
307
+ if os.environ.get("MINDSDB_LOG_LEVEL", "") != "":
308
+ self._env_config["logging"]["handlers"]["console"]["level"] = os.environ["MINDSDB_LOG_LEVEL"]
309
+ self._env_config["logging"]["handlers"]["console"]["enabled"] = True
310
+ if os.environ.get("MINDSDB_CONSOLE_LOG_LEVEL", "") != "":
311
+ self._env_config["logging"]["handlers"]["console"]["level"] = os.environ["MINDSDB_LOG_LEVEL"]
312
+ self._env_config["logging"]["handlers"]["console"]["enabled"] = True
313
+ if os.environ.get("MINDSDB_FILE_LOG_LEVEL", "") != "":
314
+ self._env_config["logging"]["handlers"]["file"]["level"] = os.environ["MINDSDB_FILE_LOG_LEVEL"]
315
+ self._env_config["logging"]["handlers"]["file"]["enabled"] = True
338
316
  # endregion
339
317
 
340
318
  # region server type
341
- server_type = os.environ.get('MINDSDB_HTTP_SERVER_TYPE', '').lower()
342
- if server_type == '':
343
- server_type = os.environ.get('MINDSDB_DEFAULT_SERVER', '').lower()
344
- if server_type != '':
345
- if server_type == 'waitress':
346
- self._env_config['api']['http']['server']['type'] = 'waitress'
347
- self._default_config['api']['http']['server']['config'] = {}
348
- self._env_config['api']['http']['server']['config'] = {
319
+ server_type = os.environ.get("MINDSDB_HTTP_SERVER_TYPE", "").lower()
320
+ if server_type == "":
321
+ server_type = os.environ.get("MINDSDB_DEFAULT_SERVER", "").lower()
322
+ if server_type != "":
323
+ if server_type == "waitress":
324
+ self._env_config["api"]["http"]["server"]["type"] = "waitress"
325
+ self._default_config["api"]["http"]["server"]["config"] = {}
326
+ self._env_config["api"]["http"]["server"]["config"] = {
349
327
  "threads": 16,
350
- "max_request_body_size": (1 << 30) * 10, # 10GB
351
- "inbuf_overflow": (1 << 30) * 10
328
+ "max_request_body_size": (1 << 30) * 10, # 10GB
329
+ "inbuf_overflow": (1 << 30) * 10,
352
330
  }
353
- elif server_type == 'flask':
354
- self._env_config['api']['http']['server']['type'] = 'flask'
355
- self._default_config['api']['http']['server']['config'] = {}
356
- self._env_config['api']['http']['server']['config'] = {}
357
- elif server_type == 'gunicorn':
358
- self._env_config['api']['http']['server']['type'] = 'gunicorn'
359
- self._default_config['api']['http']['server']['config'] = {}
360
- self._env_config['api']['http']['server']['config'] = {
361
- 'workers': min(mp.cpu_count(), 4),
362
- 'timeout': 600,
363
- 'reuse_port': True,
364
- 'preload_app': True,
365
- 'threads': 4
331
+ elif server_type == "flask":
332
+ self._env_config["api"]["http"]["server"]["type"] = "flask"
333
+ self._default_config["api"]["http"]["server"]["config"] = {}
334
+ self._env_config["api"]["http"]["server"]["config"] = {}
335
+ elif server_type == "gunicorn":
336
+ self._env_config["api"]["http"]["server"]["type"] = "gunicorn"
337
+ self._default_config["api"]["http"]["server"]["config"] = {}
338
+ self._env_config["api"]["http"]["server"]["config"] = {
339
+ "workers": min(mp.cpu_count(), 4),
340
+ "timeout": 600,
341
+ "reuse_port": True,
342
+ "preload_app": True,
343
+ "threads": 4,
366
344
  }
367
345
  # endregion
368
346
 
369
- if os.environ.get('MINDSDB_DB_CON', '') != '':
370
- self._env_config['storage_db'] = os.environ['MINDSDB_DB_CON']
347
+ if os.environ.get("MINDSDB_DB_CON", "") != "":
348
+ self._env_config["storage_db"] = os.environ["MINDSDB_DB_CON"]
371
349
 
372
- if os.environ.get('MINDSDB_DEFAULT_PROJECT', '') != '':
373
- self._env_config['default_project'] = os.environ['MINDSDB_DEFAULT_PROJECT'].lower()
350
+ if os.environ.get("MINDSDB_DEFAULT_PROJECT", "") != "":
351
+ self._env_config["default_project"] = os.environ["MINDSDB_DEFAULT_PROJECT"].lower()
374
352
 
375
- if os.environ.get('MINDSDB_DEFAULT_LLM_API_KEY', '') != '':
376
- self._env_config['default_llm'] = {
377
- 'api_key': os.environ['MINDSDB_DEFAULT_LLM_API_KEY']
353
+ if os.environ.get("MINDSDB_DEFAULT_LLM_API_KEY", "") != "":
354
+ self._env_config["default_llm"] = {"api_key": os.environ["MINDSDB_DEFAULT_LLM_API_KEY"]}
355
+ if os.environ.get("MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY", "") != "":
356
+ self._env_config["default_embedding_model"] = {
357
+ "api_key": os.environ["MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY"]
378
358
  }
379
- if os.environ.get('MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY', '') != '':
380
- self._env_config['default_embedding_model'] = {
381
- 'api_key': os.environ['MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY']
359
+ if os.environ.get("MINDSDB_DEFAULT_RERANKING_MODEL_API_KEY", "") != "":
360
+ self._env_config["default_reranking_model"] = {
361
+ "api_key": os.environ["MINDSDB_DEFAULT_RERANKING_MODEL_API_KEY"]
382
362
  }
383
363
 
384
- def parse_cmd_args(self) -> None:
385
- """Collect cmd args to self._cmd_args (accessable as self.cmd_args)
386
- """
387
- if self._cmd_args is not None:
388
- return
389
-
390
- # if it is not mindsdb run, then set args to empty
391
- if (
392
- (sys.modules['__main__'].__package__ or '').lower() != 'mindsdb'
393
- and os.environ.get('MINDSDB_RUNTIME') != "1"
394
- ):
395
- self._cmd_args = argparse.Namespace(
396
- api=None, config=None, install_handlers=None, verbose=False,
397
- no_studio=False, version=False, ml_task_queue_consumer=None,
398
- agent=None, project=None
364
+ # region vars: a2a configuration
365
+ a2a_config = {}
366
+ if os.environ.get("MINDSDB_A2A_HOST"):
367
+ a2a_config["host"] = os.environ.get("MINDSDB_A2A_HOST")
368
+ if os.environ.get("MINDSDB_A2A_PORT"):
369
+ a2a_config["port"] = int(os.environ.get("MINDSDB_A2A_PORT"))
370
+ if os.environ.get("MINDSDB_HOST"):
371
+ a2a_config["mindsdb_host"] = os.environ.get("MINDSDB_HOST")
372
+ if os.environ.get("MINDSDB_PORT"):
373
+ a2a_config["mindsdb_port"] = int(os.environ.get("MINDSDB_PORT"))
374
+ if os.environ.get("MINDSDB_AGENT_NAME"):
375
+ a2a_config["agent_name"] = os.environ.get("MINDSDB_AGENT_NAME")
376
+ if os.environ.get("MINDSDB_PROJECT_NAME"):
377
+ a2a_config["project_name"] = os.environ.get("MINDSDB_PROJECT_NAME")
378
+ if os.environ.get("MINDSDB_A2A_ENABLED") is not None:
379
+ a2a_config["enabled"] = os.environ.get("MINDSDB_A2A_ENABLED").lower() in (
380
+ "true",
381
+ "1",
382
+ "yes",
383
+ "y",
399
384
  )
400
- return
401
385
 
402
- parser = argparse.ArgumentParser(description='CL argument for mindsdb server')
403
- parser.add_argument('--api', type=str, default=None)
404
- parser.add_argument('--config', type=str, default=None)
405
- parser.add_argument('--install-handlers', type=str, default=None)
406
- parser.add_argument('--verbose', action='store_true')
407
- parser.add_argument('--no_studio', action='store_true')
408
- parser.add_argument('-v', '--version', action='store_true')
409
- parser.add_argument('--ml_task_queue_consumer', action='store_true', default=None)
410
- parser.add_argument('--agent', type=str, default=None, help='Name of the agent to use with litellm APIs')
411
- parser.add_argument('--project', type=str, default=None, help='Project containing the agent (default: mindsdb)')
412
- self._cmd_args = parser.parse_args()
386
+ if a2a_config:
387
+ self._env_config["a2a"] = a2a_config
388
+ # endregion
413
389
 
414
390
  def fetch_auto_config(self) -> bool:
415
391
  """Load dict readed from config.auto.json to `auto_config`.
@@ -438,45 +414,86 @@ class Config:
438
414
  cmd_args_config = self.cmd_args.config
439
415
  if isinstance(cmd_args_config, str):
440
416
  self.config_path = cmd_args_config
441
- elif isinstance(os.environ.get('MINDSDB_CONFIG_PATH'), str):
442
- self.config_path = os.environ['MINDSDB_CONFIG_PATH']
443
- if self.config_path == 'absent':
417
+ elif isinstance(os.environ.get("MINDSDB_CONFIG_PATH"), str):
418
+ self.config_path = os.environ["MINDSDB_CONFIG_PATH"]
419
+ if self.config_path == "absent":
444
420
  self.config_path = None
445
421
  if isinstance(self.config_path, str):
446
422
  self.config_path = Path(self.config_path)
447
423
  if not self.config_path.is_file():
448
- raise FileNotFoundError(f'The configuration file was not found at the path: {self.config_path}')
424
+ raise FileNotFoundError(f"The configuration file was not found at the path: {self.config_path}")
449
425
  try:
450
426
  self._user_config = json.loads(self.config_path.read_text())
451
427
  except json.JSONDecodeError as e:
452
- raise ValueError(f'The configuration file ({self.config_path}) contains invalid JSON: {e}')
428
+ raise ValueError(f"The configuration file ({self.config_path}) contains invalid JSON: {e}")
453
429
  else:
454
430
  self._user_config = {}
455
431
  return True
456
432
  return False
457
433
 
458
434
  def ensure_auto_config_is_relevant(self) -> None:
459
- """Check if auto config has not been changed. If changed - reload main config.
460
- """
435
+ """Check if auto config has not been changed. If changed - reload main config."""
461
436
  updated = self.fetch_auto_config()
462
437
  if updated:
463
438
  self.merge_configs()
464
439
 
465
440
  def merge_configs(self) -> None:
466
- """Merge multiple configs to one.
467
- """
441
+ """Merge multiple configs to one."""
468
442
  new_config = deepcopy(self._default_config)
469
443
  _merge_configs(new_config, self._user_config)
470
444
  _merge_configs(new_config, self._auto_config)
471
445
  _merge_configs(new_config, self._env_config)
472
446
 
447
+ # Apply command-line arguments for A2A
448
+ cmd_args_config = {}
449
+
450
+ # Check for A2A command-line arguments
451
+ if hasattr(self.cmd_args, "a2a_host") and self.cmd_args.a2a_host is not None:
452
+ if "a2a" not in cmd_args_config:
453
+ cmd_args_config["a2a"] = {}
454
+ cmd_args_config["a2a"]["host"] = self.cmd_args.a2a_host
455
+
456
+ if hasattr(self.cmd_args, "a2a_port") and self.cmd_args.a2a_port is not None:
457
+ if "a2a" not in cmd_args_config:
458
+ cmd_args_config["a2a"] = {}
459
+ cmd_args_config["a2a"]["port"] = self.cmd_args.a2a_port
460
+
461
+ if hasattr(self.cmd_args, "mindsdb_host") and self.cmd_args.mindsdb_host is not None:
462
+ if "a2a" not in cmd_args_config:
463
+ cmd_args_config["a2a"] = {}
464
+ cmd_args_config["a2a"]["mindsdb_host"] = self.cmd_args.mindsdb_host
465
+
466
+ if hasattr(self.cmd_args, "mindsdb_port") and self.cmd_args.mindsdb_port is not None:
467
+ if "a2a" not in cmd_args_config:
468
+ cmd_args_config["a2a"] = {}
469
+ cmd_args_config["a2a"]["mindsdb_port"] = self.cmd_args.mindsdb_port
470
+
471
+ if hasattr(self.cmd_args, "agent_name") and self.cmd_args.agent_name is not None:
472
+ if "a2a" not in cmd_args_config:
473
+ cmd_args_config["a2a"] = {}
474
+ cmd_args_config["a2a"]["agent_name"] = self.cmd_args.agent_name
475
+
476
+ if hasattr(self.cmd_args, "project_name") and self.cmd_args.project_name is not None:
477
+ if "a2a" not in cmd_args_config:
478
+ cmd_args_config["a2a"] = {}
479
+ cmd_args_config["a2a"]["project_name"] = self.cmd_args.project_name
480
+
481
+ # Merge command-line args config with highest priority
482
+ if cmd_args_config:
483
+ _merge_configs(new_config, cmd_args_config)
484
+
485
+ # Ensure A2A port is never 0, which would prevent the A2A API from starting
486
+ if "a2a" in new_config and isinstance(new_config["a2a"], dict):
487
+ if "port" in new_config["a2a"] and (new_config["a2a"]["port"] == 0 or new_config["a2a"]["port"] is None):
488
+ new_config["a2a"]["port"] = 47338 # Use the default port value
489
+
473
490
  # region create dirs
474
- for key, value in new_config['paths'].items():
491
+ for key, value in new_config["paths"].items():
475
492
  if isinstance(value, str):
476
- new_config['paths'][key] = Path(value)
493
+ new_config["paths"][key] = Path(value)
477
494
  elif isinstance(value, Path) is False:
478
495
  raise ValueError(f"Unexpected path value: {value}")
479
- create_data_dir(new_config['paths'][key])
496
+ create_data_dir(new_config["paths"][key])
480
497
  # endregion
481
498
 
482
499
  self._config = new_config
@@ -494,39 +511,35 @@ class Config:
494
511
  return self._config
495
512
 
496
513
  def update(self, data: dict) -> None:
497
- """Update calues in `auto` config
498
- """
514
+ """Update calues in `auto` config"""
499
515
  self.ensure_auto_config_is_relevant()
500
516
 
501
517
  _merge_configs(self._auto_config, data)
502
518
 
503
- self.auto_config_path.write_text(
504
- json.dumps(self._auto_config, indent=4)
505
- )
519
+ self.auto_config_path.write_text(json.dumps(self._auto_config, indent=4))
506
520
 
507
521
  self.auto_config_mtime = self.auto_config_path.stat().st_mtime
508
522
 
509
523
  self.merge_configs()
510
524
 
511
525
  def raise_warnings(self, logger) -> None:
512
- """Show warnings about config options
513
- """
526
+ """Show warnings about config options"""
514
527
 
515
- if 'storage_dir' in self._config:
528
+ if "storage_dir" in self._config:
516
529
  logger.warning("The 'storage_dir' config option is no longer supported. Use 'paths.root' instead.")
517
530
 
518
- if 'log' in self._config:
531
+ if "log" in self._config:
519
532
  logger.warning("The 'log' config option is no longer supported. Use 'logging' instead.")
520
533
 
521
- if os.environ.get('MINDSDB_DEFAULT_SERVER', '') != '':
534
+ if os.environ.get("MINDSDB_DEFAULT_SERVER", "") != "":
522
535
  logger.warning(
523
536
  "Env variable 'MINDSDB_DEFAULT_SERVER' is going to be deprecated soon. "
524
537
  "Use 'MINDSDB_HTTP_SERVER_TYPE' instead."
525
538
  )
526
539
 
527
- for env_name in ('MINDSDB_HTTP_SERVER_TYPE', 'MINDSDB_DEFAULT_SERVER'):
528
- env_value = os.environ.get(env_name, '')
529
- if env_value.lower() not in ('waitress', 'flask', 'gunicorn', ''):
540
+ for env_name in ("MINDSDB_HTTP_SERVER_TYPE", "MINDSDB_DEFAULT_SERVER"):
541
+ env_value = os.environ.get(env_name, "")
542
+ if env_value.lower() not in ("waitress", "flask", "gunicorn", ""):
530
543
  logger.warning(
531
544
  f"The value '{env_value}' of the environment variable {env_name} is not valid. "
532
545
  "It must be one of the following: 'waitress', 'flask', or 'gunicorn'."
@@ -538,9 +551,67 @@ class Config:
538
551
  self.parse_cmd_args()
539
552
  return self._cmd_args
540
553
 
554
+ def parse_cmd_args(self) -> None:
555
+ """Collect cmd args to self._cmd_args (accessable as self.cmd_args)"""
556
+ if self._cmd_args is not None:
557
+ return
558
+
559
+ # if it is not mindsdb run, then set args to empty
560
+ if (sys.modules["__main__"].__package__ or "").lower() != "mindsdb" and os.environ.get(
561
+ "MINDSDB_RUNTIME"
562
+ ) != "1":
563
+ self._cmd_args = argparse.Namespace(
564
+ api=None,
565
+ config=None,
566
+ install_handlers=None,
567
+ verbose=False,
568
+ no_studio=False,
569
+ version=False,
570
+ ml_task_queue_consumer=None,
571
+ agent=None,
572
+ project=None,
573
+ )
574
+ return
575
+
576
+ parser = argparse.ArgumentParser(description="CL argument for mindsdb server")
577
+ parser.add_argument("--api", type=str, default=None)
578
+ parser.add_argument("--config", type=str, default=None)
579
+ parser.add_argument("--install-handlers", type=str, default=None)
580
+ parser.add_argument("--verbose", action="store_true")
581
+ parser.add_argument("--no_studio", action="store_true")
582
+ parser.add_argument("-v", "--version", action="store_true")
583
+ parser.add_argument("--ml_task_queue_consumer", action="store_true", default=None)
584
+ parser.add_argument(
585
+ "--agent",
586
+ type=str,
587
+ default=None,
588
+ help="Name of the agent to use with litellm APIs",
589
+ )
590
+ parser.add_argument(
591
+ "--project",
592
+ type=str,
593
+ default=None,
594
+ help="Project containing the agent (default: mindsdb)",
595
+ )
596
+
597
+ # A2A specific arguments
598
+ parser.add_argument("--a2a-host", type=str, default=None, help="A2A server host")
599
+ parser.add_argument("--a2a-port", type=int, default=None, help="A2A server port")
600
+ parser.add_argument("--mindsdb-host", type=str, default=None, help="MindsDB server host")
601
+ parser.add_argument("--mindsdb-port", type=int, default=None, help="MindsDB server port")
602
+ parser.add_argument(
603
+ "--agent-name",
604
+ type=str,
605
+ default=None,
606
+ help="MindsDB agent name to connect to",
607
+ )
608
+ parser.add_argument("--project-name", type=str, default=None, help="MindsDB project name")
609
+
610
+ self._cmd_args = parser.parse_args()
611
+
541
612
  @property
542
613
  def paths(self):
543
- return self._config['paths']
614
+ return self._config["paths"]
544
615
 
545
616
  @property
546
617
  def user_config(self):