MindsDB 25.4.5.0__py3-none-any.whl → 25.5.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of MindsDB might be problematic. Click here for more details.
- mindsdb/__about__.py +1 -1
- mindsdb/__main__.py +215 -185
- 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 +49 -28
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/information_schema_datanode.py +8 -0
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/datahub/datanodes/system_tables.py +10 -13
- mindsdb/api/executor/planner/query_planner.py +14 -2
- 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 +11 -13
- 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 +118 -85
- mindsdb/api/http/namespaces/analysis.py +17 -4
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/http/namespaces/tree.py +1 -1
- mindsdb/api/http/start.py +7 -2
- 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 +86 -123
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/mysql/mysql_proxy/utilities/exceptions.py +0 -4
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_packets/postgres_message_formats.py +2 -2
- 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/requirements.txt +1 -0
- 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/chromadb_handler/requirements.txt +1 -0
- 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/gmail_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/google_analytics_handler/requirements.txt +2 -1
- 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_books_handler/requirements.txt +1 -1
- 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_calendar_handler/requirements.txt +1 -0
- 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_content_shopping_handler/requirements.txt +1 -1
- 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_fit_handler/requirements.txt +2 -0
- 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/google_search_handler/requirements.txt +1 -1
- 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.archived.py +75 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +113 -38
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +229 -0
- mindsdb/integrations/handlers/jira_handler/requirements.txt +1 -0
- 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/lightfm_handler/requirements.txt +1 -0
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -3
- mindsdb/integrations/handlers/lightwood_handler/requirements.txt +4 -4
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/lindorm_handler/requirements.txt +1 -0
- 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_one_drive_handler/requirements.txt +2 -0
- 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/ms_teams_handler/requirements.txt +3 -1
- 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/openai_handler/openai_handler.py +5 -4
- 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/requirements.txt +1 -1
- 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/requirements.txt +1 -0
- 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/requirements.txt +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/files/file_reader.py +5 -2
- 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 +29 -2
- mindsdb/interfaces/agents/langchain_agent.py +18 -8
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/database/projects.py +1 -7
- mindsdb/interfaces/functions/controller.py +11 -14
- mindsdb/interfaces/functions/to_markdown.py +9 -124
- mindsdb/interfaces/knowledge_base/controller.py +47 -19
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +41 -15
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/knowledge_base/utils.py +10 -15
- mindsdb/interfaces/model/model_controller.py +0 -2
- 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 +238 -28
- 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 -9
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +333 -220
- mindsdb/utilities/context.py +1 -1
- mindsdb/utilities/functions.py +0 -36
- mindsdb/utilities/langfuse.py +19 -10
- mindsdb/utilities/otel/__init__.py +9 -193
- mindsdb/utilities/otel/metric_handlers/__init__.py +5 -1
- mindsdb/utilities/otel/prepare.py +198 -0
- mindsdb/utilities/sql.py +83 -0
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +351 -338
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +348 -322
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
- mindsdb/api/mysql/mysql_proxy/classes/sql_statement_parser.py +0 -151
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
|
@@ -55,7 +55,7 @@ class SubSelectStepCall(BaseStepCall):
|
|
|
55
55
|
|
|
56
56
|
for col_name in query_cols:
|
|
57
57
|
if col_name not in result_cols:
|
|
58
|
-
result.add_column(Column(col_name))
|
|
58
|
+
result.add_column(Column(name=col_name))
|
|
59
59
|
|
|
60
60
|
# inject previous step values
|
|
61
61
|
if isinstance(query, Select):
|
|
@@ -69,12 +69,10 @@ class SubSelectStepCall(BaseStepCall):
|
|
|
69
69
|
df = result.to_df()
|
|
70
70
|
res = query_df(df, query, session=self.session)
|
|
71
71
|
|
|
72
|
-
result2 = ResultSet()
|
|
73
72
|
# get database from first column
|
|
74
73
|
database = result.columns[0].database
|
|
75
|
-
result2.from_df(res, database, table_name)
|
|
76
74
|
|
|
77
|
-
return
|
|
75
|
+
return ResultSet.from_df(res, database, table_name)
|
|
78
76
|
|
|
79
77
|
|
|
80
78
|
class QueryStepCall(BaseStepCall):
|
|
@@ -86,7 +84,7 @@ class QueryStepCall(BaseStepCall):
|
|
|
86
84
|
|
|
87
85
|
if step.from_table is not None:
|
|
88
86
|
if isinstance(step.from_table, pd.DataFrame):
|
|
89
|
-
result_set = ResultSet
|
|
87
|
+
result_set = ResultSet.from_df(step.from_table)
|
|
90
88
|
else:
|
|
91
89
|
result_set = self.steps_data[step.from_table.step_num]
|
|
92
90
|
else:
|
|
@@ -208,6 +206,4 @@ class QueryStepCall(BaseStepCall):
|
|
|
208
206
|
query.from_table = Identifier('df_table')
|
|
209
207
|
res = query_df(df, query, session=self.session)
|
|
210
208
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return data
|
|
209
|
+
return ResultSet.from_df_cols(df=res, columns_dict=col_names, strict=False)
|
mindsdb/api/http/initialize.py
CHANGED
|
@@ -4,9 +4,11 @@ import mimetypes
|
|
|
4
4
|
import threading
|
|
5
5
|
import traceback
|
|
6
6
|
import webbrowser
|
|
7
|
+
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from http import HTTPStatus
|
|
9
10
|
|
|
11
|
+
|
|
10
12
|
import requests
|
|
11
13
|
from flask import Flask, url_for, make_response, request, send_from_directory
|
|
12
14
|
from flask.json import dumps
|
|
@@ -50,17 +52,37 @@ from mindsdb.utilities.json_encoder import CustomJSONProvider
|
|
|
50
52
|
from mindsdb.utilities.ps import is_pid_listen_port, wait_func_is_true
|
|
51
53
|
from mindsdb.utilities.sentry import sentry_sdk # noqa: F401
|
|
52
54
|
from mindsdb.utilities.otel import trace # noqa: F401
|
|
53
|
-
from opentelemetry.instrumentation.flask import FlaskInstrumentor # noqa: F401
|
|
54
|
-
from opentelemetry.instrumentation.requests import RequestsInstrumentor # noqa: F401
|
|
55
55
|
|
|
56
56
|
logger = log.getLogger(__name__)
|
|
57
57
|
|
|
58
58
|
|
|
59
|
+
class _NoOpFlaskInstrumentor:
|
|
60
|
+
def instrument_app(self, app):
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class _NoOpRequestsInstrumentor:
|
|
65
|
+
def instrument(self):
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
from opentelemetry.instrumentation.flask import FlaskInstrumentor
|
|
71
|
+
from opentelemetry.instrumentation.requests import RequestsInstrumentor
|
|
72
|
+
except ImportError:
|
|
73
|
+
logger.debug(
|
|
74
|
+
"OpenTelemetry is not avaiable. Please run `pip install -r requirements/requirements-opentelemetry.txt` to use it."
|
|
75
|
+
)
|
|
76
|
+
FlaskInstrumentor = _NoOpFlaskInstrumentor
|
|
77
|
+
RequestsInstrumentor = _NoOpRequestsInstrumentor
|
|
78
|
+
|
|
79
|
+
|
|
59
80
|
class Swagger_Api(Api):
|
|
60
81
|
"""
|
|
61
82
|
This is a modification of the base Flask Restplus Api class due to the issue described here
|
|
62
83
|
https://github.com/noirbizarre/flask-restplus/issues/223
|
|
63
84
|
"""
|
|
85
|
+
|
|
64
86
|
@property
|
|
65
87
|
def specs_url(self):
|
|
66
88
|
return url_for(self.endpoint("specs"), _external=False)
|
|
@@ -75,7 +97,10 @@ def custom_output_json(data, code, headers=None):
|
|
|
75
97
|
def get_last_compatible_gui_version() -> Version:
|
|
76
98
|
logger.debug("Getting last compatible frontend..")
|
|
77
99
|
try:
|
|
78
|
-
res = requests.get(
|
|
100
|
+
res = requests.get(
|
|
101
|
+
"https://mindsdb-web-builds.s3.amazonaws.com/compatible-config.json",
|
|
102
|
+
timeout=5,
|
|
103
|
+
)
|
|
79
104
|
except (ConnectionError, requests.exceptions.ConnectionError) as e:
|
|
80
105
|
logger.error(f"Is no connection. {e}")
|
|
81
106
|
return False
|
|
@@ -101,13 +126,16 @@ def get_last_compatible_gui_version() -> Version:
|
|
|
101
126
|
gui_versions = {}
|
|
102
127
|
max_mindsdb_lv = None
|
|
103
128
|
max_gui_lv = None
|
|
104
|
-
for el in versions[
|
|
105
|
-
if el[
|
|
106
|
-
gui_lv = parse_version(el[
|
|
129
|
+
for el in versions["mindsdb"]:
|
|
130
|
+
if el["mindsdb_version"] is None:
|
|
131
|
+
gui_lv = parse_version(el["gui_version"])
|
|
107
132
|
else:
|
|
108
|
-
mindsdb_lv = parse_version(el[
|
|
109
|
-
gui_lv = parse_version(el[
|
|
110
|
-
if
|
|
133
|
+
mindsdb_lv = parse_version(el["mindsdb_version"])
|
|
134
|
+
gui_lv = parse_version(el["gui_version"])
|
|
135
|
+
if (
|
|
136
|
+
mindsdb_lv.base_version not in gui_versions
|
|
137
|
+
or gui_lv > gui_versions[mindsdb_lv.base_version]
|
|
138
|
+
):
|
|
111
139
|
gui_versions[mindsdb_lv.base_version] = gui_lv
|
|
112
140
|
if max_mindsdb_lv is None or max_mindsdb_lv < mindsdb_lv:
|
|
113
141
|
max_mindsdb_lv = mindsdb_lv
|
|
@@ -122,7 +150,11 @@ def get_last_compatible_gui_version() -> Version:
|
|
|
122
150
|
elif current_mindsdb_lv > all_mindsdb_lv[-1]:
|
|
123
151
|
gui_version_lv = max_gui_lv
|
|
124
152
|
else:
|
|
125
|
-
lower_versions = {
|
|
153
|
+
lower_versions = {
|
|
154
|
+
key: value
|
|
155
|
+
for key, value in gui_versions.items()
|
|
156
|
+
if parse_version(key) < current_mindsdb_lv
|
|
157
|
+
}
|
|
126
158
|
if len(lower_versions) == 0:
|
|
127
159
|
gui_version_lv = gui_versions[all_mindsdb_lv[0].base_version]
|
|
128
160
|
else:
|
|
@@ -139,12 +171,12 @@ def get_last_compatible_gui_version() -> Version:
|
|
|
139
171
|
def get_current_gui_version() -> Version:
|
|
140
172
|
logger.debug("Getting current frontend version..")
|
|
141
173
|
config = Config()
|
|
142
|
-
static_path = Path(config[
|
|
143
|
-
version_txt_path = static_path.joinpath(
|
|
174
|
+
static_path = Path(config["paths"]["static"])
|
|
175
|
+
version_txt_path = static_path.joinpath("version.txt")
|
|
144
176
|
|
|
145
177
|
current_gui_version = None
|
|
146
178
|
if version_txt_path.is_file():
|
|
147
|
-
with open(version_txt_path,
|
|
179
|
+
with open(version_txt_path, "rt") as f:
|
|
148
180
|
current_gui_version = f.readline()
|
|
149
181
|
|
|
150
182
|
current_gui_lv = (
|
|
@@ -160,7 +192,7 @@ def initialize_static():
|
|
|
160
192
|
config = Config()
|
|
161
193
|
last_gui_version_lv = get_last_compatible_gui_version()
|
|
162
194
|
current_gui_version_lv = get_current_gui_version()
|
|
163
|
-
required_gui_version = config[
|
|
195
|
+
required_gui_version = config["gui"].get("version")
|
|
164
196
|
|
|
165
197
|
if required_gui_version is not None:
|
|
166
198
|
required_gui_version_lv = parse_version(required_gui_version)
|
|
@@ -176,7 +208,10 @@ def initialize_static():
|
|
|
176
208
|
return False
|
|
177
209
|
|
|
178
210
|
# ignore versions like '23.9.2.2'
|
|
179
|
-
if
|
|
211
|
+
if (
|
|
212
|
+
current_gui_version_lv is not None
|
|
213
|
+
and len(current_gui_version_lv.release) < 3
|
|
214
|
+
):
|
|
180
215
|
if current_gui_version_lv == last_gui_version_lv:
|
|
181
216
|
return True
|
|
182
217
|
logger.debug("Updating gui..")
|
|
@@ -187,37 +222,40 @@ def initialize_static():
|
|
|
187
222
|
|
|
188
223
|
|
|
189
224
|
def initialize_app(config, no_studio):
|
|
190
|
-
static_root = config[
|
|
225
|
+
static_root = config["paths"]["static"]
|
|
191
226
|
logger.debug(f"Static route: {static_root}")
|
|
192
|
-
gui_exists = Path(static_root).joinpath(
|
|
227
|
+
gui_exists = Path(static_root).joinpath("index.html").is_file()
|
|
193
228
|
logger.debug(f"Does GUI already exist.. {'YES' if gui_exists else 'NO'}")
|
|
194
229
|
init_static_thread = None
|
|
195
|
-
if (
|
|
196
|
-
|
|
197
|
-
and (
|
|
198
|
-
config['gui']['autoupdate'] is True
|
|
199
|
-
or gui_exists is False
|
|
200
|
-
)
|
|
230
|
+
if no_studio is False and (
|
|
231
|
+
config["gui"]["autoupdate"] is True or gui_exists is False
|
|
201
232
|
):
|
|
202
|
-
init_static_thread = threading.Thread(
|
|
233
|
+
init_static_thread = threading.Thread(
|
|
234
|
+
target=initialize_static, name="initialize_static"
|
|
235
|
+
)
|
|
203
236
|
init_static_thread.start()
|
|
204
237
|
|
|
238
|
+
# Wait for static initialization.
|
|
239
|
+
if not no_studio and init_static_thread is not None:
|
|
240
|
+
init_static_thread.join()
|
|
241
|
+
|
|
205
242
|
app, api = initialize_flask(config, init_static_thread, no_studio)
|
|
206
243
|
Compress(app)
|
|
244
|
+
|
|
207
245
|
initialize_interfaces(app)
|
|
208
246
|
|
|
209
247
|
if os.path.isabs(static_root) is False:
|
|
210
248
|
static_root = os.path.join(os.getcwd(), static_root)
|
|
211
249
|
static_root = Path(static_root)
|
|
212
250
|
|
|
213
|
-
@app.route(
|
|
214
|
-
@app.route(
|
|
251
|
+
@app.route("/", defaults={"path": ""}, methods=["GET"])
|
|
252
|
+
@app.route("/<path:path>", methods=["GET"])
|
|
215
253
|
def root_index(path):
|
|
216
|
-
if path.startswith(
|
|
254
|
+
if path.startswith("api/"):
|
|
217
255
|
return http_error(
|
|
218
256
|
HTTPStatus.NOT_FOUND,
|
|
219
|
-
|
|
220
|
-
|
|
257
|
+
"Not found",
|
|
258
|
+
"The endpoint you are trying to access does not exist on the server.",
|
|
221
259
|
)
|
|
222
260
|
|
|
223
261
|
# Normalize the path.
|
|
@@ -227,14 +265,14 @@ def initialize_app(config, no_studio):
|
|
|
227
265
|
if not full_path.startswith(str(static_root)):
|
|
228
266
|
return http_error(
|
|
229
267
|
HTTPStatus.FORBIDDEN,
|
|
230
|
-
|
|
231
|
-
|
|
268
|
+
"Forbidden",
|
|
269
|
+
"You are not allowed to access the requested resource.",
|
|
232
270
|
)
|
|
233
271
|
|
|
234
272
|
if os.path.isfile(full_path):
|
|
235
273
|
return send_from_directory(static_root, path)
|
|
236
274
|
else:
|
|
237
|
-
return send_from_directory(static_root,
|
|
275
|
+
return send_from_directory(static_root, "index.html")
|
|
238
276
|
|
|
239
277
|
protected_namespaces = [
|
|
240
278
|
tab_ns,
|
|
@@ -253,7 +291,7 @@ def initialize_app(config, no_studio):
|
|
|
253
291
|
skills_ns,
|
|
254
292
|
agents_ns,
|
|
255
293
|
jobs_ns,
|
|
256
|
-
knowledge_bases_ns
|
|
294
|
+
knowledge_bases_ns,
|
|
257
295
|
]
|
|
258
296
|
|
|
259
297
|
for ns in protected_namespaces:
|
|
@@ -268,20 +306,20 @@ def initialize_app(config, no_studio):
|
|
|
268
306
|
# pass through HTTP errors
|
|
269
307
|
# NOTE flask_restx require 'message', also it modyfies 'application/problem+json' to 'application/json'
|
|
270
308
|
if isinstance(e, HTTPException):
|
|
271
|
-
return (
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
309
|
+
return (
|
|
310
|
+
{"title": e.name, "detail": e.description, "message": e.description},
|
|
311
|
+
e.code,
|
|
312
|
+
{"Content-Type": "application/problem+json"},
|
|
313
|
+
)
|
|
314
|
+
return (
|
|
315
|
+
{
|
|
316
|
+
"title": getattr(type(e), "__name__") or "Unknown error",
|
|
317
|
+
"detail": str(e),
|
|
318
|
+
"message": str(e),
|
|
319
|
+
},
|
|
320
|
+
500,
|
|
321
|
+
{"Content-Type": "application/problem+json"},
|
|
322
|
+
)
|
|
285
323
|
|
|
286
324
|
@app.teardown_appcontext
|
|
287
325
|
def remove_session(*args, **kwargs):
|
|
@@ -295,31 +333,34 @@ def initialize_app(config, no_studio):
|
|
|
295
333
|
|
|
296
334
|
# region routes where auth is required
|
|
297
335
|
if (
|
|
298
|
-
config[
|
|
299
|
-
and any(
|
|
336
|
+
config["auth"]["http_auth_enabled"] is True
|
|
337
|
+
and any(
|
|
338
|
+
request.path.startswith(f"/api{ns.path}") for ns in protected_namespaces
|
|
339
|
+
)
|
|
300
340
|
and check_auth() is False
|
|
301
341
|
):
|
|
302
342
|
return http_error(
|
|
303
|
-
HTTPStatus.UNAUTHORIZED,
|
|
304
|
-
|
|
343
|
+
HTTPStatus.UNAUTHORIZED,
|
|
344
|
+
"Unauthorized",
|
|
345
|
+
"Authorization is required to complete the request",
|
|
305
346
|
)
|
|
306
347
|
# endregion
|
|
307
348
|
|
|
308
|
-
company_id = request.headers.get(
|
|
309
|
-
user_class = request.headers.get(
|
|
349
|
+
company_id = request.headers.get("company-id")
|
|
350
|
+
user_class = request.headers.get("user-class")
|
|
310
351
|
|
|
311
352
|
try:
|
|
312
|
-
email_confirmed = int(request.headers.get(
|
|
353
|
+
email_confirmed = int(request.headers.get("email-confirmed", 1))
|
|
313
354
|
except Exception:
|
|
314
355
|
email_confirmed = 1
|
|
315
356
|
|
|
316
357
|
try:
|
|
317
|
-
user_id = int(request.headers.get(
|
|
358
|
+
user_id = int(request.headers.get("user-id", 0))
|
|
318
359
|
except Exception:
|
|
319
360
|
user_id = 0
|
|
320
361
|
|
|
321
362
|
try:
|
|
322
|
-
session_id = request.cookies.get(
|
|
363
|
+
session_id = request.cookies.get("session")
|
|
323
364
|
except Exception:
|
|
324
365
|
session_id = "unknown"
|
|
325
366
|
|
|
@@ -349,10 +390,6 @@ def initialize_app(config, no_studio):
|
|
|
349
390
|
ctx.user_class = user_class
|
|
350
391
|
ctx.email_confirmed = email_confirmed
|
|
351
392
|
|
|
352
|
-
# Wait for static initialization.
|
|
353
|
-
if not no_studio and init_static_thread is not None:
|
|
354
|
-
init_static_thread.join()
|
|
355
|
-
|
|
356
393
|
logger.debug("Done initializing app.")
|
|
357
394
|
return app
|
|
358
395
|
|
|
@@ -360,13 +397,13 @@ def initialize_app(config, no_studio):
|
|
|
360
397
|
def initialize_flask(config, init_static_thread, no_studio):
|
|
361
398
|
logger.debug("Initializing flask..")
|
|
362
399
|
# region required for windows https://github.com/mindsdb/mindsdb/issues/2526
|
|
363
|
-
mimetypes.add_type(
|
|
364
|
-
mimetypes.add_type(
|
|
400
|
+
mimetypes.add_type("text/css", ".css")
|
|
401
|
+
mimetypes.add_type("text/javascript", ".js")
|
|
365
402
|
# endregion
|
|
366
403
|
|
|
367
404
|
kwargs = {}
|
|
368
405
|
if no_studio is not True:
|
|
369
|
-
static_path = os.path.join(config[
|
|
406
|
+
static_path = os.path.join(config["paths"]["static"], "static/")
|
|
370
407
|
if os.path.isabs(static_path) is False:
|
|
371
408
|
static_path = os.path.join(os.getcwd(), static_path)
|
|
372
409
|
kwargs["static_url_path"] = "/static"
|
|
@@ -376,39 +413,35 @@ def initialize_flask(config, init_static_thread, no_studio):
|
|
|
376
413
|
app = Flask(__name__, **kwargs)
|
|
377
414
|
init_metrics(app)
|
|
378
415
|
|
|
379
|
-
# Instrument Flask app
|
|
416
|
+
# Instrument Flask app and requests using either real or no-op instrumentors
|
|
380
417
|
FlaskInstrumentor().instrument_app(app)
|
|
381
418
|
RequestsInstrumentor().instrument()
|
|
382
419
|
|
|
383
|
-
app.config[
|
|
384
|
-
app.config[
|
|
385
|
-
app.config[
|
|
386
|
-
|
|
387
|
-
|
|
420
|
+
app.config["SECRET_KEY"] = os.environ.get("FLASK_SECRET_KEY", secrets.token_hex(32))
|
|
421
|
+
app.config["SESSION_COOKIE_NAME"] = "session"
|
|
422
|
+
app.config["PERMANENT_SESSION_LIFETIME"] = config["auth"][
|
|
423
|
+
"http_permanent_session_lifetime"
|
|
424
|
+
]
|
|
425
|
+
app.config["SEND_FILE_MAX_AGE_DEFAULT"] = 60
|
|
426
|
+
app.config["SWAGGER_HOST"] = "http://localhost:8000/mindsdb"
|
|
388
427
|
app.json = CustomJSONProvider()
|
|
389
428
|
|
|
390
|
-
authorizations = {
|
|
391
|
-
'apikey': {
|
|
392
|
-
'type': 'session',
|
|
393
|
-
'in': 'query',
|
|
394
|
-
'name': 'session'
|
|
395
|
-
}
|
|
396
|
-
}
|
|
429
|
+
authorizations = {"apikey": {"type": "session", "in": "query", "name": "session"}}
|
|
397
430
|
|
|
398
431
|
logger.debug("Creating swagger API..")
|
|
399
432
|
api = Swagger_Api(
|
|
400
433
|
app,
|
|
401
434
|
authorizations=authorizations,
|
|
402
|
-
security=[
|
|
403
|
-
url_prefix=
|
|
404
|
-
prefix=
|
|
405
|
-
doc=
|
|
435
|
+
security=["apikey"],
|
|
436
|
+
url_prefix=":8000",
|
|
437
|
+
prefix="/api",
|
|
438
|
+
doc="/doc/",
|
|
406
439
|
)
|
|
407
440
|
|
|
408
|
-
api.representations[
|
|
441
|
+
api.representations["application/json"] = custom_output_json
|
|
409
442
|
|
|
410
|
-
port = config[
|
|
411
|
-
host = config[
|
|
443
|
+
port = config["api"]["http"]["port"]
|
|
444
|
+
host = config["api"]["http"]["host"]
|
|
412
445
|
|
|
413
446
|
# NOTE rewrite it, that hotfix to see GUI link
|
|
414
447
|
if not no_studio:
|
|
@@ -421,9 +454,9 @@ def initialize_flask(config, init_static_thread, no_studio):
|
|
|
421
454
|
pid = os.getpid()
|
|
422
455
|
thread = threading.Thread(
|
|
423
456
|
target=_open_webbrowser,
|
|
424
|
-
args=(url, pid, port, init_static_thread, config[
|
|
457
|
+
args=(url, pid, port, init_static_thread, config["paths"]["static"]),
|
|
425
458
|
daemon=True,
|
|
426
|
-
name=
|
|
459
|
+
name="open_webbrowser",
|
|
427
460
|
)
|
|
428
461
|
thread.start()
|
|
429
462
|
|
|
@@ -77,9 +77,16 @@ class QueryAnalysis(Resource):
|
|
|
77
77
|
if result.type != SQL_RESPONSE_TYPE.TABLE:
|
|
78
78
|
return http_error(500, "Error", "Query does not return data")
|
|
79
79
|
|
|
80
|
-
column_names = [
|
|
81
|
-
df =
|
|
82
|
-
|
|
80
|
+
column_names = [column.name for column in result.result_set.columns]
|
|
81
|
+
df = result.result_set.to_df()
|
|
82
|
+
try:
|
|
83
|
+
analysis = analyze_df(df)
|
|
84
|
+
except ImportError:
|
|
85
|
+
return {
|
|
86
|
+
'analysis': {},
|
|
87
|
+
'timestamp': time.time(),
|
|
88
|
+
'error': 'To use this feature, please install the "dataprep_ml" package.'
|
|
89
|
+
}
|
|
83
90
|
|
|
84
91
|
query_tables = [
|
|
85
92
|
table.to_string() for table in get_query_tables(ast)
|
|
@@ -88,7 +95,7 @@ class QueryAnalysis(Resource):
|
|
|
88
95
|
return {
|
|
89
96
|
"analysis": analysis,
|
|
90
97
|
"column_names": column_names,
|
|
91
|
-
"row_count": len(result.
|
|
98
|
+
"row_count": len(result.result_set),
|
|
92
99
|
"timestamp": time.time(),
|
|
93
100
|
"tables": query_tables,
|
|
94
101
|
}
|
|
@@ -107,6 +114,12 @@ class DataAnalysis(Resource):
|
|
|
107
114
|
try:
|
|
108
115
|
analysis = analyze_df(DataFrame(data, columns=column_names))
|
|
109
116
|
return {"analysis": analysis, "timestamp": time.time()}
|
|
117
|
+
except ImportError:
|
|
118
|
+
return {
|
|
119
|
+
'analysis': {},
|
|
120
|
+
'timestamp': timestamp,
|
|
121
|
+
'error': 'To use this feature, please install the "dataprep_ml" package.'
|
|
122
|
+
}
|
|
110
123
|
except Exception as e:
|
|
111
124
|
# Don't want analysis exceptions to show up on UI.
|
|
112
125
|
# TODO: Fix analysis so it doesn't throw exceptions at all.
|
|
@@ -84,8 +84,14 @@ class File(Resource):
|
|
|
84
84
|
parser.finalize()
|
|
85
85
|
parser.close()
|
|
86
86
|
|
|
87
|
-
if file_object is not None
|
|
88
|
-
file_object.
|
|
87
|
+
if file_object is not None:
|
|
88
|
+
if not file_object.closed:
|
|
89
|
+
try:
|
|
90
|
+
file_object.flush()
|
|
91
|
+
except (AttributeError, ValueError, OSError):
|
|
92
|
+
logger.debug("Failed to flush file_object before closing.", exc_info=True)
|
|
93
|
+
file_object.close()
|
|
94
|
+
file_object = None
|
|
89
95
|
else:
|
|
90
96
|
data = request.json
|
|
91
97
|
|
|
@@ -8,6 +8,7 @@ import mindsdb.utilities.hooks as hooks
|
|
|
8
8
|
import mindsdb.utilities.profiler as profiler
|
|
9
9
|
from mindsdb.api.http.utils import http_error
|
|
10
10
|
from mindsdb.api.http.namespaces.configs.sql import ns_conf
|
|
11
|
+
from mindsdb.api.mysql.mysql_proxy.mysql_proxy import SQLAnswer
|
|
11
12
|
from mindsdb.api.mysql.mysql_proxy.classes.fake_mysql_proxy import FakeMysqlProxy
|
|
12
13
|
from mindsdb.api.executor.data_types.response_type import (
|
|
13
14
|
RESPONSE_TYPE as SQL_RESPONSE_TYPE,
|
|
@@ -56,23 +57,8 @@ class Query(Resource):
|
|
|
56
57
|
mysql_proxy = FakeMysqlProxy()
|
|
57
58
|
mysql_proxy.set_context(context)
|
|
58
59
|
try:
|
|
59
|
-
result = mysql_proxy.process_query(query)
|
|
60
|
-
|
|
61
|
-
if result.type == SQL_RESPONSE_TYPE.OK:
|
|
62
|
-
query_response = {
|
|
63
|
-
"type": SQL_RESPONSE_TYPE.OK,
|
|
64
|
-
"affected_rows": result.affected_rows
|
|
65
|
-
}
|
|
66
|
-
elif result.type == SQL_RESPONSE_TYPE.TABLE:
|
|
67
|
-
data = result.data.to_lists(json_types=True)
|
|
68
|
-
query_response = {
|
|
69
|
-
"type": SQL_RESPONSE_TYPE.TABLE,
|
|
70
|
-
"data": data,
|
|
71
|
-
"column_names": [
|
|
72
|
-
x["alias"] or x["name"] if "alias" in x else x["name"]
|
|
73
|
-
for x in result.columns
|
|
74
|
-
],
|
|
75
|
-
}
|
|
60
|
+
result: SQLAnswer = mysql_proxy.process_query(query)
|
|
61
|
+
query_response: dict = result.dump_http_response()
|
|
76
62
|
except ExecutorException as e:
|
|
77
63
|
# classified error
|
|
78
64
|
error_type = "expected"
|
|
@@ -134,7 +120,7 @@ class ListDatabases(Resource):
|
|
|
134
120
|
listing_query = "SHOW DATABASES"
|
|
135
121
|
mysql_proxy = FakeMysqlProxy()
|
|
136
122
|
try:
|
|
137
|
-
result = mysql_proxy.process_query(listing_query)
|
|
123
|
+
result: SQLAnswer = mysql_proxy.process_query(listing_query)
|
|
138
124
|
|
|
139
125
|
# iterate over result.data and perform a query on each item to get the name of the tables
|
|
140
126
|
if result.type == SQL_RESPONSE_TYPE.ERROR:
|
|
@@ -147,15 +133,15 @@ class ListDatabases(Resource):
|
|
|
147
133
|
listing_query_response = {"type": "ok"}
|
|
148
134
|
elif result.type == SQL_RESPONSE_TYPE.TABLE:
|
|
149
135
|
listing_query_response = {
|
|
150
|
-
"data": [
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
]
|
|
136
|
+
"data": [{
|
|
137
|
+
"name": db_row[0],
|
|
138
|
+
"tables": [
|
|
139
|
+
table_row[0]
|
|
140
|
+
for table_row in mysql_proxy.process_query(
|
|
141
|
+
"SHOW TABLES FROM `{}`".format(db_row[0])
|
|
142
|
+
).result_set.to_lists()
|
|
143
|
+
]
|
|
144
|
+
} for db_row in result.result_set.to_lists()]
|
|
159
145
|
}
|
|
160
146
|
except Exception as e:
|
|
161
147
|
listing_query_response = {
|
|
@@ -94,7 +94,7 @@ class GetLeaf(Resource):
|
|
|
94
94
|
} for key, val in schemas.items()]
|
|
95
95
|
elif db['type'] == 'system':
|
|
96
96
|
system_db = ca.database_controller.get_system_db(db_name)
|
|
97
|
-
tables = system_db.
|
|
97
|
+
tables = system_db.get_tree_tables()
|
|
98
98
|
tables = [{
|
|
99
99
|
'name': table.name,
|
|
100
100
|
'class': table.kind,
|
mindsdb/api/http/start.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import gc
|
|
2
|
+
gc.disable()
|
|
3
|
+
|
|
1
4
|
from flask import Flask
|
|
2
5
|
from waitress import serve
|
|
3
6
|
|
|
@@ -8,6 +11,8 @@ from mindsdb.utilities.config import config
|
|
|
8
11
|
from mindsdb.utilities.functions import init_lexer_parsers
|
|
9
12
|
from mindsdb.integrations.libs.ml_exec_base import process_cache
|
|
10
13
|
|
|
14
|
+
gc.enable()
|
|
15
|
+
|
|
11
16
|
logger = log.getLogger(__name__)
|
|
12
17
|
|
|
13
18
|
|
|
@@ -26,7 +31,7 @@ def start(verbose, no_studio, app: Flask = None):
|
|
|
26
31
|
process_cache.init()
|
|
27
32
|
|
|
28
33
|
if server_type == "waitress":
|
|
29
|
-
logger.debug("Serving HTTP app with waitress
|
|
34
|
+
logger.debug("Serving HTTP app with waitress...")
|
|
30
35
|
serve(
|
|
31
36
|
app,
|
|
32
37
|
host='*' if host in ('', '0.0.0.0') else host,
|
|
@@ -34,7 +39,7 @@ def start(verbose, no_studio, app: Flask = None):
|
|
|
34
39
|
**server_config
|
|
35
40
|
)
|
|
36
41
|
elif server_type == "flask":
|
|
37
|
-
logger.debug("Serving HTTP app with flask
|
|
42
|
+
logger.debug("Serving HTTP app with flask...")
|
|
38
43
|
# that will 'disable access' log in console
|
|
39
44
|
|
|
40
45
|
app.run(debug=False, port=port, host=host, **server_config)
|