alita-sdk 0.3.343__tar.gz → 0.3.345__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.343 → alita_sdk-0.3.345}/PKG-INFO +2 -2
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/clients/client.py +2 -1
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +11 -3
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/langraph_agent.py +1 -1
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/artifact.py +1 -1
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/application.py +6 -2
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/artifact.py +2 -2
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +7 -2
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/figma/api_wrapper.py +43 -10
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/github/github_client.py +13 -10
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/jira/api_wrapper.py +47 -42
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/testrail/api_wrapper.py +83 -9
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk.egg-info/PKG-INFO +2 -2
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk.egg-info/requires.txt +1 -1
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/pyproject.toml +2 -2
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/LICENSE +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/README.md +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/community/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/community/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/ado.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/azure_search.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/bigquery.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/bitbucket.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/browser.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/carrier.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/confluence.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/delta_lake.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/embedding.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/figma.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/github.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/gitlab.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/google_places.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/jira.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/pgvector.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/postman.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/qtest.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/rally.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/report_portal.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/salesforce.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/service_now.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/sharepoint.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/slack.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/sonar.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/sql.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/testio.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/testrail.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/xray.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/zephyr.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/zephyr_enterprise.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/configurations/zephyr_essential.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/clients/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/clients/artifact.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/clients/datasource.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/clients/prompt.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/agents/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/agents/xml_chat.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/assistant.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/chat_message_template.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/constants.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaBDDScenariosLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaCSVLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaConfluenceLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaDirectoryLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaGitRepoLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/ImageParser.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/constants.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/document_loaders/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/indexer.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/interfaces/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/interfaces/kwextractor.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/interfaces/llm_processor.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/interfaces/loaders.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/interfaces/splitters.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/mixedAgentParser.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/mixedAgentRenderes.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/retrievers/AlitaRetriever.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/retrievers/VectorstoreRetriever.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/retrievers/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/store_manager.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/bdd_parser/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_exceptions.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/bdd_parser/bdd_parser.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/bdd_parser/parser.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/git.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/log.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/quota.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/state.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/tools/vector.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/langchain/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/llms/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/llms/preloaded.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/application.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/configurations.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/datasource.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/prompt.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/subgraph.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/tools.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/toolkits/vectorstore.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/agent.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/datasource.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/echo.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/function.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/graph.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/indexer_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/llm.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/loop.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/loop_output.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/mcp_server_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/pgvector_search.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/prompt.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/router.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/sandbox.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/vectorstore.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/tools/vectorstore_base.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/AlitaCallback.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/constants.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/evaluate.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/logging.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/save_dataframe.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/streamlit.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/toolkit_runtime.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/toolkit_utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/runtime/utils/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/repos/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/repos/repos_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/test_plan/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/wiki/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/wiki/ado_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/work_item/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ado/work_item/ado_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/advanced_jira_mining/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/advanced_jira_mining/data_mining_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/aws/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/aws/delta_lake/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/aws/delta_lake/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/aws/delta_lake/schemas.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/aws/delta_lake/tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/azure_ai/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/azure_ai/search/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/azure_ai/search/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/base/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/base/tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/base_indexer_toolkit.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/bitbucket/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/bitbucket/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/bitbucket/bitbucket_constants.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/bitbucket/cloud_api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/browser/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/browser/crawler.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/browser/duck_duck_go_search.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/browser/google_search_rag.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/browser/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/browser/wiki.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/backend_reports_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/backend_tests_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/cancel_ui_test_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/carrier_sdk.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/create_ui_excel_report_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/create_ui_test_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/excel_reporter.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/lighthouse_excel_reporter.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/run_ui_test_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/tickets_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/tools.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/ui_reports_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/update_ui_test_schedule_tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/carrier/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/codeparser.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/constants.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_c.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cpp.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_cs.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_go.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_hs.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_java.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_js.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_kt.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_py.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rb.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_registry.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_rs.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/code/treesitter/treesitter_ts.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/models.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/sematic/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/sematic/base.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/sematic/json_chunker.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/sematic/markdown_chunker.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/sematic/proposal_chunker.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/sematic/statistical_chunker.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/chunkers/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/aws/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/aws/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/azure/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/azure/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/gcp/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/gcp/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/k8s/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/cloud/k8s/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/code/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/code/linter/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/code/linter/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/code/loaders/codesearcher.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/code/sonar/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/code/sonar/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/confluence/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/confluence/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/confluence/loader.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/confluence/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/custom_open_api/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/custom_open_api/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/elastic/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/elastic/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/elitea_base.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/figma/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/github/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/github/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/github/graphql_client_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/github/schemas.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/github/tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/github/tool_prompts.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gitlab/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gitlab/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gitlab/tools.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gitlab/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gitlab_org/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gitlab_org/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gmail/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gmail/gmail_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/gmail/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/google/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/google/bigquery/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/google/bigquery/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/google/bigquery/schemas.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/google/bigquery/tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/google_places/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/google_places/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/jira/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/keycloak/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/keycloak/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/llm/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/llm/img_utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/llm/llm_utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/localgit/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/localgit/local_git.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/localgit/tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/memory/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/non_code_indexer_toolkit.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ocr/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ocr/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/ocr/text_detection.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/openapi/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/errors.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/executor/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/executor/code_environment.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/executor/code_executor.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/generator/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/generator/base.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/generator/code_cleaning.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/generator/code_validator.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/prompts.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/serializer.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/dataframe/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/statsmodels/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/statsmodels/base_stats.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/statsmodels/descriptive.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/statsmodels/hypothesis_testing.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pandas/statsmodels/regression.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/postman/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/postman/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/postman/postman_analysis.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pptx/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/pptx/pptx_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/qtest/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/qtest/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/qtest/tool.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/rally/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/rally/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/report_portal/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/report_portal/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/report_portal/report_portal_client.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/salesforce/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/salesforce/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/salesforce/model.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/servicenow/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/servicenow/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/servicenow/servicenow_client.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/sharepoint/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/sharepoint/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/sharepoint/authorization_helper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/sharepoint/utils.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/slack/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/slack/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/sql/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/sql/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/sql/models.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/testio/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/testio/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/testrail/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/utils/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/utils/available_tools_decorator.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/utils/content_parser.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/vector_adapters/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/xray/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/xray/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/yagmail/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/yagmail/yagmail_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr/Zephyr.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr/rest_client.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_enterprise/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_enterprise/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_essential/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_essential/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_essential/client.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_scale/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_scale/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_squad/__init__.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_squad/api_wrapper.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk.egg-info/SOURCES.txt +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk.egg-info/dependency_links.txt +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/alita_sdk.egg-info/top_level.txt +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/setup.cfg +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/tests/test_ado_analysis.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/tests/test_github_analysis.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/tests/test_gitlab_analysis.py +0 -0
- {alita_sdk-0.3.343 → alita_sdk-0.3.345}/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.345
|
|
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
|
|
@@ -82,7 +82,7 @@ Requires-Dist: gitpython==3.1.43; extra == "tools"
|
|
|
82
82
|
Requires-Dist: atlassian-python-api~=4.0.7; extra == "tools"
|
|
83
83
|
Requires-Dist: jira==3.8.0; extra == "tools"
|
|
84
84
|
Requires-Dist: qtest-swagger-client==0.0.3; extra == "tools"
|
|
85
|
-
Requires-Dist: testrail-api==1.13.
|
|
85
|
+
Requires-Dist: testrail-api==1.13.4; extra == "tools"
|
|
86
86
|
Requires-Dist: azure-devops==7.1.0b4; extra == "tools"
|
|
87
87
|
Requires-Dist: msrest==0.7.1; extra == "tools"
|
|
88
88
|
Requires-Dist: python-graphql-client~=0.4.3; extra == "tools"
|
|
@@ -349,7 +349,8 @@ class AlitaClient:
|
|
|
349
349
|
return self._process_requst(resp)
|
|
350
350
|
|
|
351
351
|
def list_artifacts(self, bucket_name: str):
|
|
352
|
-
|
|
352
|
+
# Ensure bucket name is lowercase as required by the API
|
|
353
|
+
url = f'{self.artifacts_url}/{bucket_name.lower()}'
|
|
353
354
|
data = requests.get(url, headers=self.headers, verify=False)
|
|
354
355
|
return self._process_requst(data)
|
|
355
356
|
|
|
@@ -36,15 +36,23 @@ class AlitaPowerPointLoader:
|
|
|
36
36
|
def read_pptx_slide(self, slide, index):
|
|
37
37
|
text_content = f'Slide: {index}\n'
|
|
38
38
|
for shape in slide.shapes:
|
|
39
|
-
if hasattr(shape, "
|
|
40
|
-
|
|
39
|
+
if hasattr(shape, "text_frame") and shape.text_frame is not None:
|
|
40
|
+
for paragraph in shape.text_frame.paragraphs:
|
|
41
|
+
for run in paragraph.runs:
|
|
42
|
+
if run.hyperlink and run.hyperlink.address:
|
|
43
|
+
link_text = run.text.strip() or "Link"
|
|
44
|
+
link_url = run.hyperlink.address
|
|
45
|
+
text_content += f" [{link_text}]({link_url}) "
|
|
46
|
+
else:
|
|
47
|
+
text_content += run.text
|
|
48
|
+
text_content += "\n"
|
|
41
49
|
elif self.extract_images and shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
|
|
42
50
|
try:
|
|
43
51
|
caption = perform_llm_prediction_for_image_bytes(shape.image.blob, self.llm)
|
|
44
52
|
except:
|
|
45
53
|
caption = "unknown"
|
|
46
54
|
text_content += "\n**Image Transcript:**\n" + caption + "\n--------------------\n"
|
|
47
|
-
return text_content
|
|
55
|
+
return text_content + "\n"
|
|
48
56
|
|
|
49
57
|
def load(self):
|
|
50
58
|
if not self.file_path:
|
|
@@ -747,7 +747,7 @@ class LangGraphAgentRunnable(CompiledStateGraph):
|
|
|
747
747
|
if input.get('input'):
|
|
748
748
|
current_message = input.get('input')[-1]
|
|
749
749
|
# TODO: add handler after we add 2+ inputs (filterByType, etc.)
|
|
750
|
-
input['input'] = current_message
|
|
750
|
+
input['input'] = current_message if isinstance(current_message, str) else str(current_message)
|
|
751
751
|
if input.get('messages'):
|
|
752
752
|
# Ensure existing messages are LangChain objects
|
|
753
753
|
input['messages'] = [convert_dict_to_message(msg) for msg in input['messages']]
|
|
@@ -6,7 +6,7 @@ from langchain_core.tools import BaseTool
|
|
|
6
6
|
from pydantic import create_model, BaseModel, ConfigDict, Field
|
|
7
7
|
from pydantic.fields import FieldInfo
|
|
8
8
|
from ..tools.artifact import ArtifactWrapper
|
|
9
|
-
from
|
|
9
|
+
from ...tools.base.tool import BaseAction
|
|
10
10
|
from ...configurations.pgvector import PgVectorConfiguration
|
|
11
11
|
|
|
12
12
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
|
|
3
3
|
from ..utils.utils import clean_string
|
|
4
|
-
from langchain_core.tools import BaseTool
|
|
4
|
+
from langchain_core.tools import BaseTool, ToolException
|
|
5
5
|
from langchain_core.messages import BaseMessage, AIMessage, HumanMessage
|
|
6
6
|
from typing import Any, Type, Optional
|
|
7
7
|
from pydantic import create_model, field_validator, BaseModel
|
|
@@ -31,7 +31,11 @@ def formulate_query(kwargs):
|
|
|
31
31
|
chat_history = []
|
|
32
32
|
for each in kwargs.get('chat_history')[:]:
|
|
33
33
|
chat_history.append(AIMessage(each))
|
|
34
|
-
|
|
34
|
+
user_task = kwargs.get('task')
|
|
35
|
+
if not user_task:
|
|
36
|
+
raise ToolException("Task is required to invoke the application. "
|
|
37
|
+
"Check the provided input (some errors may happen on previous steps).")
|
|
38
|
+
input_message = HumanMessage(content=user_task)
|
|
35
39
|
result = {"input": [input_message], "chat_history": chat_history}
|
|
36
40
|
for key, value in kwargs.items():
|
|
37
41
|
if key not in ("task", "chat_history"):
|
|
@@ -7,8 +7,8 @@ from langchain_core.documents import Document
|
|
|
7
7
|
from langchain_core.tools import ToolException
|
|
8
8
|
from pydantic import create_model, Field, model_validator
|
|
9
9
|
|
|
10
|
-
from
|
|
11
|
-
from
|
|
10
|
+
from ...tools.non_code_indexer_toolkit import NonCodeIndexerToolkit
|
|
11
|
+
from ...tools.utils.available_tools_decorator import extend_with_parent_available_tools
|
|
12
12
|
from ...runtime.utils.utils import IndexerKeywords
|
|
13
13
|
|
|
14
14
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
+
import re
|
|
3
4
|
import xml.etree.ElementTree as ET
|
|
4
5
|
from typing import Generator, Literal, Optional, List
|
|
5
6
|
|
|
@@ -384,6 +385,10 @@ class TestPlanApiWrapper(NonCodeIndexerToolkit):
|
|
|
384
385
|
field_dicts = case.get('work_item', {}).get('work_item_fields', [])
|
|
385
386
|
data = {k: v for d in field_dicts for k, v in d.items()}
|
|
386
387
|
if chunking_tool:
|
|
388
|
+
steps = data.get('Microsoft.VSTS.TCM.Steps', '')
|
|
389
|
+
# Remove XML declaration if present (like <?xml version="1.0" encoding="utf-16"?>) to avoid encoding issues
|
|
390
|
+
steps_no_decl = re.sub(r'<\?xml[^>]*\?>', '', steps, count=1).lstrip()
|
|
391
|
+
|
|
387
392
|
yield Document(
|
|
388
393
|
page_content='',
|
|
389
394
|
metadata={
|
|
@@ -394,7 +399,7 @@ class TestPlanApiWrapper(NonCodeIndexerToolkit):
|
|
|
394
399
|
'description': data.get('System.Description', ''),
|
|
395
400
|
'updated_on': data.get('System.Rev', ''),
|
|
396
401
|
# content is in metadata for chunking tool post-processing
|
|
397
|
-
IndexerKeywords.CONTENT_IN_BYTES.value:
|
|
402
|
+
IndexerKeywords.CONTENT_IN_BYTES.value: steps_no_decl.encode("utf-8")
|
|
398
403
|
})
|
|
399
404
|
else:
|
|
400
405
|
yield Document(
|
|
@@ -411,7 +416,7 @@ class TestPlanApiWrapper(NonCodeIndexerToolkit):
|
|
|
411
416
|
def _index_tool_params(self):
|
|
412
417
|
"""Return the parameters for indexing data."""
|
|
413
418
|
return {
|
|
414
|
-
'chunking_tool': (Literal['
|
|
419
|
+
'chunking_tool': (Literal['xml', ''], Field(description="Name of chunking tool", default='xml')),
|
|
415
420
|
"plan_id": (int, Field(description="ID of the test plan for which test cases are requested")),
|
|
416
421
|
"suite_ids": (Optional[List[int]], Field(description='List of test suite IDs for which test cases are requested '
|
|
417
422
|
'(can be empty for all suites indexing from the plan). '
|
|
@@ -227,9 +227,9 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
|
|
|
227
227
|
self._log_tool_event(f"Loading files: {file_keys_include}")
|
|
228
228
|
for file_key in file_keys_include:
|
|
229
229
|
self._log_tool_event(f"Loading file `{file_key}`")
|
|
230
|
-
file = self._client.get_file(file_key)
|
|
230
|
+
file = self._client.get_file(file_key, geometry='depth=1') # fetch only top-level structure (only pages without inner components)
|
|
231
231
|
if not file:
|
|
232
|
-
raise ToolException(f"Unexpected error while retrieving file {file_key}.
|
|
232
|
+
raise ToolException(f"Unexpected error while retrieving file {file_key}. Please try specifying the node-id of an inner page.")
|
|
233
233
|
metadata = {
|
|
234
234
|
'id': file_key,
|
|
235
235
|
'file_key': file_key,
|
|
@@ -284,20 +284,47 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
|
|
|
284
284
|
for child in node['children']:
|
|
285
285
|
texts.extend(self.get_texts_recursive(child))
|
|
286
286
|
return texts
|
|
287
|
+
|
|
288
|
+
def _load_pages(self, document: Document):
|
|
289
|
+
file_key = document.metadata.get('id', '')
|
|
290
|
+
node_ids_include = document.metadata.pop('figma_pages_include', [])
|
|
291
|
+
node_ids_exclude = document.metadata.pop('figma_pages_exclude', [])
|
|
292
|
+
self._log_tool_event(f"Included pages: {node_ids_include}. Excluded pages: {node_ids_exclude}.")
|
|
293
|
+
if node_ids_include:
|
|
294
|
+
# try to fetch only specified pages/nodes in one request
|
|
295
|
+
file = self._get_file_nodes(file_key,','.join(node_ids_include)) # attempt to fetch only specified pages/nodes in one request
|
|
296
|
+
if file:
|
|
297
|
+
return [node['document'] for node in file.get('nodes', {}).values() if 'document' in node]
|
|
298
|
+
else:
|
|
299
|
+
#
|
|
300
|
+
file = self._client.get_file(file_key)
|
|
301
|
+
if file:
|
|
302
|
+
figma_pages = file.document.get('children', [])
|
|
303
|
+
return [node for node in figma_pages if ('id' in node and node['id'].replace(':', '-') not in node_ids_exclude)]
|
|
304
|
+
# fallback to loading all pages and filtering them one by one
|
|
305
|
+
file = self._client.get_file(file_key, geometry='depth=1')
|
|
306
|
+
if not file:
|
|
307
|
+
raise ToolException(
|
|
308
|
+
f"Unexpected error while retrieving file {file_key}. Please try specifying the node-id of an inner page.")
|
|
309
|
+
figma_pages_raw = file.document.get('children', [])
|
|
310
|
+
# extract pages one by one
|
|
311
|
+
if node_ids_include:
|
|
312
|
+
return [self._get_file_nodes(file_key, node_id) for node_id in node_ids_include]
|
|
313
|
+
else:
|
|
314
|
+
# return [self._get_file_nodes(file_key, page["id"]) for page in figma_pages_raw if ('id' in page and page['id'].replace(':', '-') not in node_ids_exclude)]
|
|
315
|
+
result = []
|
|
316
|
+
for page in figma_pages_raw:
|
|
317
|
+
if 'id' in page and page['id'].replace(':', '-') not in node_ids_exclude:
|
|
318
|
+
page_res = self._get_file_nodes(file_key, page["id"]).get('nodes', {}).get(page["id"], {}).get("document", {})
|
|
319
|
+
result.append(page_res)
|
|
320
|
+
return result
|
|
287
321
|
|
|
288
322
|
def _process_document(self, document: Document) -> Generator[Document, None, None]:
|
|
289
323
|
file_key = document.metadata.get('id', '')
|
|
290
324
|
self._log_tool_event(f"Loading details (images) for `{file_key}`")
|
|
291
|
-
figma_pages = self.
|
|
292
|
-
node_ids_include = document.metadata.pop('figma_pages_include', [])
|
|
293
|
-
node_ids_exclude = document.metadata.pop('figma_pages_exclude', [])
|
|
325
|
+
figma_pages = self._load_pages(document)
|
|
294
326
|
node_types_include = [t.strip().lower() for t in document.metadata.pop('figma_nodes_include', [])]
|
|
295
327
|
node_types_exclude = [t.strip().lower() for t in document.metadata.pop('figma_nodes_exclude', [])]
|
|
296
|
-
self._log_tool_event(f"Included pages: {node_ids_include}. Excluded pages: {node_ids_exclude}.")
|
|
297
|
-
if node_ids_include:
|
|
298
|
-
figma_pages = [node for node in figma_pages if ('id' in node and node['id'].replace(':', '-') in node_ids_include)]
|
|
299
|
-
elif node_ids_exclude:
|
|
300
|
-
figma_pages = [node for node in figma_pages if ('id' in node and node['id'].replace(':', '-') not in node_ids_exclude)]
|
|
301
328
|
|
|
302
329
|
image_nodes = []
|
|
303
330
|
text_nodes = {}
|
|
@@ -609,6 +636,12 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
|
|
|
609
636
|
f"files/{file_key}/nodes?ids={str(ids)}", method="get"
|
|
610
637
|
)
|
|
611
638
|
|
|
639
|
+
def _get_file_nodes(self, file_key: str, ids: str, **kwargs):
|
|
640
|
+
"""Reads a specified file nodes by field key from Figma."""
|
|
641
|
+
return self._client.api_request(
|
|
642
|
+
f"files/{file_key}/nodes?ids={str(ids)}", method="get"
|
|
643
|
+
)
|
|
644
|
+
|
|
612
645
|
@process_output
|
|
613
646
|
def get_file(
|
|
614
647
|
self,
|
|
@@ -87,7 +87,6 @@ class GitHubClient(BaseModel):
|
|
|
87
87
|
|
|
88
88
|
# Using optional variables with None defaults instead of PrivateAttr
|
|
89
89
|
github_api: Optional[Github] = Field(default=None, exclude=True)
|
|
90
|
-
github_repo_instance: Optional[Repository.Repository] = Field(default=None, exclude=True)
|
|
91
90
|
|
|
92
91
|
# Adding auth config and repo config as optional fields for initialization
|
|
93
92
|
auth_config: Optional[GitHubAuthConfig] = Field(default=None, exclude=True)
|
|
@@ -96,6 +95,19 @@ class GitHubClient(BaseModel):
|
|
|
96
95
|
# Alita instance
|
|
97
96
|
alita: Optional[Any] = Field(default=None, exclude=True)
|
|
98
97
|
|
|
98
|
+
@property
|
|
99
|
+
def github_repo_instance(self) -> Optional[Repository.Repository]:
|
|
100
|
+
if not hasattr(self, "_github_repo_instance") or self._github_repo_instance is None:
|
|
101
|
+
try:
|
|
102
|
+
if self.github_api and self.github_repository:
|
|
103
|
+
self._github_repo_instance = self.github_api.get_repo(self.github_repository)
|
|
104
|
+
else:
|
|
105
|
+
self._github_repo_instance = None
|
|
106
|
+
except Exception as e:
|
|
107
|
+
# Only raise when accessed, not during initialization
|
|
108
|
+
return ToolException(e)
|
|
109
|
+
return self._github_repo_instance
|
|
110
|
+
|
|
99
111
|
@model_validator(mode='before')
|
|
100
112
|
def initialize_github_client(cls, values):
|
|
101
113
|
"""
|
|
@@ -144,15 +156,6 @@ class GitHubClient(BaseModel):
|
|
|
144
156
|
else:
|
|
145
157
|
values["github_api"] = Github(base_url=values["github_base_url"], auth=auth)
|
|
146
158
|
|
|
147
|
-
# Get repository instance
|
|
148
|
-
if values.get("github_repository"):
|
|
149
|
-
values["github_repo_instance"] = values["github_api"].get_repo(values["github_repository"])
|
|
150
|
-
else:
|
|
151
|
-
# Initialize with default authentication if no auth_config provided
|
|
152
|
-
values["github_api"] = Github(base_url=values.get("github_base_url", DEFAULT_BASE_URL))
|
|
153
|
-
if values.get("github_repository"):
|
|
154
|
-
values["github_repo_instance"] = values["github_api"].get_repo(values["github_repository"])
|
|
155
|
-
|
|
156
159
|
return values
|
|
157
160
|
|
|
158
161
|
@staticmethod
|
|
@@ -1043,27 +1043,39 @@ class JiraApiWrapper(NonCodeIndexerToolkit):
|
|
|
1043
1043
|
|
|
1044
1044
|
def _extract_image_data(self, field_data):
|
|
1045
1045
|
"""
|
|
1046
|
-
Extracts image data from general JSON response
|
|
1046
|
+
Extracts image data from general JSON response.
|
|
1047
|
+
Handles lists, dicts with image info, and plain strings.
|
|
1047
1048
|
"""
|
|
1048
|
-
if isinstance(field_data,
|
|
1049
|
-
return
|
|
1050
|
-
if
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1049
|
+
if isinstance(field_data, list):
|
|
1050
|
+
return ' '.join(self._extract_image_data(item) for item in field_data)
|
|
1051
|
+
if isinstance(field_data, dict):
|
|
1052
|
+
if 'filename' in field_data and 'content' in field_data:
|
|
1053
|
+
return f"!{field_data['filename']}|alt={field_data['filename']}!"
|
|
1054
|
+
if 'content' in field_data and isinstance(field_data['content'], list):
|
|
1055
|
+
result = []
|
|
1056
|
+
for content_item in field_data['content']:
|
|
1057
|
+
if (
|
|
1058
|
+
isinstance(content_item, dict)
|
|
1059
|
+
and 'content' in content_item
|
|
1060
|
+
and isinstance(content_item['content'], list)
|
|
1061
|
+
and content_item['content']
|
|
1062
|
+
):
|
|
1063
|
+
if content_item.get('type') == 'mediaSingle':
|
|
1064
|
+
media = content_item['content'][0]
|
|
1065
|
+
attrs = media.get('attrs', {})
|
|
1066
|
+
if attrs.get('type') == 'file':
|
|
1067
|
+
alt = attrs.get('alt', '')
|
|
1068
|
+
image_str = f'!{alt}|alt="{alt}"!'
|
|
1069
|
+
result.append(image_str)
|
|
1070
|
+
elif content_item.get('type') == 'paragraph':
|
|
1071
|
+
result.append(content_item['content'][0].get('text', ''))
|
|
1072
|
+
else:
|
|
1073
|
+
result.append(self._extract_image_data(content_item))
|
|
1074
|
+
return '\n'.join(result)
|
|
1075
|
+
return f"Unsupported format of field content."
|
|
1076
|
+
if isinstance(field_data, str):
|
|
1077
|
+
return field_data
|
|
1078
|
+
return f"Unsupported field content type: {type(field_data)}. Expected a string, list, or dict."
|
|
1067
1079
|
|
|
1068
1080
|
def get_field_with_image_descriptions(self, jira_issue_key: str, field_name: str, prompt: Optional[str] = None,
|
|
1069
1081
|
context_radius: int = 500):
|
|
@@ -1098,12 +1110,7 @@ class JiraApiWrapper(NonCodeIndexerToolkit):
|
|
|
1098
1110
|
return f"Unable to find field '{field_name}' or it's empty. Available fields are: {existing_fields_str}"
|
|
1099
1111
|
|
|
1100
1112
|
# Handle multiple images or non-string content
|
|
1101
|
-
|
|
1102
|
-
field_content = ' '.join(map(self._extract_image_data, field_content))
|
|
1103
|
-
elif isinstance(field_content, dict):
|
|
1104
|
-
field_content = self._extract_image_data(field_content)
|
|
1105
|
-
elif not isinstance(field_content, str):
|
|
1106
|
-
return f"Unsupported field content type: {type(field_content)}. Expected a string, list, or dict."
|
|
1113
|
+
field_content = self._extract_image_data(field_content)
|
|
1107
1114
|
|
|
1108
1115
|
# Regular expression to find image references in Jira markup
|
|
1109
1116
|
image_pattern = r'!([^!|]+)(?:\|[^!]*)?!'
|
|
@@ -1237,24 +1244,22 @@ class JiraApiWrapper(NonCodeIndexerToolkit):
|
|
|
1237
1244
|
|
|
1238
1245
|
comment_author = comment.get('author', {}).get('displayName', 'Unknown')
|
|
1239
1246
|
comment_created = comment.get('created', 'Unknown date')
|
|
1247
|
+
comment_body = self._extract_image_data(comment_body)
|
|
1240
1248
|
|
|
1241
1249
|
# Process the comment body by replacing image references with descriptions
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
except Exception as e:
|
|
1256
|
-
logger.error(f"Error processing image references in comment: {str(e)}")
|
|
1257
|
-
# TODO process comment in api 3 format
|
|
1250
|
+
processed_body = re.sub(image_pattern,
|
|
1251
|
+
lambda match: self.process_image_match(match, comment_body, attachment_resolver, context_radius, prompt),
|
|
1252
|
+
comment_body)
|
|
1253
|
+
|
|
1254
|
+
# Add the processed comment to our results
|
|
1255
|
+
processed_comments.append({
|
|
1256
|
+
"author": comment_author,
|
|
1257
|
+
"created": comment_created,
|
|
1258
|
+
"id": comment.get('id'),
|
|
1259
|
+
"original_content": comment_body,
|
|
1260
|
+
"processed_content": processed_body
|
|
1261
|
+
})
|
|
1262
|
+
|
|
1258
1263
|
return processed_comments
|
|
1259
1264
|
|
|
1260
1265
|
def get_comments_with_image_descriptions(self, jira_issue_key: str, prompt: Optional[str] = None, context_radius: int = 500):
|
|
@@ -10,7 +10,7 @@ from pydantic import SecretStr, create_model, model_validator
|
|
|
10
10
|
from pydantic.fields import Field, PrivateAttr
|
|
11
11
|
from testrail_api import StatusCodeError, TestRailAPI
|
|
12
12
|
|
|
13
|
-
from ..chunkers.code.constants import get_file_extension
|
|
13
|
+
from ..chunkers.code.constants import get_file_extension, image_extensions
|
|
14
14
|
from ..non_code_indexer_toolkit import NonCodeIndexerToolkit
|
|
15
15
|
from ..utils.available_tools_decorator import extend_with_parent_available_tools
|
|
16
16
|
from ...runtime.utils.utils import IndexerKeywords
|
|
@@ -117,6 +117,13 @@ getCases = create_model(
|
|
|
117
117
|
description="A list of case field keys to include in the data output. If None, defaults to ['title', 'id'].",
|
|
118
118
|
),
|
|
119
119
|
),
|
|
120
|
+
suite_id=(Optional[str],
|
|
121
|
+
Field(
|
|
122
|
+
default=None,
|
|
123
|
+
description="[Optional] Suite id for test cases extraction in case "
|
|
124
|
+
"project is in multiple suite mode (setting 3)",
|
|
125
|
+
),
|
|
126
|
+
),
|
|
120
127
|
)
|
|
121
128
|
|
|
122
129
|
getCasesByFilter = create_model(
|
|
@@ -323,6 +330,30 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
323
330
|
cls._client = TestRailAPI(url, email, password)
|
|
324
331
|
return super().validate_toolkit(values)
|
|
325
332
|
|
|
333
|
+
def _validate_suite_mode_requirements(self, project_id: str, suite_id: Optional[str] = None) -> None:
|
|
334
|
+
"""
|
|
335
|
+
Validate if project requires suite_id when in multiple suite mode.
|
|
336
|
+
|
|
337
|
+
Args:
|
|
338
|
+
project_id: The TestRail project ID to check
|
|
339
|
+
suite_id: The suite ID if provided (optional)
|
|
340
|
+
custom_error_msg: Custom error message to use (optional)
|
|
341
|
+
|
|
342
|
+
Raises:
|
|
343
|
+
ToolException: If project is in multiple suite mode and no suite_id is provided
|
|
344
|
+
"""
|
|
345
|
+
if suite_id:
|
|
346
|
+
return # No validation needed if suite_id is already provided
|
|
347
|
+
|
|
348
|
+
try:
|
|
349
|
+
project = self._client.projects.get_project(project_id=project_id)
|
|
350
|
+
# 1 for single suite mode, 2 for single suite + baselines, 3 for multiple suites
|
|
351
|
+
suite_mode = project.get('suite_mode', 1)
|
|
352
|
+
if suite_mode == 3:
|
|
353
|
+
raise ToolException("Project is in multiple suite mode, please provide suite_id to extract test cases.")
|
|
354
|
+
except StatusCodeError as e:
|
|
355
|
+
logger.warning(f"Unable to check project suite mode: {e}")
|
|
356
|
+
|
|
326
357
|
def add_cases(self, add_test_cases_data: str):
|
|
327
358
|
"""Adds new test cases into Testrail per defined parameters.
|
|
328
359
|
add_test_cases_data: str - JSON string which includes list of objects with following parameters:
|
|
@@ -389,7 +420,8 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
389
420
|
return f"Extracted test case:\n{str(extracted_case)}"
|
|
390
421
|
|
|
391
422
|
def get_cases(
|
|
392
|
-
self, project_id: str, output_format: str = "json", keys: Optional[List[str]] = None
|
|
423
|
+
self, project_id: str, output_format: str = "json", keys: Optional[List[str]] = None,
|
|
424
|
+
suite_id: Optional[str] = None
|
|
393
425
|
) -> Union[str, ToolException]:
|
|
394
426
|
"""
|
|
395
427
|
Extracts a list of test cases in the specified format: `json`, `csv`, or `markdown`.
|
|
@@ -410,8 +442,15 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
410
442
|
invalid_keys = [key for key in keys if key not in SUPPORTED_KEYS]
|
|
411
443
|
|
|
412
444
|
try:
|
|
413
|
-
|
|
414
|
-
|
|
445
|
+
# Check if project requires suite_id for multiple suite mode
|
|
446
|
+
self._validate_suite_mode_requirements(
|
|
447
|
+
project_id=project_id,
|
|
448
|
+
suite_id=suite_id
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
extracted_cases = self._client.cases.get_cases(project_id=project_id, suite_id=suite_id)
|
|
452
|
+
# support old versions of testrail_api
|
|
453
|
+
cases = extracted_cases.get("cases") if isinstance(extracted_cases, dict) else extracted_cases
|
|
415
454
|
|
|
416
455
|
if cases is None:
|
|
417
456
|
return ToolException("No test cases found in the extracted data.")
|
|
@@ -466,10 +505,18 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
466
505
|
"json_case_arguments must be a JSON string or dictionary."
|
|
467
506
|
)
|
|
468
507
|
self._log_tool_event(message=f"Extract test cases per filter {params}", tool_name='get_cases_by_filter')
|
|
508
|
+
|
|
509
|
+
# Check if project requires suite_id when not provided in params
|
|
510
|
+
suite_id_in_params = params.get('suite_id', None)
|
|
511
|
+
self._validate_suite_mode_requirements(
|
|
512
|
+
project_id=project_id,
|
|
513
|
+
suite_id=str(suite_id_in_params) if suite_id_in_params else None
|
|
514
|
+
)
|
|
515
|
+
|
|
469
516
|
extracted_cases = self._client.cases.get_cases(
|
|
470
517
|
project_id=project_id, **params
|
|
471
518
|
)
|
|
472
|
-
self._log_tool_event(message=
|
|
519
|
+
self._log_tool_event(message="Test cases were extracted", tool_name='get_cases_by_filter')
|
|
473
520
|
# support old versions of testrail_api
|
|
474
521
|
cases = extracted_cases.get("cases") if isinstance(extracted_cases, dict) else extracted_cases
|
|
475
522
|
|
|
@@ -542,13 +589,21 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
542
589
|
self._include_attachments = kwargs.get('include_attachments', False)
|
|
543
590
|
self._skip_attachment_extensions = kwargs.get('skip_attachment_extensions', [])
|
|
544
591
|
|
|
592
|
+
def _extract_cases_from_response(response):
|
|
593
|
+
"""Extract cases from API response, supporting both old and new testrail_api versions."""
|
|
594
|
+
return response.get('cases', []) if isinstance(response, dict) else response
|
|
595
|
+
|
|
545
596
|
try:
|
|
597
|
+
# Check if project requires suite_id when not provided
|
|
598
|
+
self._validate_suite_mode_requirements(project_id=project_id, suite_id=suite_id)
|
|
599
|
+
|
|
546
600
|
if suite_id:
|
|
547
601
|
resp = self._client.cases.get_cases(project_id=project_id, suite_id=int(suite_id))
|
|
548
|
-
cases = resp.get('cases', [])
|
|
549
602
|
else:
|
|
550
603
|
resp = self._client.cases.get_cases(project_id=project_id)
|
|
551
|
-
|
|
604
|
+
|
|
605
|
+
cases = _extract_cases_from_response(resp)
|
|
606
|
+
|
|
552
607
|
except StatusCodeError as e:
|
|
553
608
|
raise ToolException(f"Unable to extract test cases: {e}")
|
|
554
609
|
# Apply filters
|
|
@@ -603,11 +658,30 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
603
658
|
case_id = base_data.get("id")
|
|
604
659
|
|
|
605
660
|
# get a list of attachments for the case
|
|
606
|
-
|
|
661
|
+
attachments_response = self._client.attachments.get_attachments_for_case(case_id=case_id)
|
|
662
|
+
|
|
663
|
+
# Extract attachments from response - handle both old and new API response formats
|
|
664
|
+
if isinstance(attachments_response, dict) and 'attachments' in attachments_response:
|
|
665
|
+
attachments = attachments_response['attachments']
|
|
666
|
+
else:
|
|
667
|
+
attachments = attachments_response if isinstance(attachments_response, list) else []
|
|
607
668
|
|
|
608
669
|
# process each attachment to extract its content
|
|
609
670
|
for attachment in attachments:
|
|
610
|
-
|
|
671
|
+
attachment_name = attachment.get('filename') or attachment.get('name')
|
|
672
|
+
attachment['filename'] = attachment_name
|
|
673
|
+
|
|
674
|
+
# Handle filetype: use existing field if present, otherwise extract from filename
|
|
675
|
+
if 'filetype' not in attachment or not attachment['filetype']:
|
|
676
|
+
file_extension = get_file_extension(attachment_name)
|
|
677
|
+
attachment['filetype'] = file_extension.lstrip('.')
|
|
678
|
+
|
|
679
|
+
# Handle is_image: use existing field if present, otherwise check file extension
|
|
680
|
+
if 'is_image' not in attachment:
|
|
681
|
+
file_extension = get_file_extension(attachment_name)
|
|
682
|
+
attachment['is_image'] = file_extension in image_extensions
|
|
683
|
+
|
|
684
|
+
if get_file_extension(attachment_name) in self._skip_attachment_extensions:
|
|
611
685
|
logger.info(f"Skipping attachment {attachment['filename']} with unsupported extension.")
|
|
612
686
|
continue
|
|
613
687
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alita_sdk
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.345
|
|
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
|
|
@@ -82,7 +82,7 @@ Requires-Dist: gitpython==3.1.43; extra == "tools"
|
|
|
82
82
|
Requires-Dist: atlassian-python-api~=4.0.7; extra == "tools"
|
|
83
83
|
Requires-Dist: jira==3.8.0; extra == "tools"
|
|
84
84
|
Requires-Dist: qtest-swagger-client==0.0.3; extra == "tools"
|
|
85
|
-
Requires-Dist: testrail-api==1.13.
|
|
85
|
+
Requires-Dist: testrail-api==1.13.4; extra == "tools"
|
|
86
86
|
Requires-Dist: azure-devops==7.1.0b4; extra == "tools"
|
|
87
87
|
Requires-Dist: msrest==0.7.1; extra == "tools"
|
|
88
88
|
Requires-Dist: python-graphql-client~=0.4.3; extra == "tools"
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "alita_sdk"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.345"
|
|
8
8
|
description = "SDK for building langchain agents using resources from Alita"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -33,7 +33,7 @@ email = "ad13box@gmail.com"
|
|
|
33
33
|
|
|
34
34
|
[project.optional-dependencies]
|
|
35
35
|
runtime = [ "streamlit>=1.28.0", "langchain_core>=0.3.76,<0.4.0", "langchain>=0.3.22,<0.4.0", "langchain_community>=0.3.7,<0.4.0", "langchain-openai>=0.3.0,<0.4.0", "langchain-anthropic>=0.3.10,<0.4.0", "anthropic>=0.57.0", "langgraph>=0.4.8,<0.5", "langgraph-prebuilt==0.5.2", "langgraph-checkpoint-sqlite~=2.0.0", "langgraph-checkpoint-postgres==2.0.21", "langsmith>=0.3.45", "langchain_chroma>=0.2.2,<0.3.0", "chromadb==0.5.20", "pgvector==0.2.5", "langchain-unstructured~=0.1.6", "langchain-postgres~=0.0.13", "unstructured[local-inference]==0.16.23", "unstructured_pytesseract==0.3.13", "unstructured_inference==0.8.7", "python-pptx==1.0.2", "python-docx==1.1.2", "openpyxl==3.1.2", "pypdf==4.3.1", "pdfminer.six==20240706", "pdf2image==1.16.3", "pikepdf==8.7.1", "docx2txt==0.8", "mammoth==1.9.0", "reportlab==4.2.5", "svglib==1.5.1", "cairocffi==1.7.1", "rlpycairo==0.3.0", "keybert==0.8.3", "sentence-transformers==2.7.0", "gensim==4.3.3", "scipy==1.13.1", "opencv-python==4.11.0.86", "pytesseract==0.3.13", "markdown==3.5.1", "beautifulsoup4==4.12.2", "charset_normalizer==3.3.2", "opentelemetry-exporter-otlp-proto-grpc==1.25.0", "opentelemetry_api==1.25.0", "opentelemetry_instrumentation==0.46b0", "grpcio_status==1.63.0rc1", "protobuf==4.25.7", "langchain-sandbox>=0.0.6",]
|
|
36
|
-
tools = [ "dulwich==0.21.6", "paramiko==3.3.1", "pygithub==2.3.0", "python-gitlab==4.5.0", "gitpython==3.1.43", "atlassian-python-api~=4.0.7", "jira==3.8.0", "qtest-swagger-client==0.0.3", "testrail-api==1.13.
|
|
36
|
+
tools = [ "dulwich==0.21.6", "paramiko==3.3.1", "pygithub==2.3.0", "python-gitlab==4.5.0", "gitpython==3.1.43", "atlassian-python-api~=4.0.7", "jira==3.8.0", "qtest-swagger-client==0.0.3", "testrail-api==1.13.4", "azure-devops==7.1.0b4", "msrest==0.7.1", "python-graphql-client~=0.4.3", "zephyr-python-api==0.1.0", "pyral==1.6.0", "boto3>=1.37.23", "azure-core==1.30.2", "azure-identity==1.16.0", "azure-keyvault-keys==4.9.0", "azure-keyvault-secrets==4.8.0", "azure-mgmt-core==1.4.0", "azure-mgmt-resource==23.0.1", "azure-mgmt-storage==21.1.0", "azure-storage-blob==12.23.1", "azure-search-documents==11.5.2", "PyMySQL==1.1.1", "psycopg2-binary==2.9.10", "Office365-REST-Python-Client==2.5.14", "pypdf2~=3.0.1", "FigmaPy==2018.1.0", "pandas==2.2.3", "factor_analyzer==0.5.1", "statsmodels==0.14.4", "tabulate==0.9.0", "tree_sitter==0.20.2", "tree-sitter-languages==1.10.2", "astor~=0.8.1", "markdownify~=1.1.0", "requests_openapi==1.0.5", "duckduckgo_search==5.3.0", "playwright>=1.52.0", "google-api-python-client==2.154.0", "wikipedia==1.4.0", "lxml==5.2.2", "pymupdf==1.24.9", "googlemaps==4.10.0", "yagmail==0.15.293", "pysnc==1.1.10", "shortuuid==1.0.13", "yarl==1.17.1", "langmem==0.0.27", "textract-py3==2.1.1", "slack_sdk==3.35.0", "deltalake==1.0.2", "google_cloud_bigquery==3.34.0",]
|
|
37
37
|
community = [ "retry-extended==0.2.3", "pyobjtojson==0.3", "elitea-analyse==0.1.2",]
|
|
38
38
|
all = [ "alita-sdk[runtime]", "alita-sdk[tools]", "alita-sdk[community]",]
|
|
39
39
|
dev = [ "pytest", "pytest-cov", "black", "flake8", "mypy",]
|
|
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
|