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
|
@@ -1,75 +1,150 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
|
|
3
|
+
from atlassian import Jira
|
|
4
|
+
from requests.exceptions import HTTPError
|
|
5
|
+
|
|
6
|
+
from mindsdb.integrations.handlers.jira_handler.jira_tables import JiraProjectsTable, JiraIssuesTable, JiraUsersTable, JiraGroupsTable
|
|
1
7
|
from mindsdb.integrations.libs.api_handler import APIHandler
|
|
2
8
|
from mindsdb.integrations.libs.response import (
|
|
9
|
+
HandlerResponse as Response,
|
|
3
10
|
HandlerStatusResponse as StatusResponse,
|
|
11
|
+
RESPONSE_TYPE,
|
|
4
12
|
)
|
|
5
13
|
from mindsdb.utilities import log
|
|
6
|
-
from mindsdb.integrations.libs.api_handler_generator import APIResourceGenerator
|
|
7
14
|
|
|
8
15
|
|
|
9
16
|
logger = log.getLogger(__name__)
|
|
10
17
|
|
|
11
18
|
|
|
12
19
|
class JiraHandler(APIHandler):
|
|
20
|
+
"""
|
|
21
|
+
This handler handles the connection and execution of SQL statements on Jira.
|
|
22
|
+
"""
|
|
13
23
|
|
|
14
|
-
def __init__(self, name
|
|
24
|
+
def __init__(self, name: str, connection_data: Dict, **kwargs: Any) -> None:
|
|
15
25
|
"""
|
|
16
|
-
|
|
26
|
+
Initializes the handler.
|
|
27
|
+
|
|
17
28
|
Args:
|
|
18
|
-
name (
|
|
19
|
-
connection_data (
|
|
20
|
-
|
|
29
|
+
name (Text): The name of the handler instance.
|
|
30
|
+
connection_data (Dict): The connection data required to connect to the Jira API.
|
|
31
|
+
kwargs: Arbitrary keyword arguments.
|
|
21
32
|
"""
|
|
22
33
|
super().__init__(name)
|
|
23
|
-
self.connection_data =
|
|
34
|
+
self.connection_data = connection_data
|
|
35
|
+
self.kwargs = kwargs
|
|
24
36
|
|
|
25
37
|
self.connection = None
|
|
26
38
|
self.is_connected = False
|
|
27
39
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
self.
|
|
31
|
-
|
|
32
|
-
self.connection_data,
|
|
33
|
-
url_base='/rest/api/3/',
|
|
34
|
-
options={
|
|
35
|
-
'offset_param': ['startAt', 'offset'],
|
|
36
|
-
'total_column': ['totalEntryCount', 'total'],
|
|
37
|
-
'check_connection_table': 'myself'
|
|
38
|
-
}
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
resource_tables = self.api_resource_generator.generate_api_resources(self)
|
|
40
|
+
self._register_table("projects", JiraProjectsTable(self))
|
|
41
|
+
self._register_table("issues", JiraIssuesTable(self))
|
|
42
|
+
self._register_table("groups", JiraGroupsTable(self))
|
|
43
|
+
self._register_table("users", JiraUsersTable(self))
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
def connect(self) -> Jira:
|
|
46
|
+
"""
|
|
47
|
+
Establishes a connection to the Jira API.
|
|
45
48
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
Raises:
|
|
50
|
+
ValueError: If the required connection parameters are not provided.
|
|
51
|
+
AuthenticationError: If an authentication error occurs while connecting to the Salesforce API.
|
|
49
52
|
|
|
50
|
-
def connect(self):
|
|
51
|
-
"""
|
|
52
|
-
Set up the connection required by the handler.
|
|
53
53
|
Returns:
|
|
54
|
-
|
|
54
|
+
atlassian.jira.Jira: A connection object to the Jira API.
|
|
55
55
|
"""
|
|
56
|
-
|
|
56
|
+
if self.is_connected is True:
|
|
57
|
+
return self.connection
|
|
58
|
+
|
|
59
|
+
is_cloud = self.connection_data.get("cloud", True)
|
|
60
|
+
|
|
61
|
+
if is_cloud:
|
|
62
|
+
# Jira Cloud supports API token authentication.
|
|
63
|
+
if not all(key in self.connection_data for key in ['username', 'api_token', 'url']):
|
|
64
|
+
raise ValueError("Required parameters (username, api_token, url) must be provided.")
|
|
65
|
+
|
|
66
|
+
config = {
|
|
67
|
+
"username": self.connection_data['username'],
|
|
68
|
+
"password": self.connection_data['api_token'],
|
|
69
|
+
"url": self.connection_data['url'],
|
|
70
|
+
}
|
|
71
|
+
else:
|
|
72
|
+
# Jira Server supports personal access token authentication or open access.
|
|
73
|
+
if 'url' not in self.connection_data:
|
|
74
|
+
raise ValueError("Required parameter 'url' must be provided.")
|
|
75
|
+
|
|
76
|
+
config = {
|
|
77
|
+
"url": self.connection_data['url'],
|
|
78
|
+
"cloud": False
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if 'personal_access_token' in self.connection_data:
|
|
82
|
+
config['session'] = ({"Authorization": f"Bearer {self.connection_data['personal_access_token']}"})
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
self.connection = Jira(**config)
|
|
86
|
+
self.is_connected = True
|
|
87
|
+
return self.connection
|
|
88
|
+
except Exception as unknown_error:
|
|
89
|
+
logger.error(f"Unknown error connecting to Jira, {unknown_error}!")
|
|
90
|
+
raise
|
|
57
91
|
|
|
58
92
|
def check_connection(self) -> StatusResponse:
|
|
59
93
|
"""
|
|
60
|
-
|
|
94
|
+
Checks the status of the connection to the Salesforce API.
|
|
95
|
+
|
|
61
96
|
Returns:
|
|
62
|
-
|
|
97
|
+
StatusResponse: An object containing the success status and an error message if an error occurs.
|
|
63
98
|
"""
|
|
64
|
-
|
|
65
99
|
response = StatusResponse(False)
|
|
66
100
|
|
|
67
101
|
try:
|
|
68
|
-
self.
|
|
102
|
+
connection = self.connect()
|
|
103
|
+
connection.myself()
|
|
69
104
|
response.success = True
|
|
70
|
-
except
|
|
71
|
-
logger.error(f
|
|
72
|
-
response.error_message =
|
|
105
|
+
except (HTTPError, ValueError) as known_error:
|
|
106
|
+
logger.error(f'Connection check to Jira failed, {known_error}!')
|
|
107
|
+
response.error_message = str(known_error)
|
|
108
|
+
except Exception as unknown_error:
|
|
109
|
+
logger.error(f'Connection check to Jira failed due to an unknown error, {unknown_error}!')
|
|
110
|
+
response.error_message = str(unknown_error)
|
|
73
111
|
|
|
74
112
|
self.is_connected = response.success
|
|
113
|
+
|
|
114
|
+
return response
|
|
115
|
+
|
|
116
|
+
def native_query(self, query: str) -> Response:
|
|
117
|
+
"""
|
|
118
|
+
Executes a native JQL query on Jira and returns the result.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
query (Text): The JQL query to be executed.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
Response: A response object containing the result of the query or an error message.
|
|
125
|
+
"""
|
|
126
|
+
connection = self.connect()
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
results = connection.jql(query)
|
|
130
|
+
df = JiraIssuesTable(self).normalize(results['issues'])
|
|
131
|
+
response = Response(
|
|
132
|
+
RESPONSE_TYPE.TABLE,
|
|
133
|
+
df
|
|
134
|
+
)
|
|
135
|
+
except HTTPError as http_error:
|
|
136
|
+
logger.error(f'Error running query: {query} on Jira, {http_error}!')
|
|
137
|
+
response = Response(
|
|
138
|
+
RESPONSE_TYPE.ERROR,
|
|
139
|
+
error_code=0,
|
|
140
|
+
error_message=str(http_error)
|
|
141
|
+
)
|
|
142
|
+
except Exception as unknown_error:
|
|
143
|
+
logger.error(f'Error running query: {query} on Jira, {unknown_error}!')
|
|
144
|
+
response = Response(
|
|
145
|
+
RESPONSE_TYPE.ERROR,
|
|
146
|
+
error_code=0,
|
|
147
|
+
error_message=str(unknown_error)
|
|
148
|
+
)
|
|
149
|
+
|
|
75
150
|
return response
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from atlassian import Jira
|
|
4
|
+
import pandas as pd
|
|
5
|
+
|
|
6
|
+
from mindsdb.integrations.libs.api_handler import APIResource
|
|
7
|
+
from mindsdb.integrations.utilities.sql_utils import FilterCondition, SortColumn, FilterOperator
|
|
8
|
+
from mindsdb.utilities import log
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
logger = log.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class JiraProjectsTable(APIResource):
|
|
15
|
+
def list(
|
|
16
|
+
self,
|
|
17
|
+
conditions: List[FilterCondition] = None,
|
|
18
|
+
limit: int = None,
|
|
19
|
+
sort: List[SortColumn] = None,
|
|
20
|
+
targets: List[str] = None,
|
|
21
|
+
**kwargs
|
|
22
|
+
) -> pd.DataFrame:
|
|
23
|
+
client: Jira = self.handler.connect()
|
|
24
|
+
|
|
25
|
+
projects = []
|
|
26
|
+
for condition in conditions:
|
|
27
|
+
if condition.column in ('id', 'key'):
|
|
28
|
+
if condition.op == FilterOperator.EQUAL:
|
|
29
|
+
projects = [client.get_project(condition.value)]
|
|
30
|
+
elif condition.op == FilterOperator.IN:
|
|
31
|
+
projects = [client.get_project(project_id) for project_id in condition.value]
|
|
32
|
+
else:
|
|
33
|
+
raise ValueError(f"Unsupported operator {condition.op} for column {condition.column}.")
|
|
34
|
+
condition.applied = True
|
|
35
|
+
|
|
36
|
+
if not projects:
|
|
37
|
+
projects = client.get_all_projects()
|
|
38
|
+
|
|
39
|
+
if projects:
|
|
40
|
+
projects_df = pd.DataFrame(projects)
|
|
41
|
+
projects_df = projects_df[self.get_columns()]
|
|
42
|
+
else:
|
|
43
|
+
projects_df = pd.DataFrame([], columns=self.get_columns())
|
|
44
|
+
|
|
45
|
+
return projects_df
|
|
46
|
+
|
|
47
|
+
def get_columns(self) -> List[str]:
|
|
48
|
+
return [
|
|
49
|
+
"id",
|
|
50
|
+
"key",
|
|
51
|
+
"name",
|
|
52
|
+
"projectTypeKey",
|
|
53
|
+
"simplified",
|
|
54
|
+
"style",
|
|
55
|
+
"isPrivate",
|
|
56
|
+
"entityId",
|
|
57
|
+
"uuid",
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class JiraIssuesTable(APIResource):
|
|
62
|
+
def list(
|
|
63
|
+
self,
|
|
64
|
+
conditions: List[FilterCondition] = None,
|
|
65
|
+
limit: int = None,
|
|
66
|
+
sort: List[SortColumn] = None,
|
|
67
|
+
targets: List[str] = None,
|
|
68
|
+
**kwargs
|
|
69
|
+
) -> pd.DataFrame:
|
|
70
|
+
client: Jira = self.handler.connect()
|
|
71
|
+
|
|
72
|
+
issues = []
|
|
73
|
+
for condition in conditions:
|
|
74
|
+
if condition.column in ('id', 'key'):
|
|
75
|
+
if condition.op == FilterOperator.EQUAL:
|
|
76
|
+
issues = [client.get_issue(condition.value)]
|
|
77
|
+
elif condition.op == FilterOperator.IN:
|
|
78
|
+
issues = [client.get_issue(issue_id) for issue_id in condition.value]
|
|
79
|
+
else:
|
|
80
|
+
raise ValueError(f"Unsupported operator {condition.op} for column {condition.column}.")
|
|
81
|
+
condition.applied = True
|
|
82
|
+
|
|
83
|
+
elif condition.column in ('project_id', 'project_key', 'project_name'):
|
|
84
|
+
if condition.op == FilterOperator.EQUAL:
|
|
85
|
+
issues = client.get_all_project_issues(condition.value, limit=limit)
|
|
86
|
+
elif condition.op == FilterOperator.IN:
|
|
87
|
+
for project_id in condition.value:
|
|
88
|
+
issues.extend(client.get_all_project_issues(project_id, limit=limit))
|
|
89
|
+
|
|
90
|
+
condition.applied = True
|
|
91
|
+
|
|
92
|
+
if not issues:
|
|
93
|
+
project_ids = [project['id'] for project in client.get_all_projects()]
|
|
94
|
+
for project_id in project_ids:
|
|
95
|
+
issues.extend(self._get_project_issues_with_limit(client, project_id, limit=limit, current_issues=issues))
|
|
96
|
+
|
|
97
|
+
if issues:
|
|
98
|
+
issues_df = self.normalize(issues)
|
|
99
|
+
else:
|
|
100
|
+
issues_df = pd.DataFrame([], columns=self.get_columns())
|
|
101
|
+
|
|
102
|
+
return issues_df
|
|
103
|
+
|
|
104
|
+
def _get_project_issues_with_limit(self, client: Jira, project_id, limit=None, current_issues=None):
|
|
105
|
+
"""
|
|
106
|
+
Helper to get issues from a project, respecting the limit.
|
|
107
|
+
"""
|
|
108
|
+
if current_issues is None:
|
|
109
|
+
current_issues = []
|
|
110
|
+
if limit:
|
|
111
|
+
remaining = limit - len(current_issues)
|
|
112
|
+
if remaining <= 0:
|
|
113
|
+
return []
|
|
114
|
+
return client.get_all_project_issues(project_id, limit=remaining)
|
|
115
|
+
else:
|
|
116
|
+
return client.get_all_project_issues(project_id)
|
|
117
|
+
|
|
118
|
+
def normalize(self, issues: dict) -> pd.DataFrame:
|
|
119
|
+
issues_df = pd.json_normalize(issues)
|
|
120
|
+
issues_df.rename(
|
|
121
|
+
columns={
|
|
122
|
+
"fields.project.id": "project_id",
|
|
123
|
+
"fields.project.key": "project_key",
|
|
124
|
+
"fields.project.name": "project_name",
|
|
125
|
+
"fields.summary": "summary",
|
|
126
|
+
"fields.priority.name": "priority",
|
|
127
|
+
"fields.creator.displayName": "creator",
|
|
128
|
+
"fields.assignee.displayName": "assignee",
|
|
129
|
+
"fields.status.name": "status",
|
|
130
|
+
},
|
|
131
|
+
inplace=True
|
|
132
|
+
)
|
|
133
|
+
issues_df = issues_df[self.get_columns()]
|
|
134
|
+
|
|
135
|
+
return issues_df
|
|
136
|
+
|
|
137
|
+
def get_columns(self) -> List[str]:
|
|
138
|
+
return [
|
|
139
|
+
"id",
|
|
140
|
+
"key",
|
|
141
|
+
"project_id",
|
|
142
|
+
"project_key",
|
|
143
|
+
"project_name",
|
|
144
|
+
"summary",
|
|
145
|
+
"priority",
|
|
146
|
+
"creator",
|
|
147
|
+
"assignee",
|
|
148
|
+
"status",
|
|
149
|
+
]
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class JiraGroupsTable(APIResource):
|
|
153
|
+
def list(
|
|
154
|
+
self,
|
|
155
|
+
conditions: List[FilterCondition] = None,
|
|
156
|
+
limit: int = None,
|
|
157
|
+
sort: List[SortColumn] = None,
|
|
158
|
+
targets: List[str] = None,
|
|
159
|
+
**kwargs
|
|
160
|
+
) -> pd.DataFrame:
|
|
161
|
+
client: Jira = self.handler.connect()
|
|
162
|
+
|
|
163
|
+
if limit:
|
|
164
|
+
groups = client.get_groups(limit=limit)['groups']
|
|
165
|
+
else:
|
|
166
|
+
groups = client.get_groups()['groups']
|
|
167
|
+
|
|
168
|
+
if groups:
|
|
169
|
+
groups_df = pd.DataFrame(groups)
|
|
170
|
+
groups_df = groups_df[self.get_columns()]
|
|
171
|
+
else:
|
|
172
|
+
groups_df = pd.DataFrame([], columns=self.get_columns())
|
|
173
|
+
|
|
174
|
+
return groups_df
|
|
175
|
+
|
|
176
|
+
def get_columns(self) -> List[str]:
|
|
177
|
+
return [
|
|
178
|
+
"groupId",
|
|
179
|
+
"name",
|
|
180
|
+
"html",
|
|
181
|
+
]
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class JiraUsersTable(APIResource):
|
|
185
|
+
def list(
|
|
186
|
+
self,
|
|
187
|
+
conditions: List[FilterCondition] = None,
|
|
188
|
+
limit: int = None,
|
|
189
|
+
sort: List[SortColumn] = None,
|
|
190
|
+
targets: List[str] = None,
|
|
191
|
+
**kwargs
|
|
192
|
+
) -> pd.DataFrame:
|
|
193
|
+
client: Jira = self.handler.connect()
|
|
194
|
+
|
|
195
|
+
users = []
|
|
196
|
+
for condition in conditions:
|
|
197
|
+
if condition.column == 'accountId':
|
|
198
|
+
if condition.op == FilterOperator.EQUAL:
|
|
199
|
+
users = [client.user(account_id=condition.value)]
|
|
200
|
+
elif condition.op == FilterOperator.IN:
|
|
201
|
+
users = [client.user(account_id=accountId) for accountId in condition.value]
|
|
202
|
+
else:
|
|
203
|
+
raise ValueError(f"Unsupported operator {condition.op} for column {condition.column}.")
|
|
204
|
+
condition.applied = True
|
|
205
|
+
|
|
206
|
+
if not users:
|
|
207
|
+
if limit:
|
|
208
|
+
users = client.users_get_all(limit=limit)
|
|
209
|
+
else:
|
|
210
|
+
users = client.users_get_all()
|
|
211
|
+
|
|
212
|
+
if users:
|
|
213
|
+
users_df = pd.DataFrame(users)
|
|
214
|
+
users_df = users_df[self.get_columns()]
|
|
215
|
+
else:
|
|
216
|
+
users_df = pd.DataFrame([], columns=self.get_columns())
|
|
217
|
+
|
|
218
|
+
return users_df
|
|
219
|
+
|
|
220
|
+
def get_columns(self) -> List[str]:
|
|
221
|
+
return [
|
|
222
|
+
"accountId",
|
|
223
|
+
"accountType",
|
|
224
|
+
"emailAddress",
|
|
225
|
+
"displayName",
|
|
226
|
+
"active",
|
|
227
|
+
"timeZone",
|
|
228
|
+
"locale",
|
|
229
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
atlassian-python-api
|
|
@@ -108,7 +108,7 @@ AI: {response}'''
|
|
|
108
108
|
self.model_storage.json_set('args', args)
|
|
109
109
|
|
|
110
110
|
@staticmethod
|
|
111
|
-
def create_validation(_, args: Dict=None, **kwargs):
|
|
111
|
+
def create_validation(_, args: Dict = None, **kwargs):
|
|
112
112
|
if 'using' not in args:
|
|
113
113
|
raise Exception("LangChain engine requires a USING clause! Refer to its documentation for more details.")
|
|
114
114
|
else:
|
|
@@ -117,7 +117,7 @@ AI: {response}'''
|
|
|
117
117
|
if not args.get('mode') == 'retrieval':
|
|
118
118
|
raise ValueError('Please provide a `prompt_template` for this engine.')
|
|
119
119
|
|
|
120
|
-
def predict(self, df: pd.DataFrame, args: Dict=None) -> pd.DataFrame:
|
|
120
|
+
def predict(self, df: pd.DataFrame, args: Dict = None) -> pd.DataFrame:
|
|
121
121
|
"""
|
|
122
122
|
Dispatch is performed depending on the underlying model type. Currently, only the default text completion
|
|
123
123
|
is supported.
|
|
@@ -125,7 +125,7 @@ AI: {response}'''
|
|
|
125
125
|
pred_args = args['predict_params'] if args else {}
|
|
126
126
|
args = self.model_storage.json_get('args')
|
|
127
127
|
if 'prompt_template' not in args and 'prompt_template' not in pred_args:
|
|
128
|
-
raise ValueError(
|
|
128
|
+
raise ValueError("This model expects a `prompt_template`, please provide one.")
|
|
129
129
|
# Back compatibility for old models
|
|
130
130
|
args['provider'] = args.get('provider', get_llm_provider(args))
|
|
131
131
|
args['embedding_model_provider'] = args.get('embedding_model', get_embedding_model_provider(args))
|
|
@@ -155,7 +155,7 @@ AI: {response}'''
|
|
|
155
155
|
|
|
156
156
|
return pd.DataFrame([resp.content], columns=[assistant_column])
|
|
157
157
|
|
|
158
|
-
def create_agent(self, df: pd.DataFrame, args: Dict=None, pred_args: Dict=None) -> AgentExecutor:
|
|
158
|
+
def create_agent(self, df: pd.DataFrame, args: Dict = None, pred_args: Dict = None) -> AgentExecutor:
|
|
159
159
|
pred_args = pred_args if pred_args else {}
|
|
160
160
|
|
|
161
161
|
# Set up tools.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import tiktoken
|
|
2
|
-
|
|
3
|
-
from typing import Callable, Dict
|
|
2
|
+
from typing import Callable
|
|
4
3
|
|
|
5
4
|
from mindsdb_sql_parser import parse_sql
|
|
6
5
|
from mindsdb_sql_parser.ast import Insert
|
|
@@ -13,21 +12,18 @@ from langchain.chains.llm import LLMChain
|
|
|
13
12
|
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
|
|
14
13
|
from langchain.chains import ReduceDocumentsChain, MapReduceDocumentsChain
|
|
15
14
|
|
|
16
|
-
from mindsdb.
|
|
17
|
-
from mindsdb.integrations.utilities.rag.settings import RAGPipelineModel, VectorStoreType, DEFAULT_COLLECTION_NAME
|
|
18
|
-
from mindsdb.interfaces.skills.skill_tool import skill_tool, SkillType
|
|
19
|
-
from mindsdb.interfaces.storage import db
|
|
15
|
+
from mindsdb.interfaces.skills.skill_tool import skill_tool
|
|
20
16
|
from mindsdb.utilities import log
|
|
21
17
|
from langchain_core.prompts import PromptTemplate
|
|
22
18
|
from langchain_core.tools import Tool
|
|
23
19
|
from langchain_text_splitters import CharacterTextSplitter
|
|
24
20
|
|
|
25
21
|
logger = log.getLogger(__name__)
|
|
26
|
-
from mindsdb.interfaces.storage.db import KnowledgeBase
|
|
27
|
-
from mindsdb.utilities import log
|
|
28
22
|
|
|
29
23
|
# Individual tools
|
|
30
24
|
# Note: all tools are defined in a closure to pass required args (apart from LLM input) through it, as custom tools don't allow custom field assignment. # noqa
|
|
25
|
+
|
|
26
|
+
|
|
31
27
|
def get_exec_call_tool(llm, executor, model_kwargs) -> Callable:
|
|
32
28
|
def mdb_exec_call_tool(query: str) -> str:
|
|
33
29
|
try:
|
|
@@ -50,6 +46,7 @@ def get_exec_call_tool(llm, executor, model_kwargs) -> Callable:
|
|
|
50
46
|
return data
|
|
51
47
|
return mdb_exec_call_tool
|
|
52
48
|
|
|
49
|
+
|
|
53
50
|
def get_exec_metadata_tool(llm, executor, model_kwargs) -> Callable:
|
|
54
51
|
def mdb_exec_metadata_call(query: str) -> str:
|
|
55
52
|
try:
|
|
@@ -80,9 +77,9 @@ def get_exec_metadata_tool(llm, executor, model_kwargs) -> Callable:
|
|
|
80
77
|
data = f'Metadata for table {table_name}:\n'
|
|
81
78
|
fields = handler.get_columns(table_name).data_frame['Field'].to_list()
|
|
82
79
|
types = handler.get_columns(table_name).data_frame['Type'].to_list()
|
|
83
|
-
data +=
|
|
80
|
+
data += 'List of columns and types:\n'
|
|
84
81
|
data += '\n'.join([f'\tColumn: `{field}`\tType: `{typ}`' for field, typ in zip(fields, types)])
|
|
85
|
-
except:
|
|
82
|
+
except BaseException:
|
|
86
83
|
data = f'Table {table_name} not found.'
|
|
87
84
|
except Exception as e:
|
|
88
85
|
data = f"mindsdb tool failed with error:\n{str(e)}" # let the agent know
|
|
@@ -93,6 +90,7 @@ def get_exec_metadata_tool(llm, executor, model_kwargs) -> Callable:
|
|
|
93
90
|
return data
|
|
94
91
|
return mdb_exec_metadata_call
|
|
95
92
|
|
|
93
|
+
|
|
96
94
|
def get_mdb_write_tool(executor) -> Callable:
|
|
97
95
|
def mdb_write_call(query: str) -> str:
|
|
98
96
|
try:
|
|
@@ -105,6 +103,7 @@ def get_mdb_write_tool(executor) -> Callable:
|
|
|
105
103
|
return f"mindsdb write tool failed with error:\n{str(e)}"
|
|
106
104
|
return mdb_write_call
|
|
107
105
|
|
|
106
|
+
|
|
108
107
|
def _setup_standard_tools(tools, llm, model_kwargs):
|
|
109
108
|
executor = skill_tool.get_command_executor()
|
|
110
109
|
|
|
@@ -2,7 +2,7 @@ from mindsdb.integrations.libs.const import HANDLER_TYPE
|
|
|
2
2
|
|
|
3
3
|
from .__about__ import __version__ as version, __description__ as description
|
|
4
4
|
try:
|
|
5
|
-
from .leonardo_ai_handler import
|
|
5
|
+
from .leonardo_ai_handler import LeonardoAIHandler as Handler
|
|
6
6
|
import_error = None
|
|
7
7
|
except Exception as e:
|
|
8
8
|
Handler = None
|
|
@@ -9,13 +9,12 @@ from pathlib import Path
|
|
|
9
9
|
import lightwood
|
|
10
10
|
import pandas as pd
|
|
11
11
|
import requests
|
|
12
|
-
from lightwood.api.types import JsonAI
|
|
12
|
+
from lightwood.api.types import JsonAI
|
|
13
13
|
from pandas.core.frame import DataFrame
|
|
14
14
|
|
|
15
15
|
import mindsdb.utilities.profiler as profiler
|
|
16
16
|
from mindsdb.integrations.libs.const import PREDICTOR_STATUS
|
|
17
17
|
from mindsdb.integrations.utilities.utils import format_exception_error
|
|
18
|
-
from mindsdb.interfaces.model.functions import get_model_records
|
|
19
18
|
from mindsdb.interfaces.storage import db
|
|
20
19
|
from mindsdb.interfaces.storage.fs import RESOURCE_GROUP, FileStorage
|
|
21
20
|
from mindsdb.interfaces.storage.json import get_json_storage
|
|
@@ -26,6 +25,7 @@ from .utils import brack_to_mod, rep_recur, unpack_jsonai_old_args
|
|
|
26
25
|
|
|
27
26
|
logger = log.getLogger(__name__)
|
|
28
27
|
|
|
28
|
+
|
|
29
29
|
def create_learn_mark():
|
|
30
30
|
if os.name == 'posix':
|
|
31
31
|
p = Path(tempfile.gettempdir()).joinpath('mindsdb/learn_processes/')
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import json
|
|
3
|
-
import sys
|
|
4
3
|
from datetime import datetime
|
|
5
4
|
from functools import lru_cache
|
|
6
5
|
from typing import Dict, Optional
|
|
@@ -21,8 +20,6 @@ from mindsdb.utilities.functions import cast_row_types
|
|
|
21
20
|
|
|
22
21
|
from .functions import run_finetune, run_learn
|
|
23
22
|
|
|
24
|
-
IS_PY36 = sys.version_info[1] <= 6
|
|
25
|
-
|
|
26
23
|
|
|
27
24
|
class NumpyJSONEncoder(json.JSONEncoder):
|
|
28
25
|
"""
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
lightwood>=25.
|
|
2
|
-
lightwood[extra]>=25.
|
|
3
|
-
lightwood[xai]>=25.
|
|
4
|
-
type_infer==0.0.
|
|
1
|
+
lightwood>=25.5.2.2
|
|
2
|
+
lightwood[extra]>=25.5.2.2
|
|
3
|
+
lightwood[xai]>=25.5.2.2
|
|
4
|
+
type_infer==0.0.22
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
import mindsdb.interfaces.storage.db as db
|
|
2
|
+
from mindsdb.integrations.libs.response import RESPONSE_TYPE
|
|
3
|
+
from mindsdb.interfaces.model.model_controller import ModelController
|
|
4
|
+
from mindsdb.interfaces.storage.fs import FsStore
|
|
5
|
+
from mindsdb.integrations.handlers.lightwood_handler.lightwood_handler.lightwood_handler import LightwoodHandler
|
|
6
|
+
from mindsdb.interfaces.database.integrations import integration_controller
|
|
7
|
+
from mindsdb.integrations.utilities.test_utils import PG_HANDLER_NAME, PG_CONNECTION_DATA
|
|
8
|
+
from mindsdb.utilities.config import Config
|
|
9
|
+
from mindsdb.migrations import migrate
|
|
1
10
|
import os
|
|
2
11
|
import time
|
|
3
12
|
import unittest
|
|
@@ -7,18 +16,9 @@ temp_dir = tempfile.mkdtemp(dir='/tmp/', prefix='lightwood_handler_test_')
|
|
|
7
16
|
os.environ['MINDSDB_STORAGE_DIR'] = os.environ.get('MINDSDB_STORAGE_DIR', temp_dir)
|
|
8
17
|
os.environ['MINDSDB_DB_CON'] = 'sqlite:///' + os.path.join(os.environ['MINDSDB_STORAGE_DIR'], 'mindsdb.sqlite3.db') + '?check_same_thread=False&timeout=30'
|
|
9
18
|
|
|
10
|
-
from mindsdb.migrations import migrate
|
|
11
19
|
migrate.migrate_to_head()
|
|
12
20
|
|
|
13
|
-
from mindsdb.utilities.config import Config
|
|
14
|
-
from mindsdb.integrations.utilities.test_utils import HandlerControllerMock, PG_HANDLER_NAME, PG_CONNECTION_DATA
|
|
15
|
-
from mindsdb.interfaces.database.integrations import integration_controller
|
|
16
|
-
from mindsdb.integrations.handlers.lightwood_handler.lightwood_handler.lightwood_handler import LightwoodHandler
|
|
17
21
|
# from mindsdb.integrations.handlers.lightwood_handler.lightwood_handler.utils import load_predictor
|
|
18
|
-
from mindsdb.interfaces.storage.fs import FsStore
|
|
19
|
-
from mindsdb.interfaces.model.model_controller import ModelController
|
|
20
|
-
from mindsdb.integrations.libs.response import RESPONSE_TYPE
|
|
21
|
-
import mindsdb.interfaces.storage.db as db
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
# TODO: drop all models and tables when closing tests
|
|
@@ -96,7 +96,7 @@ class LightwoodHandlerTest(unittest.TestCase):
|
|
|
96
96
|
self.assertTrue(response.type == RESPONSE_TYPE.OK)
|
|
97
97
|
|
|
98
98
|
def test_04_query_predictor_single_where_condition(self):
|
|
99
|
-
time.sleep(120)
|
|
99
|
+
time.sleep(120) # TODO
|
|
100
100
|
query = f"""
|
|
101
101
|
SELECT target
|
|
102
102
|
from {self.test_model_1}
|
|
@@ -255,4 +255,4 @@ class LightwoodHandlerTest(unittest.TestCase):
|
|
|
255
255
|
|
|
256
256
|
|
|
257
257
|
if __name__ == "__main__":
|
|
258
|
-
unittest.main(failfast=True)
|
|
258
|
+
unittest.main(failfast=True)
|