aip-agents-binary 0.5.20__py3-none-any.whl → 0.5.22__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 (281) hide show
  1. aip_agents/__init__.pyi +19 -0
  2. aip_agents/a2a/__init__.pyi +3 -0
  3. aip_agents/a2a/server/__init__.pyi +4 -0
  4. aip_agents/a2a/server/base_executor.pyi +73 -0
  5. aip_agents/a2a/server/google_adk_executor.pyi +51 -0
  6. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  7. aip_agents/a2a/server/langgraph_executor.pyi +47 -0
  8. aip_agents/a2a/types.pyi +132 -0
  9. aip_agents/agent/__init__.pyi +9 -0
  10. aip_agents/agent/base_agent.pyi +221 -0
  11. aip_agents/agent/base_langgraph_agent.pyi +232 -0
  12. aip_agents/agent/google_adk_agent.pyi +141 -0
  13. aip_agents/agent/google_adk_constants.pyi +3 -0
  14. aip_agents/agent/hitl/__init__.pyi +6 -0
  15. aip_agents/agent/hitl/config.pyi +15 -0
  16. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  17. aip_agents/agent/hitl/manager.pyi +200 -0
  18. aip_agents/agent/hitl/models.pyi +3 -0
  19. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  20. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  21. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  22. aip_agents/agent/hitl/registry.pyi +101 -0
  23. aip_agents/agent/interface.pyi +81 -0
  24. aip_agents/agent/interfaces.pyi +44 -0
  25. aip_agents/agent/langflow_agent.pyi +133 -0
  26. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
  27. aip_agents/agent/langgraph_react_agent.pyi +126 -0
  28. aip_agents/agent/system_instruction_context.pyi +13 -0
  29. aip_agents/clients/__init__.pyi +4 -0
  30. aip_agents/clients/langflow/__init__.pyi +4 -0
  31. aip_agents/clients/langflow/client.pyi +140 -0
  32. aip_agents/clients/langflow/types.pyi +7 -0
  33. aip_agents/constants.pyi +7 -0
  34. aip_agents/examples/__init__.pyi +0 -0
  35. aip_agents/examples/compare_streaming_client.pyi +48 -0
  36. aip_agents/examples/compare_streaming_server.pyi +18 -0
  37. aip_agents/examples/demo_memory_recall.pyi +58 -0
  38. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
  39. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
  40. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
  41. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
  42. aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
  43. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
  44. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
  45. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
  46. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
  47. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
  48. aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
  49. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
  50. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  51. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  52. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
  53. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
  54. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
  55. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
  56. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
  57. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
  58. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
  59. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
  60. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
  61. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
  62. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
  63. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
  64. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
  65. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
  66. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
  67. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
  68. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
  69. aip_agents/examples/hello_world_google_adk.pyi +5 -0
  70. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
  71. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
  72. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
  73. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
  74. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
  75. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
  76. aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
  77. aip_agents/examples/hello_world_langchain.pyi +5 -0
  78. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
  79. aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
  80. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  81. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
  82. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  83. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
  84. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
  85. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
  86. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
  87. aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
  88. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
  89. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  90. aip_agents/examples/hello_world_langgraph.pyi +5 -0
  91. aip_agents/examples/{hello_world_langgraph_bosa_twitter.py → hello_world_langgraph_gl_connector_twitter.py} +10 -8
  92. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
  93. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
  94. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
  95. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
  96. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
  97. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
  98. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
  99. aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
  100. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
  101. aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
  102. aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
  103. aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
  104. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
  105. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
  106. aip_agents/examples/hello_world_pii_logger.pyi +5 -0
  107. aip_agents/examples/hello_world_sentry.py +8 -7
  108. aip_agents/examples/hello_world_sentry.pyi +21 -0
  109. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  110. aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
  111. aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
  112. aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
  113. aip_agents/examples/hitl_demo.pyi +67 -0
  114. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  115. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  116. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  117. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  118. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  119. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  120. aip_agents/examples/tools/__init__.pyi +9 -0
  121. aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
  122. aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
  123. aip_agents/examples/tools/data_generator_tool.pyi +15 -0
  124. aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
  125. aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
  126. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
  127. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
  128. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
  129. aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
  130. aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
  131. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  132. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  133. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  134. aip_agents/examples/tools/serper_tool.pyi +16 -0
  135. aip_agents/examples/tools/stock_tools.pyi +36 -0
  136. aip_agents/examples/tools/table_generator_tool.pyi +22 -0
  137. aip_agents/examples/tools/time_tool.pyi +15 -0
  138. aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
  139. aip_agents/mcp/__init__.pyi +0 -0
  140. aip_agents/mcp/client/__init__.pyi +5 -0
  141. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  142. aip_agents/mcp/client/connection_manager.pyi +48 -0
  143. aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
  144. aip_agents/mcp/client/google_adk/client.pyi +75 -0
  145. aip_agents/mcp/client/langchain/__init__.pyi +3 -0
  146. aip_agents/mcp/client/langchain/client.pyi +48 -0
  147. aip_agents/mcp/client/persistent_session.pyi +113 -0
  148. aip_agents/mcp/client/session_pool.pyi +101 -0
  149. aip_agents/mcp/client/transports.pyi +123 -0
  150. aip_agents/mcp/utils/__init__.pyi +0 -0
  151. aip_agents/mcp/utils/config_validator.pyi +82 -0
  152. aip_agents/memory/__init__.pyi +5 -0
  153. aip_agents/memory/adapters/__init__.pyi +4 -0
  154. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  155. aip_agents/memory/adapters/mem0.pyi +22 -0
  156. aip_agents/memory/base.pyi +60 -0
  157. aip_agents/memory/constants.pyi +25 -0
  158. aip_agents/memory/factory.pyi +24 -0
  159. aip_agents/memory/guidance.pyi +3 -0
  160. aip_agents/memory/simple_memory.pyi +23 -0
  161. aip_agents/middleware/__init__.pyi +5 -0
  162. aip_agents/middleware/base.pyi +71 -0
  163. aip_agents/middleware/manager.pyi +80 -0
  164. aip_agents/middleware/todolist.pyi +125 -0
  165. aip_agents/schema/__init__.pyi +9 -0
  166. aip_agents/schema/a2a.pyi +40 -0
  167. aip_agents/schema/agent.pyi +65 -0
  168. aip_agents/schema/hitl.pyi +89 -0
  169. aip_agents/schema/langgraph.pyi +28 -0
  170. aip_agents/schema/model_id.pyi +54 -0
  171. aip_agents/schema/step_limit.pyi +63 -0
  172. aip_agents/schema/storage.pyi +21 -0
  173. aip_agents/sentry/__init__.py +1 -1
  174. aip_agents/sentry/__init__.pyi +3 -0
  175. aip_agents/sentry/sentry.py +17 -10
  176. aip_agents/sentry/sentry.pyi +48 -0
  177. aip_agents/storage/__init__.pyi +8 -0
  178. aip_agents/storage/base.pyi +58 -0
  179. aip_agents/storage/clients/__init__.pyi +3 -0
  180. aip_agents/storage/clients/minio_client.pyi +137 -0
  181. aip_agents/storage/config.pyi +29 -0
  182. aip_agents/storage/providers/__init__.pyi +5 -0
  183. aip_agents/storage/providers/base.pyi +88 -0
  184. aip_agents/storage/providers/memory.pyi +79 -0
  185. aip_agents/storage/providers/object_storage.pyi +98 -0
  186. aip_agents/tools/__init__.py +26 -6
  187. aip_agents/tools/__init__.pyi +9 -0
  188. aip_agents/tools/browser_use/__init__.pyi +14 -0
  189. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  190. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  191. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  192. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  193. aip_agents/tools/browser_use/schemas.pyi +32 -0
  194. aip_agents/tools/browser_use/session.pyi +4 -0
  195. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  196. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  197. aip_agents/tools/browser_use/streaming.pyi +81 -0
  198. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  199. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  200. aip_agents/tools/browser_use/types.pyi +45 -0
  201. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  202. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  203. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -0
  204. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  205. aip_agents/tools/constants.py +26 -12
  206. aip_agents/tools/constants.pyi +138 -0
  207. aip_agents/tools/document_loader/__init__.pyi +7 -0
  208. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  209. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  210. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  211. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  212. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  213. aip_agents/tools/gl_connector/__init__.py +1 -1
  214. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  215. aip_agents/tools/gl_connector/tool.py +104 -45
  216. aip_agents/tools/gl_connector/tool.pyi +74 -0
  217. aip_agents/tools/gl_connector_tools.py +122 -0
  218. aip_agents/tools/gl_connector_tools.pyi +39 -0
  219. aip_agents/tools/memory_search/__init__.pyi +5 -0
  220. aip_agents/tools/memory_search/base.pyi +69 -0
  221. aip_agents/tools/memory_search/mem0.pyi +19 -0
  222. aip_agents/tools/memory_search/schema.pyi +15 -0
  223. aip_agents/tools/memory_search_tool.pyi +3 -0
  224. aip_agents/tools/time_tool.pyi +16 -0
  225. aip_agents/tools/tool_config_injector.pyi +26 -0
  226. aip_agents/tools/web_search/__init__.pyi +3 -0
  227. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  228. aip_agents/types/__init__.pyi +36 -0
  229. aip_agents/types/a2a_events.pyi +3 -0
  230. aip_agents/utils/__init__.pyi +11 -0
  231. aip_agents/utils/a2a_connector.pyi +146 -0
  232. aip_agents/utils/artifact_helpers.pyi +203 -0
  233. aip_agents/utils/constants.pyi +10 -0
  234. aip_agents/utils/datetime/__init__.pyi +4 -0
  235. aip_agents/utils/datetime/normalization.pyi +95 -0
  236. aip_agents/utils/datetime/timezone.pyi +48 -0
  237. aip_agents/utils/env_loader.pyi +10 -0
  238. aip_agents/utils/event_handler_registry.pyi +23 -0
  239. aip_agents/utils/file_prompt_utils.pyi +21 -0
  240. aip_agents/utils/final_response_builder.pyi +34 -0
  241. aip_agents/utils/formatter_llm_client.pyi +71 -0
  242. aip_agents/utils/langgraph/__init__.pyi +3 -0
  243. aip_agents/utils/langgraph/converter.pyi +49 -0
  244. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  245. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  246. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  247. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  248. aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
  249. aip_agents/utils/logger.pyi +60 -0
  250. aip_agents/utils/metadata/__init__.pyi +5 -0
  251. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  252. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  253. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  254. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  255. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  256. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  257. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  258. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  259. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  260. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  261. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  262. aip_agents/utils/metadata_helper.pyi +117 -0
  263. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  264. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  265. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  266. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  267. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  268. aip_agents/utils/pii/__init__.pyi +5 -0
  269. aip_agents/utils/pii/pii_handler.pyi +96 -0
  270. aip_agents/utils/pii/pii_helper.pyi +78 -0
  271. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  272. aip_agents/utils/reference_helper.pyi +81 -0
  273. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  274. aip_agents/utils/step_limit_manager.pyi +112 -0
  275. aip_agents/utils/token_usage_helper.pyi +60 -0
  276. {aip_agents_binary-0.5.20.dist-info → aip_agents_binary-0.5.22.dist-info}/METADATA +3 -3
  277. aip_agents_binary-0.5.22.dist-info/RECORD +546 -0
  278. aip_agents/tools/bosa_tools.py +0 -105
  279. aip_agents_binary-0.5.20.dist-info/RECORD +0 -280
  280. {aip_agents_binary-0.5.20.dist-info → aip_agents_binary-0.5.22.dist-info}/WHEEL +0 -0
  281. {aip_agents_binary-0.5.20.dist-info → aip_agents_binary-0.5.22.dist-info}/top_level.txt +0 -0
@@ -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
@@ -13,19 +14,30 @@ import os
13
14
  from collections.abc import Iterable
14
15
  from typing import Any
15
16
 
17
+ from aip_agents.tools.constants import ToolType
16
18
  from bosa_connectors import BosaConnector, BOSAConnectorToolGenerator
17
19
  from langchain_core.runnables import RunnableConfig
18
20
  from langchain_core.tools import BaseTool
19
21
  from pydantic import ConfigDict, PrivateAttr
20
22
 
21
- from aip_agents.tools.constants import ToolType
22
-
23
23
  _REQUIRED_ENV_VARS: tuple[str, ...] = (
24
- "BOSA_BASE_URL",
25
- "BOSA_API_KEY",
26
- "BOSA_USERNAME",
27
- "BOSA_PASSWORD",
24
+ "GL_CONNECTORS_BASE_URL",
25
+ "GL_CONNECTORS_API_KEY",
26
+ "GL_CONNECTORS_USERNAME",
27
+ "GL_CONNECTORS_PASSWORD",
28
28
  )
29
+
30
+ _ENV_VAR_MAPPING: dict[str, tuple[str, ...]] = {
31
+ "GL_CONNECTORS_BASE_URL": (
32
+ "GL_CONNECTORS_BASE_URL",
33
+ "BOSA_BASE_URL",
34
+ "BOSA_API_BASE_URL",
35
+ ),
36
+ "GL_CONNECTORS_API_KEY": ("GL_CONNECTORS_API_KEY", "BOSA_API_KEY"),
37
+ "GL_CONNECTORS_USERNAME": ("GL_CONNECTORS_USERNAME", "BOSA_USERNAME"),
38
+ "GL_CONNECTORS_PASSWORD": ("GL_CONNECTORS_PASSWORD", "BOSA_PASSWORD"),
39
+ "GL_CONNECTORS_IDENTIFIER": ("GL_CONNECTORS_IDENTIFIER", "BOSA_IDENTIFIER"),
40
+ }
29
41
  _TOP_LEVEL_KEYS: tuple[str, ...] = (
30
42
  "token",
31
43
  "identifier",
@@ -54,7 +66,9 @@ class _InjectedTool(BaseTool):
54
66
  Returns:
55
67
  None
56
68
  """
57
- base_fields = {field: getattr(base_tool, field) for field in BaseTool.model_fields}
69
+ base_fields = {
70
+ field: getattr(base_tool, field) for field in BaseTool.model_fields
71
+ }
58
72
  super().__init__(**base_fields)
59
73
  self._base_tool = base_tool
60
74
  self._token = token
@@ -84,7 +98,9 @@ class _InjectedTool(BaseTool):
84
98
  """
85
99
  return await self._base_tool._arun(*args, **kwargs)
86
100
 
87
- def invoke(self, input: Any, config: RunnableConfig | None = None, **kwargs: Any) -> Any:
101
+ def invoke(
102
+ self, input: Any, config: RunnableConfig | None = None, **kwargs: Any
103
+ ) -> Any:
88
104
  """Invoke the tool with token and optional identifier injected.
89
105
 
90
106
  Args:
@@ -98,7 +114,9 @@ class _InjectedTool(BaseTool):
98
114
  injected = _inject_params(input, self._token, self._identifier, self._base_tool)
99
115
  return super().invoke(injected, config=config, **kwargs)
100
116
 
101
- async def ainvoke(self, input: Any, config: RunnableConfig | None = None, **kwargs: Any) -> Any:
117
+ async def ainvoke(
118
+ self, input: Any, config: RunnableConfig | None = None, **kwargs: Any
119
+ ) -> Any:
102
120
  """Invoke the tool asynchronously with token and optional identifier injected.
103
121
 
104
122
  Args:
@@ -122,7 +140,9 @@ class _InjectedTool(BaseTool):
122
140
  Returns:
123
141
  The result of running the tool with injected parameters.
124
142
  """
125
- injected = _inject_params(tool_input, self._token, self._identifier, self._base_tool)
143
+ injected = _inject_params(
144
+ tool_input, self._token, self._identifier, self._base_tool
145
+ )
126
146
  return super().run(injected, **kwargs)
127
147
 
128
148
  async def arun(self, tool_input: Any, **kwargs: Any) -> Any:
@@ -135,7 +155,9 @@ class _InjectedTool(BaseTool):
135
155
  Returns:
136
156
  The result of running the tool with injected parameters.
137
157
  """
138
- injected = _inject_params(tool_input, self._token, self._identifier, self._base_tool)
158
+ injected = _inject_params(
159
+ tool_input, self._token, self._identifier, self._base_tool
160
+ )
139
161
  return await super().arun(injected, **kwargs)
140
162
 
141
163
 
@@ -145,12 +167,12 @@ def GLConnectorTool(
145
167
  api_key: str | None = None,
146
168
  identifier: str | None = None,
147
169
  ) -> BaseTool:
148
- """Create a single GL Connector tool by exact tool name.
170
+ """Create a single tool from GL Connectors by exact tool name.
149
171
 
150
172
  Args:
151
173
  tool_name: Exact tool name (not module name).
152
- api_key: Optional override for BOSA API key.
153
- identifier: Optional override for BOSA identifier.
174
+ api_key: Optional override for GL Connectors API key.
175
+ identifier: Optional override for GL Connectors identifier.
154
176
 
155
177
  Returns:
156
178
  A single LangChain BaseTool with token injection.
@@ -159,14 +181,17 @@ def GLConnectorTool(
159
181
  raise ValueError("tool_name must be a non-empty string")
160
182
 
161
183
  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"])
184
+ connector = BosaConnector(
185
+ api_base_url=env_values["GL_CONNECTORS_BASE_URL"],
186
+ api_key=env_values["GL_CONNECTORS_API_KEY"],
187
+ )
163
188
 
164
189
  modules = _get_available_modules(connector)
165
190
  module_name = _resolve_module(tool_name, modules)
166
191
 
167
192
  generator = BOSAConnectorToolGenerator(
168
- api_base_url=env_values["BOSA_BASE_URL"],
169
- api_key=env_values["BOSA_API_KEY"],
193
+ api_base_url=env_values["GL_CONNECTORS_BASE_URL"],
194
+ api_key=env_values["GL_CONNECTORS_API_KEY"],
170
195
  app_name=module_name,
171
196
  )
172
197
  tools = generator.generate_tools(tool_type=ToolType.LANGCHAIN)
@@ -175,18 +200,24 @@ def GLConnectorTool(
175
200
  if not matching:
176
201
  raise ValueError(f"Tool '{tool_name}' not found in module '{module_name}'")
177
202
  if len(matching) > 1:
178
- raise ValueError(f"Multiple tools named '{tool_name}' found in module '{module_name}'")
179
-
180
- token = _create_token(connector, env_values["BOSA_USERNAME"], env_values["BOSA_PASSWORD"])
181
- return _InjectedTool(matching[0], token, env_values.get("BOSA_IDENTIFIER"))
203
+ raise ValueError(
204
+ f"Multiple tools named '{tool_name}' found in module '{module_name}'"
205
+ )
206
+
207
+ token = _create_token(
208
+ connector,
209
+ env_values["GL_CONNECTORS_USERNAME"],
210
+ env_values["GL_CONNECTORS_PASSWORD"],
211
+ )
212
+ return _InjectedTool(matching[0], token, env_values.get("GL_CONNECTORS_IDENTIFIER"))
182
213
 
183
214
 
184
215
  def _load_env(*, api_key: str | None, identifier: str | None) -> dict[str, str]:
185
216
  """Load and validate environment configuration for connector access.
186
217
 
187
218
  Args:
188
- api_key: Optional override for BOSA API key.
189
- identifier: Optional override for BOSA identifier.
219
+ api_key: Optional override for GL Connectors API key.
220
+ identifier: Optional override for GL Connectors identifier.
190
221
 
191
222
  Returns:
192
223
  Dictionary containing environment configuration values.
@@ -194,28 +225,42 @@ def _load_env(*, api_key: str | None, identifier: str | None) -> dict[str, str]:
194
225
  Raises:
195
226
  ValueError: If required environment variables are missing.
196
227
  """
197
- env = {key: os.getenv(key) for key in _REQUIRED_ENV_VARS}
228
+ env: dict[str, str | None] = {}
198
229
 
199
- resolved_api_key = api_key or env["BOSA_API_KEY"]
200
- env["BOSA_API_KEY"] = resolved_api_key
230
+ # Load from environment using mapping (prefers GL_CONNECTORS_* over BOSA_*)
231
+ for internal_key, env_vars in _ENV_VAR_MAPPING.items():
232
+ val = None
233
+ for var_name in env_vars:
234
+ val = os.getenv(var_name)
235
+ if val:
236
+ break
237
+ env[internal_key] = val
201
238
 
202
- optional_identifier = identifier or os.getenv("BOSA_IDENTIFIER")
239
+ if api_key:
240
+ env["GL_CONNECTORS_API_KEY"] = api_key
203
241
 
204
- if optional_identifier:
205
- env["BOSA_IDENTIFIER"] = optional_identifier
242
+ if identifier:
243
+ env["GL_CONNECTORS_IDENTIFIER"] = identifier
206
244
 
207
- missing = [key for key, value in env.items() if key in _REQUIRED_ENV_VARS and not value]
245
+ missing = [key for key in _REQUIRED_ENV_VARS if not env.get(key)]
208
246
  if missing:
209
- raise ValueError(f"Missing required environment variables: {', '.join(missing)}")
247
+ # Map back to human-friendly names for the error message
248
+ friendly_missing = []
249
+ for m in missing:
250
+ preferred = _ENV_VAR_MAPPING[m][0]
251
+ friendly_missing.append(preferred)
252
+ raise ValueError(
253
+ f"Missing required environment variables: {', '.join(friendly_missing)}"
254
+ )
210
255
 
211
- return {key: value for key, value in env.items() if value is not None}
256
+ return {k: v for k, v in env.items() if v is not None}
212
257
 
213
258
 
214
259
  def _get_available_modules(connector: BosaConnector) -> list[str]:
215
260
  """Return available connector modules or raise an actionable error.
216
261
 
217
262
  Args:
218
- connector: BOSA connector instance to query for modules.
263
+ connector: GL Connectors instance to query for modules.
219
264
 
220
265
  Returns:
221
266
  List of available module names.
@@ -246,13 +291,21 @@ def _resolve_module(tool_name: str, modules: Iterable[str]) -> str:
246
291
  Raises:
247
292
  ValueError: If no matching module is found or multiple ambiguous matches exist.
248
293
  """
249
- candidates = [module for module in modules if tool_name == module or tool_name.startswith(f"{module}_")]
294
+ candidates = [
295
+ module
296
+ for module in modules
297
+ if tool_name == module or tool_name.startswith(f"{module}_")
298
+ ]
250
299
  if not candidates:
251
- raise ValueError(f"Unable to resolve module for tool '{tool_name}'. Available modules: {', '.join(modules)}")
300
+ raise ValueError(
301
+ f"Unable to resolve module for tool '{tool_name}'. Available modules: {', '.join(modules)}"
302
+ )
252
303
 
253
304
  candidates.sort(key=len, reverse=True)
254
305
  if len(candidates) > 1 and len(candidates[0]) == len(candidates[1]):
255
- raise ValueError(f"Ambiguous module match for tool '{tool_name}'. Matches: {', '.join(candidates)}")
306
+ raise ValueError(
307
+ f"Ambiguous module match for tool '{tool_name}'. Matches: {', '.join(candidates)}"
308
+ )
256
309
  return candidates[0]
257
310
 
258
311
 
@@ -260,9 +313,9 @@ def _create_token(connector: BosaConnector, username: str, password: str) -> str
260
313
  """Authenticate the connector user and return a user token.
261
314
 
262
315
  Args:
263
- connector: BOSA connector instance for authentication.
264
- username: BOSA username for authentication.
265
- password: BOSA password for authentication.
316
+ connector: GL Connectors instance for authentication.
317
+ username: GL Connectors username for authentication.
318
+ password: GL Connectors password for authentication.
266
319
 
267
320
  Returns:
268
321
  Authentication token string.
@@ -273,15 +326,17 @@ def _create_token(connector: BosaConnector, username: str, password: str) -> str
273
326
  try:
274
327
  user = connector.authenticate_bosa_user(username, password)
275
328
  except Exception as exc:
276
- raise ValueError("Failed to authenticate BOSA user") from exc
329
+ raise ValueError("Failed to authenticate GL Connectors user") from exc
277
330
 
278
331
  token = getattr(user, "token", None)
279
332
  if not token:
280
- raise ValueError("BOSA user token missing after authentication")
333
+ raise ValueError("GL Connectors user token missing after authentication")
281
334
  return token
282
335
 
283
336
 
284
- def _inject_params(tool_input: Any, token: str, identifier: str | None, base_tool: BaseTool) -> dict[str, Any]:
337
+ def _inject_params(
338
+ tool_input: Any, token: str, identifier: str | None, base_tool: BaseTool
339
+ ) -> dict[str, Any]:
285
340
  """Inject token and optional identifier into tool input.
286
341
 
287
342
  Args:
@@ -319,7 +374,9 @@ def _inject_params(tool_input: Any, token: str, identifier: str | None, base_too
319
374
  return injected
320
375
 
321
376
 
322
- def _wrap_request_if_needed(tool_input: dict[str, Any], base_tool: BaseTool) -> dict[str, Any]:
377
+ def _wrap_request_if_needed(
378
+ tool_input: dict[str, Any], base_tool: BaseTool
379
+ ) -> dict[str, Any]:
323
380
  """Wrap flat inputs into a 'request' payload when required by schema.
324
381
 
325
382
  Args:
@@ -330,7 +387,9 @@ def _wrap_request_if_needed(tool_input: dict[str, Any], base_tool: BaseTool) ->
330
387
  Dictionary with inputs wrapped in 'request' key if needed, otherwise unchanged.
331
388
  """
332
389
  args_schema = getattr(base_tool, "args_schema", None)
333
- if not (isinstance(args_schema, dict) and "request" in args_schema.get("properties", {})):
390
+ if not (
391
+ isinstance(args_schema, dict) and "request" in args_schema.get("properties", {})
392
+ ):
334
393
  return tool_input
335
394
 
336
395
  request_payload = {}
@@ -0,0 +1,74 @@
1
+ from _typeshed import Incomplete
2
+ from aip_agents.tools.constants import ToolType as ToolType
3
+ from langchain_core.runnables import RunnableConfig
4
+ from langchain_core.tools import BaseTool
5
+ from typing import Any
6
+
7
+ class _InjectedTool(BaseTool):
8
+ """Wrap a BaseTool to inject token and optional identifier into inputs."""
9
+ model_config: Incomplete
10
+ def __init__(self, base_tool: BaseTool, token: str, identifier: str | None) -> None:
11
+ """Initialize the injected tool wrapper.
12
+
13
+ Args:
14
+ base_tool: The base tool to wrap.
15
+ token: Authentication token to inject into tool inputs.
16
+ identifier: Optional identifier to inject into tool inputs.
17
+
18
+ Returns:
19
+ None
20
+ """
21
+ def invoke(self, input: Any, config: RunnableConfig | None = None, **kwargs: Any) -> Any:
22
+ """Invoke the tool with token and optional identifier injected.
23
+
24
+ Args:
25
+ input: Tool input to process.
26
+ config: Optional runnable configuration.
27
+ **kwargs: Additional keyword arguments.
28
+
29
+ Returns:
30
+ The result of invoking the tool with injected parameters.
31
+ """
32
+ async def ainvoke(self, input: Any, config: RunnableConfig | None = None, **kwargs: Any) -> Any:
33
+ """Invoke the tool asynchronously with token and optional identifier injected.
34
+
35
+ Args:
36
+ input: Tool input to process.
37
+ config: Optional runnable configuration.
38
+ **kwargs: Additional keyword arguments.
39
+
40
+ Returns:
41
+ The result of invoking the tool with injected parameters.
42
+ """
43
+ def run(self, tool_input: Any, **kwargs: Any) -> Any:
44
+ """Run the tool with token and optional identifier injected.
45
+
46
+ Args:
47
+ tool_input: Tool input to process.
48
+ **kwargs: Additional keyword arguments.
49
+
50
+ Returns:
51
+ The result of running the tool with injected parameters.
52
+ """
53
+ async def arun(self, tool_input: Any, **kwargs: Any) -> Any:
54
+ """Run the tool asynchronously with token and optional identifier injected.
55
+
56
+ Args:
57
+ tool_input: Tool input to process.
58
+ **kwargs: Additional keyword arguments.
59
+
60
+ Returns:
61
+ The result of running the tool with injected parameters.
62
+ """
63
+
64
+ def GLConnectorTool(tool_name: str, *, api_key: str | None = None, identifier: str | None = None) -> BaseTool:
65
+ """Create a single tool from GL Connectors by exact tool name.
66
+
67
+ Args:
68
+ tool_name: Exact tool name (not module name).
69
+ api_key: Optional override for GL Connectors API key.
70
+ identifier: Optional override for GL Connectors identifier.
71
+
72
+ Returns:
73
+ A single LangChain BaseTool with token injection.
74
+ """
@@ -0,0 +1,122 @@
1
+ """Auto-generated tools from GL Connectors.
2
+
3
+ Authors:
4
+ Saul Sayers (saul.sayers@gdplabs.id)
5
+ """
6
+
7
+ from aip_agents.tools.constants import (
8
+ GL_CONNECTORS_API_KEY,
9
+ GL_CONNECTORS_BASE_URL,
10
+ GL_CONNECTORS_FETCH_MAX_RETRIES,
11
+ ToolType,
12
+ )
13
+ from aip_agents.utils.logger import get_logger
14
+ from bosa_connectors import BosaConnector, BOSAConnectorToolGenerator
15
+ from langchain_core.tools import BaseTool
16
+
17
+ logger = get_logger(__name__)
18
+
19
+
20
+ def get_gl_connector_modules_with_retry() -> list[str]:
21
+ """Try to get available modules with retries.
22
+
23
+ Returns:
24
+ List of available modules.
25
+ """
26
+ if not GL_CONNECTORS_BASE_URL or not GL_CONNECTORS_API_KEY:
27
+ logger.warning(
28
+ "GL Connectors credentials missing (base_url or api_key); returning empty modules list"
29
+ )
30
+ return []
31
+
32
+ connector = BosaConnector(
33
+ api_base_url=GL_CONNECTORS_BASE_URL, api_key=GL_CONNECTORS_API_KEY
34
+ )
35
+ modules = []
36
+ for attempt in range(GL_CONNECTORS_FETCH_MAX_RETRIES):
37
+ try:
38
+ modules = list(connector.get_available_modules())
39
+ if modules:
40
+ return modules
41
+ logger.warning(
42
+ f"Failed to get GL Connectors available modules, retrying... (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES})"
43
+ )
44
+ except Exception as e:
45
+ logger.exception(
46
+ f"Exception when getting GL Connectors available modules (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES}): {e}"
47
+ )
48
+ logger.error("Failed to get GL Connectors available modules after maximum retries")
49
+ return modules
50
+
51
+
52
+ class LazyGLConnectorToolsDict(dict):
53
+ """Lazy dictionary for GL Connectors."""
54
+
55
+ def __missing__(self, app):
56
+ """When a key is missing, create the tools and store them in the dictionary.
57
+
58
+ Args:
59
+ app: Name of the GL Connectors.
60
+
61
+ Returns:
62
+ List of tools generated by the GL Connectors tool generator.
63
+ """
64
+ if app not in get_gl_connector_modules():
65
+ return []
66
+ tools = []
67
+ for attempt in range(GL_CONNECTORS_FETCH_MAX_RETRIES):
68
+ try:
69
+ tools = BOSAConnectorToolGenerator(
70
+ api_base_url=GL_CONNECTORS_BASE_URL,
71
+ api_key=GL_CONNECTORS_API_KEY,
72
+ app_name=app,
73
+ ).generate_tools(tool_type=ToolType.LANGCHAIN)
74
+ if tools:
75
+ self[app] = tools
76
+ return tools
77
+ logger.warning(
78
+ f"Failed to create GL Connectors, retrying... (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES})"
79
+ )
80
+ except Exception as e:
81
+ logger.exception(
82
+ f"Exception when creating GL Connectors for app '{app}' "
83
+ f"(attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES}): {e}"
84
+ )
85
+ logger.error("Failed to create GL Connectors after maximum retries")
86
+ return tools
87
+
88
+
89
+ # Supported modules (dynamic)
90
+ def get_gl_connector_modules() -> list[str]:
91
+ """Lazily fetch and cache GL Connectors modules.
92
+
93
+ Returns:
94
+ List of GL Connectors modules.
95
+ """
96
+ if not hasattr(get_gl_connector_modules, "_cache"):
97
+ get_gl_connector_modules._cache = get_gl_connector_modules_with_retry()
98
+ return get_gl_connector_modules._cache
99
+
100
+
101
+ # FOR BACKWARDS COMPATIBILITY
102
+ def get_bosa_modules() -> list[str]:
103
+ """Backward-compatible alias for get_gl_connector_modules."""
104
+ return get_gl_connector_modules()
105
+
106
+
107
+ GL_CONNECTORS_MODULES = [
108
+ "github",
109
+ "twitter",
110
+ "google",
111
+ "google_drive",
112
+ "google_mail",
113
+ "google_docs",
114
+ ]
115
+
116
+ # FOR BACKWARDS COMPATIBILITY
117
+ BOSA_MODULES = GL_CONNECTORS_MODULES
118
+
119
+ GL_CONNECTORS_AUTOMATED_TOOLS: dict[str, list[BaseTool]] = LazyGLConnectorToolsDict()
120
+
121
+ # FOR BACKWARDS COMPATIBILITY
122
+ 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
@@ -0,0 +1,5 @@
1
+ from aip_agents.tools.memory_search.base import LongTermMemorySearchTool as LongTermMemorySearchTool
2
+ from aip_agents.tools.memory_search.mem0 import MEMORY_SEARCH_TOOL_NAME as MEMORY_SEARCH_TOOL_NAME, Mem0SearchInput as Mem0SearchInput, Mem0SearchTool as Mem0SearchTool
3
+ from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput, MemoryConfig as MemoryConfig
4
+
5
+ __all__ = ['MemoryConfig', 'LongTermMemorySearchInput', 'LongTermMemorySearchTool', 'Mem0SearchInput', 'Mem0SearchTool', 'MEMORY_SEARCH_TOOL_NAME']
@@ -0,0 +1,69 @@
1
+ from _typeshed import Incomplete
2
+ from abc import ABC
3
+ from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
4
+ from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput, MemoryConfig as MemoryConfig
5
+ from aip_agents.utils.logger import get_logger as get_logger
6
+ from collections.abc import Callable
7
+ from langchain_core.tools import BaseTool
8
+ from pydantic import BaseModel as BaseModel
9
+ from typing import Any, ClassVar, Protocol
10
+
11
+ logger: Incomplete
12
+
13
+ class LongTermMemoryBackend(Protocol):
14
+ """Protocol for memory adapters that support retrieval and formatting."""
15
+ def retrieve(self, *, query: str | None, user_id: str, limit: int | None = None, filters: dict[str, Any] | None = None, page: int | None = None) -> list[dict[str, Any]]:
16
+ """Retrieve memories matching the given query and filters.
17
+
18
+ Args:
19
+ query: Optional search query string.
20
+ user_id: User identifier for scoped retrieval.
21
+ limit: Maximum number of results to return.
22
+ filters: Optional filters to apply to the retrieval.
23
+ page: Page number for pagination.
24
+
25
+ Returns:
26
+ List of memory hit dictionaries.
27
+ """
28
+ def format_hits(self, hits: list[dict[str, Any]], max_items: int = ..., with_tag: bool = True) -> str:
29
+ """Format memory hits into a readable string.
30
+
31
+ Args:
32
+ hits: List of memory hit dictionaries to format.
33
+ max_items: Maximum number of hits to include in output.
34
+ with_tag: Whether to wrap output with memory tags.
35
+
36
+ Returns:
37
+ Formatted string representation of memory hits.
38
+ """
39
+
40
+ class LongTermMemorySearchTool(BaseTool, ABC):
41
+ """Abstract base class for provider-specific long-term memory search tools."""
42
+ name: str
43
+ description: str
44
+ args_schema: type[LongTermMemorySearchInput]
45
+ tool_config_schema: type[BaseModel]
46
+ memory: LongTermMemoryBackend
47
+ default_user_id: str | None
48
+ user_id_provider: Callable[[], str | None] | None
49
+ MINIMUM_MEMORY_RETRIEVAL: ClassVar[int]
50
+ LOG_PREFIX: ClassVar[str]
51
+ def __init__(self, memory: LongTermMemoryBackend, *, default_user_id: str | None = None, user_id_provider: Callable[[], str | None] | None = None, **kwargs: Any) -> None:
52
+ """Initialize the long-term memory search tool.
53
+
54
+ Args:
55
+ memory: Memory adapter instance with retrieve() and format_hits() methods.
56
+ default_user_id: Default user ID to use if not provided in metadata.
57
+ user_id_provider: Callable that returns a user ID.
58
+ **kwargs: Additional keyword arguments passed to the parent class.
59
+ """
60
+ def format_hits(self, hits: list[dict[str, Any]], with_tag: bool = False) -> str:
61
+ """Format hits into a string with optional tags.
62
+
63
+ Args:
64
+ hits: List of memory hit dictionaries to format.
65
+ with_tag: Whether to wrap the output with memory tags.
66
+
67
+ Returns:
68
+ Formatted string representation of the memory hits.
69
+ """
@@ -0,0 +1,19 @@
1
+ from _typeshed import Incomplete
2
+ from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
3
+ from aip_agents.tools.memory_search.base import LongTermMemorySearchTool as LongTermMemorySearchTool
4
+ from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput
5
+ from aip_agents.utils.datetime import is_valid_date_string as is_valid_date_string, next_day_iso as next_day_iso
6
+ from aip_agents.utils.logger import get_logger as get_logger
7
+ from typing import ClassVar
8
+
9
+ logger: Incomplete
10
+ MEMORY_SEARCH_TOOL_NAME: str
11
+
12
+ class Mem0SearchTool(LongTermMemorySearchTool):
13
+ """Mem0-specific implementation of the long-term memory search tool."""
14
+ name: str
15
+ description: str
16
+ args_schema: type[LongTermMemorySearchInput]
17
+ LOG_PREFIX: ClassVar[str]
18
+ METADATA_FILTER_BLOCKLIST: ClassVar[set[str]]
19
+ Mem0SearchInput = LongTermMemorySearchInput
@@ -0,0 +1,15 @@
1
+ from pydantic import BaseModel
2
+ from typing import Any
3
+
4
+ class MemoryConfig(BaseModel):
5
+ """Tool configuration schema for memory operations."""
6
+ user_id: str
7
+
8
+ class LongTermMemorySearchInput(BaseModel):
9
+ """Input schema for unified long-term memory retrieval."""
10
+ query: str | None
11
+ start_date: str | None
12
+ end_date: str | None
13
+ limit: int | None
14
+ categories: list[str] | None
15
+ metadata: dict[str, Any] | None
@@ -0,0 +1,3 @@
1
+ from aip_agents.tools.memory_search import LongTermMemorySearchInput as LongTermMemorySearchInput, LongTermMemorySearchTool as LongTermMemorySearchTool, MEMORY_SEARCH_TOOL_NAME as MEMORY_SEARCH_TOOL_NAME, Mem0SearchInput as Mem0SearchInput, Mem0SearchTool as Mem0SearchTool, MemoryConfig as MemoryConfig
2
+
3
+ __all__ = ['MemoryConfig', 'LongTermMemorySearchInput', 'LongTermMemorySearchTool', 'Mem0SearchInput', 'Mem0SearchTool', 'MEMORY_SEARCH_TOOL_NAME']
@@ -0,0 +1,16 @@
1
+ from langchain_core.tools import BaseTool
2
+ from pydantic import BaseModel
3
+
4
+ FORMAT_STRING: str
5
+ DEFAULT_TIMEZONE: str
6
+
7
+ class TimeToolInput(BaseModel):
8
+ """Input schema for the TimeTool."""
9
+ datetime_format: str
10
+ timezone: str | None
11
+
12
+ class TimeTool(BaseTool):
13
+ """Tool to get the current time."""
14
+ name: str
15
+ description: str
16
+ args_schema: type[BaseModel]