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
|
@@ -7,45 +7,45 @@ from mindsdb.utilities.render.sqlalchemy_render import SqlalchemyRender
|
|
|
7
7
|
from mindsdb.integrations.libs.response import (
|
|
8
8
|
HandlerStatusResponse as StatusResponse,
|
|
9
9
|
HandlerResponse as Response,
|
|
10
|
-
RESPONSE_TYPE
|
|
10
|
+
RESPONSE_TYPE,
|
|
11
11
|
)
|
|
12
12
|
|
|
13
13
|
import pandas as pd
|
|
14
14
|
import pymonetdb as mdb
|
|
15
|
-
from .utils.monet_get_id import
|
|
16
|
-
from sqlalchemy_monetdb.dialect import MonetDialect
|
|
15
|
+
from .utils.monet_get_id import schema_id, table_id
|
|
16
|
+
from sqlalchemy_monetdb.dialect import MonetDialect
|
|
17
17
|
|
|
18
18
|
logger = log.getLogger(__name__)
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class MonetDBHandler(DatabaseHandler):
|
|
22
|
-
name=
|
|
22
|
+
name = "monetdb"
|
|
23
23
|
|
|
24
24
|
def __init__(self, name: str, connection_data: Optional[dict], **kwargs):
|
|
25
|
-
"""
|
|
25
|
+
"""Initialize the handler
|
|
26
26
|
Args:
|
|
27
27
|
name (str): name of particular handler instance
|
|
28
28
|
connection_data (dict): parameters for connecting to the database
|
|
29
29
|
**kwargs: arbitrary keyword arguments.
|
|
30
30
|
"""
|
|
31
31
|
super().__init__(name)
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
self.kwargs = kwargs
|
|
34
34
|
self.parser = parse_sql
|
|
35
|
-
self.database = connection_data[
|
|
36
|
-
self.user = connection_data[
|
|
37
|
-
self.password = connection_data[
|
|
38
|
-
self.schemaName =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
self.database = connection_data["database"]
|
|
36
|
+
self.user = connection_data["user"]
|
|
37
|
+
self.password = connection_data["password"]
|
|
38
|
+
self.schemaName = (
|
|
39
|
+
connection_data["schema_name"] if "schema_name" in connection_data else None
|
|
40
|
+
)
|
|
41
|
+
self.host = connection_data["host"]
|
|
42
|
+
self.port = connection_data["port"]
|
|
42
43
|
|
|
43
44
|
self.connection = None
|
|
44
45
|
self.is_connected = False
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
def connect(self):
|
|
48
|
-
"""
|
|
48
|
+
"""Set up any connections required by the handler
|
|
49
49
|
Should return output of check_connection() method after attempting
|
|
50
50
|
connection. Should switch self.is_connected.
|
|
51
51
|
Returns:
|
|
@@ -56,39 +56,35 @@ class MonetDBHandler(DatabaseHandler):
|
|
|
56
56
|
|
|
57
57
|
try:
|
|
58
58
|
self.connection = mdb.connect(
|
|
59
|
-
database=self.database,
|
|
60
|
-
hostname=self.host,
|
|
61
|
-
port=self.port,
|
|
59
|
+
database=self.database,
|
|
60
|
+
hostname=self.host,
|
|
61
|
+
port=self.port,
|
|
62
62
|
username=self.user,
|
|
63
63
|
password=self.password,
|
|
64
64
|
)
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
self.is_connected= True
|
|
66
|
+
self.is_connected = True
|
|
68
67
|
except Exception as e:
|
|
69
68
|
logger.error(f"Error while connecting to {self.database}, {e}")
|
|
70
69
|
|
|
71
|
-
|
|
72
70
|
return self.connection
|
|
73
71
|
|
|
74
|
-
|
|
75
72
|
def disconnect(self):
|
|
76
|
-
"""
|
|
73
|
+
"""Close any existing connections
|
|
77
74
|
Should switch self.is_connected.
|
|
78
75
|
"""
|
|
79
76
|
if self.is_connected is False:
|
|
80
77
|
return
|
|
81
78
|
try:
|
|
82
79
|
self.connection.close()
|
|
83
|
-
self.is_connected=False
|
|
80
|
+
self.is_connected = False
|
|
84
81
|
except Exception as e:
|
|
85
82
|
logger.error(f"Error while disconnecting to {self.database}, {e}")
|
|
86
83
|
|
|
87
|
-
return
|
|
88
|
-
|
|
84
|
+
return
|
|
89
85
|
|
|
90
86
|
def check_connection(self) -> StatusResponse:
|
|
91
|
-
"""
|
|
87
|
+
"""Check connection to the handler
|
|
92
88
|
Returns:
|
|
93
89
|
HandlerStatusResponse
|
|
94
90
|
"""
|
|
@@ -99,7 +95,7 @@ class MonetDBHandler(DatabaseHandler):
|
|
|
99
95
|
self.connect()
|
|
100
96
|
responseCode.success = True
|
|
101
97
|
except Exception as e:
|
|
102
|
-
logger.error(f
|
|
98
|
+
logger.error(f"Error connecting to database {self.database}, {e}!")
|
|
103
99
|
responseCode.error_message = str(e)
|
|
104
100
|
finally:
|
|
105
101
|
if responseCode.success is True and need_to_close:
|
|
@@ -109,7 +105,6 @@ class MonetDBHandler(DatabaseHandler):
|
|
|
109
105
|
|
|
110
106
|
return responseCode
|
|
111
107
|
|
|
112
|
-
|
|
113
108
|
def native_query(self, query: str) -> StatusResponse:
|
|
114
109
|
"""Receive raw query and act upon it somehow.
|
|
115
110
|
Args:
|
|
@@ -120,38 +115,33 @@ class MonetDBHandler(DatabaseHandler):
|
|
|
120
115
|
"""
|
|
121
116
|
need_to_close = self.is_connected is False
|
|
122
117
|
conn = self.connect()
|
|
123
|
-
cur=conn.cursor()
|
|
118
|
+
cur = conn.cursor()
|
|
124
119
|
try:
|
|
125
120
|
cur.execute(query)
|
|
126
|
-
|
|
127
|
-
if len(cur._rows)>0
|
|
128
|
-
result = cur.fetchall()
|
|
121
|
+
|
|
122
|
+
if len(cur._rows) > 0:
|
|
123
|
+
result = cur.fetchall()
|
|
129
124
|
response = Response(
|
|
130
125
|
RESPONSE_TYPE.TABLE,
|
|
131
126
|
data_frame=pd.DataFrame(
|
|
132
|
-
result,
|
|
133
|
-
|
|
134
|
-
)
|
|
127
|
+
result, columns=[x[0] for x in cur.description]
|
|
128
|
+
),
|
|
135
129
|
)
|
|
136
130
|
else:
|
|
137
131
|
response = Response(RESPONSE_TYPE.OK)
|
|
138
132
|
self.connection.commit()
|
|
139
133
|
except Exception as e:
|
|
140
|
-
logger.error(f
|
|
141
|
-
response = Response(
|
|
142
|
-
RESPONSE_TYPE.ERROR,
|
|
143
|
-
error_message=str(e)
|
|
144
|
-
)
|
|
134
|
+
logger.error(f"Error running query: {query} on {self.database}!")
|
|
135
|
+
response = Response(RESPONSE_TYPE.ERROR, error_message=str(e))
|
|
145
136
|
self.connection.rollback()
|
|
146
137
|
|
|
147
|
-
cur.close()
|
|
138
|
+
cur.close()
|
|
148
139
|
|
|
149
140
|
if need_to_close is True:
|
|
150
141
|
self.disconnect()
|
|
151
142
|
|
|
152
143
|
return response
|
|
153
144
|
|
|
154
|
-
|
|
155
145
|
def query(self, query: ASTNode) -> StatusResponse:
|
|
156
146
|
"""Receive query as AST (abstract syntax tree) and act upon it somehow.
|
|
157
147
|
Args:
|
|
@@ -159,25 +149,20 @@ class MonetDBHandler(DatabaseHandler):
|
|
|
159
149
|
of query: SELECT, INTSERT, DELETE, etc
|
|
160
150
|
Returns: HandlerResponse
|
|
161
151
|
"""
|
|
162
|
-
|
|
163
|
-
|
|
164
152
|
|
|
165
153
|
renderer = SqlalchemyRender(MonetDialect)
|
|
166
154
|
query_str = renderer.get_string(query, with_failback=True)
|
|
167
155
|
return self.native_query(query_str)
|
|
168
156
|
|
|
169
|
-
|
|
170
157
|
def get_tables(self) -> StatusResponse:
|
|
171
|
-
"""
|
|
158
|
+
"""Return list of entities
|
|
172
159
|
Return list of entities that will be accesible as tables.
|
|
173
160
|
Returns: HandlerResponse: shoud have same columns as information_schema.tables
|
|
174
161
|
(https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html)
|
|
175
162
|
Column 'TABLE_NAME' is mandatory, other is optional.
|
|
176
163
|
"""
|
|
177
164
|
self.connect()
|
|
178
|
-
schema = schema_id(connection=self.connection,schema_name=self.schemaName)
|
|
179
|
-
|
|
180
|
-
|
|
165
|
+
schema = schema_id(connection=self.connection, schema_name=self.schemaName)
|
|
181
166
|
|
|
182
167
|
q = f"""
|
|
183
168
|
SELECT name as TABLE_NAME
|
|
@@ -186,13 +171,11 @@ class MonetDBHandler(DatabaseHandler):
|
|
|
186
171
|
AND type = 0
|
|
187
172
|
AND schema_id = {schema}
|
|
188
173
|
"""
|
|
189
|
-
|
|
190
174
|
|
|
191
175
|
return self.query(q)
|
|
192
176
|
|
|
193
|
-
|
|
194
177
|
def get_columns(self, table_name: str) -> StatusResponse:
|
|
195
|
-
"""
|
|
178
|
+
"""Returns a list of entity columns
|
|
196
179
|
Args:
|
|
197
180
|
table_name (str): name of one of tables returned by self.get_tables()
|
|
198
181
|
Returns:
|
|
@@ -203,14 +186,14 @@ class MonetDBHandler(DatabaseHandler):
|
|
|
203
186
|
python data types (by default it str).
|
|
204
187
|
"""
|
|
205
188
|
self.connect()
|
|
206
|
-
table=table_id(
|
|
189
|
+
table = table_id(
|
|
207
190
|
connection=self.connection,
|
|
208
191
|
table_name=table_name,
|
|
209
|
-
schema_name=self.schemaName
|
|
192
|
+
schema_name=self.schemaName,
|
|
210
193
|
)
|
|
211
194
|
|
|
212
195
|
q = f"""
|
|
213
|
-
SELECT
|
|
196
|
+
SELECT
|
|
214
197
|
name as COLUMN_NAME,
|
|
215
198
|
type as DATA_TYPE
|
|
216
199
|
FROM sys.columns
|
|
@@ -14,28 +14,27 @@ class MonetDBHandlerTest(unittest.TestCase):
|
|
|
14
14
|
"password": "monetdb",
|
|
15
15
|
"database": "demo",
|
|
16
16
|
}
|
|
17
|
-
|
|
18
17
|
}
|
|
19
|
-
cls.handler = MonetDBHandler(
|
|
18
|
+
cls.handler = MonetDBHandler("test_monet_handler", cls.kwargs)
|
|
20
19
|
|
|
21
20
|
def test_0_connect(self):
|
|
22
21
|
self.handler.connect()
|
|
23
22
|
|
|
24
23
|
def test_1_drop_table(self):
|
|
25
24
|
res = self.handler.query("DROP TABLE IF EXISTS PREM;")
|
|
26
|
-
assert res.type is
|
|
25
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
27
26
|
|
|
28
27
|
def test_2_create_table(self):
|
|
29
28
|
res = self.handler.query("CREATE TABLE IF NOT EXISTS PREM (Premi varchar(50));")
|
|
30
|
-
assert res.type is not
|
|
29
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
31
30
|
|
|
32
31
|
def test_3_insert_table(self):
|
|
33
32
|
res = self.handler.query("INSERT INTO PREM VALUES('Radha <3 Krishna');")
|
|
34
|
-
assert res.type is not
|
|
33
|
+
assert res.type is not RESPONSE_TYPE.ERROR
|
|
35
34
|
|
|
36
35
|
def test_4_get_tables(self):
|
|
37
36
|
tables = self.handler.get_tables()
|
|
38
|
-
assert tables.type is not
|
|
37
|
+
assert tables.type is not RESPONSE_TYPE.ERROR
|
|
39
38
|
|
|
40
39
|
def test_5_select_query(self):
|
|
41
40
|
query = "SELECT * FROM PREM;"
|
|
@@ -46,5 +45,5 @@ class MonetDBHandlerTest(unittest.TestCase):
|
|
|
46
45
|
self.handler.check_connection()
|
|
47
46
|
|
|
48
47
|
|
|
49
|
-
if __name__ ==
|
|
50
|
-
unittest.main()
|
|
48
|
+
if __name__ == "__main__":
|
|
49
|
+
unittest.main()
|
|
@@ -1,34 +1,35 @@
|
|
|
1
|
-
from sqlalchemy import
|
|
1
|
+
from sqlalchemy import exc
|
|
2
|
+
|
|
2
3
|
|
|
3
4
|
def schema_id(connection, schema_name=None):
|
|
4
5
|
"""Fetch the id for schema"""
|
|
5
|
-
cur=connection.cursor()
|
|
6
|
+
cur = connection.cursor()
|
|
6
7
|
if schema_name is None:
|
|
7
8
|
cur.execute("SELECT current_schema")
|
|
8
|
-
schema_name=cur.fetchall()[0][0]
|
|
9
|
+
schema_name = cur.fetchall()[0][0]
|
|
9
10
|
|
|
10
11
|
query = f"""
|
|
11
12
|
SELECT id
|
|
12
13
|
FROM sys.schemas
|
|
13
14
|
WHERE name = '{schema_name}'
|
|
14
15
|
"""
|
|
15
|
-
|
|
16
|
+
|
|
16
17
|
cur.execute(query)
|
|
17
18
|
|
|
18
19
|
try:
|
|
19
20
|
schema_id = cur.fetchall()[0][0]
|
|
20
|
-
except:
|
|
21
|
+
except Exception:
|
|
21
22
|
raise exc.InvalidRequestError(schema_name)
|
|
22
|
-
|
|
23
|
+
|
|
23
24
|
return schema_id
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
|
|
26
27
|
def table_id(connection, table_name, schema_name=None):
|
|
27
28
|
"""Fetch the id for schema.table_name, defaulting to current schema if
|
|
28
|
-
|
|
29
|
+
schema is None
|
|
29
30
|
"""
|
|
30
31
|
|
|
31
|
-
schema_idm = schema_id(connection=connection,schema_name=schema_name)
|
|
32
|
+
schema_idm = schema_id(connection=connection, schema_name=schema_name)
|
|
32
33
|
|
|
33
34
|
q = f"""
|
|
34
35
|
SELECT id
|
|
@@ -36,15 +37,13 @@ def table_id(connection, table_name, schema_name=None):
|
|
|
36
37
|
WHERE name = '{table_name}'
|
|
37
38
|
AND schema_id = {schema_idm}
|
|
38
39
|
"""
|
|
39
|
-
|
|
40
|
+
|
|
40
41
|
cur = connection.cursor()
|
|
41
42
|
cur.execute(q)
|
|
42
43
|
|
|
43
44
|
try:
|
|
44
|
-
table_id = cur.fetchall()[0][0]
|
|
45
|
-
except:
|
|
45
|
+
table_id = cur.fetchall()[0][0]
|
|
46
|
+
except Exception:
|
|
46
47
|
raise exc.NoSuchTableError(table_name)
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
49
|
return table_id
|
|
@@ -2,10 +2,7 @@ from typing import Optional, Dict
|
|
|
2
2
|
import pandas as pd
|
|
3
3
|
import requests
|
|
4
4
|
|
|
5
|
-
from monkeylearn import MonkeyLearn
|
|
6
|
-
|
|
7
5
|
from mindsdb.integrations.libs.base import BaseMLEngine
|
|
8
|
-
|
|
9
6
|
from mindsdb.integrations.utilities.handler_utils import get_api_key
|
|
10
7
|
|
|
11
8
|
|
|
@@ -13,7 +10,7 @@ class monkeylearnHandler(BaseMLEngine):
|
|
|
13
10
|
name = "monkeylearn"
|
|
14
11
|
|
|
15
12
|
@staticmethod
|
|
16
|
-
def create_validations(self,args=None
|
|
13
|
+
def create_validations(self, args=None, **kwargs):
|
|
17
14
|
|
|
18
15
|
if "using" in args:
|
|
19
16
|
args = args["using"]
|
|
@@ -78,4 +75,4 @@ class monkeylearnHandler(BaseMLEngine):
|
|
|
78
75
|
# pre-trained monkeylearn models guide about what industries they can be used
|
|
79
76
|
description['industries'] = response.body['industries']
|
|
80
77
|
des_df = pd.DataFrame([description])
|
|
81
|
-
return des_df
|
|
78
|
+
return des_df
|
|
@@ -14,6 +14,7 @@ class MSGraphAPIOneDriveClient(MSGraphAPIBaseClient):
|
|
|
14
14
|
This client is used for accessing the Microsoft OneDrive specific endpoints of the Microsoft Graph API.
|
|
15
15
|
Several common methods for submitting requests, fetching data, etc. are inherited from the base class.
|
|
16
16
|
"""
|
|
17
|
+
|
|
17
18
|
def __init__(self, access_token: Text) -> None:
|
|
18
19
|
super().__init__(access_token)
|
|
19
20
|
|
|
@@ -9,7 +9,7 @@ from requests.exceptions import RequestException
|
|
|
9
9
|
|
|
10
10
|
from mindsdb.integrations.handlers.ms_one_drive_handler.ms_graph_api_one_drive_client import MSGraphAPIOneDriveClient
|
|
11
11
|
from mindsdb.integrations.handlers.ms_one_drive_handler.ms_one_drive_tables import FileTable, ListFilesTable
|
|
12
|
-
from mindsdb.integrations.utilities.handlers.auth_utilities import MSGraphAPIDelegatedPermissionsManager
|
|
12
|
+
from mindsdb.integrations.utilities.handlers.auth_utilities.microsoft import MSGraphAPIDelegatedPermissionsManager
|
|
13
13
|
from mindsdb.integrations.utilities.handlers.auth_utilities.exceptions import AuthException
|
|
14
14
|
from mindsdb.integrations.libs.response import (
|
|
15
15
|
HandlerResponse as Response,
|
|
@@ -28,7 +28,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
28
28
|
except RequestException as request_error:
|
|
29
29
|
logger.error(f"Failed to check connection to Microsoft Teams: {request_error}")
|
|
30
30
|
return False
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
def get_teams(self) -> List[Dict]:
|
|
33
33
|
"""
|
|
34
34
|
Get teams from Microsoft Teams.
|
|
@@ -37,7 +37,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
37
37
|
List[Dict]: The teams data.
|
|
38
38
|
"""
|
|
39
39
|
return self._get_all_groups()
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
def get_channels(self, group_id: Text = None, channel_ids: List[Text] = None) -> List[Dict]:
|
|
42
42
|
"""
|
|
43
43
|
Get channels from Microsoft Teams.
|
|
@@ -57,7 +57,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
57
57
|
return self._get_channels_across_all_groups_by_ids(channel_ids)
|
|
58
58
|
else:
|
|
59
59
|
return self._get_all_channels_across_all_groups()
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
def get_channel_messages(self, group_id: Text, channel_id: Text, message_ids: List[Text] = None) -> List[Dict]:
|
|
62
62
|
"""
|
|
63
63
|
Get channel messages from Microsoft Teams.
|
|
@@ -74,7 +74,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
74
74
|
return self._get_messages_in_channel_by_ids(group_id, channel_id, message_ids)
|
|
75
75
|
else:
|
|
76
76
|
return self._get_all_messages_in_channel(group_id, channel_id)
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
def get_chats(self, chat_ids: List[Text] = None) -> List[Dict]:
|
|
79
79
|
"""
|
|
80
80
|
Get chats from Microsoft Teams.
|
|
@@ -89,7 +89,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
89
89
|
return self._get_chats_by_ids(chat_ids)
|
|
90
90
|
else:
|
|
91
91
|
return self._get_all_chats()
|
|
92
|
-
|
|
92
|
+
|
|
93
93
|
def get_chat_messages(self, chat_id: Text, message_ids: List[Text] = None) -> List[Dict]:
|
|
94
94
|
"""
|
|
95
95
|
Get chat messages from Microsoft Teams.
|
|
@@ -118,7 +118,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
118
118
|
self._group_ids = [group["id"] for group in groups]
|
|
119
119
|
|
|
120
120
|
return self._group_ids
|
|
121
|
-
|
|
121
|
+
|
|
122
122
|
@abstractmethod
|
|
123
123
|
def _get_all_groups(self) -> List[Dict]:
|
|
124
124
|
"""
|
|
@@ -198,7 +198,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
198
198
|
channel.update({"teamId": group_id})
|
|
199
199
|
|
|
200
200
|
return channel
|
|
201
|
-
|
|
201
|
+
|
|
202
202
|
def _get_channels_in_group_by_ids(self, group_id: Text, channel_ids: List[Text]) -> List[Dict]:
|
|
203
203
|
"""
|
|
204
204
|
Get channels by their IDs and the ID of the group that they belong to.
|
|
@@ -215,7 +215,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
215
215
|
channels.append(self._get_channel_in_group_by_id(group_id, channel_id))
|
|
216
216
|
|
|
217
217
|
return channels
|
|
218
|
-
|
|
218
|
+
|
|
219
219
|
def _get_all_channels_in_group(self, group_id: Text) -> List[Dict]:
|
|
220
220
|
"""
|
|
221
221
|
Get all channels of a group by its ID.
|
|
@@ -231,7 +231,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
231
231
|
channel["teamId"] = group_id
|
|
232
232
|
|
|
233
233
|
return channels
|
|
234
|
-
|
|
234
|
+
|
|
235
235
|
def _get_all_channels_across_all_groups(self) -> List[Dict]:
|
|
236
236
|
"""
|
|
237
237
|
Get all channels across all groups related to Microsoft Teams.
|
|
@@ -244,7 +244,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
244
244
|
channels += self._get_all_channels_in_group(group_id)
|
|
245
245
|
|
|
246
246
|
return channels
|
|
247
|
-
|
|
247
|
+
|
|
248
248
|
def _get_channels_across_all_groups_by_ids(self, channel_ids: List[Text]) -> List[Dict]:
|
|
249
249
|
"""
|
|
250
250
|
Get channels by their IDs.
|
|
@@ -258,7 +258,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
258
258
|
channels = self._get_all_channels_across_all_groups()
|
|
259
259
|
|
|
260
260
|
return [channel for channel in channels if channel["id"] in channel_ids]
|
|
261
|
-
|
|
261
|
+
|
|
262
262
|
def _get_message_in_channel_by_id(self, group_id: Text, channel_id: Text, message_id: Text) -> Dict:
|
|
263
263
|
"""
|
|
264
264
|
Get a message by its ID, the ID of the group that it belongs to, and the ID of the channel that it belongs to.
|
|
@@ -272,7 +272,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
272
272
|
Dict: The message data.
|
|
273
273
|
"""
|
|
274
274
|
return self.fetch_data_json(f"teams/{group_id}/channels/{channel_id}/messages/{message_id}")
|
|
275
|
-
|
|
275
|
+
|
|
276
276
|
def _get_messages_in_channel_by_ids(self, group_id: Text, channel_id: Text, message_ids: List[Text]) -> List[Dict]:
|
|
277
277
|
"""
|
|
278
278
|
Get messages by their IDs, the ID of the group that they belong to, and the ID of the channel that they belong to.
|
|
@@ -310,7 +310,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
310
310
|
break
|
|
311
311
|
|
|
312
312
|
return messages[:limit]
|
|
313
|
-
|
|
313
|
+
|
|
314
314
|
def _get_chats_by_ids(self, chat_ids: List[Text]) -> List[Dict]:
|
|
315
315
|
"""
|
|
316
316
|
Get chats by their IDs.
|
|
@@ -326,7 +326,7 @@ class MSGraphAPITeamsClient(MSGraphAPIBaseClient, ABC):
|
|
|
326
326
|
chats.append(self._get_chat_by_id(chat_id))
|
|
327
327
|
|
|
328
328
|
return chats
|
|
329
|
-
|
|
329
|
+
|
|
330
330
|
def _get_messages_in_chat_by_ids(self, chat_id: Text, message_ids: List[Text]) -> List[Dict]:
|
|
331
331
|
"""
|
|
332
332
|
Get messages by their IDs and the ID of the chat that they belong to.
|
|
@@ -351,7 +351,7 @@ class MSGraphAPITeamsApplicationPermissionsClient(MSGraphAPITeamsClient):
|
|
|
351
351
|
This client is used for accessing the Microsoft Teams specific endpoints of the Microsoft Graph API.
|
|
352
352
|
Several common methods for submitting requests, fetching data, etc. are inherited from the base class.
|
|
353
353
|
"""
|
|
354
|
-
|
|
354
|
+
|
|
355
355
|
def _get_all_groups(self) -> List[Dict]:
|
|
356
356
|
"""
|
|
357
357
|
Get all groups related to Microsoft Teams.
|
|
@@ -363,7 +363,7 @@ class MSGraphAPITeamsApplicationPermissionsClient(MSGraphAPITeamsClient):
|
|
|
363
363
|
"/groups",
|
|
364
364
|
params={"$filter": "resourceProvisioningOptions/Any(x:x eq 'Team')"}
|
|
365
365
|
)
|
|
366
|
-
|
|
366
|
+
|
|
367
367
|
def _get_chat_by_id(self, chat_id: Text) -> Dict:
|
|
368
368
|
"""
|
|
369
369
|
Get a chat by its ID.
|
|
@@ -375,7 +375,7 @@ class MSGraphAPITeamsApplicationPermissionsClient(MSGraphAPITeamsClient):
|
|
|
375
375
|
Dict: The chat data.
|
|
376
376
|
"""
|
|
377
377
|
return self.fetch_data_json(f"chats/{chat_id}")
|
|
378
|
-
|
|
378
|
+
|
|
379
379
|
def _get_all_chats(self, limit: int = None) -> List[Dict]:
|
|
380
380
|
"""
|
|
381
381
|
Get all chats related to Microsoft Teams.
|
|
@@ -400,7 +400,7 @@ class MSGraphAPITeamsApplicationPermissionsClient(MSGraphAPITeamsClient):
|
|
|
400
400
|
Dict: The message data.
|
|
401
401
|
"""
|
|
402
402
|
return self.fetch_data_json(f"chats/{chat_id}/messages/{message_id}")
|
|
403
|
-
|
|
403
|
+
|
|
404
404
|
def _get_all_messages_in_chat(self, chat_id: Text, limit: int = None) -> List[Dict]:
|
|
405
405
|
"""
|
|
406
406
|
Get messages of a chat by its ID.
|
|
@@ -421,13 +421,13 @@ class MSGraphAPITeamsApplicationPermissionsClient(MSGraphAPITeamsClient):
|
|
|
421
421
|
return messages[:limit]
|
|
422
422
|
|
|
423
423
|
|
|
424
|
-
class MSGraphAPITeamsDelegatedPermissionsClient(MSGraphAPITeamsClient):
|
|
424
|
+
class MSGraphAPITeamsDelegatedPermissionsClient(MSGraphAPITeamsClient):
|
|
425
425
|
"""
|
|
426
426
|
The Microsoft Graph API client for the Microsoft Teams handler with delegated permissions.
|
|
427
427
|
This client is used for accessing the Microsoft Teams specific endpoints of the Microsoft Graph API.
|
|
428
428
|
Several common methods for submitting requests, fetching data, etc. are inherited from the base class.
|
|
429
429
|
"""
|
|
430
|
-
|
|
430
|
+
|
|
431
431
|
def _get_all_groups(self) -> List[Dict]:
|
|
432
432
|
"""
|
|
433
433
|
Get all groups that the signed in user is a member of.
|
|
@@ -436,7 +436,7 @@ class MSGraphAPITeamsDelegatedPermissionsClient(MSGraphAPITeamsClient):
|
|
|
436
436
|
List[Dict]: The groups data.
|
|
437
437
|
"""
|
|
438
438
|
return self.fetch_data_json("me/joinedTeams")
|
|
439
|
-
|
|
439
|
+
|
|
440
440
|
def _get_chat_by_id(self, chat_id: Text) -> Dict:
|
|
441
441
|
"""
|
|
442
442
|
Get a chat by its ID.
|
|
@@ -467,7 +467,7 @@ class MSGraphAPITeamsDelegatedPermissionsClient(MSGraphAPITeamsClient):
|
|
|
467
467
|
break
|
|
468
468
|
|
|
469
469
|
return chats[:limit]
|
|
470
|
-
|
|
470
|
+
|
|
471
471
|
def _get_message_in_chat_by_id(self, chat_id: Text, message_id: Text) -> Dict:
|
|
472
472
|
"""
|
|
473
473
|
Get a message by its ID and the ID of the chat that it belongs to.
|
|
@@ -480,7 +480,7 @@ class MSGraphAPITeamsDelegatedPermissionsClient(MSGraphAPITeamsClient):
|
|
|
480
480
|
Dict: The message data.
|
|
481
481
|
"""
|
|
482
482
|
return self.fetch_data_json(f"me/chats/{chat_id}/messages/{message_id}")
|
|
483
|
-
|
|
483
|
+
|
|
484
484
|
def _get_all_messages_in_chat(self, chat_id: Text, limit: int = None) -> List[Dict]:
|
|
485
485
|
"""
|
|
486
486
|
Get messages of a chat by its ID.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import Dict, Text, Callable, Union
|
|
2
2
|
|
|
3
3
|
from botbuilder.schema import Activity, ActivityTypes
|
|
4
4
|
from botbuilder.schema import ChannelAccount
|
|
@@ -19,7 +19,7 @@ from mindsdb.integrations.libs.response import (
|
|
|
19
19
|
HandlerStatusResponse as StatusResponse,
|
|
20
20
|
)
|
|
21
21
|
from mindsdb.integrations.libs.api_handler import APIChatHandler
|
|
22
|
-
from mindsdb.integrations.utilities.handlers.auth_utilities import (
|
|
22
|
+
from mindsdb.integrations.utilities.handlers.auth_utilities.microsoft import (
|
|
23
23
|
MSGraphAPIApplicationPermissionsManager,
|
|
24
24
|
MSGraphAPIDelegatedPermissionsManager
|
|
25
25
|
)
|
|
@@ -233,7 +233,7 @@ class MSTeamsHandler(APIChatHandler):
|
|
|
233
233
|
callback(
|
|
234
234
|
chat_id=request['conversation']['id'],
|
|
235
235
|
message=chat_bot_message
|
|
236
|
-
)
|
|
236
|
+
)
|
|
237
237
|
|
|
238
238
|
@chatbot_only
|
|
239
239
|
def respond(self, message: ChatBotMessage) -> None:
|