MindsDB 25.5.3.0__py3-none-any.whl → 25.5.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of MindsDB might be problematic. Click here for more details.
- mindsdb/__about__.py +8 -8
- mindsdb/__main__.py +127 -79
- mindsdb/api/a2a/__init__.py +0 -0
- mindsdb/api/a2a/__main__.py +144 -0
- mindsdb/api/a2a/agent.py +308 -0
- mindsdb/api/a2a/common/__init__.py +0 -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 +86 -0
- mindsdb/api/a2a/task_manager.py +560 -0
- mindsdb/api/executor/command_executor.py +185 -309
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/planner/query_planner.py +10 -1
- mindsdb/api/executor/sql_query/result_set.py +185 -52
- mindsdb/api/executor/sql_query/sql_query.py +1 -1
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
- mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
- mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
- mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
- mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
- mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
- mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
- mindsdb/api/http/initialize.py +99 -83
- mindsdb/api/http/namespaces/analysis.py +3 -3
- mindsdb/api/http/namespaces/config.py +61 -86
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/mcp/start.py +42 -5
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
- mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
- mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
- mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
- mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
- mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
- mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
- mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
- mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
- mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
- mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
- mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/byom_handler/requirements.txt +1 -2
- mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
- mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
- mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
- mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
- mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
- mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
- mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
- mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
- mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
- mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
- mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
- mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
- mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
- mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
- mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
- mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
- mindsdb/integrations/handlers/email_handler/settings.py +0 -1
- mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
- mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
- mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
- mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
- mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
- mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
- mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
- mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
- mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
- mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
- mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
- mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
- mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
- mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
- mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
- mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
- mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
- mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
- mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
- mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
- mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
- mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
- mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
- mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
- mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
- mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
- mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
- mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
- mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
- mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
- mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
- mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
- mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/lancedb_handler/requirements.txt +0 -1
- mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
- mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
- mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/litellm_handler/litellm_handler.py +37 -20
- mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
- mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
- mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
- mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
- mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
- mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
- mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
- mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
- mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
- mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
- mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
- mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
- mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
- mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
- mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
- mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
- mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
- mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
- mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
- mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
- mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
- mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
- mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
- mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
- mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
- mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
- mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
- mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
- mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
- mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
- mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
- mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
- mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
- mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
- mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
- mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
- mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
- mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
- mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
- mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
- mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
- mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
- mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
- mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
- mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
- mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
- mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
- mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
- mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
- mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
- mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
- mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
- mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
- mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
- mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
- mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
- mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
- mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
- mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
- mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
- mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
- mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
- mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
- mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
- mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
- mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
- mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
- mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
- mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
- mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
- mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
- mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
- mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
- mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
- mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
- mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
- mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
- mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
- mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
- mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
- mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
- mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
- mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
- mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
- mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
- mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
- mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
- mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
- mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
- mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
- mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
- mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
- mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
- mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
- mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
- mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
- mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
- mindsdb/integrations/libs/llm/config.py +13 -0
- mindsdb/integrations/libs/llm/utils.py +37 -65
- mindsdb/integrations/libs/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/handler_utils.py +15 -3
- mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
- mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
- mindsdb/integrations/utilities/rag/rerankers/base_reranker.py +230 -227
- mindsdb/integrations/utilities/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +32 -13
- mindsdb/interfaces/agents/langchain_agent.py +106 -95
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/knowledge_base/controller.py +250 -216
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/query_context/context_controller.py +66 -10
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
- mindsdb/interfaces/skills/skill_tool.py +202 -57
- mindsdb/interfaces/skills/sql_agent.py +205 -17
- mindsdb/interfaces/storage/fs.py +1 -0
- mindsdb/interfaces/variables/__init__.py +0 -0
- mindsdb/interfaces/variables/variables_controller.py +97 -0
- mindsdb/migrations/env.py +5 -7
- mindsdb/migrations/migrate.py +47 -7
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +287 -216
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/METADATA +646 -698
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/RECORD +312 -295
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/WHEEL +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/top_level.txt +0 -0
mindsdb/utilities/config.py
CHANGED
|
@@ -45,14 +45,10 @@ def create_data_dir(path: Path) -> None:
|
|
|
45
45
|
try:
|
|
46
46
|
path.mkdir(mode=0o777, exist_ok=True, parents=True)
|
|
47
47
|
except Exception as e:
|
|
48
|
-
raise Exception(
|
|
49
|
-
"MindsDB storage directory could not be created"
|
|
50
|
-
) from e
|
|
48
|
+
raise Exception("MindsDB storage directory could not be created") from e
|
|
51
49
|
|
|
52
50
|
if not os.access(path, os.W_OK):
|
|
53
|
-
raise PermissionError(
|
|
54
|
-
f"The directory is not allowed for writing: {path}"
|
|
55
|
-
)
|
|
51
|
+
raise PermissionError(f"The directory is not allowed for writing: {path}")
|
|
56
52
|
|
|
57
53
|
|
|
58
54
|
class Config:
|
|
@@ -79,7 +75,8 @@ class Config:
|
|
|
79
75
|
_cmd_args (argparse.Namespace): cmd args
|
|
80
76
|
use_docker_env (bool): is the app run in docker env
|
|
81
77
|
"""
|
|
82
|
-
|
|
78
|
+
|
|
79
|
+
__instance: "Config" = None
|
|
83
80
|
|
|
84
81
|
_config: dict = None
|
|
85
82
|
_user_config: dict = None
|
|
@@ -91,11 +88,10 @@ class Config:
|
|
|
91
88
|
auto_config_path: Path = None
|
|
92
89
|
auto_config_mtime: float = 0
|
|
93
90
|
_cmd_args: argparse.Namespace = None
|
|
94
|
-
use_docker_env: bool = os.environ.get(
|
|
91
|
+
use_docker_env: bool = os.environ.get("MINDSDB_DOCKER_ENV", False) is not False
|
|
95
92
|
|
|
96
|
-
def __new__(cls, *args, **kwargs) ->
|
|
97
|
-
"""Make class singletone and initialize config.
|
|
98
|
-
"""
|
|
93
|
+
def __new__(cls, *args, **kwargs) -> "Config":
|
|
94
|
+
"""Make class singletone and initialize config."""
|
|
99
95
|
if cls.__instance is not None:
|
|
100
96
|
return cls.__instance
|
|
101
97
|
|
|
@@ -106,15 +102,12 @@ class Config:
|
|
|
106
102
|
|
|
107
103
|
# region determine root path
|
|
108
104
|
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[
|
|
105
|
+
if isinstance(os.environ.get("MINDSDB_STORAGE_DIR"), str):
|
|
106
|
+
self.storage_root_path = os.environ["MINDSDB_STORAGE_DIR"]
|
|
107
|
+
elif "root" in self._user_config.get("paths", {}):
|
|
108
|
+
self.storage_root_path = self.user_config["paths"]["root"]
|
|
113
109
|
else:
|
|
114
|
-
self.storage_root_path = os.path.join(
|
|
115
|
-
user_data_dir("mindsdb", "mindsdb"),
|
|
116
|
-
"var/"
|
|
117
|
-
)
|
|
110
|
+
self.storage_root_path = os.path.join(user_data_dir("mindsdb", "mindsdb"), "var/")
|
|
118
111
|
self.storage_root_path = Path(self.storage_root_path)
|
|
119
112
|
create_data_dir(self.storage_root_path)
|
|
120
113
|
# endregion
|
|
@@ -122,49 +115,45 @@ class Config:
|
|
|
122
115
|
# region prepare default config
|
|
123
116
|
api_host = "127.0.0.1" if not self.use_docker_env else "0.0.0.0"
|
|
124
117
|
self._default_config = {
|
|
125
|
-
|
|
126
|
-
'location': 'absent'
|
|
127
|
-
},
|
|
118
|
+
"permanent_storage": {"location": "absent"},
|
|
128
119
|
"storage_db": (
|
|
129
|
-
|
|
130
|
-
+ str(self.storage_root_path /
|
|
131
|
-
+
|
|
120
|
+
"sqlite:///"
|
|
121
|
+
+ str(self.storage_root_path / "mindsdb.sqlite3.db")
|
|
122
|
+
+ "?check_same_thread=False&timeout=30"
|
|
132
123
|
),
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
124
|
+
"paths": {
|
|
125
|
+
"root": self.storage_root_path,
|
|
126
|
+
"content": self.storage_root_path / "content",
|
|
127
|
+
"storage": self.storage_root_path / "storage",
|
|
128
|
+
"static": self.storage_root_path / "static",
|
|
129
|
+
"tmp": self.storage_root_path / "tmp",
|
|
130
|
+
"log": self.storage_root_path / "log",
|
|
131
|
+
"cache": self.storage_root_path / "cache",
|
|
132
|
+
"locks": self.storage_root_path / "locks",
|
|
142
133
|
},
|
|
143
|
-
|
|
144
|
-
|
|
134
|
+
"auth": {
|
|
135
|
+
"http_auth_enabled": False,
|
|
145
136
|
"http_permanent_session_lifetime": datetime.timedelta(days=31),
|
|
146
137
|
"username": "mindsdb",
|
|
147
|
-
"password": ""
|
|
138
|
+
"password": "",
|
|
148
139
|
},
|
|
149
140
|
"logging": {
|
|
150
141
|
"handlers": {
|
|
151
142
|
"console": {
|
|
152
143
|
"enabled": True,
|
|
153
144
|
"formatter": "default",
|
|
154
|
-
"level": "INFO"
|
|
145
|
+
"level": "INFO", # MINDSDB_CONSOLE_LOG_LEVEL or MINDSDB_LOG_LEVEL (obsolete)
|
|
155
146
|
},
|
|
156
147
|
"file": {
|
|
157
148
|
"enabled": False,
|
|
158
|
-
"level": "INFO",
|
|
149
|
+
"level": "INFO", # MINDSDB_FILE_LOG_LEVEL
|
|
159
150
|
"filename": "app.log",
|
|
160
|
-
"maxBytes": 1 << 19,
|
|
161
|
-
"backupCount": 3
|
|
162
|
-
}
|
|
151
|
+
"maxBytes": 1 << 19, # 0.5 Mb
|
|
152
|
+
"backupCount": 3,
|
|
153
|
+
},
|
|
163
154
|
}
|
|
164
155
|
},
|
|
165
|
-
"gui": {
|
|
166
|
-
"autoupdate": True
|
|
167
|
-
},
|
|
156
|
+
"gui": {"autoupdate": True},
|
|
168
157
|
"debug": False,
|
|
169
158
|
"environment": "local",
|
|
170
159
|
"integrations": {},
|
|
@@ -176,13 +165,13 @@ class Config:
|
|
|
176
165
|
"max_restart_count": 1,
|
|
177
166
|
"max_restart_interval_seconds": 60,
|
|
178
167
|
"server": {
|
|
179
|
-
"type": "waitress",
|
|
168
|
+
"type": "waitress", # MINDSDB_HTTP_SERVER_TYPE MINDSDB_DEFAULT_SERVER
|
|
180
169
|
"config": {
|
|
181
170
|
"threads": 16,
|
|
182
|
-
"max_request_body_size": (1 << 30) * 10,
|
|
183
|
-
"inbuf_overflow": (1 << 30) * 10
|
|
184
|
-
}
|
|
185
|
-
}
|
|
171
|
+
"max_request_body_size": (1 << 30) * 10, # 10GB
|
|
172
|
+
"inbuf_overflow": (1 << 30) * 10,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
186
175
|
},
|
|
187
176
|
"mysql": {
|
|
188
177
|
"host": api_host,
|
|
@@ -191,57 +180,51 @@ class Config:
|
|
|
191
180
|
"ssl": True,
|
|
192
181
|
"restart_on_failure": True,
|
|
193
182
|
"max_restart_count": 1,
|
|
194
|
-
"max_restart_interval_seconds": 60
|
|
195
|
-
},
|
|
196
|
-
"mongodb": {
|
|
197
|
-
"host": api_host,
|
|
198
|
-
"port": "47336",
|
|
199
|
-
"database": "mindsdb"
|
|
200
|
-
},
|
|
201
|
-
"postgres": {
|
|
202
|
-
"host": api_host,
|
|
203
|
-
"port": "55432",
|
|
204
|
-
"database": "mindsdb"
|
|
183
|
+
"max_restart_interval_seconds": 60,
|
|
205
184
|
},
|
|
185
|
+
"mongodb": {"host": api_host, "port": "47336", "database": "mindsdb"},
|
|
186
|
+
"postgres": {"host": api_host, "port": "55432", "database": "mindsdb"},
|
|
206
187
|
"mcp": {
|
|
207
188
|
"host": api_host,
|
|
208
189
|
"port": "47337",
|
|
209
190
|
"enabled": True,
|
|
210
191
|
"restart_on_failure": True,
|
|
211
192
|
"max_restart_count": 1,
|
|
212
|
-
"max_restart_interval_seconds": 60
|
|
193
|
+
"max_restart_interval_seconds": 60,
|
|
213
194
|
},
|
|
214
195
|
"litellm": {
|
|
215
196
|
"host": "0.0.0.0", # API server binds to all interfaces by default
|
|
216
|
-
"port": "8000"
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
"cache": {
|
|
220
|
-
"type": "local"
|
|
221
|
-
},
|
|
222
|
-
'ml_task_queue': {
|
|
223
|
-
'type': 'local'
|
|
197
|
+
"port": "8000",
|
|
198
|
+
},
|
|
224
199
|
},
|
|
200
|
+
"cache": {"type": "local"},
|
|
201
|
+
"ml_task_queue": {"type": "local"},
|
|
225
202
|
"file_upload_domains": [],
|
|
226
203
|
"web_crawling_allowed_sites": [],
|
|
227
204
|
"cloud": False,
|
|
228
|
-
"jobs": {
|
|
229
|
-
|
|
230
|
-
},
|
|
231
|
-
"tasks": {
|
|
232
|
-
"disable": False
|
|
233
|
-
},
|
|
205
|
+
"jobs": {"disable": False},
|
|
206
|
+
"tasks": {"disable": False},
|
|
234
207
|
"default_project": "mindsdb",
|
|
235
208
|
"default_llm": {},
|
|
236
|
-
"default_embedding_model": {}
|
|
209
|
+
"default_embedding_model": {},
|
|
210
|
+
"default_reranking_model": {},
|
|
211
|
+
"a2a": {
|
|
212
|
+
"host": "localhost",
|
|
213
|
+
"port": 47338,
|
|
214
|
+
"mindsdb_host": "localhost",
|
|
215
|
+
"mindsdb_port": 47334,
|
|
216
|
+
"agent_name": "my_agent",
|
|
217
|
+
"project_name": "mindsdb",
|
|
218
|
+
"enabled": False,
|
|
219
|
+
},
|
|
237
220
|
}
|
|
238
221
|
# endregion
|
|
239
222
|
|
|
240
223
|
# region find 'auto' config file, create if not exists
|
|
241
|
-
auto_config_name =
|
|
224
|
+
auto_config_name = "config.auto.json"
|
|
242
225
|
auto_config_path = self.storage_root_path.joinpath(auto_config_name)
|
|
243
226
|
if not auto_config_path.is_file():
|
|
244
|
-
auto_config_path.write_text(
|
|
227
|
+
auto_config_path.write_text("{}")
|
|
245
228
|
self.auto_config_path = auto_config_path
|
|
246
229
|
# endregion
|
|
247
230
|
|
|
@@ -253,163 +236,156 @@ class Config:
|
|
|
253
236
|
return cls.__instance
|
|
254
237
|
|
|
255
238
|
def prepare_env_config(self) -> None:
|
|
256
|
-
"""Collect config values from env vars to self._env_config
|
|
257
|
-
"""
|
|
239
|
+
"""Collect config values from env vars to self._env_config"""
|
|
258
240
|
self._env_config = {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
},
|
|
265
|
-
"
|
|
266
|
-
"http": {
|
|
267
|
-
"server": {}
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
'auth': {},
|
|
271
|
-
'paths': {},
|
|
272
|
-
'permanent_storage': {},
|
|
273
|
-
'ml_task_queue': {}
|
|
241
|
+
"logging": {"handlers": {"console": {}, "file": {}}},
|
|
242
|
+
"api": {"http": {"server": {}}},
|
|
243
|
+
"auth": {},
|
|
244
|
+
"paths": {},
|
|
245
|
+
"permanent_storage": {},
|
|
246
|
+
"ml_task_queue": {},
|
|
247
|
+
"a2a": {},
|
|
274
248
|
}
|
|
275
249
|
|
|
276
250
|
# region storage root path
|
|
277
|
-
if os.environ.get(
|
|
278
|
-
self._env_config[
|
|
279
|
-
'root': Path(os.environ['MINDSDB_STORAGE_DIR'])
|
|
280
|
-
}
|
|
251
|
+
if os.environ.get("MINDSDB_STORAGE_DIR", "") != "":
|
|
252
|
+
self._env_config["paths"] = {"root": Path(os.environ["MINDSDB_STORAGE_DIR"])}
|
|
281
253
|
# endregion
|
|
282
254
|
|
|
283
255
|
# region vars: permanent storage disabled?
|
|
284
|
-
if os.environ.get(
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
256
|
+
if os.environ.get("MINDSDB_STORAGE_BACKUP_DISABLED", "").lower() in (
|
|
257
|
+
"1",
|
|
258
|
+
"true",
|
|
259
|
+
):
|
|
260
|
+
self._env_config["permanent_storage"] = {"location": "absent"}
|
|
288
261
|
# endregion
|
|
289
262
|
|
|
290
263
|
# region vars: ml queue
|
|
291
|
-
if os.environ.get(
|
|
292
|
-
self._env_config[
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
264
|
+
if os.environ.get("MINDSDB_ML_QUEUE_TYPE", "").lower() == "redis":
|
|
265
|
+
self._env_config["ml_task_queue"] = {
|
|
266
|
+
"type": "redis",
|
|
267
|
+
"host": os.environ.get("MINDSDB_ML_QUEUE_HOST", "localhost"),
|
|
268
|
+
"port": int(os.environ.get("MINDSDB_ML_QUEUE_PORT", 6379)),
|
|
269
|
+
"db": int(os.environ.get("MINDSDB_ML_QUEUE_DB", 0)),
|
|
270
|
+
"username": os.environ.get("MINDSDB_ML_QUEUE_USERNAME"),
|
|
271
|
+
"password": os.environ.get("MINDSDB_ML_QUEUE_PASSWORD"),
|
|
299
272
|
}
|
|
300
273
|
# endregion
|
|
301
274
|
|
|
302
275
|
# region vars: username and password
|
|
303
|
-
http_username = os.environ.get(
|
|
304
|
-
http_password = os.environ.get(
|
|
276
|
+
http_username = os.environ.get("MINDSDB_USERNAME")
|
|
277
|
+
http_password = os.environ.get("MINDSDB_PASSWORD")
|
|
305
278
|
|
|
306
279
|
if bool(http_username) != bool(http_password):
|
|
307
|
-
raise ValueError(
|
|
280
|
+
raise ValueError(
|
|
281
|
+
"Both MINDSDB_USERNAME and MINDSDB_PASSWORD must be set together and must be non-empty strings."
|
|
282
|
+
)
|
|
308
283
|
|
|
309
284
|
# If both username and password are set, enable HTTP auth.
|
|
310
285
|
if http_username and http_password:
|
|
311
|
-
self._env_config[
|
|
312
|
-
self._env_config[
|
|
313
|
-
self._env_config[
|
|
286
|
+
self._env_config["auth"]["http_auth_enabled"] = True
|
|
287
|
+
self._env_config["auth"]["username"] = http_username
|
|
288
|
+
self._env_config["auth"]["password"] = http_password
|
|
314
289
|
# endregion
|
|
315
290
|
|
|
316
291
|
# region permanent session lifetime
|
|
317
|
-
for env_name in (
|
|
292
|
+
for env_name in (
|
|
293
|
+
"MINDSDB_HTTP_PERMANENT_SESSION_LIFETIME",
|
|
294
|
+
"FLASK_PERMANENT_SESSION_LIFETIME",
|
|
295
|
+
):
|
|
318
296
|
env_value = os.environ.get(env_name)
|
|
319
297
|
if isinstance(env_value, str):
|
|
320
298
|
try:
|
|
321
299
|
permanent_session_lifetime = int(env_value)
|
|
322
300
|
except Exception:
|
|
323
|
-
raise ValueError(f
|
|
324
|
-
self._env_config[
|
|
301
|
+
raise ValueError(f"Warning: Can't cast env var {env_name} value to int: {env_value}")
|
|
302
|
+
self._env_config["auth"]["http_permanent_session_lifetime"] = permanent_session_lifetime
|
|
325
303
|
break
|
|
326
304
|
# endregion
|
|
327
305
|
|
|
328
306
|
# region logging
|
|
329
|
-
if os.environ.get(
|
|
330
|
-
self._env_config[
|
|
331
|
-
self._env_config[
|
|
332
|
-
if os.environ.get(
|
|
333
|
-
self._env_config[
|
|
334
|
-
self._env_config[
|
|
335
|
-
if os.environ.get(
|
|
336
|
-
self._env_config[
|
|
337
|
-
self._env_config[
|
|
307
|
+
if os.environ.get("MINDSDB_LOG_LEVEL", "") != "":
|
|
308
|
+
self._env_config["logging"]["handlers"]["console"]["level"] = os.environ["MINDSDB_LOG_LEVEL"]
|
|
309
|
+
self._env_config["logging"]["handlers"]["console"]["enabled"] = True
|
|
310
|
+
if os.environ.get("MINDSDB_CONSOLE_LOG_LEVEL", "") != "":
|
|
311
|
+
self._env_config["logging"]["handlers"]["console"]["level"] = os.environ["MINDSDB_LOG_LEVEL"]
|
|
312
|
+
self._env_config["logging"]["handlers"]["console"]["enabled"] = True
|
|
313
|
+
if os.environ.get("MINDSDB_FILE_LOG_LEVEL", "") != "":
|
|
314
|
+
self._env_config["logging"]["handlers"]["file"]["level"] = os.environ["MINDSDB_FILE_LOG_LEVEL"]
|
|
315
|
+
self._env_config["logging"]["handlers"]["file"]["enabled"] = True
|
|
338
316
|
# endregion
|
|
339
317
|
|
|
340
318
|
# region server type
|
|
341
|
-
server_type = os.environ.get(
|
|
342
|
-
if server_type ==
|
|
343
|
-
server_type = os.environ.get(
|
|
344
|
-
if server_type !=
|
|
345
|
-
if server_type ==
|
|
346
|
-
self._env_config[
|
|
347
|
-
self._default_config[
|
|
348
|
-
self._env_config[
|
|
319
|
+
server_type = os.environ.get("MINDSDB_HTTP_SERVER_TYPE", "").lower()
|
|
320
|
+
if server_type == "":
|
|
321
|
+
server_type = os.environ.get("MINDSDB_DEFAULT_SERVER", "").lower()
|
|
322
|
+
if server_type != "":
|
|
323
|
+
if server_type == "waitress":
|
|
324
|
+
self._env_config["api"]["http"]["server"]["type"] = "waitress"
|
|
325
|
+
self._default_config["api"]["http"]["server"]["config"] = {}
|
|
326
|
+
self._env_config["api"]["http"]["server"]["config"] = {
|
|
349
327
|
"threads": 16,
|
|
350
|
-
"max_request_body_size": (1 << 30) * 10,
|
|
351
|
-
"inbuf_overflow": (1 << 30) * 10
|
|
328
|
+
"max_request_body_size": (1 << 30) * 10, # 10GB
|
|
329
|
+
"inbuf_overflow": (1 << 30) * 10,
|
|
352
330
|
}
|
|
353
|
-
elif server_type ==
|
|
354
|
-
self._env_config[
|
|
355
|
-
self._default_config[
|
|
356
|
-
self._env_config[
|
|
357
|
-
elif server_type ==
|
|
358
|
-
self._env_config[
|
|
359
|
-
self._default_config[
|
|
360
|
-
self._env_config[
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
331
|
+
elif server_type == "flask":
|
|
332
|
+
self._env_config["api"]["http"]["server"]["type"] = "flask"
|
|
333
|
+
self._default_config["api"]["http"]["server"]["config"] = {}
|
|
334
|
+
self._env_config["api"]["http"]["server"]["config"] = {}
|
|
335
|
+
elif server_type == "gunicorn":
|
|
336
|
+
self._env_config["api"]["http"]["server"]["type"] = "gunicorn"
|
|
337
|
+
self._default_config["api"]["http"]["server"]["config"] = {}
|
|
338
|
+
self._env_config["api"]["http"]["server"]["config"] = {
|
|
339
|
+
"workers": min(mp.cpu_count(), 4),
|
|
340
|
+
"timeout": 600,
|
|
341
|
+
"reuse_port": True,
|
|
342
|
+
"preload_app": True,
|
|
343
|
+
"threads": 4,
|
|
366
344
|
}
|
|
367
345
|
# endregion
|
|
368
346
|
|
|
369
|
-
if os.environ.get(
|
|
370
|
-
self._env_config[
|
|
347
|
+
if os.environ.get("MINDSDB_DB_CON", "") != "":
|
|
348
|
+
self._env_config["storage_db"] = os.environ["MINDSDB_DB_CON"]
|
|
371
349
|
|
|
372
|
-
if os.environ.get(
|
|
373
|
-
self._env_config[
|
|
350
|
+
if os.environ.get("MINDSDB_DEFAULT_PROJECT", "") != "":
|
|
351
|
+
self._env_config["default_project"] = os.environ["MINDSDB_DEFAULT_PROJECT"].lower()
|
|
374
352
|
|
|
375
|
-
if os.environ.get(
|
|
376
|
-
self._env_config[
|
|
377
|
-
|
|
353
|
+
if os.environ.get("MINDSDB_DEFAULT_LLM_API_KEY", "") != "":
|
|
354
|
+
self._env_config["default_llm"] = {"api_key": os.environ["MINDSDB_DEFAULT_LLM_API_KEY"]}
|
|
355
|
+
if os.environ.get("MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY", "") != "":
|
|
356
|
+
self._env_config["default_embedding_model"] = {
|
|
357
|
+
"api_key": os.environ["MINDSDB_DEFAULT_EMBEDDING_MODEL_API_KEY"]
|
|
378
358
|
}
|
|
379
|
-
if os.environ.get(
|
|
380
|
-
self._env_config[
|
|
381
|
-
|
|
359
|
+
if os.environ.get("MINDSDB_DEFAULT_RERANKING_MODEL_API_KEY", "") != "":
|
|
360
|
+
self._env_config["default_reranking_model"] = {
|
|
361
|
+
"api_key": os.environ["MINDSDB_DEFAULT_RERANKING_MODEL_API_KEY"]
|
|
382
362
|
}
|
|
383
363
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
""
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
):
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
364
|
+
# region vars: a2a configuration
|
|
365
|
+
a2a_config = {}
|
|
366
|
+
if os.environ.get("MINDSDB_A2A_HOST"):
|
|
367
|
+
a2a_config["host"] = os.environ.get("MINDSDB_A2A_HOST")
|
|
368
|
+
if os.environ.get("MINDSDB_A2A_PORT"):
|
|
369
|
+
a2a_config["port"] = int(os.environ.get("MINDSDB_A2A_PORT"))
|
|
370
|
+
if os.environ.get("MINDSDB_HOST"):
|
|
371
|
+
a2a_config["mindsdb_host"] = os.environ.get("MINDSDB_HOST")
|
|
372
|
+
if os.environ.get("MINDSDB_PORT"):
|
|
373
|
+
a2a_config["mindsdb_port"] = int(os.environ.get("MINDSDB_PORT"))
|
|
374
|
+
if os.environ.get("MINDSDB_AGENT_NAME"):
|
|
375
|
+
a2a_config["agent_name"] = os.environ.get("MINDSDB_AGENT_NAME")
|
|
376
|
+
if os.environ.get("MINDSDB_PROJECT_NAME"):
|
|
377
|
+
a2a_config["project_name"] = os.environ.get("MINDSDB_PROJECT_NAME")
|
|
378
|
+
if os.environ.get("MINDSDB_A2A_ENABLED") is not None:
|
|
379
|
+
a2a_config["enabled"] = os.environ.get("MINDSDB_A2A_ENABLED").lower() in (
|
|
380
|
+
"true",
|
|
381
|
+
"1",
|
|
382
|
+
"yes",
|
|
383
|
+
"y",
|
|
399
384
|
)
|
|
400
|
-
return
|
|
401
385
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
parser.add_argument('--install-handlers', type=str, default=None)
|
|
406
|
-
parser.add_argument('--verbose', action='store_true')
|
|
407
|
-
parser.add_argument('--no_studio', action='store_true')
|
|
408
|
-
parser.add_argument('-v', '--version', action='store_true')
|
|
409
|
-
parser.add_argument('--ml_task_queue_consumer', action='store_true', default=None)
|
|
410
|
-
parser.add_argument('--agent', type=str, default=None, help='Name of the agent to use with litellm APIs')
|
|
411
|
-
parser.add_argument('--project', type=str, default=None, help='Project containing the agent (default: mindsdb)')
|
|
412
|
-
self._cmd_args = parser.parse_args()
|
|
386
|
+
if a2a_config:
|
|
387
|
+
self._env_config["a2a"] = a2a_config
|
|
388
|
+
# endregion
|
|
413
389
|
|
|
414
390
|
def fetch_auto_config(self) -> bool:
|
|
415
391
|
"""Load dict readed from config.auto.json to `auto_config`.
|
|
@@ -438,45 +414,86 @@ class Config:
|
|
|
438
414
|
cmd_args_config = self.cmd_args.config
|
|
439
415
|
if isinstance(cmd_args_config, str):
|
|
440
416
|
self.config_path = cmd_args_config
|
|
441
|
-
elif isinstance(os.environ.get(
|
|
442
|
-
self.config_path = os.environ[
|
|
443
|
-
if self.config_path ==
|
|
417
|
+
elif isinstance(os.environ.get("MINDSDB_CONFIG_PATH"), str):
|
|
418
|
+
self.config_path = os.environ["MINDSDB_CONFIG_PATH"]
|
|
419
|
+
if self.config_path == "absent":
|
|
444
420
|
self.config_path = None
|
|
445
421
|
if isinstance(self.config_path, str):
|
|
446
422
|
self.config_path = Path(self.config_path)
|
|
447
423
|
if not self.config_path.is_file():
|
|
448
|
-
raise FileNotFoundError(f
|
|
424
|
+
raise FileNotFoundError(f"The configuration file was not found at the path: {self.config_path}")
|
|
449
425
|
try:
|
|
450
426
|
self._user_config = json.loads(self.config_path.read_text())
|
|
451
427
|
except json.JSONDecodeError as e:
|
|
452
|
-
raise ValueError(f
|
|
428
|
+
raise ValueError(f"The configuration file ({self.config_path}) contains invalid JSON: {e}")
|
|
453
429
|
else:
|
|
454
430
|
self._user_config = {}
|
|
455
431
|
return True
|
|
456
432
|
return False
|
|
457
433
|
|
|
458
434
|
def ensure_auto_config_is_relevant(self) -> None:
|
|
459
|
-
"""Check if auto config has not been changed. If changed - reload main config.
|
|
460
|
-
"""
|
|
435
|
+
"""Check if auto config has not been changed. If changed - reload main config."""
|
|
461
436
|
updated = self.fetch_auto_config()
|
|
462
437
|
if updated:
|
|
463
438
|
self.merge_configs()
|
|
464
439
|
|
|
465
440
|
def merge_configs(self) -> None:
|
|
466
|
-
"""Merge multiple configs to one.
|
|
467
|
-
"""
|
|
441
|
+
"""Merge multiple configs to one."""
|
|
468
442
|
new_config = deepcopy(self._default_config)
|
|
469
443
|
_merge_configs(new_config, self._user_config)
|
|
470
444
|
_merge_configs(new_config, self._auto_config)
|
|
471
445
|
_merge_configs(new_config, self._env_config)
|
|
472
446
|
|
|
447
|
+
# Apply command-line arguments for A2A
|
|
448
|
+
cmd_args_config = {}
|
|
449
|
+
|
|
450
|
+
# Check for A2A command-line arguments
|
|
451
|
+
if hasattr(self.cmd_args, "a2a_host") and self.cmd_args.a2a_host is not None:
|
|
452
|
+
if "a2a" not in cmd_args_config:
|
|
453
|
+
cmd_args_config["a2a"] = {}
|
|
454
|
+
cmd_args_config["a2a"]["host"] = self.cmd_args.a2a_host
|
|
455
|
+
|
|
456
|
+
if hasattr(self.cmd_args, "a2a_port") and self.cmd_args.a2a_port is not None:
|
|
457
|
+
if "a2a" not in cmd_args_config:
|
|
458
|
+
cmd_args_config["a2a"] = {}
|
|
459
|
+
cmd_args_config["a2a"]["port"] = self.cmd_args.a2a_port
|
|
460
|
+
|
|
461
|
+
if hasattr(self.cmd_args, "mindsdb_host") and self.cmd_args.mindsdb_host is not None:
|
|
462
|
+
if "a2a" not in cmd_args_config:
|
|
463
|
+
cmd_args_config["a2a"] = {}
|
|
464
|
+
cmd_args_config["a2a"]["mindsdb_host"] = self.cmd_args.mindsdb_host
|
|
465
|
+
|
|
466
|
+
if hasattr(self.cmd_args, "mindsdb_port") and self.cmd_args.mindsdb_port is not None:
|
|
467
|
+
if "a2a" not in cmd_args_config:
|
|
468
|
+
cmd_args_config["a2a"] = {}
|
|
469
|
+
cmd_args_config["a2a"]["mindsdb_port"] = self.cmd_args.mindsdb_port
|
|
470
|
+
|
|
471
|
+
if hasattr(self.cmd_args, "agent_name") and self.cmd_args.agent_name is not None:
|
|
472
|
+
if "a2a" not in cmd_args_config:
|
|
473
|
+
cmd_args_config["a2a"] = {}
|
|
474
|
+
cmd_args_config["a2a"]["agent_name"] = self.cmd_args.agent_name
|
|
475
|
+
|
|
476
|
+
if hasattr(self.cmd_args, "project_name") and self.cmd_args.project_name is not None:
|
|
477
|
+
if "a2a" not in cmd_args_config:
|
|
478
|
+
cmd_args_config["a2a"] = {}
|
|
479
|
+
cmd_args_config["a2a"]["project_name"] = self.cmd_args.project_name
|
|
480
|
+
|
|
481
|
+
# Merge command-line args config with highest priority
|
|
482
|
+
if cmd_args_config:
|
|
483
|
+
_merge_configs(new_config, cmd_args_config)
|
|
484
|
+
|
|
485
|
+
# Ensure A2A port is never 0, which would prevent the A2A API from starting
|
|
486
|
+
if "a2a" in new_config and isinstance(new_config["a2a"], dict):
|
|
487
|
+
if "port" in new_config["a2a"] and (new_config["a2a"]["port"] == 0 or new_config["a2a"]["port"] is None):
|
|
488
|
+
new_config["a2a"]["port"] = 47338 # Use the default port value
|
|
489
|
+
|
|
473
490
|
# region create dirs
|
|
474
|
-
for key, value in new_config[
|
|
491
|
+
for key, value in new_config["paths"].items():
|
|
475
492
|
if isinstance(value, str):
|
|
476
|
-
new_config[
|
|
493
|
+
new_config["paths"][key] = Path(value)
|
|
477
494
|
elif isinstance(value, Path) is False:
|
|
478
495
|
raise ValueError(f"Unexpected path value: {value}")
|
|
479
|
-
create_data_dir(new_config[
|
|
496
|
+
create_data_dir(new_config["paths"][key])
|
|
480
497
|
# endregion
|
|
481
498
|
|
|
482
499
|
self._config = new_config
|
|
@@ -494,39 +511,35 @@ class Config:
|
|
|
494
511
|
return self._config
|
|
495
512
|
|
|
496
513
|
def update(self, data: dict) -> None:
|
|
497
|
-
"""Update calues in `auto` config
|
|
498
|
-
"""
|
|
514
|
+
"""Update calues in `auto` config"""
|
|
499
515
|
self.ensure_auto_config_is_relevant()
|
|
500
516
|
|
|
501
517
|
_merge_configs(self._auto_config, data)
|
|
502
518
|
|
|
503
|
-
self.auto_config_path.write_text(
|
|
504
|
-
json.dumps(self._auto_config, indent=4)
|
|
505
|
-
)
|
|
519
|
+
self.auto_config_path.write_text(json.dumps(self._auto_config, indent=4))
|
|
506
520
|
|
|
507
521
|
self.auto_config_mtime = self.auto_config_path.stat().st_mtime
|
|
508
522
|
|
|
509
523
|
self.merge_configs()
|
|
510
524
|
|
|
511
525
|
def raise_warnings(self, logger) -> None:
|
|
512
|
-
"""Show warnings about config options
|
|
513
|
-
"""
|
|
526
|
+
"""Show warnings about config options"""
|
|
514
527
|
|
|
515
|
-
if
|
|
528
|
+
if "storage_dir" in self._config:
|
|
516
529
|
logger.warning("The 'storage_dir' config option is no longer supported. Use 'paths.root' instead.")
|
|
517
530
|
|
|
518
|
-
if
|
|
531
|
+
if "log" in self._config:
|
|
519
532
|
logger.warning("The 'log' config option is no longer supported. Use 'logging' instead.")
|
|
520
533
|
|
|
521
|
-
if os.environ.get(
|
|
534
|
+
if os.environ.get("MINDSDB_DEFAULT_SERVER", "") != "":
|
|
522
535
|
logger.warning(
|
|
523
536
|
"Env variable 'MINDSDB_DEFAULT_SERVER' is going to be deprecated soon. "
|
|
524
537
|
"Use 'MINDSDB_HTTP_SERVER_TYPE' instead."
|
|
525
538
|
)
|
|
526
539
|
|
|
527
|
-
for env_name in (
|
|
528
|
-
env_value = os.environ.get(env_name,
|
|
529
|
-
if env_value.lower() not in (
|
|
540
|
+
for env_name in ("MINDSDB_HTTP_SERVER_TYPE", "MINDSDB_DEFAULT_SERVER"):
|
|
541
|
+
env_value = os.environ.get(env_name, "")
|
|
542
|
+
if env_value.lower() not in ("waitress", "flask", "gunicorn", ""):
|
|
530
543
|
logger.warning(
|
|
531
544
|
f"The value '{env_value}' of the environment variable {env_name} is not valid. "
|
|
532
545
|
"It must be one of the following: 'waitress', 'flask', or 'gunicorn'."
|
|
@@ -538,9 +551,67 @@ class Config:
|
|
|
538
551
|
self.parse_cmd_args()
|
|
539
552
|
return self._cmd_args
|
|
540
553
|
|
|
554
|
+
def parse_cmd_args(self) -> None:
|
|
555
|
+
"""Collect cmd args to self._cmd_args (accessable as self.cmd_args)"""
|
|
556
|
+
if self._cmd_args is not None:
|
|
557
|
+
return
|
|
558
|
+
|
|
559
|
+
# if it is not mindsdb run, then set args to empty
|
|
560
|
+
if (sys.modules["__main__"].__package__ or "").lower() != "mindsdb" and os.environ.get(
|
|
561
|
+
"MINDSDB_RUNTIME"
|
|
562
|
+
) != "1":
|
|
563
|
+
self._cmd_args = argparse.Namespace(
|
|
564
|
+
api=None,
|
|
565
|
+
config=None,
|
|
566
|
+
install_handlers=None,
|
|
567
|
+
verbose=False,
|
|
568
|
+
no_studio=False,
|
|
569
|
+
version=False,
|
|
570
|
+
ml_task_queue_consumer=None,
|
|
571
|
+
agent=None,
|
|
572
|
+
project=None,
|
|
573
|
+
)
|
|
574
|
+
return
|
|
575
|
+
|
|
576
|
+
parser = argparse.ArgumentParser(description="CL argument for mindsdb server")
|
|
577
|
+
parser.add_argument("--api", type=str, default=None)
|
|
578
|
+
parser.add_argument("--config", type=str, default=None)
|
|
579
|
+
parser.add_argument("--install-handlers", type=str, default=None)
|
|
580
|
+
parser.add_argument("--verbose", action="store_true")
|
|
581
|
+
parser.add_argument("--no_studio", action="store_true")
|
|
582
|
+
parser.add_argument("-v", "--version", action="store_true")
|
|
583
|
+
parser.add_argument("--ml_task_queue_consumer", action="store_true", default=None)
|
|
584
|
+
parser.add_argument(
|
|
585
|
+
"--agent",
|
|
586
|
+
type=str,
|
|
587
|
+
default=None,
|
|
588
|
+
help="Name of the agent to use with litellm APIs",
|
|
589
|
+
)
|
|
590
|
+
parser.add_argument(
|
|
591
|
+
"--project",
|
|
592
|
+
type=str,
|
|
593
|
+
default=None,
|
|
594
|
+
help="Project containing the agent (default: mindsdb)",
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
# A2A specific arguments
|
|
598
|
+
parser.add_argument("--a2a-host", type=str, default=None, help="A2A server host")
|
|
599
|
+
parser.add_argument("--a2a-port", type=int, default=None, help="A2A server port")
|
|
600
|
+
parser.add_argument("--mindsdb-host", type=str, default=None, help="MindsDB server host")
|
|
601
|
+
parser.add_argument("--mindsdb-port", type=int, default=None, help="MindsDB server port")
|
|
602
|
+
parser.add_argument(
|
|
603
|
+
"--agent-name",
|
|
604
|
+
type=str,
|
|
605
|
+
default=None,
|
|
606
|
+
help="MindsDB agent name to connect to",
|
|
607
|
+
)
|
|
608
|
+
parser.add_argument("--project-name", type=str, default=None, help="MindsDB project name")
|
|
609
|
+
|
|
610
|
+
self._cmd_args = parser.parse_args()
|
|
611
|
+
|
|
541
612
|
@property
|
|
542
613
|
def paths(self):
|
|
543
|
-
return self._config[
|
|
614
|
+
return self._config["paths"]
|
|
544
615
|
|
|
545
616
|
@property
|
|
546
617
|
def user_config(self):
|