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
@@ -0,0 +1,287 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Union, AsyncIterable, List
3
+ from ...common.types import Task
4
+ from ...common.types import (
5
+ JSONRPCResponse,
6
+ TaskIdParams,
7
+ TaskQueryParams,
8
+ GetTaskRequest,
9
+ TaskNotFoundError,
10
+ SendTaskRequest,
11
+ CancelTaskRequest,
12
+ TaskNotCancelableError,
13
+ SetTaskPushNotificationRequest,
14
+ GetTaskPushNotificationRequest,
15
+ GetTaskResponse,
16
+ CancelTaskResponse,
17
+ SendTaskResponse,
18
+ SetTaskPushNotificationResponse,
19
+ GetTaskPushNotificationResponse,
20
+ TaskSendParams,
21
+ TaskStatus,
22
+ TaskState,
23
+ TaskResubscriptionRequest,
24
+ SendTaskStreamingRequest,
25
+ SendTaskStreamingResponse,
26
+ Artifact,
27
+ PushNotificationConfig,
28
+ TaskStatusUpdateEvent,
29
+ JSONRPCError,
30
+ TaskPushNotificationConfig,
31
+ InternalError,
32
+ )
33
+ from ...common.server.utils import new_not_implemented_error
34
+ import asyncio
35
+ import logging
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+
40
+ class TaskManager(ABC):
41
+ @abstractmethod
42
+ async def on_get_task(self, request: GetTaskRequest) -> GetTaskResponse:
43
+ pass
44
+
45
+ @abstractmethod
46
+ async def on_cancel_task(self, request: CancelTaskRequest) -> CancelTaskResponse:
47
+ pass
48
+
49
+ @abstractmethod
50
+ async def on_send_task(self, request: SendTaskRequest) -> SendTaskResponse:
51
+ pass
52
+
53
+ @abstractmethod
54
+ async def on_send_task_subscribe(
55
+ self, request: SendTaskStreamingRequest
56
+ ) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]:
57
+ pass
58
+
59
+ @abstractmethod
60
+ async def on_set_task_push_notification(
61
+ self, request: SetTaskPushNotificationRequest
62
+ ) -> SetTaskPushNotificationResponse:
63
+ pass
64
+
65
+ @abstractmethod
66
+ async def on_get_task_push_notification(
67
+ self, request: GetTaskPushNotificationRequest
68
+ ) -> GetTaskPushNotificationResponse:
69
+ pass
70
+
71
+ @abstractmethod
72
+ async def on_resubscribe_to_task(
73
+ self, request: TaskResubscriptionRequest
74
+ ) -> Union[AsyncIterable[SendTaskResponse], JSONRPCResponse]:
75
+ pass
76
+
77
+
78
+ class InMemoryTaskManager(TaskManager):
79
+ def __init__(self):
80
+ self.tasks: dict[str, Task] = {}
81
+ self.push_notification_infos: dict[str, PushNotificationConfig] = {}
82
+ self.lock = asyncio.Lock()
83
+ self.task_sse_subscribers: dict[str, List[asyncio.Queue]] = {}
84
+ self.subscriber_lock = asyncio.Lock()
85
+
86
+ async def on_get_task(self, request: GetTaskRequest) -> GetTaskResponse:
87
+ logger.info(f"Getting task {request.params.id}")
88
+ task_query_params: TaskQueryParams = request.params
89
+
90
+ async with self.lock:
91
+ task = self.tasks.get(task_query_params.id)
92
+ if task is None:
93
+ return GetTaskResponse(id=request.id, error=TaskNotFoundError())
94
+
95
+ task_result = self.append_task_history(
96
+ task, task_query_params.historyLength
97
+ )
98
+
99
+ return GetTaskResponse(id=request.id, result=task_result)
100
+
101
+ async def on_cancel_task(self, request: CancelTaskRequest) -> CancelTaskResponse:
102
+ logger.info(f"Cancelling task {request.params.id}")
103
+ task_id_params: TaskIdParams = request.params
104
+
105
+ async with self.lock:
106
+ task = self.tasks.get(task_id_params.id)
107
+ if task is None:
108
+ return CancelTaskResponse(id=request.id, error=TaskNotFoundError())
109
+
110
+ return CancelTaskResponse(id=request.id, error=TaskNotCancelableError())
111
+
112
+ @abstractmethod
113
+ async def on_send_task(self, request: SendTaskRequest) -> SendTaskResponse:
114
+ pass
115
+
116
+ @abstractmethod
117
+ async def on_send_task_subscribe(
118
+ self, request: SendTaskStreamingRequest
119
+ ) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]:
120
+ pass
121
+
122
+ async def set_push_notification_info(
123
+ self, task_id: str, notification_config: PushNotificationConfig
124
+ ):
125
+ async with self.lock:
126
+ task = self.tasks.get(task_id)
127
+ if task is None:
128
+ raise ValueError(f"Task not found for {task_id}")
129
+
130
+ self.push_notification_infos[task_id] = notification_config
131
+
132
+ return
133
+
134
+ async def get_push_notification_info(self, task_id: str) -> PushNotificationConfig:
135
+ async with self.lock:
136
+ task = self.tasks.get(task_id)
137
+ if task is None:
138
+ raise ValueError(f"Task not found for {task_id}")
139
+
140
+ return self.push_notification_infos[task_id]
141
+
142
+ return
143
+
144
+ async def has_push_notification_info(self, task_id: str) -> bool:
145
+ async with self.lock:
146
+ return task_id in self.push_notification_infos
147
+
148
+ async def on_set_task_push_notification(
149
+ self, request: SetTaskPushNotificationRequest
150
+ ) -> SetTaskPushNotificationResponse:
151
+ logger.info(f"Setting task push notification {request.params.id}")
152
+ task_notification_params: TaskPushNotificationConfig = request.params
153
+
154
+ try:
155
+ await self.set_push_notification_info(
156
+ task_notification_params.id,
157
+ task_notification_params.pushNotificationConfig,
158
+ )
159
+ except Exception as e:
160
+ logger.error(f"Error while setting push notification info: {e}")
161
+ return JSONRPCResponse(
162
+ id=request.id,
163
+ error=InternalError(
164
+ message="An error occurred while setting push notification info"
165
+ ),
166
+ )
167
+
168
+ return SetTaskPushNotificationResponse(
169
+ id=request.id, result=task_notification_params
170
+ )
171
+
172
+ async def on_get_task_push_notification(
173
+ self, request: GetTaskPushNotificationRequest
174
+ ) -> GetTaskPushNotificationResponse:
175
+ logger.info(f"Getting task push notification {request.params.id}")
176
+ task_params: TaskIdParams = request.params
177
+
178
+ try:
179
+ notification_info = await self.get_push_notification_info(task_params.id)
180
+ except Exception as e:
181
+ logger.error(f"Error while getting push notification info: {e}")
182
+ return GetTaskPushNotificationResponse(
183
+ id=request.id,
184
+ error=InternalError(
185
+ message="An error occurred while getting push notification info"
186
+ ),
187
+ )
188
+
189
+ return GetTaskPushNotificationResponse(
190
+ id=request.id,
191
+ result=TaskPushNotificationConfig(
192
+ id=task_params.id, pushNotificationConfig=notification_info
193
+ ),
194
+ )
195
+
196
+ async def upsert_task(self, task_send_params: TaskSendParams) -> Task:
197
+ logger.info(f"Upserting task {task_send_params.id}")
198
+ async with self.lock:
199
+ task = self.tasks.get(task_send_params.id)
200
+ if task is None:
201
+ task = Task(
202
+ id=task_send_params.id,
203
+ sessionId=task_send_params.sessionId,
204
+ messages=[task_send_params.message],
205
+ status=TaskStatus(state=TaskState.SUBMITTED),
206
+ history=[task_send_params.message],
207
+ )
208
+ self.tasks[task_send_params.id] = task
209
+ else:
210
+ task.history.append(task_send_params.message)
211
+
212
+ return task
213
+
214
+ async def on_resubscribe_to_task(
215
+ self, request: TaskResubscriptionRequest
216
+ ) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]:
217
+ return new_not_implemented_error(request.id)
218
+
219
+ async def update_store(
220
+ self, task_id: str, status: TaskStatus, artifacts: list[Artifact]
221
+ ) -> Task:
222
+ async with self.lock:
223
+ try:
224
+ task = self.tasks[task_id]
225
+ except KeyError:
226
+ logger.error(f"Task {task_id} not found for updating the task")
227
+ raise ValueError(f"Task {task_id} not found")
228
+
229
+ task.status = status
230
+
231
+ if status.message is not None:
232
+ task.history.append(status.message)
233
+
234
+ if artifacts is not None:
235
+ if task.artifacts is None:
236
+ task.artifacts = []
237
+ task.artifacts.extend(artifacts)
238
+
239
+ return task
240
+
241
+ def append_task_history(self, task: Task, historyLength: int | None):
242
+ new_task = task.model_copy()
243
+ if historyLength is not None and historyLength > 0:
244
+ new_task.history = new_task.history[-historyLength:]
245
+ else:
246
+ new_task.history = []
247
+
248
+ return new_task
249
+
250
+ async def setup_sse_consumer(self, task_id: str, is_resubscribe: bool = False):
251
+ async with self.subscriber_lock:
252
+ if task_id not in self.task_sse_subscribers:
253
+ if is_resubscribe:
254
+ raise ValueError("Task not found for resubscription")
255
+ else:
256
+ self.task_sse_subscribers[task_id] = []
257
+
258
+ sse_event_queue = asyncio.Queue(maxsize=0) # <=0 is unlimited
259
+ self.task_sse_subscribers[task_id].append(sse_event_queue)
260
+ return sse_event_queue
261
+
262
+ async def enqueue_events_for_sse(self, task_id, task_update_event):
263
+ async with self.subscriber_lock:
264
+ if task_id not in self.task_sse_subscribers:
265
+ return
266
+
267
+ current_subscribers = self.task_sse_subscribers[task_id]
268
+ for subscriber in current_subscribers:
269
+ await subscriber.put(task_update_event)
270
+
271
+ async def dequeue_events_for_sse(
272
+ self, request_id, task_id, sse_event_queue: asyncio.Queue
273
+ ) -> AsyncIterable[SendTaskStreamingResponse] | JSONRPCResponse:
274
+ try:
275
+ while True:
276
+ event = await sse_event_queue.get()
277
+ if isinstance(event, JSONRPCError):
278
+ yield SendTaskStreamingResponse(id=request_id, error=event)
279
+ break
280
+
281
+ yield SendTaskStreamingResponse(id=request_id, result=event)
282
+ if isinstance(event, TaskStatusUpdateEvent) and event.final:
283
+ break
284
+ finally:
285
+ async with self.subscriber_lock:
286
+ if task_id in self.task_sse_subscribers:
287
+ self.task_sse_subscribers[task_id].remove(sse_event_queue)
@@ -0,0 +1,28 @@
1
+ from ...common.types import (
2
+ JSONRPCResponse,
3
+ ContentTypeNotSupportedError,
4
+ UnsupportedOperationError,
5
+ )
6
+ from typing import List
7
+
8
+
9
+ def are_modalities_compatible(
10
+ server_output_modes: List[str], client_output_modes: List[str]
11
+ ):
12
+ """Modalities are compatible if they are both non-empty
13
+ and there is at least one common element."""
14
+ if client_output_modes is None or len(client_output_modes) == 0:
15
+ return True
16
+
17
+ if server_output_modes is None or len(server_output_modes) == 0:
18
+ return True
19
+
20
+ return any(x in server_output_modes for x in client_output_modes)
21
+
22
+
23
+ def new_incompatible_types_error(request_id):
24
+ return JSONRPCResponse(id=request_id, error=ContentTypeNotSupportedError())
25
+
26
+
27
+ def new_not_implemented_error(request_id):
28
+ return JSONRPCResponse(id=request_id, error=UnsupportedOperationError())
@@ -0,0 +1,365 @@
1
+ from typing import Union, Any
2
+ from pydantic import BaseModel, Field, TypeAdapter
3
+ from typing import Literal, List, Annotated, Optional
4
+ from datetime import datetime
5
+ from pydantic import model_validator, ConfigDict, field_serializer
6
+ from uuid import uuid4
7
+ from enum import Enum
8
+ from typing_extensions import Self
9
+
10
+
11
+ class TaskState(str, Enum):
12
+ SUBMITTED = "submitted"
13
+ WORKING = "working"
14
+ INPUT_REQUIRED = "input-required"
15
+ COMPLETED = "completed"
16
+ CANCELED = "canceled"
17
+ FAILED = "failed"
18
+ UNKNOWN = "unknown"
19
+
20
+
21
+ class TextPart(BaseModel):
22
+ type: Literal["text"] = "text"
23
+ text: str
24
+ metadata: dict[str, Any] | None = None
25
+
26
+
27
+ class FileContent(BaseModel):
28
+ name: str | None = None
29
+ mimeType: str | None = None
30
+ bytes: str | None = None
31
+ uri: str | None = None
32
+
33
+ @model_validator(mode="after")
34
+ def check_content(self) -> Self:
35
+ if not (self.bytes or self.uri):
36
+ raise ValueError("Either 'bytes' or 'uri' must be present in the file data")
37
+ if self.bytes and self.uri:
38
+ raise ValueError(
39
+ "Only one of 'bytes' or 'uri' can be present in the file data"
40
+ )
41
+ return self
42
+
43
+
44
+ class FilePart(BaseModel):
45
+ type: Literal["file"] = "file"
46
+ file: FileContent
47
+ metadata: dict[str, Any] | None = None
48
+
49
+
50
+ class DataPart(BaseModel):
51
+ type: Literal["data"] = "data"
52
+ data: dict[str, Any]
53
+ metadata: dict[str, Any] | None = None
54
+
55
+
56
+ Part = Annotated[Union[TextPart, FilePart, DataPart], Field(discriminator="type")]
57
+
58
+
59
+ class Message(BaseModel):
60
+ role: Literal["user", "agent"]
61
+ parts: List[Part]
62
+ metadata: dict[str, Any] | None = None
63
+
64
+
65
+ class TaskStatus(BaseModel):
66
+ state: TaskState
67
+ message: Message | None = None
68
+ timestamp: datetime = Field(default_factory=datetime.now)
69
+
70
+ @field_serializer("timestamp")
71
+ def serialize_dt(self, dt: datetime, _info):
72
+ return dt.isoformat()
73
+
74
+
75
+ class Artifact(BaseModel):
76
+ name: str | None = None
77
+ description: str | None = None
78
+ parts: List[Part]
79
+ metadata: dict[str, Any] | None = None
80
+ index: int = 0
81
+ append: bool | None = None
82
+ lastChunk: bool | None = None
83
+
84
+
85
+ class Task(BaseModel):
86
+ id: str
87
+ sessionId: str | None = None
88
+ status: TaskStatus
89
+ artifacts: List[Artifact] | None = None
90
+ history: List[Message] | None = None
91
+ metadata: dict[str, Any] | None = None
92
+
93
+
94
+ class TaskStatusUpdateEvent(BaseModel):
95
+ id: str
96
+ status: TaskStatus
97
+ final: bool = False
98
+ metadata: dict[str, Any] | None = None
99
+
100
+
101
+ class TaskArtifactUpdateEvent(BaseModel):
102
+ id: str
103
+ artifact: Artifact
104
+ metadata: dict[str, Any] | None = None
105
+
106
+
107
+ class AuthenticationInfo(BaseModel):
108
+ model_config = ConfigDict(extra="allow")
109
+
110
+ schemes: List[str]
111
+ credentials: str | None = None
112
+
113
+
114
+ class PushNotificationConfig(BaseModel):
115
+ url: str
116
+ token: str | None = None
117
+ authentication: AuthenticationInfo | None = None
118
+
119
+
120
+ class TaskIdParams(BaseModel):
121
+ id: str
122
+ metadata: dict[str, Any] | None = None
123
+
124
+
125
+ class TaskQueryParams(TaskIdParams):
126
+ historyLength: int | None = None
127
+
128
+
129
+ class TaskSendParams(BaseModel):
130
+ id: str
131
+ sessionId: str = Field(default_factory=lambda: uuid4().hex)
132
+ message: Message
133
+ acceptedOutputModes: Optional[List[str]] = None
134
+ pushNotification: PushNotificationConfig | None = None
135
+ historyLength: int | None = None
136
+ metadata: dict[str, Any] | None = None
137
+
138
+
139
+ class TaskPushNotificationConfig(BaseModel):
140
+ id: str
141
+ pushNotificationConfig: PushNotificationConfig
142
+
143
+
144
+ # RPC Messages
145
+
146
+
147
+ class JSONRPCMessage(BaseModel):
148
+ jsonrpc: Literal["2.0"] = "2.0"
149
+ id: int | str | None = Field(default_factory=lambda: uuid4().hex)
150
+
151
+
152
+ class JSONRPCRequest(JSONRPCMessage):
153
+ method: str
154
+ params: dict[str, Any] | None = None
155
+
156
+
157
+ class JSONRPCError(BaseModel):
158
+ code: int
159
+ message: str
160
+ data: Any | None = None
161
+
162
+
163
+ class JSONRPCResponse(JSONRPCMessage):
164
+ result: Any | None = None
165
+ error: JSONRPCError | None = None
166
+
167
+
168
+ class SendTaskRequest(JSONRPCRequest):
169
+ method: Literal["tasks/send"] = "tasks/send"
170
+ params: TaskSendParams
171
+
172
+
173
+ class SendTaskResponse(JSONRPCResponse):
174
+ result: Task | None = None
175
+
176
+
177
+ class SendTaskStreamingRequest(JSONRPCRequest):
178
+ method: Literal["tasks/sendSubscribe"] = "tasks/sendSubscribe"
179
+ params: TaskSendParams
180
+
181
+
182
+ class SendTaskStreamingResponse(JSONRPCResponse):
183
+ result: TaskStatusUpdateEvent | TaskArtifactUpdateEvent | None = None
184
+
185
+
186
+ class GetTaskRequest(JSONRPCRequest):
187
+ method: Literal["tasks/get"] = "tasks/get"
188
+ params: TaskQueryParams
189
+
190
+
191
+ class GetTaskResponse(JSONRPCResponse):
192
+ result: Task | None = None
193
+
194
+
195
+ class CancelTaskRequest(JSONRPCRequest):
196
+ method: Literal["tasks/cancel",] = "tasks/cancel"
197
+ params: TaskIdParams
198
+
199
+
200
+ class CancelTaskResponse(JSONRPCResponse):
201
+ result: Task | None = None
202
+
203
+
204
+ class SetTaskPushNotificationRequest(JSONRPCRequest):
205
+ method: Literal["tasks/pushNotification/set",] = "tasks/pushNotification/set"
206
+ params: TaskPushNotificationConfig
207
+
208
+
209
+ class SetTaskPushNotificationResponse(JSONRPCResponse):
210
+ result: TaskPushNotificationConfig | None = None
211
+
212
+
213
+ class GetTaskPushNotificationRequest(JSONRPCRequest):
214
+ method: Literal["tasks/pushNotification/get",] = "tasks/pushNotification/get"
215
+ params: TaskIdParams
216
+
217
+
218
+ class GetTaskPushNotificationResponse(JSONRPCResponse):
219
+ result: TaskPushNotificationConfig | None = None
220
+
221
+
222
+ class TaskResubscriptionRequest(JSONRPCRequest):
223
+ method: Literal["tasks/resubscribe",] = "tasks/resubscribe"
224
+ params: TaskIdParams
225
+
226
+
227
+ A2ARequest = TypeAdapter(
228
+ Annotated[
229
+ Union[
230
+ SendTaskRequest,
231
+ GetTaskRequest,
232
+ CancelTaskRequest,
233
+ SetTaskPushNotificationRequest,
234
+ GetTaskPushNotificationRequest,
235
+ TaskResubscriptionRequest,
236
+ SendTaskStreamingRequest,
237
+ ],
238
+ Field(discriminator="method"),
239
+ ]
240
+ )
241
+
242
+ # Error types
243
+
244
+
245
+ class JSONParseError(JSONRPCError):
246
+ code: int = -32700
247
+ message: str = "Invalid JSON payload"
248
+ data: Any | None = None
249
+
250
+
251
+ class InvalidRequestError(JSONRPCError):
252
+ code: int = -32600
253
+ message: str = "Request payload validation error"
254
+ data: Any | None = None
255
+
256
+
257
+ class MethodNotFoundError(JSONRPCError):
258
+ code: int = -32601
259
+ message: str = "Method not found"
260
+ data: None = None
261
+
262
+
263
+ class InvalidParamsError(JSONRPCError):
264
+ code: int = -32602
265
+ message: str = "Invalid parameters"
266
+ data: Any | None = None
267
+
268
+
269
+ class InternalError(JSONRPCError):
270
+ code: int = -32603
271
+ message: str = "Internal error"
272
+ data: Any | None = None
273
+
274
+
275
+ class TaskNotFoundError(JSONRPCError):
276
+ code: int = -32001
277
+ message: str = "Task not found"
278
+ data: None = None
279
+
280
+
281
+ class TaskNotCancelableError(JSONRPCError):
282
+ code: int = -32002
283
+ message: str = "Task cannot be canceled"
284
+ data: None = None
285
+
286
+
287
+ class PushNotificationNotSupportedError(JSONRPCError):
288
+ code: int = -32003
289
+ message: str = "Push Notification is not supported"
290
+ data: None = None
291
+
292
+
293
+ class UnsupportedOperationError(JSONRPCError):
294
+ code: int = -32004
295
+ message: str = "This operation is not supported"
296
+ data: None = None
297
+
298
+
299
+ class ContentTypeNotSupportedError(JSONRPCError):
300
+ code: int = -32005
301
+ message: str = "Incompatible content types"
302
+ data: None = None
303
+
304
+
305
+ class AgentProvider(BaseModel):
306
+ organization: str
307
+ url: str | None = None
308
+
309
+
310
+ class AgentCapabilities(BaseModel):
311
+ streaming: bool = False
312
+ pushNotifications: bool = False
313
+ stateTransitionHistory: bool = False
314
+
315
+
316
+ class AgentAuthentication(BaseModel):
317
+ schemes: List[str]
318
+ credentials: str | None = None
319
+
320
+
321
+ class AgentSkill(BaseModel):
322
+ id: str
323
+ name: str
324
+ description: str | None = None
325
+ tags: List[str] | None = None
326
+ examples: List[str] | None = None
327
+ inputModes: List[str] | None = None
328
+ outputModes: List[str] | None = None
329
+
330
+
331
+ class AgentCard(BaseModel):
332
+ name: str
333
+ description: str | None = None
334
+ url: str
335
+ provider: AgentProvider | None = None
336
+ version: str
337
+ documentationUrl: str | None = None
338
+ capabilities: AgentCapabilities
339
+ authentication: AgentAuthentication | None = None
340
+ defaultInputModes: List[str] = ["text"]
341
+ defaultOutputModes: List[str] = ["text"]
342
+ skills: List[AgentSkill]
343
+
344
+
345
+ class A2AClientError(Exception):
346
+ pass
347
+
348
+
349
+ class A2AClientHTTPError(A2AClientError):
350
+ def __init__(self, status_code: int, message: str):
351
+ self.status_code = status_code
352
+ self.message = message
353
+ super().__init__(f"HTTP Error {status_code}: {message}")
354
+
355
+
356
+ class A2AClientJSONError(A2AClientError):
357
+ def __init__(self, message: str):
358
+ self.message = message
359
+ super().__init__(f"JSON Error: {message}")
360
+
361
+
362
+ class MissingAPIKeyError(Exception):
363
+ """Exception for missing API key."""
364
+
365
+ pass
@@ -0,0 +1,9 @@
1
+ TEXT_BY_SUBTYPE = {
2
+ "plan": "To determine the distribution of companies by size, we first need to identify the relevant table and column that contains information about company sizes. Let's start by listing the tables in the database to find the appropriate one.",
3
+ "query": "Sales_Data_Expert_Demo_Data.public.`call_summaries`, Sales_Data_Expert_Demo_Data.public.`prospects_details`",
4
+ "curate": "To find the distribution of companies by size, we should examine the `prospects_details` table, as it likely contains information about potential customers, including company size. Let's first check the schema of the `prospects_details` table to identify the relevant column for company size.",
5
+ "validate": "Table named `Sales_Data_Expert_Demo_Data.public.prospects_details`:\n\nSample with first 3 rows from table Sales_Data_Expert_Demo_Data.public.prospects_details in CSV format (dialect is 'excel'):\n\nid,created_at,first_name,last_name,email,company,job_title,company_size,use_case\r\n1,2025-01-16 13:55:03,Alexandra,Dixon,alexandra.dixon@harveypayneandhudson.com,\"Harvey, Payne and Hudson\",Manager,Medium company (500-999 employees),Looking into predictive analytics for customer behavior\r\n2,2025-01-28 08:01:46,David,Clark,david.clark@boyd-hernandez.com,Boyd-Hernandez,CEO,Medium company (500-999 employees),Looking into predictive analytics for customer behavior\r\n3,2025-02-03 03:37:12,Jason,Mcmillan,jason.mcmillan@stokesandsons.com,Stokes and Sons,Marketing Manager,Small company (100-499 employees),Interested in AI search over my data\r\n\n\nColumn data types: \n`id` : `MYSQL_DATA_TYPE.INT`,\t\n`created_at` : `MYSQL_DATA_TYPE.DATETIME`,\t\n`first_name` : `MYSQL_DATA_TYPE.TEXT`,\t\n`last_name` : `MYSQL_DATA_TYPE.TEXT`,\t\n`email` : `MYSQL_DATA_TYPE.TEXT`,\t\n`company` : `MYSQL_DATA_TYPE.TEXT`,\t\n`job_title` : `MYSQL_DATA_TYPE.TEXT`,\t\n`company_size` : `MYSQL_DATA_TYPE.TEXT`,\t\n`use_case` : `MYSQL_DATA_TYPE.TEXT`\n",
6
+ "respond": "The `prospects_details` table contains a `company_size` column, which is what we need to determine the distribution of companies by size. Let's first retrieve the distinct values in the `company_size` column to understand the categories available, and then calculate the distribution.",
7
+ }
8
+
9
+ DEFAULT_STREAM_TIMEOUT = 300