aip-agents-binary 0.5.25b1__py3-none-macosx_13_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/__init__.pyi +19 -0
  3. aip_agents/a2a/__init__.py +19 -0
  4. aip_agents/a2a/__init__.pyi +3 -0
  5. aip_agents/a2a/server/__init__.py +10 -0
  6. aip_agents/a2a/server/__init__.pyi +4 -0
  7. aip_agents/a2a/server/base_executor.py +1086 -0
  8. aip_agents/a2a/server/base_executor.pyi +73 -0
  9. aip_agents/a2a/server/google_adk_executor.py +198 -0
  10. aip_agents/a2a/server/google_adk_executor.pyi +51 -0
  11. aip_agents/a2a/server/langflow_executor.py +180 -0
  12. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  13. aip_agents/a2a/server/langgraph_executor.py +270 -0
  14. aip_agents/a2a/server/langgraph_executor.pyi +47 -0
  15. aip_agents/a2a/types.py +232 -0
  16. aip_agents/a2a/types.pyi +132 -0
  17. aip_agents/agent/__init__.py +27 -0
  18. aip_agents/agent/__init__.pyi +9 -0
  19. aip_agents/agent/base_agent.py +970 -0
  20. aip_agents/agent/base_agent.pyi +221 -0
  21. aip_agents/agent/base_langgraph_agent.py +2948 -0
  22. aip_agents/agent/base_langgraph_agent.pyi +232 -0
  23. aip_agents/agent/google_adk_agent.py +926 -0
  24. aip_agents/agent/google_adk_agent.pyi +141 -0
  25. aip_agents/agent/google_adk_constants.py +6 -0
  26. aip_agents/agent/google_adk_constants.pyi +3 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/__init__.pyi +6 -0
  29. aip_agents/agent/hitl/config.py +28 -0
  30. aip_agents/agent/hitl/config.pyi +15 -0
  31. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  32. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  33. aip_agents/agent/hitl/manager.py +532 -0
  34. aip_agents/agent/hitl/manager.pyi +200 -0
  35. aip_agents/agent/hitl/models.py +18 -0
  36. aip_agents/agent/hitl/models.pyi +3 -0
  37. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  38. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  39. aip_agents/agent/hitl/prompt/base.py +42 -0
  40. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  41. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  42. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  43. aip_agents/agent/hitl/registry.py +149 -0
  44. aip_agents/agent/hitl/registry.pyi +101 -0
  45. aip_agents/agent/interface.py +138 -0
  46. aip_agents/agent/interface.pyi +81 -0
  47. aip_agents/agent/interfaces.py +65 -0
  48. aip_agents/agent/interfaces.pyi +44 -0
  49. aip_agents/agent/langflow_agent.py +464 -0
  50. aip_agents/agent/langflow_agent.pyi +133 -0
  51. aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
  52. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
  53. aip_agents/agent/langgraph_react_agent.py +2596 -0
  54. aip_agents/agent/langgraph_react_agent.pyi +131 -0
  55. aip_agents/agent/system_instruction_context.py +34 -0
  56. aip_agents/agent/system_instruction_context.pyi +13 -0
  57. aip_agents/clients/__init__.py +10 -0
  58. aip_agents/clients/__init__.pyi +4 -0
  59. aip_agents/clients/langflow/__init__.py +10 -0
  60. aip_agents/clients/langflow/__init__.pyi +4 -0
  61. aip_agents/clients/langflow/client.py +477 -0
  62. aip_agents/clients/langflow/client.pyi +140 -0
  63. aip_agents/clients/langflow/types.py +18 -0
  64. aip_agents/clients/langflow/types.pyi +7 -0
  65. aip_agents/constants.py +23 -0
  66. aip_agents/constants.pyi +7 -0
  67. aip_agents/credentials/manager.py +132 -0
  68. aip_agents/examples/__init__.py +5 -0
  69. aip_agents/examples/__init__.pyi +0 -0
  70. aip_agents/examples/compare_streaming_client.py +783 -0
  71. aip_agents/examples/compare_streaming_client.pyi +48 -0
  72. aip_agents/examples/compare_streaming_server.py +142 -0
  73. aip_agents/examples/compare_streaming_server.pyi +18 -0
  74. aip_agents/examples/demo_memory_recall.py +401 -0
  75. aip_agents/examples/demo_memory_recall.pyi +58 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
  78. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
  80. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  81. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
  82. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  83. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
  84. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
  86. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
  88. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  89. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
  90. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  91. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
  92. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  93. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
  94. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  95. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
  96. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  97. aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
  98. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  99. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
  100. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  101. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  102. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  103. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
  106. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
  108. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
  110. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
  112. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
  114. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
  118. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
  120. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
  122. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
  124. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  125. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
  126. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  127. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
  128. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  129. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
  130. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  131. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
  132. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  133. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
  134. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  135. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
  136. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  137. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
  138. aip_agents/examples/hello_world_google_adk.py +41 -0
  139. aip_agents/examples/hello_world_google_adk.pyi +5 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  141. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
  142. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  143. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
  144. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  145. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
  146. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  147. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
  148. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  149. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
  150. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  151. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
  152. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  153. aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
  154. aip_agents/examples/hello_world_langchain.py +28 -0
  155. aip_agents/examples/hello_world_langchain.pyi +5 -0
  156. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  157. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
  158. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  159. aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
  160. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  161. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  162. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  163. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
  164. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  165. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  166. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  167. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
  168. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  169. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
  170. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  171. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
  172. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  173. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
  174. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  175. aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
  176. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  177. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
  178. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  179. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  180. aip_agents/examples/hello_world_langgraph.py +39 -0
  181. aip_agents/examples/hello_world_langgraph.pyi +5 -0
  182. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  183. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
  184. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  185. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
  186. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  187. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
  188. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  189. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
  190. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  191. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
  192. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  193. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
  194. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  195. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
  196. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  197. aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
  198. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  199. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
  200. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  201. aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
  202. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  203. aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
  204. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  205. aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
  206. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  207. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
  208. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  209. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
  210. aip_agents/examples/hello_world_pii_logger.py +21 -0
  211. aip_agents/examples/hello_world_pii_logger.pyi +5 -0
  212. aip_agents/examples/hello_world_sentry.py +133 -0
  213. aip_agents/examples/hello_world_sentry.pyi +21 -0
  214. aip_agents/examples/hello_world_step_limits.py +273 -0
  215. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  216. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  217. aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
  218. aip_agents/examples/hello_world_tool_output_client.py +46 -0
  219. aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
  220. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  221. aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
  222. aip_agents/examples/hitl_demo.py +724 -0
  223. aip_agents/examples/hitl_demo.pyi +67 -0
  224. aip_agents/examples/mcp_configs/configs.py +63 -0
  225. aip_agents/examples/mcp_servers/common.py +76 -0
  226. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  227. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  228. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  229. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  230. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  231. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  232. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  233. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  234. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  235. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  236. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  237. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  238. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  239. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  240. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  241. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  242. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  243. aip_agents/examples/tools/__init__.py +27 -0
  244. aip_agents/examples/tools/__init__.pyi +9 -0
  245. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  246. aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
  247. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  248. aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
  249. aip_agents/examples/tools/data_generator_tool.py +103 -0
  250. aip_agents/examples/tools/data_generator_tool.pyi +15 -0
  251. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  252. aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
  253. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  254. aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
  255. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  256. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
  257. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  258. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
  259. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  260. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
  261. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  262. aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
  263. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  264. aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
  265. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  266. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  267. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  268. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  269. aip_agents/examples/tools/random_chart_tool.py +142 -0
  270. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  271. aip_agents/examples/tools/serper_tool.py +202 -0
  272. aip_agents/examples/tools/serper_tool.pyi +16 -0
  273. aip_agents/examples/tools/stock_tools.py +82 -0
  274. aip_agents/examples/tools/stock_tools.pyi +36 -0
  275. aip_agents/examples/tools/table_generator_tool.py +167 -0
  276. aip_agents/examples/tools/table_generator_tool.pyi +22 -0
  277. aip_agents/examples/tools/time_tool.py +82 -0
  278. aip_agents/examples/tools/time_tool.pyi +15 -0
  279. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  280. aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
  281. aip_agents/executor/agent_executor.py +473 -0
  282. aip_agents/executor/base.py +48 -0
  283. aip_agents/guardrails/__init__.py +83 -0
  284. aip_agents/guardrails/__init__.pyi +6 -0
  285. aip_agents/guardrails/engines/__init__.py +69 -0
  286. aip_agents/guardrails/engines/__init__.pyi +4 -0
  287. aip_agents/guardrails/engines/base.py +90 -0
  288. aip_agents/guardrails/engines/base.pyi +61 -0
  289. aip_agents/guardrails/engines/nemo.py +101 -0
  290. aip_agents/guardrails/engines/nemo.pyi +46 -0
  291. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  292. aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
  293. aip_agents/guardrails/exceptions.py +39 -0
  294. aip_agents/guardrails/exceptions.pyi +23 -0
  295. aip_agents/guardrails/manager.py +163 -0
  296. aip_agents/guardrails/manager.pyi +42 -0
  297. aip_agents/guardrails/middleware.py +199 -0
  298. aip_agents/guardrails/middleware.pyi +87 -0
  299. aip_agents/guardrails/schemas.py +63 -0
  300. aip_agents/guardrails/schemas.pyi +43 -0
  301. aip_agents/guardrails/utils.py +45 -0
  302. aip_agents/guardrails/utils.pyi +19 -0
  303. aip_agents/mcp/__init__.py +1 -0
  304. aip_agents/mcp/__init__.pyi +0 -0
  305. aip_agents/mcp/client/__init__.py +14 -0
  306. aip_agents/mcp/client/__init__.pyi +5 -0
  307. aip_agents/mcp/client/base_mcp_client.py +369 -0
  308. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  309. aip_agents/mcp/client/connection_manager.py +193 -0
  310. aip_agents/mcp/client/connection_manager.pyi +48 -0
  311. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  312. aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
  313. aip_agents/mcp/client/google_adk/client.py +381 -0
  314. aip_agents/mcp/client/google_adk/client.pyi +75 -0
  315. aip_agents/mcp/client/langchain/__init__.py +11 -0
  316. aip_agents/mcp/client/langchain/__init__.pyi +3 -0
  317. aip_agents/mcp/client/langchain/client.py +265 -0
  318. aip_agents/mcp/client/langchain/client.pyi +48 -0
  319. aip_agents/mcp/client/persistent_session.py +362 -0
  320. aip_agents/mcp/client/persistent_session.pyi +113 -0
  321. aip_agents/mcp/client/session_pool.py +351 -0
  322. aip_agents/mcp/client/session_pool.pyi +101 -0
  323. aip_agents/mcp/client/transports.py +228 -0
  324. aip_agents/mcp/client/transports.pyi +123 -0
  325. aip_agents/mcp/utils/__init__.py +7 -0
  326. aip_agents/mcp/utils/__init__.pyi +0 -0
  327. aip_agents/mcp/utils/config_validator.py +139 -0
  328. aip_agents/mcp/utils/config_validator.pyi +82 -0
  329. aip_agents/memory/__init__.py +14 -0
  330. aip_agents/memory/__init__.pyi +5 -0
  331. aip_agents/memory/adapters/__init__.py +10 -0
  332. aip_agents/memory/adapters/__init__.pyi +4 -0
  333. aip_agents/memory/adapters/base_adapter.py +717 -0
  334. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  335. aip_agents/memory/adapters/mem0.py +84 -0
  336. aip_agents/memory/adapters/mem0.pyi +22 -0
  337. aip_agents/memory/base.py +84 -0
  338. aip_agents/memory/base.pyi +60 -0
  339. aip_agents/memory/constants.py +49 -0
  340. aip_agents/memory/constants.pyi +25 -0
  341. aip_agents/memory/factory.py +86 -0
  342. aip_agents/memory/factory.pyi +24 -0
  343. aip_agents/memory/guidance.py +20 -0
  344. aip_agents/memory/guidance.pyi +3 -0
  345. aip_agents/memory/simple_memory.py +47 -0
  346. aip_agents/memory/simple_memory.pyi +23 -0
  347. aip_agents/middleware/__init__.py +17 -0
  348. aip_agents/middleware/__init__.pyi +5 -0
  349. aip_agents/middleware/base.py +96 -0
  350. aip_agents/middleware/base.pyi +75 -0
  351. aip_agents/middleware/manager.py +150 -0
  352. aip_agents/middleware/manager.pyi +84 -0
  353. aip_agents/middleware/todolist.py +274 -0
  354. aip_agents/middleware/todolist.pyi +125 -0
  355. aip_agents/schema/__init__.py +69 -0
  356. aip_agents/schema/__init__.pyi +9 -0
  357. aip_agents/schema/a2a.py +56 -0
  358. aip_agents/schema/a2a.pyi +40 -0
  359. aip_agents/schema/agent.py +111 -0
  360. aip_agents/schema/agent.pyi +65 -0
  361. aip_agents/schema/hitl.py +157 -0
  362. aip_agents/schema/hitl.pyi +89 -0
  363. aip_agents/schema/langgraph.py +37 -0
  364. aip_agents/schema/langgraph.pyi +28 -0
  365. aip_agents/schema/model_id.py +97 -0
  366. aip_agents/schema/model_id.pyi +54 -0
  367. aip_agents/schema/step_limit.py +108 -0
  368. aip_agents/schema/step_limit.pyi +63 -0
  369. aip_agents/schema/storage.py +40 -0
  370. aip_agents/schema/storage.pyi +21 -0
  371. aip_agents/sentry/__init__.py +11 -0
  372. aip_agents/sentry/__init__.pyi +3 -0
  373. aip_agents/sentry/sentry.py +151 -0
  374. aip_agents/sentry/sentry.pyi +48 -0
  375. aip_agents/storage/__init__.py +41 -0
  376. aip_agents/storage/__init__.pyi +8 -0
  377. aip_agents/storage/base.py +85 -0
  378. aip_agents/storage/base.pyi +58 -0
  379. aip_agents/storage/clients/__init__.py +12 -0
  380. aip_agents/storage/clients/__init__.pyi +3 -0
  381. aip_agents/storage/clients/minio_client.py +318 -0
  382. aip_agents/storage/clients/minio_client.pyi +137 -0
  383. aip_agents/storage/config.py +62 -0
  384. aip_agents/storage/config.pyi +29 -0
  385. aip_agents/storage/providers/__init__.py +15 -0
  386. aip_agents/storage/providers/__init__.pyi +5 -0
  387. aip_agents/storage/providers/base.py +106 -0
  388. aip_agents/storage/providers/base.pyi +88 -0
  389. aip_agents/storage/providers/memory.py +114 -0
  390. aip_agents/storage/providers/memory.pyi +79 -0
  391. aip_agents/storage/providers/object_storage.py +214 -0
  392. aip_agents/storage/providers/object_storage.pyi +98 -0
  393. aip_agents/tools/__init__.py +53 -0
  394. aip_agents/tools/__init__.pyi +9 -0
  395. aip_agents/tools/browser_use/__init__.py +82 -0
  396. aip_agents/tools/browser_use/__init__.pyi +14 -0
  397. aip_agents/tools/browser_use/action_parser.py +103 -0
  398. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  399. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  400. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  401. aip_agents/tools/browser_use/llm_config.py +120 -0
  402. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  403. aip_agents/tools/browser_use/minio_storage.py +198 -0
  404. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  405. aip_agents/tools/browser_use/schemas.py +119 -0
  406. aip_agents/tools/browser_use/schemas.pyi +32 -0
  407. aip_agents/tools/browser_use/session.py +76 -0
  408. aip_agents/tools/browser_use/session.pyi +4 -0
  409. aip_agents/tools/browser_use/session_errors.py +132 -0
  410. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  411. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  412. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  413. aip_agents/tools/browser_use/streaming.py +813 -0
  414. aip_agents/tools/browser_use/streaming.pyi +81 -0
  415. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  416. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  417. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  418. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  419. aip_agents/tools/browser_use/types.py +78 -0
  420. aip_agents/tools/browser_use/types.pyi +45 -0
  421. aip_agents/tools/code_sandbox/__init__.py +26 -0
  422. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  423. aip_agents/tools/code_sandbox/constant.py +13 -0
  424. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  425. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
  426. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
  427. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  428. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  429. aip_agents/tools/constants.py +177 -0
  430. aip_agents/tools/constants.pyi +138 -0
  431. aip_agents/tools/document_loader/__init__.py +44 -0
  432. aip_agents/tools/document_loader/__init__.pyi +7 -0
  433. aip_agents/tools/document_loader/base_reader.py +302 -0
  434. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  435. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  436. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  437. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  438. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  439. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  440. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  441. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  442. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  443. aip_agents/tools/gl_connector/__init__.py +5 -0
  444. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  445. aip_agents/tools/gl_connector/tool.py +383 -0
  446. aip_agents/tools/gl_connector/tool.pyi +74 -0
  447. aip_agents/tools/gl_connector_tools.py +119 -0
  448. aip_agents/tools/gl_connector_tools.pyi +39 -0
  449. aip_agents/tools/memory_search/__init__.py +22 -0
  450. aip_agents/tools/memory_search/__init__.pyi +5 -0
  451. aip_agents/tools/memory_search/base.py +200 -0
  452. aip_agents/tools/memory_search/base.pyi +69 -0
  453. aip_agents/tools/memory_search/mem0.py +258 -0
  454. aip_agents/tools/memory_search/mem0.pyi +19 -0
  455. aip_agents/tools/memory_search/schema.py +48 -0
  456. aip_agents/tools/memory_search/schema.pyi +15 -0
  457. aip_agents/tools/memory_search_tool.py +26 -0
  458. aip_agents/tools/memory_search_tool.pyi +3 -0
  459. aip_agents/tools/time_tool.py +117 -0
  460. aip_agents/tools/time_tool.pyi +16 -0
  461. aip_agents/tools/tool_config_injector.py +300 -0
  462. aip_agents/tools/tool_config_injector.pyi +26 -0
  463. aip_agents/tools/web_search/__init__.py +15 -0
  464. aip_agents/tools/web_search/__init__.pyi +3 -0
  465. aip_agents/tools/web_search/serper_tool.py +187 -0
  466. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  467. aip_agents/types/__init__.py +70 -0
  468. aip_agents/types/__init__.pyi +36 -0
  469. aip_agents/types/a2a_events.py +13 -0
  470. aip_agents/types/a2a_events.pyi +3 -0
  471. aip_agents/utils/__init__.py +79 -0
  472. aip_agents/utils/__init__.pyi +11 -0
  473. aip_agents/utils/a2a_connector.py +1757 -0
  474. aip_agents/utils/a2a_connector.pyi +146 -0
  475. aip_agents/utils/artifact_helpers.py +502 -0
  476. aip_agents/utils/artifact_helpers.pyi +203 -0
  477. aip_agents/utils/constants.py +22 -0
  478. aip_agents/utils/constants.pyi +10 -0
  479. aip_agents/utils/datetime/__init__.py +34 -0
  480. aip_agents/utils/datetime/__init__.pyi +4 -0
  481. aip_agents/utils/datetime/normalization.py +231 -0
  482. aip_agents/utils/datetime/normalization.pyi +95 -0
  483. aip_agents/utils/datetime/timezone.py +206 -0
  484. aip_agents/utils/datetime/timezone.pyi +48 -0
  485. aip_agents/utils/env_loader.py +27 -0
  486. aip_agents/utils/env_loader.pyi +10 -0
  487. aip_agents/utils/event_handler_registry.py +58 -0
  488. aip_agents/utils/event_handler_registry.pyi +23 -0
  489. aip_agents/utils/file_prompt_utils.py +176 -0
  490. aip_agents/utils/file_prompt_utils.pyi +21 -0
  491. aip_agents/utils/final_response_builder.py +211 -0
  492. aip_agents/utils/final_response_builder.pyi +34 -0
  493. aip_agents/utils/formatter_llm_client.py +231 -0
  494. aip_agents/utils/formatter_llm_client.pyi +71 -0
  495. aip_agents/utils/langgraph/__init__.py +19 -0
  496. aip_agents/utils/langgraph/__init__.pyi +3 -0
  497. aip_agents/utils/langgraph/converter.py +128 -0
  498. aip_agents/utils/langgraph/converter.pyi +49 -0
  499. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  500. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  501. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  502. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  503. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  504. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  505. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  506. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  507. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  508. aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
  509. aip_agents/utils/logger.py +195 -0
  510. aip_agents/utils/logger.pyi +60 -0
  511. aip_agents/utils/metadata/__init__.py +27 -0
  512. aip_agents/utils/metadata/__init__.pyi +5 -0
  513. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  514. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  515. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  516. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  517. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  518. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  519. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  520. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  521. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  522. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  523. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  524. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  525. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  526. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  527. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  528. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  529. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  530. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  531. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  532. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  533. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  534. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  535. aip_agents/utils/metadata_helper.py +358 -0
  536. aip_agents/utils/metadata_helper.pyi +117 -0
  537. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  538. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  539. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  540. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  541. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  542. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  543. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  544. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  545. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  546. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  547. aip_agents/utils/pii/__init__.py +25 -0
  548. aip_agents/utils/pii/__init__.pyi +5 -0
  549. aip_agents/utils/pii/pii_handler.py +397 -0
  550. aip_agents/utils/pii/pii_handler.pyi +96 -0
  551. aip_agents/utils/pii/pii_helper.py +207 -0
  552. aip_agents/utils/pii/pii_helper.pyi +78 -0
  553. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  554. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  555. aip_agents/utils/reference_helper.py +273 -0
  556. aip_agents/utils/reference_helper.pyi +81 -0
  557. aip_agents/utils/sse_chunk_transformer.py +831 -0
  558. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  559. aip_agents/utils/step_limit_manager.py +265 -0
  560. aip_agents/utils/step_limit_manager.pyi +112 -0
  561. aip_agents/utils/token_usage_helper.py +156 -0
  562. aip_agents/utils/token_usage_helper.pyi +60 -0
  563. aip_agents_binary-0.5.25b1.dist-info/METADATA +681 -0
  564. aip_agents_binary-0.5.25b1.dist-info/RECORD +566 -0
  565. aip_agents_binary-0.5.25b1.dist-info/WHEEL +5 -0
  566. aip_agents_binary-0.5.25b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,464 @@
1
+ """Langflow agent implementation for integrating with Langflow API.
2
+
3
+ This module provides the LangflowAgent class that integrates with Langflow flows
4
+ through the SDK's agent framework, supporting both streaming and non-streaming
5
+ execution modes with full A2A compatibility.
6
+
7
+ Authors:
8
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
9
+ """
10
+
11
+ import asyncio
12
+ import uuid
13
+ from collections.abc import AsyncGenerator
14
+ from typing import Any
15
+
16
+ from a2a.types import AgentCard
17
+
18
+ from aip_agents.agent.base_agent import BaseAgent
19
+ from aip_agents.clients.langflow import LangflowApiClient
20
+ from aip_agents.clients.langflow.types import LangflowEventType
21
+ from aip_agents.schema.agent import LangflowAgentConfig
22
+ from aip_agents.types import A2AEvent, A2AStreamEventType
23
+ from aip_agents.utils.logger import get_logger
24
+ from aip_agents.utils.sse_chunk_transformer import SSEChunkTransformer
25
+
26
+ logger = get_logger(__name__)
27
+
28
+
29
+ class LangflowAgent(BaseAgent):
30
+ """Langflow agent implementation for executing Langflow flows.
31
+
32
+ This agent integrates with Langflow APIs to execute flows while providing
33
+ full compatibility with the SDK's agent framework, including:
34
+ - Synchronous and asynchronous execution
35
+ - Regular and A2A streaming support
36
+ - Session management for conversation continuity
37
+ - Error handling and retry logic
38
+ - Credential management through BaseAgent
39
+
40
+ The agent builds on BaseAgent to gain shared A2A utilities while focusing on
41
+ Langflow-specific execution logic.
42
+ """
43
+
44
+ def __init__( # noqa: PLR0913
45
+ self,
46
+ name: str,
47
+ flow_id: str,
48
+ description: str | None = None,
49
+ base_url: str | None = None,
50
+ api_key: str | None = None,
51
+ config: LangflowAgentConfig | dict[str, Any] | None = None,
52
+ **kwargs: Any,
53
+ ):
54
+ """Initialize the LangflowAgent.
55
+
56
+ Args:
57
+ name: The name of the agent.
58
+ flow_id: The unique identifier of the Langflow flow to execute.
59
+ description: Human-readable description.
60
+ base_url: The base URL of the Langflow API server.
61
+ api_key: The API key for Langflow authentication.
62
+ config: Langflow-specific configuration or dict.
63
+ **kwargs: Additional keyword arguments passed to BaseAgent.
64
+ """
65
+ config = self._create_or_update_config(flow_id, base_url, api_key, config)
66
+
67
+ super().__init__(
68
+ name=name,
69
+ instruction="",
70
+ description=description,
71
+ model=None,
72
+ tools=None,
73
+ config=config,
74
+ **kwargs,
75
+ )
76
+
77
+ self.langflow_config = config
78
+ self.flow_id = flow_id
79
+ self.api_client = LangflowApiClient(
80
+ flow_id=config.flow_id,
81
+ base_url=config.base_url,
82
+ api_key=config.api_key,
83
+ )
84
+
85
+ logger.info(f"Initialized LangflowAgent '{name}' for flow {self.flow_id}")
86
+
87
+ def _create_or_update_config(
88
+ self,
89
+ flow_id: str,
90
+ base_url: str | None,
91
+ api_key: str | None,
92
+ config: LangflowAgentConfig | dict[str, Any] | None,
93
+ ) -> LangflowAgentConfig:
94
+ """Create or update LangflowAgentConfig based on provided parameters.
95
+
96
+ Args:
97
+ flow_id: The unique identifier of the Langflow flow to execute.
98
+ base_url: The base URL of the Langflow API server.
99
+ api_key: The API key for Langflow authentication.
100
+ config: Existing configuration to update or None to create new.
101
+
102
+ Returns:
103
+ LangflowAgentConfig instance with updated values.
104
+ """
105
+ if config is None:
106
+ return LangflowAgentConfig(
107
+ flow_id=flow_id,
108
+ base_url=base_url,
109
+ api_key=api_key,
110
+ )
111
+ elif isinstance(config, dict):
112
+ config_dict = config.copy()
113
+ config_dict.update(
114
+ {
115
+ "flow_id": flow_id,
116
+ "base_url": base_url or config_dict.get("base_url"),
117
+ "api_key": api_key or config_dict.get("api_key"),
118
+ }
119
+ )
120
+ return LangflowAgentConfig(**config_dict)
121
+ elif isinstance(config, LangflowAgentConfig):
122
+ if flow_id:
123
+ config.flow_id = flow_id
124
+ if base_url:
125
+ config.base_url = base_url
126
+ if api_key:
127
+ config.api_key = api_key
128
+ return config
129
+
130
+ return LangflowAgentConfig(flow_id=flow_id, base_url=base_url, api_key=api_key)
131
+
132
+ def _get_or_create_session(self, **kwargs: Any) -> str:
133
+ """Get or create a session ID for the current conversation context.
134
+
135
+ Args:
136
+ **kwargs: Keyword arguments that may contain configurable with thread_id.
137
+
138
+ Returns:
139
+ Session ID for the conversation.
140
+ """
141
+ configurable = kwargs.get("configurable", {})
142
+ thread_id = configurable.get("thread_id")
143
+
144
+ if thread_id:
145
+ logger.debug(f"Using thread_id as session_id: {thread_id}")
146
+ return thread_id
147
+ else:
148
+ session_id = str(uuid.uuid4())
149
+ logger.debug(f"Generated new session_id: {session_id}")
150
+ return session_id
151
+
152
+ def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
153
+ """Synchronously run the Langflow agent.
154
+
155
+ Args:
156
+ query: The input query for the agent.
157
+ **kwargs: Additional keyword arguments.
158
+
159
+ Returns:
160
+ Dictionary containing the agent's response.
161
+ """
162
+ try:
163
+ try:
164
+ loop = asyncio.get_running_loop()
165
+ if loop.is_running():
166
+ logger.warning(
167
+ f"Agent '{self.name}': Cannot use sync 'run' from within async context. Use 'arun' instead."
168
+ )
169
+ raise RuntimeError(f"Agent '{self.name}': sync 'run' cannot be called from within an async context")
170
+ except RuntimeError:
171
+ pass
172
+
173
+ return asyncio.run(self.arun(query, **kwargs))
174
+ except RuntimeError as e:
175
+ raise RuntimeError(f"Agent '{self.name}': Error in sync 'run'. Original: {e}") from e
176
+
177
+ async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
178
+ """Asynchronously run the Langflow agent.
179
+
180
+ Args:
181
+ query: The input query for the agent.
182
+ **kwargs: Additional keyword arguments.
183
+
184
+ Returns:
185
+ Dictionary containing the agent's response and metadata.
186
+ """
187
+ try:
188
+ session_id = self._get_or_create_session(**kwargs)
189
+
190
+ logger.debug(f"Agent '{self.name}': Executing flow {self.flow_id} with session {session_id}")
191
+
192
+ result = await self.api_client.call_flow(input_value=query, session_id=session_id, **kwargs)
193
+
194
+ return result["outputs"][0]["outputs"][0]["results"]["message"]["text"]
195
+ except Exception as e:
196
+ logger.error(f"Agent '{self.name}': Error during execution: {e}")
197
+ raise RuntimeError(f"Agent '{self.name}': Execution failed: {e}") from e
198
+
199
+ async def arun_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[str | dict[str, Any], None]:
200
+ """Asynchronously stream the Langflow agent's response.
201
+
202
+ Args:
203
+ query: The input query for the agent.
204
+ **kwargs: Additional keyword arguments.
205
+
206
+ Yields:
207
+ Chunks of output (strings or dicts) from the streaming response.
208
+ """
209
+ try:
210
+ session_id = self._get_or_create_session(**kwargs)
211
+
212
+ logger.debug(f"Agent '{self.name}': Streaming flow {self.flow_id} with session {session_id}")
213
+
214
+ async for event_data in self.api_client.stream_flow(input_value=query, session_id=session_id, **kwargs):
215
+ parsed_event = self.api_client.parse_stream_event(event_data)
216
+ if parsed_event:
217
+ content = parsed_event.get("content", "")
218
+ if content:
219
+ yield content
220
+
221
+ except Exception as e:
222
+ logger.error(f"Agent '{self.name}': Error during streaming: {e}")
223
+ yield {"error": f"Streaming failed: {e}"}
224
+
225
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
226
+ """Asynchronously stream the agent's response in A2A format.
227
+
228
+ This method converts Langflow streaming events into A2A-compatible events
229
+ following the patterns established by BaseLangGraphAgent.
230
+
231
+ Args:
232
+ query: The input query for the agent.
233
+ **kwargs: Additional keyword arguments.
234
+
235
+ Yields:
236
+ A2A-compatible event dictionaries with semantic event types.
237
+ """
238
+ try:
239
+ session_id = self._get_or_create_session(**kwargs)
240
+ logger.debug(f"Agent '{self.name}': A2A streaming flow {self.flow_id} with session {session_id}")
241
+
242
+ # Yield initial status update
243
+ yield self._create_initial_status_event(session_id)
244
+
245
+ final_content = ""
246
+
247
+ async for event_data in self.api_client.stream_flow(input_value=query, session_id=session_id, **kwargs):
248
+ parsed_event = self.api_client.parse_stream_event(event_data)
249
+ if not parsed_event:
250
+ continue
251
+
252
+ event_type = parsed_event.get("type")
253
+ content = parsed_event.get("content", "")
254
+
255
+ if event_type == LangflowEventType.ADD_MESSAGE:
256
+ if content:
257
+ final_content = content
258
+
259
+ elif event_type == LangflowEventType.END:
260
+ yield self._create_final_response_event(final_content, session_id)
261
+ return
262
+
263
+ elif content:
264
+ yield self._create_a2a_event(
265
+ event_type=A2AStreamEventType.STATUS_UPDATE,
266
+ content=content,
267
+ is_final=False,
268
+ session_id=session_id,
269
+ )
270
+
271
+ yield self._create_final_response_event(final_content, session_id)
272
+
273
+ except Exception as e:
274
+ logger.error(f"Agent '{self.name}': Error during A2A streaming: {e}")
275
+ error_session_id = self._get_error_session_id(**kwargs)
276
+ yield self._create_error_event(str(e), error_session_id)
277
+
278
+ async def arun_sse_stream(
279
+ self,
280
+ query: str,
281
+ task_id: str | None = None,
282
+ context_id: str | None = None,
283
+ **kwargs: Any,
284
+ ) -> AsyncGenerator[dict[str, Any], None]:
285
+ """Stream agent response as SSE-compatible chunks.
286
+
287
+ This method wraps arun_a2a_stream and transforms output to the normalized
288
+ dict format matching A2AConnector.astream_to_agent output, enabling direct
289
+ streaming without A2A server overhead.
290
+
291
+ Args:
292
+ query: The input query for the agent.
293
+ task_id: Optional task identifier for the stream.
294
+ context_id: Optional context identifier for the stream.
295
+ **kwargs: Additional arguments passed to arun_a2a_stream.
296
+
297
+ Yields:
298
+ SSEChunk dicts with normalized structure:
299
+ - status: "success" | "error"
300
+ - task_state: "working" | "completed" | "failed" | "canceled"
301
+ - content: Text content or None
302
+ - event_type: Always string (never enum)
303
+ - final: True for terminal events
304
+ - metadata: Normalized metadata dict
305
+ - artifacts: Only present when non-empty
306
+ """
307
+ if task_id is None:
308
+ task_id = str(uuid.uuid4())
309
+ if context_id is None:
310
+ context_id = str(uuid.uuid4())
311
+
312
+ # Extract pii_mapping from kwargs to pass to transformer (matching A2A executor behavior)
313
+ pii_mapping = kwargs.get("pii_mapping")
314
+ transformer = SSEChunkTransformer(task_id=task_id, context_id=context_id, pii_mapping=pii_mapping)
315
+ try:
316
+ async for chunk in transformer.transform_stream(self.arun_a2a_stream(query, **kwargs)):
317
+ yield chunk
318
+ except Exception as e:
319
+ logger.error(f"Agent '{self.name}': Error in arun_sse_stream: {e}", exc_info=True)
320
+ yield SSEChunkTransformer._create_error_chunk(f"Error during streaming: {e}")
321
+
322
+ def _create_initial_status_event(self, session_id: str) -> A2AEvent:
323
+ """Create the initial status update event for A2A streaming.
324
+
325
+ Args:
326
+ session_id: The session ID for the conversation.
327
+
328
+ Returns:
329
+ A2A event dictionary for initial status update.
330
+ """
331
+ return self._create_a2a_event(
332
+ event_type=A2AStreamEventType.STATUS_UPDATE,
333
+ content="Performing agent tasks",
334
+ is_final=False,
335
+ metadata={
336
+ "agent_name": self.name,
337
+ "step_id": "status_update_001",
338
+ "previous_step_ids": [],
339
+ "session_id": session_id,
340
+ },
341
+ )
342
+
343
+ def _create_final_response_event(self, content: str, session_id: str) -> A2AEvent:
344
+ """Create a final response event for A2A streaming.
345
+
346
+ Args:
347
+ content: The final response content.
348
+ session_id: The session ID for the conversation.
349
+
350
+ Returns:
351
+ A2A event dictionary for final response.
352
+ """
353
+ return self._create_a2a_event(
354
+ event_type=A2AStreamEventType.FINAL_RESPONSE,
355
+ content=content,
356
+ is_final=True,
357
+ session_id=session_id,
358
+ )
359
+
360
+ def _get_error_session_id(self, **kwargs: Any) -> str | None:
361
+ """Get session ID for error handling, with fallback to None if fails.
362
+
363
+ Args:
364
+ **kwargs: Keyword arguments that may contain configurable with thread_id.
365
+
366
+ Returns:
367
+ Session ID for error reporting, or None if unable to obtain.
368
+ """
369
+ try:
370
+ return self._get_or_create_session(**kwargs)
371
+ except Exception as e:
372
+ logger.error(f"Agent '{self.name}': Error getting session_id: {e}")
373
+ return None
374
+
375
+ def _create_error_event(self, error_message: str, session_id: str | None) -> A2AEvent:
376
+ """Create an error event for A2A streaming.
377
+
378
+ Args:
379
+ error_message: The error message to include.
380
+ session_id: The session ID for the conversation, if available.
381
+
382
+ Returns:
383
+ A2A event dictionary for error reporting.
384
+ """
385
+ return self._create_a2a_event(
386
+ event_type=A2AStreamEventType.ERROR,
387
+ content=f"A2A streaming failed: {error_message}",
388
+ is_final=True,
389
+ session_id=session_id,
390
+ )
391
+
392
+ def _create_a2a_event(
393
+ self,
394
+ event_type: A2AStreamEventType,
395
+ content: str,
396
+ is_final: bool = False,
397
+ metadata: dict[str, Any] | None = None,
398
+ session_id: str | None = None,
399
+ ) -> A2AEvent:
400
+ """Create an A2A-compatible event following BaseLangGraphAgent patterns.
401
+
402
+ Args:
403
+ event_type: The semantic type of the event.
404
+ content: The main text content of the event.
405
+ is_final: Whether this is a final event.
406
+ metadata: Additional metadata for the event.
407
+ session_id: Optional session ID to include in metadata.
408
+
409
+ Returns:
410
+ A2A event dictionary.
411
+ """
412
+ if metadata is None:
413
+ metadata = {"agent_name": self.name, "step_id": f"langflow_{uuid.uuid4().hex[:8]}", "previous_step_ids": []}
414
+
415
+ if session_id:
416
+ metadata["session_id"] = session_id
417
+
418
+ return {
419
+ "event_type": event_type,
420
+ "content": content,
421
+ "metadata": metadata,
422
+ "tool_info": None,
423
+ "is_final": is_final,
424
+ "artifacts": None,
425
+ "references": None,
426
+ "step_usage": None,
427
+ "total_usage": None,
428
+ }
429
+
430
+ def register_a2a_agents(self, agents: list[AgentCard]) -> None:
431
+ """Register A2A agents (not supported for Langflow agents).
432
+
433
+ Args:
434
+ agents: List of AgentCard instances.
435
+
436
+ Raises:
437
+ NotImplementedError: Langflow agents don't support A2A agent registration.
438
+ """
439
+ logger.warning(f"Agent '{self.name}': A2A agent registration not supported for Langflow agents")
440
+ raise NotImplementedError("Langflow agents don't support A2A agent registration")
441
+
442
+ def add_mcp_server(self, mcp_config: dict[str, dict[str, Any]]) -> None:
443
+ """Add MCP server configuration (not supported for Langflow agents).
444
+
445
+ Args:
446
+ mcp_config: MCP server configuration.
447
+
448
+ Raises:
449
+ NotImplementedError: Langflow agents don't support MCP servers.
450
+ """
451
+ logger.warning(f"Agent '{self.name}': MCP server configuration not supported for Langflow agents")
452
+ raise NotImplementedError("Langflow agents don't support MCP servers")
453
+
454
+ async def health_check(self) -> bool:
455
+ """Check if the Langflow API is accessible.
456
+
457
+ Returns:
458
+ True if the API is accessible, False otherwise.
459
+ """
460
+ try:
461
+ return await self.api_client.health_check()
462
+ except Exception as e:
463
+ logger.warning(f"Agent '{self.name}': Health check failed: {e}")
464
+ return False
@@ -0,0 +1,133 @@
1
+ from _typeshed import Incomplete
2
+ from a2a.types import AgentCard as AgentCard
3
+ from aip_agents.agent.base_agent import BaseAgent as BaseAgent
4
+ from aip_agents.clients.langflow import LangflowApiClient as LangflowApiClient
5
+ from aip_agents.clients.langflow.types import LangflowEventType as LangflowEventType
6
+ from aip_agents.schema.agent import LangflowAgentConfig as LangflowAgentConfig
7
+ from aip_agents.types import A2AEvent as A2AEvent, A2AStreamEventType as A2AStreamEventType
8
+ from aip_agents.utils.logger import get_logger as get_logger
9
+ from aip_agents.utils.sse_chunk_transformer import SSEChunkTransformer as SSEChunkTransformer
10
+ from collections.abc import AsyncGenerator
11
+ from typing import Any
12
+
13
+ logger: Incomplete
14
+
15
+ class LangflowAgent(BaseAgent):
16
+ """Langflow agent implementation for executing Langflow flows.
17
+
18
+ This agent integrates with Langflow APIs to execute flows while providing
19
+ full compatibility with the SDK's agent framework, including:
20
+ - Synchronous and asynchronous execution
21
+ - Regular and A2A streaming support
22
+ - Session management for conversation continuity
23
+ - Error handling and retry logic
24
+ - Credential management through BaseAgent
25
+
26
+ The agent builds on BaseAgent to gain shared A2A utilities while focusing on
27
+ Langflow-specific execution logic.
28
+ """
29
+ langflow_config: Incomplete
30
+ flow_id: Incomplete
31
+ api_client: Incomplete
32
+ def __init__(self, name: str, flow_id: str, description: str | None = None, base_url: str | None = None, api_key: str | None = None, config: LangflowAgentConfig | dict[str, Any] | None = None, **kwargs: Any) -> None:
33
+ """Initialize the LangflowAgent.
34
+
35
+ Args:
36
+ name: The name of the agent.
37
+ flow_id: The unique identifier of the Langflow flow to execute.
38
+ description: Human-readable description.
39
+ base_url: The base URL of the Langflow API server.
40
+ api_key: The API key for Langflow authentication.
41
+ config: Langflow-specific configuration or dict.
42
+ **kwargs: Additional keyword arguments passed to BaseAgent.
43
+ """
44
+ def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
45
+ """Synchronously run the Langflow agent.
46
+
47
+ Args:
48
+ query: The input query for the agent.
49
+ **kwargs: Additional keyword arguments.
50
+
51
+ Returns:
52
+ Dictionary containing the agent's response.
53
+ """
54
+ async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
55
+ """Asynchronously run the Langflow agent.
56
+
57
+ Args:
58
+ query: The input query for the agent.
59
+ **kwargs: Additional keyword arguments.
60
+
61
+ Returns:
62
+ Dictionary containing the agent's response and metadata.
63
+ """
64
+ async def arun_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[str | dict[str, Any], None]:
65
+ """Asynchronously stream the Langflow agent's response.
66
+
67
+ Args:
68
+ query: The input query for the agent.
69
+ **kwargs: Additional keyword arguments.
70
+
71
+ Yields:
72
+ Chunks of output (strings or dicts) from the streaming response.
73
+ """
74
+ async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
75
+ """Asynchronously stream the agent's response in A2A format.
76
+
77
+ This method converts Langflow streaming events into A2A-compatible events
78
+ following the patterns established by BaseLangGraphAgent.
79
+
80
+ Args:
81
+ query: The input query for the agent.
82
+ **kwargs: Additional keyword arguments.
83
+
84
+ Yields:
85
+ A2A-compatible event dictionaries with semantic event types.
86
+ """
87
+ async def arun_sse_stream(self, query: str, task_id: str | None = None, context_id: str | None = None, **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
88
+ '''Stream agent response as SSE-compatible chunks.
89
+
90
+ This method wraps arun_a2a_stream and transforms output to the normalized
91
+ dict format matching A2AConnector.astream_to_agent output, enabling direct
92
+ streaming without A2A server overhead.
93
+
94
+ Args:
95
+ query: The input query for the agent.
96
+ task_id: Optional task identifier for the stream.
97
+ context_id: Optional context identifier for the stream.
98
+ **kwargs: Additional arguments passed to arun_a2a_stream.
99
+
100
+ Yields:
101
+ SSEChunk dicts with normalized structure:
102
+ - status: "success" | "error"
103
+ - task_state: "working" | "completed" | "failed" | "canceled"
104
+ - content: Text content or None
105
+ - event_type: Always string (never enum)
106
+ - final: True for terminal events
107
+ - metadata: Normalized metadata dict
108
+ - artifacts: Only present when non-empty
109
+ '''
110
+ def register_a2a_agents(self, agents: list[AgentCard]) -> None:
111
+ """Register A2A agents (not supported for Langflow agents).
112
+
113
+ Args:
114
+ agents: List of AgentCard instances.
115
+
116
+ Raises:
117
+ NotImplementedError: Langflow agents don't support A2A agent registration.
118
+ """
119
+ def add_mcp_server(self, mcp_config: dict[str, dict[str, Any]]) -> None:
120
+ """Add MCP server configuration (not supported for Langflow agents).
121
+
122
+ Args:
123
+ mcp_config: MCP server configuration.
124
+
125
+ Raises:
126
+ NotImplementedError: Langflow agents don't support MCP servers.
127
+ """
128
+ async def health_check(self) -> bool:
129
+ """Check if the Langflow API is accessible.
130
+
131
+ Returns:
132
+ True if the API is accessible, False otherwise.
133
+ """