aip-agents-binary 0.5.20__py3-none-manylinux_2_31_x86_64.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 (546) 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 +2942 -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 +2514 -0
  54. aip_agents/agent/langgraph_react_agent.pyi +126 -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_bosa_twitter.py +41 -0
  183. aip_agents/examples/hello_world_langgraph_bosa_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/mcp/__init__.py +1 -0
  284. aip_agents/mcp/__init__.pyi +0 -0
  285. aip_agents/mcp/client/__init__.py +14 -0
  286. aip_agents/mcp/client/__init__.pyi +5 -0
  287. aip_agents/mcp/client/base_mcp_client.py +369 -0
  288. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  289. aip_agents/mcp/client/connection_manager.py +193 -0
  290. aip_agents/mcp/client/connection_manager.pyi +48 -0
  291. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  292. aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
  293. aip_agents/mcp/client/google_adk/client.py +381 -0
  294. aip_agents/mcp/client/google_adk/client.pyi +75 -0
  295. aip_agents/mcp/client/langchain/__init__.py +11 -0
  296. aip_agents/mcp/client/langchain/__init__.pyi +3 -0
  297. aip_agents/mcp/client/langchain/client.py +265 -0
  298. aip_agents/mcp/client/langchain/client.pyi +48 -0
  299. aip_agents/mcp/client/persistent_session.py +359 -0
  300. aip_agents/mcp/client/persistent_session.pyi +113 -0
  301. aip_agents/mcp/client/session_pool.py +351 -0
  302. aip_agents/mcp/client/session_pool.pyi +101 -0
  303. aip_agents/mcp/client/transports.py +215 -0
  304. aip_agents/mcp/client/transports.pyi +123 -0
  305. aip_agents/mcp/utils/__init__.py +7 -0
  306. aip_agents/mcp/utils/__init__.pyi +0 -0
  307. aip_agents/mcp/utils/config_validator.py +139 -0
  308. aip_agents/mcp/utils/config_validator.pyi +82 -0
  309. aip_agents/memory/__init__.py +14 -0
  310. aip_agents/memory/__init__.pyi +5 -0
  311. aip_agents/memory/adapters/__init__.py +10 -0
  312. aip_agents/memory/adapters/__init__.pyi +4 -0
  313. aip_agents/memory/adapters/base_adapter.py +717 -0
  314. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  315. aip_agents/memory/adapters/mem0.py +84 -0
  316. aip_agents/memory/adapters/mem0.pyi +22 -0
  317. aip_agents/memory/base.py +84 -0
  318. aip_agents/memory/base.pyi +60 -0
  319. aip_agents/memory/constants.py +49 -0
  320. aip_agents/memory/constants.pyi +25 -0
  321. aip_agents/memory/factory.py +86 -0
  322. aip_agents/memory/factory.pyi +24 -0
  323. aip_agents/memory/guidance.py +20 -0
  324. aip_agents/memory/guidance.pyi +3 -0
  325. aip_agents/memory/simple_memory.py +47 -0
  326. aip_agents/memory/simple_memory.pyi +23 -0
  327. aip_agents/middleware/__init__.py +17 -0
  328. aip_agents/middleware/__init__.pyi +5 -0
  329. aip_agents/middleware/base.py +88 -0
  330. aip_agents/middleware/base.pyi +71 -0
  331. aip_agents/middleware/manager.py +128 -0
  332. aip_agents/middleware/manager.pyi +80 -0
  333. aip_agents/middleware/todolist.py +274 -0
  334. aip_agents/middleware/todolist.pyi +125 -0
  335. aip_agents/schema/__init__.py +69 -0
  336. aip_agents/schema/__init__.pyi +9 -0
  337. aip_agents/schema/a2a.py +56 -0
  338. aip_agents/schema/a2a.pyi +40 -0
  339. aip_agents/schema/agent.py +111 -0
  340. aip_agents/schema/agent.pyi +65 -0
  341. aip_agents/schema/hitl.py +157 -0
  342. aip_agents/schema/hitl.pyi +89 -0
  343. aip_agents/schema/langgraph.py +37 -0
  344. aip_agents/schema/langgraph.pyi +28 -0
  345. aip_agents/schema/model_id.py +97 -0
  346. aip_agents/schema/model_id.pyi +54 -0
  347. aip_agents/schema/step_limit.py +108 -0
  348. aip_agents/schema/step_limit.pyi +63 -0
  349. aip_agents/schema/storage.py +40 -0
  350. aip_agents/schema/storage.pyi +21 -0
  351. aip_agents/sentry/__init__.py +11 -0
  352. aip_agents/sentry/__init__.pyi +3 -0
  353. aip_agents/sentry/sentry.py +151 -0
  354. aip_agents/sentry/sentry.pyi +48 -0
  355. aip_agents/storage/__init__.py +41 -0
  356. aip_agents/storage/__init__.pyi +8 -0
  357. aip_agents/storage/base.py +85 -0
  358. aip_agents/storage/base.pyi +58 -0
  359. aip_agents/storage/clients/__init__.py +12 -0
  360. aip_agents/storage/clients/__init__.pyi +3 -0
  361. aip_agents/storage/clients/minio_client.py +318 -0
  362. aip_agents/storage/clients/minio_client.pyi +137 -0
  363. aip_agents/storage/config.py +62 -0
  364. aip_agents/storage/config.pyi +29 -0
  365. aip_agents/storage/providers/__init__.py +15 -0
  366. aip_agents/storage/providers/__init__.pyi +5 -0
  367. aip_agents/storage/providers/base.py +106 -0
  368. aip_agents/storage/providers/base.pyi +88 -0
  369. aip_agents/storage/providers/memory.py +114 -0
  370. aip_agents/storage/providers/memory.pyi +79 -0
  371. aip_agents/storage/providers/object_storage.py +214 -0
  372. aip_agents/storage/providers/object_storage.pyi +98 -0
  373. aip_agents/tools/__init__.py +33 -0
  374. aip_agents/tools/__init__.pyi +13 -0
  375. aip_agents/tools/bosa_tools.py +105 -0
  376. aip_agents/tools/bosa_tools.pyi +37 -0
  377. aip_agents/tools/browser_use/__init__.py +82 -0
  378. aip_agents/tools/browser_use/__init__.pyi +14 -0
  379. aip_agents/tools/browser_use/action_parser.py +103 -0
  380. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  381. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  382. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  383. aip_agents/tools/browser_use/llm_config.py +120 -0
  384. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  385. aip_agents/tools/browser_use/minio_storage.py +198 -0
  386. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  387. aip_agents/tools/browser_use/schemas.py +119 -0
  388. aip_agents/tools/browser_use/schemas.pyi +32 -0
  389. aip_agents/tools/browser_use/session.py +76 -0
  390. aip_agents/tools/browser_use/session.pyi +4 -0
  391. aip_agents/tools/browser_use/session_errors.py +132 -0
  392. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  393. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  394. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  395. aip_agents/tools/browser_use/streaming.py +813 -0
  396. aip_agents/tools/browser_use/streaming.pyi +81 -0
  397. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  398. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  399. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  400. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  401. aip_agents/tools/browser_use/types.py +78 -0
  402. aip_agents/tools/browser_use/types.pyi +45 -0
  403. aip_agents/tools/code_sandbox/__init__.py +26 -0
  404. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  405. aip_agents/tools/code_sandbox/constant.py +13 -0
  406. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  407. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
  408. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -0
  409. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  410. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  411. aip_agents/tools/constants.py +165 -0
  412. aip_agents/tools/constants.pyi +135 -0
  413. aip_agents/tools/document_loader/__init__.py +44 -0
  414. aip_agents/tools/document_loader/__init__.pyi +7 -0
  415. aip_agents/tools/document_loader/base_reader.py +302 -0
  416. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  417. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  418. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  419. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  420. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  421. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  422. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  423. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  424. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  425. aip_agents/tools/gl_connector/__init__.py +5 -0
  426. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  427. aip_agents/tools/gl_connector/tool.py +351 -0
  428. aip_agents/tools/gl_connector/tool.pyi +74 -0
  429. aip_agents/tools/memory_search/__init__.py +22 -0
  430. aip_agents/tools/memory_search/__init__.pyi +5 -0
  431. aip_agents/tools/memory_search/base.py +200 -0
  432. aip_agents/tools/memory_search/base.pyi +69 -0
  433. aip_agents/tools/memory_search/mem0.py +258 -0
  434. aip_agents/tools/memory_search/mem0.pyi +19 -0
  435. aip_agents/tools/memory_search/schema.py +48 -0
  436. aip_agents/tools/memory_search/schema.pyi +15 -0
  437. aip_agents/tools/memory_search_tool.py +26 -0
  438. aip_agents/tools/memory_search_tool.pyi +3 -0
  439. aip_agents/tools/time_tool.py +117 -0
  440. aip_agents/tools/time_tool.pyi +16 -0
  441. aip_agents/tools/tool_config_injector.py +300 -0
  442. aip_agents/tools/tool_config_injector.pyi +26 -0
  443. aip_agents/tools/web_search/__init__.py +15 -0
  444. aip_agents/tools/web_search/__init__.pyi +3 -0
  445. aip_agents/tools/web_search/serper_tool.py +187 -0
  446. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  447. aip_agents/types/__init__.py +70 -0
  448. aip_agents/types/__init__.pyi +36 -0
  449. aip_agents/types/a2a_events.py +13 -0
  450. aip_agents/types/a2a_events.pyi +3 -0
  451. aip_agents/utils/__init__.py +79 -0
  452. aip_agents/utils/__init__.pyi +11 -0
  453. aip_agents/utils/a2a_connector.py +1757 -0
  454. aip_agents/utils/a2a_connector.pyi +146 -0
  455. aip_agents/utils/artifact_helpers.py +502 -0
  456. aip_agents/utils/artifact_helpers.pyi +203 -0
  457. aip_agents/utils/constants.py +22 -0
  458. aip_agents/utils/constants.pyi +10 -0
  459. aip_agents/utils/datetime/__init__.py +34 -0
  460. aip_agents/utils/datetime/__init__.pyi +4 -0
  461. aip_agents/utils/datetime/normalization.py +231 -0
  462. aip_agents/utils/datetime/normalization.pyi +95 -0
  463. aip_agents/utils/datetime/timezone.py +206 -0
  464. aip_agents/utils/datetime/timezone.pyi +48 -0
  465. aip_agents/utils/env_loader.py +27 -0
  466. aip_agents/utils/env_loader.pyi +10 -0
  467. aip_agents/utils/event_handler_registry.py +58 -0
  468. aip_agents/utils/event_handler_registry.pyi +23 -0
  469. aip_agents/utils/file_prompt_utils.py +176 -0
  470. aip_agents/utils/file_prompt_utils.pyi +21 -0
  471. aip_agents/utils/final_response_builder.py +211 -0
  472. aip_agents/utils/final_response_builder.pyi +34 -0
  473. aip_agents/utils/formatter_llm_client.py +231 -0
  474. aip_agents/utils/formatter_llm_client.pyi +71 -0
  475. aip_agents/utils/langgraph/__init__.py +19 -0
  476. aip_agents/utils/langgraph/__init__.pyi +3 -0
  477. aip_agents/utils/langgraph/converter.py +128 -0
  478. aip_agents/utils/langgraph/converter.pyi +49 -0
  479. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  480. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  481. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  482. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  483. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  484. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  485. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  486. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  487. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  488. aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
  489. aip_agents/utils/logger.py +195 -0
  490. aip_agents/utils/logger.pyi +60 -0
  491. aip_agents/utils/metadata/__init__.py +27 -0
  492. aip_agents/utils/metadata/__init__.pyi +5 -0
  493. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  494. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  495. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  496. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  497. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  498. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  499. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  500. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  501. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  502. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  503. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  504. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  505. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  506. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  507. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  508. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  509. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  510. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  511. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  512. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  513. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  514. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  515. aip_agents/utils/metadata_helper.py +358 -0
  516. aip_agents/utils/metadata_helper.pyi +117 -0
  517. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  518. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  519. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  520. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  521. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  522. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  523. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  524. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  525. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  526. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  527. aip_agents/utils/pii/__init__.py +25 -0
  528. aip_agents/utils/pii/__init__.pyi +5 -0
  529. aip_agents/utils/pii/pii_handler.py +397 -0
  530. aip_agents/utils/pii/pii_handler.pyi +96 -0
  531. aip_agents/utils/pii/pii_helper.py +207 -0
  532. aip_agents/utils/pii/pii_helper.pyi +78 -0
  533. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  534. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  535. aip_agents/utils/reference_helper.py +273 -0
  536. aip_agents/utils/reference_helper.pyi +81 -0
  537. aip_agents/utils/sse_chunk_transformer.py +831 -0
  538. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  539. aip_agents/utils/step_limit_manager.py +265 -0
  540. aip_agents/utils/step_limit_manager.pyi +112 -0
  541. aip_agents/utils/token_usage_helper.py +156 -0
  542. aip_agents/utils/token_usage_helper.pyi +60 -0
  543. aip_agents_binary-0.5.20.dist-info/METADATA +681 -0
  544. aip_agents_binary-0.5.20.dist-info/RECORD +546 -0
  545. aip_agents_binary-0.5.20.dist-info/WHEEL +5 -0
  546. aip_agents_binary-0.5.20.dist-info/top_level.txt +1 -0
@@ -0,0 +1,270 @@
1
+ """Base executor class for LangChain-based A2A executors.
2
+
3
+ This module provides a common base class for executors that work with LangChain-based
4
+ agents, such as LangChainAgent and LangGraphAgent. It implements shared functionality
5
+ for handling streaming responses and managing agent execution.
6
+
7
+ Authors:
8
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
9
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
10
+ """
11
+
12
+ import asyncio
13
+ from abc import ABC
14
+ from typing import Any
15
+
16
+ from a2a.server.agent_execution import RequestContext
17
+ from a2a.server.events.event_queue import EventQueue
18
+ from a2a.server.tasks import TaskUpdater
19
+ from a2a.types import TaskState
20
+ from a2a.utils import new_agent_text_message
21
+
22
+ from aip_agents.a2a.server.base_executor import BaseA2AExecutor, StatusUpdateParams
23
+ from aip_agents.agent.interfaces import LangGraphAgentProtocol
24
+ from aip_agents.schema.step_limit import StepLimitConfig
25
+ from aip_agents.utils.logger import get_logger
26
+
27
+ logger = get_logger(__name__)
28
+
29
+
30
+ class LangGraphA2AExecutor(BaseA2AExecutor, ABC):
31
+ """Base class for LangChain-based A2A executors.
32
+
33
+ This class extends BaseA2AExecutor to provide common functionality for executors
34
+ that work with LangChain-based agents (LangChainAgent and LangGraphAgent).
35
+ It implements shared methods for handling streaming responses and managing
36
+ agent execution, while leaving agent-specific initialization to subclasses.
37
+
38
+ Attributes:
39
+ agent (LangGraphAgentProtocol): The LangChain-based agent instance to be executed.
40
+ """
41
+
42
+ agent: LangGraphAgentProtocol
43
+
44
+ def __init__(self, langgraph_agent_instance: LangGraphAgentProtocol) -> None:
45
+ """Initializes the LangGraphA2AExecutor.
46
+
47
+ Args:
48
+ langgraph_agent_instance: Component implementing `LangGraphAgentProtocol`.
49
+
50
+ Raises:
51
+ TypeError: If the provided agent does not satisfy `LangGraphAgentProtocol`.
52
+ """
53
+ super().__init__()
54
+
55
+ if not isinstance(langgraph_agent_instance, LangGraphAgentProtocol):
56
+ _type_name = type(langgraph_agent_instance).__name__
57
+ raise TypeError(
58
+ f"LangGraphA2AExecutor expected an agent implementing LangGraphAgentProtocol, got {_type_name}"
59
+ )
60
+ self.agent = langgraph_agent_instance
61
+
62
+ async def execute(
63
+ self,
64
+ context: RequestContext,
65
+ event_queue: EventQueue,
66
+ ) -> None:
67
+ """Processes an incoming agent request using a LangChain-based agent.
68
+
69
+ This method first performs initial checks using _handle_initial_execute_checks.
70
+ If successful, it prepares the _process_stream coroutine and passes it to
71
+ _execute_agent_processing from the base class to manage its lifecycle.
72
+ The _process_stream method is responsible for calling the agent's
73
+ arun_a2a_stream and handling its output.
74
+
75
+ Args:
76
+ context (RequestContext): The A2A request context containing message details,
77
+ task ID, and context ID.
78
+ event_queue (EventQueue): The queue for sending A2A events (task status,
79
+ artifacts) back to the server.
80
+ """
81
+ updater, query, metadata = await self._handle_initial_execute_checks(context, event_queue)
82
+ if not updater or query is None: # Checks failed, status already sent
83
+ return
84
+
85
+ agent_processing_coro = self._process_stream(
86
+ query=query,
87
+ updater=updater,
88
+ task_id=context.task_id,
89
+ context_id=context.context_id,
90
+ event_queue=event_queue,
91
+ metadata=metadata,
92
+ )
93
+
94
+ await self._execute_agent_processing(
95
+ agent_processing_coro=agent_processing_coro,
96
+ updater=updater,
97
+ task_id=context.task_id,
98
+ context_id=context.context_id,
99
+ )
100
+
101
+ def _get_configurable_kwargs(self, task_id: str) -> dict[str, Any]:
102
+ """Get configurable kwargs for agent delegation.
103
+
104
+ Args:
105
+ task_id: The A2A task ID.
106
+
107
+ Returns:
108
+ dict[str, Any]: A dictionary with 'configurable' key if the agent
109
+ has 'thread_id_key', otherwise an empty dictionary.
110
+ """
111
+ if hasattr(self.agent, "thread_id_key"):
112
+ return {"configurable": {self.agent.thread_id_key: task_id}}
113
+ return {}
114
+
115
+ def _build_agent_kwargs(
116
+ self,
117
+ task_id: str,
118
+ metadata: dict[str, Any] | None,
119
+ ) -> dict[str, Any]:
120
+ """Build kwargs for agent stream execution from task and metadata.
121
+
122
+ Args:
123
+ task_id: The A2A task ID for configurable threading settings.
124
+ metadata: Optional request metadata, including files and overrides.
125
+
126
+ Returns:
127
+ dict[str, Any]: Keyword arguments to pass to the agent's stream method.
128
+ """
129
+ kwargs = self._get_configurable_kwargs(task_id)
130
+
131
+ files: list[str | dict[str, Any]] = self._extract_files_from_metadata(metadata)
132
+ if metadata is not None:
133
+ kwargs["metadata"] = metadata
134
+ if isinstance(metadata, dict):
135
+ raw_user_id = metadata.get("memory_user_id") or metadata.get("user_id")
136
+ if raw_user_id:
137
+ kwargs["memory_user_id"] = str(raw_user_id)
138
+
139
+ raw_pii_mapping = metadata.get("pii_mapping")
140
+ if isinstance(raw_pii_mapping, dict) and raw_pii_mapping:
141
+ kwargs["pii_mapping"] = dict(raw_pii_mapping)
142
+
143
+ # Extract invocation-level step limit overrides (Docs-1)
144
+ raw_step_limit_config = metadata.get("step_limit_config")
145
+ if isinstance(raw_step_limit_config, dict | StepLimitConfig):
146
+ kwargs["step_limit_config"] = raw_step_limit_config
147
+ if files:
148
+ kwargs["files"] = files
149
+
150
+ return kwargs
151
+
152
+ async def _process_stream( # noqa: PLR0913
153
+ self,
154
+ query: str,
155
+ updater: TaskUpdater,
156
+ task_id: str,
157
+ context_id: str,
158
+ event_queue: EventQueue,
159
+ metadata: dict[str, Any] | None = None,
160
+ ) -> None:
161
+ """Processes the streaming response from a LangChain-based agent.
162
+
163
+ This coroutine invokes the agent.arun_a2a_stream method with the given query and metadata.
164
+ It then iterates over the asynchronous stream of dictionary chunks yielded by
165
+ the agent. Each chunk is passed to _handle_stream_event from the base class
166
+ to interpret common A2A statuses (working, completed, failed, etc.) and update
167
+ the A2A task accordingly.
168
+
169
+ If asyncio.CancelledError is raised (typically from the task managed by
170
+ _execute_agent_processing), it is re-raised to be handled by the base class.
171
+ Other exceptions during streaming are caught, logged, an A2A 'failed' status
172
+ is sent, and the exception is re-raised.
173
+
174
+ Args:
175
+ query (str): The query string to be processed by the agent.
176
+ updater (TaskUpdater): The TaskUpdater instance for sending status updates.
177
+ task_id (str): The A2A task ID.
178
+ context_id (str): The A2A context ID.
179
+ event_queue (EventQueue): The A2A event queue for sending artifact events.
180
+ metadata (dict[str, Any] | None): Optional metadata from the A2A request.
181
+
182
+ Raises:
183
+ asyncio.CancelledError: If the task is cancelled externally.
184
+ Exception: If any other error occurs during the agent's stream processing.
185
+ """
186
+ stream = None
187
+ try:
188
+ kwargs = self._build_agent_kwargs(task_id=task_id, metadata=metadata)
189
+
190
+ stream = self.agent.arun_a2a_stream(query=query, **kwargs)
191
+
192
+ current_metadata: dict[str, Any] = metadata.copy() if metadata else {}
193
+
194
+ async for chunk in stream:
195
+ chunk_metadata = chunk.get("metadata")
196
+ if chunk_metadata is not None:
197
+ try:
198
+ current_metadata.update(chunk_metadata)
199
+ except Exception as e:
200
+ logger.warning(f"Invalid metadata payload from chunk: {chunk_metadata}, error: {e}")
201
+
202
+ should_terminate = await self._handle_stream_event(
203
+ chunk=chunk,
204
+ updater=updater,
205
+ task_id=task_id,
206
+ context_id=context_id,
207
+ event_queue=event_queue,
208
+ metadata=current_metadata if current_metadata else None,
209
+ )
210
+ if should_terminate:
211
+ return
212
+
213
+ except asyncio.CancelledError:
214
+ logger.info(f"LangChain stream processing for task {task_id} was cancelled.")
215
+ raise
216
+ except Exception as e:
217
+ logger.error(
218
+ f"Error during LangChain agent streaming for task {task_id}: {e}",
219
+ exc_info=True,
220
+ )
221
+ await self._update_status(
222
+ updater,
223
+ TaskState.failed,
224
+ message=new_agent_text_message(
225
+ f"Error during streaming: {str(e)}",
226
+ context_id=context_id,
227
+ task_id=task_id,
228
+ ),
229
+ params=StatusUpdateParams(final=True, task_id=task_id, context_id=context_id),
230
+ )
231
+ raise
232
+
233
+ @staticmethod
234
+ def _extract_files_from_metadata(metadata: dict[str, Any] | None) -> list[str | dict[str, Any]]:
235
+ """Extract file paths from metadata, removing them since they are passed via kwargs.
236
+
237
+ Args:
238
+ metadata: Metadata dict from the request, potentially containing files.
239
+
240
+ Returns:
241
+ List of non-empty file path strings or file metadata dictionaries.
242
+ """
243
+ if not isinstance(metadata, dict):
244
+ return []
245
+
246
+ try:
247
+ raw_files = metadata.pop("files", None)
248
+ except AttributeError:
249
+ return []
250
+ if raw_files is None:
251
+ return []
252
+
253
+ if not isinstance(raw_files, list):
254
+ logger.warning("Invalid 'files' metadata received; expected list of strings or dicts.")
255
+ return []
256
+
257
+ normalized_files: list[str | dict[str, Any]] = []
258
+ invalid_entry_logged = False
259
+ for entry in raw_files:
260
+ if isinstance(entry, str) and entry:
261
+ normalized_files.append(entry)
262
+ continue
263
+ if isinstance(entry, dict):
264
+ normalized_files.append(entry)
265
+ continue
266
+ if not invalid_entry_logged:
267
+ logger.warning("Invalid file metadata entry received; expected string or dict.")
268
+ invalid_entry_logged = True
269
+
270
+ return normalized_files
@@ -0,0 +1,47 @@
1
+ from _typeshed import Incomplete
2
+ from a2a.server.agent_execution import RequestContext
3
+ from a2a.server.events.event_queue import EventQueue
4
+ from abc import ABC
5
+ from aip_agents.a2a.server.base_executor import BaseA2AExecutor as BaseA2AExecutor, StatusUpdateParams as StatusUpdateParams
6
+ from aip_agents.agent.interfaces import LangGraphAgentProtocol as LangGraphAgentProtocol
7
+ from aip_agents.schema.step_limit import StepLimitConfig as StepLimitConfig
8
+ from aip_agents.utils.logger import get_logger as get_logger
9
+
10
+ logger: Incomplete
11
+
12
+ class LangGraphA2AExecutor(BaseA2AExecutor, ABC):
13
+ """Base class for LangChain-based A2A executors.
14
+
15
+ This class extends BaseA2AExecutor to provide common functionality for executors
16
+ that work with LangChain-based agents (LangChainAgent and LangGraphAgent).
17
+ It implements shared methods for handling streaming responses and managing
18
+ agent execution, while leaving agent-specific initialization to subclasses.
19
+
20
+ Attributes:
21
+ agent (LangGraphAgentProtocol): The LangChain-based agent instance to be executed.
22
+ """
23
+ agent: LangGraphAgentProtocol
24
+ def __init__(self, langgraph_agent_instance: LangGraphAgentProtocol) -> None:
25
+ """Initializes the LangGraphA2AExecutor.
26
+
27
+ Args:
28
+ langgraph_agent_instance: Component implementing `LangGraphAgentProtocol`.
29
+
30
+ Raises:
31
+ TypeError: If the provided agent does not satisfy `LangGraphAgentProtocol`.
32
+ """
33
+ async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
34
+ """Processes an incoming agent request using a LangChain-based agent.
35
+
36
+ This method first performs initial checks using _handle_initial_execute_checks.
37
+ If successful, it prepares the _process_stream coroutine and passes it to
38
+ _execute_agent_processing from the base class to manage its lifecycle.
39
+ The _process_stream method is responsible for calling the agent's
40
+ arun_a2a_stream and handling its output.
41
+
42
+ Args:
43
+ context (RequestContext): The A2A request context containing message details,
44
+ task ID, and context ID.
45
+ event_queue (EventQueue): The queue for sending A2A events (task status,
46
+ artifacts) back to the server.
47
+ """
@@ -0,0 +1,232 @@
1
+ """Type definitions and constants for A2A artifact generation.
2
+
3
+ This module provides common MIME types, artifact types, and other constants
4
+ used in A2A artifact generation to ensure consistency across the codebase.
5
+
6
+ Authors:
7
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
8
+ """
9
+
10
+ import base64
11
+ from enum import StrEnum
12
+ from typing import Any
13
+
14
+ from pydantic import BaseModel, Field, field_validator
15
+
16
+
17
+ class MimeType(StrEnum):
18
+ """Common MIME types for A2A artifacts.
19
+
20
+ This class provides constants for commonly used MIME types in artifact generation,
21
+ ensuring consistency and reducing typos across the codebase.
22
+ """
23
+
24
+ # Text formats
25
+ TEXT_PLAIN = "text/plain"
26
+ TEXT_HTML = "text/html"
27
+ TEXT_CSS = "text/css"
28
+ TEXT_JAVASCRIPT = "text/javascript"
29
+ TEXT_CSV = "text/csv"
30
+ TEXT_XML = "text/xml"
31
+ TEXT_MARKDOWN = "text/markdown"
32
+
33
+ # Application formats
34
+ APPLICATION_JSON = "application/json"
35
+ APPLICATION_XML = "application/xml"
36
+ APPLICATION_PDF = "application/pdf"
37
+ APPLICATION_ZIP = "application/zip"
38
+ APPLICATION_GZIP = "application/gzip"
39
+ APPLICATION_TAR = "application/x-tar"
40
+ APPLICATION_OCTET_STREAM = "application/octet-stream"
41
+
42
+ # Microsoft Office formats
43
+ APPLICATION_MSWORD = "application/msword"
44
+ APPLICATION_EXCEL = "application/vnd.ms-excel"
45
+ APPLICATION_POWERPOINT = "application/vnd.ms-powerpoint"
46
+ APPLICATION_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
47
+ APPLICATION_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
48
+ APPLICATION_PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation"
49
+
50
+ # Image formats
51
+ IMAGE_JPEG = "image/jpeg"
52
+ IMAGE_PNG = "image/png"
53
+ IMAGE_GIF = "image/gif"
54
+ IMAGE_WEBP = "image/webp"
55
+ IMAGE_SVG = "image/svg+xml"
56
+ IMAGE_BMP = "image/bmp"
57
+ IMAGE_TIFF = "image/tiff"
58
+ IMAGE_ICO = "image/x-icon"
59
+
60
+ # Audio formats
61
+ AUDIO_MP3 = "audio/mpeg"
62
+ AUDIO_WAV = "audio/wav"
63
+ AUDIO_OGG = "audio/ogg"
64
+ AUDIO_AAC = "audio/aac"
65
+ AUDIO_FLAC = "audio/flac"
66
+
67
+ # Video formats
68
+ VIDEO_MP4 = "video/mp4"
69
+ VIDEO_AVI = "video/x-msvideo"
70
+ VIDEO_MOV = "video/quicktime"
71
+ VIDEO_WMV = "video/x-ms-wmv"
72
+ VIDEO_WEBM = "video/webm"
73
+ VIDEO_MKV = "video/x-matroska"
74
+
75
+ # Font formats
76
+ FONT_TTF = "font/ttf"
77
+ FONT_OTF = "font/otf"
78
+ FONT_WOFF = "font/woff"
79
+ FONT_WOFF2 = "font/woff2"
80
+
81
+
82
+ class ArtifactType(StrEnum):
83
+ """Common artifact types for A2A artifacts.
84
+
85
+ This class provides constants for artifact types used in the A2A protocol.
86
+ """
87
+
88
+ FILE = "file"
89
+ DATA = "data"
90
+ TEXT = "text"
91
+
92
+
93
+ # Common file extension to MIME type mappings
94
+ EXTENSION_TO_MIME_TYPE = {
95
+ # Text files
96
+ ".txt": MimeType.TEXT_PLAIN,
97
+ ".html": MimeType.TEXT_HTML,
98
+ ".htm": MimeType.TEXT_HTML,
99
+ ".css": MimeType.TEXT_CSS,
100
+ ".js": MimeType.TEXT_JAVASCRIPT,
101
+ ".csv": MimeType.TEXT_CSV,
102
+ ".xml": MimeType.TEXT_XML,
103
+ ".md": MimeType.TEXT_MARKDOWN,
104
+ ".markdown": MimeType.TEXT_MARKDOWN,
105
+ # Application files
106
+ ".json": MimeType.APPLICATION_JSON,
107
+ ".pdf": MimeType.APPLICATION_PDF,
108
+ ".zip": MimeType.APPLICATION_ZIP,
109
+ ".gz": MimeType.APPLICATION_GZIP,
110
+ ".tar": MimeType.APPLICATION_TAR,
111
+ # Microsoft Office
112
+ ".doc": MimeType.APPLICATION_MSWORD,
113
+ ".xls": MimeType.APPLICATION_EXCEL,
114
+ ".ppt": MimeType.APPLICATION_POWERPOINT,
115
+ ".docx": MimeType.APPLICATION_DOCX,
116
+ ".xlsx": MimeType.APPLICATION_XLSX,
117
+ ".pptx": MimeType.APPLICATION_PPTX,
118
+ # Images
119
+ ".jpg": MimeType.IMAGE_JPEG,
120
+ ".jpeg": MimeType.IMAGE_JPEG,
121
+ ".png": MimeType.IMAGE_PNG,
122
+ ".gif": MimeType.IMAGE_GIF,
123
+ ".webp": MimeType.IMAGE_WEBP,
124
+ ".svg": MimeType.IMAGE_SVG,
125
+ ".bmp": MimeType.IMAGE_BMP,
126
+ ".tiff": MimeType.IMAGE_TIFF,
127
+ ".tif": MimeType.IMAGE_TIFF,
128
+ ".ico": MimeType.IMAGE_ICO,
129
+ # Audio
130
+ ".mp3": MimeType.AUDIO_MP3,
131
+ ".wav": MimeType.AUDIO_WAV,
132
+ ".ogg": MimeType.AUDIO_OGG,
133
+ ".aac": MimeType.AUDIO_AAC,
134
+ ".flac": MimeType.AUDIO_FLAC,
135
+ # Video
136
+ ".mp4": MimeType.VIDEO_MP4,
137
+ ".avi": MimeType.VIDEO_AVI,
138
+ ".mov": MimeType.VIDEO_MOV,
139
+ ".wmv": MimeType.VIDEO_WMV,
140
+ ".webm": MimeType.VIDEO_WEBM,
141
+ ".mkv": MimeType.VIDEO_MKV,
142
+ # Fonts
143
+ ".ttf": MimeType.FONT_TTF,
144
+ ".otf": MimeType.FONT_OTF,
145
+ ".woff": MimeType.FONT_WOFF,
146
+ ".woff2": MimeType.FONT_WOFF2,
147
+ }
148
+ MIME_TYPE_TO_EXTENSION = {v: k for k, v in EXTENSION_TO_MIME_TYPE.items()}
149
+
150
+
151
+ def get_mime_type_from_filename(filename: str) -> str:
152
+ """Get MIME type from filename extension.
153
+
154
+ Args:
155
+ filename: The filename to get the MIME type for.
156
+
157
+ Returns:
158
+ The MIME type string, or application/octet-stream if unknown.
159
+
160
+ Example:
161
+ >>> get_mime_type_from_filename("data.csv")
162
+ 'text/csv'
163
+ >>> get_mime_type_from_filename("image.png")
164
+ 'image/png'
165
+ >>> get_mime_type_from_filename("unknown.xyz")
166
+ 'application/octet-stream'
167
+ """
168
+ if "." not in filename:
169
+ return MimeType.APPLICATION_OCTET_STREAM
170
+
171
+ extension = "." + filename.split(".")[-1].lower()
172
+ return EXTENSION_TO_MIME_TYPE.get(extension, MimeType.APPLICATION_OCTET_STREAM)
173
+
174
+
175
+ def get_extension_from_mime_type(mime_type: str) -> str | None:
176
+ """Get file extension from MIME type.
177
+
178
+ Args:
179
+ mime_type: The MIME type to get the extension for.
180
+
181
+ Returns:
182
+ The file extension (with dot) or None if not found.
183
+
184
+ Example:
185
+ >>> get_extension_from_mime_type("text/csv")
186
+ '.csv'
187
+ >>> get_extension_from_mime_type("image/png")
188
+ '.png'
189
+ >>> get_extension_from_mime_type("unknown/type")
190
+ None
191
+ """
192
+ return MIME_TYPE_TO_EXTENSION.get(mime_type)
193
+
194
+
195
+ class Artifact(BaseModel):
196
+ """Represents an artifact payload used by A2A helpers and executors.
197
+
198
+ This model standardizes the structure for artifacts generated by tools and
199
+ passed through the A2A pipeline.
200
+
201
+ Attributes:
202
+ artifact_type (ArtifactType): The type of artifact. Defaults to FILE.
203
+ data (str): Base64-encoded content of the artifact.
204
+ name (str): Display name or filename of the artifact.
205
+ description (str): Optional description for the artifact. Defaults to empty string.
206
+ mime_type (str): MIME type of the artifact content.
207
+ metadata (dict[str, Any] | None): Optional per-artifact metadata to pass through.
208
+ """
209
+
210
+ artifact_type: ArtifactType = Field(default=ArtifactType.FILE)
211
+ data: str
212
+ name: str
213
+ description: str = ""
214
+ mime_type: str
215
+ metadata: dict[str, Any] | None = None
216
+
217
+ @field_validator("data")
218
+ @classmethod
219
+ def validate_base64(cls, v: str) -> str:
220
+ """Validate that 'data' is a valid base64 string.
221
+
222
+ Args:
223
+ v (str): The base64 string to validate.
224
+
225
+ Returns:
226
+ str: The validated base64 string if valid.
227
+ """
228
+ try:
229
+ base64.b64decode(v, validate=True)
230
+ except Exception as exc: # noqa: BLE001
231
+ raise ValueError("Artifact.data must be a valid base64-encoded string") from exc
232
+ return v
@@ -0,0 +1,132 @@
1
+ from _typeshed import Incomplete
2
+ from enum import StrEnum
3
+ from pydantic import BaseModel
4
+ from typing import Any
5
+
6
+ class MimeType(StrEnum):
7
+ """Common MIME types for A2A artifacts.
8
+
9
+ This class provides constants for commonly used MIME types in artifact generation,
10
+ ensuring consistency and reducing typos across the codebase.
11
+ """
12
+ TEXT_PLAIN: str
13
+ TEXT_HTML: str
14
+ TEXT_CSS: str
15
+ TEXT_JAVASCRIPT: str
16
+ TEXT_CSV: str
17
+ TEXT_XML: str
18
+ TEXT_MARKDOWN: str
19
+ APPLICATION_JSON: str
20
+ APPLICATION_XML: str
21
+ APPLICATION_PDF: str
22
+ APPLICATION_ZIP: str
23
+ APPLICATION_GZIP: str
24
+ APPLICATION_TAR: str
25
+ APPLICATION_OCTET_STREAM: str
26
+ APPLICATION_MSWORD: str
27
+ APPLICATION_EXCEL: str
28
+ APPLICATION_POWERPOINT: str
29
+ APPLICATION_DOCX: str
30
+ APPLICATION_XLSX: str
31
+ APPLICATION_PPTX: str
32
+ IMAGE_JPEG: str
33
+ IMAGE_PNG: str
34
+ IMAGE_GIF: str
35
+ IMAGE_WEBP: str
36
+ IMAGE_SVG: str
37
+ IMAGE_BMP: str
38
+ IMAGE_TIFF: str
39
+ IMAGE_ICO: str
40
+ AUDIO_MP3: str
41
+ AUDIO_WAV: str
42
+ AUDIO_OGG: str
43
+ AUDIO_AAC: str
44
+ AUDIO_FLAC: str
45
+ VIDEO_MP4: str
46
+ VIDEO_AVI: str
47
+ VIDEO_MOV: str
48
+ VIDEO_WMV: str
49
+ VIDEO_WEBM: str
50
+ VIDEO_MKV: str
51
+ FONT_TTF: str
52
+ FONT_OTF: str
53
+ FONT_WOFF: str
54
+ FONT_WOFF2: str
55
+
56
+ class ArtifactType(StrEnum):
57
+ """Common artifact types for A2A artifacts.
58
+
59
+ This class provides constants for artifact types used in the A2A protocol.
60
+ """
61
+ FILE: str
62
+ DATA: str
63
+ TEXT: str
64
+
65
+ EXTENSION_TO_MIME_TYPE: Incomplete
66
+ MIME_TYPE_TO_EXTENSION: Incomplete
67
+
68
+ def get_mime_type_from_filename(filename: str) -> str:
69
+ '''Get MIME type from filename extension.
70
+
71
+ Args:
72
+ filename: The filename to get the MIME type for.
73
+
74
+ Returns:
75
+ The MIME type string, or application/octet-stream if unknown.
76
+
77
+ Example:
78
+ >>> get_mime_type_from_filename("data.csv")
79
+ \'text/csv\'
80
+ >>> get_mime_type_from_filename("image.png")
81
+ \'image/png\'
82
+ >>> get_mime_type_from_filename("unknown.xyz")
83
+ \'application/octet-stream\'
84
+ '''
85
+ def get_extension_from_mime_type(mime_type: str) -> str | None:
86
+ '''Get file extension from MIME type.
87
+
88
+ Args:
89
+ mime_type: The MIME type to get the extension for.
90
+
91
+ Returns:
92
+ The file extension (with dot) or None if not found.
93
+
94
+ Example:
95
+ >>> get_extension_from_mime_type("text/csv")
96
+ \'.csv\'
97
+ >>> get_extension_from_mime_type("image/png")
98
+ \'.png\'
99
+ >>> get_extension_from_mime_type("unknown/type")
100
+ None
101
+ '''
102
+
103
+ class Artifact(BaseModel):
104
+ """Represents an artifact payload used by A2A helpers and executors.
105
+
106
+ This model standardizes the structure for artifacts generated by tools and
107
+ passed through the A2A pipeline.
108
+
109
+ Attributes:
110
+ artifact_type (ArtifactType): The type of artifact. Defaults to FILE.
111
+ data (str): Base64-encoded content of the artifact.
112
+ name (str): Display name or filename of the artifact.
113
+ description (str): Optional description for the artifact. Defaults to empty string.
114
+ mime_type (str): MIME type of the artifact content.
115
+ metadata (dict[str, Any] | None): Optional per-artifact metadata to pass through.
116
+ """
117
+ artifact_type: ArtifactType
118
+ data: str
119
+ name: str
120
+ description: str
121
+ mime_type: str
122
+ metadata: dict[str, Any] | None
123
+ @classmethod
124
+ def validate_base64(cls, v: str) -> str:
125
+ """Validate that 'data' is a valid base64 string.
126
+
127
+ Args:
128
+ v (str): The base64 string to validate.
129
+
130
+ Returns:
131
+ str: The validated base64 string if valid.
132
+ """