alita-sdk 0.3.228__py3-none-any.whl → 0.3.230__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- alita_sdk/configurations/__init__.py +66 -0
- alita_sdk/configurations/ado.py +41 -0
- alita_sdk/configurations/azure_search.py +21 -0
- alita_sdk/configurations/bigquery.py +23 -0
- alita_sdk/configurations/bitbucket.py +31 -0
- alita_sdk/configurations/confluence.py +36 -0
- alita_sdk/configurations/delta_lake.py +24 -0
- alita_sdk/configurations/github.py +45 -0
- alita_sdk/configurations/gitlab.py +31 -0
- alita_sdk/configurations/jira.py +36 -0
- alita_sdk/configurations/pgvector.py +18 -0
- alita_sdk/configurations/postman.py +30 -0
- alita_sdk/configurations/qtest.py +20 -0
- alita_sdk/configurations/service_now.py +31 -0
- alita_sdk/configurations/slack.py +35 -0
- alita_sdk/configurations/testrail.py +20 -0
- alita_sdk/runtime/langchain/document_loaders/AlitaDocLoader.py +29 -0
- alita_sdk/runtime/langchain/document_loaders/constants.py +6 -0
- alita_sdk/runtime/langchain/document_loaders/utils.py +22 -1
- alita_sdk/runtime/toolkits/configurations.py +4 -0
- alita_sdk/tools/ado/__init__.py +2 -3
- alita_sdk/tools/ado/repos/__init__.py +26 -33
- alita_sdk/tools/ado/repos/repos_wrapper.py +1 -0
- alita_sdk/tools/ado/test_plan/__init__.py +17 -15
- alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +1 -0
- alita_sdk/tools/ado/wiki/__init__.py +18 -20
- alita_sdk/tools/ado/wiki/ado_wrapper.py +1 -0
- alita_sdk/tools/ado/work_item/__init__.py +18 -19
- alita_sdk/tools/ado/work_item/ado_wrapper.py +1 -0
- alita_sdk/tools/aws/delta_lake/__init__.py +9 -13
- alita_sdk/tools/azure_ai/search/__init__.py +13 -16
- alita_sdk/tools/bitbucket/__init__.py +14 -12
- alita_sdk/tools/confluence/__init__.py +25 -21
- alita_sdk/tools/figma/__init__.py +8 -5
- alita_sdk/tools/figma/api_wrapper.py +37 -12
- alita_sdk/tools/github/__init__.py +22 -46
- alita_sdk/tools/gitlab/__init__.py +14 -9
- alita_sdk/tools/google/bigquery/__init__.py +11 -27
- alita_sdk/tools/jira/__init__.py +23 -19
- alita_sdk/tools/postman/__init__.py +11 -6
- alita_sdk/tools/qtest/__init__.py +9 -3
- alita_sdk/tools/servicenow/__init__.py +12 -6
- alita_sdk/tools/sharepoint/__init__.py +8 -5
- alita_sdk/tools/slack/__init__.py +12 -9
- alita_sdk/tools/testrail/__init__.py +14 -12
- alita_sdk/tools/utils/content_parser.py +16 -26
- {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/METADATA +2 -2
- {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/RECORD +51 -33
- {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/WHEEL +0 -0
- {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/licenses/LICENSE +0 -0
- {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/top_level.txt +0 -0
@@ -6,6 +6,7 @@ from pydantic import BaseModel, ConfigDict, Field, create_model, SecretStr
|
|
6
6
|
from ..base.tool import BaseAction
|
7
7
|
from .api_wrapper import FigmaApiWrapper, GLOBAL_LIMIT
|
8
8
|
from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
|
9
|
+
from ...configurations.pgvector import PgVectorConfiguration
|
9
10
|
|
10
11
|
name = "figma"
|
11
12
|
|
@@ -21,7 +22,7 @@ def get_tools(tool):
|
|
21
22
|
toolkit_name=tool.get('toolkit_name'),
|
22
23
|
# indexer settings
|
23
24
|
llm=tool['settings'].get('llm', None),
|
24
|
-
|
25
|
+
pgvector_configuration=tool['settings'].get('pgvector_configuration', {}),
|
25
26
|
collection_name=str(tool['toolkit_name']),
|
26
27
|
doctype='doc',
|
27
28
|
embedding_model="HuggingFaceEmbeddings",
|
@@ -54,9 +55,7 @@ class FigmaToolkit(BaseToolkit):
|
|
54
55
|
Field(default=[], json_schema_extra={"args_schemas": selected_tools}),
|
55
56
|
),
|
56
57
|
# indexer settings
|
57
|
-
|
58
|
-
default=None,
|
59
|
-
json_schema_extra={'secret': True})),
|
58
|
+
pgvector_configuration=(Optional[PgVectorConfiguration], Field(description="PgVector Configuration", json_schema_extra={'configuration_types': ['pgvector']})),
|
60
59
|
|
61
60
|
# embedder settings
|
62
61
|
embedding_model=(str, Field(description="Embedding model: i.e. 'HuggingFaceEmbeddings', etc.", default="HuggingFaceEmbeddings")),
|
@@ -93,7 +92,11 @@ class FigmaToolkit(BaseToolkit):
|
|
93
92
|
def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
|
94
93
|
if selected_tools is None:
|
95
94
|
selected_tools = []
|
96
|
-
|
95
|
+
wrapper_payload = {
|
96
|
+
**kwargs,
|
97
|
+
**(kwargs.get('pgvector_configuration') or {}),
|
98
|
+
}
|
99
|
+
figma_api_wrapper = FigmaApiWrapper(**wrapper_payload)
|
97
100
|
prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
|
98
101
|
available_tools = figma_api_wrapper.get_available_tools()
|
99
102
|
tools = []
|
@@ -4,7 +4,7 @@ import json
|
|
4
4
|
import logging
|
5
5
|
import re
|
6
6
|
from enum import Enum
|
7
|
-
from typing import Dict, Generator, Optional, Union
|
7
|
+
from typing import Dict, List, Generator, Optional, Union
|
8
8
|
|
9
9
|
import requests
|
10
10
|
from FigmaPy import FigmaPy
|
@@ -13,6 +13,7 @@ from langchain_core.tools import ToolException
|
|
13
13
|
from pydantic import Field, PrivateAttr, create_model, model_validator, SecretStr
|
14
14
|
|
15
15
|
from ..elitea_base import BaseVectorStoreToolApiWrapper, extend_with_vector_tools
|
16
|
+
from ..utils.content_parser import load_content_from_bytes
|
16
17
|
|
17
18
|
GLOBAL_LIMIT = 10000
|
18
19
|
|
@@ -235,15 +236,27 @@ class FigmaApiWrapper(BaseVectorStoreToolApiWrapper):
|
|
235
236
|
global_regexp: Optional[str] = Field(default=None)
|
236
237
|
_client: Optional[FigmaPy] = PrivateAttr()
|
237
238
|
|
238
|
-
def _base_loader(self, project_id: str, **kwargs) -> Generator[Document, None, None]:
|
239
|
-
files =
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
239
|
+
def _base_loader(self, project_id: Optional[str] = None, file_keys: Optional[List[str]] = None, **kwargs) -> Generator[Document, None, None]:
|
240
|
+
files = []
|
241
|
+
if project_id:
|
242
|
+
files = json.loads(self.get_project_files(project_id)).get('files', [])
|
243
|
+
for file in files:
|
244
|
+
yield Document(page_content=json.dumps(file), metadata={
|
245
|
+
'id': file.get('key', ''),
|
246
|
+
'file_key': file.get('key', ''),
|
247
|
+
'name': file.get('name', ''),
|
248
|
+
'updated_on': file.get('last_modified', '')
|
249
|
+
})
|
250
|
+
elif file_keys:
|
251
|
+
for file_key in file_keys:
|
252
|
+
file = self._client.get_file(file_key)
|
253
|
+
metadata = {
|
254
|
+
'id': file_key,
|
255
|
+
'file_key': file_key,
|
256
|
+
'name': file.name,
|
257
|
+
'updated_on': file.last_modified
|
258
|
+
}
|
259
|
+
yield Document(page_content=json.dumps(metadata), metadata=metadata)
|
247
260
|
|
248
261
|
def _process_document(self, document: Document) -> Generator[Document, None, None]:
|
249
262
|
file_key = document.metadata.get('id', '')
|
@@ -257,12 +270,19 @@ class FigmaApiWrapper(BaseVectorStoreToolApiWrapper):
|
|
257
270
|
|
258
271
|
# iterate over images values
|
259
272
|
for node_id, image_url in images.items():
|
273
|
+
if not image_url:
|
274
|
+
logging.warning(f"Image URL not found for node_id {node_id} in file {file_key}. Skipping.")
|
275
|
+
continue
|
260
276
|
response = requests.get(image_url)
|
261
277
|
if response.status_code == 200:
|
262
278
|
content_type = response.headers.get('Content-Type', '')
|
263
279
|
if 'text/html' not in content_type.lower():
|
280
|
+
extension = f".{content_type.split('/')[-1]}" if content_type.startswith('image') else '.txt'
|
281
|
+
page_content = load_content_from_bytes(
|
282
|
+
file_content=response.content,
|
283
|
+
extension=extension, llm = self.llm)
|
264
284
|
yield Document(
|
265
|
-
page_content=
|
285
|
+
page_content=page_content,
|
266
286
|
metadata={
|
267
287
|
'file_key': file_key,
|
268
288
|
'node_id': node_id,
|
@@ -273,7 +293,12 @@ class FigmaApiWrapper(BaseVectorStoreToolApiWrapper):
|
|
273
293
|
def _index_tool_params(self):
|
274
294
|
"""Return the parameters for indexing data."""
|
275
295
|
return {
|
276
|
-
"project_id": (str, Field(
|
296
|
+
"project_id": (Optional[str], Field(
|
297
|
+
description="ID of the project to list files from: i.e. '55391681'",
|
298
|
+
default=None)),
|
299
|
+
'file_keys': (Optional[List[str]], Field(
|
300
|
+
description="List of file keys to index: i.e. ['Fp24FuzPwH0L74ODSrCnQo', 'jmhAr6q78dJoMRqt48zisY']",
|
301
|
+
default=None))
|
277
302
|
}
|
278
303
|
|
279
304
|
def _send_request(
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Dict, List, Optional, Literal
|
1
|
+
from typing import Dict, List, Optional, Literal
|
2
2
|
|
3
3
|
from langchain_core.tools import BaseTool, BaseToolkit
|
4
4
|
from pydantic import create_model, BaseModel, ConfigDict, Field, SecretStr
|
@@ -7,6 +7,8 @@ from .api_wrapper import AlitaGitHubAPIWrapper
|
|
7
7
|
from .tool import GitHubAction
|
8
8
|
|
9
9
|
from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
|
10
|
+
from ...configurations.github import GithubConfiguration
|
11
|
+
from ...configurations.pgvector import PgVectorConfiguration
|
10
12
|
|
11
13
|
name = "github"
|
12
14
|
|
@@ -17,14 +19,10 @@ def _get_toolkit(tool) -> BaseToolkit:
|
|
17
19
|
github_repository=tool['settings']['repository'],
|
18
20
|
active_branch=tool['settings']['active_branch'],
|
19
21
|
github_base_branch=tool['settings']['base_branch'],
|
20
|
-
|
21
|
-
github_username=tool['settings'].get('username', ''),
|
22
|
-
github_password=tool['settings'].get('password', ''),
|
23
|
-
github_app_id=tool['settings'].get('app_id', None),
|
24
|
-
github_app_private_key=tool['settings'].get('app_private_key', None),
|
22
|
+
github_configuration=tool['settings']['github_configuration'],
|
25
23
|
llm=tool['settings'].get('llm', None),
|
26
24
|
alita=tool['settings'].get('alita', None),
|
27
|
-
|
25
|
+
pgvector_configuration=tool['settings'].get('pgvector_configuration', {}),
|
28
26
|
collection_name=str(tool['toolkit_name']),
|
29
27
|
doctype='code',
|
30
28
|
embedding_model="HuggingFaceEmbeddings",
|
@@ -45,7 +43,8 @@ class AlitaGitHubToolkit(BaseToolkit):
|
|
45
43
|
|
46
44
|
@staticmethod
|
47
45
|
def toolkit_config_schema() -> BaseModel:
|
48
|
-
selected_tools = {x['name']: x['args_schema'].schema() for x in
|
46
|
+
selected_tools = {x['name']: x['args_schema'].schema() for x in
|
47
|
+
AlitaGitHubAPIWrapper.model_construct().get_available_tools()}
|
49
48
|
AlitaGitHubToolkit.toolkit_max_length = get_max_toolkit_length(selected_tools)
|
50
49
|
return create_model(
|
51
50
|
name,
|
@@ -54,60 +53,37 @@ class AlitaGitHubToolkit(BaseToolkit):
|
|
54
53
|
'metadata': {
|
55
54
|
"label": "GitHub",
|
56
55
|
"icon_url": None,
|
57
|
-
"sections": {
|
58
|
-
"auth": {
|
59
|
-
"required": False,
|
60
|
-
"subsections": [
|
61
|
-
{
|
62
|
-
"name": "Token",
|
63
|
-
"fields": ["access_token"]
|
64
|
-
},
|
65
|
-
{
|
66
|
-
"name": "Password",
|
67
|
-
"fields": ["username", "password"]
|
68
|
-
},
|
69
|
-
{
|
70
|
-
"name": "App private key",
|
71
|
-
"fields": ["app_id", "app_private_key"]
|
72
|
-
}
|
73
|
-
]
|
74
|
-
},
|
75
|
-
},
|
76
56
|
"categories": ["code repositories"],
|
77
57
|
"extra_categories": ["github", "git", "repository", "code", "version control"],
|
78
58
|
},
|
79
59
|
}
|
80
60
|
),
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
username=(Optional[str], Field(description="Github Username", default=None, json_schema_extra={'configuration': True})),
|
88
|
-
password=(Optional[SecretStr], Field(description="Github Password", default=None, json_schema_extra={'secret': True, 'configuration': True})),
|
89
|
-
|
90
|
-
repository=(str, Field(description="Github repository", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': AlitaGitHubToolkit.toolkit_max_length})),
|
61
|
+
github_configuration=(Optional[GithubConfiguration], Field(description="Github configuration", default=None,
|
62
|
+
json_schema_extra={'configuration_types': ['github']})),
|
63
|
+
pgvector_configuration=(Optional[PgVectorConfiguration], Field(description="PgVector configuration", default=None,
|
64
|
+
json_schema_extra={'configuration_types': ['pgvector']})),
|
65
|
+
repository=(str, Field(description="Github repository", json_schema_extra={'toolkit_name': True,
|
66
|
+
'max_toolkit_length': AlitaGitHubToolkit.toolkit_max_length})),
|
91
67
|
active_branch=(Optional[str], Field(description="Active branch", default="main")),
|
92
68
|
base_branch=(Optional[str], Field(description="Github Base branch", default="main")),
|
93
|
-
|
94
69
|
# indexer settings
|
95
|
-
connection_string = (Optional[SecretStr], Field(description="Connection string for vectorstore",
|
96
|
-
default=None,
|
97
|
-
json_schema_extra={'secret': True})),
|
98
|
-
|
99
|
-
# embedder settings
|
100
70
|
embedding_model=(str, Field(description="Embedding model: i.e. 'HuggingFaceEmbeddings', etc.", default="HuggingFaceEmbeddings")),
|
101
71
|
embedding_model_params=(dict, Field(description="Embedding model parameters: i.e. `{'model_name': 'sentence-transformers/all-MiniLM-L6-v2'}", default={"model_name": "sentence-transformers/all-MiniLM-L6-v2"})),
|
102
|
-
|
103
|
-
|
72
|
+
selected_tools=(List[Literal[tuple(selected_tools)]],
|
73
|
+
Field(default=[], json_schema_extra={'args_schemas': selected_tools}))
|
104
74
|
)
|
105
75
|
|
106
76
|
@classmethod
|
107
77
|
def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
|
108
78
|
if selected_tools is None:
|
109
79
|
selected_tools = []
|
110
|
-
|
80
|
+
wrapper_payload = {
|
81
|
+
**kwargs,
|
82
|
+
# TODO use github_configuration fields
|
83
|
+
**kwargs['github_configuration'],
|
84
|
+
**(kwargs.get('pgvector_configuration') or {}),
|
85
|
+
}
|
86
|
+
github_api_wrapper = AlitaGitHubAPIWrapper(**wrapper_payload)
|
111
87
|
available_tools: List[Dict] = github_api_wrapper.get_available_tools()
|
112
88
|
tools = []
|
113
89
|
prefix = clean_string(toolkit_name, AlitaGitHubToolkit.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
|
@@ -3,11 +3,13 @@ from typing import Dict, List, Literal, Optional
|
|
3
3
|
from alita_sdk.tools.base.tool import BaseAction
|
4
4
|
from langchain_core.tools import BaseTool
|
5
5
|
from langchain_core.tools import BaseToolkit
|
6
|
-
from pydantic import create_model, BaseModel, ConfigDict
|
6
|
+
from pydantic import create_model, BaseModel, ConfigDict
|
7
7
|
from pydantic.fields import Field
|
8
8
|
|
9
9
|
from .api_wrapper import GitLabAPIWrapper
|
10
10
|
from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
|
11
|
+
from ...configurations.gitlab import GitlabConfiguration
|
12
|
+
from ...configurations.pgvector import PgVectorConfiguration
|
11
13
|
|
12
14
|
name = "gitlab"
|
13
15
|
|
@@ -18,11 +20,11 @@ def get_tools(tool):
|
|
18
20
|
url=tool['settings']['url'],
|
19
21
|
repository=tool['settings']['repository'],
|
20
22
|
branch=tool['settings']['branch'],
|
21
|
-
|
23
|
+
gitlab_configuration=tool['settings']['gitlab_configuration'],
|
22
24
|
|
23
25
|
llm=tool['settings'].get('llm', None),
|
24
26
|
alita=tool['settings'].get('alita', None),
|
25
|
-
|
27
|
+
pgvector_configuration=tool['settings'].get('pgvector_configuration', {}),
|
26
28
|
collection_name=str(tool['toolkit_name']),
|
27
29
|
doctype='code',
|
28
30
|
embedding_model="HuggingFaceEmbeddings",
|
@@ -44,13 +46,10 @@ class AlitaGitlabToolkit(BaseToolkit):
|
|
44
46
|
name,
|
45
47
|
url=(str, Field(description="GitLab URL", json_schema_extra={'configuration': True, 'configuration_title': True})),
|
46
48
|
repository=(str, Field(description="GitLab repository", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': AlitaGitlabToolkit.toolkit_max_length})),
|
47
|
-
|
49
|
+
gitlab_configuration=(Optional[GitlabConfiguration], Field(description="GitLab configuration", json_schema_extra={'configuration_types': ['gitlab']})),
|
48
50
|
branch=(str, Field(description="Main branch", default="main")),
|
49
51
|
# indexer settings
|
50
|
-
|
51
|
-
default=None,
|
52
|
-
json_schema_extra={'secret': True})),
|
53
|
-
|
52
|
+
pgvector_configuration=(Optional[PgVectorConfiguration], Field(description="PgVector Configuration", json_schema_extra={'configuration_types': ['pgvector']})),
|
54
53
|
# embedder settings
|
55
54
|
embedding_model=(str, Field(description="Embedding model: i.e. 'HuggingFaceEmbeddings', etc.", default="HuggingFaceEmbeddings")),
|
56
55
|
embedding_model_params=(dict, Field(description="Embedding model parameters: i.e. `{'model_name': 'sentence-transformers/all-MiniLM-L6-v2'}", default={"model_name": "sentence-transformers/all-MiniLM-L6-v2"})),
|
@@ -80,7 +79,13 @@ class AlitaGitlabToolkit(BaseToolkit):
|
|
80
79
|
def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
|
81
80
|
if selected_tools is None:
|
82
81
|
selected_tools = []
|
83
|
-
|
82
|
+
wrapper_payload = {
|
83
|
+
**kwargs,
|
84
|
+
# TODO use gitlab_configuration fields
|
85
|
+
**kwargs['gitlab_configuration'],
|
86
|
+
**(kwargs.get('pgvector_configuration') or {}),
|
87
|
+
}
|
88
|
+
gitlab_api_wrapper = GitLabAPIWrapper(**wrapper_payload)
|
84
89
|
prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
|
85
90
|
available_tools: List[Dict] = gitlab_api_wrapper.get_available_tools()
|
86
91
|
tools = []
|
@@ -2,8 +2,9 @@ from functools import lru_cache
|
|
2
2
|
from typing import List, Optional, Type
|
3
3
|
|
4
4
|
from langchain_core.tools import BaseTool, BaseToolkit
|
5
|
-
from pydantic import BaseModel, Field,
|
5
|
+
from pydantic import BaseModel, Field, computed_field, field_validator
|
6
6
|
|
7
|
+
from ....configurations.bigquery import BigQueryConfiguration
|
7
8
|
from ...utils import TOOLKIT_SPLITTER, clean_string, get_max_toolkit_length
|
8
9
|
from .api_wrapper import BigQueryApiWrapper
|
9
10
|
from .tool import BigQueryAction
|
@@ -45,30 +46,8 @@ class BigQueryToolkitConfig(BaseModel):
|
|
45
46
|
}
|
46
47
|
}
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
description="GCP API key",
|
51
|
-
json_schema_extra={"secret": True, "configuration": True},
|
52
|
-
)
|
53
|
-
project: Optional[str] = Field(
|
54
|
-
default=None,
|
55
|
-
description="BigQuery project ID",
|
56
|
-
json_schema_extra={"configuration": True},
|
57
|
-
)
|
58
|
-
location: Optional[str] = Field(
|
59
|
-
default=None,
|
60
|
-
description="BigQuery location",
|
61
|
-
json_schema_extra={"configuration": True},
|
62
|
-
)
|
63
|
-
dataset: Optional[str] = Field(
|
64
|
-
default=None,
|
65
|
-
description="BigQuery dataset name",
|
66
|
-
json_schema_extra={"configuration": True, "configuration_title": True},
|
67
|
-
)
|
68
|
-
table: Optional[str] = Field(
|
69
|
-
default=None,
|
70
|
-
description="BigQuery table name",
|
71
|
-
json_schema_extra={"configuration": True},
|
49
|
+
bigquery_configuration: Optional[BigQueryConfiguration] = Field(
|
50
|
+
description="BigQuery configuration", json_schema_extra={"configuration_types": ["bigquery"]}
|
72
51
|
)
|
73
52
|
selected_tools: List[str] = Field(
|
74
53
|
default=[],
|
@@ -85,7 +64,7 @@ class BigQueryToolkitConfig(BaseModel):
|
|
85
64
|
def _get_toolkit(tool) -> BaseToolkit:
|
86
65
|
return BigQueryToolkit().get_toolkit(
|
87
66
|
selected_tools=tool["settings"].get("selected_tools", []),
|
88
|
-
|
67
|
+
bigquery_configuration=tool["settings"]["bigquery_configuration"],
|
89
68
|
toolkit_name=tool.get("toolkit_name"),
|
90
69
|
)
|
91
70
|
|
@@ -130,7 +109,12 @@ class BigQueryToolkit(BaseToolkit):
|
|
130
109
|
toolkit_name: Optional[str] = None,
|
131
110
|
**kwargs,
|
132
111
|
) -> "BigQueryToolkit":
|
133
|
-
|
112
|
+
wrapper_payload = {
|
113
|
+
**kwargs,
|
114
|
+
# TODO use bigquery_configuration fields
|
115
|
+
**kwargs['bigquery_configuration'],
|
116
|
+
}
|
117
|
+
bigquery_api_wrapper = BigQueryApiWrapper(**wrapper_payload)
|
134
118
|
instance = cls(
|
135
119
|
tools=[], api_wrapper=bigquery_api_wrapper, toolkit_name=toolkit_name
|
136
120
|
)
|
alita_sdk/tools/jira/__init__.py
CHANGED
@@ -2,10 +2,12 @@ from typing import List, Optional, Literal
|
|
2
2
|
from .api_wrapper import JiraApiWrapper
|
3
3
|
from langchain_core.tools import BaseTool, BaseToolkit
|
4
4
|
from ..base.tool import BaseAction
|
5
|
-
from pydantic import create_model, BaseModel, ConfigDict, Field
|
5
|
+
from pydantic import create_model, BaseModel, ConfigDict, Field
|
6
6
|
import requests
|
7
7
|
|
8
8
|
from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length, parse_list, check_connection_response
|
9
|
+
from ...configurations.jira import JiraConfiguration
|
10
|
+
from ...configurations.pgvector import PgVectorConfiguration
|
9
11
|
|
10
12
|
name = "jira"
|
11
13
|
|
@@ -14,9 +16,7 @@ def get_tools(tool):
|
|
14
16
|
selected_tools=tool['settings'].get('selected_tools', []),
|
15
17
|
base_url=tool['settings'].get('base_url'),
|
16
18
|
cloud=tool['settings'].get('cloud', True),
|
17
|
-
|
18
|
-
username=tool['settings'].get('username', None),
|
19
|
-
token=tool['settings'].get('token', None),
|
19
|
+
jira_configuration=tool['settings']['jira_configuration'],
|
20
20
|
limit=tool['settings'].get('limit', 5),
|
21
21
|
labels=parse_list(tool['settings'].get('labels', [])),
|
22
22
|
additional_fields=tool['settings'].get('additional_fields', []),
|
@@ -24,7 +24,7 @@ def get_tools(tool):
|
|
24
24
|
# indexer settings
|
25
25
|
llm=tool['settings'].get('llm', None),
|
26
26
|
alita=tool['settings'].get('alita', None),
|
27
|
-
|
27
|
+
pgvector_configuration=tool['settings'].get('pgvector_configuration', {}),
|
28
28
|
collection_name=str(tool['toolkit_name']),
|
29
29
|
embedding_model="HuggingFaceEmbeddings",
|
30
30
|
embedding_model_params={"model_name": "sentence-transformers/all-MiniLM-L6-v2"},
|
@@ -47,10 +47,15 @@ class JiraToolkit(BaseToolkit):
|
|
47
47
|
url = self.base_url.rstrip('/') + '/rest/api/2/myself'
|
48
48
|
headers = {'Accept': 'application/json'}
|
49
49
|
auth = None
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
jira_config = self.jira_configuration or {}
|
51
|
+
token = jira_config.get('token')
|
52
|
+
username = jira_config.get('username')
|
53
|
+
api_key = jira_config.get('api_key')
|
54
|
+
|
55
|
+
if token:
|
56
|
+
headers['Authorization'] = f'Bearer {token}'
|
57
|
+
elif username and api_key:
|
58
|
+
auth = (username, api_key)
|
54
59
|
else:
|
55
60
|
raise ValueError('Jira connection requires either token or username+api_key')
|
56
61
|
response = requests.get(url, headers=headers, auth=auth, timeout=5, verify=getattr(self, 'verify_ssl', True))
|
@@ -70,9 +75,6 @@ class JiraToolkit(BaseToolkit):
|
|
70
75
|
)
|
71
76
|
),
|
72
77
|
cloud=(bool, Field(description="Hosting Option", json_schema_extra={'configuration': True})),
|
73
|
-
api_key=(Optional[SecretStr], Field(description="API key", default=None, json_schema_extra={'secret': True, 'configuration': True})),
|
74
|
-
username=(Optional[str], Field(description="Jira Username", default=None, json_schema_extra={'configuration': True})),
|
75
|
-
token=(Optional[SecretStr], Field(description="Jira token", default=None, json_schema_extra={'secret': True, 'configuration': True})),
|
76
78
|
limit=(int, Field(description="Limit issues")),
|
77
79
|
labels=(Optional[str], Field(
|
78
80
|
description="List of comma separated labels used for labeling of agent's created or updated entities",
|
@@ -81,12 +83,8 @@ class JiraToolkit(BaseToolkit):
|
|
81
83
|
)),
|
82
84
|
verify_ssl=(bool, Field(description="Verify SSL", default=True)),
|
83
85
|
additional_fields=(Optional[str], Field(description="Additional fields", default="")),
|
84
|
-
|
85
|
-
|
86
|
-
connection_string=(Optional[SecretStr], Field(description="Connection string for vectorstore",
|
87
|
-
default=None,
|
88
|
-
json_schema_extra={'secret': True})),
|
89
|
-
|
86
|
+
jira_configuration=(Optional[JiraConfiguration], Field(description="Jira Configuration", json_schema_extra={'configuration_types': ['jira']})),
|
87
|
+
pgvector_configuration=(Optional[PgVectorConfiguration], Field(description="PgVector Configuration", json_schema_extra={'configuration_types': ['pgvector']})),
|
90
88
|
# embedder settings
|
91
89
|
embedding_model=(str, Field(description="Embedding model: i.e. 'HuggingFaceEmbeddings', etc.", default="HuggingFaceEmbeddings")),
|
92
90
|
embedding_model_params=(dict, Field(description="Embedding model parameters: i.e. `{'model_name': 'sentence-transformers/all-MiniLM-L6-v2'}", default={"model_name": "sentence-transformers/all-MiniLM-L6-v2"})),
|
@@ -123,7 +121,13 @@ class JiraToolkit(BaseToolkit):
|
|
123
121
|
def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
|
124
122
|
if selected_tools is None:
|
125
123
|
selected_tools = []
|
126
|
-
|
124
|
+
wrapper_payload = {
|
125
|
+
**kwargs,
|
126
|
+
# TODO use jira_configuration fields
|
127
|
+
**kwargs['jira_configuration'],
|
128
|
+
**(kwargs.get('pgvector_configuration') or {}),
|
129
|
+
}
|
130
|
+
jira_api_wrapper = JiraApiWrapper(**wrapper_payload)
|
127
131
|
prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
|
128
132
|
available_tools = jira_api_wrapper.get_available_tools()
|
129
133
|
tools = []
|
@@ -1,13 +1,13 @@
|
|
1
1
|
from typing import List, Literal, Optional, Type
|
2
|
-
import json
|
3
2
|
|
4
3
|
import requests
|
5
4
|
from langchain_core.tools import BaseToolkit, BaseTool
|
6
|
-
from pydantic import create_model, BaseModel, ConfigDict, Field,
|
5
|
+
from pydantic import create_model, BaseModel, ConfigDict, Field, field_validator
|
7
6
|
from ..base.tool import BaseAction
|
8
7
|
|
9
8
|
from .api_wrapper import PostmanApiWrapper
|
10
9
|
from ..utils import clean_string, get_max_toolkit_length, TOOLKIT_SPLITTER, check_connection_response
|
10
|
+
from ...configurations.postman import PostmanConfiguration
|
11
11
|
|
12
12
|
name = "postman"
|
13
13
|
|
@@ -30,7 +30,7 @@ def get_tools(tool):
|
|
30
30
|
environment_config = tool['settings'].get('environment_config', {})
|
31
31
|
toolkit = PostmanToolkit.get_toolkit(
|
32
32
|
selected_tools=tool['settings'].get('selected_tools', []),
|
33
|
-
|
33
|
+
postman_configuration=tool['settings']['postman_configuration'],
|
34
34
|
base_url=tool['settings'].get(
|
35
35
|
'base_url', 'https://api.getpostman.com'),
|
36
36
|
collection_id=tool['settings'].get('collection_id', None),
|
@@ -53,8 +53,8 @@ class PostmanToolkit(BaseToolkit):
|
|
53
53
|
selected_tools)
|
54
54
|
m = create_model(
|
55
55
|
name,
|
56
|
-
|
57
|
-
|
56
|
+
postman_configuration=(Optional[PostmanConfiguration], Field(description="Postman Configuration",
|
57
|
+
json_schema_extra={'configuration_types': ['postman']})),
|
58
58
|
base_url=(str, Field(description="Postman API base URL",
|
59
59
|
default="https://api.getpostman.com", json_schema_extra={'configuration': True})),
|
60
60
|
collection_id=(str, Field(description="Default collection ID", json_schema_extra={
|
@@ -91,7 +91,12 @@ class PostmanToolkit(BaseToolkit):
|
|
91
91
|
def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
|
92
92
|
if selected_tools is None:
|
93
93
|
selected_tools = []
|
94
|
-
|
94
|
+
wrapper_payload = {
|
95
|
+
**kwargs,
|
96
|
+
# TODO use postman_configuration fields
|
97
|
+
**kwargs['postman_configuration'],
|
98
|
+
}
|
99
|
+
postman_api_wrapper = PostmanApiWrapper(**wrapper_payload)
|
95
100
|
prefix = clean_string(str(toolkit_name), cls.toolkit_max_length) + \
|
96
101
|
TOOLKIT_SPLITTER if toolkit_name else ''
|
97
102
|
available_tools = postman_api_wrapper.get_available_tools()
|
@@ -7,6 +7,7 @@ from pydantic import create_model, BaseModel, ConfigDict, Field, SecretStr
|
|
7
7
|
from .api_wrapper import QtestApiWrapper
|
8
8
|
from .tool import QtestAction
|
9
9
|
from ..utils import clean_string, get_max_toolkit_length, TOOLKIT_SPLITTER, check_connection_response
|
10
|
+
from ...configurations.qtest import QtestConfiguration
|
10
11
|
|
11
12
|
name = "qtest"
|
12
13
|
|
@@ -16,7 +17,7 @@ def get_tools(tool):
|
|
16
17
|
selected_tools=tool['settings'].get('selected_tools', []),
|
17
18
|
base_url=tool['settings'].get('base_url', None),
|
18
19
|
qtest_project_id=tool['settings'].get('qtest_project_id', tool['settings'].get('project_id', None)),
|
19
|
-
|
20
|
+
qtest_configuration=tool['settings']['qtest_configuration'],
|
20
21
|
toolkit_name=tool.get('toolkit_name')
|
21
22
|
)
|
22
23
|
return toolkit.tools
|
@@ -34,7 +35,7 @@ class QtestToolkit(BaseToolkit):
|
|
34
35
|
name,
|
35
36
|
base_url=(str, Field(description="QTest base url", json_schema_extra={'configuration': True, 'configuration_title': True})),
|
36
37
|
qtest_project_id=(int, Field(description="QTest project id", json_schema_extra={'toolkit_name': True, 'max_toolkit_length': QtestToolkit.toolkit_max_length})),
|
37
|
-
|
38
|
+
qtest_configuration=(Optional[QtestConfiguration], Field(description="QTest API token", json_schema_extra={'configuration_types': ['qtest']})),
|
38
39
|
selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
|
39
40
|
__config__=ConfigDict(json_schema_extra={'metadata': {"label": "QTest", "icon_url": "qtest.svg",
|
40
41
|
"categories": ["test management"],
|
@@ -59,7 +60,12 @@ class QtestToolkit(BaseToolkit):
|
|
59
60
|
def get_toolkit(cls, selected_tools: list[str] | None = None, toolkit_name: Optional[str] = None, **kwargs):
|
60
61
|
if selected_tools is None:
|
61
62
|
selected_tools = []
|
62
|
-
|
63
|
+
wrapper_payload = {
|
64
|
+
**kwargs,
|
65
|
+
# TODO use qtest_configuration fields
|
66
|
+
**kwargs['qtest_configuration'],
|
67
|
+
}
|
68
|
+
qtest_api_wrapper = QtestApiWrapper(**wrapper_payload)
|
63
69
|
prefix = clean_string(str(toolkit_name), cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
|
64
70
|
available_tools = qtest_api_wrapper.get_available_tools()
|
65
71
|
tools = []
|
@@ -4,8 +4,10 @@ from langchain_community.agent_toolkits.base import BaseToolkit
|
|
4
4
|
from .api_wrapper import ServiceNowAPIWrapper
|
5
5
|
from langchain_core.tools import BaseTool
|
6
6
|
from ..base.tool import BaseAction
|
7
|
-
from pydantic import create_model, BaseModel, ConfigDict, Field
|
7
|
+
from pydantic import create_model, BaseModel, ConfigDict, Field
|
8
8
|
from ..utils import clean_string, TOOLKIT_SPLITTER, get_max_toolkit_length
|
9
|
+
from ...configurations.service_now import ServiceNowConfiguration
|
10
|
+
|
9
11
|
|
10
12
|
name = "service_now"
|
11
13
|
|
@@ -14,8 +16,7 @@ def get_tools(tool):
|
|
14
16
|
selected_tools=tool['settings'].get('selected_tools', []),
|
15
17
|
instance_alias=tool['settings'].get('instance_alias', None),
|
16
18
|
base_url=tool['settings']['base_url'],
|
17
|
-
|
18
|
-
username=tool['settings'].get('username', None),
|
19
|
+
servicenow_configuration=tool['settings']['servicenow_configuration'],
|
19
20
|
response_fields=tool['settings'].get('response_fields', None),
|
20
21
|
toolkit_name=tool.get('toolkit_name')
|
21
22
|
).get_tools()
|
@@ -37,9 +38,9 @@ class ServiceNowToolkit(BaseToolkit):
|
|
37
38
|
'configuration': True,
|
38
39
|
'configuration_title': True
|
39
40
|
})),
|
40
|
-
username=(str, Field(description="Username", default=None, json_schema_extra={'configuration': True})),
|
41
|
-
password=(SecretStr, Field(description="Password", default=None, json_schema_extra={'secret': True, 'configuration': True})),
|
42
41
|
response_fields=(Optional[str], Field(description="Response fields", default=None)),
|
42
|
+
servicenow_configuration=(Optional[ServiceNowConfiguration], Field(description="ServiceNow Configuration",
|
43
|
+
json_schema_extra={'configuration_types': ['service_now']})),
|
43
44
|
selected_tools=(List[Literal[tuple(selected_tools)]],
|
44
45
|
Field(default=[], json_schema_extra={'args_schemas': selected_tools})),
|
45
46
|
__config__=ConfigDict(json_schema_extra={
|
@@ -70,7 +71,12 @@ class ServiceNowToolkit(BaseToolkit):
|
|
70
71
|
selected_tools = []
|
71
72
|
if 'response_fields' in kwargs and isinstance(kwargs['response_fields'], str):
|
72
73
|
kwargs['fields'] = [field.strip().lower() for field in kwargs['response_fields'].split(',') if field.strip()]
|
73
|
-
|
74
|
+
wrapper_payload = {
|
75
|
+
**kwargs,
|
76
|
+
# TODO use servicenow_configuration fields
|
77
|
+
**kwargs['servicenow_configuration'],
|
78
|
+
}
|
79
|
+
servicenow_api_wrapper = ServiceNowAPIWrapper(**wrapper_payload)
|
74
80
|
prefix = clean_string(toolkit_name, cls.toolkit_max_length) + TOOLKIT_SPLITTER if toolkit_name else ''
|
75
81
|
available_tools = servicenow_api_wrapper.get_available_tools()
|
76
82
|
tools = []
|