aip-agents-binary 0.5.21__py3-none-any.whl → 0.5.23__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.
- aip_agents/examples/{hello_world_langgraph_bosa_twitter.py → hello_world_langgraph_gl_connector_twitter.py} +10 -7
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +2 -2
- aip_agents/mcp/client/transports.py +15 -2
- aip_agents/sentry/__init__.py +1 -1
- aip_agents/sentry/sentry.py +4 -4
- aip_agents/sentry/sentry.pyi +2 -2
- aip_agents/tools/__init__.py +8 -2
- aip_agents/tools/__init__.pyi +2 -2
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +80 -31
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +25 -9
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +6 -6
- aip_agents/tools/constants.py +24 -12
- aip_agents/tools/constants.pyi +14 -11
- aip_agents/tools/gl_connector/__init__.py +1 -1
- aip_agents/tools/gl_connector/tool.py +62 -30
- aip_agents/tools/gl_connector/tool.pyi +3 -3
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- {aip_agents_binary-0.5.21.dist-info → aip_agents_binary-0.5.23.dist-info}/METADATA +5 -5
- {aip_agents_binary-0.5.21.dist-info → aip_agents_binary-0.5.23.dist-info}/RECORD +23 -23
- aip_agents/examples/hello_world_langgraph_bosa_twitter.pyi +0 -5
- aip_agents/tools/bosa_tools.py +0 -105
- aip_agents/tools/bosa_tools.pyi +0 -37
- {aip_agents_binary-0.5.21.dist-info → aip_agents_binary-0.5.23.dist-info}/WHEEL +0 -0
- {aip_agents_binary-0.5.21.dist-info → aip_agents_binary-0.5.23.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Wrapper for GL Connectors.
|
|
2
2
|
|
|
3
3
|
Authors:
|
|
4
4
|
Saul Sayers (saul.sayers@gdplabs.id)
|
|
5
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
6
|
|
|
6
7
|
Reference:
|
|
7
8
|
https://gl-docs.gitbook.io/bosa/gl-connector/gl-connector
|
|
@@ -21,11 +22,23 @@ from pydantic import ConfigDict, PrivateAttr
|
|
|
21
22
|
from aip_agents.tools.constants import ToolType
|
|
22
23
|
|
|
23
24
|
_REQUIRED_ENV_VARS: tuple[str, ...] = (
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
25
|
+
"GL_CONNECTORS_BASE_URL",
|
|
26
|
+
"GL_CONNECTORS_API_KEY",
|
|
27
|
+
"GL_CONNECTORS_USERNAME",
|
|
28
|
+
"GL_CONNECTORS_PASSWORD",
|
|
28
29
|
)
|
|
30
|
+
|
|
31
|
+
_ENV_VAR_MAPPING: dict[str, tuple[str, ...]] = {
|
|
32
|
+
"GL_CONNECTORS_BASE_URL": (
|
|
33
|
+
"GL_CONNECTORS_BASE_URL",
|
|
34
|
+
"BOSA_BASE_URL",
|
|
35
|
+
"BOSA_API_BASE_URL",
|
|
36
|
+
),
|
|
37
|
+
"GL_CONNECTORS_API_KEY": ("GL_CONNECTORS_API_KEY", "BOSA_API_KEY"),
|
|
38
|
+
"GL_CONNECTORS_USERNAME": ("GL_CONNECTORS_USERNAME", "BOSA_USERNAME"),
|
|
39
|
+
"GL_CONNECTORS_PASSWORD": ("GL_CONNECTORS_PASSWORD", "BOSA_PASSWORD"),
|
|
40
|
+
"GL_CONNECTORS_IDENTIFIER": ("GL_CONNECTORS_IDENTIFIER", "BOSA_IDENTIFIER"),
|
|
41
|
+
}
|
|
29
42
|
_TOP_LEVEL_KEYS: tuple[str, ...] = (
|
|
30
43
|
"token",
|
|
31
44
|
"identifier",
|
|
@@ -145,12 +158,12 @@ def GLConnectorTool(
|
|
|
145
158
|
api_key: str | None = None,
|
|
146
159
|
identifier: str | None = None,
|
|
147
160
|
) -> BaseTool:
|
|
148
|
-
"""Create a single GL
|
|
161
|
+
"""Create a single tool from GL Connectors by exact tool name.
|
|
149
162
|
|
|
150
163
|
Args:
|
|
151
164
|
tool_name: Exact tool name (not module name).
|
|
152
|
-
api_key: Optional override for
|
|
153
|
-
identifier: Optional override for
|
|
165
|
+
api_key: Optional override for GL Connectors API key.
|
|
166
|
+
identifier: Optional override for GL Connectors identifier.
|
|
154
167
|
|
|
155
168
|
Returns:
|
|
156
169
|
A single LangChain BaseTool with token injection.
|
|
@@ -159,14 +172,17 @@ def GLConnectorTool(
|
|
|
159
172
|
raise ValueError("tool_name must be a non-empty string")
|
|
160
173
|
|
|
161
174
|
env_values = _load_env(api_key=api_key, identifier=identifier)
|
|
162
|
-
connector = BosaConnector(
|
|
175
|
+
connector = BosaConnector(
|
|
176
|
+
api_base_url=env_values["GL_CONNECTORS_BASE_URL"],
|
|
177
|
+
api_key=env_values["GL_CONNECTORS_API_KEY"],
|
|
178
|
+
)
|
|
163
179
|
|
|
164
180
|
modules = _get_available_modules(connector)
|
|
165
181
|
module_name = _resolve_module(tool_name, modules)
|
|
166
182
|
|
|
167
183
|
generator = BOSAConnectorToolGenerator(
|
|
168
|
-
api_base_url=env_values["
|
|
169
|
-
api_key=env_values["
|
|
184
|
+
api_base_url=env_values["GL_CONNECTORS_BASE_URL"],
|
|
185
|
+
api_key=env_values["GL_CONNECTORS_API_KEY"],
|
|
170
186
|
app_name=module_name,
|
|
171
187
|
)
|
|
172
188
|
tools = generator.generate_tools(tool_type=ToolType.LANGCHAIN)
|
|
@@ -177,16 +193,20 @@ def GLConnectorTool(
|
|
|
177
193
|
if len(matching) > 1:
|
|
178
194
|
raise ValueError(f"Multiple tools named '{tool_name}' found in module '{module_name}'")
|
|
179
195
|
|
|
180
|
-
token = _create_token(
|
|
181
|
-
|
|
196
|
+
token = _create_token(
|
|
197
|
+
connector,
|
|
198
|
+
env_values["GL_CONNECTORS_USERNAME"],
|
|
199
|
+
env_values["GL_CONNECTORS_PASSWORD"],
|
|
200
|
+
)
|
|
201
|
+
return _InjectedTool(matching[0], token, env_values.get("GL_CONNECTORS_IDENTIFIER"))
|
|
182
202
|
|
|
183
203
|
|
|
184
204
|
def _load_env(*, api_key: str | None, identifier: str | None) -> dict[str, str]:
|
|
185
205
|
"""Load and validate environment configuration for connector access.
|
|
186
206
|
|
|
187
207
|
Args:
|
|
188
|
-
api_key: Optional override for
|
|
189
|
-
identifier: Optional override for
|
|
208
|
+
api_key: Optional override for GL Connectors API key.
|
|
209
|
+
identifier: Optional override for GL Connectors identifier.
|
|
190
210
|
|
|
191
211
|
Returns:
|
|
192
212
|
Dictionary containing environment configuration values.
|
|
@@ -194,28 +214,40 @@ def _load_env(*, api_key: str | None, identifier: str | None) -> dict[str, str]:
|
|
|
194
214
|
Raises:
|
|
195
215
|
ValueError: If required environment variables are missing.
|
|
196
216
|
"""
|
|
197
|
-
env
|
|
217
|
+
env: dict[str, str | None] = {}
|
|
198
218
|
|
|
199
|
-
|
|
200
|
-
|
|
219
|
+
# Load from environment using mapping (prefers GL_CONNECTORS_* over BOSA_*)
|
|
220
|
+
for internal_key, env_vars in _ENV_VAR_MAPPING.items():
|
|
221
|
+
val = None
|
|
222
|
+
for var_name in env_vars:
|
|
223
|
+
val = os.getenv(var_name)
|
|
224
|
+
if val:
|
|
225
|
+
break
|
|
226
|
+
env[internal_key] = val
|
|
201
227
|
|
|
202
|
-
|
|
228
|
+
if api_key:
|
|
229
|
+
env["GL_CONNECTORS_API_KEY"] = api_key
|
|
203
230
|
|
|
204
|
-
if
|
|
205
|
-
env["
|
|
231
|
+
if identifier:
|
|
232
|
+
env["GL_CONNECTORS_IDENTIFIER"] = identifier
|
|
206
233
|
|
|
207
|
-
missing = [key for key
|
|
234
|
+
missing = [key for key in _REQUIRED_ENV_VARS if not env.get(key)]
|
|
208
235
|
if missing:
|
|
209
|
-
|
|
236
|
+
# Map back to human-friendly names for the error message
|
|
237
|
+
friendly_missing = []
|
|
238
|
+
for m in missing:
|
|
239
|
+
preferred = _ENV_VAR_MAPPING[m][0]
|
|
240
|
+
friendly_missing.append(preferred)
|
|
241
|
+
raise ValueError(f"Missing required environment variables: {', '.join(friendly_missing)}")
|
|
210
242
|
|
|
211
|
-
return {
|
|
243
|
+
return {k: v for k, v in env.items() if v is not None}
|
|
212
244
|
|
|
213
245
|
|
|
214
246
|
def _get_available_modules(connector: BosaConnector) -> list[str]:
|
|
215
247
|
"""Return available connector modules or raise an actionable error.
|
|
216
248
|
|
|
217
249
|
Args:
|
|
218
|
-
connector:
|
|
250
|
+
connector: GL Connectors instance to query for modules.
|
|
219
251
|
|
|
220
252
|
Returns:
|
|
221
253
|
List of available module names.
|
|
@@ -260,9 +292,9 @@ def _create_token(connector: BosaConnector, username: str, password: str) -> str
|
|
|
260
292
|
"""Authenticate the connector user and return a user token.
|
|
261
293
|
|
|
262
294
|
Args:
|
|
263
|
-
connector:
|
|
264
|
-
username:
|
|
265
|
-
password:
|
|
295
|
+
connector: GL Connectors instance for authentication.
|
|
296
|
+
username: GL Connectors username for authentication.
|
|
297
|
+
password: GL Connectors password for authentication.
|
|
266
298
|
|
|
267
299
|
Returns:
|
|
268
300
|
Authentication token string.
|
|
@@ -273,11 +305,11 @@ def _create_token(connector: BosaConnector, username: str, password: str) -> str
|
|
|
273
305
|
try:
|
|
274
306
|
user = connector.authenticate_bosa_user(username, password)
|
|
275
307
|
except Exception as exc:
|
|
276
|
-
raise ValueError("Failed to authenticate
|
|
308
|
+
raise ValueError("Failed to authenticate GL Connectors user") from exc
|
|
277
309
|
|
|
278
310
|
token = getattr(user, "token", None)
|
|
279
311
|
if not token:
|
|
280
|
-
raise ValueError("
|
|
312
|
+
raise ValueError("GL Connectors user token missing after authentication")
|
|
281
313
|
return token
|
|
282
314
|
|
|
283
315
|
|
|
@@ -62,12 +62,12 @@ class _InjectedTool(BaseTool):
|
|
|
62
62
|
"""
|
|
63
63
|
|
|
64
64
|
def GLConnectorTool(tool_name: str, *, api_key: str | None = None, identifier: str | None = None) -> BaseTool:
|
|
65
|
-
"""Create a single GL
|
|
65
|
+
"""Create a single tool from GL Connectors by exact tool name.
|
|
66
66
|
|
|
67
67
|
Args:
|
|
68
68
|
tool_name: Exact tool name (not module name).
|
|
69
|
-
api_key: Optional override for
|
|
70
|
-
identifier: Optional override for
|
|
69
|
+
api_key: Optional override for GL Connectors API key.
|
|
70
|
+
identifier: Optional override for GL Connectors identifier.
|
|
71
71
|
|
|
72
72
|
Returns:
|
|
73
73
|
A single LangChain BaseTool with token injection.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Auto-generated tools from GL Connectors.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Saul Sayers (saul.sayers@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from bosa_connectors import BosaConnector, BOSAConnectorToolGenerator
|
|
8
|
+
from langchain_core.tools import BaseTool
|
|
9
|
+
|
|
10
|
+
from aip_agents.tools.constants import (
|
|
11
|
+
GL_CONNECTORS_API_KEY,
|
|
12
|
+
GL_CONNECTORS_BASE_URL,
|
|
13
|
+
GL_CONNECTORS_FETCH_MAX_RETRIES,
|
|
14
|
+
ToolType,
|
|
15
|
+
)
|
|
16
|
+
from aip_agents.utils.logger import get_logger
|
|
17
|
+
|
|
18
|
+
logger = get_logger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_gl_connector_modules_with_retry() -> list[str]:
|
|
22
|
+
"""Try to get available modules with retries.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
List of available modules.
|
|
26
|
+
"""
|
|
27
|
+
if not GL_CONNECTORS_BASE_URL or not GL_CONNECTORS_API_KEY:
|
|
28
|
+
logger.warning("GL Connectors credentials missing (base_url or api_key); returning empty modules list")
|
|
29
|
+
return []
|
|
30
|
+
|
|
31
|
+
connector = BosaConnector(api_base_url=GL_CONNECTORS_BASE_URL, api_key=GL_CONNECTORS_API_KEY)
|
|
32
|
+
modules = []
|
|
33
|
+
for attempt in range(GL_CONNECTORS_FETCH_MAX_RETRIES):
|
|
34
|
+
try:
|
|
35
|
+
modules = list(connector.get_available_modules())
|
|
36
|
+
if modules:
|
|
37
|
+
return modules
|
|
38
|
+
logger.warning(
|
|
39
|
+
f"Failed to get GL Connectors available modules, retrying... (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES})"
|
|
40
|
+
)
|
|
41
|
+
except Exception as e:
|
|
42
|
+
logger.exception(
|
|
43
|
+
f"Exception when getting GL Connectors available modules (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES}): {e}"
|
|
44
|
+
)
|
|
45
|
+
logger.error("Failed to get GL Connectors available modules after maximum retries")
|
|
46
|
+
return modules
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class LazyGLConnectorToolsDict(dict):
|
|
50
|
+
"""Lazy dictionary for GL Connectors."""
|
|
51
|
+
|
|
52
|
+
def __missing__(self, app):
|
|
53
|
+
"""When a key is missing, create the tools and store them in the dictionary.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
app: Name of the GL Connectors.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
List of tools generated by the GL Connectors tool generator.
|
|
60
|
+
"""
|
|
61
|
+
if app not in get_gl_connector_modules():
|
|
62
|
+
return []
|
|
63
|
+
tools = []
|
|
64
|
+
for attempt in range(GL_CONNECTORS_FETCH_MAX_RETRIES):
|
|
65
|
+
try:
|
|
66
|
+
tools = BOSAConnectorToolGenerator(
|
|
67
|
+
api_base_url=GL_CONNECTORS_BASE_URL,
|
|
68
|
+
api_key=GL_CONNECTORS_API_KEY,
|
|
69
|
+
app_name=app,
|
|
70
|
+
).generate_tools(tool_type=ToolType.LANGCHAIN)
|
|
71
|
+
if tools:
|
|
72
|
+
self[app] = tools
|
|
73
|
+
return tools
|
|
74
|
+
logger.warning(
|
|
75
|
+
f"Failed to create GL Connectors, retrying... (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES})"
|
|
76
|
+
)
|
|
77
|
+
except Exception as e:
|
|
78
|
+
logger.exception(
|
|
79
|
+
f"Exception when creating GL Connectors for app '{app}' "
|
|
80
|
+
f"(attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES}): {e}"
|
|
81
|
+
)
|
|
82
|
+
logger.error("Failed to create GL Connectors after maximum retries")
|
|
83
|
+
return tools
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# Supported modules (dynamic)
|
|
87
|
+
def get_gl_connector_modules() -> list[str]:
|
|
88
|
+
"""Lazily fetch and cache GL Connectors modules.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
List of GL Connectors modules.
|
|
92
|
+
"""
|
|
93
|
+
if not hasattr(get_gl_connector_modules, "_cache"):
|
|
94
|
+
get_gl_connector_modules._cache = get_gl_connector_modules_with_retry()
|
|
95
|
+
return get_gl_connector_modules._cache
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# FOR BACKWARDS COMPATIBILITY
|
|
99
|
+
def get_bosa_modules() -> list[str]:
|
|
100
|
+
"""Backward-compatible alias for get_gl_connector_modules."""
|
|
101
|
+
return get_gl_connector_modules()
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
GL_CONNECTORS_MODULES = [
|
|
105
|
+
"github",
|
|
106
|
+
"twitter",
|
|
107
|
+
"google",
|
|
108
|
+
"google_drive",
|
|
109
|
+
"google_mail",
|
|
110
|
+
"google_docs",
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
# FOR BACKWARDS COMPATIBILITY
|
|
114
|
+
BOSA_MODULES = GL_CONNECTORS_MODULES
|
|
115
|
+
|
|
116
|
+
GL_CONNECTORS_AUTOMATED_TOOLS: dict[str, list[BaseTool]] = LazyGLConnectorToolsDict()
|
|
117
|
+
|
|
118
|
+
# FOR BACKWARDS COMPATIBILITY
|
|
119
|
+
BOSA_AUTOMATED_TOOLS = GL_CONNECTORS_AUTOMATED_TOOLS
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.tools.constants import GL_CONNECTORS_API_KEY as GL_CONNECTORS_API_KEY, GL_CONNECTORS_BASE_URL as GL_CONNECTORS_BASE_URL, GL_CONNECTORS_FETCH_MAX_RETRIES as GL_CONNECTORS_FETCH_MAX_RETRIES, ToolType as ToolType
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from langchain_core.tools import BaseTool as BaseTool
|
|
5
|
+
|
|
6
|
+
logger: Incomplete
|
|
7
|
+
|
|
8
|
+
def get_gl_connector_modules_with_retry() -> list[str]:
|
|
9
|
+
"""Try to get available modules with retries.
|
|
10
|
+
|
|
11
|
+
Returns:
|
|
12
|
+
List of available modules.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
class LazyGLConnectorToolsDict(dict):
|
|
16
|
+
"""Lazy dictionary for GL Connectors."""
|
|
17
|
+
def __missing__(self, app):
|
|
18
|
+
"""When a key is missing, create the tools and store them in the dictionary.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
app: Name of the GL Connectors.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
List of tools generated by the GL Connectors tool generator.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def get_gl_connector_modules() -> list[str]:
|
|
28
|
+
"""Lazily fetch and cache GL Connectors modules.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
List of GL Connectors modules.
|
|
32
|
+
"""
|
|
33
|
+
def get_bosa_modules() -> list[str]:
|
|
34
|
+
"""Backward-compatible alias for get_gl_connector_modules."""
|
|
35
|
+
|
|
36
|
+
GL_CONNECTORS_MODULES: Incomplete
|
|
37
|
+
BOSA_MODULES = GL_CONNECTORS_MODULES
|
|
38
|
+
GL_CONNECTORS_AUTOMATED_TOOLS: dict[str, list[BaseTool]]
|
|
39
|
+
BOSA_AUTOMATED_TOOLS = GL_CONNECTORS_AUTOMATED_TOOLS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aip-agents-binary
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.23
|
|
4
4
|
Summary: A library for managing agents in Gen AI applications.
|
|
5
5
|
Author-email: Raymond Christopher <raymond.christopher@gdplabs.id>
|
|
6
6
|
Requires-Python: <3.13,>=3.11
|
|
@@ -15,7 +15,7 @@ Requires-Dist: deprecated<2.0.0,>=1.2.18
|
|
|
15
15
|
Requires-Dist: fastapi<0.121.0,>=0.120.0
|
|
16
16
|
Requires-Dist: gllm-core-binary<0.4.0,>=0.3.18
|
|
17
17
|
Requires-Dist: gllm-inference-binary[anthropic,bedrock,google-genai,google-vertexai,openai]<0.6.0,>=0.5.90
|
|
18
|
-
Requires-Dist: gllm-tools-binary<0.2.0,>=0.1.
|
|
18
|
+
Requires-Dist: gllm-tools-binary<0.2.0,>=0.1.5
|
|
19
19
|
Requires-Dist: google-adk<0.6.0,>=0.5.0
|
|
20
20
|
Requires-Dist: langchain<0.4.0,>=0.3.0
|
|
21
21
|
Requires-Dist: langchain-openai<0.4.0,>=0.3.17
|
|
@@ -34,7 +34,7 @@ Requires-Dist: gllm-privacy-binary<0.5.0,>=0.4.12; extra == "privacy"
|
|
|
34
34
|
Provides-Extra: gl-connector
|
|
35
35
|
Requires-Dist: bosa-connectors-binary<0.4.0,>=0.3.1; extra == "gl-connector"
|
|
36
36
|
Provides-Extra: local
|
|
37
|
-
Requires-Dist: e2b<
|
|
37
|
+
Requires-Dist: e2b<3.0.0,>=2.3.0; extra == "local"
|
|
38
38
|
Requires-Dist: browser-use==0.5.9; extra == "local"
|
|
39
39
|
Requires-Dist: steel-sdk>=0.7.0; extra == "local"
|
|
40
40
|
Requires-Dist: json-repair>=0.52.3; extra == "local"
|
|
@@ -159,9 +159,9 @@ Navigate to the library's root directory (e.g., `python/aip-agents` if you clone
|
|
|
159
159
|
python aip_agents/examples/hello_world_langgraph.py
|
|
160
160
|
```
|
|
161
161
|
|
|
162
|
-
**LangGraph with
|
|
162
|
+
**LangGraph with GL Connectors (OpenAI):**
|
|
163
163
|
```bash
|
|
164
|
-
python aip_agents/examples/
|
|
164
|
+
python aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
**LangGraph Streaming (OpenAI):**
|
|
@@ -179,8 +179,8 @@ aip_agents/examples/hello_world_langflow_agent.py,sha256=pkchyUiTM2VlWUcW2TDZLzo
|
|
|
179
179
|
aip_agents/examples/hello_world_langflow_agent.pyi,sha256=8cwZzGBqv_gaf-M7lGewOSL0XXxYjufgg2ZlXpKN2DQ,1286
|
|
180
180
|
aip_agents/examples/hello_world_langgraph.py,sha256=uTsZ7X5up_BmQqKTKh0F1fsvkXpm9puOANXd33-pb9g,1287
|
|
181
181
|
aip_agents/examples/hello_world_langgraph.pyi,sha256=nCbikXhA0CFeIgDFoD4UcwkAXvEUUgwZCUXwc8jLWno,256
|
|
182
|
-
aip_agents/examples/
|
|
183
|
-
aip_agents/examples/
|
|
182
|
+
aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py,sha256=1ScB8V50LCPLadOFWDdDGAGMEc2U5oT4EZmkNfdHuzI,1372
|
|
183
|
+
aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi,sha256=Xku8mu9_2QbNpYEJH8imik4IDL6hQKYqpGtPs_AHTlU,269
|
|
184
184
|
aip_agents/examples/hello_world_langgraph_mcp_http.py,sha256=8Vu3Q_RChDlBgPcbh9h7U4Cy7x4SakRGttOtQeHluyI,1039
|
|
185
185
|
aip_agents/examples/hello_world_langgraph_mcp_http.pyi,sha256=M1LXhrQOUDquRcGOWOtu_tbnjcOU0qtmEvizDa1H4PA,269
|
|
186
186
|
aip_agents/examples/hello_world_langgraph_mcp_http_stream.py,sha256=-g7YmaFtBSdxcJ6ZQplcP4OB26M_8UV4ZImDxmk5owI,1163
|
|
@@ -209,7 +209,7 @@ aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py,sha256=B0I92
|
|
|
209
209
|
aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi,sha256=OHkTLSqRAM7TOZEp6TH5dsPq9zbpi9UA_l0rDIrqFlM,257
|
|
210
210
|
aip_agents/examples/hello_world_pii_logger.py,sha256=xH4PNGetuZv1TJj5Y1fqvm1Vto0pp1u5ju-ORccEFwo,605
|
|
211
211
|
aip_agents/examples/hello_world_pii_logger.pyi,sha256=tZ0oOfd_gK97KHczzEh3PQfTt2eedh25IL7Q1PhVDWU,139
|
|
212
|
-
aip_agents/examples/hello_world_sentry.py,sha256=
|
|
212
|
+
aip_agents/examples/hello_world_sentry.py,sha256=HRnIVTkaqcUGbVbVVCzB8HQv5nVqHbt_3aPiflrD31M,4109
|
|
213
213
|
aip_agents/examples/hello_world_sentry.pyi,sha256=Z6t3ywrVlgBI9NFxbcbhRVAwt71Q3NsB_JvwZhcd0aQ,692
|
|
214
214
|
aip_agents/examples/hello_world_step_limits.py,sha256=0f02AFrpfAertnjSHxQiU6uAyIWt0ovQ3aQ5QCJPSx4,10082
|
|
215
215
|
aip_agents/examples/hello_world_step_limits.pyi,sha256=U9kx6rIgfZuNHxeAIiyW_Ae-KT65kNqCdCMQzKEKlBc,1077
|
|
@@ -292,7 +292,7 @@ aip_agents/mcp/client/persistent_session.py,sha256=x7YUX3EwIg4Ixs0D7Sb7-SyYxNYlj
|
|
|
292
292
|
aip_agents/mcp/client/persistent_session.pyi,sha256=eMqoGE84JJtDDwiJJSNIsjwWrldB9luaVA7UeXlBGrc,4021
|
|
293
293
|
aip_agents/mcp/client/session_pool.py,sha256=qYxtalGyT1Z4a5LIDe2X9QinduOz4f_U9yDzBH_qjKI,12968
|
|
294
294
|
aip_agents/mcp/client/session_pool.pyi,sha256=dUXl8g4G4asZ1CplaeZaR24suyU4gAgKzvQNOlriQA0,3680
|
|
295
|
-
aip_agents/mcp/client/transports.py,sha256=
|
|
295
|
+
aip_agents/mcp/client/transports.py,sha256=VsxJmNDb86_kdEmuc9T0764nELboc4_VvCLQ8OUDUDk,8852
|
|
296
296
|
aip_agents/mcp/client/transports.pyi,sha256=LCZfHvwHRwk4T3EyK2RerpEFyIfwfVFuon2igbEVH28,4699
|
|
297
297
|
aip_agents/mcp/client/google_adk/__init__.py,sha256=mbVak_4MCHVNkgm6EQhkrR1HDAPo1Q7cP3nk55TPtu4,291
|
|
298
298
|
aip_agents/mcp/client/google_adk/__init__.pyi,sha256=lG0PHv3Rcvl4BOeUkmJC5nx2HQJsmUMnYmC9iD99l0s,130
|
|
@@ -348,10 +348,10 @@ aip_agents/schema/step_limit.py,sha256=ETQPjLl1W8feoqjYjFZA55GRPXoOdeko1M0hC_LH-
|
|
|
348
348
|
aip_agents/schema/step_limit.pyi,sha256=7tVT55X3EKEWDRLkIsyhkcwVO9wQ_winbh7wYsA9KGQ,2381
|
|
349
349
|
aip_agents/schema/storage.py,sha256=sH2VP0BE6-SNVb4YFs6QJdtKU_Cg9DQ2wmtMgnHpISA,1330
|
|
350
350
|
aip_agents/schema/storage.pyi,sha256=pqfdgfT1kja5FM3aN_uqMpw5ewTpNUDr1Feg0K7Bfl0,578
|
|
351
|
-
aip_agents/sentry/__init__.py,sha256=
|
|
351
|
+
aip_agents/sentry/__init__.py,sha256=SluWkDegy1aOArrEos_-qINXlU7-qWuFLHK4VsQRFQs,272
|
|
352
352
|
aip_agents/sentry/__init__.pyi,sha256=l3OSA6R-PI5NBsEcTd0QG9AX59uDzNrbasA6EJJMzTU,106
|
|
353
|
-
aip_agents/sentry/sentry.py,sha256=
|
|
354
|
-
aip_agents/sentry/sentry.pyi,sha256=
|
|
353
|
+
aip_agents/sentry/sentry.py,sha256=hIPaxrnG35Mn3DHZDluuAbMktGuy0N-ZRge3anOIbM0,4655
|
|
354
|
+
aip_agents/sentry/sentry.pyi,sha256=kBHuQrfhqY9ifq3BbZdcjn0kedIWUiLtO78NX4-CdaE,1480
|
|
355
355
|
aip_agents/storage/__init__.py,sha256=GIdxlSMf59hPPeurfnJpqh70JnF3LbEWH7tYFAO1tjI,1260
|
|
356
356
|
aip_agents/storage/__init__.pyi,sha256=jVVcK1_V657EPjpZn5y_jcn-HbiiqMPG9oLIbeVaUlI,909
|
|
357
357
|
aip_agents/storage/base.py,sha256=-adphvyI8awPPFF2ptHpx5_6PGoRl2Z59USCTOXEL2k,2498
|
|
@@ -370,12 +370,12 @@ aip_agents/storage/providers/memory.py,sha256=Zd7QwYacEfaHLCpjvV3XaHSRulhfS464U0
|
|
|
370
370
|
aip_agents/storage/providers/memory.pyi,sha256=NpsqKzboQGWtxtFV1ch_C3KT0KHOLyac6TtBgkLRgjI,2188
|
|
371
371
|
aip_agents/storage/providers/object_storage.py,sha256=RlhXdaL1YTH9oqf7crvftsicHRxJlaLO3UgLPRCWlfg,6627
|
|
372
372
|
aip_agents/storage/providers/object_storage.pyi,sha256=4pvDaNqhDleOm3ijMe_Yk3meBn2UCpLP9bKAH1l6C7w,2976
|
|
373
|
-
aip_agents/tools/__init__.py,sha256
|
|
374
|
-
aip_agents/tools/__init__.pyi,sha256
|
|
375
|
-
aip_agents/tools/
|
|
376
|
-
aip_agents/tools/
|
|
377
|
-
aip_agents/tools/
|
|
378
|
-
aip_agents/tools/
|
|
373
|
+
aip_agents/tools/__init__.py,sha256=-4NJEX914Zhvl7ivBy6ztWowtzpaR4r4ammXFydjWGw,1988
|
|
374
|
+
aip_agents/tools/__init__.pyi,sha256=b4plRUwyRypopaZfKMFSj0kTGb0paYL1FPm0EsWRPVw,897
|
|
375
|
+
aip_agents/tools/constants.py,sha256=xNf9_pv_Rf4TCODr7BYLO05Kw5cD55MWiYfDyLWPJ3Y,5900
|
|
376
|
+
aip_agents/tools/constants.pyi,sha256=ftkzuxDMnVUqVeqm4W848olK-VSlRH4oSv1p66sZnHk,3690
|
|
377
|
+
aip_agents/tools/gl_connector_tools.py,sha256=1VrXUKRiYO21v4JWOaoo1XNaIKSm_0KmXp3AMx_UL_8,4055
|
|
378
|
+
aip_agents/tools/gl_connector_tools.pyi,sha256=wPK8hjFEZvQtRxBwX2MEebw6d4bXzn7nWxvcWPgYJ-c,1405
|
|
379
379
|
aip_agents/tools/memory_search_tool.py,sha256=ClXW6BEjZNHb6NHe44KxbwZ6GSGo7v7AUzaV99LMouc,679
|
|
380
380
|
aip_agents/tools/memory_search_tool.pyi,sha256=kjUaPWFrUIHrCTla_7ccnEWUNb44v0ZHLxyKGLPyeWg,456
|
|
381
381
|
aip_agents/tools/time_tool.py,sha256=4m6PrLwLyyF-2UM7VqwhnyqPAWpbxub2SR1t6RIftkY,3849
|
|
@@ -412,9 +412,9 @@ aip_agents/tools/code_sandbox/__init__.py,sha256=jsBesvd07L8MGInVoBXkss_BxKK3XGK
|
|
|
412
412
|
aip_agents/tools/code_sandbox/__init__.pyi,sha256=E-Ub6SWqRmx1bL8cQAbCBV4Ao8a8OjsC8skub2iZ9mw,137
|
|
413
413
|
aip_agents/tools/code_sandbox/constant.py,sha256=pfDb03wmFcVh0uggWA_0bj6CWeUSHC7ZikVKokeFcRQ,692
|
|
414
414
|
aip_agents/tools/code_sandbox/constant.pyi,sha256=seNiSpmQVwmC1mbYRloaIk511RuOPlYQv8GHCwBczDU,85
|
|
415
|
-
aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py,sha256=
|
|
416
|
-
aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi,sha256=
|
|
417
|
-
aip_agents/tools/code_sandbox/e2b_sandbox_tool.py,sha256=
|
|
415
|
+
aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py,sha256=vUNTXqpL1-7civtH5YqOnXKwb8_txHyVDpf1vns49oM,12319
|
|
416
|
+
aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi,sha256=LxWVmVvBeoN1oWFYOsv8gVodtFxkIpVDq-fM_MthI4Y,4468
|
|
417
|
+
aip_agents/tools/code_sandbox/e2b_sandbox_tool.py,sha256=l_bQC51UwIGYOIm4R6XNdLMjydrCvjUe31wBFzym05A,17348
|
|
418
418
|
aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi,sha256=ANJMJJ4HIHtiWObJ_PVRjo_DyMwkjDiWEMY8mmYLfdo,1194
|
|
419
419
|
aip_agents/tools/document_loader/__init__.py,sha256=D-NVmHr7hb21ctpFrpAoj5QaC0JBNYekNZ3zV6Zn4lE,1419
|
|
420
420
|
aip_agents/tools/document_loader/__init__.pyi,sha256=T4JAnBCGWG1ZZz7-1fZwg210ltO_74dpHOhs9hgekqI,657
|
|
@@ -428,10 +428,10 @@ aip_agents/tools/document_loader/pdf_reader_tool.py,sha256=4JUMv6ITyCBBoA4otKjwC
|
|
|
428
428
|
aip_agents/tools/document_loader/pdf_reader_tool.pyi,sha256=L4lTJApRBRWAQazbd6hCEvt4VVzK1zTzyrQYGsDAaKM,505
|
|
429
429
|
aip_agents/tools/document_loader/pdf_splitter.py,sha256=-phEFl9DBoG3epUmc9ajtZ57gKCPyApSX3fjyTWOuKA,5921
|
|
430
430
|
aip_agents/tools/document_loader/pdf_splitter.pyi,sha256=rUsKSMPevXY91GpYIKEBvcVzBjLIX4PKdBfL4ywD4QU,734
|
|
431
|
-
aip_agents/tools/gl_connector/__init__.py,sha256=
|
|
431
|
+
aip_agents/tools/gl_connector/__init__.py,sha256=un2-A8iOnO3oKx6ZtUIMQTLgZLmtl8SQELMvrAXeTiE,142
|
|
432
432
|
aip_agents/tools/gl_connector/__init__.pyi,sha256=cJXQnMCwZbn4Qs2umOwRsIK24kcg1zmTikO-LNHK_Q4,116
|
|
433
|
-
aip_agents/tools/gl_connector/tool.py,sha256=
|
|
434
|
-
aip_agents/tools/gl_connector/tool.pyi,sha256=
|
|
433
|
+
aip_agents/tools/gl_connector/tool.py,sha256=D6CjeJiKvg0321Ok3Ylchl23-iEOVcUCOZQlxj5utxQ,13489
|
|
434
|
+
aip_agents/tools/gl_connector/tool.pyi,sha256=gX30AG8P4YRpuFkt7xnj-l3O6Ri1SZENfnpJcZ2Vxl0,2844
|
|
435
435
|
aip_agents/tools/memory_search/__init__.py,sha256=jonWk8gERcM-f0l_xBIzNyHqvKXSNWXBDUdtkCbvZ48,630
|
|
436
436
|
aip_agents/tools/memory_search/__init__.pyi,sha256=9zElnDT6yiEQQvod0_YmIK6tL_ugHhBa6r21lRPp1Is,559
|
|
437
437
|
aip_agents/tools/memory_search/base.py,sha256=JUr6WWv92DGHtjbs7BJc-xr0peQkt2TJr_tah2AvqB4,7533
|
|
@@ -540,7 +540,7 @@ aip_agents/utils/pii/pii_helper.py,sha256=8QGVC9lb7dic_vSfLDUaDvqm45BUbYyPeQTVva
|
|
|
540
540
|
aip_agents/utils/pii/pii_helper.pyi,sha256=wEgOasJxwKObtQ9Cb1UsiyIaqq2JUYmdRwOZR9PnIjA,3017
|
|
541
541
|
aip_agents/utils/pii/uuid_deanonymizer_mapping.py,sha256=X9zeX1bhb3rlCc8P5QnbHCILx2AIhGmZwjsjh_2G4ZQ,7543
|
|
542
542
|
aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi,sha256=6H1xRV2Nr0LpP5K6fbz2uCobehTpM2626v8kiOd9W9Y,3157
|
|
543
|
-
aip_agents_binary-0.5.
|
|
544
|
-
aip_agents_binary-0.5.
|
|
545
|
-
aip_agents_binary-0.5.
|
|
546
|
-
aip_agents_binary-0.5.
|
|
543
|
+
aip_agents_binary-0.5.23.dist-info/METADATA,sha256=_a-Fvb_Eb9t0DaR-rkSlMXX1WU0lO1kk9N9bNFUi-ic,22895
|
|
544
|
+
aip_agents_binary-0.5.23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
545
|
+
aip_agents_binary-0.5.23.dist-info/top_level.txt,sha256=PEz8vcwC1bH4UrkhF0LkIYCNfXGWZUHdSklbvkBe25E,11
|
|
546
|
+
aip_agents_binary-0.5.23.dist-info/RECORD,,
|
aip_agents/tools/bosa_tools.py
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
"""Auto-generated tools from BOSA connector.
|
|
2
|
-
|
|
3
|
-
Authors:
|
|
4
|
-
Saul Sayers (saul.sayers@gdplabs.id)
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from bosa_connectors import BosaConnector, BOSAConnectorToolGenerator
|
|
8
|
-
from langchain_core.tools import BaseTool
|
|
9
|
-
|
|
10
|
-
from aip_agents.tools.constants import BOSA_API_BASE_URL, BOSA_API_KEY, BOSA_FETCH_MAX_RETRIES, ToolType
|
|
11
|
-
from aip_agents.utils.logger import get_logger
|
|
12
|
-
|
|
13
|
-
logger = get_logger(__name__)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def get_bosa_modules_with_retry() -> list[str]:
|
|
17
|
-
"""Try to get available modules with retries.
|
|
18
|
-
|
|
19
|
-
Returns:
|
|
20
|
-
List of available modules.
|
|
21
|
-
"""
|
|
22
|
-
if not BOSA_API_BASE_URL or not BOSA_API_KEY:
|
|
23
|
-
logger.warning("BOSA credentials missing (base_url or api_key); returning empty modules list")
|
|
24
|
-
return []
|
|
25
|
-
|
|
26
|
-
connector = BosaConnector(api_base_url=BOSA_API_BASE_URL, api_key=BOSA_API_KEY)
|
|
27
|
-
modules = []
|
|
28
|
-
for attempt in range(BOSA_FETCH_MAX_RETRIES):
|
|
29
|
-
try:
|
|
30
|
-
modules = list(connector.get_available_modules())
|
|
31
|
-
if modules:
|
|
32
|
-
return modules
|
|
33
|
-
logger.warning(
|
|
34
|
-
f"Failed to get BOSA available modules, retrying... (attempt {attempt + 1} / {BOSA_FETCH_MAX_RETRIES})"
|
|
35
|
-
)
|
|
36
|
-
except Exception as e:
|
|
37
|
-
logger.exception(
|
|
38
|
-
f"Exception when getting BOSA available modules (attempt {attempt + 1} / {BOSA_FETCH_MAX_RETRIES}): {e}"
|
|
39
|
-
)
|
|
40
|
-
logger.error("Failed to get BOSA available modules after maximum retries")
|
|
41
|
-
return modules
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class LazyBosaToolsDict(dict):
|
|
45
|
-
"""Lazy dictionary for BOSA tools."""
|
|
46
|
-
|
|
47
|
-
def __missing__(self, app):
|
|
48
|
-
"""When a key is missing, create the tools and store them in the dictionary.
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
app: Name of the BOSA connector.
|
|
52
|
-
|
|
53
|
-
Returns:
|
|
54
|
-
List of tools generated by BOSAConnectorToolGenerator.
|
|
55
|
-
"""
|
|
56
|
-
if app not in get_bosa_modules():
|
|
57
|
-
return []
|
|
58
|
-
tools = []
|
|
59
|
-
for attempt in range(BOSA_FETCH_MAX_RETRIES):
|
|
60
|
-
try:
|
|
61
|
-
tools = BOSAConnectorToolGenerator(
|
|
62
|
-
api_base_url=BOSA_API_BASE_URL,
|
|
63
|
-
api_key=BOSA_API_KEY,
|
|
64
|
-
app_name=app,
|
|
65
|
-
).generate_tools(tool_type=ToolType.LANGCHAIN)
|
|
66
|
-
if tools:
|
|
67
|
-
self[app] = tools
|
|
68
|
-
return tools
|
|
69
|
-
logger.warning(
|
|
70
|
-
f"Failed to create BOSA tools, retrying... (attempt {attempt + 1} / {BOSA_FETCH_MAX_RETRIES})"
|
|
71
|
-
)
|
|
72
|
-
except Exception as e:
|
|
73
|
-
logger.exception(
|
|
74
|
-
f"Exception when creating BOSA tools for app '{app}' "
|
|
75
|
-
f"(attempt {attempt + 1} / {BOSA_FETCH_MAX_RETRIES}): {e}"
|
|
76
|
-
)
|
|
77
|
-
logger.error("Failed to create BOSA tools after maximum retries")
|
|
78
|
-
return tools
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
# Supported modules (dynamic)
|
|
82
|
-
def get_bosa_modules() -> list[str]:
|
|
83
|
-
"""Lazily fetch and cache BOSA modules.
|
|
84
|
-
|
|
85
|
-
This is for backwards compatibility with the old BOSA modules.
|
|
86
|
-
|
|
87
|
-
Returns:
|
|
88
|
-
List of BOSA modules.
|
|
89
|
-
"""
|
|
90
|
-
if not hasattr(get_bosa_modules, "_cache"):
|
|
91
|
-
get_bosa_modules._cache = get_bosa_modules_with_retry()
|
|
92
|
-
return get_bosa_modules._cache
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
# FOR BACKWARDS COMPATIBILITY
|
|
96
|
-
BOSA_MODULES = [
|
|
97
|
-
"github",
|
|
98
|
-
"twitter",
|
|
99
|
-
"google",
|
|
100
|
-
"google_drive",
|
|
101
|
-
"google_mail",
|
|
102
|
-
"google_docs",
|
|
103
|
-
]
|
|
104
|
-
|
|
105
|
-
BOSA_AUTOMATED_TOOLS: dict[str, list[BaseTool]] = LazyBosaToolsDict()
|
aip_agents/tools/bosa_tools.pyi
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.tools.constants import BOSA_API_BASE_URL as BOSA_API_BASE_URL, BOSA_API_KEY as BOSA_API_KEY, BOSA_FETCH_MAX_RETRIES as BOSA_FETCH_MAX_RETRIES, ToolType as ToolType
|
|
3
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
-
from langchain_core.tools import BaseTool as BaseTool
|
|
5
|
-
|
|
6
|
-
logger: Incomplete
|
|
7
|
-
|
|
8
|
-
def get_bosa_modules_with_retry() -> list[str]:
|
|
9
|
-
"""Try to get available modules with retries.
|
|
10
|
-
|
|
11
|
-
Returns:
|
|
12
|
-
List of available modules.
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
class LazyBosaToolsDict(dict):
|
|
16
|
-
"""Lazy dictionary for BOSA tools."""
|
|
17
|
-
def __missing__(self, app):
|
|
18
|
-
"""When a key is missing, create the tools and store them in the dictionary.
|
|
19
|
-
|
|
20
|
-
Args:
|
|
21
|
-
app: Name of the BOSA connector.
|
|
22
|
-
|
|
23
|
-
Returns:
|
|
24
|
-
List of tools generated by BOSAConnectorToolGenerator.
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
def get_bosa_modules() -> list[str]:
|
|
28
|
-
"""Lazily fetch and cache BOSA modules.
|
|
29
|
-
|
|
30
|
-
This is for backwards compatibility with the old BOSA modules.
|
|
31
|
-
|
|
32
|
-
Returns:
|
|
33
|
-
List of BOSA modules.
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
BOSA_MODULES: Incomplete
|
|
37
|
-
BOSA_AUTOMATED_TOOLS: dict[str, list[BaseTool]]
|
|
File without changes
|
|
File without changes
|