aip-agents-binary 0.0.0b2__py3-none-any.whl → 0.5.12__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 (426) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/a2a/__init__.py +19 -0
  3. aip_agents/a2a/server/__init__.py +10 -0
  4. aip_agents/a2a/server/base_executor.py +1086 -0
  5. aip_agents/a2a/server/google_adk_executor.py +198 -0
  6. aip_agents/a2a/server/langflow_executor.py +180 -0
  7. aip_agents/a2a/server/langgraph_executor.py +270 -0
  8. aip_agents/a2a/types.py +232 -0
  9. aip_agents/agent/__init__.py +27 -0
  10. aip_agents/agent/base_agent.py +970 -0
  11. aip_agents/agent/base_langgraph_agent.py +2942 -0
  12. aip_agents/agent/google_adk_agent.py +926 -0
  13. aip_agents/agent/google_adk_constants.py +6 -0
  14. aip_agents/agent/hitl/__init__.py +24 -0
  15. aip_agents/agent/hitl/config.py +28 -0
  16. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  17. aip_agents/agent/hitl/manager.py +532 -0
  18. aip_agents/agent/hitl/models.py +18 -0
  19. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  20. aip_agents/agent/hitl/prompt/base.py +42 -0
  21. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  22. aip_agents/agent/hitl/registry.py +149 -0
  23. aip_agents/agent/{interface.pyi → interface.py} +70 -13
  24. aip_agents/agent/interfaces.py +65 -0
  25. aip_agents/agent/langflow_agent.py +464 -0
  26. aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
  27. aip_agents/agent/langgraph_react_agent.py +2514 -0
  28. aip_agents/agent/system_instruction_context.py +34 -0
  29. aip_agents/clients/__init__.py +10 -0
  30. aip_agents/clients/langflow/__init__.py +10 -0
  31. aip_agents/clients/langflow/client.py +477 -0
  32. aip_agents/clients/langflow/types.py +18 -0
  33. aip_agents/constants.py +23 -0
  34. aip_agents/credentials/manager.py +132 -0
  35. aip_agents/examples/__init__.py +5 -0
  36. aip_agents/examples/compare_streaming_client.py +783 -0
  37. aip_agents/examples/compare_streaming_server.py +142 -0
  38. aip_agents/examples/demo_memory_recall.py +401 -0
  39. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  40. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  41. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  42. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  43. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  44. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  45. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  46. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  47. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  48. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  49. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  50. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  51. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  52. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  53. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  54. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  55. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  56. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  57. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  58. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  59. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  60. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  61. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  62. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  63. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  64. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  65. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  66. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  67. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  68. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  69. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  70. aip_agents/examples/hello_world_google_adk.py +41 -0
  71. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  72. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  73. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  74. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  75. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  76. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  77. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  78. aip_agents/examples/hello_world_langchain.py +28 -0
  79. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  80. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  81. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  82. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  83. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  84. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  85. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  86. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  87. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  88. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  89. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  90. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  91. aip_agents/examples/hello_world_langgraph.py +39 -0
  92. aip_agents/examples/hello_world_langgraph_bosa_twitter.py +41 -0
  93. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  94. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  95. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  96. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  97. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  98. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  99. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  100. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  101. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  102. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  103. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  104. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  105. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  106. aip_agents/examples/hello_world_pii_logger.py +21 -0
  107. aip_agents/examples/hello_world_sentry.py +133 -0
  108. aip_agents/examples/hello_world_step_limits.py +273 -0
  109. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  110. aip_agents/examples/hello_world_tool_output_client.py +46 -0
  111. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  112. aip_agents/examples/hitl_demo.py +724 -0
  113. aip_agents/examples/mcp_configs/configs.py +63 -0
  114. aip_agents/examples/mcp_servers/common.py +76 -0
  115. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  116. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  117. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  118. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  119. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  120. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  121. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  122. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  123. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  124. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  125. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  126. aip_agents/examples/tools/__init__.py +27 -0
  127. aip_agents/examples/tools/{adk_arithmetic_tools.pyi → adk_arithmetic_tools.py} +12 -0
  128. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  129. aip_agents/examples/tools/data_generator_tool.py +103 -0
  130. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  131. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  132. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  133. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  134. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  135. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  136. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  137. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  138. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  139. aip_agents/examples/tools/random_chart_tool.py +142 -0
  140. aip_agents/examples/tools/serper_tool.py +202 -0
  141. aip_agents/examples/tools/stock_tools.py +82 -0
  142. aip_agents/examples/tools/table_generator_tool.py +167 -0
  143. aip_agents/examples/tools/time_tool.py +82 -0
  144. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  145. aip_agents/executor/agent_executor.py +473 -0
  146. aip_agents/executor/base.py +48 -0
  147. aip_agents/mcp/__init__.py +1 -0
  148. aip_agents/mcp/client/__init__.py +14 -0
  149. aip_agents/mcp/client/base_mcp_client.py +369 -0
  150. aip_agents/mcp/client/connection_manager.py +193 -0
  151. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  152. aip_agents/mcp/client/google_adk/client.py +381 -0
  153. aip_agents/mcp/client/langchain/__init__.py +11 -0
  154. aip_agents/mcp/client/langchain/client.py +265 -0
  155. aip_agents/mcp/client/persistent_session.py +359 -0
  156. aip_agents/mcp/client/session_pool.py +351 -0
  157. aip_agents/mcp/client/transports.py +215 -0
  158. aip_agents/mcp/utils/__init__.py +7 -0
  159. aip_agents/mcp/utils/config_validator.py +139 -0
  160. aip_agents/memory/__init__.py +14 -0
  161. aip_agents/memory/adapters/__init__.py +10 -0
  162. aip_agents/memory/adapters/base_adapter.py +717 -0
  163. aip_agents/memory/adapters/mem0.py +84 -0
  164. aip_agents/memory/{base.pyi → base.py} +40 -5
  165. aip_agents/memory/constants.py +49 -0
  166. aip_agents/memory/factory.py +86 -0
  167. aip_agents/memory/guidance.py +20 -0
  168. aip_agents/memory/simple_memory.py +47 -0
  169. aip_agents/middleware/__init__.py +17 -0
  170. aip_agents/middleware/base.py +88 -0
  171. aip_agents/middleware/manager.py +128 -0
  172. aip_agents/middleware/todolist.py +274 -0
  173. aip_agents/schema/__init__.py +69 -0
  174. aip_agents/schema/a2a.py +56 -0
  175. aip_agents/schema/agent.py +111 -0
  176. aip_agents/schema/hitl.py +157 -0
  177. aip_agents/schema/langgraph.py +37 -0
  178. aip_agents/schema/model_id.py +97 -0
  179. aip_agents/schema/step_limit.py +108 -0
  180. aip_agents/schema/storage.py +40 -0
  181. aip_agents/sentry/__init__.py +11 -0
  182. aip_agents/sentry/sentry.py +151 -0
  183. aip_agents/storage/__init__.py +41 -0
  184. aip_agents/storage/{base.pyi → base.py} +30 -4
  185. aip_agents/storage/clients/__init__.py +12 -0
  186. aip_agents/storage/clients/minio_client.py +318 -0
  187. aip_agents/storage/config.py +62 -0
  188. aip_agents/storage/providers/__init__.py +15 -0
  189. aip_agents/storage/providers/{base.pyi → base.py} +23 -6
  190. aip_agents/storage/providers/{memory.pyi → memory.py} +38 -3
  191. aip_agents/storage/providers/object_storage.py +214 -0
  192. aip_agents/tools/__init__.py +6 -0
  193. aip_agents/tools/bosa_tools.py +105 -0
  194. aip_agents/tools/browser_use/__init__.py +82 -0
  195. aip_agents/tools/browser_use/action_parser.py +103 -0
  196. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  197. aip_agents/tools/browser_use/llm_config.py +120 -0
  198. aip_agents/tools/browser_use/minio_storage.py +198 -0
  199. aip_agents/tools/browser_use/schemas.py +119 -0
  200. aip_agents/tools/browser_use/session.py +76 -0
  201. aip_agents/tools/browser_use/session_errors.py +132 -0
  202. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  203. aip_agents/tools/browser_use/streaming.py +813 -0
  204. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  205. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  206. aip_agents/tools/browser_use/types.py +78 -0
  207. aip_agents/tools/code_sandbox/__init__.py +26 -0
  208. aip_agents/tools/code_sandbox/constant.py +13 -0
  209. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
  210. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  211. aip_agents/tools/constants.py +165 -0
  212. aip_agents/tools/document_loader/__init__.py +37 -0
  213. aip_agents/tools/document_loader/base_reader.py +262 -0
  214. aip_agents/tools/document_loader/docx_reader_tool.py +53 -0
  215. aip_agents/tools/document_loader/excel_reader_tool.py +160 -0
  216. aip_agents/tools/document_loader/pdf_reader_tool.py +67 -0
  217. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  218. aip_agents/tools/gl_connector/__init__.py +5 -0
  219. aip_agents/tools/gl_connector/tool.py +351 -0
  220. aip_agents/tools/memory_search/__init__.py +22 -0
  221. aip_agents/tools/memory_search/base.py +200 -0
  222. aip_agents/tools/memory_search/mem0.py +258 -0
  223. aip_agents/tools/memory_search/schema.py +48 -0
  224. aip_agents/tools/memory_search_tool.py +26 -0
  225. aip_agents/tools/tool_config_injector.py +300 -0
  226. aip_agents/tools/web_search/__init__.py +15 -0
  227. aip_agents/tools/web_search/serper_tool.py +187 -0
  228. aip_agents/types/__init__.py +70 -0
  229. aip_agents/types/a2a_events.py +13 -0
  230. aip_agents/utils/__init__.py +79 -0
  231. aip_agents/utils/a2a_connector.py +1757 -0
  232. aip_agents/utils/artifact_helpers.py +502 -0
  233. aip_agents/utils/constants.py +22 -0
  234. aip_agents/utils/datetime/__init__.py +34 -0
  235. aip_agents/utils/datetime/normalization.py +231 -0
  236. aip_agents/utils/datetime/timezone.py +206 -0
  237. aip_agents/utils/env_loader.py +27 -0
  238. aip_agents/utils/event_handler_registry.py +58 -0
  239. aip_agents/utils/file_prompt_utils.py +176 -0
  240. aip_agents/utils/final_response_builder.py +211 -0
  241. aip_agents/utils/formatter_llm_client.py +231 -0
  242. aip_agents/utils/langgraph/__init__.py +19 -0
  243. aip_agents/utils/langgraph/converter.py +128 -0
  244. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  245. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  246. aip_agents/utils/langgraph/tool_managers/{base_tool_manager.pyi → base_tool_manager.py} +25 -8
  247. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  248. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  249. aip_agents/utils/logger.py +195 -0
  250. aip_agents/utils/metadata/__init__.py +27 -0
  251. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  252. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  253. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  254. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  255. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  256. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  257. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  258. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  259. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  260. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  261. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  262. aip_agents/utils/metadata_helper.py +358 -0
  263. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  264. aip_agents/utils/name_preprocessor/{base_name_preprocessor.pyi → base_name_preprocessor.py} +22 -2
  265. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  266. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  267. aip_agents/utils/name_preprocessor/{openai_name_preprocessor.pyi → openai_name_preprocessor.py} +19 -5
  268. aip_agents/utils/pii/__init__.py +25 -0
  269. aip_agents/utils/pii/pii_handler.py +397 -0
  270. aip_agents/utils/pii/pii_helper.py +207 -0
  271. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  272. aip_agents/utils/reference_helper.py +273 -0
  273. aip_agents/utils/sse_chunk_transformer.py +831 -0
  274. aip_agents/utils/step_limit_manager.py +265 -0
  275. aip_agents/utils/token_usage_helper.py +156 -0
  276. aip_agents_binary-0.5.12.dist-info/METADATA +689 -0
  277. aip_agents_binary-0.5.12.dist-info/RECORD +279 -0
  278. {aip_agents_binary-0.0.0b2.dist-info → aip_agents_binary-0.5.12.dist-info}/WHEEL +2 -1
  279. aip_agents_binary-0.5.12.dist-info/top_level.txt +1 -0
  280. aip_agents/__init__.pyi +0 -0
  281. aip_agents/a2a/__init__.pyi +0 -3
  282. aip_agents/a2a/server/__init__.pyi +0 -4
  283. aip_agents/a2a/server/base_executor.pyi +0 -63
  284. aip_agents/a2a/server/google_adk_executor.pyi +0 -51
  285. aip_agents/a2a/server/langgraph_executor.pyi +0 -48
  286. aip_agents/a2a/types.pyi +0 -125
  287. aip_agents/agent/__init__.pyi +0 -7
  288. aip_agents/agent/base_agent.pyi +0 -205
  289. aip_agents/agent/base_langgraph_agent.pyi +0 -164
  290. aip_agents/agent/google_adk_agent.pyi +0 -128
  291. aip_agents/agent/langgraph_react_agent.pyi +0 -131
  292. aip_agents/agent/types.pyi +0 -106
  293. aip_agents/constants.pyi +0 -6
  294. aip_agents/examples/__init__.pyi +0 -0
  295. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +0 -9
  296. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +0 -9
  297. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +0 -9
  298. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +0 -10
  299. aip_agents/examples/hello_world_a2a_langchain_client.pyi +0 -5
  300. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +0 -5
  301. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +0 -5
  302. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +0 -5
  303. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +0 -5
  304. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +0 -10
  305. aip_agents/examples/hello_world_a2a_langchain_server.pyi +0 -10
  306. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +0 -10
  307. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +0 -5
  308. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +0 -5
  309. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +0 -11
  310. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +0 -9
  311. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +0 -9
  312. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +0 -2
  313. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +0 -9
  314. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +0 -5
  315. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +0 -5
  316. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +0 -9
  317. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +0 -10
  318. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +0 -10
  319. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +0 -48
  320. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client.pyi +0 -15
  321. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client_streaming.pyi +0 -5
  322. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_server.pyi +0 -11
  323. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +0 -23
  324. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +0 -17
  325. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +0 -5
  326. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +0 -10
  327. aip_agents/examples/hello_world_google_adk.pyi +0 -5
  328. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +0 -5
  329. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +0 -5
  330. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +0 -5
  331. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +0 -5
  332. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +0 -5
  333. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +0 -5
  334. aip_agents/examples/hello_world_google_adk_stream.pyi +0 -5
  335. aip_agents/examples/hello_world_langchain.pyi +0 -5
  336. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +0 -2
  337. aip_agents/examples/hello_world_langchain_mcp_http.pyi +0 -5
  338. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +0 -5
  339. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +0 -5
  340. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +0 -5
  341. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +0 -5
  342. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +0 -5
  343. aip_agents/examples/hello_world_langchain_stream.pyi +0 -5
  344. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +0 -5
  345. aip_agents/examples/hello_world_langgraph.pyi +0 -5
  346. aip_agents/examples/hello_world_langgraph_bosa.pyi +0 -5
  347. aip_agents/examples/hello_world_langgraph_bosa_twitter.pyi +0 -5
  348. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +0 -5
  349. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +0 -5
  350. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +0 -5
  351. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +0 -5
  352. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +0 -5
  353. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +0 -5
  354. aip_agents/examples/hello_world_langgraph_stream.pyi +0 -5
  355. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +0 -5
  356. aip_agents/examples/hello_world_model_switch_cli.pyi +0 -15
  357. aip_agents/examples/hello_world_multi_agent_adk.pyi +0 -6
  358. aip_agents/examples/hello_world_multi_agent_langchain.pyi +0 -5
  359. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +0 -5
  360. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +0 -5
  361. aip_agents/examples/hello_world_pii_logger.pyi +0 -5
  362. aip_agents/examples/hello_world_sentry.pyi +0 -21
  363. aip_agents/examples/hello_world_stock_a2a_server.pyi +0 -12
  364. aip_agents/examples/hello_world_tool_output_client.pyi +0 -5
  365. aip_agents/examples/hello_world_tool_output_server.pyi +0 -14
  366. aip_agents/examples/tools/__init__.pyi +0 -7
  367. aip_agents/examples/tools/adk_weather_tool.pyi +0 -18
  368. aip_agents/examples/tools/data_generator_tool.pyi +0 -15
  369. aip_agents/examples/tools/data_visualization_tool.pyi +0 -17
  370. aip_agents/examples/tools/image_artifact_tool.pyi +0 -24
  371. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +0 -10
  372. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +0 -21
  373. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +0 -23
  374. aip_agents/examples/tools/langchain_weather_tool.pyi +0 -19
  375. aip_agents/examples/tools/langgraph_streaming_tool.pyi +0 -43
  376. aip_agents/examples/tools/pr_details_bosa_tool.pyi +0 -26
  377. aip_agents/examples/tools/serper_tool.pyi +0 -16
  378. aip_agents/examples/tools/stock_tools.pyi +0 -21
  379. aip_agents/examples/tools/table_generator_tool.pyi +0 -22
  380. aip_agents/examples/tools/time_tool.pyi +0 -15
  381. aip_agents/examples/tools/weather_forecast_tool.pyi +0 -14
  382. aip_agents/mcp/__init__.pyi +0 -0
  383. aip_agents/mcp/client/__init__.pyi +0 -4
  384. aip_agents/mcp/client/google_adk/__init__.pyi +0 -3
  385. aip_agents/mcp/client/google_adk/client.pyi +0 -38
  386. aip_agents/mcp/client/langchain/__init__.pyi +0 -3
  387. aip_agents/mcp/client/langchain/client.pyi +0 -3
  388. aip_agents/memory/__init__.pyi +0 -0
  389. aip_agents/memory/simple_memory.pyi +0 -22
  390. aip_agents/sentry/__init__.pyi +0 -3
  391. aip_agents/sentry/sentry.pyi +0 -48
  392. aip_agents/storage/__init__.pyi +0 -8
  393. aip_agents/storage/clients/__init__.pyi +0 -3
  394. aip_agents/storage/clients/minio_client.pyi +0 -137
  395. aip_agents/storage/config.pyi +0 -66
  396. aip_agents/storage/providers/__init__.pyi +0 -5
  397. aip_agents/storage/providers/object_storage.pyi +0 -98
  398. aip_agents/tools/__init__.pyi +0 -3
  399. aip_agents/tools/base.pyi +0 -44
  400. aip_agents/tools/base_bosa_tools.pyi +0 -12
  401. aip_agents/tools/bosa_connector.pyi +0 -30
  402. aip_agents/tools/bosa_tools.pyi +0 -37
  403. aip_agents/tools/bosa_tools_interface.pyi +0 -26
  404. aip_agents/tools/constants.pyi +0 -130
  405. aip_agents/tools/nested_agent_tool.pyi +0 -45
  406. aip_agents/tools/tool_config_injector.pyi +0 -26
  407. aip_agents/types/__init__.pyi +0 -3
  408. aip_agents/types/a2a_events.pyi +0 -74
  409. aip_agents/utils/__init__.pyi +0 -5
  410. aip_agents/utils/a2a_connector.pyi +0 -135
  411. aip_agents/utils/artifact_helpers.pyi +0 -179
  412. aip_agents/utils/langgraph/__init__.pyi +0 -3
  413. aip_agents/utils/langgraph/converter.pyi +0 -49
  414. aip_agents/utils/langgraph/tool_managers/__init__.pyi +0 -5
  415. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +0 -35
  416. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +0 -50
  417. aip_agents/utils/langgraph/tool_output_management.pyi +0 -310
  418. aip_agents/utils/logger_manager.pyi +0 -151
  419. aip_agents/utils/metadata_helper.pyi +0 -110
  420. aip_agents/utils/name_preprocessor/__init__.pyi +0 -6
  421. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +0 -38
  422. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +0 -41
  423. aip_agents/utils/reference_helper.pyi +0 -49
  424. aip_agents/utils/token_usage_helper.pyi +0 -60
  425. aip_agents_binary-0.0.0b2.dist-info/METADATA +0 -277
  426. aip_agents_binary-0.0.0b2.dist-info/RECORD +0 -157
@@ -0,0 +1,318 @@
1
+ """Minio object storage implementation.
2
+
3
+ Authors:
4
+ Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
5
+ """
6
+
7
+ import datetime
8
+ import io
9
+ import os
10
+ from dataclasses import dataclass
11
+ from typing import BinaryIO
12
+
13
+ from minio import Minio, S3Error
14
+ from urllib3.exceptions import HTTPError
15
+
16
+ from aip_agents.storage.base import BaseObjectStorageClient
17
+
18
+ S3_ERR_NO_SUCH_KEY = "NoSuchKey"
19
+ S3_ERR_NO_SUCH_BUCKET = "NoSuchBucket"
20
+ S3_ERR_ACCESS_DENIED = "AccessDenied"
21
+
22
+
23
+ @dataclass
24
+ class MinioConfig:
25
+ """Configuration for MinIO object storage client.
26
+
27
+ Attributes:
28
+ endpoint: MinIO server endpoint URL
29
+ access_key: Access key for authentication
30
+ secret_key: Secret key for authentication
31
+ bucket: Bucket name to use for storage
32
+ secure: Whether to use HTTPS (defaults to True)
33
+ """
34
+
35
+ endpoint: str
36
+ access_key: str
37
+ secret_key: str
38
+ bucket: str
39
+ secure: bool = True
40
+
41
+ @classmethod
42
+ def from_env(cls) -> "MinioConfig":
43
+ """Create MinioConfig from environment variables.
44
+
45
+ Expected environment variables:
46
+ - OBJECT_STORAGE_URL
47
+ - OBJECT_STORAGE_USER
48
+ - OBJECT_STORAGE_PASSWORD
49
+ - OBJECT_STORAGE_BUCKET
50
+ - OBJECT_STORAGE_SECURE (optional, defaults to True)
51
+
52
+ Returns:
53
+ MinioConfig instance
54
+
55
+ Raises:
56
+ ValueError: If required environment variables are not set
57
+ """
58
+ endpoint = os.getenv("OBJECT_STORAGE_URL")
59
+ access_key = os.getenv("OBJECT_STORAGE_USER")
60
+ secret_key = os.getenv("OBJECT_STORAGE_PASSWORD")
61
+ bucket = os.getenv("OBJECT_STORAGE_BUCKET")
62
+ secure_str = os.getenv("OBJECT_STORAGE_SECURE")
63
+
64
+ if not all([endpoint, access_key, secret_key, bucket]):
65
+ raise ValueError(
66
+ "MinIO configuration incomplete. Required environment variables: "
67
+ "OBJECT_STORAGE_URL, OBJECT_STORAGE_USER, "
68
+ "OBJECT_STORAGE_PASSWORD, OBJECT_STORAGE_BUCKET"
69
+ )
70
+
71
+ secure = secure_str.lower() in ("true", "1", "yes", "on")
72
+
73
+ return cls(endpoint=endpoint, access_key=access_key, secret_key=secret_key, bucket=bucket, secure=secure)
74
+
75
+
76
+ class MinioObjectStorage(BaseObjectStorageClient):
77
+ """Implementation of ObjectStorageInterface using Minio."""
78
+
79
+ def __init__(self, config: MinioConfig | None = None, ensure_bucket: bool = True):
80
+ """Initialize MinioObjectStorage with configuration.
81
+
82
+ Args:
83
+ config: MinioConfig instance. If None, will attempt to load from environment variables.
84
+ ensure_bucket: Whether to ensure bucket exists during initialization (optional). Defaults to True.
85
+
86
+ Raises:
87
+ ValueError: If configuration is invalid or incomplete
88
+ """
89
+ if config is None:
90
+ config = MinioConfig.from_env()
91
+
92
+ self.config = config
93
+ self.client = Minio(
94
+ endpoint=config.endpoint,
95
+ access_key=config.access_key,
96
+ secret_key=config.secret_key,
97
+ secure=config.secure,
98
+ )
99
+ self.bucket = config.bucket
100
+ self._bucket_exists = None
101
+
102
+ if ensure_bucket:
103
+ self._ensure_bucket_exists()
104
+
105
+ def _ensure_bucket_exists(self) -> None:
106
+ """Ensure the bucket exists, creating it if necessary.
107
+
108
+ Uses caching to avoid repeated bucket existence checks.
109
+
110
+ Raises:
111
+ PermissionError: If user lacks permission to create the bucket
112
+ ConnectionError: If there's a network/connection issue creating the bucket
113
+ """
114
+ if self._bucket_exists is None:
115
+ try:
116
+ self._bucket_exists = self.client.bucket_exists(self.bucket)
117
+ if not self._bucket_exists:
118
+ self.client.make_bucket(self.bucket)
119
+ self._bucket_exists = True
120
+ except S3Error as e:
121
+ if e.code == S3_ERR_ACCESS_DENIED: # pragma: no cover - difficult to test with mocks
122
+ raise PermissionError(
123
+ f"Access denied: Insufficient permissions to create bucket '{self.bucket}'. "
124
+ f"Please check your AWS/MinIO user permissions."
125
+ ) from e
126
+ else:
127
+ raise ConnectionError(f"Failed to create bucket '{self.bucket}': {str(e)}") from e
128
+
129
+ def _prepare_file_stream(self, file_stream: bytes | BinaryIO) -> tuple[BinaryIO, int]:
130
+ """Prepare file stream for upload and validate its content.
131
+
132
+ Args:
133
+ file_stream: The file stream to prepare (bytes or file-like object)
134
+
135
+ Returns:
136
+ Tuple containing:
137
+ - Prepared file stream
138
+ - Length of the file content
139
+
140
+ Raises:
141
+ ValueError: If the file stream is empty or invalid
142
+ """
143
+ if isinstance(file_stream, bytes):
144
+ file_stream = io.BytesIO(file_stream)
145
+ file_length = len(file_stream.getvalue())
146
+ else:
147
+ # For file-like objects, seek to end to get size, then reset
148
+ try:
149
+ current_pos = file_stream.tell()
150
+ file_stream.seek(0, 2) # Seek to end
151
+ file_length = file_stream.tell()
152
+ file_stream.seek(current_pos)
153
+ except (OSError, AttributeError) as e:
154
+ raise ValueError(f"Invalid file stream: {str(e)}") from e
155
+
156
+ if file_length == 0:
157
+ raise ValueError("File stream is empty.")
158
+
159
+ return file_stream, file_length
160
+
161
+ def upload(
162
+ self,
163
+ object_key: str,
164
+ file_stream: bytes | BinaryIO,
165
+ filename: str | None = None,
166
+ content_type: str | None = None,
167
+ metadata: dict[str, str] | None = None,
168
+ ) -> str:
169
+ """Upload data to Minio object storage.
170
+
171
+ Args:
172
+ object_key: The key to store the object under
173
+ file_stream: The data to upload (bytes or file-like object)
174
+ filename: The filename of the data (optional)
175
+ content_type: The content type of the data (optional)
176
+ metadata: Additional metadata to store with the object (optional)
177
+
178
+ Returns:
179
+ The object key of the uploaded data
180
+
181
+ Raises:
182
+ ValueError: If the file stream is empty or invalid
183
+ ConnectionError: If there's an issue connecting to Minio
184
+ Exception: For other unexpected errors during upload
185
+ """
186
+ if self._bucket_exists is None:
187
+ self._ensure_bucket_exists()
188
+ prepared_stream, file_length = self._prepare_file_stream(file_stream)
189
+
190
+ try:
191
+ self.client.put_object(
192
+ bucket_name=self.bucket,
193
+ object_name=object_key,
194
+ data=prepared_stream,
195
+ length=file_length,
196
+ content_type=content_type,
197
+ metadata=metadata,
198
+ )
199
+ except S3Error as e:
200
+ raise ConnectionError(f"Failed to upload object '{object_key}' to Minio: {str(e)}") from e
201
+ except HTTPError as e:
202
+ raise ConnectionError(f"A network error occurred during object upload: {str(e)}") from e
203
+
204
+ return object_key
205
+
206
+ def get(self, object_key: str) -> bytes:
207
+ """Get data from Minio object storage.
208
+
209
+ Args:
210
+ object_key: The key of the object to retrieve
211
+
212
+ Returns:
213
+ The object data as bytes
214
+
215
+ Raises:
216
+ KeyError: If the object is not found
217
+ ConnectionError: If there's a network or connection issue
218
+ """
219
+ try:
220
+ with self.client.get_object(bucket_name=self.bucket, object_name=object_key) as response:
221
+ return response.read()
222
+ except S3Error as e:
223
+ if e.code == S3_ERR_NO_SUCH_KEY:
224
+ raise KeyError(f"Object with key '{object_key}' not found") from e
225
+ raise ConnectionError(f"Failed to get object '{object_key}': {str(e)}") from e
226
+ except HTTPError as e:
227
+ raise ConnectionError(f"A network error occurred during object retrieval: {str(e)}") from e
228
+
229
+ def delete(self, object_key: str) -> None:
230
+ """Delete data from Minio object storage.
231
+
232
+ Args:
233
+ object_key: The key of the object to delete
234
+
235
+ Raises:
236
+ ConnectionError: If there's a network or connection issue
237
+ """
238
+ try:
239
+ self.client.remove_object(bucket_name=self.bucket, object_name=object_key)
240
+ except S3Error as e:
241
+ if e.code != S3_ERR_NO_SUCH_KEY: # Don't raise error if object doesn't exist
242
+ raise ConnectionError(f"Failed to delete object '{object_key}': {str(e)}") from e
243
+ except HTTPError as e:
244
+ raise ConnectionError(f"A network error occurred during file deletion: {str(e)}") from e
245
+
246
+ def object_exists(self, object_key: str) -> bool:
247
+ """Check if an object exists in the MinIO bucket.
248
+
249
+ Args:
250
+ object_key: The key of the object to check.
251
+
252
+ Returns:
253
+ True if the object exists, False otherwise.
254
+
255
+ Raises:
256
+ ConnectionError: If there's a network or connection issue (excluding not found errors)
257
+ """
258
+ try:
259
+ self.client.stat_object(self.bucket, object_key)
260
+ return True
261
+ except S3Error as e:
262
+ if e.code in (S3_ERR_NO_SUCH_KEY, S3_ERR_NO_SUCH_BUCKET):
263
+ return False
264
+ raise ConnectionError(f"Failed to check object existence '{object_key}': {str(e)}") from e
265
+ except HTTPError as e:
266
+ raise ConnectionError(f"A network error occurred while checking object existence: {str(e)}") from e
267
+
268
+ def list_objects(self, prefix: str = "") -> list[str]:
269
+ """List objects in the bucket with optional prefix filter.
270
+
271
+ Args:
272
+ prefix: Optional prefix to filter objects
273
+
274
+ Returns:
275
+ List of object keys
276
+
277
+ Raises:
278
+ ConnectionError: If there's an issue listing objects
279
+ """
280
+ try:
281
+ objects = self.client.list_objects(self.bucket, prefix=prefix)
282
+ return [obj.object_name for obj in objects]
283
+ except S3Error as e:
284
+ raise ConnectionError(f"Failed to list objects in bucket '{self.bucket}': {str(e)}") from e
285
+ except HTTPError as e:
286
+ raise ConnectionError(f"A network error occurred while listing objects: {str(e)}") from e
287
+
288
+ def generate_presigned_url(
289
+ self, object_key: str, expires: int = 24, response_headers: dict[str, str] | None = None
290
+ ) -> str:
291
+ """Generate a presigned URL for accessing the object.
292
+
293
+ Args:
294
+ object_key: The key of the object
295
+ expires: Expiration time in hours (defaults to 24)
296
+ response_headers: Additional response headers (optional)
297
+
298
+ Returns:
299
+ A presigned URL
300
+
301
+ Raises:
302
+ ValueError: If expiration time is not positive
303
+ ConnectionError: If there's an issue generating the URL
304
+ """
305
+ if expires <= 0:
306
+ raise ValueError("Expiration time must be positive")
307
+
308
+ try:
309
+ return self.client.presigned_get_object(
310
+ bucket_name=self.bucket,
311
+ object_name=object_key,
312
+ expires=datetime.timedelta(hours=expires),
313
+ response_headers=response_headers,
314
+ )
315
+ except S3Error as e:
316
+ raise ConnectionError(f"Failed to generate presigned URL for '{object_key}': {str(e)}") from e
317
+ except HTTPError as e:
318
+ raise ConnectionError(f"A network error occurred while generating presigned URL: {str(e)}") from e
@@ -0,0 +1,62 @@
1
+ """Storage configuration system.
2
+
3
+ This module keeps factory logic while delegating data schemas to ``aip_agents.schema.storage``.
4
+ """
5
+
6
+ from aip_agents.schema.storage import OBJECT_STORAGE_PREFIX, StorageConfig, StorageType
7
+ from aip_agents.storage.base import BaseObjectStorageClient
8
+ from aip_agents.storage.clients.minio_client import MinioConfig, MinioObjectStorage
9
+ from aip_agents.storage.providers.base import BaseStorageProvider
10
+ from aip_agents.storage.providers.memory import InMemoryStorageProvider
11
+ from aip_agents.storage.providers.object_storage import ObjectStorageProvider
12
+
13
+ __all__ = ["OBJECT_STORAGE_PREFIX", "StorageConfig", "StorageType", "StorageProviderFactory"]
14
+
15
+
16
+ class StorageProviderFactory:
17
+ """Factory for creating storage providers based on configuration."""
18
+
19
+ @staticmethod
20
+ def create(
21
+ config: StorageConfig, object_storage_client: BaseObjectStorageClient | None = None
22
+ ) -> BaseStorageProvider:
23
+ """Create storage provider based on configuration.
24
+
25
+ Args:
26
+ config (StorageConfig): Storage configuration object.
27
+ object_storage_client (BaseObjectStorageClient | None, optional): Optional object storage client for object storage type.
28
+
29
+ Returns:
30
+ BaseStorageProvider: The created storage provider instance.
31
+ """
32
+ if config.storage_type == StorageType.MEMORY:
33
+ return InMemoryStorageProvider()
34
+
35
+ if config.storage_type == StorageType.OBJECT_STORAGE:
36
+ if object_storage_client is None:
37
+ try:
38
+ minio_config = MinioConfig.from_env()
39
+ object_storage_client = MinioObjectStorage(minio_config)
40
+ except ValueError as exc:
41
+ raise ValueError(
42
+ f"Object storage client required but not provided and cannot create from env: {exc}"
43
+ ) from exc
44
+
45
+ return ObjectStorageProvider(
46
+ client=object_storage_client, prefix=config.object_prefix, use_json=config.object_use_json
47
+ )
48
+
49
+ raise ValueError(f"Unknown storage type: {config.storage_type}")
50
+
51
+ @staticmethod
52
+ def create_from_env(object_storage_client: BaseObjectStorageClient | None = None) -> BaseStorageProvider:
53
+ """Create storage provider from environment variables.
54
+
55
+ Args:
56
+ object_storage_client (BaseObjectStorageClient | None, optional): Optional object storage client for object storage type.
57
+
58
+ Returns:
59
+ BaseStorageProvider: The created storage provider instance.
60
+ """
61
+ config = StorageConfig.from_env()
62
+ return StorageProviderFactory.create(config, object_storage_client)
@@ -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"]
@@ -1,20 +1,29 @@
1
- import abc
2
- from _typeshed import Incomplete
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
+
3
8
  from abc import ABC, abstractmethod
4
- from aip_agents.utils.logger_manager import LoggerManager as LoggerManager
5
9
  from typing import Any
6
10
 
7
- logger: Incomplete
11
+ from aip_agents.utils.logger import get_logger
12
+
13
+ logger = get_logger(__name__)
14
+
8
15
 
9
16
  class StorageError(Exception):
10
17
  """Base exception for storage operations."""
11
18
 
12
- class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
19
+
20
+ class BaseStorageProvider(ABC):
13
21
  """Base interface for storage providers.
14
22
 
15
23
  This abstract class defines the contract that all storage providers
16
24
  must implement to store and retrieve tool outputs.
17
25
  """
26
+
18
27
  @abstractmethod
19
28
  def store(self, key: str, data: Any) -> None:
20
29
  """Store data with the given key.
@@ -26,6 +35,7 @@ class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
26
35
  Raises:
27
36
  StorageError: If storage operation fails
28
37
  """
38
+
29
39
  @abstractmethod
30
40
  def retrieve(self, key: str) -> Any:
31
41
  """Retrieve data by key.
@@ -40,6 +50,7 @@ class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
40
50
  KeyError: If key not found
41
51
  StorageError: If retrieval operation fails
42
52
  """
53
+
43
54
  @abstractmethod
44
55
  def exists(self, key: str) -> bool:
45
56
  """Check if key exists.
@@ -50,6 +61,7 @@ class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
50
61
  Returns:
51
62
  True if key exists, False otherwise
52
63
  """
64
+
53
65
  @abstractmethod
54
66
  def delete(self, key: str) -> None:
55
67
  """Delete data by key.
@@ -60,8 +72,9 @@ class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
60
72
  Note:
61
73
  Should not raise error if key doesn't exist
62
74
  """
75
+
63
76
  @abstractmethod
64
- def list_keys(self, prefix: str = '') -> list[str]:
77
+ def list_keys(self, prefix: str = "") -> list[str]:
65
78
  """List all keys with optional prefix filter.
66
79
 
67
80
  Args:
@@ -70,6 +83,7 @@ class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
70
83
  Returns:
71
84
  List of matching keys
72
85
  """
86
+
73
87
  @abstractmethod
74
88
  def clear(self) -> None:
75
89
  """Clear all stored data.
@@ -77,6 +91,7 @@ class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
77
91
  Warning:
78
92
  This operation is irreversible
79
93
  """
94
+
80
95
  def get_presigned_url(self, key: str, expires_hours: int = 24) -> str | None:
81
96
  """Generate presigned URL for direct access (optional).
82
97
 
@@ -87,3 +102,5 @@ class BaseStorageProvider(ABC, metaclass=abc.ABCMeta):
87
102
  Returns:
88
103
  Presigned URL if supported, None otherwise
89
104
  """
105
+ logger.warning("This class get_presigned_url not implemented for this storage provider")
106
+ return None
@@ -1,6 +1,16 @@
1
- from aip_agents.storage.providers.base import BaseStorageProvider as BaseStorageProvider, StorageError as StorageError
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
2
9
  from typing import Any
3
10
 
11
+ from aip_agents.storage.providers.base import BaseStorageProvider, StorageError
12
+
13
+
4
14
  class InMemoryStorageProvider(BaseStorageProvider):
5
15
  """In-memory storage provider for fast access to small data.
6
16
 
@@ -13,8 +23,11 @@ class InMemoryStorageProvider(BaseStorageProvider):
13
23
  - Development and testing
14
24
  - High-frequency access patterns
15
25
  """
16
- def __init__(self) -> None:
26
+
27
+ def __init__(self):
17
28
  """Initialize in-memory storage."""
29
+ self._storage: dict[str, Any] = {}
30
+
18
31
  def store(self, key: str, data: Any) -> None:
19
32
  """Store data in memory.
20
33
 
@@ -25,6 +38,11 @@ class InMemoryStorageProvider(BaseStorageProvider):
25
38
  Raises:
26
39
  StorageError: If storage operation fails
27
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
+
28
46
  def retrieve(self, key: str) -> Any:
29
47
  """Retrieve data from memory.
30
48
 
@@ -37,6 +55,10 @@ class InMemoryStorageProvider(BaseStorageProvider):
37
55
  Raises:
38
56
  KeyError: If key not found
39
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
+
40
62
  def exists(self, key: str) -> bool:
41
63
  """Check if key exists in memory.
42
64
 
@@ -46,13 +68,17 @@ class InMemoryStorageProvider(BaseStorageProvider):
46
68
  Returns:
47
69
  True if key exists, False otherwise
48
70
  """
71
+ return key in self._storage
72
+
49
73
  def delete(self, key: str) -> None:
50
74
  """Delete data from memory.
51
75
 
52
76
  Args:
53
77
  key: Unique identifier for the data
54
78
  """
55
- def list_keys(self, prefix: str = '') -> list[str]:
79
+ self._storage.pop(key, None)
80
+
81
+ def list_keys(self, prefix: str = "") -> list[str]:
56
82
  """List all keys with optional prefix.
57
83
 
58
84
  Args:
@@ -61,8 +87,14 @@ class InMemoryStorageProvider(BaseStorageProvider):
61
87
  Returns:
62
88
  List of matching keys
63
89
  """
90
+ if prefix:
91
+ return [k for k in self._storage.keys() if k.startswith(prefix)]
92
+ return list(self._storage.keys())
93
+
64
94
  def clear(self) -> None:
65
95
  """Clear all data from memory."""
96
+ self._storage.clear()
97
+
66
98
  @property
67
99
  def size_bytes(self) -> int:
68
100
  """Get approximate memory usage in bytes.
@@ -70,6 +102,8 @@ class InMemoryStorageProvider(BaseStorageProvider):
70
102
  Returns:
71
103
  Approximate memory usage in bytes
72
104
  """
105
+ return sum(sys.getsizeof(v) for v in self._storage.values())
106
+
73
107
  @property
74
108
  def count(self) -> int:
75
109
  """Get number of stored items.
@@ -77,3 +111,4 @@ class InMemoryStorageProvider(BaseStorageProvider):
77
111
  Returns:
78
112
  Number of items in storage
79
113
  """
114
+ return len(self._storage)