MindsDB 25.5.3.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.
- mindsdb/__about__.py +1 -1
- mindsdb/__main__.py +127 -79
- mindsdb/api/a2a/__init__.py +0 -0
- mindsdb/api/a2a/__main__.py +114 -0
- mindsdb/api/a2a/a2a_client.py +439 -0
- mindsdb/api/a2a/agent.py +308 -0
- mindsdb/api/a2a/common/__init__.py +0 -0
- mindsdb/api/a2a/common/client/__init__.py +4 -0
- mindsdb/api/a2a/common/client/card_resolver.py +21 -0
- mindsdb/api/a2a/common/client/client.py +86 -0
- mindsdb/api/a2a/common/server/__init__.py +4 -0
- mindsdb/api/a2a/common/server/server.py +164 -0
- mindsdb/api/a2a/common/server/task_manager.py +287 -0
- mindsdb/api/a2a/common/server/utils.py +28 -0
- mindsdb/api/a2a/common/types.py +365 -0
- mindsdb/api/a2a/constants.py +9 -0
- mindsdb/api/a2a/run_a2a.py +129 -0
- mindsdb/api/a2a/task_manager.py +594 -0
- mindsdb/api/executor/command_executor.py +47 -27
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/planner/query_planner.py +10 -1
- mindsdb/api/executor/sql_query/result_set.py +185 -52
- mindsdb/api/executor/sql_query/sql_query.py +1 -1
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
- mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
- mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
- mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
- mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
- mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
- mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
- mindsdb/api/http/initialize.py +99 -83
- mindsdb/api/http/namespaces/analysis.py +3 -3
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/mcp/start.py +42 -5
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
- mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
- mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
- mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
- mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
- mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
- mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
- mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
- mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
- mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
- mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
- mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
- mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
- mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
- mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
- mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
- mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
- mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
- mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
- mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
- mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
- mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
- mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
- mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
- mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
- mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
- mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
- mindsdb/integrations/handlers/email_handler/settings.py +0 -1
- mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
- mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
- mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
- mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
- mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
- mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
- mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
- mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
- mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
- mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
- mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
- mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
- mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
- mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
- mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
- mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
- mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
- mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
- mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
- mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
- mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
- mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
- mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
- mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
- mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
- mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
- mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
- mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
- mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
- mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
- mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
- mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
- mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
- mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
- mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
- mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
- mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
- mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
- mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
- mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
- mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
- mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
- mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
- mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
- mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
- mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
- mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
- mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
- mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
- mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
- mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
- mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
- mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
- mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
- mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
- mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
- mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
- mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
- mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
- mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
- mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
- mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
- mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
- mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
- mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
- mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
- mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
- mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
- mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
- mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
- mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
- mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
- mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
- mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
- mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
- mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
- mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
- mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
- mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
- mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
- mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
- mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
- mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
- mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
- mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
- mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
- mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
- mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
- mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
- mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
- mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
- mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
- mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
- mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
- mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
- mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
- mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
- mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
- mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
- mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
- mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
- mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
- mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
- mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
- mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
- mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
- mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
- mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
- mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
- mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
- mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
- mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
- mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
- mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
- mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
- mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
- mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
- mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
- mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
- mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
- mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
- mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
- mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
- mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
- mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
- mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
- mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
- mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
- mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
- mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
- mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
- mindsdb/integrations/libs/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/handler_utils.py +15 -3
- mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
- mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
- mindsdb/integrations/utilities/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +15 -0
- mindsdb/interfaces/agents/langchain_agent.py +16 -4
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/knowledge_base/controller.py +25 -0
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/query_context/context_controller.py +66 -10
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
- mindsdb/interfaces/skills/skill_tool.py +202 -57
- mindsdb/interfaces/skills/sql_agent.py +205 -17
- mindsdb/interfaces/storage/fs.py +1 -0
- mindsdb/interfaces/variables/__init__.py +0 -0
- mindsdb/interfaces/variables/variables_controller.py +97 -0
- mindsdb/migrations/env.py +5 -7
- mindsdb/migrations/migrate.py +47 -7
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +331 -219
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +641 -695
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +309 -288
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
|
@@ -34,6 +34,7 @@ from mindsdb_sql_parser.ast import (
|
|
|
34
34
|
Use,
|
|
35
35
|
Tuple,
|
|
36
36
|
Function,
|
|
37
|
+
Variable,
|
|
37
38
|
)
|
|
38
39
|
|
|
39
40
|
# typed models
|
|
@@ -49,6 +50,7 @@ from mindsdb_sql_parser.ast.mindsdb import (
|
|
|
49
50
|
CreateSkill,
|
|
50
51
|
CreateTrigger,
|
|
51
52
|
CreateView,
|
|
53
|
+
CreateKnowledgeBaseIndex,
|
|
52
54
|
DropAgent,
|
|
53
55
|
DropChatBot,
|
|
54
56
|
DropDatasource,
|
|
@@ -101,6 +103,7 @@ from mindsdb.interfaces.model.functions import (
|
|
|
101
103
|
)
|
|
102
104
|
from mindsdb.interfaces.query_context.context_controller import query_context_controller
|
|
103
105
|
from mindsdb.interfaces.triggers.triggers_controller import TriggersController
|
|
106
|
+
from mindsdb.interfaces.variables.variables_controller import variables_controller
|
|
104
107
|
from mindsdb.utilities.context import context as ctx
|
|
105
108
|
from mindsdb.utilities.functions import mark_process, resolve_model_identifier, get_handler_install_message
|
|
106
109
|
from mindsdb.utilities.exception import EntityExistsError, EntityNotExistsError
|
|
@@ -336,7 +339,7 @@ class ExecuteCommands:
|
|
|
336
339
|
df2 = query_df(df, new_statement)
|
|
337
340
|
|
|
338
341
|
return ExecuteAnswer(
|
|
339
|
-
data=ResultSet
|
|
342
|
+
data=ResultSet.from_df(df2, table_name="session_variables")
|
|
340
343
|
)
|
|
341
344
|
elif sql_category == "search_path":
|
|
342
345
|
return ExecuteAnswer(
|
|
@@ -511,28 +514,30 @@ class ExecuteCommands:
|
|
|
511
514
|
return ExecuteAnswer()
|
|
512
515
|
elif statement_type is Set:
|
|
513
516
|
category = (statement.category or "").lower()
|
|
514
|
-
if category == ""
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
517
|
+
if category == "":
|
|
518
|
+
if isinstance(statement.name, Identifier):
|
|
519
|
+
param = statement.name.parts[0].lower()
|
|
520
|
+
|
|
521
|
+
value = None
|
|
522
|
+
if isinstance(statement.value, Constant):
|
|
523
|
+
value = statement.value.value
|
|
524
|
+
|
|
525
|
+
if param == "profiling":
|
|
526
|
+
self.session.profiling = value in (1, True)
|
|
527
|
+
if self.session.profiling is True:
|
|
528
|
+
profiler.enable()
|
|
529
|
+
else:
|
|
530
|
+
profiler.disable()
|
|
531
|
+
elif param == "predictor_cache":
|
|
532
|
+
self.session.predictor_cache = value in (1, True)
|
|
533
|
+
elif param == "context":
|
|
534
|
+
if value in (0, False, None):
|
|
535
|
+
# drop context
|
|
536
|
+
query_context_controller.drop_query_context(None)
|
|
537
|
+
elif param == "show_secrets":
|
|
538
|
+
self.session.show_secrets = value in (1, True)
|
|
539
|
+
elif isinstance(statement.name, Variable):
|
|
540
|
+
variables_controller.set_variable(statement.name.value, statement.value)
|
|
536
541
|
return ExecuteAnswer()
|
|
537
542
|
elif category == "autocommit":
|
|
538
543
|
return ExecuteAnswer()
|
|
@@ -649,6 +654,8 @@ class ExecuteCommands:
|
|
|
649
654
|
elif statement_type is Evaluate:
|
|
650
655
|
statement.data = parse_sql(statement.query_str)
|
|
651
656
|
return self.answer_evaluate_metric(statement, database_name)
|
|
657
|
+
elif statement_type is CreateKnowledgeBaseIndex:
|
|
658
|
+
return self.answer_create_kb_index(statement, database_name)
|
|
652
659
|
else:
|
|
653
660
|
logger.warning(f"Unknown SQL statement: {sql}")
|
|
654
661
|
raise NotSupportedYet(f"Unknown SQL statement: {sql}")
|
|
@@ -936,8 +943,18 @@ class ExecuteCommands:
|
|
|
936
943
|
)
|
|
937
944
|
|
|
938
945
|
return ExecuteAnswer(
|
|
939
|
-
data=ResultSet
|
|
946
|
+
data=ResultSet.from_df(df, table_name="")
|
|
947
|
+
)
|
|
948
|
+
|
|
949
|
+
def answer_create_kb_index(self, statement, database_name):
|
|
950
|
+
table_name = statement.name.parts[-1]
|
|
951
|
+
project_name = (
|
|
952
|
+
statement.name.parts[0]
|
|
953
|
+
if len(statement.name.parts) > 1
|
|
954
|
+
else database_name
|
|
940
955
|
)
|
|
956
|
+
self.session.kb_controller.create_index(table_name=table_name, project_name=project_name)
|
|
957
|
+
return ExecuteAnswer()
|
|
941
958
|
|
|
942
959
|
def _get_model_info(self, identifier, except_absent=True, database_name=None):
|
|
943
960
|
if len(identifier.parts) == 1:
|
|
@@ -968,6 +985,9 @@ class ExecuteCommands:
|
|
|
968
985
|
"""Checks if there is already a predictor retraining or fine-tuning
|
|
969
986
|
Do not allow to run retrain if there is another model in training process in less that 1h
|
|
970
987
|
"""
|
|
988
|
+
if ctx.company_id is None:
|
|
989
|
+
# bypass for tests
|
|
990
|
+
return
|
|
971
991
|
is_cloud = self.session.config.get("cloud", False)
|
|
972
992
|
if is_cloud and ctx.user_class == 0:
|
|
973
993
|
models = get_model_records(active=None)
|
|
@@ -1032,7 +1052,7 @@ class ExecuteCommands:
|
|
|
1032
1052
|
df = self.session.model_controller.retrain_model(statement, ml_handler)
|
|
1033
1053
|
|
|
1034
1054
|
return ExecuteAnswer(
|
|
1035
|
-
data=ResultSet
|
|
1055
|
+
data=ResultSet.from_df(df)
|
|
1036
1056
|
)
|
|
1037
1057
|
|
|
1038
1058
|
@profiler.profile()
|
|
@@ -1062,7 +1082,7 @@ class ExecuteCommands:
|
|
|
1062
1082
|
df = self.session.model_controller.finetune_model(statement, ml_handler)
|
|
1063
1083
|
|
|
1064
1084
|
return ExecuteAnswer(
|
|
1065
|
-
data=ResultSet
|
|
1085
|
+
data=ResultSet.from_df(df)
|
|
1066
1086
|
)
|
|
1067
1087
|
|
|
1068
1088
|
def _create_integration(self, name: str, engine: str, connection_args: dict):
|
|
@@ -1572,7 +1592,7 @@ class ExecuteCommands:
|
|
|
1572
1592
|
try:
|
|
1573
1593
|
df = self.session.model_controller.create_model(statement, ml_handler)
|
|
1574
1594
|
|
|
1575
|
-
return ExecuteAnswer(data=ResultSet
|
|
1595
|
+
return ExecuteAnswer(data=ResultSet.from_df(df))
|
|
1576
1596
|
except EntityExistsError:
|
|
1577
1597
|
if getattr(statement, "if_not_exists", False) is True:
|
|
1578
1598
|
return ExecuteAnswer()
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
from dataclasses import dataclass, field
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import List, Dict
|
|
3
3
|
|
|
4
4
|
import pandas as pd
|
|
5
5
|
|
|
6
|
+
from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
@dataclass
|
|
8
10
|
class DataHubResponse:
|
|
9
11
|
data_frame: pd.DataFrame = field(default_factory=pd.DataFrame)
|
|
10
12
|
columns: List[Dict] = field(default_factory=list)
|
|
11
|
-
affected_rows:
|
|
13
|
+
affected_rows: int | None = None
|
|
14
|
+
mysql_types: list[MYSQL_DATA_TYPE] | None = None
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import time
|
|
2
2
|
import inspect
|
|
3
3
|
from dataclasses import astuple
|
|
4
|
+
from typing import Iterable
|
|
4
5
|
|
|
5
6
|
import numpy as np
|
|
6
|
-
from numpy import dtype as np_dtype
|
|
7
7
|
import pandas as pd
|
|
8
|
-
from pandas.api import types as pd_types
|
|
9
8
|
from sqlalchemy.types import (
|
|
10
|
-
Integer, Float
|
|
9
|
+
Integer, Float
|
|
11
10
|
)
|
|
12
11
|
|
|
13
12
|
from mindsdb_sql_parser.ast.base import ASTNode
|
|
@@ -121,9 +120,7 @@ class IntegrationDataNode(DataNode):
|
|
|
121
120
|
tables=[name],
|
|
122
121
|
if_exists=if_exists
|
|
123
122
|
)
|
|
124
|
-
|
|
125
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
126
|
-
raise Exception(result.error_message)
|
|
123
|
+
self.query(drop_ast)
|
|
127
124
|
|
|
128
125
|
def create_table(self, table_name: Identifier, result_set: ResultSet = None, columns=None,
|
|
129
126
|
is_replace=False, is_create=False, **kwargs) -> DataHubResponse:
|
|
@@ -138,27 +135,11 @@ class IntegrationDataNode(DataNode):
|
|
|
138
135
|
|
|
139
136
|
df = result_set.get_raw_df()
|
|
140
137
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if pd_types.is_object_dtype(dtype):
|
|
147
|
-
# try to infer
|
|
148
|
-
dtype = df[idx].infer_objects().dtype
|
|
149
|
-
|
|
150
|
-
if pd_types.is_integer_dtype(dtype):
|
|
151
|
-
column_type = Integer
|
|
152
|
-
elif pd_types.is_numeric_dtype(dtype):
|
|
153
|
-
column_type = Float
|
|
154
|
-
|
|
155
|
-
columns.append(
|
|
156
|
-
TableColumn(
|
|
157
|
-
name=col.alias,
|
|
158
|
-
type=column_type
|
|
159
|
-
)
|
|
160
|
-
)
|
|
161
|
-
table_columns_meta[col.alias] = column_type
|
|
138
|
+
columns: list[TableColumn] = result_set.get_ast_columns()
|
|
139
|
+
table_columns_meta = {
|
|
140
|
+
column.name: column.type
|
|
141
|
+
for column in columns
|
|
142
|
+
}
|
|
162
143
|
|
|
163
144
|
if is_replace:
|
|
164
145
|
# drop
|
|
@@ -166,9 +147,7 @@ class IntegrationDataNode(DataNode):
|
|
|
166
147
|
tables=[table_name],
|
|
167
148
|
if_exists=True
|
|
168
149
|
)
|
|
169
|
-
|
|
170
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
171
|
-
raise Exception(result.error_message)
|
|
150
|
+
self.query(drop_ast)
|
|
172
151
|
is_create = True
|
|
173
152
|
|
|
174
153
|
if is_create:
|
|
@@ -177,9 +156,7 @@ class IntegrationDataNode(DataNode):
|
|
|
177
156
|
columns=columns,
|
|
178
157
|
is_replace=is_replace
|
|
179
158
|
)
|
|
180
|
-
|
|
181
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
182
|
-
raise Exception(result.error_message)
|
|
159
|
+
self.query(create_table_ast)
|
|
183
160
|
|
|
184
161
|
if result_set is None:
|
|
185
162
|
# it is just a 'create table'
|
|
@@ -224,56 +201,44 @@ class IntegrationDataNode(DataNode):
|
|
|
224
201
|
)
|
|
225
202
|
|
|
226
203
|
try:
|
|
227
|
-
result = self.
|
|
204
|
+
result: DataHubResponse = self.query(insert_ast)
|
|
228
205
|
except Exception as e:
|
|
229
206
|
msg = f'[{self.ds_type}/{self.integration_name}]: {str(e)}'
|
|
230
207
|
raise DBHandlerException(msg) from e
|
|
231
208
|
|
|
232
|
-
if result.type == RESPONSE_TYPE.ERROR:
|
|
233
|
-
raise Exception(result.error_message)
|
|
234
|
-
|
|
235
209
|
return DataHubResponse(affected_rows=result.affected_rows)
|
|
236
210
|
|
|
237
|
-
def
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
num_rows = 0
|
|
246
|
-
if result.data_frame is not None:
|
|
247
|
-
num_rows = len(result.data_frame.index)
|
|
248
|
-
response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
|
|
249
|
-
get_class_name(self.integration_handler), result.type)
|
|
250
|
-
response_size_with_labels.observe(num_rows)
|
|
251
|
-
return result
|
|
252
|
-
|
|
253
|
-
def _native_query(self, native_query) -> HandlerResponse:
|
|
254
|
-
time_before_query = time.perf_counter()
|
|
255
|
-
result = self.integration_handler.native_query(native_query)
|
|
256
|
-
elapsed_seconds = time.perf_counter() - time_before_query
|
|
257
|
-
query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
|
|
258
|
-
get_class_name(self.integration_handler), result.type)
|
|
259
|
-
query_time_with_labels.observe(elapsed_seconds)
|
|
260
|
-
|
|
261
|
-
num_rows = 0
|
|
262
|
-
if result.data_frame is not None:
|
|
263
|
-
num_rows = len(result.data_frame.index)
|
|
264
|
-
response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
|
|
265
|
-
get_class_name(self.integration_handler), result.type)
|
|
266
|
-
response_size_with_labels.observe(num_rows)
|
|
267
|
-
return result
|
|
211
|
+
def has_support_stream(self) -> bool:
|
|
212
|
+
# checks if data handler has query_stream method
|
|
213
|
+
return hasattr(self.integration_handler, 'query_stream') and callable(self.integration_handler.query_stream)
|
|
214
|
+
|
|
215
|
+
@profiler.profile()
|
|
216
|
+
def query_stream(self, query: ASTNode, fetch_size: int = None) -> Iterable:
|
|
217
|
+
# returns generator of results from handler (split by chunks)
|
|
218
|
+
return self.integration_handler.query_stream(query, fetch_size=fetch_size)
|
|
268
219
|
|
|
269
220
|
@profiler.profile()
|
|
270
221
|
def query(self, query: ASTNode | None = None, native_query: str | None = None, session=None) -> DataHubResponse:
|
|
271
222
|
try:
|
|
223
|
+
time_before_query = time.perf_counter()
|
|
272
224
|
if query is not None:
|
|
273
|
-
result: HandlerResponse = self.
|
|
225
|
+
result: HandlerResponse = self.integration_handler.query(query)
|
|
274
226
|
else:
|
|
275
227
|
# try to fetch native query
|
|
276
|
-
result: HandlerResponse = self.
|
|
228
|
+
result: HandlerResponse = self.integration_handler.native_query(native_query)
|
|
229
|
+
|
|
230
|
+
# metrics
|
|
231
|
+
elapsed_seconds = time.perf_counter() - time_before_query
|
|
232
|
+
query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
|
|
233
|
+
get_class_name(self.integration_handler), result.type)
|
|
234
|
+
query_time_with_labels.observe(elapsed_seconds)
|
|
235
|
+
|
|
236
|
+
num_rows = 0
|
|
237
|
+
if result.data_frame is not None:
|
|
238
|
+
num_rows = len(result.data_frame.index)
|
|
239
|
+
response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
|
|
240
|
+
get_class_name(self.integration_handler), result.type)
|
|
241
|
+
response_size_with_labels.observe(num_rows)
|
|
277
242
|
except Exception as e:
|
|
278
243
|
msg = str(e).strip()
|
|
279
244
|
if msg == '':
|
|
@@ -294,7 +259,8 @@ class IntegrationDataNode(DataNode):
|
|
|
294
259
|
|
|
295
260
|
try:
|
|
296
261
|
# replace python's Nan, np.NaN, np.nan and pd.NA to None
|
|
297
|
-
|
|
262
|
+
# TODO keep all NAN to the end of processing, bacause replacing also changes dtypes
|
|
263
|
+
df.replace([np.NaN, pd.NA, pd.NaT], None, inplace=True)
|
|
298
264
|
except Exception as e:
|
|
299
265
|
logger.error(f"Issue with clearing DF from NaN values: {e}")
|
|
300
266
|
# endregion
|
|
@@ -310,5 +276,6 @@ class IntegrationDataNode(DataNode):
|
|
|
310
276
|
return DataHubResponse(
|
|
311
277
|
data_frame=df,
|
|
312
278
|
columns=columns_info,
|
|
313
|
-
affected_rows=result.affected_rows
|
|
279
|
+
affected_rows=result.affected_rows,
|
|
280
|
+
mysql_types=result.mysql_types
|
|
314
281
|
)
|
|
@@ -848,11 +848,12 @@ class QueryPlanner:
|
|
|
848
848
|
"""
|
|
849
849
|
|
|
850
850
|
# handle fetchdataframe partitioning
|
|
851
|
+
steps_in = plan.steps
|
|
851
852
|
steps_out = []
|
|
852
853
|
|
|
853
854
|
step = None
|
|
854
855
|
partition_step = None
|
|
855
|
-
for step in
|
|
856
|
+
for step in steps_in:
|
|
856
857
|
if isinstance(step, FetchDataframeStep) and step.params is not None:
|
|
857
858
|
batch_size = step.params.get('batch_size')
|
|
858
859
|
if batch_size is not None:
|
|
@@ -905,6 +906,14 @@ class QueryPlanner:
|
|
|
905
906
|
|
|
906
907
|
if plan.is_resumable and isinstance(step, InsertToTable):
|
|
907
908
|
plan.is_async = True
|
|
909
|
+
else:
|
|
910
|
+
# special case: register insert from select (it is the same as mark resumable)
|
|
911
|
+
if (
|
|
912
|
+
len(steps_in) == 2
|
|
913
|
+
and isinstance(steps_in[0], FetchDataframeStep)
|
|
914
|
+
and isinstance(steps_in[1], InsertToTable)
|
|
915
|
+
):
|
|
916
|
+
plan.is_resumable = True
|
|
908
917
|
|
|
909
918
|
plan.steps = steps_out
|
|
910
919
|
return plan
|