aip-agents-binary 0.0.0b2__py3-none-any.whl → 0.5.11__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 (506) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/__init__.pyi +19 -0
  3. aip_agents/a2a/__init__.py +19 -0
  4. aip_agents/a2a/__init__.pyi +1 -1
  5. aip_agents/a2a/server/__init__.py +10 -0
  6. aip_agents/a2a/server/base_executor.py +1086 -0
  7. aip_agents/a2a/server/base_executor.pyi +16 -6
  8. aip_agents/a2a/server/google_adk_executor.py +198 -0
  9. aip_agents/a2a/server/google_adk_executor.pyi +11 -11
  10. aip_agents/a2a/server/langflow_executor.py +180 -0
  11. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  12. aip_agents/a2a/server/langgraph_executor.py +267 -0
  13. aip_agents/a2a/server/langgraph_executor.pyi +11 -12
  14. aip_agents/a2a/types.py +232 -0
  15. aip_agents/a2a/types.pyi +54 -47
  16. aip_agents/agent/__init__.py +27 -0
  17. aip_agents/agent/__init__.pyi +3 -1
  18. aip_agents/agent/base_agent.py +970 -0
  19. aip_agents/agent/base_agent.pyi +24 -8
  20. aip_agents/agent/base_langgraph_agent.py +2942 -0
  21. aip_agents/agent/base_langgraph_agent.pyi +93 -25
  22. aip_agents/agent/google_adk_agent.py +926 -0
  23. aip_agents/agent/google_adk_agent.pyi +34 -21
  24. aip_agents/agent/google_adk_constants.py +6 -0
  25. aip_agents/agent/google_adk_constants.pyi +3 -0
  26. aip_agents/agent/hitl/__init__.py +24 -0
  27. aip_agents/agent/hitl/__init__.pyi +6 -0
  28. aip_agents/agent/hitl/config.py +28 -0
  29. aip_agents/agent/hitl/config.pyi +15 -0
  30. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  31. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  32. aip_agents/agent/hitl/manager.py +522 -0
  33. aip_agents/agent/hitl/manager.pyi +199 -0
  34. aip_agents/agent/hitl/models.py +18 -0
  35. aip_agents/agent/hitl/models.pyi +3 -0
  36. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  37. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  38. aip_agents/agent/hitl/prompt/base.py +42 -0
  39. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  40. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  41. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  42. aip_agents/agent/interface.py +138 -0
  43. aip_agents/agent/interface.pyi +5 -5
  44. aip_agents/agent/interfaces.py +65 -0
  45. aip_agents/agent/interfaces.pyi +44 -0
  46. aip_agents/agent/langflow_agent.py +464 -0
  47. aip_agents/agent/langflow_agent.pyi +133 -0
  48. aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
  49. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
  50. aip_agents/agent/langgraph_react_agent.py +2514 -0
  51. aip_agents/agent/langgraph_react_agent.pyi +51 -56
  52. aip_agents/agent/system_instruction_context.py +34 -0
  53. aip_agents/agent/system_instruction_context.pyi +13 -0
  54. aip_agents/clients/__init__.py +10 -0
  55. aip_agents/clients/__init__.pyi +4 -0
  56. aip_agents/clients/langflow/__init__.py +10 -0
  57. aip_agents/clients/langflow/__init__.pyi +4 -0
  58. aip_agents/clients/langflow/client.py +477 -0
  59. aip_agents/clients/langflow/client.pyi +140 -0
  60. aip_agents/clients/langflow/types.py +18 -0
  61. aip_agents/clients/langflow/types.pyi +7 -0
  62. aip_agents/constants.py +23 -0
  63. aip_agents/constants.pyi +1 -0
  64. aip_agents/credentials/manager.py +132 -0
  65. aip_agents/examples/__init__.py +5 -0
  66. aip_agents/examples/compare_streaming_client.py +783 -0
  67. aip_agents/examples/compare_streaming_client.pyi +48 -0
  68. aip_agents/examples/compare_streaming_server.py +142 -0
  69. aip_agents/examples/compare_streaming_server.pyi +18 -0
  70. aip_agents/examples/demo_memory_recall.py +401 -0
  71. aip_agents/examples/demo_memory_recall.pyi +58 -0
  72. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  73. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +2 -2
  74. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +2 -2
  76. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +2 -2
  78. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +7 -2
  80. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  81. aip_agents/examples/hello_world_a2a_langchain_client.pyi +1 -1
  82. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  83. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +1 -1
  84. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +1 -1
  86. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +1 -1
  88. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  89. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +1 -1
  90. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  91. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +8 -3
  92. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  93. aip_agents/examples/hello_world_a2a_langchain_server.pyi +7 -2
  94. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  95. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +7 -2
  96. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  97. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  98. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  99. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  100. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  101. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +1 -1
  102. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  103. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +1 -1
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +7 -2
  106. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +2 -2
  108. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +2 -2
  110. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +1 -1
  112. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +3 -3
  114. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +1 -1
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +1 -1
  118. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +7 -2
  120. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +7 -2
  122. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +7 -2
  124. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  125. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +1 -1
  126. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  127. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +31 -6
  128. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  129. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +33 -5
  130. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  131. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +1 -1
  132. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  133. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +7 -2
  134. aip_agents/examples/hello_world_google_adk.py +41 -0
  135. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  136. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  137. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  138. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  139. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  141. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  142. aip_agents/examples/hello_world_langchain.py +28 -0
  143. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  144. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  145. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  146. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  147. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  148. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  149. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  150. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  151. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  152. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  153. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  154. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  155. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  156. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  157. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  158. aip_agents/examples/hello_world_langgraph.py +39 -0
  159. aip_agents/examples/hello_world_langgraph_bosa_twitter.py +41 -0
  160. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  161. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  162. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  163. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  164. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  165. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  166. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  167. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  168. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  169. aip_agents/examples/hello_world_model_switch_cli.pyi +18 -3
  170. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  171. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  172. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  173. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  174. aip_agents/examples/hello_world_pii_logger.py +21 -0
  175. aip_agents/examples/hello_world_pii_logger.pyi +1 -1
  176. aip_agents/examples/hello_world_sentry.py +133 -0
  177. aip_agents/examples/hello_world_sentry.pyi +1 -1
  178. aip_agents/examples/hello_world_step_limits.py +273 -0
  179. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  180. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  181. aip_agents/examples/hello_world_stock_a2a_server.pyi +7 -2
  182. aip_agents/examples/hello_world_tool_output_client.py +46 -0
  183. aip_agents/examples/hello_world_tool_output_client.pyi +1 -1
  184. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  185. aip_agents/examples/hello_world_tool_output_server.pyi +7 -2
  186. aip_agents/examples/hitl_demo.py +724 -0
  187. aip_agents/examples/hitl_demo.pyi +67 -0
  188. aip_agents/examples/mcp_configs/configs.py +63 -0
  189. aip_agents/examples/mcp_servers/common.py +76 -0
  190. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  191. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  192. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  193. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  194. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  195. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  196. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  197. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  198. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  199. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  200. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  201. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  202. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  203. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  204. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  205. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  206. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  207. aip_agents/examples/tools/__init__.py +27 -0
  208. aip_agents/examples/tools/__init__.pyi +3 -1
  209. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  210. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  211. aip_agents/examples/tools/adk_weather_tool.pyi +1 -1
  212. aip_agents/examples/tools/data_generator_tool.py +103 -0
  213. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  214. aip_agents/examples/tools/data_visualization_tool.pyi +2 -0
  215. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  216. aip_agents/examples/tools/image_artifact_tool.pyi +2 -0
  217. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  218. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +7 -0
  219. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  220. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +0 -1
  221. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  222. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +2 -0
  223. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  224. aip_agents/examples/tools/langchain_weather_tool.pyi +1 -1
  225. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  226. aip_agents/examples/tools/langgraph_streaming_tool.pyi +1 -1
  227. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  228. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  229. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  230. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  231. aip_agents/examples/tools/random_chart_tool.py +142 -0
  232. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  233. aip_agents/examples/tools/serper_tool.py +202 -0
  234. aip_agents/examples/tools/stock_tools.py +82 -0
  235. aip_agents/examples/tools/stock_tools.pyi +18 -3
  236. aip_agents/examples/tools/table_generator_tool.py +167 -0
  237. aip_agents/examples/tools/time_tool.py +82 -0
  238. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  239. aip_agents/executor/agent_executor.py +473 -0
  240. aip_agents/executor/base.py +48 -0
  241. aip_agents/mcp/__init__.py +1 -0
  242. aip_agents/mcp/client/__init__.py +14 -0
  243. aip_agents/mcp/client/__init__.pyi +4 -3
  244. aip_agents/mcp/client/base_mcp_client.py +369 -0
  245. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  246. aip_agents/mcp/client/connection_manager.py +193 -0
  247. aip_agents/mcp/client/connection_manager.pyi +48 -0
  248. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  249. aip_agents/mcp/client/google_adk/__init__.pyi +1 -1
  250. aip_agents/mcp/client/google_adk/client.py +381 -0
  251. aip_agents/mcp/client/google_adk/client.pyi +50 -13
  252. aip_agents/mcp/client/langchain/__init__.py +11 -0
  253. aip_agents/mcp/client/langchain/__init__.pyi +1 -1
  254. aip_agents/mcp/client/langchain/client.py +265 -0
  255. aip_agents/mcp/client/langchain/client.pyi +47 -2
  256. aip_agents/mcp/client/persistent_session.py +359 -0
  257. aip_agents/mcp/client/persistent_session.pyi +113 -0
  258. aip_agents/mcp/client/session_pool.py +351 -0
  259. aip_agents/mcp/client/session_pool.pyi +101 -0
  260. aip_agents/mcp/client/transports.py +215 -0
  261. aip_agents/mcp/client/transports.pyi +123 -0
  262. aip_agents/mcp/utils/__init__.py +7 -0
  263. aip_agents/mcp/utils/__init__.pyi +0 -0
  264. aip_agents/mcp/utils/config_validator.py +139 -0
  265. aip_agents/mcp/utils/config_validator.pyi +82 -0
  266. aip_agents/memory/__init__.py +14 -0
  267. aip_agents/memory/__init__.pyi +5 -0
  268. aip_agents/memory/adapters/__init__.py +10 -0
  269. aip_agents/memory/adapters/__init__.pyi +4 -0
  270. aip_agents/memory/adapters/base_adapter.py +717 -0
  271. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  272. aip_agents/memory/adapters/mem0.py +84 -0
  273. aip_agents/memory/adapters/mem0.pyi +22 -0
  274. aip_agents/memory/base.py +84 -0
  275. aip_agents/memory/base.pyi +15 -4
  276. aip_agents/memory/constants.py +49 -0
  277. aip_agents/memory/constants.pyi +25 -0
  278. aip_agents/memory/factory.py +86 -0
  279. aip_agents/memory/factory.pyi +24 -0
  280. aip_agents/memory/guidance.py +20 -0
  281. aip_agents/memory/guidance.pyi +3 -0
  282. aip_agents/memory/simple_memory.py +47 -0
  283. aip_agents/memory/simple_memory.pyi +6 -5
  284. aip_agents/middleware/__init__.py +17 -0
  285. aip_agents/middleware/__init__.pyi +5 -0
  286. aip_agents/middleware/base.py +88 -0
  287. aip_agents/middleware/base.pyi +71 -0
  288. aip_agents/middleware/manager.py +128 -0
  289. aip_agents/middleware/manager.pyi +80 -0
  290. aip_agents/middleware/todolist.py +274 -0
  291. aip_agents/middleware/todolist.pyi +125 -0
  292. aip_agents/schema/__init__.py +69 -0
  293. aip_agents/schema/__init__.pyi +9 -0
  294. aip_agents/schema/a2a.py +56 -0
  295. aip_agents/schema/a2a.pyi +40 -0
  296. aip_agents/schema/agent.py +111 -0
  297. aip_agents/schema/agent.pyi +65 -0
  298. aip_agents/schema/hitl.py +157 -0
  299. aip_agents/schema/hitl.pyi +89 -0
  300. aip_agents/schema/langgraph.py +37 -0
  301. aip_agents/schema/langgraph.pyi +28 -0
  302. aip_agents/schema/model_id.py +97 -0
  303. aip_agents/schema/model_id.pyi +54 -0
  304. aip_agents/schema/step_limit.py +108 -0
  305. aip_agents/schema/step_limit.pyi +63 -0
  306. aip_agents/schema/storage.py +40 -0
  307. aip_agents/schema/storage.pyi +21 -0
  308. aip_agents/sentry/__init__.py +11 -0
  309. aip_agents/sentry/__init__.pyi +1 -1
  310. aip_agents/sentry/sentry.py +151 -0
  311. aip_agents/sentry/sentry.pyi +2 -2
  312. aip_agents/storage/__init__.py +41 -0
  313. aip_agents/storage/base.py +85 -0
  314. aip_agents/storage/base.pyi +1 -2
  315. aip_agents/storage/clients/__init__.py +12 -0
  316. aip_agents/storage/clients/minio_client.py +318 -0
  317. aip_agents/storage/config.py +62 -0
  318. aip_agents/storage/config.pyi +9 -46
  319. aip_agents/storage/providers/__init__.py +15 -0
  320. aip_agents/storage/providers/base.py +106 -0
  321. aip_agents/storage/providers/base.pyi +2 -3
  322. aip_agents/storage/providers/memory.py +114 -0
  323. aip_agents/storage/providers/object_storage.py +214 -0
  324. aip_agents/storage/providers/object_storage.pyi +1 -1
  325. aip_agents/tools/__init__.py +6 -0
  326. aip_agents/tools/__init__.pyi +3 -2
  327. aip_agents/tools/bosa_tools.py +105 -0
  328. aip_agents/tools/bosa_tools.pyi +2 -2
  329. aip_agents/tools/browser_use/__init__.py +82 -0
  330. aip_agents/tools/browser_use/__init__.pyi +14 -0
  331. aip_agents/tools/browser_use/action_parser.py +103 -0
  332. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  333. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  334. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  335. aip_agents/tools/browser_use/llm_config.py +120 -0
  336. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  337. aip_agents/tools/browser_use/minio_storage.py +198 -0
  338. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  339. aip_agents/tools/browser_use/schemas.py +119 -0
  340. aip_agents/tools/browser_use/schemas.pyi +32 -0
  341. aip_agents/tools/browser_use/session.py +76 -0
  342. aip_agents/tools/browser_use/session.pyi +4 -0
  343. aip_agents/tools/browser_use/session_errors.py +132 -0
  344. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  345. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  346. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  347. aip_agents/tools/browser_use/streaming.py +813 -0
  348. aip_agents/tools/browser_use/streaming.pyi +81 -0
  349. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  350. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  351. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  352. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  353. aip_agents/tools/browser_use/types.py +78 -0
  354. aip_agents/tools/browser_use/types.pyi +45 -0
  355. aip_agents/tools/code_sandbox/__init__.py +26 -0
  356. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  357. aip_agents/tools/code_sandbox/constant.py +13 -0
  358. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  359. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
  360. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -0
  361. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  362. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  363. aip_agents/tools/constants.py +165 -0
  364. aip_agents/tools/constants.pyi +105 -100
  365. aip_agents/tools/document_loader/__init__.py +37 -0
  366. aip_agents/tools/document_loader/__init__.pyi +7 -0
  367. aip_agents/tools/document_loader/base_reader.py +262 -0
  368. aip_agents/tools/document_loader/base_reader.pyi +62 -0
  369. aip_agents/tools/document_loader/docx_reader_tool.py +53 -0
  370. aip_agents/tools/document_loader/docx_reader_tool.pyi +6 -0
  371. aip_agents/tools/document_loader/excel_reader_tool.py +160 -0
  372. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  373. aip_agents/tools/document_loader/pdf_reader_tool.py +67 -0
  374. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  375. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  376. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  377. aip_agents/tools/gl_connector/__init__.py +5 -0
  378. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  379. aip_agents/tools/gl_connector/tool.py +351 -0
  380. aip_agents/tools/gl_connector/tool.pyi +74 -0
  381. aip_agents/tools/memory_search/__init__.py +22 -0
  382. aip_agents/tools/memory_search/__init__.pyi +5 -0
  383. aip_agents/tools/memory_search/base.py +200 -0
  384. aip_agents/tools/memory_search/base.pyi +69 -0
  385. aip_agents/tools/memory_search/mem0.py +258 -0
  386. aip_agents/tools/memory_search/mem0.pyi +19 -0
  387. aip_agents/tools/memory_search/schema.py +48 -0
  388. aip_agents/tools/memory_search/schema.pyi +15 -0
  389. aip_agents/tools/memory_search_tool.py +26 -0
  390. aip_agents/tools/memory_search_tool.pyi +3 -0
  391. aip_agents/tools/tool_config_injector.py +300 -0
  392. aip_agents/tools/web_search/__init__.py +15 -0
  393. aip_agents/tools/web_search/__init__.pyi +3 -0
  394. aip_agents/tools/web_search/serper_tool.py +187 -0
  395. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  396. aip_agents/types/__init__.py +70 -0
  397. aip_agents/types/__init__.pyi +35 -2
  398. aip_agents/types/a2a_events.py +13 -0
  399. aip_agents/types/a2a_events.pyi +2 -73
  400. aip_agents/utils/__init__.py +79 -0
  401. aip_agents/utils/__init__.pyi +8 -2
  402. aip_agents/utils/a2a_connector.py +1757 -0
  403. aip_agents/utils/a2a_connector.pyi +15 -4
  404. aip_agents/utils/artifact_helpers.py +502 -0
  405. aip_agents/utils/artifact_helpers.pyi +26 -2
  406. aip_agents/utils/constants.py +22 -0
  407. aip_agents/utils/constants.pyi +10 -0
  408. aip_agents/utils/datetime/__init__.py +34 -0
  409. aip_agents/utils/datetime/__init__.pyi +4 -0
  410. aip_agents/utils/datetime/normalization.py +231 -0
  411. aip_agents/utils/datetime/normalization.pyi +95 -0
  412. aip_agents/utils/datetime/timezone.py +206 -0
  413. aip_agents/utils/datetime/timezone.pyi +48 -0
  414. aip_agents/utils/env_loader.py +27 -0
  415. aip_agents/utils/env_loader.pyi +10 -0
  416. aip_agents/utils/event_handler_registry.py +58 -0
  417. aip_agents/utils/event_handler_registry.pyi +23 -0
  418. aip_agents/utils/file_prompt_utils.py +176 -0
  419. aip_agents/utils/file_prompt_utils.pyi +21 -0
  420. aip_agents/utils/final_response_builder.py +211 -0
  421. aip_agents/utils/final_response_builder.pyi +34 -0
  422. aip_agents/utils/formatter_llm_client.py +231 -0
  423. aip_agents/utils/formatter_llm_client.pyi +71 -0
  424. aip_agents/utils/langgraph/__init__.py +19 -0
  425. aip_agents/utils/langgraph/converter.py +128 -0
  426. aip_agents/utils/langgraph/converter.pyi +1 -1
  427. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  428. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  429. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +2 -2
  430. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  431. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +2 -3
  432. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  433. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +17 -11
  434. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  435. aip_agents/utils/langgraph/tool_output_management.pyi +15 -33
  436. aip_agents/utils/logger.py +195 -0
  437. aip_agents/utils/logger.pyi +60 -0
  438. aip_agents/utils/metadata/__init__.py +27 -0
  439. aip_agents/utils/metadata/__init__.pyi +5 -0
  440. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  441. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  442. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  443. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  444. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  445. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  446. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  447. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  448. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  449. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  450. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  451. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  452. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  453. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  454. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  455. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  456. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  457. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  458. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  459. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  460. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  461. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  462. aip_agents/utils/metadata_helper.py +358 -0
  463. aip_agents/utils/metadata_helper.pyi +55 -48
  464. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  465. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  466. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +1 -2
  467. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  468. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +1 -1
  469. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  470. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +4 -4
  471. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  472. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +1 -1
  473. aip_agents/utils/pii/__init__.py +25 -0
  474. aip_agents/utils/pii/__init__.pyi +5 -0
  475. aip_agents/utils/pii/pii_handler.py +397 -0
  476. aip_agents/utils/pii/pii_handler.pyi +96 -0
  477. aip_agents/utils/pii/pii_helper.py +207 -0
  478. aip_agents/utils/pii/pii_helper.pyi +78 -0
  479. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  480. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  481. aip_agents/utils/reference_helper.py +273 -0
  482. aip_agents/utils/reference_helper.pyi +38 -6
  483. aip_agents/utils/sse_chunk_transformer.py +831 -0
  484. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  485. aip_agents/utils/step_limit_manager.py +265 -0
  486. aip_agents/utils/step_limit_manager.pyi +112 -0
  487. aip_agents/utils/token_usage_helper.py +156 -0
  488. aip_agents/utils/token_usage_helper.pyi +1 -1
  489. aip_agents_binary-0.5.11.dist-info/METADATA +689 -0
  490. aip_agents_binary-0.5.11.dist-info/RECORD +542 -0
  491. {aip_agents_binary-0.0.0b2.dist-info → aip_agents_binary-0.5.11.dist-info}/WHEEL +2 -1
  492. aip_agents_binary-0.5.11.dist-info/top_level.txt +1 -0
  493. aip_agents/agent/types.pyi +0 -106
  494. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client.pyi +0 -15
  495. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client_streaming.pyi +0 -5
  496. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_server.pyi +0 -11
  497. aip_agents/examples/hello_world_langgraph_bosa.pyi +0 -5
  498. aip_agents/examples/tools/pr_details_bosa_tool.pyi +0 -26
  499. aip_agents/tools/base.pyi +0 -44
  500. aip_agents/tools/base_bosa_tools.pyi +0 -12
  501. aip_agents/tools/bosa_connector.pyi +0 -30
  502. aip_agents/tools/bosa_tools_interface.pyi +0 -26
  503. aip_agents/tools/nested_agent_tool.pyi +0 -45
  504. aip_agents/utils/logger_manager.pyi +0 -151
  505. aip_agents_binary-0.0.0b2.dist-info/METADATA +0 -277
  506. aip_agents_binary-0.0.0b2.dist-info/RECORD +0 -157
@@ -1,42 +1,8 @@
1
- from aip_agents.storage.base import BaseObjectStorageClient as BaseObjectStorageClient
2
- from aip_agents.storage.clients.minio_client import MinioConfig as MinioConfig, MinioObjectStorage as MinioObjectStorage
3
- from aip_agents.storage.providers.base import BaseStorageProvider as BaseStorageProvider
4
- from aip_agents.storage.providers.memory import InMemoryStorageProvider as InMemoryStorageProvider
5
- from aip_agents.storage.providers.object_storage import ObjectStorageProvider as ObjectStorageProvider
6
- from dataclasses import dataclass
7
- from enum import StrEnum
1
+ from aip_agents.schema.storage import OBJECT_STORAGE_PREFIX as OBJECT_STORAGE_PREFIX, StorageConfig as StorageConfig, StorageType as StorageType
2
+ from aip_agents.storage.base import BaseObjectStorageClient
3
+ from aip_agents.storage.providers.base import BaseStorageProvider
8
4
 
9
- OBJECT_STORAGE_PREFIX: str
10
-
11
- class StorageType(StrEnum):
12
- """Supported storage types."""
13
- MEMORY = 'memory'
14
- OBJECT_STORAGE = 'object_storage'
15
-
16
- @dataclass
17
- class StorageConfig:
18
- """Configuration for storage providers.
19
-
20
- Attributes:
21
- storage_type: Type of storage to use
22
- object_prefix: Prefix for object storage keys (like a directory path)
23
- object_use_json: Use JSON serialization instead of pickle for object storage
24
- """
25
- storage_type: StorageType = ...
26
- object_prefix: str = ...
27
- object_use_json: bool = ...
28
- @classmethod
29
- def from_env(cls) -> StorageConfig:
30
- '''Create StorageConfig from environment variables.
31
-
32
- Environment variables:
33
- - TOOL_OUTPUT_STORAGE_TYPE: "memory" or "object_storage"
34
- - TOOL_OUTPUT_OBJECT_PREFIX: Prefix for object storage keys
35
- - TOOL_OUTPUT_USE_JSON: "true" to use JSON serialization
36
-
37
- Returns:
38
- StorageConfig instance
39
- '''
5
+ __all__ = ['OBJECT_STORAGE_PREFIX', 'StorageConfig', 'StorageType', 'StorageProviderFactory']
40
6
 
41
7
  class StorageProviderFactory:
42
8
  """Factory for creating storage providers based on configuration."""
@@ -45,22 +11,19 @@ class StorageProviderFactory:
45
11
  """Create storage provider based on configuration.
46
12
 
47
13
  Args:
48
- config: Storage configuration
49
- object_storage_client: Object storage client (required for object storage)
14
+ config (StorageConfig): Storage configuration object.
15
+ object_storage_client (BaseObjectStorageClient | None, optional): Optional object storage client for object storage type.
50
16
 
51
17
  Returns:
52
- Configured storage provider
53
-
54
- Raises:
55
- ValueError: If configuration is invalid
18
+ BaseStorageProvider: The created storage provider instance.
56
19
  """
57
20
  @staticmethod
58
21
  def create_from_env(object_storage_client: BaseObjectStorageClient | None = None) -> BaseStorageProvider:
59
22
  """Create storage provider from environment variables.
60
23
 
61
24
  Args:
62
- object_storage_client: Optional object storage client
25
+ object_storage_client (BaseObjectStorageClient | None, optional): Optional object storage client for object storage type.
63
26
 
64
27
  Returns:
65
- Configured storage provider
28
+ BaseStorageProvider: The created storage provider instance.
66
29
  """
@@ -0,0 +1,15 @@
1
+ """Storage providers for tool output management.
2
+
3
+ This module provides different storage backends for tool outputs including
4
+ in-memory, file-based, and object storage providers.
5
+
6
+ Authors:
7
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
8
+ Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
9
+ """
10
+
11
+ from aip_agents.storage.providers.base import BaseStorageProvider, StorageError
12
+ from aip_agents.storage.providers.memory import InMemoryStorageProvider
13
+ from aip_agents.storage.providers.object_storage import ObjectStorageProvider
14
+
15
+ __all__ = ["BaseStorageProvider", "StorageError", "InMemoryStorageProvider", "ObjectStorageProvider"]
@@ -0,0 +1,106 @@
1
+ """Base storage provider interface.
2
+
3
+ Authors:
4
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
5
+ Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
6
+ """
7
+
8
+ from abc import ABC, abstractmethod
9
+ from typing import Any
10
+
11
+ from aip_agents.utils.logger import get_logger
12
+
13
+ logger = get_logger(__name__)
14
+
15
+
16
+ class StorageError(Exception):
17
+ """Base exception for storage operations."""
18
+
19
+
20
+ class BaseStorageProvider(ABC):
21
+ """Base interface for storage providers.
22
+
23
+ This abstract class defines the contract that all storage providers
24
+ must implement to store and retrieve tool outputs.
25
+ """
26
+
27
+ @abstractmethod
28
+ def store(self, key: str, data: Any) -> None:
29
+ """Store data with the given key.
30
+
31
+ Args:
32
+ key: Unique identifier for the data
33
+ data: Data to store (must be serializable)
34
+
35
+ Raises:
36
+ StorageError: If storage operation fails
37
+ """
38
+
39
+ @abstractmethod
40
+ def retrieve(self, key: str) -> Any:
41
+ """Retrieve data by key.
42
+
43
+ Args:
44
+ key: Unique identifier for the data
45
+
46
+ Returns:
47
+ The stored data
48
+
49
+ Raises:
50
+ KeyError: If key not found
51
+ StorageError: If retrieval operation fails
52
+ """
53
+
54
+ @abstractmethod
55
+ def exists(self, key: str) -> bool:
56
+ """Check if key exists.
57
+
58
+ Args:
59
+ key: Unique identifier to check
60
+
61
+ Returns:
62
+ True if key exists, False otherwise
63
+ """
64
+
65
+ @abstractmethod
66
+ def delete(self, key: str) -> None:
67
+ """Delete data by key.
68
+
69
+ Args:
70
+ key: Unique identifier for the data
71
+
72
+ Note:
73
+ Should not raise error if key doesn't exist
74
+ """
75
+
76
+ @abstractmethod
77
+ def list_keys(self, prefix: str = "") -> list[str]:
78
+ """List all keys with optional prefix filter.
79
+
80
+ Args:
81
+ prefix: Optional prefix to filter keys
82
+
83
+ Returns:
84
+ List of matching keys
85
+ """
86
+
87
+ @abstractmethod
88
+ def clear(self) -> None:
89
+ """Clear all stored data.
90
+
91
+ Warning:
92
+ This operation is irreversible
93
+ """
94
+
95
+ def get_presigned_url(self, key: str, expires_hours: int = 24) -> str | None:
96
+ """Generate presigned URL for direct access (optional).
97
+
98
+ Args:
99
+ key: Storage key
100
+ expires_hours: URL expiration in hours
101
+
102
+ Returns:
103
+ Presigned URL if supported, None otherwise
104
+ """
105
+ logger.warning("This class get_presigned_url not implemented for this storage provider")
106
+ return None
@@ -1,7 +1,6 @@
1
- import abc
2
1
  from _typeshed import Incomplete
3
2
  from abc import ABC, abstractmethod
4
- from aip_agents.utils.logger_manager import LoggerManager as LoggerManager
3
+ from aip_agents.utils.logger import get_logger as get_logger
5
4
  from typing import Any
6
5
 
7
6
  logger: Incomplete
@@ -9,7 +8,7 @@ logger: Incomplete
9
8
  class StorageError(Exception):
10
9
  """Base exception for storage operations."""
11
10
 
12
- class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
11
+ class BaseStorageProvider(ABC):
13
12
  """Base interface for storage providers.
14
13
 
15
14
  This abstract class defines the contract that all storage providers
@@ -0,0 +1,114 @@
1
+ """In-memory storage provider implementation.
2
+
3
+ Authors:
4
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
5
+ Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
6
+ """
7
+
8
+ import sys
9
+ from typing import Any
10
+
11
+ from aip_agents.storage.providers.base import BaseStorageProvider, StorageError
12
+
13
+
14
+ class InMemoryStorageProvider(BaseStorageProvider):
15
+ """In-memory storage provider for fast access to small data.
16
+
17
+ This provider stores all data in memory, providing the fastest
18
+ access times but limited by available RAM.
19
+
20
+ Best for:
21
+ - Small to medium datasets
22
+ - Temporary storage
23
+ - Development and testing
24
+ - High-frequency access patterns
25
+ """
26
+
27
+ def __init__(self):
28
+ """Initialize in-memory storage."""
29
+ self._storage: dict[str, Any] = {}
30
+
31
+ def store(self, key: str, data: Any) -> None:
32
+ """Store data in memory.
33
+
34
+ Args:
35
+ key: Unique identifier for the data
36
+ data: Data to store
37
+
38
+ Raises:
39
+ StorageError: If storage operation fails
40
+ """
41
+ try:
42
+ self._storage[key] = data
43
+ except Exception as e:
44
+ raise StorageError(f"Failed to store data in memory: {e}") from e
45
+
46
+ def retrieve(self, key: str) -> Any:
47
+ """Retrieve data from memory.
48
+
49
+ Args:
50
+ key: Unique identifier for the data
51
+
52
+ Returns:
53
+ The stored data
54
+
55
+ Raises:
56
+ KeyError: If key not found
57
+ """
58
+ if key not in self._storage:
59
+ raise KeyError(f"Key '{key}' not found in memory storage")
60
+ return self._storage[key]
61
+
62
+ def exists(self, key: str) -> bool:
63
+ """Check if key exists in memory.
64
+
65
+ Args:
66
+ key: Unique identifier to check
67
+
68
+ Returns:
69
+ True if key exists, False otherwise
70
+ """
71
+ return key in self._storage
72
+
73
+ def delete(self, key: str) -> None:
74
+ """Delete data from memory.
75
+
76
+ Args:
77
+ key: Unique identifier for the data
78
+ """
79
+ self._storage.pop(key, None)
80
+
81
+ def list_keys(self, prefix: str = "") -> list[str]:
82
+ """List all keys with optional prefix.
83
+
84
+ Args:
85
+ prefix: Optional prefix to filter keys
86
+
87
+ Returns:
88
+ List of matching keys
89
+ """
90
+ if prefix:
91
+ return [k for k in self._storage.keys() if k.startswith(prefix)]
92
+ return list(self._storage.keys())
93
+
94
+ def clear(self) -> None:
95
+ """Clear all data from memory."""
96
+ self._storage.clear()
97
+
98
+ @property
99
+ def size_bytes(self) -> int:
100
+ """Get approximate memory usage in bytes.
101
+
102
+ Returns:
103
+ Approximate memory usage in bytes
104
+ """
105
+ return sum(sys.getsizeof(v) for v in self._storage.values())
106
+
107
+ @property
108
+ def count(self) -> int:
109
+ """Get number of stored items.
110
+
111
+ Returns:
112
+ Number of items in storage
113
+ """
114
+ return len(self._storage)
@@ -0,0 +1,214 @@
1
+ """Object storage provider implementation.
2
+
3
+ Authors:
4
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
5
+ Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
6
+ """
7
+
8
+ import json
9
+ import pickle
10
+ from typing import Any
11
+
12
+ from aip_agents.storage.base import BaseObjectStorageClient
13
+ from aip_agents.storage.providers.base import BaseStorageProvider, StorageError
14
+ from aip_agents.utils.logger import get_logger
15
+
16
+ logger = get_logger(__name__)
17
+
18
+
19
+ class ObjectStorageProvider(BaseStorageProvider):
20
+ """Object storage provider for S3-compatible storage.
21
+
22
+ Works with any S3-compatible storage including AWS S3, MinIO,
23
+ Google Cloud Storage (with S3 compatibility), etc.
24
+
25
+ Best for:
26
+ - Very large datasets
27
+ - Distributed systems
28
+ - Cloud deployments
29
+ - Long-term storage
30
+ - Multi-region access
31
+ """
32
+
33
+ def __init__(self, client: BaseObjectStorageClient, prefix: str = "", use_json: bool = False):
34
+ """Initialize object storage provider.
35
+
36
+ Args:
37
+ client: Object storage client instance
38
+ prefix: Prefix for all keys (like a directory)
39
+ use_json: Use JSON format (True) or pickle (False)
40
+ """
41
+ self.client = client
42
+ self.prefix = prefix.rstrip("/") + "/" if prefix else ""
43
+ self.use_json = use_json
44
+
45
+ def _get_object_key(self, key: str) -> str:
46
+ """Get full object key with prefix.
47
+
48
+ Args:
49
+ key: Storage key
50
+
51
+ Returns:
52
+ Full object key with prefix
53
+ """
54
+ return f"{self.prefix}{key}"
55
+
56
+ def _serialize_data(self, data: Any) -> bytes:
57
+ """Serialize data to bytes.
58
+
59
+ Args:
60
+ data: Data to serialize
61
+
62
+ Returns:
63
+ Serialized data as bytes
64
+
65
+ Raises:
66
+ StorageError: If serialization fails
67
+ """
68
+ try:
69
+ if self.use_json:
70
+ return json.dumps(data, default=str).encode("utf-8")
71
+ return pickle.dumps(data)
72
+ except Exception as e:
73
+ raise StorageError(f"Failed to serialize data: {e}") from e
74
+
75
+ def _deserialize_data(self, data_bytes: bytes) -> Any:
76
+ """Deserialize data from bytes.
77
+
78
+ Args:
79
+ data_bytes: Serialized data
80
+
81
+ Returns:
82
+ Deserialized data
83
+
84
+ Raises:
85
+ StorageError: If deserialization fails
86
+ """
87
+ try:
88
+ if self.use_json:
89
+ return json.loads(data_bytes.decode("utf-8"))
90
+ return pickle.loads(data_bytes)
91
+ except Exception as e:
92
+ raise StorageError(f"Failed to deserialize data: {e}") from e
93
+
94
+ def store(self, key: str, data: Any) -> None:
95
+ """Store data in object storage.
96
+
97
+ Args:
98
+ key: Unique identifier for the data
99
+ data: Data to store
100
+
101
+ Raises:
102
+ StorageError: If storage operation fails
103
+ """
104
+ object_key = self._get_object_key(key)
105
+
106
+ try:
107
+ data_bytes = self._serialize_data(data)
108
+
109
+ self.client.upload(
110
+ object_key=object_key,
111
+ file_stream=data_bytes,
112
+ content_type="application/json" if self.use_json else "application/octet-stream",
113
+ metadata={"storage_key": key, "format": "json" if self.use_json else "pickle"},
114
+ )
115
+
116
+ logger.debug(f"Stored data to object storage: {object_key}")
117
+
118
+ except Exception as e:
119
+ raise StorageError(f"Failed to store data in object storage: {e}") from e
120
+
121
+ def retrieve(self, key: str) -> Any:
122
+ """Retrieve data from object storage.
123
+
124
+ Args:
125
+ key: Unique identifier for the data
126
+
127
+ Returns:
128
+ The stored data
129
+
130
+ Raises:
131
+ KeyError: If key not found
132
+ StorageError: If retrieval operation fails
133
+ """
134
+ object_key = self._get_object_key(key)
135
+
136
+ try:
137
+ data_bytes = self.client.get(object_key)
138
+ return self._deserialize_data(data_bytes)
139
+
140
+ except KeyError as e:
141
+ raise KeyError(f"Key '{key}' not found in object storage: {e}") from e
142
+ except Exception as e:
143
+ raise StorageError(f"Failed to retrieve data from object storage: {e}") from e
144
+
145
+ def exists(self, key: str) -> bool:
146
+ """Check if object exists.
147
+
148
+ Args:
149
+ key: Unique identifier to check
150
+
151
+ Returns:
152
+ True if key exists, False otherwise
153
+ """
154
+ object_key = self._get_object_key(key)
155
+
156
+ try:
157
+ return self.client.object_exists(object_key)
158
+ except Exception as e:
159
+ logger.warning(f"Failed to check object existence: {e}")
160
+ return False
161
+
162
+ def delete(self, key: str) -> None:
163
+ """Delete object.
164
+
165
+ Args:
166
+ key: Unique identifier for the data
167
+ """
168
+ object_key = self._get_object_key(key)
169
+
170
+ try:
171
+ self.client.delete(object_key)
172
+ logger.debug(f"Deleted object: {object_key}")
173
+ except Exception as e:
174
+ logger.warning(f"Failed to delete object {object_key}: {e}")
175
+
176
+ def list_keys(self, prefix: str = "") -> list[str]:
177
+ """List all keys with optional prefix.
178
+
179
+ Args:
180
+ prefix: Optional prefix to filter keys
181
+
182
+ Raises:
183
+ NotImplementedError: list_keys is not implemented
184
+ """
185
+ raise NotImplementedError("list_keys not yet implemented for object storage")
186
+
187
+ def clear(self) -> None:
188
+ """Clear all objects with the configured prefix.
189
+
190
+ Warning:
191
+ This is a dangerous operation!
192
+ """
193
+ logger.warning("clear() not implemented for object storage - too dangerous")
194
+ raise NotImplementedError("Batch clear not implemented for safety reasons")
195
+
196
+ def get_presigned_url(self, key: str, expires_hours: int = 24) -> str | None:
197
+ """Generate presigned URL for direct access.
198
+
199
+ Args:
200
+ key: Storage key
201
+ expires_hours: URL expiration in hours
202
+
203
+ Returns:
204
+ Presigned URL for direct access
205
+
206
+ Raises:
207
+ StorageError: If URL generation fails
208
+ """
209
+ object_key = self._get_object_key(key)
210
+
211
+ try:
212
+ return self.client.generate_presigned_url(object_key=object_key, expires=expires_hours)
213
+ except Exception as e:
214
+ raise StorageError(f"Failed to generate presigned URL: {e}") from e
@@ -1,7 +1,7 @@
1
1
  from _typeshed import Incomplete
2
2
  from aip_agents.storage.base import BaseObjectStorageClient as BaseObjectStorageClient
3
3
  from aip_agents.storage.providers.base import BaseStorageProvider as BaseStorageProvider, StorageError as StorageError
4
- from aip_agents.utils.logger_manager import LoggerManager as LoggerManager
4
+ from aip_agents.utils.logger import get_logger as get_logger
5
5
  from typing import Any
6
6
 
7
7
  logger: Incomplete
@@ -0,0 +1,6 @@
1
+ """Initialize Tools Module for AIP Agents."""
2
+
3
+ from aip_agents.tools.bosa_tools import BOSA_AUTOMATED_TOOLS
4
+ from aip_agents.tools.gl_connector import GLConnectorTool
5
+
6
+ __all__ = ["BOSA_AUTOMATED_TOOLS", "GLConnectorTool"]
@@ -1,3 +1,4 @@
1
- from .bosa_tools import BOSA_AUTOMATED_TOOLS as BOSA_AUTOMATED_TOOLS
1
+ from aip_agents.tools.bosa_tools import BOSA_AUTOMATED_TOOLS as BOSA_AUTOMATED_TOOLS
2
+ from aip_agents.tools.gl_connector import GLConnectorTool as GLConnectorTool
2
3
 
3
- __all__ = ['BOSA_AUTOMATED_TOOLS']
4
+ __all__ = ['BOSA_AUTOMATED_TOOLS', 'GLConnectorTool']
@@ -0,0 +1,105 @@
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,6 +1,6 @@
1
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
3
- from aip_agents.utils.logger_manager import LoggerManager as LoggerManager
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
4
  from langchain_core.tools import BaseTool as BaseTool
5
5
 
6
6
  logger: Incomplete