alita-sdk 0.3.435__tar.gz → 0.3.437__tar.gz
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 alita-sdk might be problematic. Click here for more details.
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/PKG-INFO +1 -1
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/mcp.py +150 -18
- alita_sdk-0.3.437/alita_sdk/runtime/tools/mcp_remote_tool.py +177 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/mcp_server_tool.py +9 -76
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk.egg-info/PKG-INFO +1 -1
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk.egg-info/SOURCES.txt +1 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/pyproject.toml +1 -1
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/LICENSE +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/README.md +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/community/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/community/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/ado.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/azure_search.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/bigquery.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/bitbucket.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/browser.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/carrier.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/confluence.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/delta_lake.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/embedding.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/figma.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/github.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/gitlab.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/google_places.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/jira.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/pgvector.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/postman.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/qtest.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/rally.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/report_portal.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/salesforce.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/service_now.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/sharepoint.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/slack.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/sonar.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/sql.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/testio.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/testrail.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/xray.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/zephyr.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/zephyr_enterprise.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/configurations/zephyr_essential.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/artifact.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/datasource.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/mcp_discovery.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/mcp_manager.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/prompt.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/clients/sandbox_client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/agents/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/agents/xml_chat.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/assistant.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/chat_message_template.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/constants.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaBDDScenariosLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaCSVLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaConfluenceLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaDirectoryLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaGitRepoLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/ImageParser.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/constants.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/document_loaders/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/indexer.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/interfaces/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/interfaces/kwextractor.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/interfaces/llm_processor.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/interfaces/loaders.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/interfaces/splitters.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/langraph_agent.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/mixedAgentParser.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/mixedAgentRenderes.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/retrievers/AlitaRetriever.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/retrievers/VectorstoreRetriever.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/retrievers/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/store_manager.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/bdd_parser/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_exceptions.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_parser.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/bdd_parser/parser.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/git.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/log.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/quota.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/state.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/tools/vector.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/langchain/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/llms/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/llms/preloaded.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/models/mcp_models.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/application.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/artifact.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/configurations.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/datasource.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/prompt.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/subgraph.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/tools.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/toolkits/vectorstore.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/agent.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/application.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/artifact.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/datasource.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/echo.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/function.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/graph.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/image_generation.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/indexer_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/llm.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/loop.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/loop_output.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/mcp_inspect_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/pgvector_search.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/prompt.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/router.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/sandbox.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/vectorstore.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/tools/vectorstore_base.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/AlitaCallback.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/constants.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/evaluate.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/logging.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/save_dataframe.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/streamlit.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/toolkit_runtime.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/toolkit_utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/runtime/utils/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/repos/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/repos/repos_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/test_plan/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/wiki/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/wiki/ado_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/work_item/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ado/work_item/ado_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/advanced_jira_mining/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/aws/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/aws/delta_lake/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/aws/delta_lake/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/aws/delta_lake/schemas.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/aws/delta_lake/tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/azure_ai/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/azure_ai/search/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/azure_ai/search/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/base/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/base/tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/base_indexer_toolkit.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/bitbucket/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/bitbucket/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/bitbucket/bitbucket_constants.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/bitbucket/cloud_api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/browser/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/browser/crawler.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/browser/duck_duck_go_search.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/browser/google_search_rag.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/browser/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/browser/wiki.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/backend_reports_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/backend_tests_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/cancel_ui_test_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/carrier_sdk.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/create_ui_excel_report_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/create_ui_test_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/excel_reporter.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/lighthouse_excel_reporter.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/run_ui_test_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/tickets_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/tools.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/ui_reports_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/update_ui_test_schedule_tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/carrier/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/codeparser.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/constants.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_c.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cpp.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cs.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_go.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_hs.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_java.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_js.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_kt.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_py.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rb.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_registry.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rs.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/code/treesitter/treesitter_ts.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/models.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/sematic/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/sematic/base.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/sematic/json_chunker.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/sematic/markdown_chunker.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/sematic/proposal_chunker.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/sematic/statistical_chunker.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/chunkers/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/aws/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/aws/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/azure/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/azure/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/gcp/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/gcp/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/k8s/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/cloud/k8s/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/code/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/code/linter/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/code/linter/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/code/loaders/codesearcher.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/code/sonar/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/code/sonar/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/code_indexer_toolkit.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/confluence/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/confluence/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/confluence/loader.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/confluence/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/custom_open_api/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/custom_open_api/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/elastic/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/elastic/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/elitea_base.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/figma/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/figma/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/github/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/github/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/github/github_client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/github/graphql_client_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/github/schemas.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/github/tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/github/tool_prompts.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gitlab/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gitlab/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gitlab/tools.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gitlab/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gitlab_org/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gitlab_org/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gmail/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gmail/gmail_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/gmail/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/google/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/google/bigquery/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/google/bigquery/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/google/bigquery/schemas.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/google/bigquery/tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/google_places/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/google_places/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/jira/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/jira/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/keycloak/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/keycloak/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/llm/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/llm/img_utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/llm/llm_utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/localgit/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/localgit/local_git.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/localgit/tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/memory/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/non_code_indexer_toolkit.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ocr/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ocr/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/ocr/text_detection.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/openapi/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/errors.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/executor/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/executor/code_environment.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/executor/code_executor.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/generator/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/generator/base.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/generator/code_cleaning.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/generator/code_validator.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/prompts.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/serializer.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/dataframe/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/statsmodels/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/statsmodels/base_stats.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/statsmodels/descriptive.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/statsmodels/hypothesis_testing.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pandas/statsmodels/regression.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/postman/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/postman/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/postman/postman_analysis.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pptx/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/pptx/pptx_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/qtest/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/qtest/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/qtest/tool.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/rally/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/rally/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/report_portal/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/report_portal/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/report_portal/report_portal_client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/salesforce/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/salesforce/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/salesforce/model.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/servicenow/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/servicenow/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/servicenow/servicenow_client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/sharepoint/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/sharepoint/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/sharepoint/authorization_helper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/sharepoint/utils.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/slack/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/slack/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/sql/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/sql/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/sql/models.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/testio/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/testio/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/testrail/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/testrail/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/utils/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/utils/available_tools_decorator.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/utils/content_parser.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/vector_adapters/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/xray/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/xray/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/yagmail/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/yagmail/yagmail_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr/Zephyr.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr/rest_client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_enterprise/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_enterprise/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_essential/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_essential/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_essential/client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_scale/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_scale/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_squad/__init__.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_squad/api_wrapper.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk.egg-info/dependency_links.txt +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk.egg-info/requires.txt +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/alita_sdk.egg-info/top_level.txt +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/setup.cfg +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/tests/test_ado_analysis.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/tests/test_github_analysis.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/tests/test_gitlab_analysis.py +0 -0
- {alita_sdk-0.3.435 → alita_sdk-0.3.437}/tests/test_jira_analysis.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alita_sdk
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.437
|
|
4
4
|
Summary: SDK for building langchain agents using resources from Alita
|
|
5
5
|
Author-email: Artem Rozumenko <artyom.rozumenko@gmail.com>, Mikalai Biazruchka <mikalai_biazruchka@epam.com>, Roman Mitusov <roman_mitusov@epam.com>, Ivan Krakhmaliuk <lifedj27@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -5,6 +5,7 @@ Following MCP specification: https://modelcontextprotocol.io/specification/2025-
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import logging
|
|
8
|
+
import re
|
|
8
9
|
import requests
|
|
9
10
|
from typing import List, Optional, Any, Dict, Literal, ClassVar
|
|
10
11
|
|
|
@@ -12,6 +13,7 @@ from langchain_core.tools import BaseToolkit, BaseTool
|
|
|
12
13
|
from pydantic import BaseModel, ConfigDict, Field
|
|
13
14
|
|
|
14
15
|
from ..tools.mcp_server_tool import McpServerTool
|
|
16
|
+
from ..tools.mcp_remote_tool import McpRemoteTool
|
|
15
17
|
from ..tools.mcp_inspect_tool import McpInspectTool
|
|
16
18
|
from ...tools.utils import TOOLKIT_SPLITTER, clean_string
|
|
17
19
|
from ..models.mcp_models import McpConnectionConfig
|
|
@@ -20,6 +22,119 @@ logger = logging.getLogger(__name__)
|
|
|
20
22
|
|
|
21
23
|
name = "mcp"
|
|
22
24
|
|
|
25
|
+
def safe_int(value, default):
|
|
26
|
+
"""Convert value to int, handling string inputs."""
|
|
27
|
+
if value is None:
|
|
28
|
+
return default
|
|
29
|
+
try:
|
|
30
|
+
return int(value)
|
|
31
|
+
except (ValueError, TypeError):
|
|
32
|
+
logger.warning(f"Invalid integer value '{value}', using default {default}")
|
|
33
|
+
return default
|
|
34
|
+
|
|
35
|
+
def optimize_tool_name(prefix: str, tool_name: str, max_total_length: int = 64) -> str:
|
|
36
|
+
"""
|
|
37
|
+
Optimize tool name to fit within max_total_length while preserving meaning.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
prefix: The toolkit prefix (already cleaned)
|
|
41
|
+
tool_name: The original tool name
|
|
42
|
+
max_total_length: Maximum total length for the full tool name (default: 64)
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Optimized full tool name in format: prefix___tool_name
|
|
46
|
+
"""
|
|
47
|
+
splitter = TOOLKIT_SPLITTER
|
|
48
|
+
splitter_len = len(splitter)
|
|
49
|
+
prefix_len = len(prefix)
|
|
50
|
+
|
|
51
|
+
# Calculate available space for tool name
|
|
52
|
+
available_space = max_total_length - prefix_len - splitter_len
|
|
53
|
+
|
|
54
|
+
if available_space <= 0:
|
|
55
|
+
logger.error(f"Prefix '{prefix}' is too long ({prefix_len} chars), cannot create valid tool name")
|
|
56
|
+
# Fallback: truncate prefix itself
|
|
57
|
+
prefix = prefix[:max_total_length - splitter_len - 10] # Leave 10 chars for tool name
|
|
58
|
+
available_space = max_total_length - len(prefix) - splitter_len
|
|
59
|
+
|
|
60
|
+
# If tool name fits, use it as-is
|
|
61
|
+
if len(tool_name) <= available_space:
|
|
62
|
+
return f'{prefix}{splitter}{tool_name}'
|
|
63
|
+
|
|
64
|
+
# Tool name is too long, need to optimize
|
|
65
|
+
logger.debug(f"Tool name '{tool_name}' is too long ({len(tool_name)} chars), optimizing to fit {available_space} chars")
|
|
66
|
+
|
|
67
|
+
# Split tool name into parts (handle camelCase, snake_case, and mixed)
|
|
68
|
+
# First, split by underscores and hyphens
|
|
69
|
+
parts = re.split(r'[_-]', tool_name)
|
|
70
|
+
|
|
71
|
+
# Further split camelCase within each part
|
|
72
|
+
all_parts = []
|
|
73
|
+
for part in parts:
|
|
74
|
+
# Insert underscore before uppercase letters (camelCase to snake_case)
|
|
75
|
+
snake_case_part = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', part)
|
|
76
|
+
all_parts.extend(snake_case_part.split('_'))
|
|
77
|
+
|
|
78
|
+
# Filter out empty parts
|
|
79
|
+
all_parts = [p for p in all_parts if p]
|
|
80
|
+
|
|
81
|
+
# Remove redundant prefix words (case-insensitive comparison)
|
|
82
|
+
# Only remove if prefix is meaningful (>= 3 chars) to avoid over-filtering
|
|
83
|
+
prefix_lower = prefix.lower()
|
|
84
|
+
filtered_parts = []
|
|
85
|
+
for part in all_parts:
|
|
86
|
+
part_lower = part.lower()
|
|
87
|
+
# Skip if this part contains the prefix or the prefix contains this part
|
|
88
|
+
# But only if both are meaningful (>= 3 chars)
|
|
89
|
+
should_remove = False
|
|
90
|
+
if len(prefix_lower) >= 3 and len(part_lower) >= 3:
|
|
91
|
+
if part_lower in prefix_lower or prefix_lower in part_lower:
|
|
92
|
+
should_remove = True
|
|
93
|
+
logger.debug(f"Removing redundant part '{part}' (matches prefix '{prefix}')")
|
|
94
|
+
|
|
95
|
+
if not should_remove:
|
|
96
|
+
filtered_parts.append(part)
|
|
97
|
+
|
|
98
|
+
# If we removed all parts, keep the original parts
|
|
99
|
+
if not filtered_parts:
|
|
100
|
+
filtered_parts = all_parts
|
|
101
|
+
|
|
102
|
+
# Reconstruct tool name with filtered parts
|
|
103
|
+
optimized_name = '_'.join(filtered_parts)
|
|
104
|
+
|
|
105
|
+
# If still too long, truncate intelligently
|
|
106
|
+
if len(optimized_name) > available_space:
|
|
107
|
+
# Strategy: Keep beginning and end, as they often contain the most important info
|
|
108
|
+
# For example: "projectalita_github_io_list_branches" -> "projectalita_list_branches"
|
|
109
|
+
|
|
110
|
+
# Try removing middle parts first
|
|
111
|
+
if len(filtered_parts) > 2:
|
|
112
|
+
# Keep first and last parts, remove middle
|
|
113
|
+
kept_parts = [filtered_parts[0], filtered_parts[-1]]
|
|
114
|
+
optimized_name = '_'.join(kept_parts)
|
|
115
|
+
|
|
116
|
+
# If still too long, add parts from the end until we run out of space
|
|
117
|
+
if len(optimized_name) <= available_space and len(filtered_parts) > 2:
|
|
118
|
+
for i in range(len(filtered_parts) - 2, 0, -1):
|
|
119
|
+
candidate = '_'.join([filtered_parts[0]] + filtered_parts[i:])
|
|
120
|
+
if len(candidate) <= available_space:
|
|
121
|
+
optimized_name = candidate
|
|
122
|
+
break
|
|
123
|
+
|
|
124
|
+
# If still too long, just truncate
|
|
125
|
+
if len(optimized_name) > available_space:
|
|
126
|
+
# Try to truncate at word boundary
|
|
127
|
+
truncated = optimized_name[:available_space]
|
|
128
|
+
last_underscore = truncated.rfind('_')
|
|
129
|
+
if last_underscore > available_space * 0.7: # Keep if we're not losing too much
|
|
130
|
+
optimized_name = truncated[:last_underscore]
|
|
131
|
+
else:
|
|
132
|
+
optimized_name = truncated
|
|
133
|
+
|
|
134
|
+
full_name = f'{prefix}{splitter}{optimized_name}'
|
|
135
|
+
logger.info(f"Optimized tool name: '{tool_name}' ({len(tool_name)} chars) -> '{optimized_name}' ({len(optimized_name)} chars), full: '{full_name}' ({len(full_name)} chars)")
|
|
136
|
+
|
|
137
|
+
return full_name
|
|
23
138
|
|
|
24
139
|
class McpToolkit(BaseToolkit):
|
|
25
140
|
"""
|
|
@@ -277,6 +392,7 @@ class McpToolkit(BaseToolkit):
|
|
|
277
392
|
server_tool = cls._create_tool_from_dict(
|
|
278
393
|
tool_dict=tool_metadata,
|
|
279
394
|
toolkit_name=toolkit_name,
|
|
395
|
+
connection_config=connection_config,
|
|
280
396
|
timeout=timeout,
|
|
281
397
|
client=client
|
|
282
398
|
)
|
|
@@ -480,6 +596,7 @@ class McpToolkit(BaseToolkit):
|
|
|
480
596
|
cls,
|
|
481
597
|
tool_dict: Dict[str, Any],
|
|
482
598
|
toolkit_name: str,
|
|
599
|
+
connection_config: McpConnectionConfig,
|
|
483
600
|
timeout: int,
|
|
484
601
|
client
|
|
485
602
|
) -> Optional[BaseTool]:
|
|
@@ -491,23 +608,34 @@ class McpToolkit(BaseToolkit):
|
|
|
491
608
|
# Clean toolkit name for prefixing
|
|
492
609
|
clean_prefix = clean_string(toolkit_name, max_length_value)
|
|
493
610
|
|
|
494
|
-
|
|
611
|
+
# Optimize tool name to fit within 64 character limit
|
|
612
|
+
full_tool_name = optimize_tool_name(clean_prefix, tool_dict.get("name", "unknown"))
|
|
495
613
|
|
|
496
614
|
# Check if this is a prompt (converted to tool)
|
|
497
615
|
is_prompt = tool_dict.get("_mcp_type") == "prompt"
|
|
498
616
|
item_type = "prompt" if is_prompt else "tool"
|
|
499
617
|
|
|
500
|
-
|
|
618
|
+
# Build description and ensure it doesn't exceed 1000 characters
|
|
619
|
+
description = f"MCP {item_type} '{tool_dict.get('name')}' from toolkit '{toolkit_name}': {tool_dict.get('description', '')}"
|
|
620
|
+
if len(description) > 1000:
|
|
621
|
+
description = description[:997] + "..."
|
|
622
|
+
logger.debug(f"Trimmed description for tool '{tool_dict.get('name')}' from {len(description)} to 1000 chars")
|
|
623
|
+
|
|
624
|
+
# Use McpRemoteTool for remote MCP servers (HTTP/SSE)
|
|
625
|
+
return McpRemoteTool(
|
|
501
626
|
name=full_tool_name,
|
|
502
|
-
description=
|
|
627
|
+
description=description,
|
|
503
628
|
args_schema=McpServerTool.create_pydantic_model_from_schema(
|
|
504
629
|
tool_dict.get("inputSchema", {})
|
|
505
630
|
),
|
|
506
631
|
client=client,
|
|
507
632
|
server=toolkit_name,
|
|
633
|
+
server_url=connection_config.url,
|
|
634
|
+
server_headers=connection_config.headers,
|
|
508
635
|
tool_timeout_sec=timeout,
|
|
509
636
|
is_prompt=is_prompt,
|
|
510
|
-
prompt_name=tool_dict.get("_mcp_prompt_name") if is_prompt else None
|
|
637
|
+
prompt_name=tool_dict.get("_mcp_prompt_name") if is_prompt else None,
|
|
638
|
+
original_tool_name=tool_dict.get('name') # Store original name for MCP server invocation
|
|
511
639
|
)
|
|
512
640
|
except Exception as e:
|
|
513
641
|
logger.error(f"Failed to create MCP tool '{tool_dict.get('name')}' from toolkit '{toolkit_name}': {e}")
|
|
@@ -596,11 +724,18 @@ class McpToolkit(BaseToolkit):
|
|
|
596
724
|
|
|
597
725
|
# Clean server name for prefixing (use tool_metadata.server instead of toolkit_name)
|
|
598
726
|
clean_prefix = clean_string(tool_metadata.server, max_length_value)
|
|
599
|
-
|
|
727
|
+
# Optimize tool name to fit within 64 character limit
|
|
728
|
+
full_tool_name = optimize_tool_name(clean_prefix, tool_metadata.name)
|
|
729
|
+
|
|
730
|
+
# Build description and ensure it doesn't exceed 1000 characters
|
|
731
|
+
description = f"MCP tool '{tool_metadata.name}' from server '{tool_metadata.server}': {tool_metadata.description}"
|
|
732
|
+
if len(description) > 1000:
|
|
733
|
+
description = description[:997] + "..."
|
|
734
|
+
logger.debug(f"Trimmed description for tool '{tool_metadata.name}' from {len(description)} to 1000 chars")
|
|
600
735
|
|
|
601
736
|
return McpServerTool(
|
|
602
737
|
name=full_tool_name,
|
|
603
|
-
description=
|
|
738
|
+
description=description,
|
|
604
739
|
args_schema=McpServerTool.create_pydantic_model_from_schema(tool_metadata.input_schema),
|
|
605
740
|
client=client,
|
|
606
741
|
server=tool_metadata.server,
|
|
@@ -626,11 +761,18 @@ class McpToolkit(BaseToolkit):
|
|
|
626
761
|
# Clean toolkit name for prefixing
|
|
627
762
|
clean_prefix = clean_string(toolkit_name, max_length_value)
|
|
628
763
|
|
|
629
|
-
|
|
764
|
+
# Optimize tool name to fit within 64 character limit
|
|
765
|
+
full_tool_name = optimize_tool_name(clean_prefix, available_tool["name"])
|
|
766
|
+
|
|
767
|
+
# Build description and ensure it doesn't exceed 1000 characters
|
|
768
|
+
description = f"MCP tool '{available_tool['name']}' from toolkit '{toolkit_name}': {available_tool.get('description', '')}"
|
|
769
|
+
if len(description) > 1000:
|
|
770
|
+
description = description[:997] + "..."
|
|
771
|
+
logger.debug(f"Trimmed description for tool '{available_tool['name']}' from {len(description)} to 1000 chars")
|
|
630
772
|
|
|
631
773
|
return McpServerTool(
|
|
632
774
|
name=full_tool_name,
|
|
633
|
-
description=
|
|
775
|
+
description=description,
|
|
634
776
|
args_schema=McpServerTool.create_pydantic_model_from_schema(
|
|
635
777
|
available_tool.get("inputSchema", {})
|
|
636
778
|
),
|
|
@@ -736,16 +878,6 @@ def get_tools(tool_config: dict, alita_client, llm=None, memory_store=None) -> L
|
|
|
736
878
|
return []
|
|
737
879
|
|
|
738
880
|
# Type conversion for numeric settings that may come as strings from config
|
|
739
|
-
def safe_int(value, default):
|
|
740
|
-
"""Convert value to int, handling string inputs."""
|
|
741
|
-
if value is None:
|
|
742
|
-
return default
|
|
743
|
-
try:
|
|
744
|
-
return int(value)
|
|
745
|
-
except (ValueError, TypeError):
|
|
746
|
-
logger.warning(f"Invalid integer value '{value}', using default {default}")
|
|
747
|
-
return default
|
|
748
|
-
|
|
749
881
|
return McpToolkit.get_toolkit(
|
|
750
882
|
url=url,
|
|
751
883
|
headers=headers,
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MCP Remote Tool for direct HTTP/SSE invocation.
|
|
3
|
+
This tool is used for remote MCP servers accessed via HTTP/SSE.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import asyncio
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
import time
|
|
10
|
+
import uuid
|
|
11
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
12
|
+
from typing import Any, Dict, Optional
|
|
13
|
+
|
|
14
|
+
from .mcp_server_tool import McpServerTool
|
|
15
|
+
from pydantic import Field
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class McpRemoteTool(McpServerTool):
|
|
21
|
+
"""
|
|
22
|
+
Tool for invoking remote MCP server tools via HTTP/SSE.
|
|
23
|
+
Extends McpServerTool and overrides _run to use direct HTTP calls instead of client.mcp_tool_call.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
# Remote MCP connection details
|
|
27
|
+
server_url: str = Field(..., description="URL of the remote MCP server")
|
|
28
|
+
server_headers: Optional[Dict[str, str]] = Field(default=None, description="HTTP headers for authentication")
|
|
29
|
+
original_tool_name: Optional[str] = Field(default=None, description="Original tool name from MCP server (before optimization)")
|
|
30
|
+
is_prompt: bool = False # Flag to indicate if this is a prompt tool
|
|
31
|
+
prompt_name: Optional[str] = None # Original prompt name if this is a prompt
|
|
32
|
+
|
|
33
|
+
def __getstate__(self):
|
|
34
|
+
"""Custom serialization for pickle compatibility."""
|
|
35
|
+
state = super().__getstate__()
|
|
36
|
+
# Ensure headers are serializable
|
|
37
|
+
if 'server_headers' in state and state['server_headers'] is not None:
|
|
38
|
+
state['server_headers'] = dict(state['server_headers'])
|
|
39
|
+
return state
|
|
40
|
+
|
|
41
|
+
def _run(self, *args, **kwargs):
|
|
42
|
+
"""
|
|
43
|
+
Execute the MCP tool via direct HTTP/SSE call to the remote server.
|
|
44
|
+
Overrides the parent method to avoid using client.mcp_tool_call.
|
|
45
|
+
"""
|
|
46
|
+
try:
|
|
47
|
+
# Always create a new event loop for sync context
|
|
48
|
+
with ThreadPoolExecutor() as executor:
|
|
49
|
+
future = executor.submit(self._run_in_new_loop, kwargs)
|
|
50
|
+
return future.result(timeout=self.tool_timeout_sec)
|
|
51
|
+
except Exception as e:
|
|
52
|
+
logger.error(f"Error executing remote MCP tool '{self.name}': {e}")
|
|
53
|
+
return f"Error executing tool: {e}"
|
|
54
|
+
|
|
55
|
+
def _run_in_new_loop(self, kwargs: Dict[str, Any]) -> str:
|
|
56
|
+
"""Run the async tool invocation in a new event loop."""
|
|
57
|
+
return asyncio.run(self._execute_remote_tool(kwargs))
|
|
58
|
+
|
|
59
|
+
async def _execute_remote_tool(self, kwargs: Dict[str, Any]) -> str:
|
|
60
|
+
"""Execute the actual remote MCP tool call."""
|
|
61
|
+
import aiohttp
|
|
62
|
+
from ...tools.utils import TOOLKIT_SPLITTER
|
|
63
|
+
|
|
64
|
+
# Use the original tool name from discovery for MCP server invocation
|
|
65
|
+
# The MCP server doesn't know about our optimized names
|
|
66
|
+
tool_name_for_server = self.original_tool_name
|
|
67
|
+
|
|
68
|
+
# Fallback: extract from optimized name if original not stored (backwards compatibility)
|
|
69
|
+
if not tool_name_for_server:
|
|
70
|
+
tool_name_for_server = self.name.rsplit(TOOLKIT_SPLITTER, 1)[-1] if TOOLKIT_SPLITTER in self.name else self.name
|
|
71
|
+
logger.warning(f"original_tool_name not set for '{self.name}', using extracted name: {tool_name_for_server}")
|
|
72
|
+
|
|
73
|
+
# Build the MCP request based on whether this is a prompt or tool
|
|
74
|
+
if self.is_prompt:
|
|
75
|
+
# For prompts, use prompts/get endpoint
|
|
76
|
+
mcp_request = {
|
|
77
|
+
"jsonrpc": "2.0",
|
|
78
|
+
"id": f"prompt_get_{int(time.time())}_{uuid.uuid4().hex[:8]}",
|
|
79
|
+
"method": "prompts/get",
|
|
80
|
+
"params": {
|
|
81
|
+
"name": self.prompt_name or tool_name_for_server.replace("prompt_", ""),
|
|
82
|
+
"arguments": kwargs.get("arguments", kwargs)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else:
|
|
86
|
+
# For regular tools, use tools/call endpoint
|
|
87
|
+
mcp_request = {
|
|
88
|
+
"jsonrpc": "2.0",
|
|
89
|
+
"id": f"tool_call_{int(time.time())}_{uuid.uuid4().hex[:8]}",
|
|
90
|
+
"method": "tools/call",
|
|
91
|
+
"params": {
|
|
92
|
+
"name": tool_name_for_server,
|
|
93
|
+
"arguments": kwargs
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
# Set up headers
|
|
98
|
+
headers = {
|
|
99
|
+
"Content-Type": "application/json",
|
|
100
|
+
"Accept": "application/json, text/event-stream"
|
|
101
|
+
}
|
|
102
|
+
if self.server_headers:
|
|
103
|
+
headers.update(self.server_headers)
|
|
104
|
+
|
|
105
|
+
# Execute the HTTP request
|
|
106
|
+
timeout = aiohttp.ClientTimeout(total=self.tool_timeout_sec)
|
|
107
|
+
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
108
|
+
try:
|
|
109
|
+
logger.debug(f"Calling remote MCP tool '{tool_name_for_server}' (optimized name: '{self.name}') at {self.server_url}")
|
|
110
|
+
logger.debug(f"Request: {json.dumps(mcp_request, indent=2)}")
|
|
111
|
+
|
|
112
|
+
async with session.post(self.server_url, json=mcp_request, headers=headers) as response:
|
|
113
|
+
if response.status != 200:
|
|
114
|
+
error_text = await response.text()
|
|
115
|
+
raise Exception(f"HTTP {response.status}: {error_text}")
|
|
116
|
+
|
|
117
|
+
# Handle both JSON and SSE responses
|
|
118
|
+
content_type = response.headers.get('Content-Type', '')
|
|
119
|
+
if 'text/event-stream' in content_type:
|
|
120
|
+
# Parse SSE format
|
|
121
|
+
text = await response.text()
|
|
122
|
+
data = self._parse_sse(text)
|
|
123
|
+
else:
|
|
124
|
+
# Parse regular JSON
|
|
125
|
+
data = await response.json()
|
|
126
|
+
|
|
127
|
+
logger.debug(f"Response: {json.dumps(data, indent=2)}")
|
|
128
|
+
|
|
129
|
+
# Check for MCP error
|
|
130
|
+
if "error" in data:
|
|
131
|
+
error = data["error"]
|
|
132
|
+
error_msg = error.get("message", str(error))
|
|
133
|
+
raise Exception(f"MCP Error: {error_msg}")
|
|
134
|
+
|
|
135
|
+
# Extract result
|
|
136
|
+
result = data.get("result", {})
|
|
137
|
+
|
|
138
|
+
# Format the result based on content type
|
|
139
|
+
if isinstance(result, dict):
|
|
140
|
+
# Check for content array (common in MCP responses)
|
|
141
|
+
if "content" in result:
|
|
142
|
+
content_items = result["content"]
|
|
143
|
+
if isinstance(content_items, list):
|
|
144
|
+
# Extract text from content items
|
|
145
|
+
text_parts = []
|
|
146
|
+
for item in content_items:
|
|
147
|
+
if isinstance(item, dict):
|
|
148
|
+
if item.get("type") == "text" and "text" in item:
|
|
149
|
+
text_parts.append(item["text"])
|
|
150
|
+
elif "text" in item:
|
|
151
|
+
text_parts.append(item["text"])
|
|
152
|
+
else:
|
|
153
|
+
text_parts.append(json.dumps(item))
|
|
154
|
+
else:
|
|
155
|
+
text_parts.append(str(item))
|
|
156
|
+
return "\n".join(text_parts)
|
|
157
|
+
|
|
158
|
+
# Return formatted JSON if no content field
|
|
159
|
+
return json.dumps(result, indent=2)
|
|
160
|
+
|
|
161
|
+
# Return as string for other types
|
|
162
|
+
return str(result)
|
|
163
|
+
|
|
164
|
+
except asyncio.TimeoutError:
|
|
165
|
+
raise Exception(f"Tool execution timed out after {self.tool_timeout_sec}s")
|
|
166
|
+
except Exception as e:
|
|
167
|
+
logger.error(f"Error calling remote MCP tool '{tool_name_for_server}': {e}", exc_info=True)
|
|
168
|
+
raise
|
|
169
|
+
|
|
170
|
+
def _parse_sse(self, text: str) -> Dict[str, Any]:
|
|
171
|
+
"""Parse Server-Sent Events (SSE) format response."""
|
|
172
|
+
for line in text.split('\n'):
|
|
173
|
+
line = line.strip()
|
|
174
|
+
if line.startswith('data:'):
|
|
175
|
+
json_str = line[5:].strip()
|
|
176
|
+
return json.loads(json_str)
|
|
177
|
+
raise ValueError("No data found in SSE response")
|
|
@@ -15,63 +15,12 @@ class McpServerTool(BaseTool):
|
|
|
15
15
|
description: str
|
|
16
16
|
args_schema: Optional[Type[BaseModel]] = None
|
|
17
17
|
return_type: str = "str"
|
|
18
|
-
client: Any
|
|
18
|
+
client: Any
|
|
19
19
|
server: str
|
|
20
20
|
tool_timeout_sec: int = 60
|
|
21
|
-
is_prompt: bool = False # Flag to indicate if this is a prompt tool
|
|
22
|
-
prompt_name: Optional[str] = None # Original prompt name if this is a prompt
|
|
23
21
|
|
|
24
22
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
25
23
|
|
|
26
|
-
def __getstate__(self):
|
|
27
|
-
"""Custom serialization to exclude non-serializable objects."""
|
|
28
|
-
state = self.__dict__.copy()
|
|
29
|
-
# Remove the client since it contains threading objects that can't be pickled
|
|
30
|
-
state['client'] = None
|
|
31
|
-
# Store args_schema as a schema dict instead of the dynamic class
|
|
32
|
-
if hasattr(self, 'args_schema') and self.args_schema is not None:
|
|
33
|
-
# Convert the Pydantic model back to schema dict for pickling
|
|
34
|
-
try:
|
|
35
|
-
state['_args_schema_dict'] = self.args_schema.model_json_schema()
|
|
36
|
-
state['args_schema'] = None
|
|
37
|
-
except Exception as e:
|
|
38
|
-
logger.warning(f"Failed to serialize args_schema: {e}")
|
|
39
|
-
# If conversion fails, just remove it
|
|
40
|
-
state['args_schema'] = None
|
|
41
|
-
state['_args_schema_dict'] = {}
|
|
42
|
-
return state
|
|
43
|
-
|
|
44
|
-
def __setstate__(self, state):
|
|
45
|
-
"""Custom deserialization to handle missing objects."""
|
|
46
|
-
# Restore the args_schema from the stored schema dict
|
|
47
|
-
args_schema_dict = state.pop('_args_schema_dict', {})
|
|
48
|
-
|
|
49
|
-
# Initialize required Pydantic internal attributes
|
|
50
|
-
if '__pydantic_fields_set__' not in state:
|
|
51
|
-
state['__pydantic_fields_set__'] = set(state.keys())
|
|
52
|
-
if '__pydantic_extra__' not in state:
|
|
53
|
-
state['__pydantic_extra__'] = None
|
|
54
|
-
if '__pydantic_private__' not in state:
|
|
55
|
-
state['__pydantic_private__'] = None
|
|
56
|
-
|
|
57
|
-
# Directly update the object's __dict__ to bypass Pydantic validation
|
|
58
|
-
self.__dict__.update(state)
|
|
59
|
-
|
|
60
|
-
# Recreate the args_schema from the stored dict if available
|
|
61
|
-
if args_schema_dict:
|
|
62
|
-
try:
|
|
63
|
-
recreated_schema = self.create_pydantic_model_from_schema(args_schema_dict)
|
|
64
|
-
self.__dict__['args_schema'] = recreated_schema
|
|
65
|
-
except Exception as e:
|
|
66
|
-
logger.warning(f"Failed to recreate args_schema: {e}")
|
|
67
|
-
self.__dict__['args_schema'] = None
|
|
68
|
-
else:
|
|
69
|
-
self.__dict__['args_schema'] = None
|
|
70
|
-
|
|
71
|
-
# Note: client will be None after unpickling
|
|
72
|
-
# The toolkit should reinitialize the client when needed
|
|
73
|
-
|
|
74
|
-
|
|
75
24
|
@staticmethod
|
|
76
25
|
def create_pydantic_model_from_schema(schema: dict, model_name: str = "ArgsSchema"):
|
|
77
26
|
def parse_type(field: dict, name: str = "Field") -> Any:
|
|
@@ -143,30 +92,14 @@ class McpServerTool(BaseTool):
|
|
|
143
92
|
|
|
144
93
|
def _run(self, *args, **kwargs):
|
|
145
94
|
# Extract the actual tool/prompt name (remove toolkit prefix)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
"
|
|
152
|
-
"
|
|
153
|
-
"tool_call_id": str(uuid.uuid4()),
|
|
154
|
-
"method": "prompts/get",
|
|
155
|
-
"params": {
|
|
156
|
-
"name": self.prompt_name or actual_name.replace("prompt_", ""),
|
|
157
|
-
"arguments": kwargs.get("arguments", kwargs)
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
else:
|
|
161
|
-
# For regular tools, use tools/call endpoint
|
|
162
|
-
call_data = {
|
|
163
|
-
"server": self.server,
|
|
164
|
-
"tool_timeout_sec": self.tool_timeout_sec,
|
|
165
|
-
"tool_call_id": str(uuid.uuid4()),
|
|
166
|
-
"params": {
|
|
167
|
-
"name": actual_name,
|
|
168
|
-
"arguments": kwargs
|
|
169
|
-
}
|
|
95
|
+
call_data = {
|
|
96
|
+
"server": self.server,
|
|
97
|
+
"tool_timeout_sec": self.tool_timeout_sec,
|
|
98
|
+
"tool_call_id": str(uuid.uuid4()),
|
|
99
|
+
"params": {
|
|
100
|
+
"name": self.name.rsplit(TOOLKIT_SPLITTER)[1] if TOOLKIT_SPLITTER in self.name else self.name,
|
|
101
|
+
"arguments": kwargs
|
|
170
102
|
}
|
|
103
|
+
}
|
|
171
104
|
|
|
172
105
|
return self.client.mcp_tool_call(call_data)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alita_sdk
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.437
|
|
4
4
|
Summary: SDK for building langchain agents using resources from Alita
|
|
5
5
|
Author-email: Artem Rozumenko <artyom.rozumenko@gmail.com>, Mikalai Biazruchka <mikalai_biazruchka@epam.com>, Roman Mitusov <roman_mitusov@epam.com>, Ivan Krakhmaliuk <lifedj27@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -130,6 +130,7 @@ alita_sdk/runtime/tools/llm.py
|
|
|
130
130
|
alita_sdk/runtime/tools/loop.py
|
|
131
131
|
alita_sdk/runtime/tools/loop_output.py
|
|
132
132
|
alita_sdk/runtime/tools/mcp_inspect_tool.py
|
|
133
|
+
alita_sdk/runtime/tools/mcp_remote_tool.py
|
|
133
134
|
alita_sdk/runtime/tools/mcp_server_tool.py
|
|
134
135
|
alita_sdk/runtime/tools/pgvector_search.py
|
|
135
136
|
alita_sdk/runtime/tools/prompt.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|