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
@@ -16,6 +16,7 @@ from mindsdb.integrations.libs.llm.config import (
16
16
  OpenAIConfig,
17
17
  NvidiaNIMConfig,
18
18
  MindsdbConfig,
19
+ WriterConfig,
19
20
  )
20
21
  from mindsdb.utilities.config import config
21
22
  from langchain_text_splitters import Language, RecursiveCharacterTextSplitter
@@ -41,16 +42,12 @@ DEFAULT_LITELLM_BASE_URL = "https://ai.dev.mindsdb.com"
41
42
  DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434"
42
43
  DEFAULT_OLLAMA_MODEL = "llama2"
43
44
 
44
- DEFAULT_NVIDIA_NIM_BASE_URL = (
45
- "http://localhost:8000/v1" # Assumes local port forwarding through ssh
46
- )
45
+ DEFAULT_NVIDIA_NIM_BASE_URL = "http://localhost:8000/v1" # Assumes local port forwarding through ssh
47
46
  DEFAULT_NVIDIA_NIM_MODEL = "meta/llama-3_1-8b-instruct"
48
47
  DEFAULT_VLLM_SERVER_URL = "http://localhost:8000/v1"
49
48
 
50
49
 
51
- def get_completed_prompts(
52
- base_template: str, df: pd.DataFrame, strict=True
53
- ) -> Tuple[List[str], np.ndarray]:
50
+ def get_completed_prompts(base_template: str, df: pd.DataFrame, strict=True) -> Tuple[List[str], np.ndarray]:
54
51
  """
55
52
  Helper method that produces formatted prompts given a template and data in a Pandas DataFrame.
56
53
  It also returns the ID of any empty templates that failed to be filled due to missing data.
@@ -69,9 +66,7 @@ def get_completed_prompts(
69
66
  if len(matches) == 0:
70
67
  # no placeholders
71
68
  if strict:
72
- raise AssertionError(
73
- "No placeholders found in the prompt, please provide a valid prompt template."
74
- )
69
+ raise AssertionError("No placeholders found in the prompt, please provide a valid prompt template.")
75
70
  prompts = [base_template] * len(df)
76
71
  return prompts, np.ndarray(0)
77
72
 
@@ -95,12 +90,8 @@ def get_completed_prompts(
95
90
  for i in range(len(template)):
96
91
  atom = template[i]
97
92
  if i < len(columns):
98
- col = df[columns[i]].replace(
99
- to_replace=[None], value=""
100
- ) # add empty quote if data is missing
101
- df["__mdb_prompt"] = df["__mdb_prompt"].apply(
102
- lambda x: x + atom
103
- ) + col.astype("string")
93
+ col = df[columns[i]].replace(to_replace=[None], value="") # add empty quote if data is missing
94
+ df["__mdb_prompt"] = df["__mdb_prompt"].apply(lambda x: x + atom) + col.astype("string")
104
95
  else:
105
96
  df["__mdb_prompt"] = df["__mdb_prompt"].apply(lambda x: x + atom)
106
97
  prompts = list(df["__mdb_prompt"])
@@ -119,8 +110,7 @@ def get_llm_config(provider: str, args: Dict) -> BaseLLMConfig:
119
110
  """
120
111
  temperature = min(1.0, max(0.0, args.get("temperature", 0.0)))
121
112
  if provider == "openai":
122
-
123
- if any(x in args.get("model_name", "") for x in ['o1', 'o3']):
113
+ if any(x in args.get("model_name", "") for x in ["o1", "o3"]):
124
114
  # for o1 and 03, 'temperature' does not support 0.0 with this model. Only the default (1) value is supported
125
115
  temperature = 1
126
116
 
@@ -173,9 +163,7 @@ def get_llm_config(provider: str, args: Dict) -> BaseLLMConfig:
173
163
  max_tokens=args.get("max_tokens", DEFAULT_OPENAI_MAX_TOKENS),
174
164
  top_p=args.get("top_p", None),
175
165
  top_k=args.get("top_k", None),
176
- custom_llm_provider=args.get(
177
- "custom_llm_provider", DEFAULT_LITELLM_PROVIDER
178
- ),
166
+ custom_llm_provider=args.get("custom_llm_provider", DEFAULT_LITELLM_PROVIDER),
179
167
  model_kwargs=model_kwargs,
180
168
  )
181
169
  if provider == "ollama":
@@ -237,6 +225,18 @@ def get_llm_config(provider: str, args: Dict) -> BaseLLMConfig:
237
225
  max_output_tokens=args.get("max_tokens", None),
238
226
  google_api_key=args["api_keys"].get("google", None),
239
227
  )
228
+ if provider == "writer":
229
+ return WriterConfig(
230
+ model_name=args.get("model_name", "palmyra-x5"),
231
+ temperature=temperature,
232
+ max_tokens=args.get("max_tokens", None),
233
+ top_p=args.get("top_p", None),
234
+ stop=args.get("stop", None),
235
+ best_of=args.get("best_of", None),
236
+ writer_api_key=args["api_keys"].get("writer", None),
237
+ writer_org_id=args.get("writer_org_id", None),
238
+ base_url=args.get("base_url", None),
239
+ )
240
240
 
241
241
  raise ValueError(f"Provider {provider} is not supported.")
242
242
 
@@ -290,9 +290,7 @@ def ft_jsonl_validation(
290
290
  ) # noqa
291
291
 
292
292
  if messages_col not in batch:
293
- raise Exception(
294
- f"{prefix}Each line in the provided data should have a '{messages_col}' key"
295
- )
293
+ raise Exception(f"{prefix}Each line in the provided data should have a '{messages_col}' key")
296
294
 
297
295
  messages = batch[messages_col]
298
296
  try:
@@ -350,30 +348,22 @@ def ft_chat_format_validation(
350
348
 
351
349
  for c in chat:
352
350
  if any(k not in valid_keys for k in c.keys()):
353
- raise Exception(
354
- f"Each message should only have these keys: `{valid_keys}`. Found: `{c.keys()}`"
355
- )
351
+ raise Exception(f"Each message should only have these keys: `{valid_keys}`. Found: `{c.keys()}`")
356
352
 
357
353
  roles = [m[role_key] for m in chat]
358
354
  contents = [m[content_key] for m in chat]
359
355
 
360
356
  if len(roles) != len(contents):
361
- raise Exception(
362
- f"Each message should contain both `{role_key}` and `{content_key}` fields"
363
- )
357
+ raise Exception(f"Each message should contain both `{role_key}` and `{content_key}` fields")
364
358
 
365
359
  if len(roles) == 0:
366
360
  raise Exception("Chat should have at least one message")
367
361
 
368
362
  if assistant_key not in roles:
369
- raise Exception(
370
- "Chat should have at least one assistant message"
371
- ) # otherwise it is useless for FT
363
+ raise Exception("Chat should have at least one assistant message") # otherwise it is useless for FT
372
364
 
373
365
  if user_key not in roles:
374
- raise Exception(
375
- "Chat should have at least one user message"
376
- ) # perhaps remove in the future
366
+ raise Exception("Chat should have at least one user message") # perhaps remove in the future
377
367
 
378
368
  # set default transitions for finite state machine if undefined
379
369
  if transitions is None:
@@ -387,20 +377,15 @@ def ft_chat_format_validation(
387
377
  # check order is valid via finite state machine
388
378
  state = None
389
379
  for i, (role, content) in enumerate(zip(roles, contents)):
390
-
391
380
  prefix = f"message #{i + 1}: "
392
381
 
393
382
  # check invalid roles
394
383
  if role not in valid_roles:
395
- raise Exception(
396
- f"{prefix}Invalid role (found `{role}`, expected one of `{valid_roles}`)"
397
- )
384
+ raise Exception(f"{prefix}Invalid role (found `{role}`, expected one of `{valid_roles}`)")
398
385
 
399
386
  # check content
400
387
  if not isinstance(content, str):
401
- raise Exception(
402
- f"{prefix}Content should be a string, got type `{type(content)}`"
403
- )
388
+ raise Exception(f"{prefix}Content should be a string, got type `{type(content)}`")
404
389
 
405
390
  # check transition
406
391
  if role not in transitions[state]:
@@ -464,9 +449,7 @@ def ft_chat_formatter(df: pd.DataFrame) -> List[Dict]:
464
449
  df = df.sort_values(["chat_id"], kind="stable")
465
450
  elif "message_id" in df.columns:
466
451
  if df["message_id"].duplicated().any():
467
- raise Exception(
468
- "If `message_id` is provided, it must not contain duplicate IDs."
469
- )
452
+ raise Exception("If `message_id` is provided, it must not contain duplicate IDs.")
470
453
  df = df.sort_values(["message_id"])
471
454
 
472
455
  # 2. build chats
@@ -477,12 +460,8 @@ def ft_chat_formatter(df: pd.DataFrame) -> List[Dict]:
477
460
  for _, row in df.iterrows():
478
461
  try:
479
462
  chat = json.loads(row["chat_json"])
480
- assert list(chat.keys()) == [
481
- "messages"
482
- ], "Each chat should have a 'messages' key, and nothing else."
483
- ft_chat_format_validation(
484
- chat["messages"]
485
- ) # will raise Exception if chat is invalid
463
+ assert list(chat.keys()) == ["messages"], "Each chat should have a 'messages' key, and nothing else."
464
+ ft_chat_format_validation(chat["messages"]) # will raise Exception if chat is invalid
486
465
  chats.append(chat)
487
466
  except json.JSONDecodeError:
488
467
  pass # TODO: add logger info here, prompt user to clean dataset carefully
@@ -492,9 +471,7 @@ def ft_chat_formatter(df: pd.DataFrame) -> List[Dict]:
492
471
  chat = []
493
472
  for i, row in df.iterrows():
494
473
  if row["role"] == "system" and len(chat) > 0:
495
- ft_chat_format_validation(
496
- chat
497
- ) # will raise Exception if chat is invalid
474
+ ft_chat_format_validation(chat) # will raise Exception if chat is invalid
498
475
  chats.append({"messages": chat})
499
476
  chat = []
500
477
  event = {"role": row["role"], "content": row["content"]}
@@ -529,15 +506,11 @@ def ft_code_formatter(
529
506
  # input and setup validation
530
507
  assert len(df) > 0, "Input dataframe should not be empty"
531
508
  assert "code" in df.columns, "Input dataframe should have a 'code' column"
532
- assert chunk_size > 0 and isinstance(
533
- chunk_size, int
534
- ), "`chunk_size` should be a positive integer"
509
+ assert chunk_size > 0 and isinstance(chunk_size, int), "`chunk_size` should be a positive integer"
535
510
 
536
511
  supported_formats = ["chat", "fim"]
537
512
  supported_langs = [e.value for e in Language]
538
- assert (
539
- language.lower() in supported_langs
540
- ), f"Invalid language. Valid choices are: {supported_langs}"
513
+ assert language.lower() in supported_langs, f"Invalid language. Valid choices are: {supported_langs}"
541
514
 
542
515
  # ensure correct encoding
543
516
  df["code"] = df["code"].map(lambda x: x.encode("utf8").decode("unicode_escape"))
@@ -574,7 +547,7 @@ def ft_code_formatter(
574
547
  roles = []
575
548
  contents = []
576
549
  for idx in range(0, len(chunks), 3):
577
- pre, mid, suf = chunks[idx: idx + 3]
550
+ pre, mid, suf = chunks[idx : idx + 3]
578
551
  interleaved = list(itertools.chain(*zip(templates, (pre, suf, mid))))
579
552
  user = "\n".join(interleaved[:-1])
580
553
  assistant = "\n".join(interleaved[-1:])
@@ -595,12 +568,11 @@ def ft_cqa_formatter(
595
568
  default_instruction="You are a helpful assistant.",
596
569
  default_context="",
597
570
  ) -> pd.DataFrame:
598
-
599
571
  # input and setup validation
600
572
  assert len(df) > 0, "Input dataframe should not be empty"
601
- assert {question_col, answer_col}.issubset(
602
- set(df.columns)
603
- ), f"Input dataframe must have columns `{question_col}`, and `{answer_col}`" # noqa
573
+ assert {question_col, answer_col}.issubset(set(df.columns)), (
574
+ f"Input dataframe must have columns `{question_col}`, and `{answer_col}`"
575
+ ) # noqa
604
576
 
605
577
  if instruction_col not in df.columns:
606
578
  df[instruction_col] = default_instruction
@@ -6,6 +6,7 @@ import pandas
6
6
 
7
7
  from mindsdb.utilities import log
8
8
  from mindsdb.api.executor.data_types.response_type import RESPONSE_TYPE
9
+ from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
9
10
  from mindsdb_sql_parser.ast import ASTNode
10
11
 
11
12
 
@@ -18,29 +19,32 @@ class _INFORMATION_SCHEMA_COLUMNS_NAMES:
18
19
  These column names match the standard INFORMATION_SCHEMA.COLUMNS structure
19
20
  used in SQL databases to describe table metadata.
20
21
  """
21
- COLUMN_NAME: str = 'COLUMN_NAME'
22
- DATA_TYPE: str = 'DATA_TYPE'
23
- ORDINAL_POSITION: str = 'ORDINAL_POSITION'
24
- COLUMN_DEFAULT: str = 'COLUMN_DEFAULT'
25
- IS_NULLABLE: str = 'IS_NULLABLE'
26
- CHARACTER_MAXIMUM_LENGTH: str = 'CHARACTER_MAXIMUM_LENGTH'
27
- CHARACTER_OCTET_LENGTH: str = 'CHARACTER_OCTET_LENGTH'
28
- NUMERIC_PRECISION: str = 'NUMERIC_PRECISION'
29
- NUMERIC_SCALE: str = 'NUMERIC_SCALE'
30
- DATETIME_PRECISION: str = 'DATETIME_PRECISION'
31
- CHARACTER_SET_NAME: str = 'CHARACTER_SET_NAME'
32
- COLLATION_NAME: str = 'COLLATION_NAME'
33
- MYSQL_DATA_TYPE: str = 'MYSQL_DATA_TYPE'
22
+
23
+ COLUMN_NAME: str = "COLUMN_NAME"
24
+ DATA_TYPE: str = "DATA_TYPE"
25
+ ORDINAL_POSITION: str = "ORDINAL_POSITION"
26
+ COLUMN_DEFAULT: str = "COLUMN_DEFAULT"
27
+ IS_NULLABLE: str = "IS_NULLABLE"
28
+ CHARACTER_MAXIMUM_LENGTH: str = "CHARACTER_MAXIMUM_LENGTH"
29
+ CHARACTER_OCTET_LENGTH: str = "CHARACTER_OCTET_LENGTH"
30
+ NUMERIC_PRECISION: str = "NUMERIC_PRECISION"
31
+ NUMERIC_SCALE: str = "NUMERIC_SCALE"
32
+ DATETIME_PRECISION: str = "DATETIME_PRECISION"
33
+ CHARACTER_SET_NAME: str = "CHARACTER_SET_NAME"
34
+ COLLATION_NAME: str = "COLLATION_NAME"
35
+ MYSQL_DATA_TYPE: str = "MYSQL_DATA_TYPE"
34
36
 
35
37
 
36
38
  INF_SCHEMA_COLUMNS_NAMES = _INFORMATION_SCHEMA_COLUMNS_NAMES()
37
39
  INF_SCHEMA_COLUMNS_NAMES_SET = set(f.name for f in fields(INF_SCHEMA_COLUMNS_NAMES))
38
40
 
39
41
 
40
-
41
42
  class HandlerResponse:
42
- def __init__(self, resp_type: RESPONSE_TYPE, data_frame: pandas.DataFrame = None, query: ASTNode = 0, error_code: int = 0,
43
- error_message: str | None = None, affected_rows: int | None = None) -> None:
43
+ def __init__(
44
+ self, resp_type: RESPONSE_TYPE, data_frame: pandas.DataFrame = None, query: ASTNode = 0,
45
+ error_code: int = 0, error_message: str | None = None, affected_rows: int | None = None,
46
+ mysql_types: list[MYSQL_DATA_TYPE] | None = None
47
+ ) -> None:
44
48
  self.resp_type = resp_type
45
49
  self.query = query
46
50
  self.data_frame = data_frame
@@ -49,6 +53,7 @@ class HandlerResponse:
49
53
  self.affected_rows = affected_rows
50
54
  if isinstance(self.affected_rows, int) is False or self.affected_rows < 0:
51
55
  self.affected_rows = 0
56
+ self.mysql_types = mysql_types
52
57
 
53
58
  @property
54
59
  def type(self):
@@ -66,7 +71,9 @@ class HandlerResponse:
66
71
  f"Cannot convert {self.resp_type} to {RESPONSE_TYPE.COLUMNS_TABLE}, "
67
72
  f"the error is: {self.error_message}"
68
73
  )
69
- raise ValueError(f"Cannot convert {self.resp_type} to {RESPONSE_TYPE.COLUMNS_TABLE}")
74
+ raise ValueError(
75
+ f"Cannot convert {self.resp_type} to {RESPONSE_TYPE.COLUMNS_TABLE}"
76
+ )
70
77
 
71
78
  self.data_frame.columns = [name.upper() for name in self.data_frame.columns]
72
79
  self.data_frame[INF_SCHEMA_COLUMNS_NAMES.MYSQL_DATA_TYPE] = self.data_frame[
@@ -77,24 +84,26 @@ class HandlerResponse:
77
84
  current_columns_set = set(self.data_frame.columns)
78
85
  if INF_SCHEMA_COLUMNS_NAMES_SET != current_columns_set:
79
86
  raise ValueError(
80
- f'Columns set for INFORMATION_SCHEMA.COLUMNS is wrong: {list(current_columns_set)}'
87
+ f"Columns set for INFORMATION_SCHEMA.COLUMNS is wrong: {list(current_columns_set)}"
81
88
  )
82
89
  # endregion
83
90
 
84
- self.data_frame = self.data_frame.astype({
85
- INF_SCHEMA_COLUMNS_NAMES.COLUMN_NAME: 'string',
86
- INF_SCHEMA_COLUMNS_NAMES.DATA_TYPE: 'string',
87
- INF_SCHEMA_COLUMNS_NAMES.ORDINAL_POSITION: 'Int32',
88
- INF_SCHEMA_COLUMNS_NAMES.COLUMN_DEFAULT: 'string',
89
- INF_SCHEMA_COLUMNS_NAMES.IS_NULLABLE: 'string',
90
- INF_SCHEMA_COLUMNS_NAMES.CHARACTER_MAXIMUM_LENGTH: 'Int32',
91
- INF_SCHEMA_COLUMNS_NAMES.CHARACTER_OCTET_LENGTH: 'Int32',
92
- INF_SCHEMA_COLUMNS_NAMES.NUMERIC_PRECISION: 'Int32',
93
- INF_SCHEMA_COLUMNS_NAMES.NUMERIC_SCALE: 'Int32',
94
- INF_SCHEMA_COLUMNS_NAMES.DATETIME_PRECISION: 'Int32',
95
- INF_SCHEMA_COLUMNS_NAMES.CHARACTER_SET_NAME: 'string',
96
- INF_SCHEMA_COLUMNS_NAMES.COLLATION_NAME: 'string',
97
- })
91
+ self.data_frame = self.data_frame.astype(
92
+ {
93
+ INF_SCHEMA_COLUMNS_NAMES.COLUMN_NAME: "string",
94
+ INF_SCHEMA_COLUMNS_NAMES.DATA_TYPE: "string",
95
+ INF_SCHEMA_COLUMNS_NAMES.ORDINAL_POSITION: "Int32",
96
+ INF_SCHEMA_COLUMNS_NAMES.COLUMN_DEFAULT: "string",
97
+ INF_SCHEMA_COLUMNS_NAMES.IS_NULLABLE: "string",
98
+ INF_SCHEMA_COLUMNS_NAMES.CHARACTER_MAXIMUM_LENGTH: "Int32",
99
+ INF_SCHEMA_COLUMNS_NAMES.CHARACTER_OCTET_LENGTH: "Int32",
100
+ INF_SCHEMA_COLUMNS_NAMES.NUMERIC_PRECISION: "Int32",
101
+ INF_SCHEMA_COLUMNS_NAMES.NUMERIC_SCALE: "Int32",
102
+ INF_SCHEMA_COLUMNS_NAMES.DATETIME_PRECISION: "Int32",
103
+ INF_SCHEMA_COLUMNS_NAMES.CHARACTER_SET_NAME: "string",
104
+ INF_SCHEMA_COLUMNS_NAMES.COLLATION_NAME: "string",
105
+ }
106
+ )
98
107
  self.data_frame.replace([numpy.NaN, pandas.NA], None, inplace=True)
99
108
 
100
109
  self.resp_type = RESPONSE_TYPE.COLUMNS_TABLE
@@ -103,33 +112,39 @@ class HandlerResponse:
103
112
  try:
104
113
  data = None
105
114
  if self.data_frame is not None:
106
- data = self.data_frame.to_json(orient="split", index=False, date_format="iso")
115
+ data = self.data_frame.to_json(
116
+ orient="split", index=False, date_format="iso"
117
+ )
107
118
  except Exception as e:
108
119
  logger.error("%s.to_json: error - %s", self.__class__.__name__, e)
109
120
  data = None
110
- return {"type": self.resp_type,
111
- "query": self.query,
112
- "data_frame": data,
113
- "error_code": self.error_code,
114
- "error": self.error_message}
121
+ return {
122
+ "type": self.resp_type,
123
+ "query": self.query,
124
+ "data_frame": data,
125
+ "error_code": self.error_code,
126
+ "error": self.error_message,
127
+ }
115
128
 
116
129
  def __repr__(self):
117
- return "%s: resp_type=%s, query=%s, data_frame=%s, err_code=%s, error=%s, affected_rows=%s" % (
118
- self.__class__.__name__,
119
- self.resp_type,
120
- self.query,
121
- self.data_frame,
122
- self.error_code,
123
- self.error_message,
124
- self.affected_rows
125
- )
130
+ return "%s: resp_type=%s, query=%s, data_frame=\n%s\nerr_code=%s, error=%s, affected_rows=%s" % (
131
+ self.__class__.__name__,
132
+ self.resp_type,
133
+ self.query,
134
+ self.data_frame,
135
+ self.error_code,
136
+ self.error_message,
137
+ self.affected_rows,
138
+ )
126
139
 
127
140
 
128
141
  class HandlerStatusResponse:
129
- def __init__(self, success: bool = True,
130
- error_message: str = None,
131
- redirect_url: str = None,
132
- copy_storage: str = None
142
+ def __init__(
143
+ self,
144
+ success: bool = True,
145
+ error_message: str = None,
146
+ redirect_url: str = None,
147
+ copy_storage: str = None,
133
148
  ) -> None:
134
149
  self.success = success
135
150
  self.error_message = error_message
@@ -139,7 +154,7 @@ class HandlerStatusResponse:
139
154
  def to_json(self):
140
155
  data = {"success": self.success, "error": self.error_message}
141
156
  if self.redirect_url is not None:
142
- data['redirect_url'] = self.redirect_url
157
+ data["redirect_url"] = self.redirect_url
143
158
  return data
144
159
 
145
160
  def __repr__(self):
@@ -553,3 +553,9 @@ class VectorStoreHandler(BaseHandler):
553
553
  df(pd.DataFrame): Hybrid search result, sorted by hybrid search rank
554
554
  '''
555
555
  raise NotImplementedError(f'Hybrid search not supported for VectorStoreHandler {self.name}')
556
+
557
+ def create_index(self, *args, **kwargs):
558
+ """
559
+ Create an index on the specified table.
560
+ """
561
+ raise NotImplementedError(f'create_index not supported for VectorStoreHandler {self.name}')
@@ -43,6 +43,11 @@ def get_api_key(
43
43
  if f"{api_name.lower()}_api_key" in create_args:
44
44
  return create_args[f"{api_name.lower()}_api_key"]
45
45
 
46
+ # 2.5 - Check in params dictionary if it exists (for agents)
47
+ if "params" in create_args and create_args["params"] is not None:
48
+ if f"{api_name.lower()}_api_key" in create_args["params"]:
49
+ return create_args["params"][f"{api_name.lower()}_api_key"]
50
+
46
51
  # 3
47
52
  if engine_storage is not None:
48
53
  connection_args = engine_storage.get_connection_args()
@@ -68,7 +73,14 @@ def get_api_key(
68
73
  return create_args['api_keys'][api_name]
69
74
 
70
75
  if strict:
71
- raise Exception(
72
- f"Missing API key '{api_name.lower()}_api_key'. Either re-create this ML_ENGINE specifying the '{api_name.lower()}_api_key' parameter, or re-create this model and pass the API key with `USING` syntax."
73
- ) # noqa
76
+ provider_upper = api_name.upper()
77
+ api_key_env_var = f"{provider_upper}_API_KEY"
78
+ api_key_arg = f"{api_name.lower()}_api_key"
79
+ error_message = (
80
+ f"API key for {api_name} not found. Please provide it using one of the following methods:\n"
81
+ f"1. Set the {api_key_env_var} environment variable\n"
82
+ f"2. Provide it as '{api_key_arg}' parameter when creating an agent using the CREATE AGENT syntax\n"
83
+ f" Example: CREATE AGENT my_agent USING model='gpt-4', provider='{api_name}', {api_key_arg}='your-api-key';\n"
84
+ )
85
+ raise Exception(error_message)
74
86
  return None
@@ -1 +0,0 @@
1
- from .microsoft import MSGraphAPIBaseClient
@@ -1,2 +0,0 @@
1
- from .google import GoogleUserOAuth2Manager, GoogleServiceAccountOAuth2Manager
2
- from .microsoft import MSGraphAPIApplicationPermissionsManager, MSGraphAPIDelegatedPermissionsManager