aip-agents-binary 0.0.0b2__py3-none-any.whl → 0.5.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/__init__.pyi +19 -0
  3. aip_agents/a2a/__init__.py +19 -0
  4. aip_agents/a2a/__init__.pyi +1 -1
  5. aip_agents/a2a/server/__init__.py +10 -0
  6. aip_agents/a2a/server/base_executor.py +1086 -0
  7. aip_agents/a2a/server/base_executor.pyi +16 -6
  8. aip_agents/a2a/server/google_adk_executor.py +198 -0
  9. aip_agents/a2a/server/google_adk_executor.pyi +11 -11
  10. aip_agents/a2a/server/langflow_executor.py +180 -0
  11. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  12. aip_agents/a2a/server/langgraph_executor.py +267 -0
  13. aip_agents/a2a/server/langgraph_executor.pyi +11 -12
  14. aip_agents/a2a/types.py +232 -0
  15. aip_agents/a2a/types.pyi +54 -47
  16. aip_agents/agent/__init__.py +27 -0
  17. aip_agents/agent/__init__.pyi +3 -1
  18. aip_agents/agent/base_agent.py +970 -0
  19. aip_agents/agent/base_agent.pyi +24 -8
  20. aip_agents/agent/base_langgraph_agent.py +2942 -0
  21. aip_agents/agent/base_langgraph_agent.pyi +93 -25
  22. aip_agents/agent/google_adk_agent.py +926 -0
  23. aip_agents/agent/google_adk_agent.pyi +34 -21
  24. aip_agents/agent/google_adk_constants.py +6 -0
  25. aip_agents/agent/google_adk_constants.pyi +3 -0
  26. aip_agents/agent/hitl/__init__.py +24 -0
  27. aip_agents/agent/hitl/__init__.pyi +6 -0
  28. aip_agents/agent/hitl/config.py +28 -0
  29. aip_agents/agent/hitl/config.pyi +15 -0
  30. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  31. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  32. aip_agents/agent/hitl/manager.py +522 -0
  33. aip_agents/agent/hitl/manager.pyi +199 -0
  34. aip_agents/agent/hitl/models.py +18 -0
  35. aip_agents/agent/hitl/models.pyi +3 -0
  36. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  37. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  38. aip_agents/agent/hitl/prompt/base.py +42 -0
  39. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  40. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  41. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  42. aip_agents/agent/interface.py +138 -0
  43. aip_agents/agent/interface.pyi +5 -5
  44. aip_agents/agent/interfaces.py +65 -0
  45. aip_agents/agent/interfaces.pyi +44 -0
  46. aip_agents/agent/langflow_agent.py +464 -0
  47. aip_agents/agent/langflow_agent.pyi +133 -0
  48. aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
  49. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
  50. aip_agents/agent/langgraph_react_agent.py +2514 -0
  51. aip_agents/agent/langgraph_react_agent.pyi +51 -56
  52. aip_agents/agent/system_instruction_context.py +34 -0
  53. aip_agents/agent/system_instruction_context.pyi +13 -0
  54. aip_agents/clients/__init__.py +10 -0
  55. aip_agents/clients/__init__.pyi +4 -0
  56. aip_agents/clients/langflow/__init__.py +10 -0
  57. aip_agents/clients/langflow/__init__.pyi +4 -0
  58. aip_agents/clients/langflow/client.py +477 -0
  59. aip_agents/clients/langflow/client.pyi +140 -0
  60. aip_agents/clients/langflow/types.py +18 -0
  61. aip_agents/clients/langflow/types.pyi +7 -0
  62. aip_agents/constants.py +23 -0
  63. aip_agents/constants.pyi +1 -0
  64. aip_agents/credentials/manager.py +132 -0
  65. aip_agents/examples/__init__.py +5 -0
  66. aip_agents/examples/compare_streaming_client.py +783 -0
  67. aip_agents/examples/compare_streaming_client.pyi +48 -0
  68. aip_agents/examples/compare_streaming_server.py +142 -0
  69. aip_agents/examples/compare_streaming_server.pyi +18 -0
  70. aip_agents/examples/demo_memory_recall.py +401 -0
  71. aip_agents/examples/demo_memory_recall.pyi +58 -0
  72. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  73. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +2 -2
  74. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +2 -2
  76. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +2 -2
  78. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +7 -2
  80. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  81. aip_agents/examples/hello_world_a2a_langchain_client.pyi +1 -1
  82. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  83. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +1 -1
  84. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +1 -1
  86. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +1 -1
  88. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  89. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +1 -1
  90. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  91. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +8 -3
  92. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  93. aip_agents/examples/hello_world_a2a_langchain_server.pyi +7 -2
  94. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  95. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +7 -2
  96. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  97. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  98. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  99. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  100. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  101. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +1 -1
  102. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  103. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +1 -1
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +7 -2
  106. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +2 -2
  108. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +2 -2
  110. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +1 -1
  112. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +3 -3
  114. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +1 -1
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +1 -1
  118. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +7 -2
  120. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +7 -2
  122. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +7 -2
  124. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  125. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +1 -1
  126. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  127. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +31 -6
  128. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  129. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +33 -5
  130. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  131. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +1 -1
  132. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  133. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +7 -2
  134. aip_agents/examples/hello_world_google_adk.py +41 -0
  135. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  136. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  137. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  138. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  139. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  141. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  142. aip_agents/examples/hello_world_langchain.py +28 -0
  143. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  144. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  145. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  146. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  147. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  148. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  149. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  150. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  151. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  152. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  153. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  154. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  155. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  156. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  157. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  158. aip_agents/examples/hello_world_langgraph.py +39 -0
  159. aip_agents/examples/hello_world_langgraph_bosa_twitter.py +41 -0
  160. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  161. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  162. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  163. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  164. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  165. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  166. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  167. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  168. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  169. aip_agents/examples/hello_world_model_switch_cli.pyi +18 -3
  170. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  171. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  172. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  173. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  174. aip_agents/examples/hello_world_pii_logger.py +21 -0
  175. aip_agents/examples/hello_world_pii_logger.pyi +1 -1
  176. aip_agents/examples/hello_world_sentry.py +133 -0
  177. aip_agents/examples/hello_world_sentry.pyi +1 -1
  178. aip_agents/examples/hello_world_step_limits.py +273 -0
  179. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  180. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  181. aip_agents/examples/hello_world_stock_a2a_server.pyi +7 -2
  182. aip_agents/examples/hello_world_tool_output_client.py +46 -0
  183. aip_agents/examples/hello_world_tool_output_client.pyi +1 -1
  184. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  185. aip_agents/examples/hello_world_tool_output_server.pyi +7 -2
  186. aip_agents/examples/hitl_demo.py +724 -0
  187. aip_agents/examples/hitl_demo.pyi +67 -0
  188. aip_agents/examples/mcp_configs/configs.py +63 -0
  189. aip_agents/examples/mcp_servers/common.py +76 -0
  190. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  191. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  192. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  193. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  194. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  195. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  196. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  197. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  198. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  199. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  200. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  201. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  202. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  203. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  204. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  205. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  206. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  207. aip_agents/examples/tools/__init__.py +27 -0
  208. aip_agents/examples/tools/__init__.pyi +3 -1
  209. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  210. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  211. aip_agents/examples/tools/adk_weather_tool.pyi +1 -1
  212. aip_agents/examples/tools/data_generator_tool.py +103 -0
  213. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  214. aip_agents/examples/tools/data_visualization_tool.pyi +2 -0
  215. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  216. aip_agents/examples/tools/image_artifact_tool.pyi +2 -0
  217. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  218. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +7 -0
  219. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  220. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +0 -1
  221. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  222. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +2 -0
  223. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  224. aip_agents/examples/tools/langchain_weather_tool.pyi +1 -1
  225. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  226. aip_agents/examples/tools/langgraph_streaming_tool.pyi +1 -1
  227. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  228. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  229. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  230. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  231. aip_agents/examples/tools/random_chart_tool.py +142 -0
  232. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  233. aip_agents/examples/tools/serper_tool.py +202 -0
  234. aip_agents/examples/tools/stock_tools.py +82 -0
  235. aip_agents/examples/tools/stock_tools.pyi +18 -3
  236. aip_agents/examples/tools/table_generator_tool.py +167 -0
  237. aip_agents/examples/tools/time_tool.py +82 -0
  238. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  239. aip_agents/executor/agent_executor.py +473 -0
  240. aip_agents/executor/base.py +48 -0
  241. aip_agents/mcp/__init__.py +1 -0
  242. aip_agents/mcp/client/__init__.py +14 -0
  243. aip_agents/mcp/client/__init__.pyi +4 -3
  244. aip_agents/mcp/client/base_mcp_client.py +369 -0
  245. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  246. aip_agents/mcp/client/connection_manager.py +193 -0
  247. aip_agents/mcp/client/connection_manager.pyi +48 -0
  248. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  249. aip_agents/mcp/client/google_adk/__init__.pyi +1 -1
  250. aip_agents/mcp/client/google_adk/client.py +381 -0
  251. aip_agents/mcp/client/google_adk/client.pyi +50 -13
  252. aip_agents/mcp/client/langchain/__init__.py +11 -0
  253. aip_agents/mcp/client/langchain/__init__.pyi +1 -1
  254. aip_agents/mcp/client/langchain/client.py +265 -0
  255. aip_agents/mcp/client/langchain/client.pyi +47 -2
  256. aip_agents/mcp/client/persistent_session.py +359 -0
  257. aip_agents/mcp/client/persistent_session.pyi +113 -0
  258. aip_agents/mcp/client/session_pool.py +351 -0
  259. aip_agents/mcp/client/session_pool.pyi +101 -0
  260. aip_agents/mcp/client/transports.py +215 -0
  261. aip_agents/mcp/client/transports.pyi +123 -0
  262. aip_agents/mcp/utils/__init__.py +7 -0
  263. aip_agents/mcp/utils/__init__.pyi +0 -0
  264. aip_agents/mcp/utils/config_validator.py +139 -0
  265. aip_agents/mcp/utils/config_validator.pyi +82 -0
  266. aip_agents/memory/__init__.py +14 -0
  267. aip_agents/memory/__init__.pyi +5 -0
  268. aip_agents/memory/adapters/__init__.py +10 -0
  269. aip_agents/memory/adapters/__init__.pyi +4 -0
  270. aip_agents/memory/adapters/base_adapter.py +717 -0
  271. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  272. aip_agents/memory/adapters/mem0.py +84 -0
  273. aip_agents/memory/adapters/mem0.pyi +22 -0
  274. aip_agents/memory/base.py +84 -0
  275. aip_agents/memory/base.pyi +15 -4
  276. aip_agents/memory/constants.py +49 -0
  277. aip_agents/memory/constants.pyi +25 -0
  278. aip_agents/memory/factory.py +86 -0
  279. aip_agents/memory/factory.pyi +24 -0
  280. aip_agents/memory/guidance.py +20 -0
  281. aip_agents/memory/guidance.pyi +3 -0
  282. aip_agents/memory/simple_memory.py +47 -0
  283. aip_agents/memory/simple_memory.pyi +6 -5
  284. aip_agents/middleware/__init__.py +17 -0
  285. aip_agents/middleware/__init__.pyi +5 -0
  286. aip_agents/middleware/base.py +88 -0
  287. aip_agents/middleware/base.pyi +71 -0
  288. aip_agents/middleware/manager.py +128 -0
  289. aip_agents/middleware/manager.pyi +80 -0
  290. aip_agents/middleware/todolist.py +274 -0
  291. aip_agents/middleware/todolist.pyi +125 -0
  292. aip_agents/schema/__init__.py +69 -0
  293. aip_agents/schema/__init__.pyi +9 -0
  294. aip_agents/schema/a2a.py +56 -0
  295. aip_agents/schema/a2a.pyi +40 -0
  296. aip_agents/schema/agent.py +111 -0
  297. aip_agents/schema/agent.pyi +65 -0
  298. aip_agents/schema/hitl.py +157 -0
  299. aip_agents/schema/hitl.pyi +89 -0
  300. aip_agents/schema/langgraph.py +37 -0
  301. aip_agents/schema/langgraph.pyi +28 -0
  302. aip_agents/schema/model_id.py +97 -0
  303. aip_agents/schema/model_id.pyi +54 -0
  304. aip_agents/schema/step_limit.py +108 -0
  305. aip_agents/schema/step_limit.pyi +63 -0
  306. aip_agents/schema/storage.py +40 -0
  307. aip_agents/schema/storage.pyi +21 -0
  308. aip_agents/sentry/__init__.py +11 -0
  309. aip_agents/sentry/__init__.pyi +1 -1
  310. aip_agents/sentry/sentry.py +151 -0
  311. aip_agents/sentry/sentry.pyi +2 -2
  312. aip_agents/storage/__init__.py +41 -0
  313. aip_agents/storage/base.py +85 -0
  314. aip_agents/storage/base.pyi +1 -2
  315. aip_agents/storage/clients/__init__.py +12 -0
  316. aip_agents/storage/clients/minio_client.py +318 -0
  317. aip_agents/storage/config.py +62 -0
  318. aip_agents/storage/config.pyi +9 -46
  319. aip_agents/storage/providers/__init__.py +15 -0
  320. aip_agents/storage/providers/base.py +106 -0
  321. aip_agents/storage/providers/base.pyi +2 -3
  322. aip_agents/storage/providers/memory.py +114 -0
  323. aip_agents/storage/providers/object_storage.py +214 -0
  324. aip_agents/storage/providers/object_storage.pyi +1 -1
  325. aip_agents/tools/__init__.py +6 -0
  326. aip_agents/tools/__init__.pyi +3 -2
  327. aip_agents/tools/bosa_tools.py +105 -0
  328. aip_agents/tools/bosa_tools.pyi +2 -2
  329. aip_agents/tools/browser_use/__init__.py +82 -0
  330. aip_agents/tools/browser_use/__init__.pyi +14 -0
  331. aip_agents/tools/browser_use/action_parser.py +103 -0
  332. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  333. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  334. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  335. aip_agents/tools/browser_use/llm_config.py +120 -0
  336. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  337. aip_agents/tools/browser_use/minio_storage.py +198 -0
  338. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  339. aip_agents/tools/browser_use/schemas.py +119 -0
  340. aip_agents/tools/browser_use/schemas.pyi +32 -0
  341. aip_agents/tools/browser_use/session.py +76 -0
  342. aip_agents/tools/browser_use/session.pyi +4 -0
  343. aip_agents/tools/browser_use/session_errors.py +132 -0
  344. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  345. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  346. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  347. aip_agents/tools/browser_use/streaming.py +813 -0
  348. aip_agents/tools/browser_use/streaming.pyi +81 -0
  349. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  350. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  351. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  352. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  353. aip_agents/tools/browser_use/types.py +78 -0
  354. aip_agents/tools/browser_use/types.pyi +45 -0
  355. aip_agents/tools/code_sandbox/__init__.py +26 -0
  356. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  357. aip_agents/tools/code_sandbox/constant.py +13 -0
  358. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  359. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
  360. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -0
  361. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  362. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  363. aip_agents/tools/constants.py +165 -0
  364. aip_agents/tools/constants.pyi +105 -100
  365. aip_agents/tools/document_loader/__init__.py +37 -0
  366. aip_agents/tools/document_loader/__init__.pyi +7 -0
  367. aip_agents/tools/document_loader/base_reader.py +262 -0
  368. aip_agents/tools/document_loader/base_reader.pyi +62 -0
  369. aip_agents/tools/document_loader/docx_reader_tool.py +53 -0
  370. aip_agents/tools/document_loader/docx_reader_tool.pyi +6 -0
  371. aip_agents/tools/document_loader/excel_reader_tool.py +160 -0
  372. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  373. aip_agents/tools/document_loader/pdf_reader_tool.py +67 -0
  374. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  375. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  376. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  377. aip_agents/tools/gl_connector/__init__.py +5 -0
  378. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  379. aip_agents/tools/gl_connector/tool.py +351 -0
  380. aip_agents/tools/gl_connector/tool.pyi +74 -0
  381. aip_agents/tools/memory_search/__init__.py +22 -0
  382. aip_agents/tools/memory_search/__init__.pyi +5 -0
  383. aip_agents/tools/memory_search/base.py +200 -0
  384. aip_agents/tools/memory_search/base.pyi +69 -0
  385. aip_agents/tools/memory_search/mem0.py +258 -0
  386. aip_agents/tools/memory_search/mem0.pyi +19 -0
  387. aip_agents/tools/memory_search/schema.py +48 -0
  388. aip_agents/tools/memory_search/schema.pyi +15 -0
  389. aip_agents/tools/memory_search_tool.py +26 -0
  390. aip_agents/tools/memory_search_tool.pyi +3 -0
  391. aip_agents/tools/tool_config_injector.py +300 -0
  392. aip_agents/tools/web_search/__init__.py +15 -0
  393. aip_agents/tools/web_search/__init__.pyi +3 -0
  394. aip_agents/tools/web_search/serper_tool.py +187 -0
  395. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  396. aip_agents/types/__init__.py +70 -0
  397. aip_agents/types/__init__.pyi +35 -2
  398. aip_agents/types/a2a_events.py +13 -0
  399. aip_agents/types/a2a_events.pyi +2 -73
  400. aip_agents/utils/__init__.py +79 -0
  401. aip_agents/utils/__init__.pyi +8 -2
  402. aip_agents/utils/a2a_connector.py +1757 -0
  403. aip_agents/utils/a2a_connector.pyi +15 -4
  404. aip_agents/utils/artifact_helpers.py +502 -0
  405. aip_agents/utils/artifact_helpers.pyi +26 -2
  406. aip_agents/utils/constants.py +22 -0
  407. aip_agents/utils/constants.pyi +10 -0
  408. aip_agents/utils/datetime/__init__.py +34 -0
  409. aip_agents/utils/datetime/__init__.pyi +4 -0
  410. aip_agents/utils/datetime/normalization.py +231 -0
  411. aip_agents/utils/datetime/normalization.pyi +95 -0
  412. aip_agents/utils/datetime/timezone.py +206 -0
  413. aip_agents/utils/datetime/timezone.pyi +48 -0
  414. aip_agents/utils/env_loader.py +27 -0
  415. aip_agents/utils/env_loader.pyi +10 -0
  416. aip_agents/utils/event_handler_registry.py +58 -0
  417. aip_agents/utils/event_handler_registry.pyi +23 -0
  418. aip_agents/utils/file_prompt_utils.py +176 -0
  419. aip_agents/utils/file_prompt_utils.pyi +21 -0
  420. aip_agents/utils/final_response_builder.py +211 -0
  421. aip_agents/utils/final_response_builder.pyi +34 -0
  422. aip_agents/utils/formatter_llm_client.py +231 -0
  423. aip_agents/utils/formatter_llm_client.pyi +71 -0
  424. aip_agents/utils/langgraph/__init__.py +19 -0
  425. aip_agents/utils/langgraph/converter.py +128 -0
  426. aip_agents/utils/langgraph/converter.pyi +1 -1
  427. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  428. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  429. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +2 -2
  430. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  431. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +2 -3
  432. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  433. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +17 -11
  434. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  435. aip_agents/utils/langgraph/tool_output_management.pyi +15 -33
  436. aip_agents/utils/logger.py +195 -0
  437. aip_agents/utils/logger.pyi +60 -0
  438. aip_agents/utils/metadata/__init__.py +27 -0
  439. aip_agents/utils/metadata/__init__.pyi +5 -0
  440. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  441. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  442. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  443. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  444. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  445. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  446. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  447. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  448. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  449. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  450. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  451. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  452. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  453. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  454. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  455. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  456. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  457. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  458. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  459. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  460. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  461. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  462. aip_agents/utils/metadata_helper.py +358 -0
  463. aip_agents/utils/metadata_helper.pyi +55 -48
  464. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  465. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  466. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +1 -2
  467. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  468. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +1 -1
  469. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  470. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +4 -4
  471. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  472. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +1 -1
  473. aip_agents/utils/pii/__init__.py +25 -0
  474. aip_agents/utils/pii/__init__.pyi +5 -0
  475. aip_agents/utils/pii/pii_handler.py +397 -0
  476. aip_agents/utils/pii/pii_handler.pyi +96 -0
  477. aip_agents/utils/pii/pii_helper.py +207 -0
  478. aip_agents/utils/pii/pii_helper.pyi +78 -0
  479. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  480. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  481. aip_agents/utils/reference_helper.py +273 -0
  482. aip_agents/utils/reference_helper.pyi +38 -6
  483. aip_agents/utils/sse_chunk_transformer.py +831 -0
  484. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  485. aip_agents/utils/step_limit_manager.py +265 -0
  486. aip_agents/utils/step_limit_manager.pyi +112 -0
  487. aip_agents/utils/token_usage_helper.py +156 -0
  488. aip_agents/utils/token_usage_helper.pyi +1 -1
  489. aip_agents_binary-0.5.11.dist-info/METADATA +689 -0
  490. aip_agents_binary-0.5.11.dist-info/RECORD +542 -0
  491. {aip_agents_binary-0.0.0b2.dist-info → aip_agents_binary-0.5.11.dist-info}/WHEEL +2 -1
  492. aip_agents_binary-0.5.11.dist-info/top_level.txt +1 -0
  493. aip_agents/agent/types.pyi +0 -106
  494. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client.pyi +0 -15
  495. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client_streaming.pyi +0 -5
  496. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_server.pyi +0 -11
  497. aip_agents/examples/hello_world_langgraph_bosa.pyi +0 -5
  498. aip_agents/examples/tools/pr_details_bosa_tool.pyi +0 -26
  499. aip_agents/tools/base.pyi +0 -44
  500. aip_agents/tools/base_bosa_tools.pyi +0 -12
  501. aip_agents/tools/bosa_connector.pyi +0 -30
  502. aip_agents/tools/bosa_tools_interface.pyi +0 -26
  503. aip_agents/tools/nested_agent_tool.pyi +0 -45
  504. aip_agents/utils/logger_manager.pyi +0 -151
  505. aip_agents_binary-0.0.0b2.dist-info/METADATA +0 -277
  506. aip_agents_binary-0.0.0b2.dist-info/RECORD +0 -157
@@ -0,0 +1,199 @@
1
+ from _typeshed import Incomplete
2
+ from aip_agents.agent.hitl.config import ToolApprovalConfig as ToolApprovalConfig
3
+ from aip_agents.agent.hitl.prompt import BasePromptHandler as BasePromptHandler, DeferredPromptHandler as DeferredPromptHandler
4
+ from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalDecisionType as ApprovalDecisionType, ApprovalLogEntry as ApprovalLogEntry, ApprovalRequest as ApprovalRequest
5
+ from collections.abc import Callable as Callable, Iterable
6
+ from typing import Any
7
+
8
+ MAX_ARGUMENTS_PREVIEW_LENGTH: int
9
+ DECISION_MESSAGE_MAP: Incomplete
10
+ TOOL_EXECUTION_BLOCKING_DECISIONS: Incomplete
11
+
12
+ class ApprovalManager:
13
+ """Manages the HITL approval workflow for tools.
14
+
15
+ This class coordinates the approval process from configuration through
16
+ to final decision, handling timeouts and cleanup.
17
+ """
18
+ def __init__(self, prompt_handler: BasePromptHandler | None = None) -> None:
19
+ """Initialize the approval manager.
20
+
21
+ Args:
22
+ prompt_handler: Optional prompt handler for user interaction.
23
+ Defaults to DeferredPromptHandler which exposes pending requests
24
+ for out-of-band resolution.
25
+ """
26
+ def create_approval_request(self, tool_name: str, arguments: dict[str, Any], config: ToolApprovalConfig, context: dict[str, str] | None = None) -> ApprovalRequest:
27
+ """Create a new approval request for a tool call.
28
+
29
+ Args:
30
+ tool_name: Name of the tool being called.
31
+ arguments: Tool arguments (will be JSON serialized).
32
+ config: Approval configuration for this tool.
33
+ context: Optional context metadata. Defaults to None.
34
+
35
+ Returns:
36
+ The created approval request.
37
+ """
38
+ def get_pending_request(self, request_id: str) -> ApprovalRequest | None:
39
+ """Get a pending approval request by ID.
40
+
41
+ Args:
42
+ request_id: The unique identifier of the approval request.
43
+
44
+ Returns:
45
+ The pending approval request if found, None otherwise.
46
+ """
47
+ def approve_request(self, request: ApprovalRequest, operator_input: str = 'approved') -> ApprovalDecision:
48
+ '''Record an approval decision for a request.
49
+
50
+ This method creates an approval decision, calculates latency metrics,
51
+ and removes the request from the active requests queue.
52
+
53
+ Args:
54
+ request: The approval request to approve.
55
+ operator_input: Raw operator input that led to this decision. Defaults to "approved".
56
+
57
+ Returns:
58
+ The recorded approval decision.
59
+ '''
60
+ def reject_request(self, request: ApprovalRequest, operator_input: str = 'rejected') -> ApprovalDecision:
61
+ '''Record a rejection decision for a request.
62
+
63
+ This method creates a rejection decision, calculates latency metrics,
64
+ and removes the request from the active requests queue.
65
+
66
+ Args:
67
+ request: The approval request to reject.
68
+ operator_input: Raw operator input that led to this decision. Defaults to "rejected".
69
+
70
+ Returns:
71
+ The recorded rejection decision.
72
+ '''
73
+ def skip_request(self, request: ApprovalRequest, operator_input: str = 'skipped') -> ApprovalDecision:
74
+ '''Record a skip decision for a request.
75
+
76
+ This method creates a skip decision, calculates latency metrics,
77
+ and removes the request from the active requests queue.
78
+
79
+ Args:
80
+ request: The approval request to skip.
81
+ operator_input: Raw operator input that led to this decision. Defaults to "skipped".
82
+
83
+ Returns:
84
+ The recorded skip decision.
85
+ '''
86
+ def timeout_request(self, request: ApprovalRequest, operator_input: str = 'TIMEOUT') -> ApprovalDecision:
87
+ '''Record a timeout decision for a request, always skipping the tool.
88
+
89
+ Args:
90
+ request (ApprovalRequest): The approval request that timed out.
91
+ operator_input (str, optional): Input from the operator (defaults to "TIMEOUT").
92
+
93
+ Returns:
94
+ ApprovalDecision: The timeout decision.
95
+ '''
96
+ def check_timeout(self, request: ApprovalRequest) -> ApprovalDecision | None:
97
+ """Check if a request has timed out and return timeout decision if so.
98
+
99
+ Args:
100
+ request: The approval request to check.
101
+
102
+ Returns:
103
+ Timeout decision if timed out, None otherwise.
104
+ """
105
+ async def prompt_for_decision(self, request: ApprovalRequest, timeout_seconds: int, context_keys: list[str] | None = None) -> ApprovalDecision:
106
+ """Prompt for a decision using the configured handler.
107
+
108
+ This method delegates to the configured prompt handler to obtain
109
+ an approval decision from the operator. The handler may be interactive
110
+ (CLI) or deferred (programmatic, resume-in-place).
111
+
112
+ Args:
113
+ request: The approval request to prompt for.
114
+ timeout_seconds: How long to wait for input.
115
+ context_keys: Optional keys to display from context. Defaults to None.
116
+
117
+ Returns:
118
+ The operator's decision on the request.
119
+ """
120
+ def list_pending_requests(self) -> Iterable[ApprovalRequest]:
121
+ """Return a snapshot of currently pending requests.
122
+
123
+ This method provides a thread-safe snapshot of all currently active
124
+ approval requests that are waiting for operator decisions.
125
+
126
+ Returns:
127
+ An iterable of all pending approval requests.
128
+ """
129
+ def resolve_pending_request(self, request_id: str, decision: str, operator_input: str = '') -> ApprovalDecision:
130
+ '''Resolve a pending request with an explicit decision.
131
+
132
+ Args:
133
+ request_id: The unique identifier of the pending approval request.
134
+ decision: The decision string (e.g., "approved", "rejected", "skipped").
135
+ operator_input: Optional raw operator input, defaults to the decision string. Defaults to "".
136
+
137
+ Returns:
138
+ The recorded approval decision.
139
+
140
+ Raises:
141
+ KeyError: If no pending request exists with the given request_id.
142
+ ValueError: If the decision string is not supported.
143
+ '''
144
+ def create_log_entry(self, decision: ApprovalDecision, tool_name: str, agent_id: str | None = None, thread_id: str | None = None, additional_context: dict[str, Any] | None = None) -> ApprovalLogEntry:
145
+ """Create a log entry for a decision.
146
+
147
+ Args:
148
+ decision: The approval decision.
149
+ tool_name: Name of the tool.
150
+ agent_id: Optional agent identifier. Defaults to None.
151
+ thread_id: Optional thread/session identifier. Defaults to None.
152
+ additional_context: Optional additional logging context. Defaults to None.
153
+
154
+ Returns:
155
+ Structured log entry.
156
+ """
157
+ def cleanup_expired_requests(self) -> int:
158
+ """Clean up expired requests and return count of cleaned requests.
159
+
160
+ This method removes all approval requests that have exceeded their
161
+ timeout period from the active requests queue. This is typically
162
+ called periodically to prevent memory leaks from abandoned requests.
163
+
164
+ Returns:
165
+ The number of expired requests that were cleaned up.
166
+ """
167
+ def register_waiter(self, request_id: str, future: Any) -> None:
168
+ """Register a waiter future for an approval request.
169
+
170
+ Args:
171
+ request_id: The id for which to wait.
172
+ future: An asyncio.Future that will receive a tuple(decision, operator_input).
173
+ """
174
+ def unregister_waiter(self, request_id: str) -> None:
175
+ """Unregister a waiter if present (used on timeout/cancellation).
176
+
177
+ Args:
178
+ request_id (str): The ID of the request to unregister the waiter for.
179
+ """
180
+ async def wait_for_pending_decision(self, request: ApprovalRequest, timeout_seconds: int) -> ApprovalDecision:
181
+ """Wait for a pending request to be resolved and return the final decision.
182
+
183
+ Args:
184
+ request: The pending approval request to wait for.
185
+ timeout_seconds: Maximum time to wait before treating as timeout.
186
+
187
+ Returns:
188
+ The finalized approval decision.
189
+ """
190
+ @staticmethod
191
+ def get_decision_message(decision: ApprovalDecision) -> str:
192
+ """Get the appropriate message for a HITL decision.
193
+
194
+ Args:
195
+ decision: The approval decision to get a message for.
196
+
197
+ Returns:
198
+ A human-readable message explaining the decision outcome.
199
+ """
@@ -0,0 +1,18 @@
1
+ """Backward-compatible exports for HITL approval schema.
2
+
3
+ Prefer importing from ``aip_agents.schema.hitl`` in new code.
4
+ """
5
+
6
+ from aip_agents.schema.hitl import (
7
+ ApprovalDecision,
8
+ ApprovalDecisionType,
9
+ ApprovalLogEntry,
10
+ ApprovalRequest,
11
+ )
12
+
13
+ __all__ = [
14
+ "ApprovalDecisionType",
15
+ "ApprovalRequest",
16
+ "ApprovalDecision",
17
+ "ApprovalLogEntry",
18
+ ]
@@ -0,0 +1,3 @@
1
+ from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalDecisionType as ApprovalDecisionType, ApprovalLogEntry as ApprovalLogEntry, ApprovalRequest as ApprovalRequest
2
+
3
+ __all__ = ['ApprovalDecisionType', 'ApprovalRequest', 'ApprovalDecision', 'ApprovalLogEntry']
@@ -0,0 +1,9 @@
1
+ """Prompt handler implementations for HITL approvals."""
2
+
3
+ from aip_agents.agent.hitl.prompt.base import BasePromptHandler
4
+ from aip_agents.agent.hitl.prompt.deferred import DeferredPromptHandler
5
+
6
+ __all__ = [
7
+ "BasePromptHandler",
8
+ "DeferredPromptHandler",
9
+ ]
@@ -0,0 +1,4 @@
1
+ from aip_agents.agent.hitl.prompt.base import BasePromptHandler as BasePromptHandler
2
+ from aip_agents.agent.hitl.prompt.deferred import DeferredPromptHandler as DeferredPromptHandler
3
+
4
+ __all__ = ['BasePromptHandler', 'DeferredPromptHandler']
@@ -0,0 +1,42 @@
1
+ """Shared base classes for HITL prompt handlers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import ABC, abstractmethod
6
+ from typing import TYPE_CHECKING
7
+
8
+ from aip_agents.schema.hitl import ApprovalDecision, ApprovalRequest
9
+
10
+ if TYPE_CHECKING: # pragma: no cover - typing-only import
11
+ from aip_agents.agent.hitl.manager import ApprovalManager
12
+
13
+
14
+ class BasePromptHandler(ABC):
15
+ """Abstract base class for prompt handlers used in HITL flows."""
16
+
17
+ def attach_manager(self, manager: ApprovalManager) -> None:
18
+ """Optionally attach the ``ApprovalManager`` coordinating approvals.
19
+
20
+ Args:
21
+ manager (ApprovalManager): The approval manager instance to attach.
22
+ """
23
+ # Default implementation stores nothing; subclasses override as needed.
24
+ return None
25
+
26
+ @abstractmethod
27
+ async def prompt_for_decision(
28
+ self,
29
+ request: ApprovalRequest,
30
+ timeout_seconds: int,
31
+ context_keys: list[str] | None = None,
32
+ ) -> ApprovalDecision:
33
+ """Collect and return a decision for the given approval request.
34
+
35
+ Args:
36
+ request (ApprovalRequest): The approval request to prompt for.
37
+ timeout_seconds (int): Maximum time to wait for a decision in seconds.
38
+ context_keys (list[str] | None, optional): Optional keys for additional context. Defaults to None.
39
+
40
+ Returns:
41
+ ApprovalDecision: The decision made for the approval request.
42
+ """
@@ -0,0 +1,24 @@
1
+ from abc import ABC, abstractmethod
2
+ from aip_agents.agent.hitl.manager import ApprovalManager as ApprovalManager
3
+ from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalRequest as ApprovalRequest
4
+
5
+ class BasePromptHandler(ABC):
6
+ """Abstract base class for prompt handlers used in HITL flows."""
7
+ def attach_manager(self, manager: ApprovalManager) -> None:
8
+ """Optionally attach the ``ApprovalManager`` coordinating approvals.
9
+
10
+ Args:
11
+ manager (ApprovalManager): The approval manager instance to attach.
12
+ """
13
+ @abstractmethod
14
+ async def prompt_for_decision(self, request: ApprovalRequest, timeout_seconds: int, context_keys: list[str] | None = None) -> ApprovalDecision:
15
+ """Collect and return a decision for the given approval request.
16
+
17
+ Args:
18
+ request (ApprovalRequest): The approval request to prompt for.
19
+ timeout_seconds (int): Maximum time to wait for a decision in seconds.
20
+ context_keys (list[str] | None, optional): Optional keys for additional context. Defaults to None.
21
+
22
+ Returns:
23
+ ApprovalDecision: The decision made for the approval request.
24
+ """
@@ -0,0 +1,73 @@
1
+ """Deferred prompt handler that waits for external approval resolution."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ from collections.abc import Callable
7
+ from typing import TYPE_CHECKING
8
+
9
+ from aip_agents.agent.hitl.prompt.base import BasePromptHandler
10
+ from aip_agents.schema.hitl import ApprovalDecision, ApprovalDecisionType, ApprovalRequest
11
+
12
+ if TYPE_CHECKING: # pragma: no cover - typing-only import
13
+ from aip_agents.agent.hitl.manager import ApprovalManager
14
+
15
+
16
+ class DeferredPromptHandler(BasePromptHandler):
17
+ """Prompt handler that defers tool execution until an external decision is received."""
18
+
19
+ def __init__(self, notify: Callable[[ApprovalRequest], None] | None = None) -> None:
20
+ """Initialize the deferred prompt handler.
21
+
22
+ Args:
23
+ notify: Optional callback function to notify when an approval request is made.
24
+ """
25
+ self._notify = notify
26
+ self._manager: ApprovalManager | None = None
27
+
28
+ def attach_manager(self, manager: ApprovalManager) -> None:
29
+ """Attach the ApprovalManager orchestrating approvals.
30
+
31
+ Args:
32
+ manager: The ApprovalManager instance to attach for handling approval decisions.
33
+ """
34
+ self._manager = manager
35
+
36
+ async def prompt_for_decision(
37
+ self,
38
+ request: ApprovalRequest,
39
+ timeout_seconds: int,
40
+ context_keys: list[str] | None = None,
41
+ ) -> ApprovalDecision:
42
+ """Register a waiter and return a pending decision sentinel.
43
+
44
+ Args:
45
+ request: The approval request containing the tool call details and context.
46
+ timeout_seconds: Number of seconds to wait for approval before timing out.
47
+ context_keys: Optional list of context keys to include in the approval request.
48
+
49
+ Returns:
50
+ ApprovalDecision with PENDING status and registered waiter for external resolution.
51
+ """
52
+ if self._notify:
53
+ try:
54
+ self._notify(request)
55
+ except Exception:
56
+ pass
57
+
58
+ if self._manager is None:
59
+ return ApprovalDecision(
60
+ request_id=request.request_id,
61
+ decision=ApprovalDecisionType.PENDING,
62
+ operator_input="PENDING",
63
+ )
64
+
65
+ loop = asyncio.get_running_loop()
66
+ waiter = loop.create_future()
67
+ self._manager.register_waiter(request.request_id, waiter)
68
+
69
+ return ApprovalDecision(
70
+ request_id=request.request_id,
71
+ decision=ApprovalDecisionType.PENDING,
72
+ operator_input="PENDING",
73
+ )
@@ -0,0 +1,30 @@
1
+ from aip_agents.agent.hitl.manager import ApprovalManager as ApprovalManager
2
+ from aip_agents.agent.hitl.prompt.base import BasePromptHandler as BasePromptHandler
3
+ from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalDecisionType as ApprovalDecisionType, ApprovalRequest as ApprovalRequest
4
+ from collections.abc import Callable
5
+
6
+ class DeferredPromptHandler(BasePromptHandler):
7
+ """Prompt handler that defers tool execution until an external decision is received."""
8
+ def __init__(self, notify: Callable[[ApprovalRequest], None] | None = None) -> None:
9
+ """Initialize the deferred prompt handler.
10
+
11
+ Args:
12
+ notify: Optional callback function to notify when an approval request is made.
13
+ """
14
+ def attach_manager(self, manager: ApprovalManager) -> None:
15
+ """Attach the ApprovalManager orchestrating approvals.
16
+
17
+ Args:
18
+ manager: The ApprovalManager instance to attach for handling approval decisions.
19
+ """
20
+ async def prompt_for_decision(self, request: ApprovalRequest, timeout_seconds: int, context_keys: list[str] | None = None) -> ApprovalDecision:
21
+ """Register a waiter and return a pending decision sentinel.
22
+
23
+ Args:
24
+ request: The approval request containing the tool call details and context.
25
+ timeout_seconds: Number of seconds to wait for approval before timing out.
26
+ context_keys: Optional list of context keys to include in the approval request.
27
+
28
+ Returns:
29
+ ApprovalDecision with PENDING status and registered waiter for external resolution.
30
+ """
@@ -0,0 +1,138 @@
1
+ """Defines the abstract base class AgentInterface for all agent implementations, now with MCP and A2A support.
2
+
3
+ Authors:
4
+ Raymond Christopher (raymond.christopher@gdplabs.id)
5
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
6
+ """
7
+
8
+ from abc import ABC, abstractmethod
9
+ from collections.abc import AsyncGenerator
10
+ from typing import Any
11
+
12
+ from a2a.types import AgentCard
13
+ from gllm_inference.lm_invoker.lm_invoker import BaseLMInvoker
14
+
15
+ from aip_agents.schema.agent import BaseAgentConfig
16
+
17
+
18
+ class AgentInterface(ABC):
19
+ """A general and minimal interface for agent implementations.
20
+
21
+ Defines core execution methods (`__init__`, `run`, `arun`, `arun_stream`).
22
+ Concrete subclasses must implement all abstract methods.
23
+ """
24
+
25
+ name: str
26
+ instruction: str
27
+ description: str | None
28
+ mcp_config: dict[str, Any] = {}
29
+ lm_invoker: BaseLMInvoker | None = None
30
+ config: BaseAgentConfig | None = None
31
+
32
+ def __init__(
33
+ self,
34
+ name: str,
35
+ instruction: str,
36
+ description: str | None = None,
37
+ lm_invoker: BaseLMInvoker | None = None,
38
+ config: BaseAgentConfig | None = None,
39
+ **kwargs: Any,
40
+ ):
41
+ """Initializes the agent.
42
+
43
+ Args:
44
+ name: The name of the agent.
45
+ instruction: The core directive or system prompt for the agent.
46
+ description: Human-readable description. Defaults to instruction if not provided.
47
+ lm_invoker: The language model invoker to use for LLM interactions. Defaults to None.
48
+ config: Additional configuration for the agent.
49
+ **kwargs: Additional keyword arguments for concrete implementations.
50
+ """
51
+ self.name = name
52
+ self.instruction = instruction
53
+ self.description = description or self.instruction
54
+ self.lm_invoker = lm_invoker
55
+ self.config = config
56
+
57
+ @abstractmethod
58
+ def run(
59
+ self,
60
+ query: str,
61
+ **kwargs: Any,
62
+ ) -> dict[str, Any]:
63
+ """Synchronously runs the agent.
64
+
65
+ Args:
66
+ query: The input query for the agent.
67
+ **kwargs: Additional keyword arguments for execution.
68
+
69
+ Returns:
70
+ Dict containing at least {'output': ...}.
71
+ """
72
+ raise NotImplementedError(
73
+ f"'{self.__class__.__name__}' has not implemented the 'run' method."
74
+ ) # pragma: no cover
75
+
76
+ @abstractmethod
77
+ async def arun(
78
+ self,
79
+ query: str,
80
+ **kwargs: Any,
81
+ ) -> dict[str, Any]:
82
+ """Asynchronously runs the agent.
83
+
84
+ Args:
85
+ query: The input query for the agent.
86
+ **kwargs: Additional keyword arguments for execution.
87
+
88
+ Returns:
89
+ Dict containing at least {'output': ...}.
90
+ """
91
+ raise NotImplementedError(
92
+ f"'{self.__class__.__name__}' has not implemented the 'arun' method."
93
+ ) # pragma: no cover
94
+
95
+ @abstractmethod
96
+ async def arun_stream(
97
+ self,
98
+ query: str,
99
+ **kwargs: Any,
100
+ ) -> AsyncGenerator[str | dict[str, Any], None]:
101
+ """Asynchronously streams the agent's response.
102
+
103
+ Args:
104
+ query: The input query.
105
+ **kwargs: Extra parameters for execution.
106
+
107
+ Yields:
108
+ Chunks of output (strings or dicts).
109
+ """
110
+ raise NotImplementedError(
111
+ f"'{self.__class__.__name__}' has not implemented the 'arun_stream' method."
112
+ ) # pragma: no cover
113
+
114
+ @abstractmethod
115
+ def add_mcp_server(self, mcp_config: dict[str, dict[str, Any]]) -> None:
116
+ """Adds a new MCP server configuration.
117
+
118
+ Args:
119
+ mcp_config: Dictionary containing server name as key and its configuration as value.
120
+
121
+ Raises:
122
+ ValueError: If mcp_config is empty or None, or if any server configuration is invalid.
123
+ KeyError: If any server name already exists in the configuration.
124
+ """
125
+ raise NotImplementedError(
126
+ f"'{self.__class__.__name__}' has not implemented the 'add_mcp_server' method."
127
+ ) # pragma: no cover
128
+
129
+ @abstractmethod
130
+ def register_a2a_agents(self, agents: list[AgentCard]):
131
+ """Registers A2A agents from a list of AgentCards.
132
+
133
+ Args:
134
+ agents: A list of AgentCard instances.
135
+ """
136
+ raise NotImplementedError(
137
+ f"'{self.__class__.__name__}' has not implemented the 'register_a2a_agents' method."
138
+ ) # pragma: no cover
@@ -1,11 +1,11 @@
1
- import abc
2
1
  from a2a.types import AgentCard as AgentCard
3
2
  from abc import ABC, abstractmethod
4
- from aip_agents.agent.types import BaseAgentConfig as BaseAgentConfig
5
- from gllm_inference.lm_invoker.lm_invoker import BaseLMInvoker as BaseLMInvoker
6
- from typing import Any, AsyncGenerator
3
+ from aip_agents.schema.agent import BaseAgentConfig as BaseAgentConfig
4
+ from collections.abc import AsyncGenerator
5
+ from gllm_inference.lm_invoker.lm_invoker import BaseLMInvoker
6
+ from typing import Any
7
7
 
8
- class AgentInterface(ABC, metaclass=abc.ABCMeta):
8
+ class AgentInterface(ABC):
9
9
  """A general and minimal interface for agent implementations.
10
10
 
11
11
  Defines core execution methods (`__init__`, `run`, `arun`, `arun_stream`).
@@ -0,0 +1,65 @@
1
+ """Common agent-facing protocols used by A2A executors.
2
+
3
+ These runtime-checkable protocols let executors validate agent instances
4
+ without importing the concrete implementation classes, which avoids
5
+ introducing circular import chains at runtime.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from collections.abc import AsyncIterator
11
+ from typing import Any, Protocol, runtime_checkable
12
+
13
+
14
+ @runtime_checkable
15
+ class LangGraphAgentProtocol(Protocol):
16
+ """Minimal interface required by LangGraphA2AExecutor."""
17
+
18
+ name: str
19
+
20
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncIterator[dict[str, Any]]:
21
+ """Stream A2A-compatible chunks for the given query.
22
+
23
+ Args:
24
+ query (str): The query to execute and stream.
25
+ **kwargs (Any): Additional keyword arguments for execution.
26
+
27
+ Yields:
28
+ dict[str, Any]: A2A-compatible streaming chunks.
29
+ """
30
+
31
+
32
+ @runtime_checkable
33
+ class LangflowAgentProtocol(Protocol):
34
+ """Minimal interface required by LangflowA2AExecutor."""
35
+
36
+ name: str
37
+
38
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncIterator[dict[str, Any]]:
39
+ """Stream A2A-compatible chunks for the given query.
40
+
41
+ Args:
42
+ query (str): The query to execute and stream.
43
+ **kwargs (Any): Additional keyword arguments for execution.
44
+
45
+ Yields:
46
+ dict[str, Any]: A2A-compatible streaming chunks.
47
+ """
48
+
49
+
50
+ @runtime_checkable
51
+ class GoogleADKAgentProtocol(Protocol):
52
+ """Minimal interface required by GoogleADKExecutor."""
53
+
54
+ name: str
55
+
56
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncIterator[dict[str, Any]]:
57
+ """Stream A2A-compatible chunks for the given query.
58
+
59
+ Args:
60
+ query (str): The query to execute and stream.
61
+ **kwargs (Any): Additional keyword arguments for execution.
62
+
63
+ Yields:
64
+ dict[str, Any]: A2A-compatible streaming chunks.
65
+ """
@@ -0,0 +1,44 @@
1
+ from collections.abc import AsyncIterator
2
+ from typing import Any, Protocol
3
+
4
+ class LangGraphAgentProtocol(Protocol):
5
+ """Minimal interface required by LangGraphA2AExecutor."""
6
+ name: str
7
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncIterator[dict[str, Any]]:
8
+ """Stream A2A-compatible chunks for the given query.
9
+
10
+ Args:
11
+ query (str): The query to execute and stream.
12
+ **kwargs (Any): Additional keyword arguments for execution.
13
+
14
+ Yields:
15
+ dict[str, Any]: A2A-compatible streaming chunks.
16
+ """
17
+
18
+ class LangflowAgentProtocol(Protocol):
19
+ """Minimal interface required by LangflowA2AExecutor."""
20
+ name: str
21
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncIterator[dict[str, Any]]:
22
+ """Stream A2A-compatible chunks for the given query.
23
+
24
+ Args:
25
+ query (str): The query to execute and stream.
26
+ **kwargs (Any): Additional keyword arguments for execution.
27
+
28
+ Yields:
29
+ dict[str, Any]: A2A-compatible streaming chunks.
30
+ """
31
+
32
+ class GoogleADKAgentProtocol(Protocol):
33
+ """Minimal interface required by GoogleADKExecutor."""
34
+ name: str
35
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncIterator[dict[str, Any]]:
36
+ """Stream A2A-compatible chunks for the given query.
37
+
38
+ Args:
39
+ query (str): The query to execute and stream.
40
+ **kwargs (Any): Additional keyword arguments for execution.
41
+
42
+ Yields:
43
+ dict[str, Any]: A2A-compatible streaming chunks.
44
+ """