MindsDB 25.5.3.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 +127 -79
- 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 +47 -27
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/planner/query_planner.py +10 -1
- mindsdb/api/executor/sql_query/result_set.py +185 -52
- mindsdb/api/executor/sql_query/sql_query.py +1 -1
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
- mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
- mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
- mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
- mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
- mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
- mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
- mindsdb/api/http/initialize.py +99 -83
- mindsdb/api/http/namespaces/analysis.py +3 -3
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/mcp/start.py +42 -5
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
- mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
- mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
- mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
- mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
- mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
- mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
- mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
- mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
- mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
- mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
- mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
- mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
- mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
- mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
- mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
- mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
- mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
- mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
- mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
- mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
- mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
- mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
- mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
- mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
- mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
- mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
- mindsdb/integrations/handlers/email_handler/settings.py +0 -1
- mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
- mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
- mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
- mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
- mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
- mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
- mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
- mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
- mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
- mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
- mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
- mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
- mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
- mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
- mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
- mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
- mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
- mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
- mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
- mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
- mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
- mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
- mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
- mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
- mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
- mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
- mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
- mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
- mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
- mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
- mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
- mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
- mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
- mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
- mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
- mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
- mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
- mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
- mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
- mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
- mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
- mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
- mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
- mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
- mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
- mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
- mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
- mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
- mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
- mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
- mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
- mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
- mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
- mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
- mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
- mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
- mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
- mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
- mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
- mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
- mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
- mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
- mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
- mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
- mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
- mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
- mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
- mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
- mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
- mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
- mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
- mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
- mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
- mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
- mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
- mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
- mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
- mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
- mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
- mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
- mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
- mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
- mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
- mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
- mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
- mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
- mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
- mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
- mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
- mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
- mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
- mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
- mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
- mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
- mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
- mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
- mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
- mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
- mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
- mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
- mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
- mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
- mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
- mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
- mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
- mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
- mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
- mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
- mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
- mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
- mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
- mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
- mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
- mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
- mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
- mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
- mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
- mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
- mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
- mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
- mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
- mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
- mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
- mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
- mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
- mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
- mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
- mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
- mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
- mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
- mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
- mindsdb/integrations/libs/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/handler_utils.py +15 -3
- mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
- mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
- mindsdb/integrations/utilities/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +15 -0
- mindsdb/interfaces/agents/langchain_agent.py +16 -4
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/knowledge_base/controller.py +25 -0
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/query_context/context_controller.py +66 -10
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
- mindsdb/interfaces/skills/skill_tool.py +202 -57
- mindsdb/interfaces/skills/sql_agent.py +205 -17
- mindsdb/interfaces/storage/fs.py +1 -0
- mindsdb/interfaces/variables/__init__.py +0 -0
- mindsdb/interfaces/variables/variables_controller.py +97 -0
- mindsdb/migrations/env.py +5 -7
- mindsdb/migrations/migrate.py +47 -7
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +331 -219
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +641 -695
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +309 -288
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Union, AsyncIterable, List
|
|
3
|
+
from ...common.types import Task
|
|
4
|
+
from ...common.types import (
|
|
5
|
+
JSONRPCResponse,
|
|
6
|
+
TaskIdParams,
|
|
7
|
+
TaskQueryParams,
|
|
8
|
+
GetTaskRequest,
|
|
9
|
+
TaskNotFoundError,
|
|
10
|
+
SendTaskRequest,
|
|
11
|
+
CancelTaskRequest,
|
|
12
|
+
TaskNotCancelableError,
|
|
13
|
+
SetTaskPushNotificationRequest,
|
|
14
|
+
GetTaskPushNotificationRequest,
|
|
15
|
+
GetTaskResponse,
|
|
16
|
+
CancelTaskResponse,
|
|
17
|
+
SendTaskResponse,
|
|
18
|
+
SetTaskPushNotificationResponse,
|
|
19
|
+
GetTaskPushNotificationResponse,
|
|
20
|
+
TaskSendParams,
|
|
21
|
+
TaskStatus,
|
|
22
|
+
TaskState,
|
|
23
|
+
TaskResubscriptionRequest,
|
|
24
|
+
SendTaskStreamingRequest,
|
|
25
|
+
SendTaskStreamingResponse,
|
|
26
|
+
Artifact,
|
|
27
|
+
PushNotificationConfig,
|
|
28
|
+
TaskStatusUpdateEvent,
|
|
29
|
+
JSONRPCError,
|
|
30
|
+
TaskPushNotificationConfig,
|
|
31
|
+
InternalError,
|
|
32
|
+
)
|
|
33
|
+
from ...common.server.utils import new_not_implemented_error
|
|
34
|
+
import asyncio
|
|
35
|
+
import logging
|
|
36
|
+
|
|
37
|
+
logger = logging.getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class TaskManager(ABC):
|
|
41
|
+
@abstractmethod
|
|
42
|
+
async def on_get_task(self, request: GetTaskRequest) -> GetTaskResponse:
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
async def on_cancel_task(self, request: CancelTaskRequest) -> CancelTaskResponse:
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
async def on_send_task(self, request: SendTaskRequest) -> SendTaskResponse:
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
@abstractmethod
|
|
54
|
+
async def on_send_task_subscribe(
|
|
55
|
+
self, request: SendTaskStreamingRequest
|
|
56
|
+
) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]:
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
async def on_set_task_push_notification(
|
|
61
|
+
self, request: SetTaskPushNotificationRequest
|
|
62
|
+
) -> SetTaskPushNotificationResponse:
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
async def on_get_task_push_notification(
|
|
67
|
+
self, request: GetTaskPushNotificationRequest
|
|
68
|
+
) -> GetTaskPushNotificationResponse:
|
|
69
|
+
pass
|
|
70
|
+
|
|
71
|
+
@abstractmethod
|
|
72
|
+
async def on_resubscribe_to_task(
|
|
73
|
+
self, request: TaskResubscriptionRequest
|
|
74
|
+
) -> Union[AsyncIterable[SendTaskResponse], JSONRPCResponse]:
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class InMemoryTaskManager(TaskManager):
|
|
79
|
+
def __init__(self):
|
|
80
|
+
self.tasks: dict[str, Task] = {}
|
|
81
|
+
self.push_notification_infos: dict[str, PushNotificationConfig] = {}
|
|
82
|
+
self.lock = asyncio.Lock()
|
|
83
|
+
self.task_sse_subscribers: dict[str, List[asyncio.Queue]] = {}
|
|
84
|
+
self.subscriber_lock = asyncio.Lock()
|
|
85
|
+
|
|
86
|
+
async def on_get_task(self, request: GetTaskRequest) -> GetTaskResponse:
|
|
87
|
+
logger.info(f"Getting task {request.params.id}")
|
|
88
|
+
task_query_params: TaskQueryParams = request.params
|
|
89
|
+
|
|
90
|
+
async with self.lock:
|
|
91
|
+
task = self.tasks.get(task_query_params.id)
|
|
92
|
+
if task is None:
|
|
93
|
+
return GetTaskResponse(id=request.id, error=TaskNotFoundError())
|
|
94
|
+
|
|
95
|
+
task_result = self.append_task_history(
|
|
96
|
+
task, task_query_params.historyLength
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return GetTaskResponse(id=request.id, result=task_result)
|
|
100
|
+
|
|
101
|
+
async def on_cancel_task(self, request: CancelTaskRequest) -> CancelTaskResponse:
|
|
102
|
+
logger.info(f"Cancelling task {request.params.id}")
|
|
103
|
+
task_id_params: TaskIdParams = request.params
|
|
104
|
+
|
|
105
|
+
async with self.lock:
|
|
106
|
+
task = self.tasks.get(task_id_params.id)
|
|
107
|
+
if task is None:
|
|
108
|
+
return CancelTaskResponse(id=request.id, error=TaskNotFoundError())
|
|
109
|
+
|
|
110
|
+
return CancelTaskResponse(id=request.id, error=TaskNotCancelableError())
|
|
111
|
+
|
|
112
|
+
@abstractmethod
|
|
113
|
+
async def on_send_task(self, request: SendTaskRequest) -> SendTaskResponse:
|
|
114
|
+
pass
|
|
115
|
+
|
|
116
|
+
@abstractmethod
|
|
117
|
+
async def on_send_task_subscribe(
|
|
118
|
+
self, request: SendTaskStreamingRequest
|
|
119
|
+
) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]:
|
|
120
|
+
pass
|
|
121
|
+
|
|
122
|
+
async def set_push_notification_info(
|
|
123
|
+
self, task_id: str, notification_config: PushNotificationConfig
|
|
124
|
+
):
|
|
125
|
+
async with self.lock:
|
|
126
|
+
task = self.tasks.get(task_id)
|
|
127
|
+
if task is None:
|
|
128
|
+
raise ValueError(f"Task not found for {task_id}")
|
|
129
|
+
|
|
130
|
+
self.push_notification_infos[task_id] = notification_config
|
|
131
|
+
|
|
132
|
+
return
|
|
133
|
+
|
|
134
|
+
async def get_push_notification_info(self, task_id: str) -> PushNotificationConfig:
|
|
135
|
+
async with self.lock:
|
|
136
|
+
task = self.tasks.get(task_id)
|
|
137
|
+
if task is None:
|
|
138
|
+
raise ValueError(f"Task not found for {task_id}")
|
|
139
|
+
|
|
140
|
+
return self.push_notification_infos[task_id]
|
|
141
|
+
|
|
142
|
+
return
|
|
143
|
+
|
|
144
|
+
async def has_push_notification_info(self, task_id: str) -> bool:
|
|
145
|
+
async with self.lock:
|
|
146
|
+
return task_id in self.push_notification_infos
|
|
147
|
+
|
|
148
|
+
async def on_set_task_push_notification(
|
|
149
|
+
self, request: SetTaskPushNotificationRequest
|
|
150
|
+
) -> SetTaskPushNotificationResponse:
|
|
151
|
+
logger.info(f"Setting task push notification {request.params.id}")
|
|
152
|
+
task_notification_params: TaskPushNotificationConfig = request.params
|
|
153
|
+
|
|
154
|
+
try:
|
|
155
|
+
await self.set_push_notification_info(
|
|
156
|
+
task_notification_params.id,
|
|
157
|
+
task_notification_params.pushNotificationConfig,
|
|
158
|
+
)
|
|
159
|
+
except Exception as e:
|
|
160
|
+
logger.error(f"Error while setting push notification info: {e}")
|
|
161
|
+
return JSONRPCResponse(
|
|
162
|
+
id=request.id,
|
|
163
|
+
error=InternalError(
|
|
164
|
+
message="An error occurred while setting push notification info"
|
|
165
|
+
),
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
return SetTaskPushNotificationResponse(
|
|
169
|
+
id=request.id, result=task_notification_params
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
async def on_get_task_push_notification(
|
|
173
|
+
self, request: GetTaskPushNotificationRequest
|
|
174
|
+
) -> GetTaskPushNotificationResponse:
|
|
175
|
+
logger.info(f"Getting task push notification {request.params.id}")
|
|
176
|
+
task_params: TaskIdParams = request.params
|
|
177
|
+
|
|
178
|
+
try:
|
|
179
|
+
notification_info = await self.get_push_notification_info(task_params.id)
|
|
180
|
+
except Exception as e:
|
|
181
|
+
logger.error(f"Error while getting push notification info: {e}")
|
|
182
|
+
return GetTaskPushNotificationResponse(
|
|
183
|
+
id=request.id,
|
|
184
|
+
error=InternalError(
|
|
185
|
+
message="An error occurred while getting push notification info"
|
|
186
|
+
),
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
return GetTaskPushNotificationResponse(
|
|
190
|
+
id=request.id,
|
|
191
|
+
result=TaskPushNotificationConfig(
|
|
192
|
+
id=task_params.id, pushNotificationConfig=notification_info
|
|
193
|
+
),
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
async def upsert_task(self, task_send_params: TaskSendParams) -> Task:
|
|
197
|
+
logger.info(f"Upserting task {task_send_params.id}")
|
|
198
|
+
async with self.lock:
|
|
199
|
+
task = self.tasks.get(task_send_params.id)
|
|
200
|
+
if task is None:
|
|
201
|
+
task = Task(
|
|
202
|
+
id=task_send_params.id,
|
|
203
|
+
sessionId=task_send_params.sessionId,
|
|
204
|
+
messages=[task_send_params.message],
|
|
205
|
+
status=TaskStatus(state=TaskState.SUBMITTED),
|
|
206
|
+
history=[task_send_params.message],
|
|
207
|
+
)
|
|
208
|
+
self.tasks[task_send_params.id] = task
|
|
209
|
+
else:
|
|
210
|
+
task.history.append(task_send_params.message)
|
|
211
|
+
|
|
212
|
+
return task
|
|
213
|
+
|
|
214
|
+
async def on_resubscribe_to_task(
|
|
215
|
+
self, request: TaskResubscriptionRequest
|
|
216
|
+
) -> Union[AsyncIterable[SendTaskStreamingResponse], JSONRPCResponse]:
|
|
217
|
+
return new_not_implemented_error(request.id)
|
|
218
|
+
|
|
219
|
+
async def update_store(
|
|
220
|
+
self, task_id: str, status: TaskStatus, artifacts: list[Artifact]
|
|
221
|
+
) -> Task:
|
|
222
|
+
async with self.lock:
|
|
223
|
+
try:
|
|
224
|
+
task = self.tasks[task_id]
|
|
225
|
+
except KeyError:
|
|
226
|
+
logger.error(f"Task {task_id} not found for updating the task")
|
|
227
|
+
raise ValueError(f"Task {task_id} not found")
|
|
228
|
+
|
|
229
|
+
task.status = status
|
|
230
|
+
|
|
231
|
+
if status.message is not None:
|
|
232
|
+
task.history.append(status.message)
|
|
233
|
+
|
|
234
|
+
if artifacts is not None:
|
|
235
|
+
if task.artifacts is None:
|
|
236
|
+
task.artifacts = []
|
|
237
|
+
task.artifacts.extend(artifacts)
|
|
238
|
+
|
|
239
|
+
return task
|
|
240
|
+
|
|
241
|
+
def append_task_history(self, task: Task, historyLength: int | None):
|
|
242
|
+
new_task = task.model_copy()
|
|
243
|
+
if historyLength is not None and historyLength > 0:
|
|
244
|
+
new_task.history = new_task.history[-historyLength:]
|
|
245
|
+
else:
|
|
246
|
+
new_task.history = []
|
|
247
|
+
|
|
248
|
+
return new_task
|
|
249
|
+
|
|
250
|
+
async def setup_sse_consumer(self, task_id: str, is_resubscribe: bool = False):
|
|
251
|
+
async with self.subscriber_lock:
|
|
252
|
+
if task_id not in self.task_sse_subscribers:
|
|
253
|
+
if is_resubscribe:
|
|
254
|
+
raise ValueError("Task not found for resubscription")
|
|
255
|
+
else:
|
|
256
|
+
self.task_sse_subscribers[task_id] = []
|
|
257
|
+
|
|
258
|
+
sse_event_queue = asyncio.Queue(maxsize=0) # <=0 is unlimited
|
|
259
|
+
self.task_sse_subscribers[task_id].append(sse_event_queue)
|
|
260
|
+
return sse_event_queue
|
|
261
|
+
|
|
262
|
+
async def enqueue_events_for_sse(self, task_id, task_update_event):
|
|
263
|
+
async with self.subscriber_lock:
|
|
264
|
+
if task_id not in self.task_sse_subscribers:
|
|
265
|
+
return
|
|
266
|
+
|
|
267
|
+
current_subscribers = self.task_sse_subscribers[task_id]
|
|
268
|
+
for subscriber in current_subscribers:
|
|
269
|
+
await subscriber.put(task_update_event)
|
|
270
|
+
|
|
271
|
+
async def dequeue_events_for_sse(
|
|
272
|
+
self, request_id, task_id, sse_event_queue: asyncio.Queue
|
|
273
|
+
) -> AsyncIterable[SendTaskStreamingResponse] | JSONRPCResponse:
|
|
274
|
+
try:
|
|
275
|
+
while True:
|
|
276
|
+
event = await sse_event_queue.get()
|
|
277
|
+
if isinstance(event, JSONRPCError):
|
|
278
|
+
yield SendTaskStreamingResponse(id=request_id, error=event)
|
|
279
|
+
break
|
|
280
|
+
|
|
281
|
+
yield SendTaskStreamingResponse(id=request_id, result=event)
|
|
282
|
+
if isinstance(event, TaskStatusUpdateEvent) and event.final:
|
|
283
|
+
break
|
|
284
|
+
finally:
|
|
285
|
+
async with self.subscriber_lock:
|
|
286
|
+
if task_id in self.task_sse_subscribers:
|
|
287
|
+
self.task_sse_subscribers[task_id].remove(sse_event_queue)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from ...common.types import (
|
|
2
|
+
JSONRPCResponse,
|
|
3
|
+
ContentTypeNotSupportedError,
|
|
4
|
+
UnsupportedOperationError,
|
|
5
|
+
)
|
|
6
|
+
from typing import List
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def are_modalities_compatible(
|
|
10
|
+
server_output_modes: List[str], client_output_modes: List[str]
|
|
11
|
+
):
|
|
12
|
+
"""Modalities are compatible if they are both non-empty
|
|
13
|
+
and there is at least one common element."""
|
|
14
|
+
if client_output_modes is None or len(client_output_modes) == 0:
|
|
15
|
+
return True
|
|
16
|
+
|
|
17
|
+
if server_output_modes is None or len(server_output_modes) == 0:
|
|
18
|
+
return True
|
|
19
|
+
|
|
20
|
+
return any(x in server_output_modes for x in client_output_modes)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def new_incompatible_types_error(request_id):
|
|
24
|
+
return JSONRPCResponse(id=request_id, error=ContentTypeNotSupportedError())
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def new_not_implemented_error(request_id):
|
|
28
|
+
return JSONRPCResponse(id=request_id, error=UnsupportedOperationError())
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
from typing import Union, Any
|
|
2
|
+
from pydantic import BaseModel, Field, TypeAdapter
|
|
3
|
+
from typing import Literal, List, Annotated, Optional
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from pydantic import model_validator, ConfigDict, field_serializer
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing_extensions import Self
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TaskState(str, Enum):
|
|
12
|
+
SUBMITTED = "submitted"
|
|
13
|
+
WORKING = "working"
|
|
14
|
+
INPUT_REQUIRED = "input-required"
|
|
15
|
+
COMPLETED = "completed"
|
|
16
|
+
CANCELED = "canceled"
|
|
17
|
+
FAILED = "failed"
|
|
18
|
+
UNKNOWN = "unknown"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TextPart(BaseModel):
|
|
22
|
+
type: Literal["text"] = "text"
|
|
23
|
+
text: str
|
|
24
|
+
metadata: dict[str, Any] | None = None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class FileContent(BaseModel):
|
|
28
|
+
name: str | None = None
|
|
29
|
+
mimeType: str | None = None
|
|
30
|
+
bytes: str | None = None
|
|
31
|
+
uri: str | None = None
|
|
32
|
+
|
|
33
|
+
@model_validator(mode="after")
|
|
34
|
+
def check_content(self) -> Self:
|
|
35
|
+
if not (self.bytes or self.uri):
|
|
36
|
+
raise ValueError("Either 'bytes' or 'uri' must be present in the file data")
|
|
37
|
+
if self.bytes and self.uri:
|
|
38
|
+
raise ValueError(
|
|
39
|
+
"Only one of 'bytes' or 'uri' can be present in the file data"
|
|
40
|
+
)
|
|
41
|
+
return self
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class FilePart(BaseModel):
|
|
45
|
+
type: Literal["file"] = "file"
|
|
46
|
+
file: FileContent
|
|
47
|
+
metadata: dict[str, Any] | None = None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class DataPart(BaseModel):
|
|
51
|
+
type: Literal["data"] = "data"
|
|
52
|
+
data: dict[str, Any]
|
|
53
|
+
metadata: dict[str, Any] | None = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
Part = Annotated[Union[TextPart, FilePart, DataPart], Field(discriminator="type")]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class Message(BaseModel):
|
|
60
|
+
role: Literal["user", "agent"]
|
|
61
|
+
parts: List[Part]
|
|
62
|
+
metadata: dict[str, Any] | None = None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class TaskStatus(BaseModel):
|
|
66
|
+
state: TaskState
|
|
67
|
+
message: Message | None = None
|
|
68
|
+
timestamp: datetime = Field(default_factory=datetime.now)
|
|
69
|
+
|
|
70
|
+
@field_serializer("timestamp")
|
|
71
|
+
def serialize_dt(self, dt: datetime, _info):
|
|
72
|
+
return dt.isoformat()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class Artifact(BaseModel):
|
|
76
|
+
name: str | None = None
|
|
77
|
+
description: str | None = None
|
|
78
|
+
parts: List[Part]
|
|
79
|
+
metadata: dict[str, Any] | None = None
|
|
80
|
+
index: int = 0
|
|
81
|
+
append: bool | None = None
|
|
82
|
+
lastChunk: bool | None = None
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class Task(BaseModel):
|
|
86
|
+
id: str
|
|
87
|
+
sessionId: str | None = None
|
|
88
|
+
status: TaskStatus
|
|
89
|
+
artifacts: List[Artifact] | None = None
|
|
90
|
+
history: List[Message] | None = None
|
|
91
|
+
metadata: dict[str, Any] | None = None
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class TaskStatusUpdateEvent(BaseModel):
|
|
95
|
+
id: str
|
|
96
|
+
status: TaskStatus
|
|
97
|
+
final: bool = False
|
|
98
|
+
metadata: dict[str, Any] | None = None
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class TaskArtifactUpdateEvent(BaseModel):
|
|
102
|
+
id: str
|
|
103
|
+
artifact: Artifact
|
|
104
|
+
metadata: dict[str, Any] | None = None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class AuthenticationInfo(BaseModel):
|
|
108
|
+
model_config = ConfigDict(extra="allow")
|
|
109
|
+
|
|
110
|
+
schemes: List[str]
|
|
111
|
+
credentials: str | None = None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class PushNotificationConfig(BaseModel):
|
|
115
|
+
url: str
|
|
116
|
+
token: str | None = None
|
|
117
|
+
authentication: AuthenticationInfo | None = None
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class TaskIdParams(BaseModel):
|
|
121
|
+
id: str
|
|
122
|
+
metadata: dict[str, Any] | None = None
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class TaskQueryParams(TaskIdParams):
|
|
126
|
+
historyLength: int | None = None
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class TaskSendParams(BaseModel):
|
|
130
|
+
id: str
|
|
131
|
+
sessionId: str = Field(default_factory=lambda: uuid4().hex)
|
|
132
|
+
message: Message
|
|
133
|
+
acceptedOutputModes: Optional[List[str]] = None
|
|
134
|
+
pushNotification: PushNotificationConfig | None = None
|
|
135
|
+
historyLength: int | None = None
|
|
136
|
+
metadata: dict[str, Any] | None = None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class TaskPushNotificationConfig(BaseModel):
|
|
140
|
+
id: str
|
|
141
|
+
pushNotificationConfig: PushNotificationConfig
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# RPC Messages
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class JSONRPCMessage(BaseModel):
|
|
148
|
+
jsonrpc: Literal["2.0"] = "2.0"
|
|
149
|
+
id: int | str | None = Field(default_factory=lambda: uuid4().hex)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class JSONRPCRequest(JSONRPCMessage):
|
|
153
|
+
method: str
|
|
154
|
+
params: dict[str, Any] | None = None
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class JSONRPCError(BaseModel):
|
|
158
|
+
code: int
|
|
159
|
+
message: str
|
|
160
|
+
data: Any | None = None
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class JSONRPCResponse(JSONRPCMessage):
|
|
164
|
+
result: Any | None = None
|
|
165
|
+
error: JSONRPCError | None = None
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class SendTaskRequest(JSONRPCRequest):
|
|
169
|
+
method: Literal["tasks/send"] = "tasks/send"
|
|
170
|
+
params: TaskSendParams
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class SendTaskResponse(JSONRPCResponse):
|
|
174
|
+
result: Task | None = None
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class SendTaskStreamingRequest(JSONRPCRequest):
|
|
178
|
+
method: Literal["tasks/sendSubscribe"] = "tasks/sendSubscribe"
|
|
179
|
+
params: TaskSendParams
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class SendTaskStreamingResponse(JSONRPCResponse):
|
|
183
|
+
result: TaskStatusUpdateEvent | TaskArtifactUpdateEvent | None = None
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class GetTaskRequest(JSONRPCRequest):
|
|
187
|
+
method: Literal["tasks/get"] = "tasks/get"
|
|
188
|
+
params: TaskQueryParams
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class GetTaskResponse(JSONRPCResponse):
|
|
192
|
+
result: Task | None = None
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class CancelTaskRequest(JSONRPCRequest):
|
|
196
|
+
method: Literal["tasks/cancel",] = "tasks/cancel"
|
|
197
|
+
params: TaskIdParams
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class CancelTaskResponse(JSONRPCResponse):
|
|
201
|
+
result: Task | None = None
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class SetTaskPushNotificationRequest(JSONRPCRequest):
|
|
205
|
+
method: Literal["tasks/pushNotification/set",] = "tasks/pushNotification/set"
|
|
206
|
+
params: TaskPushNotificationConfig
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
class SetTaskPushNotificationResponse(JSONRPCResponse):
|
|
210
|
+
result: TaskPushNotificationConfig | None = None
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class GetTaskPushNotificationRequest(JSONRPCRequest):
|
|
214
|
+
method: Literal["tasks/pushNotification/get",] = "tasks/pushNotification/get"
|
|
215
|
+
params: TaskIdParams
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class GetTaskPushNotificationResponse(JSONRPCResponse):
|
|
219
|
+
result: TaskPushNotificationConfig | None = None
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
class TaskResubscriptionRequest(JSONRPCRequest):
|
|
223
|
+
method: Literal["tasks/resubscribe",] = "tasks/resubscribe"
|
|
224
|
+
params: TaskIdParams
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
A2ARequest = TypeAdapter(
|
|
228
|
+
Annotated[
|
|
229
|
+
Union[
|
|
230
|
+
SendTaskRequest,
|
|
231
|
+
GetTaskRequest,
|
|
232
|
+
CancelTaskRequest,
|
|
233
|
+
SetTaskPushNotificationRequest,
|
|
234
|
+
GetTaskPushNotificationRequest,
|
|
235
|
+
TaskResubscriptionRequest,
|
|
236
|
+
SendTaskStreamingRequest,
|
|
237
|
+
],
|
|
238
|
+
Field(discriminator="method"),
|
|
239
|
+
]
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
# Error types
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class JSONParseError(JSONRPCError):
|
|
246
|
+
code: int = -32700
|
|
247
|
+
message: str = "Invalid JSON payload"
|
|
248
|
+
data: Any | None = None
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class InvalidRequestError(JSONRPCError):
|
|
252
|
+
code: int = -32600
|
|
253
|
+
message: str = "Request payload validation error"
|
|
254
|
+
data: Any | None = None
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
class MethodNotFoundError(JSONRPCError):
|
|
258
|
+
code: int = -32601
|
|
259
|
+
message: str = "Method not found"
|
|
260
|
+
data: None = None
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
class InvalidParamsError(JSONRPCError):
|
|
264
|
+
code: int = -32602
|
|
265
|
+
message: str = "Invalid parameters"
|
|
266
|
+
data: Any | None = None
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class InternalError(JSONRPCError):
|
|
270
|
+
code: int = -32603
|
|
271
|
+
message: str = "Internal error"
|
|
272
|
+
data: Any | None = None
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class TaskNotFoundError(JSONRPCError):
|
|
276
|
+
code: int = -32001
|
|
277
|
+
message: str = "Task not found"
|
|
278
|
+
data: None = None
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class TaskNotCancelableError(JSONRPCError):
|
|
282
|
+
code: int = -32002
|
|
283
|
+
message: str = "Task cannot be canceled"
|
|
284
|
+
data: None = None
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class PushNotificationNotSupportedError(JSONRPCError):
|
|
288
|
+
code: int = -32003
|
|
289
|
+
message: str = "Push Notification is not supported"
|
|
290
|
+
data: None = None
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
class UnsupportedOperationError(JSONRPCError):
|
|
294
|
+
code: int = -32004
|
|
295
|
+
message: str = "This operation is not supported"
|
|
296
|
+
data: None = None
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
class ContentTypeNotSupportedError(JSONRPCError):
|
|
300
|
+
code: int = -32005
|
|
301
|
+
message: str = "Incompatible content types"
|
|
302
|
+
data: None = None
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class AgentProvider(BaseModel):
|
|
306
|
+
organization: str
|
|
307
|
+
url: str | None = None
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
class AgentCapabilities(BaseModel):
|
|
311
|
+
streaming: bool = False
|
|
312
|
+
pushNotifications: bool = False
|
|
313
|
+
stateTransitionHistory: bool = False
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
class AgentAuthentication(BaseModel):
|
|
317
|
+
schemes: List[str]
|
|
318
|
+
credentials: str | None = None
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
class AgentSkill(BaseModel):
|
|
322
|
+
id: str
|
|
323
|
+
name: str
|
|
324
|
+
description: str | None = None
|
|
325
|
+
tags: List[str] | None = None
|
|
326
|
+
examples: List[str] | None = None
|
|
327
|
+
inputModes: List[str] | None = None
|
|
328
|
+
outputModes: List[str] | None = None
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
class AgentCard(BaseModel):
|
|
332
|
+
name: str
|
|
333
|
+
description: str | None = None
|
|
334
|
+
url: str
|
|
335
|
+
provider: AgentProvider | None = None
|
|
336
|
+
version: str
|
|
337
|
+
documentationUrl: str | None = None
|
|
338
|
+
capabilities: AgentCapabilities
|
|
339
|
+
authentication: AgentAuthentication | None = None
|
|
340
|
+
defaultInputModes: List[str] = ["text"]
|
|
341
|
+
defaultOutputModes: List[str] = ["text"]
|
|
342
|
+
skills: List[AgentSkill]
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
class A2AClientError(Exception):
|
|
346
|
+
pass
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class A2AClientHTTPError(A2AClientError):
|
|
350
|
+
def __init__(self, status_code: int, message: str):
|
|
351
|
+
self.status_code = status_code
|
|
352
|
+
self.message = message
|
|
353
|
+
super().__init__(f"HTTP Error {status_code}: {message}")
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
class A2AClientJSONError(A2AClientError):
|
|
357
|
+
def __init__(self, message: str):
|
|
358
|
+
self.message = message
|
|
359
|
+
super().__init__(f"JSON Error: {message}")
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
class MissingAPIKeyError(Exception):
|
|
363
|
+
"""Exception for missing API key."""
|
|
364
|
+
|
|
365
|
+
pass
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
TEXT_BY_SUBTYPE = {
|
|
2
|
+
"plan": "To determine the distribution of companies by size, we first need to identify the relevant table and column that contains information about company sizes. Let's start by listing the tables in the database to find the appropriate one.",
|
|
3
|
+
"query": "Sales_Data_Expert_Demo_Data.public.`call_summaries`, Sales_Data_Expert_Demo_Data.public.`prospects_details`",
|
|
4
|
+
"curate": "To find the distribution of companies by size, we should examine the `prospects_details` table, as it likely contains information about potential customers, including company size. Let's first check the schema of the `prospects_details` table to identify the relevant column for company size.",
|
|
5
|
+
"validate": "Table named `Sales_Data_Expert_Demo_Data.public.prospects_details`:\n\nSample with first 3 rows from table Sales_Data_Expert_Demo_Data.public.prospects_details in CSV format (dialect is 'excel'):\n\nid,created_at,first_name,last_name,email,company,job_title,company_size,use_case\r\n1,2025-01-16 13:55:03,Alexandra,Dixon,alexandra.dixon@harveypayneandhudson.com,\"Harvey, Payne and Hudson\",Manager,Medium company (500-999 employees),Looking into predictive analytics for customer behavior\r\n2,2025-01-28 08:01:46,David,Clark,david.clark@boyd-hernandez.com,Boyd-Hernandez,CEO,Medium company (500-999 employees),Looking into predictive analytics for customer behavior\r\n3,2025-02-03 03:37:12,Jason,Mcmillan,jason.mcmillan@stokesandsons.com,Stokes and Sons,Marketing Manager,Small company (100-499 employees),Interested in AI search over my data\r\n\n\nColumn data types: \n`id` : `MYSQL_DATA_TYPE.INT`,\t\n`created_at` : `MYSQL_DATA_TYPE.DATETIME`,\t\n`first_name` : `MYSQL_DATA_TYPE.TEXT`,\t\n`last_name` : `MYSQL_DATA_TYPE.TEXT`,\t\n`email` : `MYSQL_DATA_TYPE.TEXT`,\t\n`company` : `MYSQL_DATA_TYPE.TEXT`,\t\n`job_title` : `MYSQL_DATA_TYPE.TEXT`,\t\n`company_size` : `MYSQL_DATA_TYPE.TEXT`,\t\n`use_case` : `MYSQL_DATA_TYPE.TEXT`\n",
|
|
6
|
+
"respond": "The `prospects_details` table contains a `company_size` column, which is what we need to determine the distribution of companies by size. Let's first retrieve the distinct values in the `company_size` column to understand the categories available, and then calculate the distribution.",
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
DEFAULT_STREAM_TIMEOUT = 300
|