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/context.py
CHANGED
|
@@ -54,7 +54,7 @@ class Context:
|
|
|
54
54
|
def load(self, storage: dict) -> None:
|
|
55
55
|
self._storage.set(storage)
|
|
56
56
|
|
|
57
|
-
def
|
|
57
|
+
def get_metadata(self, **kwargs) -> dict:
|
|
58
58
|
return {
|
|
59
59
|
'user_id': self.user_id or "",
|
|
60
60
|
'company_id': self.company_id or "",
|
mindsdb/utilities/functions.py
CHANGED
|
@@ -7,7 +7,6 @@ import textwrap
|
|
|
7
7
|
from functools import wraps
|
|
8
8
|
from collections.abc import Callable
|
|
9
9
|
|
|
10
|
-
import requests
|
|
11
10
|
from cryptography.fernet import Fernet
|
|
12
11
|
from mindsdb_sql_parser.ast import Identifier
|
|
13
12
|
|
|
@@ -72,41 +71,6 @@ def mark_process(name: str, custom_mark: str = None) -> Callable:
|
|
|
72
71
|
return mark_process_wrapper
|
|
73
72
|
|
|
74
73
|
|
|
75
|
-
def get_versions_where_predictors_become_obsolete():
|
|
76
|
-
""" Get list of MindsDB versions in which predictors should be retrained
|
|
77
|
-
Returns:
|
|
78
|
-
list of str or False
|
|
79
|
-
"""
|
|
80
|
-
versions_for_updating_predictors = []
|
|
81
|
-
try:
|
|
82
|
-
try:
|
|
83
|
-
res = requests.get(
|
|
84
|
-
'https://mindsdb-cloud-public-service-files.s3.us-east-2.amazonaws.com/version_for_updating_predictors.txt',
|
|
85
|
-
timeout=0.5
|
|
86
|
-
)
|
|
87
|
-
except (ConnectionError, requests.exceptions.ConnectionError) as e:
|
|
88
|
-
logger.error(f'Is no connection. {e}')
|
|
89
|
-
raise
|
|
90
|
-
except Exception as e:
|
|
91
|
-
logger.error(f'Is something wrong with getting version_for_updating_predictors.txt: {e}')
|
|
92
|
-
raise
|
|
93
|
-
|
|
94
|
-
if res.status_code != 200:
|
|
95
|
-
logger.error(f'Cant get version_for_updating_predictors.txt: returned status code = {res.status_code}')
|
|
96
|
-
raise
|
|
97
|
-
|
|
98
|
-
try:
|
|
99
|
-
versions_for_updating_predictors = res.text.replace(' \t\r', '').split('\n')
|
|
100
|
-
except Exception as e:
|
|
101
|
-
logger.error(f'Cant decode version_for_updating_predictors.txt: {e}')
|
|
102
|
-
raise
|
|
103
|
-
except Exception:
|
|
104
|
-
return False, versions_for_updating_predictors
|
|
105
|
-
|
|
106
|
-
versions_for_updating_predictors = [x for x in versions_for_updating_predictors if len(x) > 0]
|
|
107
|
-
return True, versions_for_updating_predictors
|
|
108
|
-
|
|
109
|
-
|
|
110
74
|
def init_lexer_parsers():
|
|
111
75
|
from mindsdb_sql_parser.lexer import MindsDBLexer
|
|
112
76
|
from mindsdb_sql_parser.parser import MindsDBParser
|
mindsdb/utilities/langfuse.py
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import typing
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
from mindsdb.utilities import log
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
from langfuse.callback import CallbackHandler
|
|
8
|
-
from langfuse.
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from langfuse.callback import CallbackHandler
|
|
9
|
+
from langfuse.client import StatefulSpanClient
|
|
9
10
|
|
|
10
11
|
logger = log.getLogger(__name__)
|
|
11
12
|
|
|
@@ -98,6 +99,12 @@ class LangfuseClientWrapper:
|
|
|
98
99
|
logger.debug(f"LANGFUSE_TIMEOUT: {LANGFUSE_TIMEOUT}")
|
|
99
100
|
logger.debug(f"LANGFUSE_SAMPLE_RATE: {LANGFUSE_SAMPLE_RATE * 100}%")
|
|
100
101
|
|
|
102
|
+
try:
|
|
103
|
+
from langfuse import Langfuse
|
|
104
|
+
except ImportError:
|
|
105
|
+
logger.error("Langfuse is not installed. Please install it with `pip install langfuse`.")
|
|
106
|
+
return
|
|
107
|
+
|
|
101
108
|
self.client = Langfuse(
|
|
102
109
|
public_key=public_key,
|
|
103
110
|
secret_key=secret_key,
|
|
@@ -164,7 +171,7 @@ class LangfuseClientWrapper:
|
|
|
164
171
|
|
|
165
172
|
def start_span(self,
|
|
166
173
|
name: str,
|
|
167
|
-
input: typing.Optional[typing.Any] = None) -> typing.Optional[StatefulSpanClient]:
|
|
174
|
+
input: typing.Optional[typing.Any] = None) -> typing.Optional['StatefulSpanClient']:
|
|
168
175
|
"""
|
|
169
176
|
Create span. If Langfuse is disabled, nothing will be done.
|
|
170
177
|
|
|
@@ -180,7 +187,7 @@ class LangfuseClientWrapper:
|
|
|
180
187
|
return self.trace.span(name=name, input=input)
|
|
181
188
|
|
|
182
189
|
def end_span_stream(self,
|
|
183
|
-
span: typing.Optional[StatefulSpanClient] = None) -> None:
|
|
190
|
+
span: typing.Optional['StatefulSpanClient'] = None) -> None:
|
|
184
191
|
"""
|
|
185
192
|
End span. If Langfuse is disabled, nothing will happen.
|
|
186
193
|
Args:
|
|
@@ -195,7 +202,7 @@ class LangfuseClientWrapper:
|
|
|
195
202
|
self.trace.update()
|
|
196
203
|
|
|
197
204
|
def end_span(self,
|
|
198
|
-
span: typing.Optional[StatefulSpanClient] = None,
|
|
205
|
+
span: typing.Optional['StatefulSpanClient'] = None,
|
|
199
206
|
output: typing.Optional[typing.Any] = None) -> None:
|
|
200
207
|
"""
|
|
201
208
|
End trace. If Langfuse is disabled, nothing will be done.
|
|
@@ -227,7 +234,7 @@ class LangfuseClientWrapper:
|
|
|
227
234
|
except Exception as e:
|
|
228
235
|
logger.error(f'Something went wrong while processing Langfuse trace {self.trace.id}: {str(e)}')
|
|
229
236
|
|
|
230
|
-
def get_langchain_handler(self) -> typing.Optional[CallbackHandler]:
|
|
237
|
+
def get_langchain_handler(self) -> typing.Optional['CallbackHandler']:
|
|
231
238
|
"""
|
|
232
239
|
Get Langchain handler. If Langfuse is disabled, returns None.
|
|
233
240
|
"""
|
|
@@ -257,8 +264,10 @@ class LangfuseClientWrapper:
|
|
|
257
264
|
self.tags.append(self.release)
|
|
258
265
|
|
|
259
266
|
def _get_tool_usage(self) -> typing.Dict:
|
|
260
|
-
"""
|
|
261
|
-
Note: assumes trace marks an action with string `AgentAction`
|
|
267
|
+
"""Retrieves tool usage information from a langfuse trace.
|
|
268
|
+
Note: assumes trace marks an action with string `AgentAction`
|
|
269
|
+
"""
|
|
270
|
+
from langfuse.api.resources.commons.errors.not_found_error import NotFoundError as TraceNotFoundError
|
|
262
271
|
|
|
263
272
|
tool_usage = {}
|
|
264
273
|
|
|
@@ -1,206 +1,22 @@
|
|
|
1
1
|
import os
|
|
2
|
-
import typing
|
|
3
|
-
|
|
4
|
-
from opentelemetry import trace # noqa: F401
|
|
5
|
-
from opentelemetry import metrics # noqa: F401
|
|
6
|
-
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter as OTLPLogExporterGRPC
|
|
7
|
-
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter as OTLPLogExporterHTTP
|
|
8
|
-
from opentelemetry.sdk._logs._internal.export import LogExporter
|
|
9
|
-
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter as OTLPMetricExporterGRPC
|
|
10
|
-
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPMetricExporterHTTP
|
|
11
|
-
from opentelemetry.sdk.metrics.export import MetricExporter, ConsoleMetricExporter
|
|
12
|
-
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter as OTLPSpanExporterGRPC
|
|
13
|
-
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter as OTLPSpanExporterHTTP
|
|
14
|
-
from opentelemetry.sdk.trace.export import SpanExporter, ConsoleSpanExporter
|
|
15
|
-
from opentelemetry.sdk.resources import Resource
|
|
16
|
-
from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
|
|
17
|
-
|
|
18
|
-
from mindsdb.utilities.otel.logger import setup_logger
|
|
19
|
-
from mindsdb.utilities.otel.meter import setup_meter
|
|
20
|
-
from mindsdb.utilities.otel.tracer import setup_tracer
|
|
21
|
-
from mindsdb.utilities.utils import parse_csv_attributes
|
|
22
|
-
from mindsdb.utilities import log
|
|
23
|
-
|
|
24
|
-
logger = log.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
# Check OpenTelemetry exporter type
|
|
27
|
-
OTEL_EXPORTER_TYPE = os.getenv("OTEL_EXPORTER_TYPE", "console") # console or otlp
|
|
28
|
-
|
|
29
|
-
# Define OpenTelemetry exporter protocol
|
|
30
|
-
OTEL_EXPORTER_PROTOCOL = os.getenv("OTEL_EXPORTER_PROTOCOL", "grpc") # grpc or http
|
|
31
|
-
|
|
32
|
-
# Define OTLP endpoint. If not set, the default OTLP endpoint will be used
|
|
33
|
-
OTEL_OTLP_ENDPOINT = os.getenv("OTEL_OTLP_ENDPOINT", "http://localhost:4317")
|
|
34
|
-
|
|
35
|
-
# Define OTLP logging endpoint. If not set, the default OTLP logging endpoint will be used
|
|
36
|
-
OTEL_OTLP_LOGGING_ENDPOINT = os.getenv("OTEL_OTLP_LOGGING_ENDPOINT", OTEL_OTLP_ENDPOINT)
|
|
37
|
-
|
|
38
|
-
# Define OTLP tracing endpoint. If not set, the default OTLP tracing endpoint will be used
|
|
39
|
-
OTEL_OTLP_TRACING_ENDPOINT = os.getenv("OTEL_OTLP_TRACING_ENDPOINT", OTEL_OTLP_ENDPOINT)
|
|
40
|
-
|
|
41
|
-
# Define OTLP metrics endpoint. If not set, the default OTLP metrics endpoint will be used
|
|
42
|
-
OTEL_OTLP_METRICS_ENDPOINT = os.getenv("OTEL_OTLP_METRICS_ENDPOINT", OTEL_OTLP_ENDPOINT)
|
|
43
|
-
|
|
44
|
-
# Define service name
|
|
45
|
-
OTEL_SERVICE_NAME = os.getenv("OTEL_SERVICE_NAME", "mindsdb")
|
|
46
|
-
|
|
47
|
-
# Define service instace ID
|
|
48
|
-
OTEL_SERVICE_INSTANCE_ID = os.getenv("OTEL_SERVICE_INSTANCE_ID", "mindsdb-instance")
|
|
49
|
-
|
|
50
|
-
# The name of the environment we"re on, by default local for development, this is set differently per-env in our Helm
|
|
51
|
-
# chart values files
|
|
52
|
-
OTEL_SERVICE_ENVIRONMENT = os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower()
|
|
53
|
-
|
|
54
|
-
# Define service release
|
|
55
|
-
OTEL_SERVICE_RELEASE = os.getenv("OTEL_SERVICE_RELEASE", "local").lower()
|
|
56
|
-
|
|
57
|
-
# Define how often to capture traces
|
|
58
|
-
OTEL_TRACE_SAMPLE_RATE = float(os.getenv("OTEL_TRACE_SAMPLE_RATE", "1.0"))
|
|
59
|
-
|
|
60
|
-
# Define extra attributes
|
|
61
|
-
OTEL_EXTRA_ATTRIBUTES = os.getenv("OTEL_EXTRA_ATTRIBUTES", "")
|
|
62
2
|
|
|
63
3
|
# By default, we have Open Telemetry SDK enabled on all envs, except for local which is disabled by default.
|
|
64
4
|
OTEL_SDK_DISABLED = (os.getenv("OTEL_SDK_DISABLED", "false").lower() == "true"
|
|
65
5
|
or os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower() == "local")
|
|
66
6
|
|
|
67
|
-
# Define if OpenTelemetry logging is disabled. By default, it is disabled.
|
|
68
|
-
OTEL_LOGGING_DISABLED = os.getenv("OTEL_LOGGING_DISABLED", "true").lower() == "true"
|
|
69
|
-
|
|
70
|
-
# Define if OpenTelemetry tracing is disabled. By default, it is enabled.
|
|
71
|
-
OTEL_TRACING_DISABLED = os.getenv("OTEL_TRACING_DISABLED", "false").lower() == "true"
|
|
72
|
-
|
|
73
|
-
# Define if OpenTelemetry metrics is disabled. By default, it is disabled.
|
|
74
|
-
OTEL_METRICS_DISABLED = os.getenv("OTEL_METRICS_DISABLED", "true").lower() == "true"
|
|
75
|
-
|
|
76
7
|
# If you want to enable Open Telemetry on local for some reason please set OTEL_SDK_FORCE_RUN to true
|
|
77
8
|
OTEL_SDK_FORCE_RUN = os.getenv("OTEL_SDK_FORCE_RUN", "false").lower() == "true"
|
|
78
9
|
|
|
10
|
+
OTEL_ENABLED = not OTEL_SDK_DISABLED or OTEL_SDK_FORCE_RUN
|
|
79
11
|
|
|
80
|
-
def
|
|
81
|
-
|
|
82
|
-
Get OpenTelemetry attributes
|
|
83
|
-
|
|
84
|
-
Returns:
|
|
85
|
-
dict: OpenTelemetry attributes
|
|
86
|
-
"""
|
|
12
|
+
def increment_otel_query_request_counter(metadata: dict) -> None:
|
|
13
|
+
pass
|
|
87
14
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
"service.instance.id": OTEL_SERVICE_INSTANCE_ID,
|
|
91
|
-
"environment": OTEL_SERVICE_ENVIRONMENT,
|
|
92
|
-
"release": OTEL_SERVICE_RELEASE,
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
extra_attributes = {}
|
|
15
|
+
trace = None
|
|
16
|
+
if OTEL_ENABLED:
|
|
96
17
|
try:
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
attributes = {**extra_attributes, **base_attributes} # Base attributes take precedence over extra attributes
|
|
102
|
-
|
|
103
|
-
return attributes
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def get_logging_exporter() -> typing.Optional[LogExporter]:
|
|
107
|
-
"""
|
|
108
|
-
Get OpenTelemetry logging exporter.
|
|
109
|
-
|
|
110
|
-
Returns:
|
|
111
|
-
OTLPLogExporter: OpenTelemetry logging exporter
|
|
112
|
-
"""
|
|
113
|
-
|
|
114
|
-
if OTEL_EXPORTER_TYPE == "otlp":
|
|
115
|
-
|
|
116
|
-
if OTEL_EXPORTER_PROTOCOL == "grpc":
|
|
117
|
-
return OTLPLogExporterGRPC(
|
|
118
|
-
endpoint=OTEL_OTLP_LOGGING_ENDPOINT,
|
|
119
|
-
insecure=True
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
elif OTEL_EXPORTER_PROTOCOL == "http":
|
|
123
|
-
return OTLPLogExporterHTTP(
|
|
124
|
-
endpoint=OTEL_OTLP_LOGGING_ENDPOINT
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
return None
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def get_span_exporter() -> SpanExporter:
|
|
131
|
-
"""
|
|
132
|
-
Get OpenTelemetry span exporter
|
|
133
|
-
|
|
134
|
-
Returns:
|
|
135
|
-
OTLPSpanExporter: OpenTelemetry span exporter
|
|
136
|
-
"""
|
|
137
|
-
|
|
138
|
-
if OTEL_EXPORTER_TYPE == "otlp":
|
|
139
|
-
|
|
140
|
-
if OTEL_EXPORTER_PROTOCOL == "grpc":
|
|
141
|
-
return OTLPSpanExporterGRPC(
|
|
142
|
-
endpoint=OTEL_OTLP_TRACING_ENDPOINT,
|
|
143
|
-
insecure=True
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
elif OTEL_EXPORTER_PROTOCOL == "http":
|
|
147
|
-
return OTLPSpanExporterHTTP(
|
|
148
|
-
endpoint=OTEL_OTLP_TRACING_ENDPOINT
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
return ConsoleSpanExporter()
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def get_metrics_exporter() -> typing.Optional[MetricExporter]:
|
|
155
|
-
"""
|
|
156
|
-
Get OpenTelemetry metrics exporter
|
|
157
|
-
|
|
158
|
-
Returns:
|
|
159
|
-
OTLPLogExporter: OpenTelemetry metrics exporter
|
|
160
|
-
"""
|
|
161
|
-
|
|
162
|
-
if OTEL_EXPORTER_TYPE == "otlp":
|
|
163
|
-
|
|
164
|
-
if OTEL_EXPORTER_PROTOCOL == "grpc":
|
|
165
|
-
return OTLPMetricExporterGRPC(
|
|
166
|
-
endpoint=OTEL_OTLP_METRICS_ENDPOINT,
|
|
167
|
-
insecure=True
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
elif OTEL_EXPORTER_PROTOCOL == "http":
|
|
171
|
-
return OTLPMetricExporterHTTP(
|
|
172
|
-
endpoint=OTEL_OTLP_METRICS_ENDPOINT
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
return ConsoleMetricExporter()
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
if not OTEL_SDK_DISABLED or OTEL_SDK_FORCE_RUN:
|
|
179
|
-
logger.info("OpenTelemetry enabled")
|
|
180
|
-
logger.info(f"OpenTelemetry exporter type: {OTEL_EXPORTER_TYPE}")
|
|
181
|
-
logger.info(f"OpenTelemetry service name: {OTEL_SERVICE_NAME}")
|
|
182
|
-
logger.info(f"OpenTelemetry service environment: {OTEL_SERVICE_ENVIRONMENT}")
|
|
183
|
-
logger.info(f"OpenTelemetry service release: {OTEL_SERVICE_RELEASE}")
|
|
184
|
-
logger.info(f"OpenTelemetry trace sample rate: {OTEL_TRACE_SAMPLE_RATE}")
|
|
185
|
-
logger.info(f"OpenTelemetry extra attributes: {OTEL_EXTRA_ATTRIBUTES}")
|
|
186
|
-
|
|
187
|
-
# Define OpenTelemetry resources (e.g., service name)
|
|
188
|
-
attributes = get_otel_attributes()
|
|
189
|
-
|
|
190
|
-
# Define OpenTelemetry sampler
|
|
191
|
-
sampler = TraceIdRatioBased(OTEL_TRACE_SAMPLE_RATE)
|
|
192
|
-
|
|
193
|
-
# Define OpenTelemetry resources (e.g., service name)
|
|
194
|
-
resource = Resource(attributes=attributes)
|
|
195
|
-
|
|
196
|
-
if not OTEL_LOGGING_DISABLED:
|
|
197
|
-
logger.info("OpenTelemetry Logging is enabled")
|
|
198
|
-
setup_logger(resource, get_logging_exporter())
|
|
199
|
-
|
|
200
|
-
if not OTEL_TRACING_DISABLED:
|
|
201
|
-
logger.info("OpenTelemetry Tracing is enabled")
|
|
202
|
-
setup_tracer(resource, sampler, get_span_exporter())
|
|
18
|
+
from mindsdb.utilities.otel.prepare import trace
|
|
19
|
+
from mindsdb.utilities.otel.metric_handlers import increment_otel_query_request_counter
|
|
20
|
+
except Exception:
|
|
21
|
+
pass
|
|
203
22
|
|
|
204
|
-
if not OTEL_METRICS_DISABLED:
|
|
205
|
-
logger.info("OpenTelemetry Metrics is enabled")
|
|
206
|
-
setup_meter(resource, get_metrics_exporter())
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from mindsdb.utilities.otel import metrics, OTEL_SERVICE_NAME
|
|
1
|
+
from mindsdb.utilities.otel.prepare import metrics, OTEL_SERVICE_NAME
|
|
2
2
|
|
|
3
3
|
_query_request_counter = None
|
|
4
4
|
|
|
@@ -23,3 +23,7 @@ def get_query_request_counter():
|
|
|
23
23
|
)
|
|
24
24
|
|
|
25
25
|
return _query_request_counter
|
|
26
|
+
|
|
27
|
+
def increment_otel_query_request_counter(metadata: dict) -> None:
|
|
28
|
+
query_request_counter = get_query_request_counter()
|
|
29
|
+
query_request_counter.add(1, metadata)
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import typing
|
|
3
|
+
|
|
4
|
+
from opentelemetry import trace # noqa: F401
|
|
5
|
+
from opentelemetry import metrics # noqa: F401
|
|
6
|
+
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter as OTLPLogExporterGRPC
|
|
7
|
+
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter as OTLPLogExporterHTTP
|
|
8
|
+
from opentelemetry.sdk._logs._internal.export import LogExporter
|
|
9
|
+
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter as OTLPMetricExporterGRPC
|
|
10
|
+
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPMetricExporterHTTP
|
|
11
|
+
from opentelemetry.sdk.metrics.export import MetricExporter, ConsoleMetricExporter
|
|
12
|
+
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter as OTLPSpanExporterGRPC
|
|
13
|
+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter as OTLPSpanExporterHTTP
|
|
14
|
+
from opentelemetry.sdk.trace.export import SpanExporter, ConsoleSpanExporter
|
|
15
|
+
from opentelemetry.sdk.resources import Resource
|
|
16
|
+
from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
|
|
17
|
+
|
|
18
|
+
from mindsdb.utilities.otel.logger import setup_logger
|
|
19
|
+
from mindsdb.utilities.otel.meter import setup_meter
|
|
20
|
+
from mindsdb.utilities.otel.tracer import setup_tracer
|
|
21
|
+
from mindsdb.utilities.utils import parse_csv_attributes
|
|
22
|
+
from mindsdb.utilities import log
|
|
23
|
+
|
|
24
|
+
logger = log.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
# Check OpenTelemetry exporter type
|
|
27
|
+
OTEL_EXPORTER_TYPE = os.getenv("OTEL_EXPORTER_TYPE", "console") # console or otlp
|
|
28
|
+
|
|
29
|
+
# Define OpenTelemetry exporter protocol
|
|
30
|
+
OTEL_EXPORTER_PROTOCOL = os.getenv("OTEL_EXPORTER_PROTOCOL", "grpc") # grpc or http
|
|
31
|
+
|
|
32
|
+
# Define OTLP endpoint. If not set, the default OTLP endpoint will be used
|
|
33
|
+
OTEL_OTLP_ENDPOINT = os.getenv("OTEL_OTLP_ENDPOINT", "http://localhost:4317")
|
|
34
|
+
|
|
35
|
+
# Define OTLP logging endpoint. If not set, the default OTLP logging endpoint will be used
|
|
36
|
+
OTEL_OTLP_LOGGING_ENDPOINT = os.getenv("OTEL_OTLP_LOGGING_ENDPOINT", OTEL_OTLP_ENDPOINT)
|
|
37
|
+
|
|
38
|
+
# Define OTLP tracing endpoint. If not set, the default OTLP tracing endpoint will be used
|
|
39
|
+
OTEL_OTLP_TRACING_ENDPOINT = os.getenv("OTEL_OTLP_TRACING_ENDPOINT", OTEL_OTLP_ENDPOINT)
|
|
40
|
+
|
|
41
|
+
# Define OTLP metrics endpoint. If not set, the default OTLP metrics endpoint will be used
|
|
42
|
+
OTEL_OTLP_METRICS_ENDPOINT = os.getenv("OTEL_OTLP_METRICS_ENDPOINT", OTEL_OTLP_ENDPOINT)
|
|
43
|
+
|
|
44
|
+
# Define service name
|
|
45
|
+
OTEL_SERVICE_NAME = os.getenv("OTEL_SERVICE_NAME", "mindsdb")
|
|
46
|
+
|
|
47
|
+
# Define service instace ID
|
|
48
|
+
OTEL_SERVICE_INSTANCE_ID = os.getenv("OTEL_SERVICE_INSTANCE_ID", "mindsdb-instance")
|
|
49
|
+
|
|
50
|
+
# The name of the environment we"re on, by default local for development, this is set differently per-env in our Helm
|
|
51
|
+
# chart values files
|
|
52
|
+
OTEL_SERVICE_ENVIRONMENT = os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower()
|
|
53
|
+
|
|
54
|
+
# Define service release
|
|
55
|
+
OTEL_SERVICE_RELEASE = os.getenv("OTEL_SERVICE_RELEASE", "local").lower()
|
|
56
|
+
|
|
57
|
+
# Define how often to capture traces
|
|
58
|
+
OTEL_TRACE_SAMPLE_RATE = float(os.getenv("OTEL_TRACE_SAMPLE_RATE", "1.0"))
|
|
59
|
+
|
|
60
|
+
# Define extra attributes
|
|
61
|
+
OTEL_EXTRA_ATTRIBUTES = os.getenv("OTEL_EXTRA_ATTRIBUTES", "")
|
|
62
|
+
|
|
63
|
+
# Define if OpenTelemetry logging is disabled. By default, it is disabled.
|
|
64
|
+
OTEL_LOGGING_DISABLED = os.getenv("OTEL_LOGGING_DISABLED", "true").lower() == "true"
|
|
65
|
+
|
|
66
|
+
# Define if OpenTelemetry tracing is disabled. By default, it is enabled.
|
|
67
|
+
OTEL_TRACING_DISABLED = os.getenv("OTEL_TRACING_DISABLED", "false").lower() == "true"
|
|
68
|
+
|
|
69
|
+
# Define if OpenTelemetry metrics is disabled. By default, it is disabled.
|
|
70
|
+
OTEL_METRICS_DISABLED = os.getenv("OTEL_METRICS_DISABLED", "true").lower() == "true"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def get_otel_attributes() -> dict:
|
|
74
|
+
"""
|
|
75
|
+
Get OpenTelemetry attributes
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
dict: OpenTelemetry attributes
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
base_attributes = {
|
|
82
|
+
"service.name": OTEL_SERVICE_NAME,
|
|
83
|
+
"service.instance.id": OTEL_SERVICE_INSTANCE_ID,
|
|
84
|
+
"environment": OTEL_SERVICE_ENVIRONMENT,
|
|
85
|
+
"release": OTEL_SERVICE_RELEASE,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
extra_attributes = {}
|
|
89
|
+
try:
|
|
90
|
+
extra_attributes = parse_csv_attributes(OTEL_EXTRA_ATTRIBUTES)
|
|
91
|
+
except Exception as e:
|
|
92
|
+
logger.error(f"Failed to parse OTEL_EXTRA_ATTRIBUTES: {e}")
|
|
93
|
+
|
|
94
|
+
attributes = {**extra_attributes, **base_attributes} # Base attributes take precedence over extra attributes
|
|
95
|
+
|
|
96
|
+
return attributes
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def get_logging_exporter() -> typing.Optional[LogExporter]:
|
|
100
|
+
"""
|
|
101
|
+
Get OpenTelemetry logging exporter.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
OTLPLogExporter: OpenTelemetry logging exporter
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
if OTEL_EXPORTER_TYPE == "otlp":
|
|
108
|
+
|
|
109
|
+
if OTEL_EXPORTER_PROTOCOL == "grpc":
|
|
110
|
+
return OTLPLogExporterGRPC(
|
|
111
|
+
endpoint=OTEL_OTLP_LOGGING_ENDPOINT,
|
|
112
|
+
insecure=True
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
elif OTEL_EXPORTER_PROTOCOL == "http":
|
|
116
|
+
return OTLPLogExporterHTTP(
|
|
117
|
+
endpoint=OTEL_OTLP_LOGGING_ENDPOINT
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def get_span_exporter() -> SpanExporter:
|
|
124
|
+
"""
|
|
125
|
+
Get OpenTelemetry span exporter
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
OTLPSpanExporter: OpenTelemetry span exporter
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
if OTEL_EXPORTER_TYPE == "otlp":
|
|
132
|
+
|
|
133
|
+
if OTEL_EXPORTER_PROTOCOL == "grpc":
|
|
134
|
+
return OTLPSpanExporterGRPC(
|
|
135
|
+
endpoint=OTEL_OTLP_TRACING_ENDPOINT,
|
|
136
|
+
insecure=True
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
elif OTEL_EXPORTER_PROTOCOL == "http":
|
|
140
|
+
return OTLPSpanExporterHTTP(
|
|
141
|
+
endpoint=OTEL_OTLP_TRACING_ENDPOINT
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
return ConsoleSpanExporter()
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def get_metrics_exporter() -> typing.Optional[MetricExporter]:
|
|
148
|
+
"""
|
|
149
|
+
Get OpenTelemetry metrics exporter
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
OTLPLogExporter: OpenTelemetry metrics exporter
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
if OTEL_EXPORTER_TYPE == "otlp":
|
|
156
|
+
|
|
157
|
+
if OTEL_EXPORTER_PROTOCOL == "grpc":
|
|
158
|
+
return OTLPMetricExporterGRPC(
|
|
159
|
+
endpoint=OTEL_OTLP_METRICS_ENDPOINT,
|
|
160
|
+
insecure=True
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
elif OTEL_EXPORTER_PROTOCOL == "http":
|
|
164
|
+
return OTLPMetricExporterHTTP(
|
|
165
|
+
endpoint=OTEL_OTLP_METRICS_ENDPOINT
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
return ConsoleMetricExporter()
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
logger.info("OpenTelemetry enabled")
|
|
172
|
+
logger.info(f"OpenTelemetry exporter type: {OTEL_EXPORTER_TYPE}")
|
|
173
|
+
logger.info(f"OpenTelemetry service name: {OTEL_SERVICE_NAME}")
|
|
174
|
+
logger.info(f"OpenTelemetry service environment: {OTEL_SERVICE_ENVIRONMENT}")
|
|
175
|
+
logger.info(f"OpenTelemetry service release: {OTEL_SERVICE_RELEASE}")
|
|
176
|
+
logger.info(f"OpenTelemetry trace sample rate: {OTEL_TRACE_SAMPLE_RATE}")
|
|
177
|
+
logger.info(f"OpenTelemetry extra attributes: {OTEL_EXTRA_ATTRIBUTES}")
|
|
178
|
+
|
|
179
|
+
# Define OpenTelemetry resources (e.g., service name)
|
|
180
|
+
attributes = get_otel_attributes()
|
|
181
|
+
|
|
182
|
+
# Define OpenTelemetry sampler
|
|
183
|
+
sampler = TraceIdRatioBased(OTEL_TRACE_SAMPLE_RATE)
|
|
184
|
+
|
|
185
|
+
# Define OpenTelemetry resources (e.g., service name)
|
|
186
|
+
resource = Resource(attributes=attributes)
|
|
187
|
+
|
|
188
|
+
if not OTEL_LOGGING_DISABLED:
|
|
189
|
+
logger.info("OpenTelemetry Logging is enabled")
|
|
190
|
+
setup_logger(resource, get_logging_exporter())
|
|
191
|
+
|
|
192
|
+
if not OTEL_TRACING_DISABLED:
|
|
193
|
+
logger.info("OpenTelemetry Tracing is enabled")
|
|
194
|
+
setup_tracer(resource, sampler, get_span_exporter())
|
|
195
|
+
|
|
196
|
+
if not OTEL_METRICS_DISABLED:
|
|
197
|
+
logger.info("OpenTelemetry Metrics is enabled")
|
|
198
|
+
setup_meter(resource, get_metrics_exporter())
|
mindsdb/utilities/sql.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
def _is_in_quotes(pos: int, quote_positions: list[tuple[int, int]]) -> bool:
|
|
2
|
+
"""
|
|
3
|
+
Check if a position is within any quoted string.
|
|
4
|
+
|
|
5
|
+
Args:
|
|
6
|
+
pos (int): The position to check.
|
|
7
|
+
quote_positions (list[tuple[int, int]]): A list of tuples, each containing the start and
|
|
8
|
+
end positions of a quoted string.
|
|
9
|
+
|
|
10
|
+
Returns:
|
|
11
|
+
bool: True if the position is within any quoted string, False otherwise.
|
|
12
|
+
"""
|
|
13
|
+
return any(start < pos < end for start, end in quote_positions)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def clear_sql(sql: str) -> str:
|
|
17
|
+
'''Remove comments (--, /**/, and oracle-stype #) and trailing ';' from sql
|
|
18
|
+
Note: written mostly by LLM
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
sql (str): The SQL query to clear.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
str: The cleared SQL query.
|
|
25
|
+
'''
|
|
26
|
+
if sql is None:
|
|
27
|
+
raise ValueError('sql query is None')
|
|
28
|
+
|
|
29
|
+
# positions of (', ", `)
|
|
30
|
+
quote_positions = []
|
|
31
|
+
for quote_char in ["'", '"', '`']:
|
|
32
|
+
i = 0
|
|
33
|
+
while i < len(sql):
|
|
34
|
+
if sql[i] == quote_char and (i == 0 or sql[i - 1] != '\\'):
|
|
35
|
+
start = i
|
|
36
|
+
i += 1
|
|
37
|
+
while i < len(sql) and (sql[i] != quote_char or sql[i - 1] == '\\'):
|
|
38
|
+
i += 1
|
|
39
|
+
if i < len(sql):
|
|
40
|
+
quote_positions.append((start, i))
|
|
41
|
+
i += 1
|
|
42
|
+
|
|
43
|
+
# del /* */ comments
|
|
44
|
+
result = []
|
|
45
|
+
i = 0
|
|
46
|
+
while i < len(sql):
|
|
47
|
+
if i + 1 < len(sql) and sql[i:i + 2] == '/*' and not _is_in_quotes(i, quote_positions):
|
|
48
|
+
# skip until */
|
|
49
|
+
i += 2
|
|
50
|
+
while i + 1 < len(sql) and sql[i:i + 2] != '*/':
|
|
51
|
+
i += 1
|
|
52
|
+
if i + 1 < len(sql):
|
|
53
|
+
i += 2 # skip */
|
|
54
|
+
else:
|
|
55
|
+
i += 1
|
|
56
|
+
else:
|
|
57
|
+
result.append(sql[i])
|
|
58
|
+
i += 1
|
|
59
|
+
|
|
60
|
+
sql = ''.join(result)
|
|
61
|
+
|
|
62
|
+
# del -- and # comments
|
|
63
|
+
result = []
|
|
64
|
+
i = 0
|
|
65
|
+
while i < len(sql):
|
|
66
|
+
if i + 1 < len(sql) and sql[i:i + 2] == '--' and not _is_in_quotes(i, quote_positions):
|
|
67
|
+
while i < len(sql) and sql[i] != '\n':
|
|
68
|
+
i += 1
|
|
69
|
+
elif sql[i] == '#' and not _is_in_quotes(i, quote_positions):
|
|
70
|
+
while i < len(sql) and sql[i] != '\n':
|
|
71
|
+
i += 1
|
|
72
|
+
else:
|
|
73
|
+
result.append(sql[i])
|
|
74
|
+
i += 1
|
|
75
|
+
|
|
76
|
+
sql = ''.join(result)
|
|
77
|
+
|
|
78
|
+
# del ; at the end
|
|
79
|
+
sql = sql.rstrip()
|
|
80
|
+
if sql and sql[-1] == ';':
|
|
81
|
+
sql = sql[:-1].rstrip()
|
|
82
|
+
|
|
83
|
+
return sql.strip(' \n\t')
|
mindsdb/utilities/starters.py
CHANGED
|
@@ -45,3 +45,16 @@ def start_litellm(*args, **kwargs):
|
|
|
45
45
|
from mindsdb.api.litellm.start import start
|
|
46
46
|
|
|
47
47
|
start(*args, **kwargs)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def start_a2a(*args, **kwargs):
|
|
51
|
+
"""Start the A2A server as a subprocess of the main MindsDB process"""
|
|
52
|
+
from mindsdb.api.a2a.run_a2a import main
|
|
53
|
+
|
|
54
|
+
# Extract configuration from the global config
|
|
55
|
+
from mindsdb.utilities.config import Config
|
|
56
|
+
config = Config()
|
|
57
|
+
a2a_config = config.get('a2a', {})
|
|
58
|
+
|
|
59
|
+
# Pass configuration to the A2A main function
|
|
60
|
+
main(a2a_config, *args, **kwargs)
|