aip-agents-binary 0.6.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) 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 +3037 -0
  22. aip_agents/agent/base_langgraph_agent.pyi +233 -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 +767 -0
  52. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
  53. aip_agents/agent/langgraph_react_agent.py +2856 -0
  54. aip_agents/agent/langgraph_react_agent.pyi +170 -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/hello_world_a2a_google_adk_client.py +49 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
  78. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
  80. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  81. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
  82. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  83. aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
  84. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
  86. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
  88. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  89. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
  90. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  91. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
  92. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  93. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
  94. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  95. aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
  96. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  97. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
  98. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  99. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  100. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  101. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  102. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  103. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
  106. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
  108. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
  110. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
  112. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
  114. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
  118. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
  120. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
  122. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
  124. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  125. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
  126. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  127. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
  128. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  129. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
  130. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  131. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
  132. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  133. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
  134. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  135. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
  136. aip_agents/examples/hello_world_google_adk.py +41 -0
  137. aip_agents/examples/hello_world_google_adk.pyi +5 -0
  138. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  139. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  141. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
  142. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  143. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
  144. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  145. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
  146. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  147. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
  148. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  149. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
  150. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  151. aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
  152. aip_agents/examples/hello_world_langchain.py +28 -0
  153. aip_agents/examples/hello_world_langchain.pyi +5 -0
  154. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  155. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
  156. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  157. aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
  158. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  159. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  160. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  161. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
  162. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  163. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  164. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  165. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
  166. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  167. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
  168. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  169. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
  170. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  171. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
  172. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  173. aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
  174. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  175. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
  176. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  177. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  178. aip_agents/examples/hello_world_langgraph.py +39 -0
  179. aip_agents/examples/hello_world_langgraph.pyi +5 -0
  180. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  181. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
  182. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  183. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
  184. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  185. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
  186. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  187. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
  188. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  189. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
  190. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  191. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
  192. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  193. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
  194. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  195. aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
  196. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  197. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
  198. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  199. aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
  200. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  201. aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
  202. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  203. aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
  204. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  205. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
  206. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  207. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
  208. aip_agents/examples/hello_world_pii_logger.py +21 -0
  209. aip_agents/examples/hello_world_pii_logger.pyi +5 -0
  210. aip_agents/examples/hello_world_ptc.py +49 -0
  211. aip_agents/examples/hello_world_ptc.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 +55 -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 +228 -0
  310. aip_agents/mcp/client/connection_manager.pyi +51 -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 +612 -0
  320. aip_agents/mcp/client/persistent_session.pyi +122 -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 +263 -0
  324. aip_agents/mcp/client/transports.pyi +132 -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 +811 -0
  334. aip_agents/memory/adapters/base_adapter.pyi +176 -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/ptc/__init__.py +48 -0
  356. aip_agents/ptc/__init__.pyi +10 -0
  357. aip_agents/ptc/doc_gen.py +122 -0
  358. aip_agents/ptc/doc_gen.pyi +40 -0
  359. aip_agents/ptc/exceptions.py +39 -0
  360. aip_agents/ptc/exceptions.pyi +22 -0
  361. aip_agents/ptc/executor.py +143 -0
  362. aip_agents/ptc/executor.pyi +73 -0
  363. aip_agents/ptc/mcp/__init__.py +45 -0
  364. aip_agents/ptc/mcp/__init__.pyi +7 -0
  365. aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
  366. aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
  367. aip_agents/ptc/mcp/templates/__init__.py +1 -0
  368. aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
  369. aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
  370. aip_agents/ptc/naming.py +184 -0
  371. aip_agents/ptc/naming.pyi +76 -0
  372. aip_agents/ptc/payload.py +26 -0
  373. aip_agents/ptc/payload.pyi +15 -0
  374. aip_agents/ptc/prompt_builder.py +571 -0
  375. aip_agents/ptc/prompt_builder.pyi +55 -0
  376. aip_agents/ptc/ptc_helper.py +16 -0
  377. aip_agents/ptc/ptc_helper.pyi +1 -0
  378. aip_agents/ptc/sandbox_bridge.py +58 -0
  379. aip_agents/ptc/sandbox_bridge.pyi +25 -0
  380. aip_agents/ptc/template_utils.py +33 -0
  381. aip_agents/ptc/template_utils.pyi +13 -0
  382. aip_agents/ptc/templates/__init__.py +1 -0
  383. aip_agents/ptc/templates/__init__.pyi +0 -0
  384. aip_agents/ptc/templates/ptc_helper.py.template +134 -0
  385. aip_agents/sandbox/__init__.py +43 -0
  386. aip_agents/sandbox/__init__.pyi +5 -0
  387. aip_agents/sandbox/defaults.py +9 -0
  388. aip_agents/sandbox/defaults.pyi +2 -0
  389. aip_agents/sandbox/e2b_runtime.py +267 -0
  390. aip_agents/sandbox/e2b_runtime.pyi +51 -0
  391. aip_agents/sandbox/template_builder.py +131 -0
  392. aip_agents/sandbox/template_builder.pyi +36 -0
  393. aip_agents/sandbox/types.py +24 -0
  394. aip_agents/sandbox/types.pyi +14 -0
  395. aip_agents/sandbox/validation.py +50 -0
  396. aip_agents/sandbox/validation.pyi +20 -0
  397. aip_agents/schema/__init__.py +69 -0
  398. aip_agents/schema/__init__.pyi +9 -0
  399. aip_agents/schema/a2a.py +56 -0
  400. aip_agents/schema/a2a.pyi +40 -0
  401. aip_agents/schema/agent.py +111 -0
  402. aip_agents/schema/agent.pyi +65 -0
  403. aip_agents/schema/hitl.py +157 -0
  404. aip_agents/schema/hitl.pyi +89 -0
  405. aip_agents/schema/langgraph.py +37 -0
  406. aip_agents/schema/langgraph.pyi +28 -0
  407. aip_agents/schema/model_id.py +97 -0
  408. aip_agents/schema/model_id.pyi +54 -0
  409. aip_agents/schema/step_limit.py +108 -0
  410. aip_agents/schema/step_limit.pyi +63 -0
  411. aip_agents/schema/storage.py +40 -0
  412. aip_agents/schema/storage.pyi +21 -0
  413. aip_agents/sentry/__init__.py +11 -0
  414. aip_agents/sentry/__init__.pyi +3 -0
  415. aip_agents/sentry/sentry.py +151 -0
  416. aip_agents/sentry/sentry.pyi +48 -0
  417. aip_agents/storage/__init__.py +41 -0
  418. aip_agents/storage/__init__.pyi +8 -0
  419. aip_agents/storage/base.py +85 -0
  420. aip_agents/storage/base.pyi +58 -0
  421. aip_agents/storage/clients/__init__.py +12 -0
  422. aip_agents/storage/clients/__init__.pyi +3 -0
  423. aip_agents/storage/clients/minio_client.py +318 -0
  424. aip_agents/storage/clients/minio_client.pyi +137 -0
  425. aip_agents/storage/config.py +62 -0
  426. aip_agents/storage/config.pyi +29 -0
  427. aip_agents/storage/providers/__init__.py +15 -0
  428. aip_agents/storage/providers/__init__.pyi +5 -0
  429. aip_agents/storage/providers/base.py +106 -0
  430. aip_agents/storage/providers/base.pyi +88 -0
  431. aip_agents/storage/providers/memory.py +114 -0
  432. aip_agents/storage/providers/memory.pyi +79 -0
  433. aip_agents/storage/providers/object_storage.py +214 -0
  434. aip_agents/storage/providers/object_storage.pyi +98 -0
  435. aip_agents/tools/__init__.py +64 -0
  436. aip_agents/tools/__init__.pyi +11 -0
  437. aip_agents/tools/browser_use/__init__.py +82 -0
  438. aip_agents/tools/browser_use/__init__.pyi +14 -0
  439. aip_agents/tools/browser_use/action_parser.py +103 -0
  440. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  441. aip_agents/tools/browser_use/browser_use_tool.py +1120 -0
  442. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  443. aip_agents/tools/browser_use/llm_config.py +120 -0
  444. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  445. aip_agents/tools/browser_use/minio_storage.py +198 -0
  446. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  447. aip_agents/tools/browser_use/schemas.py +119 -0
  448. aip_agents/tools/browser_use/schemas.pyi +32 -0
  449. aip_agents/tools/browser_use/session.py +76 -0
  450. aip_agents/tools/browser_use/session.pyi +4 -0
  451. aip_agents/tools/browser_use/session_errors.py +132 -0
  452. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  453. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  454. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  455. aip_agents/tools/browser_use/streaming.py +815 -0
  456. aip_agents/tools/browser_use/streaming.pyi +81 -0
  457. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  458. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  459. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  460. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  461. aip_agents/tools/browser_use/types.py +78 -0
  462. aip_agents/tools/browser_use/types.pyi +45 -0
  463. aip_agents/tools/code_sandbox/__init__.py +26 -0
  464. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  465. aip_agents/tools/code_sandbox/constant.py +13 -0
  466. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  467. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
  468. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
  469. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  470. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  471. aip_agents/tools/constants.py +177 -0
  472. aip_agents/tools/constants.pyi +138 -0
  473. aip_agents/tools/date_range_tool.py +554 -0
  474. aip_agents/tools/date_range_tool.pyi +21 -0
  475. aip_agents/tools/document_loader/__init__.py +44 -0
  476. aip_agents/tools/document_loader/__init__.pyi +7 -0
  477. aip_agents/tools/document_loader/base_reader.py +302 -0
  478. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  479. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  480. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  481. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  482. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  483. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  484. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  485. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  486. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  487. aip_agents/tools/execute_ptc_code.py +308 -0
  488. aip_agents/tools/execute_ptc_code.pyi +90 -0
  489. aip_agents/tools/gl_connector/__init__.py +5 -0
  490. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  491. aip_agents/tools/gl_connector/tool.py +383 -0
  492. aip_agents/tools/gl_connector/tool.pyi +74 -0
  493. aip_agents/tools/gl_connector_tools.py +119 -0
  494. aip_agents/tools/gl_connector_tools.pyi +39 -0
  495. aip_agents/tools/memory_search/__init__.py +29 -0
  496. aip_agents/tools/memory_search/__init__.pyi +5 -0
  497. aip_agents/tools/memory_search/base.py +200 -0
  498. aip_agents/tools/memory_search/base.pyi +69 -0
  499. aip_agents/tools/memory_search/mem0.py +365 -0
  500. aip_agents/tools/memory_search/mem0.pyi +29 -0
  501. aip_agents/tools/memory_search/schema.py +81 -0
  502. aip_agents/tools/memory_search/schema.pyi +25 -0
  503. aip_agents/tools/memory_search_tool.py +34 -0
  504. aip_agents/tools/memory_search_tool.pyi +3 -0
  505. aip_agents/tools/time_tool.py +117 -0
  506. aip_agents/tools/time_tool.pyi +16 -0
  507. aip_agents/tools/tool_config_injector.py +300 -0
  508. aip_agents/tools/tool_config_injector.pyi +26 -0
  509. aip_agents/tools/web_search/__init__.py +15 -0
  510. aip_agents/tools/web_search/__init__.pyi +3 -0
  511. aip_agents/tools/web_search/serper_tool.py +187 -0
  512. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  513. aip_agents/types/__init__.py +70 -0
  514. aip_agents/types/__init__.pyi +36 -0
  515. aip_agents/types/a2a_events.py +13 -0
  516. aip_agents/types/a2a_events.pyi +3 -0
  517. aip_agents/utils/__init__.py +79 -0
  518. aip_agents/utils/__init__.pyi +11 -0
  519. aip_agents/utils/a2a_connector.py +1757 -0
  520. aip_agents/utils/a2a_connector.pyi +146 -0
  521. aip_agents/utils/artifact_helpers.py +502 -0
  522. aip_agents/utils/artifact_helpers.pyi +203 -0
  523. aip_agents/utils/constants.py +22 -0
  524. aip_agents/utils/constants.pyi +10 -0
  525. aip_agents/utils/datetime/__init__.py +34 -0
  526. aip_agents/utils/datetime/__init__.pyi +4 -0
  527. aip_agents/utils/datetime/normalization.py +231 -0
  528. aip_agents/utils/datetime/normalization.pyi +95 -0
  529. aip_agents/utils/datetime/timezone.py +206 -0
  530. aip_agents/utils/datetime/timezone.pyi +48 -0
  531. aip_agents/utils/env_loader.py +27 -0
  532. aip_agents/utils/env_loader.pyi +10 -0
  533. aip_agents/utils/event_handler_registry.py +58 -0
  534. aip_agents/utils/event_handler_registry.pyi +23 -0
  535. aip_agents/utils/file_prompt_utils.py +176 -0
  536. aip_agents/utils/file_prompt_utils.pyi +21 -0
  537. aip_agents/utils/final_response_builder.py +211 -0
  538. aip_agents/utils/final_response_builder.pyi +34 -0
  539. aip_agents/utils/formatter_llm_client.py +231 -0
  540. aip_agents/utils/formatter_llm_client.pyi +71 -0
  541. aip_agents/utils/langgraph/__init__.py +19 -0
  542. aip_agents/utils/langgraph/__init__.pyi +3 -0
  543. aip_agents/utils/langgraph/converter.py +128 -0
  544. aip_agents/utils/langgraph/converter.pyi +49 -0
  545. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  546. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  547. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  548. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  549. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  550. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  551. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1096 -0
  552. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  553. aip_agents/utils/langgraph/tool_output_management.py +1047 -0
  554. aip_agents/utils/langgraph/tool_output_management.pyi +329 -0
  555. aip_agents/utils/logger.py +195 -0
  556. aip_agents/utils/logger.pyi +60 -0
  557. aip_agents/utils/metadata/__init__.py +27 -0
  558. aip_agents/utils/metadata/__init__.pyi +5 -0
  559. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  560. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  561. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  562. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  563. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  564. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  565. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  566. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  567. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  568. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  569. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  570. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  571. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  572. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  573. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  574. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  575. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  576. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  577. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  578. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  579. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  580. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  581. aip_agents/utils/metadata_helper.py +358 -0
  582. aip_agents/utils/metadata_helper.pyi +117 -0
  583. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  584. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  585. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  586. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  587. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  588. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  589. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  590. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  591. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  592. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  593. aip_agents/utils/pii/__init__.py +25 -0
  594. aip_agents/utils/pii/__init__.pyi +5 -0
  595. aip_agents/utils/pii/pii_handler.py +397 -0
  596. aip_agents/utils/pii/pii_handler.pyi +96 -0
  597. aip_agents/utils/pii/pii_helper.py +207 -0
  598. aip_agents/utils/pii/pii_helper.pyi +78 -0
  599. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  600. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  601. aip_agents/utils/reference_helper.py +273 -0
  602. aip_agents/utils/reference_helper.pyi +81 -0
  603. aip_agents/utils/sse_chunk_transformer.py +831 -0
  604. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  605. aip_agents/utils/step_limit_manager.py +265 -0
  606. aip_agents/utils/step_limit_manager.pyi +112 -0
  607. aip_agents/utils/token_usage_helper.py +156 -0
  608. aip_agents/utils/token_usage_helper.pyi +60 -0
  609. aip_agents_binary-0.6.4.dist-info/METADATA +673 -0
  610. aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
  611. aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
  612. aip_agents_binary-0.6.4.dist-info/top_level.txt +1 -0
@@ -0,0 +1,146 @@
1
+ from _typeshed import Incomplete
2
+ from a2a.types import AgentCard
3
+ from aip_agents.schema.a2a import A2AStreamEventType as A2AStreamEventType
4
+ from aip_agents.utils.event_handler_registry import DEFAULT_EVENT_HANDLER_REGISTRY as DEFAULT_EVENT_HANDLER_REGISTRY, EventHandlerRegistry as EventHandlerRegistry
5
+ from aip_agents.utils.final_response_builder import FinalResponseMetadataOptions as FinalResponseMetadataOptions, assemble_final_response as assemble_final_response
6
+ from aip_agents.utils.logger import get_logger as get_logger
7
+ from aip_agents.utils.metadata_helper import Kind as Kind, MetadataFieldKeys as MetadataFieldKeys, MetadataTimeTracker as MetadataTimeTracker, Status as Status, create_metadata as create_metadata, create_status_update_metadata as create_status_update_metadata, create_tool_processing_metadata as create_tool_processing_metadata
8
+ from aip_agents.utils.sse_chunk_transformer import SSEChunkTransformer as SSEChunkTransformer
9
+ from collections.abc import AsyncGenerator
10
+ from pydantic import BaseModel
11
+ from typing import Any
12
+
13
+ logger: Incomplete
14
+
15
+ class ArtifactInfo(BaseModel):
16
+ """Structured artifact information for A2A communication.
17
+
18
+ This Pydantic model provides type safety and validation for artifact data
19
+ exchanged between agents through the A2A protocol.
20
+ """
21
+ artifact_id: str | None
22
+ name: str | None
23
+ content_type: str | None
24
+ mime_type: str | None
25
+ file_name: str | None
26
+ has_file_data: bool
27
+ has_file_uri: bool
28
+ file_data: str | None
29
+ file_uri: str | None
30
+ description: str | None
31
+ parts: int | None
32
+
33
+ class StreamingConfig(BaseModel):
34
+ """Configuration for A2A streaming operations."""
35
+ http_kwargs: dict[str, Any] | None
36
+
37
+ class A2AConnector:
38
+ """Handles A2A protocol communication between agents.
39
+
40
+ This class provides methods for sending messages to other agents using the A2A protocol,
41
+ supporting both synchronous and asynchronous communication patterns, as well as streaming
42
+ responses with immediate artifact event handling.
43
+ """
44
+ FLOAT_EPSILON: float
45
+ event_registry: EventHandlerRegistry
46
+ @staticmethod
47
+ def send_to_agent(agent_card: AgentCard, message: str | dict[str, Any], **kwargs: Any) -> dict[str, Any]:
48
+ """Synchronously sends a message to another agent using the A2A protocol.
49
+
50
+ This method is a synchronous wrapper around asend_to_agent. It handles the creation
51
+ of an event loop if one doesn't exist, and manages the asynchronous call internally.
52
+
53
+ Args:
54
+ agent_card: The AgentCard instance containing the target agent's details including
55
+ URL, authentication requirements, and capabilities.
56
+ message: The message to send to the agent. Can be either a string for simple text
57
+ messages or a dictionary for structured data.
58
+ **kwargs: Additional keyword arguments passed to asend_to_agent.
59
+
60
+ Returns:
61
+ A dictionary containing the response details:
62
+ - status (str): 'success' or 'error'
63
+ - content (str): Extracted text content from the response
64
+ - task_id (str, optional): ID of the created/updated task
65
+ - task_state (str, optional): Current state of the task
66
+ - raw_response (str): Complete JSON response from the A2A client
67
+ - error_type (str, optional): Type of error if status is 'error'
68
+ - message (str, optional): Error message if status is 'error'
69
+
70
+ Raises:
71
+ RuntimeError: If asend_to_agent encounters an unhandled exception.
72
+ """
73
+ @staticmethod
74
+ async def asend_to_agent(agent_card: AgentCard, message: str | dict[str, Any], **kwargs: Any) -> dict[str, Any]:
75
+ '''Asynchronously sends a message to another agent using the A2A protocol.
76
+
77
+ This method uses the streaming approach internally but only returns the final response,
78
+ avoiding direct httpx usage that can cause issues with Nuitka compilation.
79
+
80
+ Args:
81
+ agent_card: The AgentCard instance containing the target agent\'s details including
82
+ URL, authentication requirements, and capabilities.
83
+ message: The message to send to the agent. Can be either a string for simple text
84
+ messages or a dictionary for structured data.
85
+ **kwargs: Additional keyword arguments.
86
+
87
+ Returns:
88
+ A dictionary containing the final response with the simplified structure:
89
+ - status (str): "success" or "error"
90
+ - task_state (str): Final A2A TaskState value
91
+ - content (str): Final text content from the agent
92
+ - task_id (str): ID of the associated task
93
+ - context_id (str): Context ID of the task
94
+ - final (bool): Always True for final responses
95
+ - artifacts (list): List of all artifacts created during execution
96
+
97
+ Raises:
98
+ Exception: If there\'s an error during message sending or processing.
99
+ '''
100
+ @staticmethod
101
+ async def astream_to_agent(agent_card: AgentCard, message: str | dict[str, Any], **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
102
+ '''Asynchronously sends a streaming message to another agent using the A2A protocol.
103
+
104
+ This method supports streaming responses from the target agent, yielding chunks of
105
+ the response as they become available. It handles the official A2A streaming event
106
+ types as defined in the specification.
107
+
108
+ Args:
109
+ agent_card: The AgentCard instance containing the target agent\'s details including
110
+ URL, authentication requirements, and capabilities.
111
+ message: The message to send to the agent. Can be either a string for simple text
112
+ messages or a dictionary for structured data.
113
+ **kwargs: Additional keyword arguments.
114
+
115
+ Yields:
116
+ Dictionaries containing streaming response chunks with a simplified structure:
117
+
118
+ For successful responses:
119
+ - status (str): "success" or "error"
120
+ - task_state (str): A2A TaskState value
121
+ - content (str): Text content from the agent
122
+ - task_id (str): ID of the associated task
123
+ - context_id (str): Context ID of the task
124
+ - final (bool): Whether this is the final update
125
+ - artifacts (list, optional): List of artifacts created in this step
126
+
127
+ Each artifact in the artifacts list contains:
128
+ - artifact_id (str): ID of the artifact
129
+ - name (str): Name of the artifact
130
+ - content_type (str): "text" or "file"
131
+ - mime_type (str): MIME type of the artifact
132
+ - file_name (str, optional): Name of the file for file artifacts
133
+ - has_file_data (bool): Whether file data is included
134
+ - has_file_uri (bool): Whether file URI is included
135
+ - file_data (str, optional): Base64 encoded file content
136
+ - file_uri (str, optional): URI reference to the file
137
+
138
+ For errors:
139
+ - status (str): "error"
140
+ - error_type (str): Type of error encountered
141
+ - message (str): Error description
142
+
143
+ Raises:
144
+ httpx.HTTPError: If there\'s an HTTP-related error during the streaming request.
145
+ Exception: For any other unexpected errors during message streaming or processing.
146
+ '''
@@ -0,0 +1,502 @@
1
+ """Utility functions for artifact handling in agent tools.
2
+
3
+ This module provides standardized functions for creating artifact responses
4
+ that are compatible with the A2A protocol and the agent's artifact handling system.
5
+
6
+ Authors:
7
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
8
+ """
9
+
10
+ import base64
11
+ import hashlib
12
+ from typing import Any
13
+
14
+ from deprecated import deprecated
15
+ from langgraph.types import Command
16
+ from pydantic import ValidationError
17
+
18
+ from aip_agents.a2a.types import Artifact, ArtifactType, MimeType, get_mime_type_from_filename
19
+
20
+
21
+ class ArtifactHandler:
22
+ """Handler class for creating and managing artifacts in agent tools.
23
+
24
+ This class provides a clean, object-oriented interface for artifact creation
25
+ with built-in validation, deduplication, and standardized formatting.
26
+ """
27
+
28
+ def __init__(self):
29
+ """Initialize the ArtifactHandler."""
30
+ self._artifact_cache: dict[str, dict[str, Any]] = {}
31
+
32
+ @deprecated(version="0.5.0", reason="Use create_artifact(...) which handles text and binary.")
33
+ def create_file_artifact( # noqa: PLR0913
34
+ self,
35
+ result: str,
36
+ artifact_data: bytes | str,
37
+ artifact_name: str,
38
+ artifact_description: str = "",
39
+ mime_type: str | None = None,
40
+ enable_deduplication: bool = True,
41
+ ) -> dict[str, Any]:
42
+ """Deprecated. Use create_artifact instead.
43
+
44
+ Args:
45
+ result (str): The message/result to show to the agent.
46
+ artifact_data (bytes | str): The binary data for the artifact.
47
+ artifact_name (str): The name for the artifact file.
48
+ artifact_description (str, optional): Description of the artifact. Defaults to "".
49
+ mime_type (str | None, optional): MIME type of the artifact. If None, will be auto-detected.
50
+ enable_deduplication (bool, optional): Whether to deduplicate by content hash. Defaults to True.
51
+
52
+ Returns:
53
+ dict[str, Any]: Dictionary with 'result' and 'artifact' keys.
54
+ """
55
+ return self.create_artifact(
56
+ result=result,
57
+ data=artifact_data,
58
+ artifact_name=artifact_name,
59
+ artifact_description=artifact_description,
60
+ mime_type=mime_type,
61
+ enable_deduplication=enable_deduplication,
62
+ )
63
+
64
+ @deprecated(version="0.5.0", reason="Use create_artifact(...) which handles text and binary.")
65
+ def create_text_artifact( # noqa: PLR0913
66
+ self,
67
+ result: str,
68
+ artifact_text: str,
69
+ artifact_name: str,
70
+ artifact_description: str = "",
71
+ mime_type: str | None = None,
72
+ enable_deduplication: bool = True,
73
+ ) -> dict[str, Any]:
74
+ """Deprecated. Use create_artifact instead.
75
+
76
+ Args:
77
+ result (str): The message/result to show to the agent.
78
+ artifact_text (str): The text content for the artifact.
79
+ artifact_name (str): The name for the artifact file.
80
+ artifact_description (str, optional): Description of the artifact. Defaults to "".
81
+ mime_type (str | None, optional): MIME type of the artifact. If None, will be auto-detected.
82
+ enable_deduplication (bool, optional): Whether to deduplicate by content hash. Defaults to True.
83
+
84
+ Returns:
85
+ dict[str, Any]: Dictionary with 'result' and 'artifact' keys.
86
+ """
87
+ return self.create_artifact(
88
+ result=result,
89
+ data=artifact_text,
90
+ artifact_name=artifact_name,
91
+ artifact_description=artifact_description,
92
+ mime_type=mime_type,
93
+ enable_deduplication=enable_deduplication,
94
+ )
95
+
96
+ def create_artifact( # noqa: PLR0913
97
+ self,
98
+ result: str,
99
+ data: bytes | str,
100
+ artifact_name: str,
101
+ artifact_description: str = "",
102
+ mime_type: str | None = None,
103
+ enable_deduplication: bool = True,
104
+ ) -> dict[str, Any]:
105
+ """Create an artifact with automatic text/binary handling.
106
+
107
+ Args:
108
+ result: The message/result to show to the agent.
109
+ data: The data for the artifact. Bytes for binary; str for text or base64.
110
+ artifact_name: The filename to present to users.
111
+ artifact_description: Description of the artifact.
112
+ mime_type: Optional MIME type. If None, inferred from filename.
113
+ enable_deduplication: Whether to deduplicate by content hash.
114
+
115
+ Returns:
116
+ Dictionary with 'result' and 'artifact' keys.
117
+ """
118
+ inferred_mime = self._infer_mime_type(artifact_name, mime_type)
119
+ is_text_like = self._is_text_mime(inferred_mime)
120
+
121
+ artifact_b64 = self._encode_to_base64(data, treat_as_text=is_text_like)
122
+ effective_mime = (
123
+ inferred_mime
124
+ if not is_text_like or inferred_mime != MimeType.APPLICATION_OCTET_STREAM
125
+ else MimeType.TEXT_PLAIN
126
+ )
127
+
128
+ # Deduplication check
129
+ if enable_deduplication:
130
+ artifact_hash = self.generate_artifact_hash(artifact_b64, artifact_name, effective_mime)
131
+ cached = self._artifact_cache.get(artifact_hash)
132
+ if cached:
133
+ return {
134
+ "result": f"Using cached artifact: {cached['artifact']['name']}",
135
+ "artifact": cached["artifact"],
136
+ }
137
+
138
+ artifact_payload = self._build_artifact_payload(
139
+ b64_data=artifact_b64,
140
+ name=artifact_name,
141
+ description=artifact_description,
142
+ mime=effective_mime,
143
+ )
144
+
145
+ response = {"result": result, "artifact": artifact_payload}
146
+
147
+ if enable_deduplication:
148
+ artifact_hash = self.generate_artifact_hash(artifact_b64, artifact_name, effective_mime)
149
+ self._artifact_cache[artifact_hash] = response
150
+
151
+ return response
152
+
153
+ def _infer_mime_type(self, artifact_name: str, override_mime_type: str | None) -> str:
154
+ """Return explicit MIME if provided; otherwise infer from filename.
155
+
156
+ Args:
157
+ artifact_name (str): The name of the artifact.
158
+ override_mime_type (str | None): The MIME type to override.
159
+
160
+ Returns:
161
+ str: The inferred MIME type.
162
+ """
163
+ return override_mime_type or get_mime_type_from_filename(artifact_name)
164
+
165
+ def _is_text_mime(self, mime: str) -> bool:
166
+ """Check whether a MIME type should be treated as text content.
167
+
168
+ Args:
169
+ mime (str): The MIME type to check.
170
+
171
+ Returns:
172
+ bool: True if the MIME type should be treated as text content, False otherwise.
173
+ """
174
+ return mime.startswith("text/") or mime == MimeType.APPLICATION_JSON
175
+
176
+ def _encode_to_base64(self, data: bytes | str, treat_as_text: bool) -> str:
177
+ """Encode data to base64 according to handling rules for text/binary.
178
+
179
+ - For text: always base64-encode UTF-8 bytes
180
+ - For binary: bytes are base64-encoded; str is assumed already base64
181
+
182
+ Args:
183
+ data (bytes | str): The data to encode.
184
+ treat_as_text (bool): Whether to treat the data as text.
185
+
186
+ Returns:
187
+ str: The base64 encoded data.
188
+ """
189
+ if treat_as_text:
190
+ if isinstance(data, str):
191
+ raw = data.encode("utf-8")
192
+ elif isinstance(data, bytes):
193
+ raw = data
194
+ else:
195
+ raise TypeError("data must be bytes or str")
196
+ return base64.b64encode(raw).decode("utf-8")
197
+
198
+ # binary path
199
+ if isinstance(data, bytes):
200
+ return base64.b64encode(data).decode("utf-8")
201
+ if isinstance(data, str):
202
+ return data
203
+ raise TypeError("data must be bytes or str")
204
+
205
+ def _build_artifact_payload(self, b64_data: str, name: str, description: str, mime: str) -> dict[str, Any]:
206
+ """Construct a validated artifact payload as a dict via the Artifact model.
207
+
208
+ Args:
209
+ b64_data (str): Base64 encoded data.
210
+ name (str): Artifact name.
211
+ description (str): Artifact description.
212
+ mime (str): MIME type.
213
+
214
+ Returns:
215
+ dict[str, Any]: Dictionary with 'artifact_type', 'data', 'name', 'description', and 'mime_type' keys.
216
+ """
217
+ return Artifact(
218
+ artifact_type=ArtifactType.FILE,
219
+ data=b64_data,
220
+ name=name,
221
+ description=description,
222
+ mime_type=mime,
223
+ ).model_dump()
224
+
225
+ def create_error_response(self, error_message: str) -> str:
226
+ """Create a standardized error response for tools.
227
+
228
+ Args:
229
+ error_message: The error message to return.
230
+
231
+ Returns:
232
+ String with error information.
233
+ """
234
+ return f"Error: {error_message}"
235
+
236
+ def clear_cache(self) -> None:
237
+ """Clear the artifact cache."""
238
+ self._artifact_cache.clear()
239
+
240
+ def get_cache_size(self) -> int:
241
+ """Get the number of cached artifacts.
242
+
243
+ Returns:
244
+ Number of artifacts in cache.
245
+ """
246
+ return len(self._artifact_cache)
247
+
248
+ @staticmethod
249
+ def generate_artifact_hash(artifact_data: str, name: str, mime_type: str) -> str:
250
+ """Generate a hash for artifact deduplication.
251
+
252
+ Args:
253
+ artifact_data: Base64 encoded artifact data.
254
+ name: Artifact name.
255
+ mime_type: MIME type.
256
+
257
+ Returns:
258
+ Hash string for deduplication.
259
+ """
260
+ content = f"{artifact_data}:{name}:{mime_type}"
261
+ return hashlib.sha256(content.encode()).hexdigest()
262
+
263
+
264
+ # Global instance for convenience
265
+ _default_handler = ArtifactHandler()
266
+
267
+
268
+ @deprecated(version="0.5.0", reason="Use create_artifact_command(...) which returns a Command update.")
269
+ def create_artifact_response( # noqa: PLR0913
270
+ result: str,
271
+ artifact_data: bytes | str,
272
+ artifact_name: str,
273
+ artifact_description: str = "",
274
+ mime_type: str | None = None,
275
+ ) -> dict[str, Any]:
276
+ r"""Create a standardized artifact response for tools.
277
+
278
+ This function creates a response that separates the agent-facing result
279
+ from the user-facing artifact, following the established pattern for
280
+ artifact generation in the agent system.
281
+
282
+ Args:
283
+ result: The message/result to show to the agent (clean, no file data).
284
+ artifact_data: The binary data or base64 string for the artifact.
285
+ artifact_name: The name for the artifact file.
286
+ artifact_description: Description of the artifact. Defaults to "".
287
+ mime_type: MIME type of the artifact. If None, will be auto-detected from filename.
288
+
289
+ Returns:
290
+ Dictionary with 'result' and 'artifacts' keys (artifacts is always a list).
291
+
292
+ Example:
293
+ >>> import io
294
+ >>> csv_data = "Name,Age\\nAlice,30\\nBob,25"
295
+ >>> response = create_artifact_response(
296
+ ... result="Generated a 2-row CSV table",
297
+ ... artifact_data=csv_data.encode('utf-8'),
298
+ ... artifact_name="data.csv",
299
+ ... artifact_description="Sample data table",
300
+ ... mime_type="text/csv"
301
+ ... )
302
+ >>> assert "result" in response
303
+ >>> assert "artifacts" in response
304
+ >>> assert isinstance(response["artifacts"], list)
305
+ """
306
+ single_artifact = _default_handler.create_artifact(
307
+ result=result,
308
+ data=artifact_data,
309
+ artifact_name=artifact_name,
310
+ artifact_description=artifact_description,
311
+ mime_type=mime_type,
312
+ enable_deduplication=False,
313
+ )
314
+
315
+ # Convert single artifact to list format
316
+ return {"result": single_artifact["result"], "artifacts": [single_artifact["artifact"]]}
317
+
318
+
319
+ @deprecated(version="0.5.0", reason="Use create_artifact_command(...) which handles text and binary.")
320
+ def create_text_artifact_response(
321
+ result: str,
322
+ artifact_text: str,
323
+ artifact_name: str,
324
+ artifact_description: str = "",
325
+ mime_type: str | None = None,
326
+ ) -> dict[str, Any]:
327
+ """Create a standardized artifact response for tools.
328
+
329
+ Args:
330
+ result: The message/result to show to the agent.
331
+ artifact_text: The text content for the artifact.
332
+ artifact_name: The name for the artifact file.
333
+ artifact_description: Description of the artifact.
334
+ mime_type: MIME type of the artifact. If None, will be auto-detected from filename.
335
+
336
+ Returns:
337
+ Dictionary with 'result' and 'artifacts' keys (artifacts is always a list).
338
+ """
339
+ return _default_handler.create_artifact(
340
+ result=result,
341
+ data=artifact_text,
342
+ artifact_name=artifact_name,
343
+ artifact_description=artifact_description,
344
+ mime_type=mime_type,
345
+ enable_deduplication=False,
346
+ )
347
+
348
+
349
+ @deprecated(version="0.5.0", reason="Use create_artifact_command(...) and compose updates instead of dict responses.")
350
+ def create_multiple_artifacts_response(result: str, artifacts: list[dict[str, Any]]) -> dict[str, Any]:
351
+ """Create a standardized response for multiple artifacts.
352
+
353
+ Args:
354
+ result: The message/result to show to the agent.
355
+ artifacts: List of artifact dictionaries.
356
+
357
+ Returns:
358
+ Dictionary with 'result' and 'artifacts' keys.
359
+ """
360
+ return {"result": result, "artifacts": artifacts}
361
+
362
+
363
+ def create_artifact_command( # noqa: PLR0913
364
+ result: str,
365
+ artifact_data: bytes | str,
366
+ artifact_name: str,
367
+ artifact_description: str = "",
368
+ mime_type: str | None = None,
369
+ metadata_update: dict[str, Any] | None = None,
370
+ ) -> Command:
371
+ """Create a Command that updates artifacts (and optional metadata).
372
+
373
+ Args:
374
+ result: Message/result to show to the agent (for ToolMessage content).
375
+ artifact_data: The binary data or base64 string for the artifact.
376
+ artifact_name: The name for the artifact file.
377
+ artifact_description: Description of the artifact.
378
+ mime_type: MIME type of the artifact. If None, auto-detected from filename.
379
+ metadata_update: Optional metadata delta to merge into state metadata.
380
+
381
+ Returns:
382
+ Command: A LangGraph Command with update containing 'result', 'artifacts', and optional 'metadata'.
383
+ """
384
+ single = _default_handler.create_artifact(
385
+ result=result,
386
+ data=artifact_data,
387
+ artifact_name=artifact_name,
388
+ artifact_description=artifact_description,
389
+ mime_type=mime_type,
390
+ enable_deduplication=False,
391
+ )
392
+ update: dict[str, Any] = {
393
+ "result": single["result"],
394
+ "artifacts": [single["artifact"]],
395
+ }
396
+ if metadata_update:
397
+ update["metadata"] = metadata_update
398
+ return Command(update=update)
399
+
400
+
401
+ def create_multiple_artifacts_command(
402
+ result: str,
403
+ artifacts: list[Artifact | dict[str, Any]] | None = None,
404
+ metadata_update: dict[str, Any] | None = None,
405
+ ) -> Command:
406
+ """Create a Command that updates multiple artifacts (and optional metadata).
407
+
408
+ The 'artifacts' list accepts mixed item types:
409
+ - Artifact: a typed artifact model (preferred). Will be converted via model_dump().
410
+ - dict: a prebuilt artifact dict ready for A2A.
411
+ - DataSpec dict: raw spec to build an artifact with keys:
412
+ {'data': bytes|str, 'artifact_name': str, 'artifact_description'?: str, 'mime_type'?: str}
413
+
414
+ Args:
415
+ result: Message/result to show to the agent.
416
+ artifacts: List of items (Artifact | dict) to attach or build.
417
+ metadata_update: Optional metadata delta to merge into state metadata.
418
+
419
+ Returns:
420
+ Command: A LangGraph Command with update containing 'result', 'artifacts', and optional 'metadata'.
421
+ """
422
+ built_artifacts: list[dict[str, Any]] = []
423
+ if not artifacts:
424
+ raise ValueError("At least one of 'artifacts' must be provided and non-empty")
425
+
426
+ for art in artifacts or []:
427
+ if isinstance(art, Artifact):
428
+ built_artifacts.append(art.model_dump())
429
+ elif isinstance(art, dict):
430
+ try:
431
+ validated = Artifact.model_validate(art)
432
+ except ValidationError as e:
433
+ raise ValueError(f"Invalid artifact dict: {e}") from e
434
+ built_artifacts.append(validated.model_dump())
435
+ else:
436
+ raise TypeError("artifacts items must be Artifact or dict")
437
+
438
+ update: dict[str, Any] = {"result": result, "artifacts": built_artifacts}
439
+ if metadata_update:
440
+ update["metadata"] = metadata_update
441
+ return Command(update=update)
442
+
443
+
444
+ def create_error_response(error_message: str) -> str:
445
+ """Create a standardized error response for tools.
446
+
447
+ For error cases, we return a simple string that will be passed directly
448
+ to the agent without any artifact processing.
449
+
450
+ Args:
451
+ error_message: The error message to return.
452
+
453
+ Returns:
454
+ String with error information.
455
+ """
456
+ return _default_handler.create_error_response(error_message)
457
+
458
+
459
+ def extract_artifacts_from_agent_response(result: Any) -> tuple[str, list[dict[str, Any]]]:
460
+ """Extract artifacts from agent response for delegation tools.
461
+
462
+ Args:
463
+ result: The result returned by the delegated agent.
464
+
465
+ Returns:
466
+ Tuple of (text_response, artifacts_list) where:
467
+ - text_response: The text content for the agent
468
+ - artifacts_list: List of artifacts to be passed through
469
+ """
470
+ if not isinstance(result, dict):
471
+ return str(result), []
472
+
473
+ text_response = result.get("output", str(result))
474
+ artifacts = result.get("full_final_state", {}).get("artifacts", [])
475
+
476
+ # Ensure artifacts is a list before returning
477
+ if not isinstance(artifacts, list):
478
+ artifacts = []
479
+
480
+ return str(text_response), artifacts
481
+
482
+
483
+ def create_delegation_response_with_artifacts(
484
+ result: str, artifacts: list[dict[str, Any]], agent_name: str = ""
485
+ ) -> Command:
486
+ """Create a delegation response that includes artifacts only when needed.
487
+
488
+ Args:
489
+ result: The text result from the delegated agent.
490
+ artifacts: List of artifacts from the delegated agent (always a list).
491
+ agent_name: Name of the agent for prefixing the result.
492
+
493
+ Returns:
494
+ Command containing 'result' and optional 'artifacts'.
495
+ """
496
+ # Format the result text with agent attribution
497
+ formatted_result = f"[{agent_name}] {result}" if agent_name else result
498
+
499
+ update: dict[str, Any] = {"result": formatted_result}
500
+ if artifacts:
501
+ update["artifacts"] = artifacts
502
+ return Command(update=update)