aip-agents-binary 0.5.25b1__py3-none-macosx_13_0_arm64.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 (566) 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 +3 -0
  5. aip_agents/a2a/server/__init__.py +10 -0
  6. aip_agents/a2a/server/__init__.pyi +4 -0
  7. aip_agents/a2a/server/base_executor.py +1086 -0
  8. aip_agents/a2a/server/base_executor.pyi +73 -0
  9. aip_agents/a2a/server/google_adk_executor.py +198 -0
  10. aip_agents/a2a/server/google_adk_executor.pyi +51 -0
  11. aip_agents/a2a/server/langflow_executor.py +180 -0
  12. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  13. aip_agents/a2a/server/langgraph_executor.py +270 -0
  14. aip_agents/a2a/server/langgraph_executor.pyi +47 -0
  15. aip_agents/a2a/types.py +232 -0
  16. aip_agents/a2a/types.pyi +132 -0
  17. aip_agents/agent/__init__.py +27 -0
  18. aip_agents/agent/__init__.pyi +9 -0
  19. aip_agents/agent/base_agent.py +970 -0
  20. aip_agents/agent/base_agent.pyi +221 -0
  21. aip_agents/agent/base_langgraph_agent.py +2948 -0
  22. aip_agents/agent/base_langgraph_agent.pyi +232 -0
  23. aip_agents/agent/google_adk_agent.py +926 -0
  24. aip_agents/agent/google_adk_agent.pyi +141 -0
  25. aip_agents/agent/google_adk_constants.py +6 -0
  26. aip_agents/agent/google_adk_constants.pyi +3 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/__init__.pyi +6 -0
  29. aip_agents/agent/hitl/config.py +28 -0
  30. aip_agents/agent/hitl/config.pyi +15 -0
  31. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  32. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  33. aip_agents/agent/hitl/manager.py +532 -0
  34. aip_agents/agent/hitl/manager.pyi +200 -0
  35. aip_agents/agent/hitl/models.py +18 -0
  36. aip_agents/agent/hitl/models.pyi +3 -0
  37. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  38. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  39. aip_agents/agent/hitl/prompt/base.py +42 -0
  40. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  41. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  42. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  43. aip_agents/agent/hitl/registry.py +149 -0
  44. aip_agents/agent/hitl/registry.pyi +101 -0
  45. aip_agents/agent/interface.py +138 -0
  46. aip_agents/agent/interface.pyi +81 -0
  47. aip_agents/agent/interfaces.py +65 -0
  48. aip_agents/agent/interfaces.pyi +44 -0
  49. aip_agents/agent/langflow_agent.py +464 -0
  50. aip_agents/agent/langflow_agent.pyi +133 -0
  51. aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
  52. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
  53. aip_agents/agent/langgraph_react_agent.py +2596 -0
  54. aip_agents/agent/langgraph_react_agent.pyi +131 -0
  55. aip_agents/agent/system_instruction_context.py +34 -0
  56. aip_agents/agent/system_instruction_context.pyi +13 -0
  57. aip_agents/clients/__init__.py +10 -0
  58. aip_agents/clients/__init__.pyi +4 -0
  59. aip_agents/clients/langflow/__init__.py +10 -0
  60. aip_agents/clients/langflow/__init__.pyi +4 -0
  61. aip_agents/clients/langflow/client.py +477 -0
  62. aip_agents/clients/langflow/client.pyi +140 -0
  63. aip_agents/clients/langflow/types.py +18 -0
  64. aip_agents/clients/langflow/types.pyi +7 -0
  65. aip_agents/constants.py +23 -0
  66. aip_agents/constants.pyi +7 -0
  67. aip_agents/credentials/manager.py +132 -0
  68. aip_agents/examples/__init__.py +5 -0
  69. aip_agents/examples/__init__.pyi +0 -0
  70. aip_agents/examples/compare_streaming_client.py +783 -0
  71. aip_agents/examples/compare_streaming_client.pyi +48 -0
  72. aip_agents/examples/compare_streaming_server.py +142 -0
  73. aip_agents/examples/compare_streaming_server.pyi +18 -0
  74. aip_agents/examples/demo_memory_recall.py +401 -0
  75. aip_agents/examples/demo_memory_recall.pyi +58 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
  78. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
  80. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  81. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
  82. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  83. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
  84. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
  86. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
  88. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  89. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
  90. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  91. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
  92. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  93. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
  94. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  95. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
  96. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  97. aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
  98. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  99. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
  100. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  101. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  102. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  103. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
  106. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
  108. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
  110. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
  112. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
  114. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
  118. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
  120. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
  122. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
  124. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  125. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
  126. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  127. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
  128. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  129. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
  130. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  131. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
  132. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  133. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
  134. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  135. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
  136. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  137. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
  138. aip_agents/examples/hello_world_google_adk.py +41 -0
  139. aip_agents/examples/hello_world_google_adk.pyi +5 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  141. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
  142. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  143. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
  144. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  145. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
  146. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  147. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
  148. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  149. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
  150. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  151. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
  152. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  153. aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
  154. aip_agents/examples/hello_world_langchain.py +28 -0
  155. aip_agents/examples/hello_world_langchain.pyi +5 -0
  156. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  157. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
  158. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  159. aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
  160. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  161. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  162. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  163. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
  164. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  165. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  166. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  167. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
  168. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  169. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
  170. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  171. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
  172. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  173. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
  174. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  175. aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
  176. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  177. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
  178. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  179. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  180. aip_agents/examples/hello_world_langgraph.py +39 -0
  181. aip_agents/examples/hello_world_langgraph.pyi +5 -0
  182. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  183. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
  184. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  185. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
  186. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  187. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
  188. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  189. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
  190. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  191. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
  192. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  193. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
  194. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  195. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
  196. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  197. aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
  198. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  199. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
  200. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  201. aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
  202. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  203. aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
  204. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  205. aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
  206. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  207. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
  208. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  209. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
  210. aip_agents/examples/hello_world_pii_logger.py +21 -0
  211. aip_agents/examples/hello_world_pii_logger.pyi +5 -0
  212. aip_agents/examples/hello_world_sentry.py +133 -0
  213. aip_agents/examples/hello_world_sentry.pyi +21 -0
  214. aip_agents/examples/hello_world_step_limits.py +273 -0
  215. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  216. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  217. aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
  218. aip_agents/examples/hello_world_tool_output_client.py +46 -0
  219. aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
  220. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  221. aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
  222. aip_agents/examples/hitl_demo.py +724 -0
  223. aip_agents/examples/hitl_demo.pyi +67 -0
  224. aip_agents/examples/mcp_configs/configs.py +63 -0
  225. aip_agents/examples/mcp_servers/common.py +76 -0
  226. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  227. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  228. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  229. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  230. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  231. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  232. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  233. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  234. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  235. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  236. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  237. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  238. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  239. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  240. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  241. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  242. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  243. aip_agents/examples/tools/__init__.py +27 -0
  244. aip_agents/examples/tools/__init__.pyi +9 -0
  245. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  246. aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
  247. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  248. aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
  249. aip_agents/examples/tools/data_generator_tool.py +103 -0
  250. aip_agents/examples/tools/data_generator_tool.pyi +15 -0
  251. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  252. aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
  253. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  254. aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
  255. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  256. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
  257. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  258. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
  259. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  260. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
  261. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  262. aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
  263. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  264. aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
  265. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  266. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  267. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  268. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  269. aip_agents/examples/tools/random_chart_tool.py +142 -0
  270. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  271. aip_agents/examples/tools/serper_tool.py +202 -0
  272. aip_agents/examples/tools/serper_tool.pyi +16 -0
  273. aip_agents/examples/tools/stock_tools.py +82 -0
  274. aip_agents/examples/tools/stock_tools.pyi +36 -0
  275. aip_agents/examples/tools/table_generator_tool.py +167 -0
  276. aip_agents/examples/tools/table_generator_tool.pyi +22 -0
  277. aip_agents/examples/tools/time_tool.py +82 -0
  278. aip_agents/examples/tools/time_tool.pyi +15 -0
  279. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  280. aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
  281. aip_agents/executor/agent_executor.py +473 -0
  282. aip_agents/executor/base.py +48 -0
  283. aip_agents/guardrails/__init__.py +83 -0
  284. aip_agents/guardrails/__init__.pyi +6 -0
  285. aip_agents/guardrails/engines/__init__.py +69 -0
  286. aip_agents/guardrails/engines/__init__.pyi +4 -0
  287. aip_agents/guardrails/engines/base.py +90 -0
  288. aip_agents/guardrails/engines/base.pyi +61 -0
  289. aip_agents/guardrails/engines/nemo.py +101 -0
  290. aip_agents/guardrails/engines/nemo.pyi +46 -0
  291. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  292. aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
  293. aip_agents/guardrails/exceptions.py +39 -0
  294. aip_agents/guardrails/exceptions.pyi +23 -0
  295. aip_agents/guardrails/manager.py +163 -0
  296. aip_agents/guardrails/manager.pyi +42 -0
  297. aip_agents/guardrails/middleware.py +199 -0
  298. aip_agents/guardrails/middleware.pyi +87 -0
  299. aip_agents/guardrails/schemas.py +63 -0
  300. aip_agents/guardrails/schemas.pyi +43 -0
  301. aip_agents/guardrails/utils.py +45 -0
  302. aip_agents/guardrails/utils.pyi +19 -0
  303. aip_agents/mcp/__init__.py +1 -0
  304. aip_agents/mcp/__init__.pyi +0 -0
  305. aip_agents/mcp/client/__init__.py +14 -0
  306. aip_agents/mcp/client/__init__.pyi +5 -0
  307. aip_agents/mcp/client/base_mcp_client.py +369 -0
  308. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  309. aip_agents/mcp/client/connection_manager.py +193 -0
  310. aip_agents/mcp/client/connection_manager.pyi +48 -0
  311. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  312. aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
  313. aip_agents/mcp/client/google_adk/client.py +381 -0
  314. aip_agents/mcp/client/google_adk/client.pyi +75 -0
  315. aip_agents/mcp/client/langchain/__init__.py +11 -0
  316. aip_agents/mcp/client/langchain/__init__.pyi +3 -0
  317. aip_agents/mcp/client/langchain/client.py +265 -0
  318. aip_agents/mcp/client/langchain/client.pyi +48 -0
  319. aip_agents/mcp/client/persistent_session.py +362 -0
  320. aip_agents/mcp/client/persistent_session.pyi +113 -0
  321. aip_agents/mcp/client/session_pool.py +351 -0
  322. aip_agents/mcp/client/session_pool.pyi +101 -0
  323. aip_agents/mcp/client/transports.py +228 -0
  324. aip_agents/mcp/client/transports.pyi +123 -0
  325. aip_agents/mcp/utils/__init__.py +7 -0
  326. aip_agents/mcp/utils/__init__.pyi +0 -0
  327. aip_agents/mcp/utils/config_validator.py +139 -0
  328. aip_agents/mcp/utils/config_validator.pyi +82 -0
  329. aip_agents/memory/__init__.py +14 -0
  330. aip_agents/memory/__init__.pyi +5 -0
  331. aip_agents/memory/adapters/__init__.py +10 -0
  332. aip_agents/memory/adapters/__init__.pyi +4 -0
  333. aip_agents/memory/adapters/base_adapter.py +717 -0
  334. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  335. aip_agents/memory/adapters/mem0.py +84 -0
  336. aip_agents/memory/adapters/mem0.pyi +22 -0
  337. aip_agents/memory/base.py +84 -0
  338. aip_agents/memory/base.pyi +60 -0
  339. aip_agents/memory/constants.py +49 -0
  340. aip_agents/memory/constants.pyi +25 -0
  341. aip_agents/memory/factory.py +86 -0
  342. aip_agents/memory/factory.pyi +24 -0
  343. aip_agents/memory/guidance.py +20 -0
  344. aip_agents/memory/guidance.pyi +3 -0
  345. aip_agents/memory/simple_memory.py +47 -0
  346. aip_agents/memory/simple_memory.pyi +23 -0
  347. aip_agents/middleware/__init__.py +17 -0
  348. aip_agents/middleware/__init__.pyi +5 -0
  349. aip_agents/middleware/base.py +96 -0
  350. aip_agents/middleware/base.pyi +75 -0
  351. aip_agents/middleware/manager.py +150 -0
  352. aip_agents/middleware/manager.pyi +84 -0
  353. aip_agents/middleware/todolist.py +274 -0
  354. aip_agents/middleware/todolist.pyi +125 -0
  355. aip_agents/schema/__init__.py +69 -0
  356. aip_agents/schema/__init__.pyi +9 -0
  357. aip_agents/schema/a2a.py +56 -0
  358. aip_agents/schema/a2a.pyi +40 -0
  359. aip_agents/schema/agent.py +111 -0
  360. aip_agents/schema/agent.pyi +65 -0
  361. aip_agents/schema/hitl.py +157 -0
  362. aip_agents/schema/hitl.pyi +89 -0
  363. aip_agents/schema/langgraph.py +37 -0
  364. aip_agents/schema/langgraph.pyi +28 -0
  365. aip_agents/schema/model_id.py +97 -0
  366. aip_agents/schema/model_id.pyi +54 -0
  367. aip_agents/schema/step_limit.py +108 -0
  368. aip_agents/schema/step_limit.pyi +63 -0
  369. aip_agents/schema/storage.py +40 -0
  370. aip_agents/schema/storage.pyi +21 -0
  371. aip_agents/sentry/__init__.py +11 -0
  372. aip_agents/sentry/__init__.pyi +3 -0
  373. aip_agents/sentry/sentry.py +151 -0
  374. aip_agents/sentry/sentry.pyi +48 -0
  375. aip_agents/storage/__init__.py +41 -0
  376. aip_agents/storage/__init__.pyi +8 -0
  377. aip_agents/storage/base.py +85 -0
  378. aip_agents/storage/base.pyi +58 -0
  379. aip_agents/storage/clients/__init__.py +12 -0
  380. aip_agents/storage/clients/__init__.pyi +3 -0
  381. aip_agents/storage/clients/minio_client.py +318 -0
  382. aip_agents/storage/clients/minio_client.pyi +137 -0
  383. aip_agents/storage/config.py +62 -0
  384. aip_agents/storage/config.pyi +29 -0
  385. aip_agents/storage/providers/__init__.py +15 -0
  386. aip_agents/storage/providers/__init__.pyi +5 -0
  387. aip_agents/storage/providers/base.py +106 -0
  388. aip_agents/storage/providers/base.pyi +88 -0
  389. aip_agents/storage/providers/memory.py +114 -0
  390. aip_agents/storage/providers/memory.pyi +79 -0
  391. aip_agents/storage/providers/object_storage.py +214 -0
  392. aip_agents/storage/providers/object_storage.pyi +98 -0
  393. aip_agents/tools/__init__.py +53 -0
  394. aip_agents/tools/__init__.pyi +9 -0
  395. aip_agents/tools/browser_use/__init__.py +82 -0
  396. aip_agents/tools/browser_use/__init__.pyi +14 -0
  397. aip_agents/tools/browser_use/action_parser.py +103 -0
  398. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  399. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  400. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  401. aip_agents/tools/browser_use/llm_config.py +120 -0
  402. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  403. aip_agents/tools/browser_use/minio_storage.py +198 -0
  404. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  405. aip_agents/tools/browser_use/schemas.py +119 -0
  406. aip_agents/tools/browser_use/schemas.pyi +32 -0
  407. aip_agents/tools/browser_use/session.py +76 -0
  408. aip_agents/tools/browser_use/session.pyi +4 -0
  409. aip_agents/tools/browser_use/session_errors.py +132 -0
  410. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  411. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  412. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  413. aip_agents/tools/browser_use/streaming.py +813 -0
  414. aip_agents/tools/browser_use/streaming.pyi +81 -0
  415. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  416. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  417. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  418. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  419. aip_agents/tools/browser_use/types.py +78 -0
  420. aip_agents/tools/browser_use/types.pyi +45 -0
  421. aip_agents/tools/code_sandbox/__init__.py +26 -0
  422. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  423. aip_agents/tools/code_sandbox/constant.py +13 -0
  424. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  425. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
  426. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
  427. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  428. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  429. aip_agents/tools/constants.py +177 -0
  430. aip_agents/tools/constants.pyi +138 -0
  431. aip_agents/tools/document_loader/__init__.py +44 -0
  432. aip_agents/tools/document_loader/__init__.pyi +7 -0
  433. aip_agents/tools/document_loader/base_reader.py +302 -0
  434. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  435. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  436. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  437. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  438. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  439. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  440. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  441. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  442. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  443. aip_agents/tools/gl_connector/__init__.py +5 -0
  444. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  445. aip_agents/tools/gl_connector/tool.py +383 -0
  446. aip_agents/tools/gl_connector/tool.pyi +74 -0
  447. aip_agents/tools/gl_connector_tools.py +119 -0
  448. aip_agents/tools/gl_connector_tools.pyi +39 -0
  449. aip_agents/tools/memory_search/__init__.py +22 -0
  450. aip_agents/tools/memory_search/__init__.pyi +5 -0
  451. aip_agents/tools/memory_search/base.py +200 -0
  452. aip_agents/tools/memory_search/base.pyi +69 -0
  453. aip_agents/tools/memory_search/mem0.py +258 -0
  454. aip_agents/tools/memory_search/mem0.pyi +19 -0
  455. aip_agents/tools/memory_search/schema.py +48 -0
  456. aip_agents/tools/memory_search/schema.pyi +15 -0
  457. aip_agents/tools/memory_search_tool.py +26 -0
  458. aip_agents/tools/memory_search_tool.pyi +3 -0
  459. aip_agents/tools/time_tool.py +117 -0
  460. aip_agents/tools/time_tool.pyi +16 -0
  461. aip_agents/tools/tool_config_injector.py +300 -0
  462. aip_agents/tools/tool_config_injector.pyi +26 -0
  463. aip_agents/tools/web_search/__init__.py +15 -0
  464. aip_agents/tools/web_search/__init__.pyi +3 -0
  465. aip_agents/tools/web_search/serper_tool.py +187 -0
  466. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  467. aip_agents/types/__init__.py +70 -0
  468. aip_agents/types/__init__.pyi +36 -0
  469. aip_agents/types/a2a_events.py +13 -0
  470. aip_agents/types/a2a_events.pyi +3 -0
  471. aip_agents/utils/__init__.py +79 -0
  472. aip_agents/utils/__init__.pyi +11 -0
  473. aip_agents/utils/a2a_connector.py +1757 -0
  474. aip_agents/utils/a2a_connector.pyi +146 -0
  475. aip_agents/utils/artifact_helpers.py +502 -0
  476. aip_agents/utils/artifact_helpers.pyi +203 -0
  477. aip_agents/utils/constants.py +22 -0
  478. aip_agents/utils/constants.pyi +10 -0
  479. aip_agents/utils/datetime/__init__.py +34 -0
  480. aip_agents/utils/datetime/__init__.pyi +4 -0
  481. aip_agents/utils/datetime/normalization.py +231 -0
  482. aip_agents/utils/datetime/normalization.pyi +95 -0
  483. aip_agents/utils/datetime/timezone.py +206 -0
  484. aip_agents/utils/datetime/timezone.pyi +48 -0
  485. aip_agents/utils/env_loader.py +27 -0
  486. aip_agents/utils/env_loader.pyi +10 -0
  487. aip_agents/utils/event_handler_registry.py +58 -0
  488. aip_agents/utils/event_handler_registry.pyi +23 -0
  489. aip_agents/utils/file_prompt_utils.py +176 -0
  490. aip_agents/utils/file_prompt_utils.pyi +21 -0
  491. aip_agents/utils/final_response_builder.py +211 -0
  492. aip_agents/utils/final_response_builder.pyi +34 -0
  493. aip_agents/utils/formatter_llm_client.py +231 -0
  494. aip_agents/utils/formatter_llm_client.pyi +71 -0
  495. aip_agents/utils/langgraph/__init__.py +19 -0
  496. aip_agents/utils/langgraph/__init__.pyi +3 -0
  497. aip_agents/utils/langgraph/converter.py +128 -0
  498. aip_agents/utils/langgraph/converter.pyi +49 -0
  499. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  500. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  501. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  502. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  503. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  504. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  505. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  506. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  507. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  508. aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
  509. aip_agents/utils/logger.py +195 -0
  510. aip_agents/utils/logger.pyi +60 -0
  511. aip_agents/utils/metadata/__init__.py +27 -0
  512. aip_agents/utils/metadata/__init__.pyi +5 -0
  513. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  514. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  515. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  516. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  517. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  518. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  519. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  520. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  521. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  522. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  523. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  524. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  525. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  526. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  527. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  528. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  529. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  530. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  531. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  532. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  533. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  534. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  535. aip_agents/utils/metadata_helper.py +358 -0
  536. aip_agents/utils/metadata_helper.pyi +117 -0
  537. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  538. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  539. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  540. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  541. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  542. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  543. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  544. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  545. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  546. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  547. aip_agents/utils/pii/__init__.py +25 -0
  548. aip_agents/utils/pii/__init__.pyi +5 -0
  549. aip_agents/utils/pii/pii_handler.py +397 -0
  550. aip_agents/utils/pii/pii_handler.pyi +96 -0
  551. aip_agents/utils/pii/pii_helper.py +207 -0
  552. aip_agents/utils/pii/pii_helper.pyi +78 -0
  553. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  554. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  555. aip_agents/utils/reference_helper.py +273 -0
  556. aip_agents/utils/reference_helper.pyi +81 -0
  557. aip_agents/utils/sse_chunk_transformer.py +831 -0
  558. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  559. aip_agents/utils/step_limit_manager.py +265 -0
  560. aip_agents/utils/step_limit_manager.pyi +112 -0
  561. aip_agents/utils/token_usage_helper.py +156 -0
  562. aip_agents/utils/token_usage_helper.pyi +60 -0
  563. aip_agents_binary-0.5.25b1.dist-info/METADATA +681 -0
  564. aip_agents_binary-0.5.25b1.dist-info/RECORD +566 -0
  565. aip_agents_binary-0.5.25b1.dist-info/WHEEL +5 -0
  566. aip_agents_binary-0.5.25b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,200 @@
1
+ """Abstract base class for long-term memory search tools.
2
+
3
+ Authors:
4
+ Raymond Christopher (raymond.christopher@gdplabs.id)
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import asyncio
10
+ from abc import ABC, abstractmethod
11
+ from collections.abc import Callable
12
+ from typing import Any, ClassVar, Protocol, runtime_checkable
13
+
14
+ from langchain_core.runnables import RunnableConfig
15
+ from langchain_core.tools import BaseTool
16
+ from pydantic import BaseModel
17
+
18
+ from aip_agents.memory.constants import MemoryDefaults
19
+ from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput, MemoryConfig
20
+ from aip_agents.utils.logger import get_logger
21
+
22
+ logger = get_logger(__name__)
23
+
24
+
25
+ @runtime_checkable
26
+ class LongTermMemoryBackend(Protocol):
27
+ """Protocol for memory adapters that support retrieval and formatting."""
28
+
29
+ def retrieve(
30
+ self,
31
+ *,
32
+ query: str | None,
33
+ user_id: str,
34
+ limit: int | None = None,
35
+ filters: dict[str, Any] | None = None,
36
+ page: int | None = None,
37
+ ) -> list[dict[str, Any]]:
38
+ """Retrieve memories matching the given query and filters.
39
+
40
+ Args:
41
+ query: Optional search query string.
42
+ user_id: User identifier for scoped retrieval.
43
+ limit: Maximum number of results to return.
44
+ filters: Optional filters to apply to the retrieval.
45
+ page: Page number for pagination.
46
+
47
+ Returns:
48
+ List of memory hit dictionaries.
49
+ """
50
+ ...
51
+
52
+ def format_hits(
53
+ self,
54
+ hits: list[dict[str, Any]],
55
+ max_items: int = MemoryDefaults.MAX_ITEMS,
56
+ with_tag: bool = True,
57
+ ) -> str:
58
+ """Format memory hits into a readable string.
59
+
60
+ Args:
61
+ hits: List of memory hit dictionaries to format.
62
+ max_items: Maximum number of hits to include in output.
63
+ with_tag: Whether to wrap output with memory tags.
64
+
65
+ Returns:
66
+ Formatted string representation of memory hits.
67
+ """
68
+ ...
69
+
70
+
71
+ class LongTermMemorySearchTool(BaseTool, ABC):
72
+ """Abstract base class for provider-specific long-term memory search tools."""
73
+
74
+ name: str = "long_term_memory_search"
75
+ description: str = "Abstract interface for tools that retrieve long-term memories."
76
+ args_schema: type[LongTermMemorySearchInput] = LongTermMemorySearchInput
77
+ tool_config_schema: type[BaseModel] = MemoryConfig
78
+ memory: LongTermMemoryBackend
79
+ default_user_id: str | None = None
80
+ user_id_provider: Callable[[], str | None] | None = None
81
+ MINIMUM_MEMORY_RETRIEVAL: ClassVar[int] = 5
82
+ LOG_PREFIX: ClassVar[str] = "LongTermMemorySearchTool"
83
+
84
+ def __init__(
85
+ self,
86
+ memory: LongTermMemoryBackend,
87
+ *,
88
+ default_user_id: str | None = None,
89
+ user_id_provider: Callable[[], str | None] | None = None,
90
+ **kwargs: Any,
91
+ ) -> None:
92
+ """Initialize the long-term memory search tool.
93
+
94
+ Args:
95
+ memory: Memory adapter instance with retrieve() and format_hits() methods.
96
+ default_user_id: Default user ID to use if not provided in metadata.
97
+ user_id_provider: Callable that returns a user ID.
98
+ **kwargs: Additional keyword arguments passed to the parent class.
99
+ """
100
+ required_attributes = {"retrieve", "format_hits"}
101
+ if not all(hasattr(memory, attr) for attr in required_attributes):
102
+ raise ValueError(
103
+ "LongTermMemorySearchTool requires a memory instance that implements retrieve() and format_hits()."
104
+ )
105
+
106
+ super().__init__(
107
+ memory=memory,
108
+ default_user_id=default_user_id,
109
+ user_id_provider=user_id_provider,
110
+ **kwargs,
111
+ )
112
+
113
+ @abstractmethod
114
+ async def _arun(
115
+ self,
116
+ query: str | None = None,
117
+ config: RunnableConfig | None = None,
118
+ run_manager: Any | None = None,
119
+ **kwargs: Any,
120
+ ) -> str:
121
+ """Execute provider-specific retrieval logic.
122
+
123
+ Args:
124
+ query: Optional search query string.
125
+ config: Runnable configuration for the execution.
126
+ run_manager: Optional run manager for execution tracking.
127
+ **kwargs: Additional keyword arguments.
128
+
129
+ Returns:
130
+ Formatted string of retrieved memories.
131
+ """
132
+
133
+ def _run(
134
+ self,
135
+ query: str | None = None,
136
+ config: RunnableConfig | None = None,
137
+ run_manager: Any | None = None,
138
+ **kwargs: Any,
139
+ ) -> str:
140
+ """Synchronous wrapper that delegates to `_arun` using `asyncio.run`.
141
+
142
+ Args:
143
+ query: Optional search query string.
144
+ config: Runnable configuration for the execution.
145
+ run_manager: Optional run manager for execution tracking.
146
+ **kwargs: Additional keyword arguments.
147
+
148
+ Returns:
149
+ Formatted string of retrieved memories.
150
+ """
151
+ return asyncio.run(self._arun(query=query, config=config, run_manager=run_manager, **kwargs))
152
+
153
+ def _resolve_user_id(self, metadata: dict[str, Any] | None, config: RunnableConfig | None = None) -> str:
154
+ """Resolve the user ID for memory operations in a provider-agnostic way.
155
+
156
+ Args:
157
+ metadata: Optional metadata dictionary that may contain user_id.
158
+ config: Optional runnable configuration for tool context.
159
+
160
+ Returns:
161
+ The resolved user ID string.
162
+ """
163
+ user_id: str | None = None
164
+
165
+ if isinstance(metadata, dict):
166
+ user_id = metadata.get("user_id")
167
+
168
+ if not user_id and config and hasattr(self, "get_tool_config"):
169
+ logger.info("%s: Resolving user_id from RunnableConfig", self.LOG_PREFIX)
170
+ try:
171
+ tool_config = self.get_tool_config(config) # injected by tool_config_injector
172
+ logger.info("%s: Injected tool_config: %s", self.LOG_PREFIX, tool_config)
173
+ if tool_config and hasattr(tool_config, "user_id"):
174
+ user_id = tool_config.user_id
175
+ logger.info("%s: Using user_id from tool config: %s", self.LOG_PREFIX, user_id)
176
+ except Exception as exc: # noqa: BLE001
177
+ logger.warning("%s: get_tool_config failed: %s", self.LOG_PREFIX, exc)
178
+
179
+ if not user_id and self.user_id_provider:
180
+ try:
181
+ user_id = self.user_id_provider()
182
+ logger.info("%s: Using user_id from provider: %s", self.LOG_PREFIX, user_id)
183
+ except Exception as exc: # noqa: BLE001
184
+ logger.warning("%s: user_id_provider failed: %s", self.LOG_PREFIX, exc)
185
+
186
+ resolved_user_id = user_id or self.default_user_id or MemoryDefaults.DEFAULT_USER_ID
187
+ logger.info("%s: Resolved user_id: %s", self.LOG_PREFIX, resolved_user_id)
188
+ return resolved_user_id
189
+
190
+ def format_hits(self, hits: list[dict[str, Any]], with_tag: bool = False) -> str:
191
+ """Format hits into a string with optional tags.
192
+
193
+ Args:
194
+ hits: List of memory hit dictionaries to format.
195
+ with_tag: Whether to wrap the output with memory tags.
196
+
197
+ Returns:
198
+ Formatted string representation of the memory hits.
199
+ """
200
+ return self.memory.format_hits(hits, max_items=len(hits), with_tag=with_tag)
@@ -0,0 +1,69 @@
1
+ from _typeshed import Incomplete
2
+ from abc import ABC
3
+ from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
4
+ from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput, MemoryConfig as MemoryConfig
5
+ from aip_agents.utils.logger import get_logger as get_logger
6
+ from collections.abc import Callable
7
+ from langchain_core.tools import BaseTool
8
+ from pydantic import BaseModel as BaseModel
9
+ from typing import Any, ClassVar, Protocol
10
+
11
+ logger: Incomplete
12
+
13
+ class LongTermMemoryBackend(Protocol):
14
+ """Protocol for memory adapters that support retrieval and formatting."""
15
+ def retrieve(self, *, query: str | None, user_id: str, limit: int | None = None, filters: dict[str, Any] | None = None, page: int | None = None) -> list[dict[str, Any]]:
16
+ """Retrieve memories matching the given query and filters.
17
+
18
+ Args:
19
+ query: Optional search query string.
20
+ user_id: User identifier for scoped retrieval.
21
+ limit: Maximum number of results to return.
22
+ filters: Optional filters to apply to the retrieval.
23
+ page: Page number for pagination.
24
+
25
+ Returns:
26
+ List of memory hit dictionaries.
27
+ """
28
+ def format_hits(self, hits: list[dict[str, Any]], max_items: int = ..., with_tag: bool = True) -> str:
29
+ """Format memory hits into a readable string.
30
+
31
+ Args:
32
+ hits: List of memory hit dictionaries to format.
33
+ max_items: Maximum number of hits to include in output.
34
+ with_tag: Whether to wrap output with memory tags.
35
+
36
+ Returns:
37
+ Formatted string representation of memory hits.
38
+ """
39
+
40
+ class LongTermMemorySearchTool(BaseTool, ABC):
41
+ """Abstract base class for provider-specific long-term memory search tools."""
42
+ name: str
43
+ description: str
44
+ args_schema: type[LongTermMemorySearchInput]
45
+ tool_config_schema: type[BaseModel]
46
+ memory: LongTermMemoryBackend
47
+ default_user_id: str | None
48
+ user_id_provider: Callable[[], str | None] | None
49
+ MINIMUM_MEMORY_RETRIEVAL: ClassVar[int]
50
+ LOG_PREFIX: ClassVar[str]
51
+ def __init__(self, memory: LongTermMemoryBackend, *, default_user_id: str | None = None, user_id_provider: Callable[[], str | None] | None = None, **kwargs: Any) -> None:
52
+ """Initialize the long-term memory search tool.
53
+
54
+ Args:
55
+ memory: Memory adapter instance with retrieve() and format_hits() methods.
56
+ default_user_id: Default user ID to use if not provided in metadata.
57
+ user_id_provider: Callable that returns a user ID.
58
+ **kwargs: Additional keyword arguments passed to the parent class.
59
+ """
60
+ def format_hits(self, hits: list[dict[str, Any]], with_tag: bool = False) -> str:
61
+ """Format hits into a string with optional tags.
62
+
63
+ Args:
64
+ hits: List of memory hit dictionaries to format.
65
+ with_tag: Whether to wrap the output with memory tags.
66
+
67
+ Returns:
68
+ Formatted string representation of the memory hits.
69
+ """
@@ -0,0 +1,258 @@
1
+ """Mem0-specific implementation of the long-term memory search tool.
2
+
3
+ Authors:
4
+ Raymond Christopher (raymond.christopher@gdplabs.id)
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ from typing import Any, ClassVar
11
+
12
+ from langchain_core.runnables import RunnableConfig
13
+
14
+ from aip_agents.memory.constants import MemoryDefaults
15
+ from aip_agents.tools.memory_search.base import LongTermMemorySearchTool
16
+ from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput
17
+ from aip_agents.utils.datetime import is_valid_date_string, next_day_iso
18
+ from aip_agents.utils.logger import get_logger
19
+
20
+ logger = get_logger(__name__)
21
+
22
+ MEMORY_SEARCH_TOOL_NAME = "built_in_mem0_search"
23
+
24
+
25
+ class Mem0SearchTool(LongTermMemorySearchTool):
26
+ """Mem0-specific implementation of the long-term memory search tool."""
27
+
28
+ name: str = MEMORY_SEARCH_TOOL_NAME
29
+ description: str = (
30
+ "Search or retrieve memories from long-term mem0 storage. Supports two modes:\n"
31
+ "1. SEMANTIC SEARCH: Provide 'query' to search for relevant memories by content\n"
32
+ "2. DATE-BASED RECALL: Omit 'query' to get all memories from an explicit date period\n\n"
33
+ "Time periods only support explicit dates ('start_date'/'end_date' in YYYY-MM-DD format).\n\n"
34
+ "Use for: names, preferences, past plans, conversations, or when user asks "
35
+ "'What did we discuss last week?' or 'Search for project notes'"
36
+ )
37
+ args_schema: type[LongTermMemorySearchInput] = LongTermMemorySearchInput
38
+ LOG_PREFIX: ClassVar[str] = "Mem0SearchTool"
39
+ METADATA_FILTER_BLOCKLIST: ClassVar[set[str]] = {"user_id", "memory_user_id"}
40
+
41
+ async def _arun(
42
+ self,
43
+ query: str | None = None,
44
+ config: RunnableConfig | None = None,
45
+ run_manager: Any | None = None,
46
+ **kwargs: Any,
47
+ ) -> str:
48
+ """Execute the memory search asynchronously for LangChain.
49
+
50
+ Args:
51
+ query: Semantic search query when provided.
52
+ config: Runnable configuration containing LangChain metadata.
53
+ run_manager: LangChain callbacks (unused).
54
+ **kwargs: Additional filters such as ``start_date``, ``end_date``, ``limit``, ``categories``, ``metadata``.
55
+
56
+ Returns:
57
+ str: JSON-encoded retrieval results or an error message.
58
+ """
59
+ logger.info("%s: Received config: %s", self.LOG_PREFIX, config)
60
+
61
+ start_date: str | None = kwargs.get("start_date")
62
+ end_date: str | None = kwargs.get("end_date")
63
+ limit: int | None = kwargs.get("limit")
64
+ categories: list[str] | None = kwargs.get("categories")
65
+ metadata: dict[str, Any] | None = kwargs.get("metadata")
66
+
67
+ user_id = self._resolve_user_id(metadata=metadata, config=config)
68
+
69
+ metadata_filter = None
70
+ if isinstance(metadata, dict):
71
+ metadata_filter = {k: v for k, v in metadata.items() if k not in self.METADATA_FILTER_BLOCKLIST} or None
72
+
73
+ date_filter_result = self._parse_date_filters(
74
+ start_date=start_date,
75
+ end_date=end_date,
76
+ user_id=user_id,
77
+ )
78
+
79
+ if "error" in date_filter_result:
80
+ return f"Error: {date_filter_result['error']}"
81
+
82
+ filters = self._add_additional_filters(
83
+ filters=date_filter_result["filters"],
84
+ categories=categories,
85
+ metadata=metadata_filter,
86
+ user_id=user_id,
87
+ )
88
+
89
+ time_spec = f"{start_date or 'unbounded'} to {end_date or 'unbounded'}"
90
+
91
+ raw_results = self._perform_retrieval(
92
+ query=query,
93
+ user_id=user_id,
94
+ limit=limit,
95
+ filters=filters,
96
+ time_spec=time_spec,
97
+ )
98
+
99
+ return json.dumps(raw_results)
100
+
101
+ def _parse_date_filters(
102
+ self,
103
+ *,
104
+ start_date: str | None,
105
+ end_date: str | None,
106
+ user_id: str,
107
+ ) -> dict[str, Any]:
108
+ """Build normalized date filters validated against YYYY-MM-DD strings.
109
+
110
+ Args:
111
+ start_date: Inclusive start date for recall filtering.
112
+ end_date: Inclusive end date for recall filtering.
113
+ user_id: User identifier to scope the memories.
114
+
115
+ Returns:
116
+ dict[str, Any]: Payload including ``filters`` or an ``error`` entry when validation fails.
117
+ """
118
+ filters: dict[str, Any] = {"AND": [{"user_id": user_id}]}
119
+ if start_date or end_date:
120
+ try:
121
+ date_range_filter = self._build_explicit_date_filter(start_date, end_date)
122
+ if date_range_filter:
123
+ filters["AND"].append(date_range_filter)
124
+ logger.info(
125
+ "%s: Using explicit date range [%s, %s] for user_id='%s'",
126
+ self.LOG_PREFIX,
127
+ start_date or "unbounded",
128
+ end_date or "unbounded",
129
+ user_id,
130
+ )
131
+ except ValueError as exc:
132
+ logger.warning("%s: Invalid explicit date range: %s", self.LOG_PREFIX, exc)
133
+ return {"error": str(exc), "hits": [], "count": 0}
134
+
135
+ return {"filters": filters}
136
+
137
+ def _build_explicit_date_filter(self, start_date: str | None, end_date: str | None) -> dict[str, Any] | None:
138
+ """Return the mem0-compatible date clause for explicit ranges.
139
+
140
+ Args:
141
+ start_date: Inclusive start date string.
142
+ end_date: Inclusive end date string.
143
+
144
+ Returns:
145
+ dict[str, Any] | None: Date filter clause or None when no bounds were provided.
146
+
147
+ Raises:
148
+ ValueError: If either date fails the YYYY-MM-DD validation.
149
+ """
150
+ if not start_date and not end_date:
151
+ return None
152
+
153
+ date_filter: dict[str, Any] = {}
154
+
155
+ if start_date:
156
+ if not is_valid_date_string(start_date, "%Y-%m-%d"):
157
+ raise ValueError(f"Invalid start_date format '{start_date}'. Expected YYYY-MM-DD.")
158
+ date_filter["gte"] = start_date
159
+
160
+ if end_date:
161
+ if not is_valid_date_string(end_date, "%Y-%m-%d"):
162
+ raise ValueError(f"Invalid end_date format '{end_date}'. Expected YYYY-MM-DD.")
163
+ date_filter["lt"] = next_day_iso(end_date)
164
+
165
+ return {"created_at": date_filter}
166
+
167
+ def _add_additional_filters(
168
+ self,
169
+ *,
170
+ filters: dict[str, Any],
171
+ categories: list[str] | None,
172
+ metadata: dict[str, Any] | None,
173
+ user_id: str,
174
+ ) -> dict[str, Any]:
175
+ """Augment filters with categories and metadata selections.
176
+
177
+ Args:
178
+ filters: Existing filter payload (mutated in place).
179
+ categories: Optional category list attached to the request.
180
+ metadata: Additional metadata equality filters.
181
+ user_id: User identifier for logging context.
182
+
183
+ Returns:
184
+ dict[str, Any]: Updated filters object.
185
+ """
186
+ if categories:
187
+ filters["AND"].append({"categories": {"in": categories}})
188
+ logger.info("%s: Added categories filter %s for user_id='%s'", self.LOG_PREFIX, categories, user_id)
189
+
190
+ if metadata:
191
+ filters["AND"].append({"metadata": metadata})
192
+ logger.info("%s: Added metadata filter %s for user_id='%s'", self.LOG_PREFIX, metadata, user_id)
193
+
194
+ return filters
195
+
196
+ def _perform_retrieval(
197
+ self,
198
+ *,
199
+ query: str | None,
200
+ user_id: str,
201
+ limit: int | None,
202
+ filters: dict[str, Any],
203
+ time_spec: str,
204
+ ) -> list[dict[str, Any]]:
205
+ """Execute the underlying memory retrieval call with guardrails.
206
+
207
+ Args:
208
+ query: Semantic query string or None for chronological listing.
209
+ user_id: Identifier associated with the stored memories.
210
+ limit: Requested number of memories to fetch.
211
+ filters: Filter payload produced by ``_add_additional_filters``.
212
+ time_spec: Human-readable time range string used for logging.
213
+
214
+ Returns:
215
+ list[dict[str, Any]]: Retrieved memories or empty list on failure.
216
+ """
217
+ effective_limit = max(limit or MemoryDefaults.RETRIEVAL_LIMIT, self.MINIMUM_MEMORY_RETRIEVAL)
218
+ if limit is not None and effective_limit != limit:
219
+ logger.info(
220
+ "%s: Enforced minimum limit of %s (requested: %s, using: %s)",
221
+ self.LOG_PREFIX,
222
+ self.MINIMUM_MEMORY_RETRIEVAL,
223
+ limit,
224
+ effective_limit,
225
+ )
226
+
227
+ try:
228
+ results = self.memory.retrieve(
229
+ query=query,
230
+ user_id=user_id,
231
+ limit=effective_limit,
232
+ filters=filters,
233
+ )
234
+
235
+ retrieval_mode = "semantic search" if query else "date-based recall"
236
+
237
+ logger.info(
238
+ "%s: %s complete for user_id='%s', query='%s', time_spec='%s', "
239
+ "limit=%s (effective: %s), filters=%s, results_count=%s",
240
+ self.LOG_PREFIX,
241
+ retrieval_mode.title(),
242
+ user_id,
243
+ query or "None",
244
+ time_spec,
245
+ limit,
246
+ effective_limit,
247
+ filters,
248
+ len(results),
249
+ )
250
+
251
+ return results
252
+
253
+ except Exception as exc: # noqa: BLE001
254
+ logger.error("%s: Retrieval failed for user_id='%s': %s", self.LOG_PREFIX, user_id, exc)
255
+ return []
256
+
257
+
258
+ Mem0SearchInput = LongTermMemorySearchInput
@@ -0,0 +1,19 @@
1
+ from _typeshed import Incomplete
2
+ from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
3
+ from aip_agents.tools.memory_search.base import LongTermMemorySearchTool as LongTermMemorySearchTool
4
+ from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput
5
+ from aip_agents.utils.datetime import is_valid_date_string as is_valid_date_string, next_day_iso as next_day_iso
6
+ from aip_agents.utils.logger import get_logger as get_logger
7
+ from typing import ClassVar
8
+
9
+ logger: Incomplete
10
+ MEMORY_SEARCH_TOOL_NAME: str
11
+
12
+ class Mem0SearchTool(LongTermMemorySearchTool):
13
+ """Mem0-specific implementation of the long-term memory search tool."""
14
+ name: str
15
+ description: str
16
+ args_schema: type[LongTermMemorySearchInput]
17
+ LOG_PREFIX: ClassVar[str]
18
+ METADATA_FILTER_BLOCKLIST: ClassVar[set[str]]
19
+ Mem0SearchInput = LongTermMemorySearchInput
@@ -0,0 +1,48 @@
1
+ """Pydantic schemas shared by memory search tools.
2
+
3
+ Authors:
4
+ Raymond Christopher (raymond.christopher@gdplabs.id)
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ from pydantic import BaseModel, Field
10
+
11
+
12
+ class MemoryConfig(BaseModel):
13
+ """Tool configuration schema for memory operations."""
14
+
15
+ user_id: str = Field(description="User identifier for memory scoping")
16
+
17
+
18
+ class LongTermMemorySearchInput(BaseModel):
19
+ """Input schema for unified long-term memory retrieval."""
20
+
21
+ query: str | None = Field(
22
+ None,
23
+ description="Optional semantic query for searching memories. If provided, performs semantic search. "
24
+ "If omitted, performs pure date-based recall using time filters.",
25
+ )
26
+ start_date: str | None = Field(
27
+ None,
28
+ description="Explicit start date in YYYY-MM-DD format. Used with end_date for precise date ranges. "
29
+ "If omitted, recall is unbounded at the start.",
30
+ )
31
+ end_date: str | None = Field(
32
+ None,
33
+ description="Explicit end date in YYYY-MM-DD format. Used with start_date for precise date ranges. "
34
+ "If omitted, recall is unbounded at the end.",
35
+ )
36
+ limit: int | None = Field(
37
+ None,
38
+ description="Maximum number of memories to retrieve. If not specified, uses default. "
39
+ "Values below 5 are automatically increased to ensure adequate context.",
40
+ )
41
+ categories: list[str] | None = Field(
42
+ None,
43
+ description="Optional categories to filter by (uses 'in' operator).",
44
+ )
45
+ metadata: dict[str, Any] | None = Field(
46
+ None,
47
+ description="Optional metadata dict to filter by (exact key-value match).",
48
+ )
@@ -0,0 +1,15 @@
1
+ from pydantic import BaseModel
2
+ from typing import Any
3
+
4
+ class MemoryConfig(BaseModel):
5
+ """Tool configuration schema for memory operations."""
6
+ user_id: str
7
+
8
+ class LongTermMemorySearchInput(BaseModel):
9
+ """Input schema for unified long-term memory retrieval."""
10
+ query: str | None
11
+ start_date: str | None
12
+ end_date: str | None
13
+ limit: int | None
14
+ categories: list[str] | None
15
+ metadata: dict[str, Any] | None
@@ -0,0 +1,26 @@
1
+ """Backward-compatible shim for the memory search tool module.
2
+
3
+ The actual implementations now live under ``aip_agents.tools.memory_search``.
4
+ Importing from this module continues to work for existing callers.
5
+
6
+ Authors:
7
+ Raymond Christopher (raymond.christopher@gdplabs.id)
8
+ """
9
+
10
+ from aip_agents.tools.memory_search import (
11
+ MEMORY_SEARCH_TOOL_NAME,
12
+ LongTermMemorySearchInput,
13
+ LongTermMemorySearchTool,
14
+ Mem0SearchInput,
15
+ Mem0SearchTool,
16
+ MemoryConfig,
17
+ )
18
+
19
+ __all__ = [
20
+ "MemoryConfig",
21
+ "LongTermMemorySearchInput",
22
+ "LongTermMemorySearchTool",
23
+ "Mem0SearchInput",
24
+ "Mem0SearchTool",
25
+ "MEMORY_SEARCH_TOOL_NAME",
26
+ ]
@@ -0,0 +1,3 @@
1
+ from aip_agents.tools.memory_search import LongTermMemorySearchInput as LongTermMemorySearchInput, LongTermMemorySearchTool as LongTermMemorySearchTool, MEMORY_SEARCH_TOOL_NAME as MEMORY_SEARCH_TOOL_NAME, Mem0SearchInput as Mem0SearchInput, Mem0SearchTool as Mem0SearchTool, MemoryConfig as MemoryConfig
2
+
3
+ __all__ = ['MemoryConfig', 'LongTermMemorySearchInput', 'LongTermMemorySearchTool', 'Mem0SearchInput', 'Mem0SearchTool', 'MEMORY_SEARCH_TOOL_NAME']