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.
Files changed (51) hide show
  1. alita_sdk/configurations/__init__.py +66 -0
  2. alita_sdk/configurations/ado.py +41 -0
  3. alita_sdk/configurations/azure_search.py +21 -0
  4. alita_sdk/configurations/bigquery.py +23 -0
  5. alita_sdk/configurations/bitbucket.py +31 -0
  6. alita_sdk/configurations/confluence.py +36 -0
  7. alita_sdk/configurations/delta_lake.py +24 -0
  8. alita_sdk/configurations/github.py +45 -0
  9. alita_sdk/configurations/gitlab.py +31 -0
  10. alita_sdk/configurations/jira.py +36 -0
  11. alita_sdk/configurations/pgvector.py +18 -0
  12. alita_sdk/configurations/postman.py +30 -0
  13. alita_sdk/configurations/qtest.py +20 -0
  14. alita_sdk/configurations/service_now.py +31 -0
  15. alita_sdk/configurations/slack.py +35 -0
  16. alita_sdk/configurations/testrail.py +20 -0
  17. alita_sdk/runtime/langchain/document_loaders/AlitaDocLoader.py +29 -0
  18. alita_sdk/runtime/langchain/document_loaders/constants.py +6 -0
  19. alita_sdk/runtime/langchain/document_loaders/utils.py +22 -1
  20. alita_sdk/runtime/toolkits/configurations.py +4 -0
  21. alita_sdk/tools/ado/__init__.py +2 -3
  22. alita_sdk/tools/ado/repos/__init__.py +26 -33
  23. alita_sdk/tools/ado/repos/repos_wrapper.py +1 -0
  24. alita_sdk/tools/ado/test_plan/__init__.py +17 -15
  25. alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +1 -0
  26. alita_sdk/tools/ado/wiki/__init__.py +18 -20
  27. alita_sdk/tools/ado/wiki/ado_wrapper.py +1 -0
  28. alita_sdk/tools/ado/work_item/__init__.py +18 -19
  29. alita_sdk/tools/ado/work_item/ado_wrapper.py +1 -0
  30. alita_sdk/tools/aws/delta_lake/__init__.py +9 -13
  31. alita_sdk/tools/azure_ai/search/__init__.py +13 -16
  32. alita_sdk/tools/bitbucket/__init__.py +14 -12
  33. alita_sdk/tools/confluence/__init__.py +25 -21
  34. alita_sdk/tools/figma/__init__.py +8 -5
  35. alita_sdk/tools/figma/api_wrapper.py +37 -12
  36. alita_sdk/tools/github/__init__.py +22 -46
  37. alita_sdk/tools/gitlab/__init__.py +14 -9
  38. alita_sdk/tools/google/bigquery/__init__.py +11 -27
  39. alita_sdk/tools/jira/__init__.py +23 -19
  40. alita_sdk/tools/postman/__init__.py +11 -6
  41. alita_sdk/tools/qtest/__init__.py +9 -3
  42. alita_sdk/tools/servicenow/__init__.py +12 -6
  43. alita_sdk/tools/sharepoint/__init__.py +8 -5
  44. alita_sdk/tools/slack/__init__.py +12 -9
  45. alita_sdk/tools/testrail/__init__.py +14 -12
  46. alita_sdk/tools/utils/content_parser.py +16 -26
  47. {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/METADATA +2 -2
  48. {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/RECORD +51 -33
  49. {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/WHEEL +0 -0
  50. {alita_sdk-0.3.228.dist-info → alita_sdk-0.3.230.dist-info}/licenses/LICENSE +0 -0
  51. {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
- connection_string = tool['settings'].get('connection_string', None),
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
- connection_string = (Optional[SecretStr], Field(description="Connection string for vectorstore",
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
- figma_api_wrapper = FigmaApiWrapper(**kwargs)
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 = json.loads(self.get_project_files(project_id)).get('files', [])
240
- for file in files:
241
- yield Document(page_content=json.dumps(file), metadata={
242
- 'id': file.get('key', ''),
243
- 'file_key': file.get('key', ''),
244
- 'name': file.get('name', ''),
245
- 'updated_on': file.get('last_modified', '')
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=base64.b64encode(response.content).decode("utf-8"),
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(description="ID of the project to list files from", examples=["55391681"]))
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, Any
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
- github_access_token=tool['settings'].get('access_token', ''),
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
- connection_string=tool['settings'].get('connection_string', None),
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 AlitaGitHubAPIWrapper.model_construct().get_available_tools()}
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
- base_url=(Optional[str], Field(description="Base API URL", default="https://api.github.com", json_schema_extra={'configuration': True, 'configuration_title': True})),
82
- app_id=(Optional[str], Field(description="Github APP ID", default=None, json_schema_extra={'configuration': True})),
83
- app_private_key=(Optional[SecretStr], Field(description="Github APP private key", default=None, json_schema_extra={'secret': True, 'configuration': True})),
84
-
85
- access_token=(Optional[SecretStr], Field(description="Github Access Token", default=None, json_schema_extra={'secret': True, 'configuration': True})),
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
- selected_tools=(List[Literal[tuple(selected_tools)]], Field(default=[], json_schema_extra={'args_schemas': selected_tools}))
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
- github_api_wrapper = AlitaGitHubAPIWrapper(**kwargs)
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, SecretStr
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
- private_token=tool['settings']['private_token'],
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
- connection_string=tool['settings'].get('connection_string', None),
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
- private_token=(SecretStr, Field(description="GitLab private token", json_schema_extra={'secret': True, 'configuration': True})),
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
- connection_string=(Optional[SecretStr], Field(description="Connection string for vectorstore",
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
- gitlab_api_wrapper = GitLabAPIWrapper(**kwargs)
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, SecretStr, computed_field, field_validator
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
- api_key: Optional[SecretStr] = Field(
49
- default=None,
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
- api_key=tool["settings"].get("api_key", ""),
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
- bigquery_api_wrapper = BigQueryApiWrapper(**kwargs)
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
  )
@@ -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, SecretStr
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
- api_key=tool['settings'].get('api_key', None),
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
- connection_string=tool['settings'].get('connection_string', None),
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
- if self.token:
51
- headers['Authorization'] = f'Bearer {self.token}'
52
- elif self.username and self.api_key:
53
- auth = (self.username, self.api_key)
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
- # indexer settings
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
- jira_api_wrapper = JiraApiWrapper(**kwargs)
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, SecretStr, field_validator
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
- api_key=tool['settings'].get('api_key', None),
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
- api_key=(SecretStr, Field(description="Postman API key",
57
- json_schema_extra={'secret': True, 'configuration': True})),
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
- postman_api_wrapper = PostmanApiWrapper(**kwargs)
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
- qtest_api_token=tool['settings'].get('qtest_api_token', None),
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
- qtest_api_token=(SecretStr, Field(description="QTest API token", json_schema_extra={'secret': True, 'configuration': True})),
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
- qtest_api_wrapper = QtestApiWrapper(**kwargs)
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, SecretStr
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
- password=tool['settings'].get('password', None),
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
- servicenow_api_wrapper = ServiceNowAPIWrapper(**kwargs)
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 = []