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
mindsdb/utilities/config.py
CHANGED
|
@@ -15,7 +15,9 @@ from appdirs import user_data_dir
|
|
|
15
15
|
def _merge_key_recursive(target_dict, source_dict, key):
|
|
16
16
|
if key not in target_dict:
|
|
17
17
|
target_dict[key] = source_dict[key]
|
|
18
|
-
elif not isinstance(target_dict[key], dict) or not isinstance(
|
|
18
|
+
elif not isinstance(target_dict[key], dict) or not isinstance(
|
|
19
|
+
source_dict[key], dict
|
|
20
|
+
):
|
|
19
21
|
target_dict[key] = source_dict[key]
|
|
20
22
|
else:
|
|
21
23
|
for k in list(source_dict[key].keys()):
|
|
@@ -45,14 +47,10 @@ def create_data_dir(path: Path) -> None:
|
|
|
45
47
|
try:
|
|
46
48
|
path.mkdir(mode=0o777, exist_ok=True, parents=True)
|
|
47
49
|
except Exception as e:
|
|
48
|
-
raise Exception(
|
|
49
|
-
"MindsDB storage directory could not be created"
|
|
50
|
-
) from e
|
|
50
|
+
raise Exception("MindsDB storage directory could not be created") from e
|
|
51
51
|
|
|
52
52
|
if not os.access(path, os.W_OK):
|
|
53
|
-
raise PermissionError(
|
|
54
|
-
f"The directory is not allowed for writing: {path}"
|
|
55
|
-
)
|
|
53
|
+
raise PermissionError(f"The directory is not allowed for writing: {path}")
|
|
56
54
|
|
|
57
55
|
|
|
58
56
|
class Config:
|
|
@@ -79,7 +77,8 @@ class Config:
|
|
|
79
77
|
_cmd_args (argparse.Namespace): cmd args
|
|
80
78
|
use_docker_env (bool): is the app run in docker env
|
|
81
79
|
"""
|
|
82
|
-
|
|
80
|
+
|
|
81
|
+
__instance: "Config" = None
|
|
83
82
|
|
|
84
83
|
_config: dict = None
|
|
85
84
|
_user_config: dict = None
|
|
@@ -91,11 +90,10 @@ class Config:
|
|
|
91
90
|
auto_config_path: Path = None
|
|
92
91
|
auto_config_mtime: float = 0
|
|
93
92
|
_cmd_args: argparse.Namespace = None
|
|
94
|
-
use_docker_env: bool = os.environ.get(
|
|
93
|
+
use_docker_env: bool = os.environ.get("MINDSDB_DOCKER_ENV", False) is not False
|
|
95
94
|
|
|
96
|
-
def __new__(cls, *args, **kwargs) ->
|
|
97
|
-
"""Make class singletone and initialize config.
|
|
98
|
-
"""
|
|
95
|
+
def __new__(cls, *args, **kwargs) -> "Config":
|
|
96
|
+
"""Make class singletone and initialize config."""
|
|
99
97
|
if cls.__instance is not None:
|
|
100
98
|
return cls.__instance
|
|
101
99
|
|
|
@@ -106,14 +104,13 @@ class Config:
|
|
|
106
104
|
|
|
107
105
|
# region determine root path
|
|
108
106
|
if self.storage_root_path is None:
|
|
109
|
-
if isinstance(os.environ.get(
|
|
110
|
-
self.storage_root_path = os.environ[
|
|
111
|
-
elif
|
|
112
|
-
self.storage_root_path = self.user_config[
|
|
107
|
+
if isinstance(os.environ.get("MINDSDB_STORAGE_DIR"), str):
|
|
108
|
+
self.storage_root_path = os.environ["MINDSDB_STORAGE_DIR"]
|
|
109
|
+
elif "root" in self._user_config.get("paths", {}):
|
|
110
|
+
self.storage_root_path = self.user_config["paths"]["root"]
|
|
113
111
|
else:
|
|
114
112
|
self.storage_root_path = os.path.join(
|
|
115
|
-
user_data_dir("mindsdb", "mindsdb"),
|
|
116
|
-
"var/"
|
|
113
|
+
user_data_dir("mindsdb", "mindsdb"), "var/"
|
|
117
114
|
)
|
|
118
115
|
self.storage_root_path = Path(self.storage_root_path)
|
|
119
116
|
create_data_dir(self.storage_root_path)
|
|
@@ -122,48 +119,45 @@ class Config:
|
|
|
122
119
|
# region prepare default config
|
|
123
120
|
api_host = "127.0.0.1" if not self.use_docker_env else "0.0.0.0"
|
|
124
121
|
self._default_config = {
|
|
125
|
-
|
|
126
|
-
'location': 'absent'
|
|
127
|
-
},
|
|
122
|
+
"permanent_storage": {"location": "absent"},
|
|
128
123
|
"storage_db": (
|
|
129
|
-
|
|
130
|
-
+ str(self.storage_root_path /
|
|
131
|
-
+
|
|
124
|
+
"sqlite:///"
|
|
125
|
+
+ str(self.storage_root_path / "mindsdb.sqlite3.db")
|
|
126
|
+
+ "?check_same_thread=False&timeout=30"
|
|
132
127
|
),
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
128
|
+
"paths": {
|
|
129
|
+
"root": self.storage_root_path,
|
|
130
|
+
"content": self.storage_root_path / "content",
|
|
131
|
+
"storage": self.storage_root_path / "storage",
|
|
132
|
+
"static": self.storage_root_path / "static",
|
|
133
|
+
"tmp": self.storage_root_path / "tmp",
|
|
134
|
+
"log": self.storage_root_path / "log",
|
|
135
|
+
"cache": self.storage_root_path / "cache",
|
|
136
|
+
"locks": self.storage_root_path / "locks",
|
|
142
137
|
},
|
|
143
|
-
|
|
144
|
-
|
|
138
|
+
"auth": {
|
|
139
|
+
"http_auth_enabled": False,
|
|
145
140
|
"http_permanent_session_lifetime": datetime.timedelta(days=31),
|
|
146
|
-
"username": "mindsdb"
|
|
141
|
+
"username": "mindsdb",
|
|
142
|
+
"password": "",
|
|
147
143
|
},
|
|
148
144
|
"logging": {
|
|
149
145
|
"handlers": {
|
|
150
146
|
"console": {
|
|
151
147
|
"enabled": True,
|
|
152
148
|
"formatter": "default",
|
|
153
|
-
"level": "INFO"
|
|
149
|
+
"level": "INFO", # MINDSDB_CONSOLE_LOG_LEVEL or MINDSDB_LOG_LEVEL (obsolete)
|
|
154
150
|
},
|
|
155
151
|
"file": {
|
|
156
152
|
"enabled": False,
|
|
157
|
-
"level": "INFO",
|
|
153
|
+
"level": "INFO", # MINDSDB_FILE_LOG_LEVEL
|
|
158
154
|
"filename": "app.log",
|
|
159
|
-
"maxBytes": 1 << 19,
|
|
160
|
-
"backupCount": 3
|
|
161
|
-
}
|
|
155
|
+
"maxBytes": 1 << 19, # 0.5 Mb
|
|
156
|
+
"backupCount": 3,
|
|
157
|
+
},
|
|
162
158
|
}
|
|
163
159
|
},
|
|
164
|
-
"gui": {
|
|
165
|
-
"autoupdate": True
|
|
166
|
-
},
|
|
160
|
+
"gui": {"autoupdate": True},
|
|
167
161
|
"debug": False,
|
|
168
162
|
"environment": "local",
|
|
169
163
|
"integrations": {},
|
|
@@ -175,13 +169,13 @@ class Config:
|
|
|
175
169
|
"max_restart_count": 1,
|
|
176
170
|
"max_restart_interval_seconds": 60,
|
|
177
171
|
"server": {
|
|
178
|
-
"type": "waitress",
|
|
172
|
+
"type": "waitress", # MINDSDB_HTTP_SERVER_TYPE MINDSDB_DEFAULT_SERVER
|
|
179
173
|
"config": {
|
|
180
174
|
"threads": 16,
|
|
181
|
-
"max_request_body_size": (1 << 30) * 10,
|
|
182
|
-
"inbuf_overflow": (1 << 30) * 10
|
|
183
|
-
}
|
|
184
|
-
}
|
|
175
|
+
"max_request_body_size": (1 << 30) * 10, # 10GB
|
|
176
|
+
"inbuf_overflow": (1 << 30) * 10,
|
|
177
|
+
},
|
|
178
|
+
},
|
|
185
179
|
},
|
|
186
180
|
"mysql": {
|
|
187
181
|
"host": api_host,
|
|
@@ -190,57 +184,49 @@ class Config:
|
|
|
190
184
|
"ssl": True,
|
|
191
185
|
"restart_on_failure": True,
|
|
192
186
|
"max_restart_count": 1,
|
|
193
|
-
"max_restart_interval_seconds": 60
|
|
194
|
-
},
|
|
195
|
-
"mongodb": {
|
|
196
|
-
"host": api_host,
|
|
197
|
-
"port": "47336",
|
|
198
|
-
"database": "mindsdb"
|
|
199
|
-
},
|
|
200
|
-
"postgres": {
|
|
201
|
-
"host": api_host,
|
|
202
|
-
"port": "55432",
|
|
203
|
-
"database": "mindsdb"
|
|
187
|
+
"max_restart_interval_seconds": 60,
|
|
204
188
|
},
|
|
189
|
+
"mongodb": {"host": api_host, "port": "47336", "database": "mindsdb"},
|
|
190
|
+
"postgres": {"host": api_host, "port": "55432", "database": "mindsdb"},
|
|
205
191
|
"mcp": {
|
|
206
192
|
"host": api_host,
|
|
207
193
|
"port": "47337",
|
|
208
194
|
"enabled": True,
|
|
209
195
|
"restart_on_failure": True,
|
|
210
196
|
"max_restart_count": 1,
|
|
211
|
-
"max_restart_interval_seconds": 60
|
|
197
|
+
"max_restart_interval_seconds": 60,
|
|
212
198
|
},
|
|
213
199
|
"litellm": {
|
|
214
200
|
"host": "0.0.0.0", # API server binds to all interfaces by default
|
|
215
|
-
"port": "8000"
|
|
216
|
-
}
|
|
217
|
-
},
|
|
218
|
-
"cache": {
|
|
219
|
-
"type": "local"
|
|
220
|
-
},
|
|
221
|
-
'ml_task_queue': {
|
|
222
|
-
'type': 'local'
|
|
201
|
+
"port": "8000",
|
|
202
|
+
},
|
|
223
203
|
},
|
|
204
|
+
"cache": {"type": "local"},
|
|
205
|
+
"ml_task_queue": {"type": "local"},
|
|
224
206
|
"file_upload_domains": [],
|
|
225
207
|
"web_crawling_allowed_sites": [],
|
|
226
208
|
"cloud": False,
|
|
227
|
-
"jobs": {
|
|
228
|
-
|
|
229
|
-
},
|
|
230
|
-
"tasks": {
|
|
231
|
-
"disable": False
|
|
232
|
-
},
|
|
209
|
+
"jobs": {"disable": False},
|
|
210
|
+
"tasks": {"disable": False},
|
|
233
211
|
"default_project": "mindsdb",
|
|
234
212
|
"default_llm": {},
|
|
235
|
-
"default_embedding_model": {}
|
|
213
|
+
"default_embedding_model": {},
|
|
214
|
+
"a2a": {
|
|
215
|
+
"host": "localhost",
|
|
216
|
+
"port": 10002,
|
|
217
|
+
"mindsdb_host": "localhost",
|
|
218
|
+
"mindsdb_port": 47334,
|
|
219
|
+
"agent_name": "my_agent",
|
|
220
|
+
"project_name": "mindsdb",
|
|
221
|
+
},
|
|
236
222
|
}
|
|
237
223
|
# endregion
|
|
238
224
|
|
|
239
225
|
# region find 'auto' config file, create if not exists
|
|
240
|
-
auto_config_name =
|
|
226
|
+
auto_config_name = "config.auto.json"
|
|
241
227
|
auto_config_path = self.storage_root_path.joinpath(auto_config_name)
|
|
242
228
|
if not auto_config_path.is_file():
|
|
243
|
-
auto_config_path.write_text(
|
|
229
|
+
auto_config_path.write_text("{}")
|
|
244
230
|
self.auto_config_path = auto_config_path
|
|
245
231
|
# endregion
|
|
246
232
|
|
|
@@ -252,163 +238,161 @@ class Config:
|
|
|
252
238
|
return cls.__instance
|
|
253
239
|
|
|
254
240
|
def prepare_env_config(self) -> None:
|
|
255
|
-
"""Collect config values from env vars to self._env_config
|
|
256
|
-
"""
|
|
241
|
+
"""Collect config values from env vars to self._env_config"""
|
|
257
242
|
self._env_config = {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
},
|
|
264
|
-
"
|
|
265
|
-
"http": {
|
|
266
|
-
"server": {}
|
|
267
|
-
}
|
|
268
|
-
},
|
|
269
|
-
'auth': {},
|
|
270
|
-
'paths': {},
|
|
271
|
-
'permanent_storage': {},
|
|
272
|
-
'ml_task_queue': {}
|
|
243
|
+
"logging": {"handlers": {"console": {}, "file": {}}},
|
|
244
|
+
"api": {"http": {"server": {}}},
|
|
245
|
+
"auth": {},
|
|
246
|
+
"paths": {},
|
|
247
|
+
"permanent_storage": {},
|
|
248
|
+
"ml_task_queue": {},
|
|
249
|
+
"a2a": {},
|
|
273
250
|
}
|
|
274
251
|
|
|
275
252
|
# region storage root path
|
|
276
|
-
if os.environ.get(
|
|
277
|
-
self._env_config[
|
|
278
|
-
|
|
253
|
+
if os.environ.get("MINDSDB_STORAGE_DIR", "") != "":
|
|
254
|
+
self._env_config["paths"] = {
|
|
255
|
+
"root": Path(os.environ["MINDSDB_STORAGE_DIR"])
|
|
279
256
|
}
|
|
280
257
|
# endregion
|
|
281
258
|
|
|
282
259
|
# region vars: permanent storage disabled?
|
|
283
|
-
if os.environ.get(
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
260
|
+
if os.environ.get("MINDSDB_STORAGE_BACKUP_DISABLED", "").lower() in (
|
|
261
|
+
"1",
|
|
262
|
+
"true",
|
|
263
|
+
):
|
|
264
|
+
self._env_config["permanent_storage"] = {"location": "absent"}
|
|
287
265
|
# endregion
|
|
288
266
|
|
|
289
267
|
# region vars: ml queue
|
|
290
|
-
if os.environ.get(
|
|
291
|
-
self._env_config[
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
268
|
+
if os.environ.get("MINDSDB_ML_QUEUE_TYPE", "").lower() == "redis":
|
|
269
|
+
self._env_config["ml_task_queue"] = {
|
|
270
|
+
"type": "redis",
|
|
271
|
+
"host": os.environ.get("MINDSDB_ML_QUEUE_HOST", "localhost"),
|
|
272
|
+
"port": int(os.environ.get("MINDSDB_ML_QUEUE_PORT", 6379)),
|
|
273
|
+
"db": int(os.environ.get("MINDSDB_ML_QUEUE_DB", 0)),
|
|
274
|
+
"username": os.environ.get("MINDSDB_ML_QUEUE_USERNAME"),
|
|
275
|
+
"password": os.environ.get("MINDSDB_ML_QUEUE_PASSWORD"),
|
|
298
276
|
}
|
|
299
277
|
# endregion
|
|
300
278
|
|
|
301
279
|
# region vars: username and password
|
|
302
|
-
http_username = os.environ.get(
|
|
303
|
-
http_password = os.environ.get(
|
|
280
|
+
http_username = os.environ.get("MINDSDB_USERNAME")
|
|
281
|
+
http_password = os.environ.get("MINDSDB_PASSWORD")
|
|
304
282
|
|
|
305
283
|
if bool(http_username) != bool(http_password):
|
|
306
|
-
raise ValueError(
|
|
284
|
+
raise ValueError(
|
|
285
|
+
"Both MINDSDB_USERNAME and MINDSDB_PASSWORD must be set together and must be non-empty strings."
|
|
286
|
+
)
|
|
307
287
|
|
|
308
288
|
# If both username and password are set, enable HTTP auth.
|
|
309
289
|
if http_username and http_password:
|
|
310
|
-
self._env_config[
|
|
311
|
-
self._env_config[
|
|
312
|
-
self._env_config[
|
|
290
|
+
self._env_config["auth"]["http_auth_enabled"] = True
|
|
291
|
+
self._env_config["auth"]["username"] = http_username
|
|
292
|
+
self._env_config["auth"]["password"] = http_password
|
|
313
293
|
# endregion
|
|
314
294
|
|
|
315
295
|
# region permanent session lifetime
|
|
316
|
-
for env_name in (
|
|
296
|
+
for env_name in (
|
|
297
|
+
"MINDSDB_HTTP_PERMANENT_SESSION_LIFETIME",
|
|
298
|
+
"FLASK_PERMANENT_SESSION_LIFETIME",
|
|
299
|
+
):
|
|
317
300
|
env_value = os.environ.get(env_name)
|
|
318
301
|
if isinstance(env_value, str):
|
|
319
302
|
try:
|
|
320
303
|
permanent_session_lifetime = int(env_value)
|
|
321
304
|
except Exception:
|
|
322
|
-
raise ValueError(
|
|
323
|
-
|
|
305
|
+
raise ValueError(
|
|
306
|
+
f"Warning: Can't cast env var {env_name} value to int: {env_value}"
|
|
307
|
+
)
|
|
308
|
+
self._env_config["auth"][
|
|
309
|
+
"http_permanent_session_lifetime"
|
|
310
|
+
] = permanent_session_lifetime
|
|
324
311
|
break
|
|
325
312
|
# endregion
|
|
326
313
|
|
|
327
314
|
# region logging
|
|
328
|
-
if os.environ.get(
|
|
329
|
-
self._env_config[
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
self._env_config[
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
315
|
+
if os.environ.get("MINDSDB_LOG_LEVEL", "") != "":
|
|
316
|
+
self._env_config["logging"]["handlers"]["console"]["level"] = os.environ[
|
|
317
|
+
"MINDSDB_LOG_LEVEL"
|
|
318
|
+
]
|
|
319
|
+
self._env_config["logging"]["handlers"]["console"]["enabled"] = True
|
|
320
|
+
if os.environ.get("MINDSDB_CONSOLE_LOG_LEVEL", "") != "":
|
|
321
|
+
self._env_config["logging"]["handlers"]["console"]["level"] = os.environ[
|
|
322
|
+
"MINDSDB_LOG_LEVEL"
|
|
323
|
+
]
|
|
324
|
+
self._env_config["logging"]["handlers"]["console"]["enabled"] = True
|
|
325
|
+
if os.environ.get("MINDSDB_FILE_LOG_LEVEL", "") != "":
|
|
326
|
+
self._env_config["logging"]["handlers"]["file"]["level"] = os.environ[
|
|
327
|
+
"MINDSDB_FILE_LOG_LEVEL"
|
|
328
|
+
]
|
|
329
|
+
self._env_config["logging"]["handlers"]["file"]["enabled"] = True
|
|
337
330
|
# endregion
|
|
338
331
|
|
|
339
332
|
# region server type
|
|
340
|
-
server_type = os.environ.get(
|
|
341
|
-
if server_type ==
|
|
342
|
-
server_type = os.environ.get(
|
|
343
|
-
if server_type !=
|
|
344
|
-
if server_type ==
|
|
345
|
-
self._env_config[
|
|
346
|
-
self._default_config[
|
|
347
|
-
self._env_config[
|
|
333
|
+
server_type = os.environ.get("MINDSDB_HTTP_SERVER_TYPE", "").lower()
|
|
334
|
+
if server_type == "":
|
|
335
|
+
server_type = os.environ.get("MINDSDB_DEFAULT_SERVER", "").lower()
|
|
336
|
+
if server_type != "":
|
|
337
|
+
if server_type == "waitress":
|
|
338
|
+
self._env_config["api"]["http"]["server"]["type"] = "waitress"
|
|
339
|
+
self._default_config["api"]["http"]["server"]["config"] = {}
|
|
340
|
+
self._env_config["api"]["http"]["server"]["config"] = {
|
|
348
341
|
"threads": 16,
|
|
349
|
-
"max_request_body_size": (1 << 30) * 10,
|
|
350
|
-
"inbuf_overflow": (1 << 30) * 10
|
|
342
|
+
"max_request_body_size": (1 << 30) * 10, # 10GB
|
|
343
|
+
"inbuf_overflow": (1 << 30) * 10,
|
|
351
344
|
}
|
|
352
|
-
elif server_type ==
|
|
353
|
-
self._env_config[
|
|
354
|
-
self._default_config[
|
|
355
|
-
self._env_config[
|
|
356
|
-
elif server_type ==
|
|
357
|
-
self._env_config[
|
|
358
|
-
self._default_config[
|
|
359
|
-
self._env_config[
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
345
|
+
elif server_type == "flask":
|
|
346
|
+
self._env_config["api"]["http"]["server"]["type"] = "flask"
|
|
347
|
+
self._default_config["api"]["http"]["server"]["config"] = {}
|
|
348
|
+
self._env_config["api"]["http"]["server"]["config"] = {}
|
|
349
|
+
elif server_type == "gunicorn":
|
|
350
|
+
self._env_config["api"]["http"]["server"]["type"] = "gunicorn"
|
|
351
|
+
self._default_config["api"]["http"]["server"]["config"] = {}
|
|
352
|
+
self._env_config["api"]["http"]["server"]["config"] = {
|
|
353
|
+
"workers": min(mp.cpu_count(), 4),
|
|
354
|
+
"timeout": 600,
|
|
355
|
+
"reuse_port": True,
|
|
356
|
+
"preload_app": True,
|
|
357
|
+
"threads": 4,
|
|
365
358
|
}
|
|
366
359
|
# endregion
|
|
367
360
|
|
|
368
|
-
if os.environ.get(
|
|
369
|
-
self._env_config[
|
|
361
|
+
if os.environ.get("MINDSDB_DB_CON", "") != "":
|
|
362
|
+
self._env_config["storage_db"] = os.environ["MINDSDB_DB_CON"]
|
|
370
363
|
|
|
371
|
-
if os.environ.get(
|
|
372
|
-
self._env_config[
|
|
364
|
+
if os.environ.get("MINDSDB_DEFAULT_PROJECT", "") != "":
|
|
365
|
+
self._env_config["default_project"] = os.environ[
|
|
366
|
+
"MINDSDB_DEFAULT_PROJECT"
|
|
367
|
+
].lower()
|
|
373
368
|
|
|
374
|
-
if os.environ.get(
|
|
375
|
-
self._env_config[
|
|
376
|
-
|
|
369
|
+
if os.environ.get("MINDSDB_DEFAULT_LLM_API_KEY", "") != "":
|
|
370
|
+
self._env_config["default_llm"] = {
|
|
371
|
+
"api_key": os.environ["MINDSDB_DEFAULT_LLM_API_KEY"]
|
|
377
372
|
}
|
|
378
|
-
if os.environ.get(
|
|
379
|
-
self._env_config[
|
|
380
|
-
|
|
373
|
+
if os.environ.get("MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY", "") != "":
|
|
374
|
+
self._env_config["default_embedding_model"] = {
|
|
375
|
+
"api_key": os.environ["MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY"]
|
|
381
376
|
}
|
|
382
377
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
""
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
):
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
parser = argparse.ArgumentParser(description='CL argument for mindsdb server')
|
|
402
|
-
parser.add_argument('--api', type=str, default=None)
|
|
403
|
-
parser.add_argument('--config', type=str, default=None)
|
|
404
|
-
parser.add_argument('--install-handlers', type=str, default=None)
|
|
405
|
-
parser.add_argument('--verbose', action='store_true')
|
|
406
|
-
parser.add_argument('--no_studio', action='store_true')
|
|
407
|
-
parser.add_argument('-v', '--version', action='store_true')
|
|
408
|
-
parser.add_argument('--ml_task_queue_consumer', action='store_true', default=None)
|
|
409
|
-
parser.add_argument('--agent', type=str, default=None, help='Name of the agent to use with litellm APIs')
|
|
410
|
-
parser.add_argument('--project', type=str, default=None, help='Project containing the agent (default: mindsdb)')
|
|
411
|
-
self._cmd_args = parser.parse_args()
|
|
378
|
+
# region vars: a2a configuration
|
|
379
|
+
a2a_config = {}
|
|
380
|
+
if os.environ.get("MINDSDB_A2A_HOST"):
|
|
381
|
+
a2a_config["host"] = os.environ.get("MINDSDB_A2A_HOST")
|
|
382
|
+
if os.environ.get("MINDSDB_A2A_PORT"):
|
|
383
|
+
a2a_config["port"] = int(os.environ.get("MINDSDB_A2A_PORT"))
|
|
384
|
+
if os.environ.get("MINDSDB_HOST"):
|
|
385
|
+
a2a_config["mindsdb_host"] = os.environ.get("MINDSDB_HOST")
|
|
386
|
+
if os.environ.get("MINDSDB_PORT"):
|
|
387
|
+
a2a_config["mindsdb_port"] = int(os.environ.get("MINDSDB_PORT"))
|
|
388
|
+
if os.environ.get("MINDSDB_AGENT_NAME"):
|
|
389
|
+
a2a_config["agent_name"] = os.environ.get("MINDSDB_AGENT_NAME")
|
|
390
|
+
if os.environ.get("MINDSDB_PROJECT_NAME"):
|
|
391
|
+
a2a_config["project_name"] = os.environ.get("MINDSDB_PROJECT_NAME")
|
|
392
|
+
|
|
393
|
+
if a2a_config:
|
|
394
|
+
self._env_config["a2a"] = a2a_config
|
|
395
|
+
# endregion
|
|
412
396
|
|
|
413
397
|
def fetch_auto_config(self) -> bool:
|
|
414
398
|
"""Load dict readed from config.auto.json to `auto_config`.
|
|
@@ -422,7 +406,9 @@ class Config:
|
|
|
422
406
|
try:
|
|
423
407
|
self._auto_config = json.loads(self.auto_config_path.read_text())
|
|
424
408
|
except json.JSONDecodeError as e:
|
|
425
|
-
raise ValueError(
|
|
409
|
+
raise ValueError(
|
|
410
|
+
f"The 'auto' configuration file ({self.auto_config_path}) contains invalid JSON: {e}"
|
|
411
|
+
)
|
|
426
412
|
self.auto_config_mtime = self.auto_config_path.stat().st_mtime
|
|
427
413
|
return True
|
|
428
414
|
return False
|
|
@@ -437,45 +423,102 @@ class Config:
|
|
|
437
423
|
cmd_args_config = self.cmd_args.config
|
|
438
424
|
if isinstance(cmd_args_config, str):
|
|
439
425
|
self.config_path = cmd_args_config
|
|
440
|
-
elif isinstance(os.environ.get(
|
|
441
|
-
self.config_path = os.environ[
|
|
442
|
-
if self.config_path ==
|
|
426
|
+
elif isinstance(os.environ.get("MINDSDB_CONFIG_PATH"), str):
|
|
427
|
+
self.config_path = os.environ["MINDSDB_CONFIG_PATH"]
|
|
428
|
+
if self.config_path == "absent":
|
|
443
429
|
self.config_path = None
|
|
444
430
|
if isinstance(self.config_path, str):
|
|
445
431
|
self.config_path = Path(self.config_path)
|
|
446
432
|
if not self.config_path.is_file():
|
|
447
|
-
raise FileNotFoundError(
|
|
433
|
+
raise FileNotFoundError(
|
|
434
|
+
f"The configuration file was not found at the path: {self.config_path}"
|
|
435
|
+
)
|
|
448
436
|
try:
|
|
449
437
|
self._user_config = json.loads(self.config_path.read_text())
|
|
450
438
|
except json.JSONDecodeError as e:
|
|
451
|
-
raise ValueError(
|
|
439
|
+
raise ValueError(
|
|
440
|
+
f"The configuration file ({self.config_path}) contains invalid JSON: {e}"
|
|
441
|
+
)
|
|
452
442
|
else:
|
|
453
443
|
self._user_config = {}
|
|
454
444
|
return True
|
|
455
445
|
return False
|
|
456
446
|
|
|
457
447
|
def ensure_auto_config_is_relevant(self) -> None:
|
|
458
|
-
"""Check if auto config has not been changed. If changed - reload main config.
|
|
459
|
-
"""
|
|
448
|
+
"""Check if auto config has not been changed. If changed - reload main config."""
|
|
460
449
|
updated = self.fetch_auto_config()
|
|
461
450
|
if updated:
|
|
462
|
-
self.
|
|
451
|
+
self.merge_configs()
|
|
463
452
|
|
|
464
453
|
def merge_configs(self) -> None:
|
|
465
|
-
"""Merge multiple configs to one.
|
|
466
|
-
"""
|
|
454
|
+
"""Merge multiple configs to one."""
|
|
467
455
|
new_config = deepcopy(self._default_config)
|
|
468
456
|
_merge_configs(new_config, self._user_config)
|
|
469
457
|
_merge_configs(new_config, self._auto_config)
|
|
470
458
|
_merge_configs(new_config, self._env_config)
|
|
471
459
|
|
|
460
|
+
# Apply command-line arguments for A2A
|
|
461
|
+
cmd_args_config = {}
|
|
462
|
+
|
|
463
|
+
# Check for A2A command-line arguments
|
|
464
|
+
if hasattr(self.cmd_args, "a2a_host") and self.cmd_args.a2a_host is not None:
|
|
465
|
+
if "a2a" not in cmd_args_config:
|
|
466
|
+
cmd_args_config["a2a"] = {}
|
|
467
|
+
cmd_args_config["a2a"]["host"] = self.cmd_args.a2a_host
|
|
468
|
+
|
|
469
|
+
if hasattr(self.cmd_args, "a2a_port") and self.cmd_args.a2a_port is not None:
|
|
470
|
+
if "a2a" not in cmd_args_config:
|
|
471
|
+
cmd_args_config["a2a"] = {}
|
|
472
|
+
cmd_args_config["a2a"]["port"] = self.cmd_args.a2a_port
|
|
473
|
+
|
|
474
|
+
if (
|
|
475
|
+
hasattr(self.cmd_args, "mindsdb_host")
|
|
476
|
+
and self.cmd_args.mindsdb_host is not None
|
|
477
|
+
):
|
|
478
|
+
if "a2a" not in cmd_args_config:
|
|
479
|
+
cmd_args_config["a2a"] = {}
|
|
480
|
+
cmd_args_config["a2a"]["mindsdb_host"] = self.cmd_args.mindsdb_host
|
|
481
|
+
|
|
482
|
+
if (
|
|
483
|
+
hasattr(self.cmd_args, "mindsdb_port")
|
|
484
|
+
and self.cmd_args.mindsdb_port is not None
|
|
485
|
+
):
|
|
486
|
+
if "a2a" not in cmd_args_config:
|
|
487
|
+
cmd_args_config["a2a"] = {}
|
|
488
|
+
cmd_args_config["a2a"]["mindsdb_port"] = self.cmd_args.mindsdb_port
|
|
489
|
+
|
|
490
|
+
if (
|
|
491
|
+
hasattr(self.cmd_args, "agent_name")
|
|
492
|
+
and self.cmd_args.agent_name is not None
|
|
493
|
+
):
|
|
494
|
+
if "a2a" not in cmd_args_config:
|
|
495
|
+
cmd_args_config["a2a"] = {}
|
|
496
|
+
cmd_args_config["a2a"]["agent_name"] = self.cmd_args.agent_name
|
|
497
|
+
|
|
498
|
+
if (
|
|
499
|
+
hasattr(self.cmd_args, "project_name")
|
|
500
|
+
and self.cmd_args.project_name is not None
|
|
501
|
+
):
|
|
502
|
+
if "a2a" not in cmd_args_config:
|
|
503
|
+
cmd_args_config["a2a"] = {}
|
|
504
|
+
cmd_args_config["a2a"]["project_name"] = self.cmd_args.project_name
|
|
505
|
+
|
|
506
|
+
# Merge command-line args config with highest priority
|
|
507
|
+
if cmd_args_config:
|
|
508
|
+
_merge_configs(new_config, cmd_args_config)
|
|
509
|
+
|
|
510
|
+
# Ensure A2A port is never 0, which would prevent the A2A API from starting
|
|
511
|
+
if "a2a" in new_config and isinstance(new_config["a2a"], dict):
|
|
512
|
+
if "port" in new_config["a2a"] and (new_config["a2a"]["port"] == 0 or new_config["a2a"]["port"] is None):
|
|
513
|
+
new_config["a2a"]["port"] = 10002 # Use the default port value
|
|
514
|
+
|
|
472
515
|
# region create dirs
|
|
473
|
-
for key, value in new_config[
|
|
516
|
+
for key, value in new_config["paths"].items():
|
|
474
517
|
if isinstance(value, str):
|
|
475
|
-
new_config[
|
|
518
|
+
new_config["paths"][key] = Path(value)
|
|
476
519
|
elif isinstance(value, Path) is False:
|
|
477
520
|
raise ValueError(f"Unexpected path value: {value}")
|
|
478
|
-
create_data_dir(new_config[
|
|
521
|
+
create_data_dir(new_config["paths"][key])
|
|
479
522
|
# endregion
|
|
480
523
|
|
|
481
524
|
self._config = new_config
|
|
@@ -493,39 +536,39 @@ class Config:
|
|
|
493
536
|
return self._config
|
|
494
537
|
|
|
495
538
|
def update(self, data: dict) -> None:
|
|
496
|
-
"""Update calues in `auto` config
|
|
497
|
-
"""
|
|
539
|
+
"""Update calues in `auto` config"""
|
|
498
540
|
self.ensure_auto_config_is_relevant()
|
|
499
541
|
|
|
500
542
|
_merge_configs(self._auto_config, data)
|
|
501
543
|
|
|
502
|
-
self.auto_config_path.write_text(
|
|
503
|
-
json.dumps(self._auto_config, indent=4)
|
|
504
|
-
)
|
|
544
|
+
self.auto_config_path.write_text(json.dumps(self._auto_config, indent=4))
|
|
505
545
|
|
|
506
546
|
self.auto_config_mtime = self.auto_config_path.stat().st_mtime
|
|
507
547
|
|
|
508
548
|
self.merge_configs()
|
|
509
549
|
|
|
510
550
|
def raise_warnings(self, logger) -> None:
|
|
511
|
-
"""Show warnings about config options
|
|
512
|
-
"""
|
|
551
|
+
"""Show warnings about config options"""
|
|
513
552
|
|
|
514
|
-
if
|
|
515
|
-
logger.warning(
|
|
553
|
+
if "storage_dir" in self._config:
|
|
554
|
+
logger.warning(
|
|
555
|
+
"The 'storage_dir' config option is no longer supported. Use 'paths.root' instead."
|
|
556
|
+
)
|
|
516
557
|
|
|
517
|
-
if
|
|
518
|
-
logger.warning(
|
|
558
|
+
if "log" in self._config:
|
|
559
|
+
logger.warning(
|
|
560
|
+
"The 'log' config option is no longer supported. Use 'logging' instead."
|
|
561
|
+
)
|
|
519
562
|
|
|
520
|
-
if os.environ.get(
|
|
563
|
+
if os.environ.get("MINDSDB_DEFAULT_SERVER", "") != "":
|
|
521
564
|
logger.warning(
|
|
522
565
|
"Env variable 'MINDSDB_DEFAULT_SERVER' is going to be deprecated soon. "
|
|
523
566
|
"Use 'MINDSDB_HTTP_SERVER_TYPE' instead."
|
|
524
567
|
)
|
|
525
568
|
|
|
526
|
-
for env_name in (
|
|
527
|
-
env_value = os.environ.get(env_name,
|
|
528
|
-
if env_value.lower() not in (
|
|
569
|
+
for env_name in ("MINDSDB_HTTP_SERVER_TYPE", "MINDSDB_DEFAULT_SERVER"):
|
|
570
|
+
env_value = os.environ.get(env_name, "")
|
|
571
|
+
if env_value.lower() not in ("waitress", "flask", "gunicorn", ""):
|
|
529
572
|
logger.warning(
|
|
530
573
|
f"The value '{env_value}' of the environment variable {env_name} is not valid. "
|
|
531
574
|
"It must be one of the following: 'waitress', 'flask', or 'gunicorn'."
|
|
@@ -537,9 +580,79 @@ class Config:
|
|
|
537
580
|
self.parse_cmd_args()
|
|
538
581
|
return self._cmd_args
|
|
539
582
|
|
|
583
|
+
def parse_cmd_args(self) -> None:
|
|
584
|
+
"""Collect cmd args to self._cmd_args (accessable as self.cmd_args)"""
|
|
585
|
+
if self._cmd_args is not None:
|
|
586
|
+
return
|
|
587
|
+
|
|
588
|
+
# if it is not mindsdb run, then set args to empty
|
|
589
|
+
if (
|
|
590
|
+
sys.modules["__main__"].__package__ or ""
|
|
591
|
+
).lower() != "mindsdb" and os.environ.get("MINDSDB_RUNTIME") != "1":
|
|
592
|
+
self._cmd_args = argparse.Namespace(
|
|
593
|
+
api=None,
|
|
594
|
+
config=None,
|
|
595
|
+
install_handlers=None,
|
|
596
|
+
verbose=False,
|
|
597
|
+
no_studio=False,
|
|
598
|
+
version=False,
|
|
599
|
+
ml_task_queue_consumer=None,
|
|
600
|
+
agent=None,
|
|
601
|
+
project=None,
|
|
602
|
+
)
|
|
603
|
+
return
|
|
604
|
+
|
|
605
|
+
parser = argparse.ArgumentParser(description="CL argument for mindsdb server")
|
|
606
|
+
parser.add_argument("--api", type=str, default=None)
|
|
607
|
+
parser.add_argument("--config", type=str, default=None)
|
|
608
|
+
parser.add_argument("--install-handlers", type=str, default=None)
|
|
609
|
+
parser.add_argument("--verbose", action="store_true")
|
|
610
|
+
parser.add_argument("--no_studio", action="store_true")
|
|
611
|
+
parser.add_argument("-v", "--version", action="store_true")
|
|
612
|
+
parser.add_argument(
|
|
613
|
+
"--ml_task_queue_consumer", action="store_true", default=None
|
|
614
|
+
)
|
|
615
|
+
parser.add_argument(
|
|
616
|
+
"--agent",
|
|
617
|
+
type=str,
|
|
618
|
+
default=None,
|
|
619
|
+
help="Name of the agent to use with litellm APIs",
|
|
620
|
+
)
|
|
621
|
+
parser.add_argument(
|
|
622
|
+
"--project",
|
|
623
|
+
type=str,
|
|
624
|
+
default=None,
|
|
625
|
+
help="Project containing the agent (default: mindsdb)",
|
|
626
|
+
)
|
|
627
|
+
|
|
628
|
+
# A2A specific arguments
|
|
629
|
+
parser.add_argument(
|
|
630
|
+
"--a2a-host", type=str, default=None, help="A2A server host"
|
|
631
|
+
)
|
|
632
|
+
parser.add_argument(
|
|
633
|
+
"--a2a-port", type=int, default=None, help="A2A server port"
|
|
634
|
+
)
|
|
635
|
+
parser.add_argument(
|
|
636
|
+
"--mindsdb-host", type=str, default=None, help="MindsDB server host"
|
|
637
|
+
)
|
|
638
|
+
parser.add_argument(
|
|
639
|
+
"--mindsdb-port", type=int, default=None, help="MindsDB server port"
|
|
640
|
+
)
|
|
641
|
+
parser.add_argument(
|
|
642
|
+
"--agent-name",
|
|
643
|
+
type=str,
|
|
644
|
+
default=None,
|
|
645
|
+
help="MindsDB agent name to connect to",
|
|
646
|
+
)
|
|
647
|
+
parser.add_argument(
|
|
648
|
+
"--project-name", type=str, default=None, help="MindsDB project name"
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
self._cmd_args = parser.parse_args()
|
|
652
|
+
|
|
540
653
|
@property
|
|
541
654
|
def paths(self):
|
|
542
|
-
return self._config[
|
|
655
|
+
return self._config["paths"]
|
|
543
656
|
|
|
544
657
|
@property
|
|
545
658
|
def user_config(self):
|