aip-agents-binary 0.5.20__py3-none-manylinux_2_31_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/__init__.pyi +19 -0
  3. aip_agents/a2a/__init__.py +19 -0
  4. aip_agents/a2a/__init__.pyi +3 -0
  5. aip_agents/a2a/server/__init__.py +10 -0
  6. aip_agents/a2a/server/__init__.pyi +4 -0
  7. aip_agents/a2a/server/base_executor.py +1086 -0
  8. aip_agents/a2a/server/base_executor.pyi +73 -0
  9. aip_agents/a2a/server/google_adk_executor.py +198 -0
  10. aip_agents/a2a/server/google_adk_executor.pyi +51 -0
  11. aip_agents/a2a/server/langflow_executor.py +180 -0
  12. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  13. aip_agents/a2a/server/langgraph_executor.py +270 -0
  14. aip_agents/a2a/server/langgraph_executor.pyi +47 -0
  15. aip_agents/a2a/types.py +232 -0
  16. aip_agents/a2a/types.pyi +132 -0
  17. aip_agents/agent/__init__.py +27 -0
  18. aip_agents/agent/__init__.pyi +9 -0
  19. aip_agents/agent/base_agent.py +970 -0
  20. aip_agents/agent/base_agent.pyi +221 -0
  21. aip_agents/agent/base_langgraph_agent.py +2942 -0
  22. aip_agents/agent/base_langgraph_agent.pyi +232 -0
  23. aip_agents/agent/google_adk_agent.py +926 -0
  24. aip_agents/agent/google_adk_agent.pyi +141 -0
  25. aip_agents/agent/google_adk_constants.py +6 -0
  26. aip_agents/agent/google_adk_constants.pyi +3 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/__init__.pyi +6 -0
  29. aip_agents/agent/hitl/config.py +28 -0
  30. aip_agents/agent/hitl/config.pyi +15 -0
  31. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  32. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  33. aip_agents/agent/hitl/manager.py +532 -0
  34. aip_agents/agent/hitl/manager.pyi +200 -0
  35. aip_agents/agent/hitl/models.py +18 -0
  36. aip_agents/agent/hitl/models.pyi +3 -0
  37. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  38. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  39. aip_agents/agent/hitl/prompt/base.py +42 -0
  40. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  41. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  42. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  43. aip_agents/agent/hitl/registry.py +149 -0
  44. aip_agents/agent/hitl/registry.pyi +101 -0
  45. aip_agents/agent/interface.py +138 -0
  46. aip_agents/agent/interface.pyi +81 -0
  47. aip_agents/agent/interfaces.py +65 -0
  48. aip_agents/agent/interfaces.pyi +44 -0
  49. aip_agents/agent/langflow_agent.py +464 -0
  50. aip_agents/agent/langflow_agent.pyi +133 -0
  51. aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
  52. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
  53. aip_agents/agent/langgraph_react_agent.py +2514 -0
  54. aip_agents/agent/langgraph_react_agent.pyi +126 -0
  55. aip_agents/agent/system_instruction_context.py +34 -0
  56. aip_agents/agent/system_instruction_context.pyi +13 -0
  57. aip_agents/clients/__init__.py +10 -0
  58. aip_agents/clients/__init__.pyi +4 -0
  59. aip_agents/clients/langflow/__init__.py +10 -0
  60. aip_agents/clients/langflow/__init__.pyi +4 -0
  61. aip_agents/clients/langflow/client.py +477 -0
  62. aip_agents/clients/langflow/client.pyi +140 -0
  63. aip_agents/clients/langflow/types.py +18 -0
  64. aip_agents/clients/langflow/types.pyi +7 -0
  65. aip_agents/constants.py +23 -0
  66. aip_agents/constants.pyi +7 -0
  67. aip_agents/credentials/manager.py +132 -0
  68. aip_agents/examples/__init__.py +5 -0
  69. aip_agents/examples/__init__.pyi +0 -0
  70. aip_agents/examples/compare_streaming_client.py +783 -0
  71. aip_agents/examples/compare_streaming_client.pyi +48 -0
  72. aip_agents/examples/compare_streaming_server.py +142 -0
  73. aip_agents/examples/compare_streaming_server.pyi +18 -0
  74. aip_agents/examples/demo_memory_recall.py +401 -0
  75. aip_agents/examples/demo_memory_recall.pyi +58 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
  78. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
  80. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  81. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
  82. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  83. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
  84. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
  86. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
  88. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  89. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
  90. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  91. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
  92. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  93. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
  94. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  95. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
  96. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  97. aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
  98. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  99. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
  100. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  101. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  102. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  103. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
  106. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
  108. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
  110. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
  112. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
  114. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
  118. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
  120. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
  122. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
  124. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  125. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
  126. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  127. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
  128. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  129. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
  130. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  131. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
  132. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  133. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
  134. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  135. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
  136. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  137. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
  138. aip_agents/examples/hello_world_google_adk.py +41 -0
  139. aip_agents/examples/hello_world_google_adk.pyi +5 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  141. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
  142. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  143. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
  144. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  145. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
  146. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  147. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
  148. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  149. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
  150. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  151. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
  152. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  153. aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
  154. aip_agents/examples/hello_world_langchain.py +28 -0
  155. aip_agents/examples/hello_world_langchain.pyi +5 -0
  156. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  157. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
  158. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  159. aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
  160. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  161. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  162. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  163. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
  164. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  165. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  166. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  167. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
  168. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  169. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
  170. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  171. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
  172. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  173. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
  174. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  175. aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
  176. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  177. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
  178. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  179. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  180. aip_agents/examples/hello_world_langgraph.py +39 -0
  181. aip_agents/examples/hello_world_langgraph.pyi +5 -0
  182. aip_agents/examples/hello_world_langgraph_bosa_twitter.py +41 -0
  183. aip_agents/examples/hello_world_langgraph_bosa_twitter.pyi +5 -0
  184. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  185. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
  186. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  187. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
  188. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  189. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
  190. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  191. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
  192. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  193. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
  194. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  195. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
  196. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  197. aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
  198. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  199. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
  200. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  201. aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
  202. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  203. aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
  204. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  205. aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
  206. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  207. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
  208. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  209. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
  210. aip_agents/examples/hello_world_pii_logger.py +21 -0
  211. aip_agents/examples/hello_world_pii_logger.pyi +5 -0
  212. aip_agents/examples/hello_world_sentry.py +133 -0
  213. aip_agents/examples/hello_world_sentry.pyi +21 -0
  214. aip_agents/examples/hello_world_step_limits.py +273 -0
  215. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  216. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  217. aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
  218. aip_agents/examples/hello_world_tool_output_client.py +46 -0
  219. aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
  220. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  221. aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
  222. aip_agents/examples/hitl_demo.py +724 -0
  223. aip_agents/examples/hitl_demo.pyi +67 -0
  224. aip_agents/examples/mcp_configs/configs.py +63 -0
  225. aip_agents/examples/mcp_servers/common.py +76 -0
  226. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  227. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  228. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  229. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  230. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  231. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  232. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  233. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  234. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  235. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  236. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  237. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  238. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  239. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  240. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  241. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  242. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  243. aip_agents/examples/tools/__init__.py +27 -0
  244. aip_agents/examples/tools/__init__.pyi +9 -0
  245. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  246. aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
  247. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  248. aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
  249. aip_agents/examples/tools/data_generator_tool.py +103 -0
  250. aip_agents/examples/tools/data_generator_tool.pyi +15 -0
  251. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  252. aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
  253. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  254. aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
  255. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  256. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
  257. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  258. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
  259. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  260. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
  261. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  262. aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
  263. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  264. aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
  265. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  266. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  267. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  268. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  269. aip_agents/examples/tools/random_chart_tool.py +142 -0
  270. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  271. aip_agents/examples/tools/serper_tool.py +202 -0
  272. aip_agents/examples/tools/serper_tool.pyi +16 -0
  273. aip_agents/examples/tools/stock_tools.py +82 -0
  274. aip_agents/examples/tools/stock_tools.pyi +36 -0
  275. aip_agents/examples/tools/table_generator_tool.py +167 -0
  276. aip_agents/examples/tools/table_generator_tool.pyi +22 -0
  277. aip_agents/examples/tools/time_tool.py +82 -0
  278. aip_agents/examples/tools/time_tool.pyi +15 -0
  279. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  280. aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
  281. aip_agents/executor/agent_executor.py +473 -0
  282. aip_agents/executor/base.py +48 -0
  283. aip_agents/mcp/__init__.py +1 -0
  284. aip_agents/mcp/__init__.pyi +0 -0
  285. aip_agents/mcp/client/__init__.py +14 -0
  286. aip_agents/mcp/client/__init__.pyi +5 -0
  287. aip_agents/mcp/client/base_mcp_client.py +369 -0
  288. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  289. aip_agents/mcp/client/connection_manager.py +193 -0
  290. aip_agents/mcp/client/connection_manager.pyi +48 -0
  291. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  292. aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
  293. aip_agents/mcp/client/google_adk/client.py +381 -0
  294. aip_agents/mcp/client/google_adk/client.pyi +75 -0
  295. aip_agents/mcp/client/langchain/__init__.py +11 -0
  296. aip_agents/mcp/client/langchain/__init__.pyi +3 -0
  297. aip_agents/mcp/client/langchain/client.py +265 -0
  298. aip_agents/mcp/client/langchain/client.pyi +48 -0
  299. aip_agents/mcp/client/persistent_session.py +359 -0
  300. aip_agents/mcp/client/persistent_session.pyi +113 -0
  301. aip_agents/mcp/client/session_pool.py +351 -0
  302. aip_agents/mcp/client/session_pool.pyi +101 -0
  303. aip_agents/mcp/client/transports.py +215 -0
  304. aip_agents/mcp/client/transports.pyi +123 -0
  305. aip_agents/mcp/utils/__init__.py +7 -0
  306. aip_agents/mcp/utils/__init__.pyi +0 -0
  307. aip_agents/mcp/utils/config_validator.py +139 -0
  308. aip_agents/mcp/utils/config_validator.pyi +82 -0
  309. aip_agents/memory/__init__.py +14 -0
  310. aip_agents/memory/__init__.pyi +5 -0
  311. aip_agents/memory/adapters/__init__.py +10 -0
  312. aip_agents/memory/adapters/__init__.pyi +4 -0
  313. aip_agents/memory/adapters/base_adapter.py +717 -0
  314. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  315. aip_agents/memory/adapters/mem0.py +84 -0
  316. aip_agents/memory/adapters/mem0.pyi +22 -0
  317. aip_agents/memory/base.py +84 -0
  318. aip_agents/memory/base.pyi +60 -0
  319. aip_agents/memory/constants.py +49 -0
  320. aip_agents/memory/constants.pyi +25 -0
  321. aip_agents/memory/factory.py +86 -0
  322. aip_agents/memory/factory.pyi +24 -0
  323. aip_agents/memory/guidance.py +20 -0
  324. aip_agents/memory/guidance.pyi +3 -0
  325. aip_agents/memory/simple_memory.py +47 -0
  326. aip_agents/memory/simple_memory.pyi +23 -0
  327. aip_agents/middleware/__init__.py +17 -0
  328. aip_agents/middleware/__init__.pyi +5 -0
  329. aip_agents/middleware/base.py +88 -0
  330. aip_agents/middleware/base.pyi +71 -0
  331. aip_agents/middleware/manager.py +128 -0
  332. aip_agents/middleware/manager.pyi +80 -0
  333. aip_agents/middleware/todolist.py +274 -0
  334. aip_agents/middleware/todolist.pyi +125 -0
  335. aip_agents/schema/__init__.py +69 -0
  336. aip_agents/schema/__init__.pyi +9 -0
  337. aip_agents/schema/a2a.py +56 -0
  338. aip_agents/schema/a2a.pyi +40 -0
  339. aip_agents/schema/agent.py +111 -0
  340. aip_agents/schema/agent.pyi +65 -0
  341. aip_agents/schema/hitl.py +157 -0
  342. aip_agents/schema/hitl.pyi +89 -0
  343. aip_agents/schema/langgraph.py +37 -0
  344. aip_agents/schema/langgraph.pyi +28 -0
  345. aip_agents/schema/model_id.py +97 -0
  346. aip_agents/schema/model_id.pyi +54 -0
  347. aip_agents/schema/step_limit.py +108 -0
  348. aip_agents/schema/step_limit.pyi +63 -0
  349. aip_agents/schema/storage.py +40 -0
  350. aip_agents/schema/storage.pyi +21 -0
  351. aip_agents/sentry/__init__.py +11 -0
  352. aip_agents/sentry/__init__.pyi +3 -0
  353. aip_agents/sentry/sentry.py +151 -0
  354. aip_agents/sentry/sentry.pyi +48 -0
  355. aip_agents/storage/__init__.py +41 -0
  356. aip_agents/storage/__init__.pyi +8 -0
  357. aip_agents/storage/base.py +85 -0
  358. aip_agents/storage/base.pyi +58 -0
  359. aip_agents/storage/clients/__init__.py +12 -0
  360. aip_agents/storage/clients/__init__.pyi +3 -0
  361. aip_agents/storage/clients/minio_client.py +318 -0
  362. aip_agents/storage/clients/minio_client.pyi +137 -0
  363. aip_agents/storage/config.py +62 -0
  364. aip_agents/storage/config.pyi +29 -0
  365. aip_agents/storage/providers/__init__.py +15 -0
  366. aip_agents/storage/providers/__init__.pyi +5 -0
  367. aip_agents/storage/providers/base.py +106 -0
  368. aip_agents/storage/providers/base.pyi +88 -0
  369. aip_agents/storage/providers/memory.py +114 -0
  370. aip_agents/storage/providers/memory.pyi +79 -0
  371. aip_agents/storage/providers/object_storage.py +214 -0
  372. aip_agents/storage/providers/object_storage.pyi +98 -0
  373. aip_agents/tools/__init__.py +33 -0
  374. aip_agents/tools/__init__.pyi +13 -0
  375. aip_agents/tools/bosa_tools.py +105 -0
  376. aip_agents/tools/bosa_tools.pyi +37 -0
  377. aip_agents/tools/browser_use/__init__.py +82 -0
  378. aip_agents/tools/browser_use/__init__.pyi +14 -0
  379. aip_agents/tools/browser_use/action_parser.py +103 -0
  380. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  381. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  382. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  383. aip_agents/tools/browser_use/llm_config.py +120 -0
  384. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  385. aip_agents/tools/browser_use/minio_storage.py +198 -0
  386. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  387. aip_agents/tools/browser_use/schemas.py +119 -0
  388. aip_agents/tools/browser_use/schemas.pyi +32 -0
  389. aip_agents/tools/browser_use/session.py +76 -0
  390. aip_agents/tools/browser_use/session.pyi +4 -0
  391. aip_agents/tools/browser_use/session_errors.py +132 -0
  392. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  393. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  394. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  395. aip_agents/tools/browser_use/streaming.py +813 -0
  396. aip_agents/tools/browser_use/streaming.pyi +81 -0
  397. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  398. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  399. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  400. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  401. aip_agents/tools/browser_use/types.py +78 -0
  402. aip_agents/tools/browser_use/types.pyi +45 -0
  403. aip_agents/tools/code_sandbox/__init__.py +26 -0
  404. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  405. aip_agents/tools/code_sandbox/constant.py +13 -0
  406. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  407. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
  408. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -0
  409. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  410. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  411. aip_agents/tools/constants.py +165 -0
  412. aip_agents/tools/constants.pyi +135 -0
  413. aip_agents/tools/document_loader/__init__.py +44 -0
  414. aip_agents/tools/document_loader/__init__.pyi +7 -0
  415. aip_agents/tools/document_loader/base_reader.py +302 -0
  416. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  417. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  418. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  419. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  420. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  421. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  422. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  423. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  424. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  425. aip_agents/tools/gl_connector/__init__.py +5 -0
  426. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  427. aip_agents/tools/gl_connector/tool.py +351 -0
  428. aip_agents/tools/gl_connector/tool.pyi +74 -0
  429. aip_agents/tools/memory_search/__init__.py +22 -0
  430. aip_agents/tools/memory_search/__init__.pyi +5 -0
  431. aip_agents/tools/memory_search/base.py +200 -0
  432. aip_agents/tools/memory_search/base.pyi +69 -0
  433. aip_agents/tools/memory_search/mem0.py +258 -0
  434. aip_agents/tools/memory_search/mem0.pyi +19 -0
  435. aip_agents/tools/memory_search/schema.py +48 -0
  436. aip_agents/tools/memory_search/schema.pyi +15 -0
  437. aip_agents/tools/memory_search_tool.py +26 -0
  438. aip_agents/tools/memory_search_tool.pyi +3 -0
  439. aip_agents/tools/time_tool.py +117 -0
  440. aip_agents/tools/time_tool.pyi +16 -0
  441. aip_agents/tools/tool_config_injector.py +300 -0
  442. aip_agents/tools/tool_config_injector.pyi +26 -0
  443. aip_agents/tools/web_search/__init__.py +15 -0
  444. aip_agents/tools/web_search/__init__.pyi +3 -0
  445. aip_agents/tools/web_search/serper_tool.py +187 -0
  446. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  447. aip_agents/types/__init__.py +70 -0
  448. aip_agents/types/__init__.pyi +36 -0
  449. aip_agents/types/a2a_events.py +13 -0
  450. aip_agents/types/a2a_events.pyi +3 -0
  451. aip_agents/utils/__init__.py +79 -0
  452. aip_agents/utils/__init__.pyi +11 -0
  453. aip_agents/utils/a2a_connector.py +1757 -0
  454. aip_agents/utils/a2a_connector.pyi +146 -0
  455. aip_agents/utils/artifact_helpers.py +502 -0
  456. aip_agents/utils/artifact_helpers.pyi +203 -0
  457. aip_agents/utils/constants.py +22 -0
  458. aip_agents/utils/constants.pyi +10 -0
  459. aip_agents/utils/datetime/__init__.py +34 -0
  460. aip_agents/utils/datetime/__init__.pyi +4 -0
  461. aip_agents/utils/datetime/normalization.py +231 -0
  462. aip_agents/utils/datetime/normalization.pyi +95 -0
  463. aip_agents/utils/datetime/timezone.py +206 -0
  464. aip_agents/utils/datetime/timezone.pyi +48 -0
  465. aip_agents/utils/env_loader.py +27 -0
  466. aip_agents/utils/env_loader.pyi +10 -0
  467. aip_agents/utils/event_handler_registry.py +58 -0
  468. aip_agents/utils/event_handler_registry.pyi +23 -0
  469. aip_agents/utils/file_prompt_utils.py +176 -0
  470. aip_agents/utils/file_prompt_utils.pyi +21 -0
  471. aip_agents/utils/final_response_builder.py +211 -0
  472. aip_agents/utils/final_response_builder.pyi +34 -0
  473. aip_agents/utils/formatter_llm_client.py +231 -0
  474. aip_agents/utils/formatter_llm_client.pyi +71 -0
  475. aip_agents/utils/langgraph/__init__.py +19 -0
  476. aip_agents/utils/langgraph/__init__.pyi +3 -0
  477. aip_agents/utils/langgraph/converter.py +128 -0
  478. aip_agents/utils/langgraph/converter.pyi +49 -0
  479. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  480. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  481. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  482. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  483. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  484. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  485. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  486. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  487. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  488. aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
  489. aip_agents/utils/logger.py +195 -0
  490. aip_agents/utils/logger.pyi +60 -0
  491. aip_agents/utils/metadata/__init__.py +27 -0
  492. aip_agents/utils/metadata/__init__.pyi +5 -0
  493. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  494. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  495. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  496. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  497. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  498. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  499. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  500. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  501. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  502. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  503. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  504. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  505. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  506. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  507. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  508. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  509. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  510. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  511. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  512. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  513. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  514. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  515. aip_agents/utils/metadata_helper.py +358 -0
  516. aip_agents/utils/metadata_helper.pyi +117 -0
  517. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  518. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  519. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  520. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  521. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  522. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  523. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  524. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  525. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  526. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  527. aip_agents/utils/pii/__init__.py +25 -0
  528. aip_agents/utils/pii/__init__.pyi +5 -0
  529. aip_agents/utils/pii/pii_handler.py +397 -0
  530. aip_agents/utils/pii/pii_handler.pyi +96 -0
  531. aip_agents/utils/pii/pii_helper.py +207 -0
  532. aip_agents/utils/pii/pii_helper.pyi +78 -0
  533. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  534. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  535. aip_agents/utils/reference_helper.py +273 -0
  536. aip_agents/utils/reference_helper.pyi +81 -0
  537. aip_agents/utils/sse_chunk_transformer.py +831 -0
  538. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  539. aip_agents/utils/step_limit_manager.py +265 -0
  540. aip_agents/utils/step_limit_manager.pyi +112 -0
  541. aip_agents/utils/token_usage_helper.py +156 -0
  542. aip_agents/utils/token_usage_helper.pyi +60 -0
  543. aip_agents_binary-0.5.20.dist-info/METADATA +681 -0
  544. aip_agents_binary-0.5.20.dist-info/RECORD +546 -0
  545. aip_agents_binary-0.5.20.dist-info/WHEEL +5 -0
  546. aip_agents_binary-0.5.20.dist-info/top_level.txt +1 -0
@@ -0,0 +1,300 @@
1
+ """Tool Configuration Injector for existing LangChain tools.
2
+
3
+ This module provides utilities to inject Pydantic-based configuration into existing
4
+ LangChain tools without requiring inheritance or modification of the tool classes.
5
+
6
+ The SDK automatically injects configuration capabilities into tools that have a
7
+ tool_config_schema attribute, providing:
8
+ - Agent-level default configurations
9
+ - Runtime configuration overrides via RunnableConfig metadata
10
+ - Type-safe validation using Pydantic models
11
+ - Support for optional fields with proper default handling
12
+
13
+ Configuration Extraction Examples:
14
+
15
+ Nested format:
16
+ metadata = {"tool_configs": {"tool_name": {"api_key": "secret", "timeout": 30}}}
17
+
18
+ Flattened format (only works if ALL required fields are present):
19
+ metadata = {"api_key": "secret", "timeout": 30} # Optional fields can be omitted
20
+
21
+ Required vs Optional fields:
22
+ class ToolConfig(BaseModel):
23
+ api_key: str # Required - must be provided
24
+ timeout: int = 30 # Optional - will use default if not provided
25
+ retries: Optional[int] = None # Optional - can be None
26
+
27
+ Authors:
28
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
29
+ """
30
+
31
+ from typing import Any, TypeVar
32
+
33
+ from langchain_core.runnables import RunnableConfig
34
+ from langchain_core.tools import BaseTool
35
+ from pydantic import BaseModel
36
+
37
+ from aip_agents.utils.logger import get_logger
38
+
39
+ logger = get_logger(__name__)
40
+
41
+ ConfigSchema = TypeVar("ConfigSchema", bound=BaseModel)
42
+
43
+ # Public API exports
44
+ __all__ = [
45
+ "inject_config_methods_into_tool",
46
+ "CONFIG_SCHEMA_ATTR",
47
+ "CONFIG_ATTR",
48
+ "TOOL_CONFIG_SCHEMA_ATTR",
49
+ "TOOL_CONFIGS_KEY",
50
+ ]
51
+
52
+ # Constants for configuration attribute names and keys
53
+ CONFIG_SCHEMA_ATTR: str = "_config_schema"
54
+ CONFIG_ATTR: str = "_config"
55
+ TOOL_CONFIG_SCHEMA_ATTR: str = "tool_config_schema"
56
+ TOOL_CONFIGS_KEY: str = "tool_configs"
57
+
58
+
59
+ def _get_config_field_names(schema: type[BaseModel]) -> list[str]:
60
+ """Get field names from a Pydantic model schema.
61
+
62
+ Args:
63
+ schema: The Pydantic model schema to get field names from.
64
+
65
+ Returns:
66
+ A list of field names.
67
+ """
68
+ if hasattr(schema, "model_fields"):
69
+ return list(schema.model_fields.keys())
70
+ elif hasattr(schema, "__fields__"):
71
+ return list(schema.__fields__.keys())
72
+ else:
73
+ return []
74
+
75
+
76
+ def _get_required_field_names(schema: type[BaseModel]) -> set[str]:
77
+ """Get required field names from a Pydantic model schema.
78
+
79
+ Args:
80
+ schema: The Pydantic model schema to get required field names from.
81
+
82
+ Returns:
83
+ A set of required field names.
84
+ """
85
+ # Pydantic V2
86
+ if hasattr(schema, "model_fields"):
87
+ return {name for name, field_info in schema.model_fields.items() if field_info.is_required()}
88
+
89
+ # Pydantic V1 (fallback)
90
+ elif hasattr(schema, "__fields__"):
91
+ return {name for name, field in schema.__fields__.items() if field.required}
92
+
93
+ return set()
94
+
95
+
96
+ def _extract_nested_config(tool: BaseTool, metadata: dict[str, Any]) -> ConfigSchema | None:
97
+ """Extract tool config from nested tool_configs structure.
98
+
99
+ Args:
100
+ tool: The tool instance to extract configuration from.
101
+ metadata: The metadata to use.
102
+
103
+ Returns:
104
+ The nested configuration.
105
+ """
106
+ tool_configs = metadata.get(TOOL_CONFIGS_KEY, {})
107
+ if not isinstance(tool_configs, dict) or tool.name not in tool_configs:
108
+ return None
109
+
110
+ tool_config_data = tool_configs[tool.name]
111
+ try:
112
+ config_schema = getattr(tool, CONFIG_SCHEMA_ATTR)
113
+ if isinstance(tool_config_data, dict):
114
+ return config_schema(**tool_config_data)
115
+ elif isinstance(tool_config_data, config_schema):
116
+ return tool_config_data
117
+ except Exception as e:
118
+ logger.debug(f"Failed to validate nested config for tool '{tool.name}': {e}")
119
+
120
+ return None
121
+
122
+
123
+ def _extract_flattened_config(tool: BaseTool, metadata: dict[str, Any]) -> ConfigSchema | None:
124
+ """Extract tool config from flattened metadata keys.
125
+
126
+ This function builds a configuration from metadata keys that match the tool's
127
+ config schema field names. Only required fields must be present; optional fields
128
+ with defaults will be handled by Pydantic during instantiation.
129
+
130
+ Behavior:
131
+ - Returns None silently if metadata is empty (likely using agent defaults)
132
+ - Logs debug message if metadata exists but contains no matching config fields
133
+ - Logs warning if some required fields are missing from provided config fields
134
+
135
+ Args:
136
+ tool: The tool instance to extract configuration from.
137
+ metadata: The metadata to use.
138
+
139
+ Returns:
140
+ The flattened configuration if all required fields are present, None otherwise.
141
+ """
142
+ config_schema = getattr(tool, CONFIG_SCHEMA_ATTR)
143
+ config_fields = _get_config_field_names(config_schema)
144
+ required_fields = _get_required_field_names(config_schema)
145
+
146
+ if not config_fields:
147
+ return None
148
+
149
+ # Extract all available config fields from metadata
150
+ flattened_config = {}
151
+ for field_name in config_fields:
152
+ if field_name in metadata:
153
+ flattened_config[field_name] = metadata[field_name]
154
+
155
+ # Only proceed if we have at least some configuration fields
156
+ if not flattened_config:
157
+ if metadata:
158
+ logger.debug(
159
+ f"No valid config fields found in flattened metadata for tool '{tool.name}'. "
160
+ f"Available metadata keys: {list(metadata.keys())}, "
161
+ f"Expected config fields: {config_fields}"
162
+ )
163
+ return None
164
+
165
+ # Check if all required fields are present
166
+ provided_fields = set(flattened_config.keys())
167
+ missing_required_fields = required_fields - provided_fields
168
+
169
+ if missing_required_fields:
170
+ logger.warning(f"Missing required fields for flattened config in tool '{tool.name}': {missing_required_fields}")
171
+ return None
172
+
173
+ try:
174
+ return config_schema(**flattened_config)
175
+ except Exception as e:
176
+ logger.debug(f"Failed to validate flattened config for tool '{tool.name}': {e}")
177
+
178
+ return None
179
+
180
+
181
+ def _extract_runtime_config(tool: BaseTool, config: RunnableConfig | None) -> ConfigSchema | None:
182
+ """Extract runtime configuration from RunnableConfig metadata.
183
+
184
+ Args:
185
+ tool: The tool instance to extract configuration from.
186
+ config: The configuration to use.
187
+
188
+ Returns:
189
+ The runtime configuration.
190
+ """
191
+ if not config or not hasattr(tool, CONFIG_SCHEMA_ATTR):
192
+ return None
193
+
194
+ metadata = config.get("metadata", {})
195
+ if not isinstance(metadata, dict):
196
+ return None
197
+
198
+ # Try nested structure first
199
+ nested_config = _extract_nested_config(tool, metadata)
200
+ if nested_config is not None:
201
+ return nested_config
202
+
203
+ # Try flattened structure
204
+ return _extract_flattened_config(tool, metadata)
205
+
206
+
207
+ def _create_tool_config_methods(tool: BaseTool) -> dict[str, Any]:
208
+ """Create the configuration management methods for a tool.
209
+
210
+ Args:
211
+ tool: The tool instance to create methods for.
212
+
213
+ Returns:
214
+ Dictionary of method names to method functions.
215
+ """
216
+
217
+ def set_tool_config(config: ConfigSchema | dict[str, Any] | None) -> None:
218
+ """Set the tool's agent-level default configuration with validation.
219
+
220
+ Args:
221
+ config: The configuration to set.
222
+
223
+ Raises:
224
+ ValueError: If the config is not an instance of the tool's config schema or a dictionary.
225
+ """
226
+ if config is None:
227
+ object.__setattr__(tool, CONFIG_ATTR, None)
228
+ return
229
+
230
+ config_schema = getattr(tool, CONFIG_SCHEMA_ATTR)
231
+ if isinstance(config, dict):
232
+ object.__setattr__(tool, CONFIG_ATTR, config_schema(**config))
233
+ elif isinstance(config, config_schema):
234
+ object.__setattr__(tool, CONFIG_ATTR, config)
235
+ else:
236
+ config_schema_name = getattr(config_schema, "__name__", repr(config_schema))
237
+ raise ValueError(f"Config must be an instance of {config_schema_name} or dict, got {type(config).__name__}")
238
+
239
+ def get_default_config() -> ConfigSchema | None:
240
+ """Get the agent-level default configuration.
241
+
242
+ Returns:
243
+ The agent-level default configuration.
244
+ """
245
+ return getattr(tool, CONFIG_ATTR)
246
+
247
+ def has_tool_config() -> bool:
248
+ """Check if the tool has an agent-level default configuration set.
249
+
250
+ Returns:
251
+ True if the tool has an agent-level default configuration set, False otherwise.
252
+ """
253
+ return getattr(tool, CONFIG_ATTR) is not None
254
+
255
+ def get_tool_config(config: RunnableConfig | None = None) -> ConfigSchema | None:
256
+ """Get the effective tool configuration.
257
+
258
+ This function extracts the tool configuration from the runnable configuration.
259
+ If the tool configuration is not found in the runnable configuration, it will
260
+ return the agent-level default configuration.
261
+
262
+ Args:
263
+ config: The runnable configuration to use from LangGraph.
264
+
265
+ Returns:
266
+ The effective tool configuration.
267
+ """
268
+ runtime_config = _extract_runtime_config(tool, config)
269
+ return runtime_config if runtime_config is not None else getattr(tool, CONFIG_ATTR)
270
+
271
+ return {
272
+ "set_tool_config": set_tool_config,
273
+ "get_default_config": get_default_config,
274
+ "has_tool_config": has_tool_config,
275
+ "get_tool_config": get_tool_config,
276
+ }
277
+
278
+
279
+ def inject_config_methods_into_tool(tool: BaseTool, config_schema: type[ConfigSchema]) -> None:
280
+ """Inject configuration methods into a tool.
281
+
282
+ This function is used by the SDK to automatically inject configuration capabilities
283
+ into tools that have a tool_config_schema attribute. It can also be used directly
284
+ by developers who want to add configuration support to their tools.
285
+
286
+ Args:
287
+ tool: The tool to inject configuration capabilities into.
288
+ config_schema: Pydantic model class for configuration validation.
289
+
290
+ Raises:
291
+ ValueError: If tool is not a BaseTool instance or config_schema is not a Pydantic BaseModel subclass.
292
+ """
293
+ # Add configuration attributes
294
+ object.__setattr__(tool, CONFIG_SCHEMA_ATTR, config_schema)
295
+ object.__setattr__(tool, CONFIG_ATTR, None)
296
+
297
+ # Create and inject methods
298
+ methods = _create_tool_config_methods(tool)
299
+ for method_name, method_func in methods.items():
300
+ object.__setattr__(tool, method_name, method_func)
@@ -0,0 +1,26 @@
1
+ from langchain_core.tools import BaseTool
2
+ from pydantic import BaseModel
3
+ from typing import TypeVar
4
+
5
+ __all__ = ['inject_config_methods_into_tool', 'CONFIG_SCHEMA_ATTR', 'CONFIG_ATTR', 'TOOL_CONFIG_SCHEMA_ATTR', 'TOOL_CONFIGS_KEY']
6
+
7
+ ConfigSchema = TypeVar('ConfigSchema', bound=BaseModel)
8
+ CONFIG_SCHEMA_ATTR: str
9
+ CONFIG_ATTR: str
10
+ TOOL_CONFIG_SCHEMA_ATTR: str
11
+ TOOL_CONFIGS_KEY: str
12
+
13
+ def inject_config_methods_into_tool(tool: BaseTool, config_schema: type[ConfigSchema]) -> None:
14
+ """Inject configuration methods into a tool.
15
+
16
+ This function is used by the SDK to automatically inject configuration capabilities
17
+ into tools that have a tool_config_schema attribute. It can also be used directly
18
+ by developers who want to add configuration support to their tools.
19
+
20
+ Args:
21
+ tool: The tool to inject configuration capabilities into.
22
+ config_schema: Pydantic model class for configuration validation.
23
+
24
+ Raises:
25
+ ValueError: If tool is not a BaseTool instance or config_schema is not a Pydantic BaseModel subclass.
26
+ """
@@ -0,0 +1,15 @@
1
+ """Web Search Tools for AI Agents.
2
+
3
+ This package provides web search capabilities for AI agents through integration
4
+ with Google Serper API and Tavily Search API.
5
+
6
+ Authors:
7
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
8
+ Saul Sayers (saul.sayers@gdplabs.id)
9
+ Raymond Christopher (raymond.christopher@gdplabs.id)
10
+ Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
11
+ """
12
+
13
+ from aip_agents.tools.web_search.serper_tool import GoogleSerperTool
14
+
15
+ __all__ = ["GoogleSerperTool"]
@@ -0,0 +1,3 @@
1
+ from aip_agents.tools.web_search.serper_tool import GoogleSerperTool as GoogleSerperTool
2
+
3
+ __all__ = ['GoogleSerperTool']
@@ -0,0 +1,187 @@
1
+ """Tool to search Google Serper API.
2
+
3
+ Authors:
4
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
5
+ Raymond Christopher (raymond.christopher@gdplabs.id)
6
+ Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
7
+ """
8
+
9
+ import json
10
+ from json import dumps
11
+ from typing import Any
12
+
13
+ from gllm_core.schema import Chunk
14
+ from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
15
+ from langchain_core.tools import BaseTool
16
+ from pydantic import BaseModel, Field
17
+
18
+ from aip_agents.utils.logger import get_logger
19
+
20
+ logger = get_logger(__name__)
21
+
22
+
23
+ class GoogleSerperInput(BaseModel):
24
+ """Input schema for the GoogleSerperTool."""
25
+
26
+ query: str = Field(..., description="Search query", min_length=1)
27
+
28
+
29
+ class GoogleSerperTool(BaseTool):
30
+ """Tool to search Google Serper API."""
31
+
32
+ name: str = "google_serper"
33
+ description: str = """
34
+ Useful for searching the web using the Google Serper API.
35
+ Input should be a search query.
36
+ """
37
+ save_output_history: bool = Field(default=True)
38
+ args_schema: type[BaseModel] = GoogleSerperInput
39
+ api_wrapper: GoogleSerperAPIWrapper = Field(default_factory=GoogleSerperAPIWrapper, exclude=True)
40
+
41
+ def _run(
42
+ self,
43
+ query: str,
44
+ ) -> str:
45
+ """Executes a query using the API wrapper and returns the result as a JSON string.
46
+
47
+ Args:
48
+ query (str): The query string to be executed.
49
+ run_manager (Optional[CallbackManagerForToolRun], optional): An optional callback manager for the tool run.
50
+ Defaults to None.
51
+
52
+ Returns:
53
+ str: The result of the query execution, serialized as a JSON string.
54
+ """
55
+ result = self.api_wrapper.results(query)
56
+ return dumps(result)
57
+
58
+ def _format_agent_reference(self, tool_output: str) -> list[Chunk]:
59
+ """Format tool output into agent references.
60
+
61
+ Args:
62
+ tool_output (str): The output from the tool, which is expected to be a JSON string.
63
+
64
+ Returns:
65
+ list[Chunk]: Formatted tool output as agent references
66
+ """
67
+ # Parse the tool output if it's a string
68
+ parsed_output = self._parse_tool_output(tool_output)
69
+ if not parsed_output:
70
+ return []
71
+
72
+ formatted_chunks = []
73
+ file_id_counter = 0
74
+
75
+ for section_name, section_data in parsed_output.items():
76
+ # Process only list-type sections
77
+ if not isinstance(section_data, list):
78
+ continue
79
+
80
+ # Process each item in the section
81
+ results = self._process_section_items(section_name, section_data, file_id_counter)
82
+ formatted_chunks.extend(results["chunks"])
83
+ file_id_counter = results["counter"]
84
+
85
+ return formatted_chunks
86
+
87
+ def _parse_tool_output(self, tool_output: str) -> dict[str, Any]:
88
+ """Parses the tool output to ensure it is in dictionary format.
89
+
90
+ This method attempts to convert string outputs to JSON dictionaries and handles
91
+ potential JSON parsing errors gracefully.
92
+
93
+ Args:
94
+ tool_output (str): The output from a tool, which is expected to be a JSON string.
95
+
96
+ Returns:
97
+ dict[str, Any]: The parsed output as a dictionary. Returns an empty
98
+ dictionary if parsing fails.
99
+ """
100
+ if isinstance(tool_output, str):
101
+ try:
102
+ return json.loads(tool_output)
103
+ except json.JSONDecodeError:
104
+ logger.warning("Error: Unable to parse tool_output as JSON when formatting agent references.")
105
+ return {}
106
+ return tool_output
107
+
108
+ def _process_section_items(self, section_name: str, section_data: list[dict], start_counter: int) -> dict[str, Any]:
109
+ """Process items from a specific section of search results and create chunks.
110
+
111
+ Args:
112
+ section_name (str): Name of the section being processed (e.g., 'organic', 'news').
113
+ section_data (list): List of items to process from the section.
114
+ start_counter (int): Initial counter value for chunk numbering.
115
+
116
+ Returns:
117
+ dict[str, Any]: Dictionary containing:
118
+ - chunks (list): List of processed chunks extracted from the section items.
119
+ - counter (int): Updated counter after processing all items.
120
+
121
+ Raises:
122
+ Exception: Logs errors that occur during processing of individual items.
123
+ """
124
+ chunks = []
125
+ counter = start_counter
126
+
127
+ for item in section_data:
128
+ if not isinstance(item, dict):
129
+ continue
130
+
131
+ try:
132
+ chunk = self._create_chunk_from_item(section_name, item, counter)
133
+ if chunk:
134
+ chunks.append(chunk)
135
+ counter += 1
136
+ except Exception as e:
137
+ logger.warning(f"Error processing {section_name} result: {e}")
138
+
139
+ return {"chunks": chunks, "counter": counter}
140
+
141
+ def _create_chunk_from_item(self, section_name: str, item: dict[str, Any], file_id: int) -> Chunk | None:
142
+ """Creates a Chunk object from a search result item.
143
+
144
+ This method extracts content and metadata from a search result item and creates
145
+ a Chunk object. It prioritizes snippet over title for content and includes various
146
+ metadata fields.
147
+
148
+ Args:
149
+ section_name (str): The name of the section this item belongs to.
150
+ item (dict[str, Any]): The search result item containing information like
151
+ snippet, title, and link.
152
+ file_id (int): The ID of the file associated with this chunk.
153
+
154
+ Returns:
155
+ Optional[Chunk]: A Chunk object containing the extracted content and metadata,
156
+ or None if the item lacks essential information (link or content).
157
+ """
158
+ # First check if link exists
159
+ link = item.get("link")
160
+ if not link:
161
+ logger.warning(f"Skipping item {file_id} from {section_name} result: Missing link")
162
+ return None
163
+
164
+ # Then extract and check content
165
+ content = ""
166
+ if "snippet" in item:
167
+ content = item["snippet"]
168
+ elif "title" in item:
169
+ content = item["title"]
170
+
171
+ if not content:
172
+ logger.warning(f"Skipping item {file_id} from {section_name} result: Missing content")
173
+ return None
174
+
175
+ metadata = {
176
+ "source": item.get("title", "Untitled Source"),
177
+ "section_type": section_name,
178
+ "source_type": "website",
179
+ "title": item.get("title", "Untitled"),
180
+ "link": link,
181
+ "file_id": str(file_id),
182
+ "url": link,
183
+ "start_index": 0,
184
+ "end_index": 0,
185
+ }
186
+
187
+ return Chunk(content=content, metadata=metadata)
@@ -0,0 +1,19 @@
1
+ from _typeshed import Incomplete
2
+ from aip_agents.utils.logger import get_logger as get_logger
3
+ from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
4
+ from langchain_core.tools import BaseTool
5
+ from pydantic import BaseModel
6
+
7
+ logger: Incomplete
8
+
9
+ class GoogleSerperInput(BaseModel):
10
+ """Input schema for the GoogleSerperTool."""
11
+ query: str
12
+
13
+ class GoogleSerperTool(BaseTool):
14
+ """Tool to search Google Serper API."""
15
+ name: str
16
+ description: str
17
+ save_output_history: bool
18
+ args_schema: type[BaseModel]
19
+ api_wrapper: GoogleSerperAPIWrapper
@@ -0,0 +1,70 @@
1
+ """Type definitions for aip_agents package.
2
+
3
+ This module exports type definitions used throughout the aip_agents package
4
+ for better type safety and code clarity.
5
+
6
+ Authors:
7
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
8
+ Raymond Christopher (raymond.christopher@gdplabs.id)
9
+ """
10
+
11
+ from typing import Any, Protocol, runtime_checkable
12
+
13
+ from pydantic import BaseModel
14
+
15
+ from aip_agents.schema.a2a import (
16
+ A2AEvent,
17
+ A2AStreamEventType,
18
+ ToolCallInfo,
19
+ ToolResultInfo,
20
+ )
21
+
22
+
23
+ class ChatMessage(BaseModel):
24
+ """Represents a single message in a chat conversation."""
25
+
26
+ role: str
27
+ content: str
28
+
29
+
30
+ @runtime_checkable
31
+ class AgentProtocol(Protocol):
32
+ """Defines the expected interface for an agent."""
33
+
34
+ id: str
35
+ name: str
36
+ description: str
37
+
38
+ def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
39
+ """Synchronous execution method.
40
+
41
+ Args:
42
+ query (str): The query to execute.
43
+ **kwargs (Any): Additional keyword arguments.
44
+
45
+ Returns:
46
+ dict[str, Any]: The execution result.
47
+ """
48
+ ...
49
+
50
+ async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
51
+ """Asynchronous execution method.
52
+
53
+ Args:
54
+ query (str): The query to execute.
55
+ **kwargs (Any): Additional keyword arguments.
56
+
57
+ Returns:
58
+ dict[str, Any]: The execution result.
59
+ """
60
+ ...
61
+
62
+
63
+ __all__ = [
64
+ "A2AEvent",
65
+ "A2AStreamEventType",
66
+ "ToolCallInfo",
67
+ "ToolResultInfo",
68
+ "AgentProtocol",
69
+ "ChatMessage",
70
+ ]
@@ -0,0 +1,36 @@
1
+ from aip_agents.schema.a2a import A2AEvent as A2AEvent, A2AStreamEventType as A2AStreamEventType, ToolCallInfo as ToolCallInfo, ToolResultInfo as ToolResultInfo
2
+ from pydantic import BaseModel
3
+ from typing import Any, Protocol
4
+
5
+ __all__ = ['A2AEvent', 'A2AStreamEventType', 'ToolCallInfo', 'ToolResultInfo', 'AgentProtocol', 'ChatMessage']
6
+
7
+ class ChatMessage(BaseModel):
8
+ """Represents a single message in a chat conversation."""
9
+ role: str
10
+ content: str
11
+
12
+ class AgentProtocol(Protocol):
13
+ """Defines the expected interface for an agent."""
14
+ id: str
15
+ name: str
16
+ description: str
17
+ def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
18
+ """Synchronous execution method.
19
+
20
+ Args:
21
+ query (str): The query to execute.
22
+ **kwargs (Any): Additional keyword arguments.
23
+
24
+ Returns:
25
+ dict[str, Any]: The execution result.
26
+ """
27
+ async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
28
+ """Asynchronous execution method.
29
+
30
+ Args:
31
+ query (str): The query to execute.
32
+ **kwargs (Any): Additional keyword arguments.
33
+
34
+ Returns:
35
+ dict[str, Any]: The execution result.
36
+ """
@@ -0,0 +1,13 @@
1
+ """Backward-compatible exports for A2A event schema.
2
+
3
+ Prefer importing from ``aip_agents.schema.a2a`` in new code.
4
+ """
5
+
6
+ from aip_agents.schema.a2a import A2AEvent, A2AStreamEventType, ToolCallInfo, ToolResultInfo
7
+
8
+ __all__ = [
9
+ "A2AStreamEventType",
10
+ "A2AEvent",
11
+ "ToolCallInfo",
12
+ "ToolResultInfo",
13
+ ]
@@ -0,0 +1,3 @@
1
+ from aip_agents.schema.a2a import A2AEvent as A2AEvent, A2AStreamEventType as A2AStreamEventType, ToolCallInfo as ToolCallInfo, ToolResultInfo as ToolResultInfo
2
+
3
+ __all__ = ['A2AStreamEventType', 'A2AEvent', 'ToolCallInfo', 'ToolResultInfo']