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
@@ -54,7 +54,7 @@ class Context:
54
54
  def load(self, storage: dict) -> None:
55
55
  self._storage.set(storage)
56
56
 
57
- def metadata(self, **kwargs) -> dict:
57
+ def get_metadata(self, **kwargs) -> dict:
58
58
  return {
59
59
  'user_id': self.user_id or "",
60
60
  'company_id': self.company_id or "",
@@ -7,7 +7,6 @@ import textwrap
7
7
  from functools import wraps
8
8
  from collections.abc import Callable
9
9
 
10
- import requests
11
10
  from cryptography.fernet import Fernet
12
11
  from mindsdb_sql_parser.ast import Identifier
13
12
 
@@ -72,41 +71,6 @@ def mark_process(name: str, custom_mark: str = None) -> Callable:
72
71
  return mark_process_wrapper
73
72
 
74
73
 
75
- def get_versions_where_predictors_become_obsolete():
76
- """ Get list of MindsDB versions in which predictors should be retrained
77
- Returns:
78
- list of str or False
79
- """
80
- versions_for_updating_predictors = []
81
- try:
82
- try:
83
- res = requests.get(
84
- 'https://mindsdb-cloud-public-service-files.s3.us-east-2.amazonaws.com/version_for_updating_predictors.txt',
85
- timeout=0.5
86
- )
87
- except (ConnectionError, requests.exceptions.ConnectionError) as e:
88
- logger.error(f'Is no connection. {e}')
89
- raise
90
- except Exception as e:
91
- logger.error(f'Is something wrong with getting version_for_updating_predictors.txt: {e}')
92
- raise
93
-
94
- if res.status_code != 200:
95
- logger.error(f'Cant get version_for_updating_predictors.txt: returned status code = {res.status_code}')
96
- raise
97
-
98
- try:
99
- versions_for_updating_predictors = res.text.replace(' \t\r', '').split('\n')
100
- except Exception as e:
101
- logger.error(f'Cant decode version_for_updating_predictors.txt: {e}')
102
- raise
103
- except Exception:
104
- return False, versions_for_updating_predictors
105
-
106
- versions_for_updating_predictors = [x for x in versions_for_updating_predictors if len(x) > 0]
107
- return True, versions_for_updating_predictors
108
-
109
-
110
74
  def init_lexer_parsers():
111
75
  from mindsdb_sql_parser.lexer import MindsDBLexer
112
76
  from mindsdb_sql_parser.parser import MindsDBParser
@@ -1,11 +1,12 @@
1
1
  import os
2
2
  import typing
3
+ from typing import TYPE_CHECKING
3
4
 
4
5
  from mindsdb.utilities import log
5
- from langfuse import Langfuse
6
- from langfuse.client import StatefulSpanClient
7
- from langfuse.callback import CallbackHandler
8
- from langfuse.api.resources.commons.errors.not_found_error import NotFoundError as TraceNotFoundError
6
+
7
+ if TYPE_CHECKING:
8
+ from langfuse.callback import CallbackHandler
9
+ from langfuse.client import StatefulSpanClient
9
10
 
10
11
  logger = log.getLogger(__name__)
11
12
 
@@ -98,6 +99,12 @@ class LangfuseClientWrapper:
98
99
  logger.debug(f"LANGFUSE_TIMEOUT: {LANGFUSE_TIMEOUT}")
99
100
  logger.debug(f"LANGFUSE_SAMPLE_RATE: {LANGFUSE_SAMPLE_RATE * 100}%")
100
101
 
102
+ try:
103
+ from langfuse import Langfuse
104
+ except ImportError:
105
+ logger.error("Langfuse is not installed. Please install it with `pip install langfuse`.")
106
+ return
107
+
101
108
  self.client = Langfuse(
102
109
  public_key=public_key,
103
110
  secret_key=secret_key,
@@ -164,7 +171,7 @@ class LangfuseClientWrapper:
164
171
 
165
172
  def start_span(self,
166
173
  name: str,
167
- input: typing.Optional[typing.Any] = None) -> typing.Optional[StatefulSpanClient]:
174
+ input: typing.Optional[typing.Any] = None) -> typing.Optional['StatefulSpanClient']:
168
175
  """
169
176
  Create span. If Langfuse is disabled, nothing will be done.
170
177
 
@@ -180,7 +187,7 @@ class LangfuseClientWrapper:
180
187
  return self.trace.span(name=name, input=input)
181
188
 
182
189
  def end_span_stream(self,
183
- span: typing.Optional[StatefulSpanClient] = None) -> None:
190
+ span: typing.Optional['StatefulSpanClient'] = None) -> None:
184
191
  """
185
192
  End span. If Langfuse is disabled, nothing will happen.
186
193
  Args:
@@ -195,7 +202,7 @@ class LangfuseClientWrapper:
195
202
  self.trace.update()
196
203
 
197
204
  def end_span(self,
198
- span: typing.Optional[StatefulSpanClient] = None,
205
+ span: typing.Optional['StatefulSpanClient'] = None,
199
206
  output: typing.Optional[typing.Any] = None) -> None:
200
207
  """
201
208
  End trace. If Langfuse is disabled, nothing will be done.
@@ -227,7 +234,7 @@ class LangfuseClientWrapper:
227
234
  except Exception as e:
228
235
  logger.error(f'Something went wrong while processing Langfuse trace {self.trace.id}: {str(e)}')
229
236
 
230
- def get_langchain_handler(self) -> typing.Optional[CallbackHandler]:
237
+ def get_langchain_handler(self) -> typing.Optional['CallbackHandler']:
231
238
  """
232
239
  Get Langchain handler. If Langfuse is disabled, returns None.
233
240
  """
@@ -257,8 +264,10 @@ class LangfuseClientWrapper:
257
264
  self.tags.append(self.release)
258
265
 
259
266
  def _get_tool_usage(self) -> typing.Dict:
260
- """ Retrieves tool usage information from a langfuse trace.
261
- Note: assumes trace marks an action with string `AgentAction` """
267
+ """Retrieves tool usage information from a langfuse trace.
268
+ Note: assumes trace marks an action with string `AgentAction`
269
+ """
270
+ from langfuse.api.resources.commons.errors.not_found_error import NotFoundError as TraceNotFoundError
262
271
 
263
272
  tool_usage = {}
264
273
 
@@ -1,206 +1,22 @@
1
1
  import os
2
- import typing
3
-
4
- from opentelemetry import trace # noqa: F401
5
- from opentelemetry import metrics # noqa: F401
6
- from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter as OTLPLogExporterGRPC
7
- from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter as OTLPLogExporterHTTP
8
- from opentelemetry.sdk._logs._internal.export import LogExporter
9
- from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter as OTLPMetricExporterGRPC
10
- from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPMetricExporterHTTP
11
- from opentelemetry.sdk.metrics.export import MetricExporter, ConsoleMetricExporter
12
- from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter as OTLPSpanExporterGRPC
13
- from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter as OTLPSpanExporterHTTP
14
- from opentelemetry.sdk.trace.export import SpanExporter, ConsoleSpanExporter
15
- from opentelemetry.sdk.resources import Resource
16
- from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
17
-
18
- from mindsdb.utilities.otel.logger import setup_logger
19
- from mindsdb.utilities.otel.meter import setup_meter
20
- from mindsdb.utilities.otel.tracer import setup_tracer
21
- from mindsdb.utilities.utils import parse_csv_attributes
22
- from mindsdb.utilities import log
23
-
24
- logger = log.getLogger(__name__)
25
-
26
- # Check OpenTelemetry exporter type
27
- OTEL_EXPORTER_TYPE = os.getenv("OTEL_EXPORTER_TYPE", "console") # console or otlp
28
-
29
- # Define OpenTelemetry exporter protocol
30
- OTEL_EXPORTER_PROTOCOL = os.getenv("OTEL_EXPORTER_PROTOCOL", "grpc") # grpc or http
31
-
32
- # Define OTLP endpoint. If not set, the default OTLP endpoint will be used
33
- OTEL_OTLP_ENDPOINT = os.getenv("OTEL_OTLP_ENDPOINT", "http://localhost:4317")
34
-
35
- # Define OTLP logging endpoint. If not set, the default OTLP logging endpoint will be used
36
- OTEL_OTLP_LOGGING_ENDPOINT = os.getenv("OTEL_OTLP_LOGGING_ENDPOINT", OTEL_OTLP_ENDPOINT)
37
-
38
- # Define OTLP tracing endpoint. If not set, the default OTLP tracing endpoint will be used
39
- OTEL_OTLP_TRACING_ENDPOINT = os.getenv("OTEL_OTLP_TRACING_ENDPOINT", OTEL_OTLP_ENDPOINT)
40
-
41
- # Define OTLP metrics endpoint. If not set, the default OTLP metrics endpoint will be used
42
- OTEL_OTLP_METRICS_ENDPOINT = os.getenv("OTEL_OTLP_METRICS_ENDPOINT", OTEL_OTLP_ENDPOINT)
43
-
44
- # Define service name
45
- OTEL_SERVICE_NAME = os.getenv("OTEL_SERVICE_NAME", "mindsdb")
46
-
47
- # Define service instace ID
48
- OTEL_SERVICE_INSTANCE_ID = os.getenv("OTEL_SERVICE_INSTANCE_ID", "mindsdb-instance")
49
-
50
- # The name of the environment we"re on, by default local for development, this is set differently per-env in our Helm
51
- # chart values files
52
- OTEL_SERVICE_ENVIRONMENT = os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower()
53
-
54
- # Define service release
55
- OTEL_SERVICE_RELEASE = os.getenv("OTEL_SERVICE_RELEASE", "local").lower()
56
-
57
- # Define how often to capture traces
58
- OTEL_TRACE_SAMPLE_RATE = float(os.getenv("OTEL_TRACE_SAMPLE_RATE", "1.0"))
59
-
60
- # Define extra attributes
61
- OTEL_EXTRA_ATTRIBUTES = os.getenv("OTEL_EXTRA_ATTRIBUTES", "")
62
2
 
63
3
  # By default, we have Open Telemetry SDK enabled on all envs, except for local which is disabled by default.
64
4
  OTEL_SDK_DISABLED = (os.getenv("OTEL_SDK_DISABLED", "false").lower() == "true"
65
5
  or os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower() == "local")
66
6
 
67
- # Define if OpenTelemetry logging is disabled. By default, it is disabled.
68
- OTEL_LOGGING_DISABLED = os.getenv("OTEL_LOGGING_DISABLED", "true").lower() == "true"
69
-
70
- # Define if OpenTelemetry tracing is disabled. By default, it is enabled.
71
- OTEL_TRACING_DISABLED = os.getenv("OTEL_TRACING_DISABLED", "false").lower() == "true"
72
-
73
- # Define if OpenTelemetry metrics is disabled. By default, it is disabled.
74
- OTEL_METRICS_DISABLED = os.getenv("OTEL_METRICS_DISABLED", "true").lower() == "true"
75
-
76
7
  # If you want to enable Open Telemetry on local for some reason please set OTEL_SDK_FORCE_RUN to true
77
8
  OTEL_SDK_FORCE_RUN = os.getenv("OTEL_SDK_FORCE_RUN", "false").lower() == "true"
78
9
 
10
+ OTEL_ENABLED = not OTEL_SDK_DISABLED or OTEL_SDK_FORCE_RUN
79
11
 
80
- def get_otel_attributes() -> dict:
81
- """
82
- Get OpenTelemetry attributes
83
-
84
- Returns:
85
- dict: OpenTelemetry attributes
86
- """
12
+ def increment_otel_query_request_counter(metadata: dict) -> None:
13
+ pass
87
14
 
88
- base_attributes = {
89
- "service.name": OTEL_SERVICE_NAME,
90
- "service.instance.id": OTEL_SERVICE_INSTANCE_ID,
91
- "environment": OTEL_SERVICE_ENVIRONMENT,
92
- "release": OTEL_SERVICE_RELEASE,
93
- }
94
-
95
- extra_attributes = {}
15
+ trace = None
16
+ if OTEL_ENABLED:
96
17
  try:
97
- extra_attributes = parse_csv_attributes(OTEL_EXTRA_ATTRIBUTES)
98
- except Exception as e:
99
- logger.error(f"Failed to parse OTEL_EXTRA_ATTRIBUTES: {e}")
100
-
101
- attributes = {**extra_attributes, **base_attributes} # Base attributes take precedence over extra attributes
102
-
103
- return attributes
104
-
105
-
106
- def get_logging_exporter() -> typing.Optional[LogExporter]:
107
- """
108
- Get OpenTelemetry logging exporter.
109
-
110
- Returns:
111
- OTLPLogExporter: OpenTelemetry logging exporter
112
- """
113
-
114
- if OTEL_EXPORTER_TYPE == "otlp":
115
-
116
- if OTEL_EXPORTER_PROTOCOL == "grpc":
117
- return OTLPLogExporterGRPC(
118
- endpoint=OTEL_OTLP_LOGGING_ENDPOINT,
119
- insecure=True
120
- )
121
-
122
- elif OTEL_EXPORTER_PROTOCOL == "http":
123
- return OTLPLogExporterHTTP(
124
- endpoint=OTEL_OTLP_LOGGING_ENDPOINT
125
- )
126
-
127
- return None
128
-
129
-
130
- def get_span_exporter() -> SpanExporter:
131
- """
132
- Get OpenTelemetry span exporter
133
-
134
- Returns:
135
- OTLPSpanExporter: OpenTelemetry span exporter
136
- """
137
-
138
- if OTEL_EXPORTER_TYPE == "otlp":
139
-
140
- if OTEL_EXPORTER_PROTOCOL == "grpc":
141
- return OTLPSpanExporterGRPC(
142
- endpoint=OTEL_OTLP_TRACING_ENDPOINT,
143
- insecure=True
144
- )
145
-
146
- elif OTEL_EXPORTER_PROTOCOL == "http":
147
- return OTLPSpanExporterHTTP(
148
- endpoint=OTEL_OTLP_TRACING_ENDPOINT
149
- )
150
-
151
- return ConsoleSpanExporter()
152
-
153
-
154
- def get_metrics_exporter() -> typing.Optional[MetricExporter]:
155
- """
156
- Get OpenTelemetry metrics exporter
157
-
158
- Returns:
159
- OTLPLogExporter: OpenTelemetry metrics exporter
160
- """
161
-
162
- if OTEL_EXPORTER_TYPE == "otlp":
163
-
164
- if OTEL_EXPORTER_PROTOCOL == "grpc":
165
- return OTLPMetricExporterGRPC(
166
- endpoint=OTEL_OTLP_METRICS_ENDPOINT,
167
- insecure=True
168
- )
169
-
170
- elif OTEL_EXPORTER_PROTOCOL == "http":
171
- return OTLPMetricExporterHTTP(
172
- endpoint=OTEL_OTLP_METRICS_ENDPOINT
173
- )
174
-
175
- return ConsoleMetricExporter()
176
-
177
-
178
- if not OTEL_SDK_DISABLED or OTEL_SDK_FORCE_RUN:
179
- logger.info("OpenTelemetry enabled")
180
- logger.info(f"OpenTelemetry exporter type: {OTEL_EXPORTER_TYPE}")
181
- logger.info(f"OpenTelemetry service name: {OTEL_SERVICE_NAME}")
182
- logger.info(f"OpenTelemetry service environment: {OTEL_SERVICE_ENVIRONMENT}")
183
- logger.info(f"OpenTelemetry service release: {OTEL_SERVICE_RELEASE}")
184
- logger.info(f"OpenTelemetry trace sample rate: {OTEL_TRACE_SAMPLE_RATE}")
185
- logger.info(f"OpenTelemetry extra attributes: {OTEL_EXTRA_ATTRIBUTES}")
186
-
187
- # Define OpenTelemetry resources (e.g., service name)
188
- attributes = get_otel_attributes()
189
-
190
- # Define OpenTelemetry sampler
191
- sampler = TraceIdRatioBased(OTEL_TRACE_SAMPLE_RATE)
192
-
193
- # Define OpenTelemetry resources (e.g., service name)
194
- resource = Resource(attributes=attributes)
195
-
196
- if not OTEL_LOGGING_DISABLED:
197
- logger.info("OpenTelemetry Logging is enabled")
198
- setup_logger(resource, get_logging_exporter())
199
-
200
- if not OTEL_TRACING_DISABLED:
201
- logger.info("OpenTelemetry Tracing is enabled")
202
- setup_tracer(resource, sampler, get_span_exporter())
18
+ from mindsdb.utilities.otel.prepare import trace
19
+ from mindsdb.utilities.otel.metric_handlers import increment_otel_query_request_counter
20
+ except Exception:
21
+ pass
203
22
 
204
- if not OTEL_METRICS_DISABLED:
205
- logger.info("OpenTelemetry Metrics is enabled")
206
- setup_meter(resource, get_metrics_exporter())
@@ -1,4 +1,4 @@
1
- from mindsdb.utilities.otel import metrics, OTEL_SERVICE_NAME
1
+ from mindsdb.utilities.otel.prepare import metrics, OTEL_SERVICE_NAME
2
2
 
3
3
  _query_request_counter = None
4
4
 
@@ -23,3 +23,7 @@ def get_query_request_counter():
23
23
  )
24
24
 
25
25
  return _query_request_counter
26
+
27
+ def increment_otel_query_request_counter(metadata: dict) -> None:
28
+ query_request_counter = get_query_request_counter()
29
+ query_request_counter.add(1, metadata)
@@ -0,0 +1,198 @@
1
+ import os
2
+ import typing
3
+
4
+ from opentelemetry import trace # noqa: F401
5
+ from opentelemetry import metrics # noqa: F401
6
+ from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter as OTLPLogExporterGRPC
7
+ from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter as OTLPLogExporterHTTP
8
+ from opentelemetry.sdk._logs._internal.export import LogExporter
9
+ from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter as OTLPMetricExporterGRPC
10
+ from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPMetricExporterHTTP
11
+ from opentelemetry.sdk.metrics.export import MetricExporter, ConsoleMetricExporter
12
+ from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter as OTLPSpanExporterGRPC
13
+ from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter as OTLPSpanExporterHTTP
14
+ from opentelemetry.sdk.trace.export import SpanExporter, ConsoleSpanExporter
15
+ from opentelemetry.sdk.resources import Resource
16
+ from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
17
+
18
+ from mindsdb.utilities.otel.logger import setup_logger
19
+ from mindsdb.utilities.otel.meter import setup_meter
20
+ from mindsdb.utilities.otel.tracer import setup_tracer
21
+ from mindsdb.utilities.utils import parse_csv_attributes
22
+ from mindsdb.utilities import log
23
+
24
+ logger = log.getLogger(__name__)
25
+
26
+ # Check OpenTelemetry exporter type
27
+ OTEL_EXPORTER_TYPE = os.getenv("OTEL_EXPORTER_TYPE", "console") # console or otlp
28
+
29
+ # Define OpenTelemetry exporter protocol
30
+ OTEL_EXPORTER_PROTOCOL = os.getenv("OTEL_EXPORTER_PROTOCOL", "grpc") # grpc or http
31
+
32
+ # Define OTLP endpoint. If not set, the default OTLP endpoint will be used
33
+ OTEL_OTLP_ENDPOINT = os.getenv("OTEL_OTLP_ENDPOINT", "http://localhost:4317")
34
+
35
+ # Define OTLP logging endpoint. If not set, the default OTLP logging endpoint will be used
36
+ OTEL_OTLP_LOGGING_ENDPOINT = os.getenv("OTEL_OTLP_LOGGING_ENDPOINT", OTEL_OTLP_ENDPOINT)
37
+
38
+ # Define OTLP tracing endpoint. If not set, the default OTLP tracing endpoint will be used
39
+ OTEL_OTLP_TRACING_ENDPOINT = os.getenv("OTEL_OTLP_TRACING_ENDPOINT", OTEL_OTLP_ENDPOINT)
40
+
41
+ # Define OTLP metrics endpoint. If not set, the default OTLP metrics endpoint will be used
42
+ OTEL_OTLP_METRICS_ENDPOINT = os.getenv("OTEL_OTLP_METRICS_ENDPOINT", OTEL_OTLP_ENDPOINT)
43
+
44
+ # Define service name
45
+ OTEL_SERVICE_NAME = os.getenv("OTEL_SERVICE_NAME", "mindsdb")
46
+
47
+ # Define service instace ID
48
+ OTEL_SERVICE_INSTANCE_ID = os.getenv("OTEL_SERVICE_INSTANCE_ID", "mindsdb-instance")
49
+
50
+ # The name of the environment we"re on, by default local for development, this is set differently per-env in our Helm
51
+ # chart values files
52
+ OTEL_SERVICE_ENVIRONMENT = os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower()
53
+
54
+ # Define service release
55
+ OTEL_SERVICE_RELEASE = os.getenv("OTEL_SERVICE_RELEASE", "local").lower()
56
+
57
+ # Define how often to capture traces
58
+ OTEL_TRACE_SAMPLE_RATE = float(os.getenv("OTEL_TRACE_SAMPLE_RATE", "1.0"))
59
+
60
+ # Define extra attributes
61
+ OTEL_EXTRA_ATTRIBUTES = os.getenv("OTEL_EXTRA_ATTRIBUTES", "")
62
+
63
+ # Define if OpenTelemetry logging is disabled. By default, it is disabled.
64
+ OTEL_LOGGING_DISABLED = os.getenv("OTEL_LOGGING_DISABLED", "true").lower() == "true"
65
+
66
+ # Define if OpenTelemetry tracing is disabled. By default, it is enabled.
67
+ OTEL_TRACING_DISABLED = os.getenv("OTEL_TRACING_DISABLED", "false").lower() == "true"
68
+
69
+ # Define if OpenTelemetry metrics is disabled. By default, it is disabled.
70
+ OTEL_METRICS_DISABLED = os.getenv("OTEL_METRICS_DISABLED", "true").lower() == "true"
71
+
72
+
73
+ def get_otel_attributes() -> dict:
74
+ """
75
+ Get OpenTelemetry attributes
76
+
77
+ Returns:
78
+ dict: OpenTelemetry attributes
79
+ """
80
+
81
+ base_attributes = {
82
+ "service.name": OTEL_SERVICE_NAME,
83
+ "service.instance.id": OTEL_SERVICE_INSTANCE_ID,
84
+ "environment": OTEL_SERVICE_ENVIRONMENT,
85
+ "release": OTEL_SERVICE_RELEASE,
86
+ }
87
+
88
+ extra_attributes = {}
89
+ try:
90
+ extra_attributes = parse_csv_attributes(OTEL_EXTRA_ATTRIBUTES)
91
+ except Exception as e:
92
+ logger.error(f"Failed to parse OTEL_EXTRA_ATTRIBUTES: {e}")
93
+
94
+ attributes = {**extra_attributes, **base_attributes} # Base attributes take precedence over extra attributes
95
+
96
+ return attributes
97
+
98
+
99
+ def get_logging_exporter() -> typing.Optional[LogExporter]:
100
+ """
101
+ Get OpenTelemetry logging exporter.
102
+
103
+ Returns:
104
+ OTLPLogExporter: OpenTelemetry logging exporter
105
+ """
106
+
107
+ if OTEL_EXPORTER_TYPE == "otlp":
108
+
109
+ if OTEL_EXPORTER_PROTOCOL == "grpc":
110
+ return OTLPLogExporterGRPC(
111
+ endpoint=OTEL_OTLP_LOGGING_ENDPOINT,
112
+ insecure=True
113
+ )
114
+
115
+ elif OTEL_EXPORTER_PROTOCOL == "http":
116
+ return OTLPLogExporterHTTP(
117
+ endpoint=OTEL_OTLP_LOGGING_ENDPOINT
118
+ )
119
+
120
+ return None
121
+
122
+
123
+ def get_span_exporter() -> SpanExporter:
124
+ """
125
+ Get OpenTelemetry span exporter
126
+
127
+ Returns:
128
+ OTLPSpanExporter: OpenTelemetry span exporter
129
+ """
130
+
131
+ if OTEL_EXPORTER_TYPE == "otlp":
132
+
133
+ if OTEL_EXPORTER_PROTOCOL == "grpc":
134
+ return OTLPSpanExporterGRPC(
135
+ endpoint=OTEL_OTLP_TRACING_ENDPOINT,
136
+ insecure=True
137
+ )
138
+
139
+ elif OTEL_EXPORTER_PROTOCOL == "http":
140
+ return OTLPSpanExporterHTTP(
141
+ endpoint=OTEL_OTLP_TRACING_ENDPOINT
142
+ )
143
+
144
+ return ConsoleSpanExporter()
145
+
146
+
147
+ def get_metrics_exporter() -> typing.Optional[MetricExporter]:
148
+ """
149
+ Get OpenTelemetry metrics exporter
150
+
151
+ Returns:
152
+ OTLPLogExporter: OpenTelemetry metrics exporter
153
+ """
154
+
155
+ if OTEL_EXPORTER_TYPE == "otlp":
156
+
157
+ if OTEL_EXPORTER_PROTOCOL == "grpc":
158
+ return OTLPMetricExporterGRPC(
159
+ endpoint=OTEL_OTLP_METRICS_ENDPOINT,
160
+ insecure=True
161
+ )
162
+
163
+ elif OTEL_EXPORTER_PROTOCOL == "http":
164
+ return OTLPMetricExporterHTTP(
165
+ endpoint=OTEL_OTLP_METRICS_ENDPOINT
166
+ )
167
+
168
+ return ConsoleMetricExporter()
169
+
170
+
171
+ logger.info("OpenTelemetry enabled")
172
+ logger.info(f"OpenTelemetry exporter type: {OTEL_EXPORTER_TYPE}")
173
+ logger.info(f"OpenTelemetry service name: {OTEL_SERVICE_NAME}")
174
+ logger.info(f"OpenTelemetry service environment: {OTEL_SERVICE_ENVIRONMENT}")
175
+ logger.info(f"OpenTelemetry service release: {OTEL_SERVICE_RELEASE}")
176
+ logger.info(f"OpenTelemetry trace sample rate: {OTEL_TRACE_SAMPLE_RATE}")
177
+ logger.info(f"OpenTelemetry extra attributes: {OTEL_EXTRA_ATTRIBUTES}")
178
+
179
+ # Define OpenTelemetry resources (e.g., service name)
180
+ attributes = get_otel_attributes()
181
+
182
+ # Define OpenTelemetry sampler
183
+ sampler = TraceIdRatioBased(OTEL_TRACE_SAMPLE_RATE)
184
+
185
+ # Define OpenTelemetry resources (e.g., service name)
186
+ resource = Resource(attributes=attributes)
187
+
188
+ if not OTEL_LOGGING_DISABLED:
189
+ logger.info("OpenTelemetry Logging is enabled")
190
+ setup_logger(resource, get_logging_exporter())
191
+
192
+ if not OTEL_TRACING_DISABLED:
193
+ logger.info("OpenTelemetry Tracing is enabled")
194
+ setup_tracer(resource, sampler, get_span_exporter())
195
+
196
+ if not OTEL_METRICS_DISABLED:
197
+ logger.info("OpenTelemetry Metrics is enabled")
198
+ setup_meter(resource, get_metrics_exporter())
@@ -0,0 +1,83 @@
1
+ def _is_in_quotes(pos: int, quote_positions: list[tuple[int, int]]) -> bool:
2
+ """
3
+ Check if a position is within any quoted string.
4
+
5
+ Args:
6
+ pos (int): The position to check.
7
+ quote_positions (list[tuple[int, int]]): A list of tuples, each containing the start and
8
+ end positions of a quoted string.
9
+
10
+ Returns:
11
+ bool: True if the position is within any quoted string, False otherwise.
12
+ """
13
+ return any(start < pos < end for start, end in quote_positions)
14
+
15
+
16
+ def clear_sql(sql: str) -> str:
17
+ '''Remove comments (--, /**/, and oracle-stype #) and trailing ';' from sql
18
+ Note: written mostly by LLM
19
+
20
+ Args:
21
+ sql (str): The SQL query to clear.
22
+
23
+ Returns:
24
+ str: The cleared SQL query.
25
+ '''
26
+ if sql is None:
27
+ raise ValueError('sql query is None')
28
+
29
+ # positions of (', ", `)
30
+ quote_positions = []
31
+ for quote_char in ["'", '"', '`']:
32
+ i = 0
33
+ while i < len(sql):
34
+ if sql[i] == quote_char and (i == 0 or sql[i - 1] != '\\'):
35
+ start = i
36
+ i += 1
37
+ while i < len(sql) and (sql[i] != quote_char or sql[i - 1] == '\\'):
38
+ i += 1
39
+ if i < len(sql):
40
+ quote_positions.append((start, i))
41
+ i += 1
42
+
43
+ # del /* */ comments
44
+ result = []
45
+ i = 0
46
+ while i < len(sql):
47
+ if i + 1 < len(sql) and sql[i:i + 2] == '/*' and not _is_in_quotes(i, quote_positions):
48
+ # skip until */
49
+ i += 2
50
+ while i + 1 < len(sql) and sql[i:i + 2] != '*/':
51
+ i += 1
52
+ if i + 1 < len(sql):
53
+ i += 2 # skip */
54
+ else:
55
+ i += 1
56
+ else:
57
+ result.append(sql[i])
58
+ i += 1
59
+
60
+ sql = ''.join(result)
61
+
62
+ # del -- and # comments
63
+ result = []
64
+ i = 0
65
+ while i < len(sql):
66
+ if i + 1 < len(sql) and sql[i:i + 2] == '--' and not _is_in_quotes(i, quote_positions):
67
+ while i < len(sql) and sql[i] != '\n':
68
+ i += 1
69
+ elif sql[i] == '#' and not _is_in_quotes(i, quote_positions):
70
+ while i < len(sql) and sql[i] != '\n':
71
+ i += 1
72
+ else:
73
+ result.append(sql[i])
74
+ i += 1
75
+
76
+ sql = ''.join(result)
77
+
78
+ # del ; at the end
79
+ sql = sql.rstrip()
80
+ if sql and sql[-1] == ';':
81
+ sql = sql[:-1].rstrip()
82
+
83
+ return sql.strip(' \n\t')
@@ -45,3 +45,16 @@ def start_litellm(*args, **kwargs):
45
45
  from mindsdb.api.litellm.start import start
46
46
 
47
47
  start(*args, **kwargs)
48
+
49
+
50
+ def start_a2a(*args, **kwargs):
51
+ """Start the A2A server as a subprocess of the main MindsDB process"""
52
+ from mindsdb.api.a2a.run_a2a import main
53
+
54
+ # Extract configuration from the global config
55
+ from mindsdb.utilities.config import Config
56
+ config = Config()
57
+ a2a_config = config.get('a2a', {})
58
+
59
+ # Pass configuration to the A2A main function
60
+ main(a2a_config, *args, **kwargs)