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.
@@ -1,7 +1,8 @@
1
- """GL Connector tool wrapper for BOSA connector tools.
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
- "BOSA_BASE_URL",
25
- "BOSA_API_KEY",
26
- "BOSA_USERNAME",
27
- "BOSA_PASSWORD",
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 Connector tool by exact tool name.
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 BOSA API key.
153
- identifier: Optional override for BOSA identifier.
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(api_base_url=env_values["BOSA_BASE_URL"], api_key=env_values["BOSA_API_KEY"])
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["BOSA_BASE_URL"],
169
- api_key=env_values["BOSA_API_KEY"],
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(connector, env_values["BOSA_USERNAME"], env_values["BOSA_PASSWORD"])
181
- return _InjectedTool(matching[0], token, env_values.get("BOSA_IDENTIFIER"))
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 BOSA API key.
189
- identifier: Optional override for BOSA identifier.
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 = {key: os.getenv(key) for key in _REQUIRED_ENV_VARS}
217
+ env: dict[str, str | None] = {}
198
218
 
199
- resolved_api_key = api_key or env["BOSA_API_KEY"]
200
- env["BOSA_API_KEY"] = resolved_api_key
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
- optional_identifier = identifier or os.getenv("BOSA_IDENTIFIER")
228
+ if api_key:
229
+ env["GL_CONNECTORS_API_KEY"] = api_key
203
230
 
204
- if optional_identifier:
205
- env["BOSA_IDENTIFIER"] = optional_identifier
231
+ if identifier:
232
+ env["GL_CONNECTORS_IDENTIFIER"] = identifier
206
233
 
207
- missing = [key for key, value in env.items() if key in _REQUIRED_ENV_VARS and not value]
234
+ missing = [key for key in _REQUIRED_ENV_VARS if not env.get(key)]
208
235
  if missing:
209
- raise ValueError(f"Missing required environment variables: {', '.join(missing)}")
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 {key: value for key, value in env.items() if value is not None}
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: BOSA connector instance to query for modules.
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: BOSA connector instance for authentication.
264
- username: BOSA username for authentication.
265
- password: BOSA password for authentication.
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 BOSA user") from exc
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("BOSA user token missing after authentication")
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 Connector tool by exact tool name.
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 BOSA API key.
70
- identifier: Optional override for BOSA identifier.
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.21
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.3
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<2.0.0,>=1.5.4; extra == "local"
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 BOSA Connector (OpenAI):**
162
+ **LangGraph with GL Connectors (OpenAI):**
163
163
  ```bash
164
- python aip_agents/examples/hello_world_langgraph_bosa_twitter.py
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/hello_world_langgraph_bosa_twitter.py,sha256=S0_5s3EB9cPDMW9N_o344tpwcxl_G-8GLjp2qYj_V_Y,1265
183
- aip_agents/examples/hello_world_langgraph_bosa_twitter.pyi,sha256=J1GU1IYl7xi_ML-EC-YTHANlQt-u2o_W7ToIpRGKz6Q,243
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=2I7xUGGptGJoZgxmDj-FERwaAu-MRlTqDHLYPH6bAiI,4091
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=YF9ZwnVH1G4z6Wiv3IcFptq3D37bqlfjvF5s_rP0hnI,8387
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=AfUfS9T0nTWRoHubwHtXJB6_vkyp7b6l4U_FcI33K2I,263
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=0DZfB0MgUm508GO9LRpe0ts20YjrTOiyMyaa7OIO-c0,4652
354
- aip_agents/sentry/sentry.pyi,sha256=7e8CnhIkXdrP-MsrTrpwjSeKPjqLroxhcBljXgbjbiQ,1484
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=HoTjIH5o3xFwa5FYGugmwAhi7MXkBc0vf6IDG9qiOgU,1887
374
- aip_agents/tools/__init__.pyi,sha256=-yGiktAQqVJt-nspG79nQWEUCplAT4v-TadqQQb4rRc,792
375
- aip_agents/tools/bosa_tools.py,sha256=Zu5hhHx2LCBtvw9A30wYf1x5v4DQiB6MxePh12J77a4,3516
376
- aip_agents/tools/bosa_tools.pyi,sha256=ZidEMjX8TfdlSzLicwJQDbyoet9LeRqH8NSUSZ2tM7o,1165
377
- aip_agents/tools/constants.py,sha256=YZJFHKJvU9XkRKG_9hOpZ9ZreMoMoBXjF3SNsN51WhI,5439
378
- aip_agents/tools/constants.pyi,sha256=_M2Hm3OoCke51rxH4Pei5TPufD1stvpBqsQzmyFHNCk,3528
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=mBX9Om3sQgXelgU2IeBSl1ZqIAkiR8e0UTw0JITvpLg,10078
416
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi,sha256=GlOGnJA_iHFpf5xrhzdbNaVkGHNB1xaCzN6eori9mxI,3640
417
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py,sha256=S5-THddk2cgEWISXcx8ETJ5Ad9LKfzvlDRn7QLounaY,17365
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=gGH4VY5BhETm474oAx8gU0vpAdt9CYM9433YwaK_d2I,141
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=cDzrG-jquc4gIEQiFkvc7PVenM4DAV6t_9u32t5-v4A,12350
434
- aip_agents/tools/gl_connector/tool.pyi,sha256=cF5eC8154_ah4ZyrOuVk4r3aRJXMnDPTn3FMJlFwfm4,2820
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.21.dist-info/METADATA,sha256=L2JUdnr6SuTg8JVn4SIKQyl7e7hko0OPrrNcCe9DEQ4,22888
544
- aip_agents_binary-0.5.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
545
- aip_agents_binary-0.5.21.dist-info/top_level.txt,sha256=PEz8vcwC1bH4UrkhF0LkIYCNfXGWZUHdSklbvkBe25E,11
546
- aip_agents_binary-0.5.21.dist-info/RECORD,,
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,,
@@ -1,5 +0,0 @@
1
- from aip_agents.agent import LangGraphAgent as LangGraphAgent
2
- from aip_agents.tools import BOSA_AUTOMATED_TOOLS as BOSA_AUTOMATED_TOOLS
3
-
4
- async def langgraph_bosa_example() -> None:
5
- """Demonstrates the LangGraphAgent's arun method."""
@@ -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()
@@ -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]]