aip-agents-binary 0.0.0__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 (447) hide show
  1. aip_agents/__init__.py +66 -0
  2. aip_agents/a2a/__init__.py +19 -0
  3. aip_agents/a2a/server/__init__.py +10 -0
  4. aip_agents/a2a/server/base_executor.py +1125 -0
  5. aip_agents/a2a/server/google_adk_executor.py +198 -0
  6. aip_agents/a2a/server/langflow_executor.py +180 -0
  7. aip_agents/a2a/server/langgraph_executor.py +270 -0
  8. aip_agents/a2a/types.py +232 -0
  9. aip_agents/a2ui/__init__.py +26 -0
  10. aip_agents/a2ui/catalog_provider.py +109 -0
  11. aip_agents/a2ui/examples/0.8/booking_form.json +1 -0
  12. aip_agents/a2ui/examples/0.8/confirmation.json +1 -0
  13. aip_agents/a2ui/examples/0.8/single_column_list.json +1 -0
  14. aip_agents/a2ui/examples/0.9/booking_form.json +1 -0
  15. aip_agents/a2ui/examples/0.9/confirmation.json +1 -0
  16. aip_agents/a2ui/examples/0.9/single_column_list.json +1 -0
  17. aip_agents/a2ui/middleware.py +754 -0
  18. aip_agents/a2ui/models.py +153 -0
  19. aip_agents/a2ui/public_url.py +138 -0
  20. aip_agents/a2ui/stream_filter.py +67 -0
  21. aip_agents/agent/__init__.py +72 -0
  22. aip_agents/agent/base_agent.py +1437 -0
  23. aip_agents/agent/base_langgraph_agent.py +4048 -0
  24. aip_agents/agent/google_adk_agent.py +932 -0
  25. aip_agents/agent/google_adk_constants.py +11 -0
  26. aip_agents/agent/graph_runtime.py +185 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/config.py +28 -0
  29. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  30. aip_agents/agent/hitl/manager.py +532 -0
  31. aip_agents/agent/hitl/models.py +18 -0
  32. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  33. aip_agents/agent/hitl/prompt/base.py +42 -0
  34. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  35. aip_agents/agent/hitl/registry.py +149 -0
  36. aip_agents/agent/interface.py +138 -0
  37. aip_agents/agent/interfaces.py +65 -0
  38. aip_agents/agent/langflow_agent.py +464 -0
  39. aip_agents/agent/langgraph_react_agent.py +3741 -0
  40. aip_agents/agent/model_invocation_adapter.py +346 -0
  41. aip_agents/agent/system_instruction_context.py +34 -0
  42. aip_agents/agent/tool_execution_engine.py +587 -0
  43. aip_agents/audio_interface/__init__.py +30 -0
  44. aip_agents/audio_interface/audio_agent_adapter.py +254 -0
  45. aip_agents/audio_interface/config.py +146 -0
  46. aip_agents/audio_interface/errors.py +15 -0
  47. aip_agents/audio_interface/livekit_audio_session.py +504 -0
  48. aip_agents/audio_interface/livekit_realtime_audio_session.py +142 -0
  49. aip_agents/audio_interface/session_factory.py +40 -0
  50. aip_agents/clients/__init__.py +10 -0
  51. aip_agents/clients/langflow/__init__.py +10 -0
  52. aip_agents/clients/langflow/client.py +477 -0
  53. aip_agents/clients/langflow/types.py +18 -0
  54. aip_agents/common/__init__.py +5 -0
  55. aip_agents/common/callable_introspection.py +17 -0
  56. aip_agents/constants.py +23 -0
  57. aip_agents/context/__init__.py +5 -0
  58. aip_agents/context/budget.py +237 -0
  59. aip_agents/context/compaction.py +339 -0
  60. aip_agents/context/metadata.py +169 -0
  61. aip_agents/context/offload.py +449 -0
  62. aip_agents/context/preparation.py +196 -0
  63. aip_agents/context/prompt.py +61 -0
  64. aip_agents/context/runtime.py +149 -0
  65. aip_agents/context/session_recall.py +69 -0
  66. aip_agents/context/state.py +48 -0
  67. aip_agents/context/utils.py +44 -0
  68. aip_agents/credentials/manager.py +132 -0
  69. aip_agents/examples/__init__.py +5 -0
  70. aip_agents/examples/audio_livekit_session.py +116 -0
  71. aip_agents/examples/compare_streaming_client.py +783 -0
  72. aip_agents/examples/compare_streaming_server.py +141 -0
  73. aip_agents/examples/gl_connectors_smoke.py +148 -0
  74. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_server.py +78 -0
  78. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  79. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  80. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  81. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  82. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  83. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +104 -0
  84. aip_agents/examples/hello_world_a2a_langchain_server.py +78 -0
  85. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +77 -0
  86. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  87. aip_agents/examples/hello_world_a2a_langflow_server.py +80 -0
  88. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  89. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  90. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +91 -0
  91. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  92. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  93. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  94. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  95. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  96. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  97. aip_agents/examples/hello_world_a2a_langgraph_server.py +83 -0
  98. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +78 -0
  99. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +131 -0
  100. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  101. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  102. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +250 -0
  103. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  104. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +79 -0
  105. aip_agents/examples/hello_world_filesystem.py +162 -0
  106. aip_agents/examples/hello_world_google_adk.py +41 -0
  107. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  108. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  109. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  110. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  111. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  112. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  113. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  114. aip_agents/examples/hello_world_langchain.py +28 -0
  115. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  116. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  117. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  118. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  119. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  120. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  121. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  122. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  123. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  124. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  125. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  126. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  127. aip_agents/examples/hello_world_langgraph.py +39 -0
  128. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  129. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  130. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  131. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  132. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  133. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  134. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  135. aip_agents/examples/hello_world_langgraph_skills.py +62 -0
  136. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  137. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  138. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  139. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  140. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  141. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  142. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  143. aip_agents/examples/hello_world_multi_agent_tool_output_client.py +57 -0
  144. aip_agents/examples/hello_world_multi_agent_tool_output_server.py +131 -0
  145. aip_agents/examples/hello_world_pii_logger.py +21 -0
  146. aip_agents/examples/hello_world_ptc.py +49 -0
  147. aip_agents/examples/hello_world_ptc_custom_tools.py +83 -0
  148. aip_agents/examples/hello_world_sentry.py +133 -0
  149. aip_agents/examples/hello_world_step_limits.py +273 -0
  150. aip_agents/examples/hello_world_stock_a2a_server.py +100 -0
  151. aip_agents/examples/hello_world_tool_output_client.py +55 -0
  152. aip_agents/examples/hello_world_tool_output_server.py +113 -0
  153. aip_agents/examples/hitl_demo.py +724 -0
  154. aip_agents/examples/mcp_configs/configs.py +63 -0
  155. aip_agents/examples/mcp_servers/common.py +76 -0
  156. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  157. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  158. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  159. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  160. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  161. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  162. aip_agents/examples/pii_demo_langgraph_server.py +125 -0
  163. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  164. aip_agents/examples/pii_demo_multi_agent_server.py +246 -0
  165. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  166. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +87 -0
  167. aip_agents/examples/tools/__init__.py +27 -0
  168. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  169. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  170. aip_agents/examples/tools/data_generator_tool.py +103 -0
  171. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  172. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  173. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  174. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  175. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  176. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  177. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  178. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  179. aip_agents/examples/tools/multiply_tool.py +43 -0
  180. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  181. aip_agents/examples/tools/random_chart_tool.py +142 -0
  182. aip_agents/examples/tools/serper_tool.py +202 -0
  183. aip_agents/examples/tools/stock_tools.py +82 -0
  184. aip_agents/examples/tools/table_generator_tool.py +167 -0
  185. aip_agents/examples/tools/time_tool.py +82 -0
  186. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  187. aip_agents/guardrails/__init__.py +83 -0
  188. aip_agents/guardrails/engines/__init__.py +69 -0
  189. aip_agents/guardrails/engines/base.py +90 -0
  190. aip_agents/guardrails/engines/nemo.py +101 -0
  191. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  192. aip_agents/guardrails/exceptions.py +39 -0
  193. aip_agents/guardrails/manager.py +163 -0
  194. aip_agents/guardrails/middleware.py +199 -0
  195. aip_agents/guardrails/schemas.py +63 -0
  196. aip_agents/guardrails/utils.py +45 -0
  197. aip_agents/integration/__init__.py +43 -0
  198. aip_agents/integration/agent.py +58 -0
  199. aip_agents/integration/guardrails.py +52 -0
  200. aip_agents/integration/hitl.py +71 -0
  201. aip_agents/integration/ptc.py +95 -0
  202. aip_agents/integration/skills.py +37 -0
  203. aip_agents/integration/storage.py +81 -0
  204. aip_agents/integration/version.py +103 -0
  205. aip_agents/mcp/__init__.py +1 -0
  206. aip_agents/mcp/client/__init__.py +60 -0
  207. aip_agents/mcp/client/base_mcp_client.py +377 -0
  208. aip_agents/mcp/client/connection_manager.py +231 -0
  209. aip_agents/mcp/client/errors.py +119 -0
  210. aip_agents/mcp/client/google_adk/__init__.py +45 -0
  211. aip_agents/mcp/client/google_adk/client.py +383 -0
  212. aip_agents/mcp/client/langchain/__init__.py +11 -0
  213. aip_agents/mcp/client/langchain/client.py +265 -0
  214. aip_agents/mcp/client/persistent_session.py +704 -0
  215. aip_agents/mcp/client/session_pool.py +358 -0
  216. aip_agents/mcp/client/transports.py +288 -0
  217. aip_agents/mcp/utils/__init__.py +7 -0
  218. aip_agents/mcp/utils/config_validator.py +139 -0
  219. aip_agents/memory/__init__.py +14 -0
  220. aip_agents/memory/adapters/__init__.py +10 -0
  221. aip_agents/memory/adapters/base_adapter.py +815 -0
  222. aip_agents/memory/adapters/mem0.py +286 -0
  223. aip_agents/memory/base.py +84 -0
  224. aip_agents/memory/constants.py +49 -0
  225. aip_agents/memory/factory.py +86 -0
  226. aip_agents/memory/guidance.py +20 -0
  227. aip_agents/memory/simple_memory.py +47 -0
  228. aip_agents/middleware/__init__.py +65 -0
  229. aip_agents/middleware/backends/__init__.py +72 -0
  230. aip_agents/middleware/backends/in_memory.py +578 -0
  231. aip_agents/middleware/backends/local_disk.py +1203 -0
  232. aip_agents/middleware/backends/protocol.py +353 -0
  233. aip_agents/middleware/backends/sandbox.py +1431 -0
  234. aip_agents/middleware/backends/sandbox_files.py +113 -0
  235. aip_agents/middleware/backends/utils.py +293 -0
  236. aip_agents/middleware/base.py +239 -0
  237. aip_agents/middleware/filesystem.py +690 -0
  238. aip_agents/middleware/manager.py +291 -0
  239. aip_agents/middleware/memory.py +532 -0
  240. aip_agents/middleware/pii_middleware.py +192 -0
  241. aip_agents/middleware/schema.py +19 -0
  242. aip_agents/middleware/skills.py +872 -0
  243. aip_agents/middleware/task_delegation.py +1656 -0
  244. aip_agents/middleware/todolist.py +276 -0
  245. aip_agents/middleware/tools/__init__.py +23 -0
  246. aip_agents/middleware/tools/edit_file.py +70 -0
  247. aip_agents/middleware/tools/execute.py +428 -0
  248. aip_agents/middleware/tools/grep_file.py +79 -0
  249. aip_agents/middleware/tools/ls.py +71 -0
  250. aip_agents/middleware/tools/read_file.py +239 -0
  251. aip_agents/middleware/tools/skill_load.py +193 -0
  252. aip_agents/middleware/tools/skill_resource.py +338 -0
  253. aip_agents/middleware/tools/write_file.py +114 -0
  254. aip_agents/middleware/vision.py +322 -0
  255. aip_agents/ptc/__init__.py +87 -0
  256. aip_agents/ptc/custom_tools.py +511 -0
  257. aip_agents/ptc/custom_tools_payload.py +499 -0
  258. aip_agents/ptc/custom_tools_templates/__init__.py +1 -0
  259. aip_agents/ptc/custom_tools_templates/custom_build_function.py.template +24 -0
  260. aip_agents/ptc/custom_tools_templates/custom_init.py.template +26 -0
  261. aip_agents/ptc/custom_tools_templates/custom_invoke.py.template +149 -0
  262. aip_agents/ptc/custom_tools_templates/custom_registry.py.template +112 -0
  263. aip_agents/ptc/custom_tools_templates/custom_sources_init.py.template +7 -0
  264. aip_agents/ptc/custom_tools_templates/custom_wrapper.py.template +87 -0
  265. aip_agents/ptc/doc_gen.py +122 -0
  266. aip_agents/ptc/exceptions.py +57 -0
  267. aip_agents/ptc/executor.py +627 -0
  268. aip_agents/ptc/mcp/__init__.py +45 -0
  269. aip_agents/ptc/mcp/sandbox_bridge.py +679 -0
  270. aip_agents/ptc/mcp/templates/__init__.py +1 -0
  271. aip_agents/ptc/mcp/templates/mcp_client.py.template +240 -0
  272. aip_agents/ptc/naming.py +430 -0
  273. aip_agents/ptc/payload.py +26 -0
  274. aip_agents/ptc/prompt_builder.py +674 -0
  275. aip_agents/ptc/ptc_helper.py +16 -0
  276. aip_agents/ptc/sandbox_bridge.py +297 -0
  277. aip_agents/ptc/template_utils.py +33 -0
  278. aip_agents/ptc/templates/__init__.py +1 -0
  279. aip_agents/ptc/templates/ptc_helper.py.template +134 -0
  280. aip_agents/ptc/tool_def_helpers.py +101 -0
  281. aip_agents/ptc/tool_enrichment.py +163 -0
  282. aip_agents/resilience/__init__.py +10 -0
  283. aip_agents/resilience/base.py +46 -0
  284. aip_agents/resilience/tool.py +1661 -0
  285. aip_agents/sandbox/__init__.py +62 -0
  286. aip_agents/sandbox/defaults.py +220 -0
  287. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1-datasaur.Dockerfile +120 -0
  288. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1.Dockerfile +100 -0
  289. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2-datasaur.Dockerfile +143 -0
  290. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2.Dockerfile +119 -0
  291. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3-datasaur.Dockerfile +173 -0
  292. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3.Dockerfile +130 -0
  293. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.Dockerfile +164 -0
  294. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.patch_js_context.py +41 -0
  295. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.requirements.txt +29 -0
  296. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2.Dockerfile +87 -0
  297. aip_agents/sandbox/e2b_runtime.py +27 -0
  298. aip_agents/sandbox/image_registry.py +98 -0
  299. aip_agents/sandbox/providers/__init__.py +76 -0
  300. aip_agents/sandbox/providers/base.py +392 -0
  301. aip_agents/sandbox/providers/bedrock.py +28 -0
  302. aip_agents/sandbox/providers/e2b.py +230 -0
  303. aip_agents/sandbox/providers/opensandbox.py +163 -0
  304. aip_agents/sandbox/sandbox_runtime.py +967 -0
  305. aip_agents/sandbox/template_builder.py +240 -0
  306. aip_agents/sandbox/types.py +141 -0
  307. aip_agents/sandbox/validation.py +50 -0
  308. aip_agents/schema/__init__.py +106 -0
  309. aip_agents/schema/a2a.py +58 -0
  310. aip_agents/schema/agent.py +117 -0
  311. aip_agents/schema/artifacts.py +75 -0
  312. aip_agents/schema/attachments.py +425 -0
  313. aip_agents/schema/hitl.py +157 -0
  314. aip_agents/schema/langgraph.py +47 -0
  315. aip_agents/schema/model_id.py +103 -0
  316. aip_agents/schema/model_usage.py +50 -0
  317. aip_agents/schema/runtime_metadata.py +78 -0
  318. aip_agents/schema/step_limit.py +108 -0
  319. aip_agents/schema/storage.py +40 -0
  320. aip_agents/schema/tool_payloads.py +68 -0
  321. aip_agents/sentry/__init__.py +11 -0
  322. aip_agents/sentry/sentry.py +267 -0
  323. aip_agents/skills/__init__.py +30 -0
  324. aip_agents/skills/errors.py +110 -0
  325. aip_agents/skills/installer.py +479 -0
  326. aip_agents/skills/models.py +769 -0
  327. aip_agents/skills/stager.py +224 -0
  328. aip_agents/skills/validation.py +53 -0
  329. aip_agents/storage/__init__.py +41 -0
  330. aip_agents/storage/base.py +85 -0
  331. aip_agents/storage/clients/__init__.py +12 -0
  332. aip_agents/storage/clients/minio_client.py +318 -0
  333. aip_agents/storage/config.py +62 -0
  334. aip_agents/storage/providers/__init__.py +15 -0
  335. aip_agents/storage/providers/base.py +106 -0
  336. aip_agents/storage/providers/memory.py +114 -0
  337. aip_agents/storage/providers/object_storage.py +214 -0
  338. aip_agents/tools/__init__.py +65 -0
  339. aip_agents/tools/agent_schedule_tool.py +392 -0
  340. aip_agents/tools/browser_use/__init__.py +83 -0
  341. aip_agents/tools/browser_use/action_parser.py +104 -0
  342. aip_agents/tools/browser_use/browser_use_tool.py +1118 -0
  343. aip_agents/tools/browser_use/llm_config.py +120 -0
  344. aip_agents/tools/browser_use/minio_storage.py +203 -0
  345. aip_agents/tools/browser_use/schemas.py +121 -0
  346. aip_agents/tools/browser_use/session.py +13 -0
  347. aip_agents/tools/browser_use/session_errors.py +132 -0
  348. aip_agents/tools/browser_use/steel_session_recording.py +321 -0
  349. aip_agents/tools/browser_use/streaming.py +263 -0
  350. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  351. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  352. aip_agents/tools/browser_use/types.py +37 -0
  353. aip_agents/tools/code_sandbox/__init__.py +48 -0
  354. aip_agents/tools/code_sandbox/code_sandbox_tool.py +350 -0
  355. aip_agents/tools/code_sandbox/constant.py +13 -0
  356. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +346 -0
  357. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +65 -0
  358. aip_agents/tools/computer_use/__init__.py +75 -0
  359. aip_agents/tools/computer_use/computer_use_tool.py +910 -0
  360. aip_agents/tools/computer_use/schemas.py +78 -0
  361. aip_agents/tools/computer_use/streaming.py +198 -0
  362. aip_agents/tools/computer_use/types.py +32 -0
  363. aip_agents/tools/constants.py +177 -0
  364. aip_agents/tools/date_range_tool.py +554 -0
  365. aip_agents/tools/document_loader/__init__.py +44 -0
  366. aip_agents/tools/document_loader/base_reader.py +302 -0
  367. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  368. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  369. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  370. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  371. aip_agents/tools/execute_ptc_code.py +582 -0
  372. aip_agents/tools/gl_connector/__init__.py +5 -0
  373. aip_agents/tools/gl_connector/tool.py +518 -0
  374. aip_agents/tools/gl_connector_tools.py +170 -0
  375. aip_agents/tools/memory_search/__init__.py +29 -0
  376. aip_agents/tools/memory_search/base.py +213 -0
  377. aip_agents/tools/memory_search/mem0.py +424 -0
  378. aip_agents/tools/memory_search/schema.py +81 -0
  379. aip_agents/tools/memory_search_tool.py +34 -0
  380. aip_agents/tools/streaming_common.py +577 -0
  381. aip_agents/tools/time_tool.py +117 -0
  382. aip_agents/tools/tool_config_injector.py +300 -0
  383. aip_agents/tools/web_search/__init__.py +15 -0
  384. aip_agents/tools/web_search/serper_tool.py +187 -0
  385. aip_agents/types/__init__.py +73 -0
  386. aip_agents/types/a2a_events.py +13 -0
  387. aip_agents/utils/__init__.py +91 -0
  388. aip_agents/utils/a2a_connector.py +1758 -0
  389. aip_agents/utils/artifact_helpers.py +542 -0
  390. aip_agents/utils/artifacts/__init__.py +20 -0
  391. aip_agents/utils/artifacts/tracker.py +367 -0
  392. aip_agents/utils/attachment_helpers.py +178 -0
  393. aip_agents/utils/constants.py +22 -0
  394. aip_agents/utils/datetime/__init__.py +34 -0
  395. aip_agents/utils/datetime/normalization.py +231 -0
  396. aip_agents/utils/datetime/timezone.py +206 -0
  397. aip_agents/utils/env_loader.py +27 -0
  398. aip_agents/utils/event_handler_registry.py +58 -0
  399. aip_agents/utils/file_prompt_utils.py +276 -0
  400. aip_agents/utils/file_watchers/__init__.py +33 -0
  401. aip_agents/utils/file_watchers/base.py +46 -0
  402. aip_agents/utils/file_watchers/e2b.py +128 -0
  403. aip_agents/utils/file_watchers/factory.py +39 -0
  404. aip_agents/utils/file_watchers/ls_diff.py +88 -0
  405. aip_agents/utils/file_watchers/sandbox.py +66 -0
  406. aip_agents/utils/file_watchers/watchdog.py +97 -0
  407. aip_agents/utils/final_response_builder.py +211 -0
  408. aip_agents/utils/formatter_llm_client.py +258 -0
  409. aip_agents/utils/langgraph/__init__.py +19 -0
  410. aip_agents/utils/langgraph/converter.py +399 -0
  411. aip_agents/utils/langgraph/delegation_context.py +22 -0
  412. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  413. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  414. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  415. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1329 -0
  416. aip_agents/utils/langgraph/tool_output_management.py +1047 -0
  417. aip_agents/utils/logger.py +195 -0
  418. aip_agents/utils/metadata/__init__.py +27 -0
  419. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  420. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  421. aip_agents/utils/metadata/activity_narrative/builder.py +822 -0
  422. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  423. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  424. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  425. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  426. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  427. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  428. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  429. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  430. aip_agents/utils/metadata_helper.py +363 -0
  431. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  432. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  433. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  434. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  435. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  436. aip_agents/utils/pii/__init__.py +29 -0
  437. aip_agents/utils/pii/pii_handler.py +555 -0
  438. aip_agents/utils/pii/pii_helper.py +225 -0
  439. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  440. aip_agents/utils/reference_helper.py +273 -0
  441. aip_agents/utils/sse_chunk_transformer.py +836 -0
  442. aip_agents/utils/step_limit_manager.py +265 -0
  443. aip_agents/utils/token_usage_helper.py +531 -0
  444. aip_agents_binary-0.0.0.dist-info/METADATA +825 -0
  445. aip_agents_binary-0.0.0.dist-info/RECORD +447 -0
  446. aip_agents_binary-0.0.0.dist-info/WHEEL +5 -0
  447. aip_agents_binary-0.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,157 @@
1
+ """Schema definitions for Human-in-the-Loop approval workflows."""
2
+
3
+ from dataclasses import dataclass
4
+ from datetime import datetime
5
+ from enum import StrEnum
6
+ from typing import Any
7
+ from uuid import uuid4
8
+
9
+ from pydantic import BaseModel, ConfigDict, Field
10
+
11
+ __all__ = [
12
+ "ApprovalDecisionType",
13
+ "ApprovalRequest",
14
+ "ApprovalDecision",
15
+ "ApprovalLogEntry",
16
+ "HitlMetadata",
17
+ ]
18
+
19
+
20
+ class ApprovalDecisionType(StrEnum):
21
+ """Enumeration of possible approval decision types."""
22
+
23
+ APPROVED = "approved"
24
+ REJECTED = "rejected"
25
+ SKIPPED = "skipped"
26
+ TIMEOUT_SKIP = "timeout_skip"
27
+ PENDING = "pending"
28
+
29
+
30
+ @dataclass
31
+ class ApprovalRequest:
32
+ """Represents an in-flight prompt shown to the operator."""
33
+
34
+ request_id: str
35
+ tool_name: str
36
+ arguments_preview: str
37
+ context: dict[str, str] | None = None
38
+ created_at: datetime | None = None
39
+ timeout_at: datetime | None = None
40
+
41
+ def __post_init__(self) -> None:
42
+ """Initialize timestamps if not provided."""
43
+ if self.created_at is None:
44
+ self.created_at = datetime.now()
45
+ if self.timeout_at is None and self.created_at is not None:
46
+ # Timeout is set externally when configuration is available
47
+ pass
48
+
49
+ @classmethod
50
+ def create(
51
+ cls,
52
+ tool_name: str,
53
+ arguments_preview: str,
54
+ context: dict[str, str] | None = None,
55
+ ) -> "ApprovalRequest":
56
+ """Create a new approval request with generated request_id.
57
+
58
+ Args:
59
+ tool_name (str): The name of the tool requiring approval.
60
+ arguments_preview (str): A preview of the arguments for display.
61
+ context (dict[str, str] | None, optional): Additional context information.
62
+
63
+ Returns:
64
+ ApprovalRequest: A new approval request instance.
65
+ """
66
+ return cls(
67
+ request_id=str(uuid4()),
68
+ tool_name=tool_name,
69
+ arguments_preview=arguments_preview,
70
+ context=context,
71
+ )
72
+
73
+
74
+ @dataclass
75
+ class ApprovalDecision:
76
+ """Captures the operator outcome."""
77
+
78
+ request_id: str
79
+ decision: ApprovalDecisionType
80
+ operator_input: str
81
+ decided_at: datetime | None = None
82
+ latency_ms: int | None = None
83
+
84
+ def __post_init__(self) -> None:
85
+ """Initialize timestamp if not provided."""
86
+ if self.decided_at is None:
87
+ self.decided_at = datetime.now()
88
+
89
+
90
+ @dataclass
91
+ class ApprovalLogEntry:
92
+ """Structured log entry for HITL decisions."""
93
+
94
+ request_id: str
95
+ tool_name: str
96
+ decision: str
97
+ event: str = "hitl_decision"
98
+ agent_id: str | None = None
99
+ thread_id: str | None = None
100
+ additional_context: dict[str, Any] | None = None
101
+ timestamp: datetime | None = None
102
+
103
+ def __post_init__(self) -> None:
104
+ """Initialize timestamp if not provided."""
105
+ if self.timestamp is None:
106
+ self.timestamp = datetime.now()
107
+
108
+
109
+ class HitlMetadata(BaseModel):
110
+ """Structured metadata payload included in agent streaming events."""
111
+
112
+ required: bool = Field(default=True)
113
+ decision: ApprovalDecisionType
114
+ request_id: str
115
+ timeout_seconds: int | None = Field(default=None, ge=0)
116
+ timeout_at: datetime | None = None
117
+
118
+ model_config = ConfigDict(extra="forbid", use_enum_values=True)
119
+
120
+ def as_payload(self) -> dict[str, Any]:
121
+ """Return a JSON-ready metadata payload."""
122
+ payload = self.model_dump(mode="json", exclude_none=True)
123
+
124
+ # Pydantic emits UTC datetimes as Zulu strings when dumping to JSON.
125
+ # Preserve the canonical ``+00:00`` suffix expected by downstream tests.
126
+ if "timeout_at" in payload and isinstance(self.timeout_at, datetime):
127
+ payload["timeout_at"] = self.timeout_at.isoformat()
128
+
129
+ return payload
130
+
131
+ @classmethod
132
+ def from_decision(
133
+ cls,
134
+ decision: ApprovalDecision,
135
+ *,
136
+ required: bool = True,
137
+ timeout_seconds: int | None = None,
138
+ timeout_at: datetime | None = None,
139
+ ) -> "HitlMetadata":
140
+ """Build metadata from an ``ApprovalDecision``.
141
+
142
+ Args:
143
+ decision (ApprovalDecision): The approval decision to build metadata from.
144
+ required (bool, optional): Whether approval is required. Defaults to True.
145
+ timeout_seconds (int | None, optional): Timeout in seconds for the decision.
146
+ timeout_at (datetime | None, optional): Specific timeout datetime.
147
+
148
+ Returns:
149
+ HitlMetadata: The constructed metadata instance.
150
+ """
151
+ return cls(
152
+ required=required,
153
+ decision=decision.decision,
154
+ request_id=decision.request_id,
155
+ timeout_seconds=timeout_seconds,
156
+ timeout_at=timeout_at,
157
+ )
@@ -0,0 +1,47 @@
1
+ """LangGraph-related schema definitions for agent tool interactions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Any
7
+
8
+ from gllm_core.schema import Chunk
9
+ from langchain_core.messages import ToolMessage
10
+ from langchain_core.messages.ai import UsageMetadata
11
+ from langchain_core.tools import BaseTool
12
+
13
+ from aip_agents.schema.artifacts import ArtifactPayload
14
+ from aip_agents.schema.model_usage import ModelUsageDelta, ModelUsageRow
15
+ from aip_agents.schema.runtime_metadata import RuntimeMetadata
16
+
17
+ __all__ = ["ToolCallResult", "ToolStorageParams"]
18
+
19
+
20
+ @dataclass
21
+ class ToolCallResult:
22
+ """Container for the results of a single tool call execution."""
23
+
24
+ messages: list[ToolMessage]
25
+ artifacts: list[ArtifactPayload]
26
+ # Standard event keys are typed via RuntimeMetadata. Transient internal or
27
+ # tool-injected keys (e.g. ``previous_step_ids``) may also ride along here;
28
+ # they are merged into the accumulator and consumed/stripped downstream, not
29
+ # read off this field.
30
+ metadata_delta: RuntimeMetadata
31
+ references: list[Chunk]
32
+ step_usage: UsageMetadata | None
33
+ model_usage_delta: ModelUsageDelta | None = None
34
+ model_usage: list[ModelUsageRow] | None = None
35
+ pii_mapping: dict[str, str] | None = None
36
+
37
+
38
+ @dataclass
39
+ class ToolStorageParams:
40
+ """Parameters required for automatically storing tool outputs."""
41
+
42
+ tool: BaseTool
43
+ tool_output: Any
44
+ tool_call: dict[str, Any]
45
+ tool_call_id: str
46
+ resolved_args: dict[str, Any]
47
+ state: dict[str, Any]
@@ -0,0 +1,103 @@
1
+ """Model identifiers and provider definitions for the AI agent platform."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from enum import StrEnum
6
+
7
+
8
+ class ModelProvider(StrEnum):
9
+ """Enumeration of supported model providers for the AI agent platform."""
10
+
11
+ OPENAI = "openai"
12
+ ANTHROPIC = "anthropic"
13
+ AZURE_OPENAI = "azure-openai"
14
+ GOOGLE_GENAI = "google"
15
+ GROQ = "groq"
16
+ TOGETHER_AI = "together"
17
+ DEEPINFRA = "deepinfra"
18
+ DEEPSEEK = "deepseek"
19
+ OPENAI_COMPATIBLE = "openai-compatible"
20
+
21
+
22
+ class ModelId:
23
+ """Model identifier class for representing language models."""
24
+
25
+ def __init__(self, provider: str, name: str, path: str | None = None):
26
+ """Initialize a ModelId.
27
+
28
+ Args:
29
+ provider: The model provider (e.g., 'openai', 'anthropic')
30
+ name: The specific model name
31
+ path: Optional path component for some providers
32
+ """
33
+ self.provider = provider
34
+ self.name = name
35
+ self.path = path
36
+
37
+ @classmethod
38
+ def from_string(cls, model_string: str) -> ModelId:
39
+ """Create a ModelId from a string representation.
40
+
41
+ Args:
42
+ model_string: String in format 'provider/name' or 'provider/path:name'
43
+
44
+ Returns:
45
+ ModelId instance
46
+
47
+ Raises:
48
+ ValueError: If the string format is invalid
49
+ """
50
+ if "/" not in model_string:
51
+ raise ValueError(
52
+ f"Invalid model string format: {model_string}. Expected 'provider/name' or 'provider/path:name'"
53
+ )
54
+
55
+ provider, remainder = model_string.split("/", 1)
56
+
57
+ if ":" in remainder:
58
+ last_colon_idx = remainder.rindex(":")
59
+ potential_path = remainder[:last_colon_idx]
60
+ # Only treat ':' as a path/name separator when the left side contains '/',
61
+ # which indicates a URL or sub-path. A bare ':' inside a model name (e.g.
62
+ # bedrock's 'us.anthropic.claude-...-v1:0') is part of the name itself.
63
+ if "/" in potential_path:
64
+ path = potential_path
65
+ name = remainder[last_colon_idx + 1 :]
66
+ else:
67
+ path = None # pragma: no cover
68
+ name = remainder # pragma: no cover
69
+ else:
70
+ path = None
71
+ name = remainder
72
+
73
+ return cls(provider, name, path)
74
+
75
+ def __str__(self) -> str:
76
+ """String representation of the ModelId."""
77
+ if self.path:
78
+ return f"{self.provider}/{self.path}:{self.name}"
79
+ return f"{self.provider}/{self.name}"
80
+
81
+ def __repr__(self) -> str:
82
+ """String representation of the ModelId for debugging."""
83
+ return f"ModelId(provider='{self.provider}', name='{self.name}', path='{self.path}')"
84
+
85
+ def __eq__(self, other: object) -> bool:
86
+ """Check equality with another ModelId object.
87
+
88
+ Args:
89
+ other (object): The object to compare with.
90
+
91
+ Returns:
92
+ bool: True if the objects are equal, False otherwise.
93
+ """
94
+ if not isinstance(other, ModelId):
95
+ return NotImplemented
96
+ return self.provider == other.provider and self.name == other.name and self.path == other.path
97
+
98
+ def __hash__(self) -> int:
99
+ """Return hash of the ModelId."""
100
+ return hash((self.provider, self.name, self.path))
101
+
102
+
103
+ __all__ = ["ModelId", "ModelProvider"]
@@ -0,0 +1,50 @@
1
+ """Schema contracts for model-level usage reporting.
2
+
3
+ These types define a stable contract for per-call model usage deltas and
4
+ final aggregated model usage rows.
5
+
6
+ Authors:
7
+ Raymond Christopher (raymond.christopher@gdplabs.id)
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import TypedDict
13
+
14
+
15
+ class ModelUsageDelta(TypedDict, total=False):
16
+ """Per-model-call usage delta emitted by runtime paths.
17
+
18
+ Fields intentionally mirror usage metadata counters while adding model
19
+ identity and a dedupe key (`usage_call_id`).
20
+ """
21
+
22
+ provider: str
23
+ model_name: str
24
+ model_id: str
25
+ language_model_id: str | None
26
+ usage_call_id: str
27
+ source: str
28
+ input_tokens: int
29
+ output_tokens: int
30
+ total_tokens: int
31
+ input_token_details: dict[str, int]
32
+ output_token_details: dict[str, int]
33
+
34
+
35
+ class ModelUsageRow(TypedDict, total=False):
36
+ """Final run-level model usage row aggregated by model identity."""
37
+
38
+ provider: str
39
+ model_name: str
40
+ model_id: str
41
+ language_model_id: str | None
42
+ input_tokens: int
43
+ output_tokens: int
44
+ total_tokens: int
45
+ usage_call_ids: list[str]
46
+ input_token_details: dict[str, int]
47
+ output_token_details: dict[str, int]
48
+
49
+
50
+ __all__ = ["ModelUsageDelta", "ModelUsageRow"]
@@ -0,0 +1,78 @@
1
+ """Shared typed contracts for runtime metadata payloads.
2
+
3
+ These contracts name the metadata dict shapes currently typed as
4
+ ``dict[str, Any]`` in ``aip_agents.utils.metadata_helper``. The canonical key
5
+ set is governed by ``metadata_helper.MetadataFieldKeys``; this module keeps
6
+ ``schema/`` a pure leaf package by defining the TypedDict with string-literal
7
+ keys that match those enum values instead of importing from ``utils/`` (which
8
+ would invert the dependency direction).
9
+
10
+ Authors:
11
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from typing import Any, TypedDict
17
+
18
+ from aip_agents.schema.a2a import ToolCallInfo, ToolResultInfo
19
+ from aip_agents.schema.attachments import AttachmentEntryPayload
20
+ from aip_agents.schema.model_usage import ModelUsageDelta, ModelUsageRow
21
+
22
+ __all__ = [
23
+ "LocalizedMessages",
24
+ "RuntimeMetadata",
25
+ ]
26
+
27
+
28
+ class LocalizedMessages(TypedDict):
29
+ """Localized message content produced by ``metadata_helper._create_message_metadata``."""
30
+
31
+ en: str
32
+ id: str
33
+
34
+
35
+ class RuntimeMetadata(TypedDict, total=False):
36
+ """Runtime metadata dict exchanged across agent steps and A2A events.
37
+
38
+ Keys track ``metadata_helper.MetadataFieldKeys`` plus three additional
39
+ families that have no ``MetadataFieldKeys`` entry:
40
+
41
+ - ``attachments`` / ``attachment_registry``: merged in by the attachment
42
+ helpers.
43
+ - ``previous_step_ids`` / ``step_id`` / ``agent_name``: transient linkage
44
+ keys injected by the legacy-metadata (``_process_legacy_metadata``) and
45
+ task-delegation paths. They ride on this dict only to be merged into the
46
+ accumulator and consumed/stripped downstream — they are not read as event
47
+ fields, but they *are* real keys on the dict, so declaring them keeps the
48
+ contract honest instead of lying about a closed key set.
49
+
50
+ ``tool_info`` reuses ``ToolCallInfo`` / ``ToolResultInfo`` from
51
+ ``schema.a2a`` — the exact shapes the agent emits for tool-call and
52
+ tool-result metadata events — rather than re-declaring them.
53
+
54
+ All keys are optional because different event kinds populate different
55
+ subsets; callers that need a required key should validate explicitly.
56
+ """
57
+
58
+ kind: str
59
+ status: str
60
+ time: float
61
+ message: LocalizedMessages
62
+ tool_info: ToolCallInfo | ToolResultInfo
63
+ references: list[Any]
64
+ thinking_and_activity_info: dict[str, Any]
65
+ hitl: dict[str, Any]
66
+ step_usage: dict[str, Any]
67
+ total_usage: dict[str, Any]
68
+ model_usage_delta: ModelUsageDelta | None
69
+ model_usage: list[ModelUsageRow]
70
+ token_streaming: bool
71
+ canonical: dict[str, Any]
72
+ pii_mapping: dict[str, str]
73
+ # Transient linkage keys (no MetadataFieldKeys entry); see class docstring.
74
+ previous_step_ids: list[str]
75
+ step_id: str
76
+ agent_name: str
77
+ attachments: list[AttachmentEntryPayload]
78
+ attachment_registry: dict[str, AttachmentEntryPayload]
@@ -0,0 +1,108 @@
1
+ """Step limit configuration and error classes for agent execution limits."""
2
+
3
+ import os
4
+ from dataclasses import dataclass, field
5
+ from enum import StrEnum
6
+
7
+
8
+ class StepLimitErrorType(StrEnum):
9
+ """Types of step-related limit violations."""
10
+
11
+ STEP_LIMIT_EXCEEDED = "STEP_LIMIT_EXCEEDED"
12
+ DELEGATION_DEPTH_EXCEEDED = "DELEGATION_DEPTH_EXCEEDED"
13
+
14
+
15
+ @dataclass
16
+ class StepLimitConfig:
17
+ """Configuration for agent step and delegation limits.
18
+
19
+ Attributes:
20
+ max_steps: Maximum number of execution steps allowed per invocation.
21
+ Includes agent node (LLM call) and every tool call (parallel batches count per call).
22
+ max_delegation_depth: Maximum depth of delegation chain allowed.
23
+ Depth 0 means no delegation allowed.
24
+ """
25
+
26
+ max_steps: int = field(
27
+ default_factory=lambda: int(os.getenv("STEP_LIMIT_MAX_STEPS_DEFAULT", "100")),
28
+ )
29
+ max_delegation_depth: int = field(
30
+ default_factory=lambda: int(os.getenv("STEP_LIMIT_MAX_DELEGATION_DEPTH_DEFAULT", "5")),
31
+ )
32
+
33
+ def __post_init__(self):
34
+ """Validate configuration values and normalize range."""
35
+ from aip_agents.utils.logger import get_logger
36
+
37
+ logger = get_logger(__name__)
38
+
39
+ # Validate and clamp max_steps
40
+ if self.max_steps < 1:
41
+ logger.warning(f"Invalid max_steps={self.max_steps}, resetting to default (25). max_steps must be >= 1.")
42
+ self.max_steps = 25
43
+ elif self.max_steps > 1000:
44
+ logger.warning(f"Invalid max_steps={self.max_steps}, capping at 1000.")
45
+ self.max_steps = 1000
46
+
47
+ # Validate and clamp max_delegation_depth
48
+ if self.max_delegation_depth < 0:
49
+ logger.warning(
50
+ f"Invalid max_delegation_depth={self.max_delegation_depth}, resetting to default (5). "
51
+ "max_delegation_depth must be >= 0."
52
+ )
53
+ self.max_delegation_depth = 5
54
+ elif self.max_delegation_depth > 10:
55
+ logger.warning(f"Invalid max_delegation_depth={self.max_delegation_depth}, capping at 10.")
56
+ self.max_delegation_depth = 10
57
+
58
+
59
+ @dataclass
60
+ class StepLimitErrorResponse:
61
+ """Structured error response for step limit violations.
62
+
63
+ Attributes:
64
+ error_type: The type of limit that was exceeded.
65
+ agent_name: Name of the agent that hit the limit.
66
+ current_value: Current step count or delegation depth.
67
+ configured_limit: The configured limit that was exceeded.
68
+ message: Human-readable error message.
69
+ delegation_chain: Full chain for delegation errors.
70
+ partial_result: Any output generated before hitting the limit.
71
+ """
72
+
73
+ error_type: StepLimitErrorType
74
+ agent_name: str
75
+ current_value: int
76
+ configured_limit: int
77
+ message: str
78
+ delegation_chain: list[str] | None = None
79
+ partial_result: str | None = None
80
+
81
+
82
+ class StepLimitError(Exception):
83
+ """Base exception for step and delegation limit violations.
84
+
85
+ Attributes:
86
+ error_response: Structured error response with details.
87
+ """
88
+
89
+ def __init__(self, error_response: StepLimitErrorResponse):
90
+ """Initialize with error response.
91
+
92
+ Args:
93
+ error_response: Structured error details.
94
+ """
95
+ self.error_response = error_response
96
+ super().__init__(error_response.message)
97
+
98
+
99
+ class MaxStepsExceededError(StepLimitError):
100
+ """Raised when agent exceeds configured max_steps limit."""
101
+
102
+ pass
103
+
104
+
105
+ class MaxDelegationDepthExceededError(StepLimitError):
106
+ """Raised when delegation would exceed max_delegation_depth limit."""
107
+
108
+ pass
@@ -0,0 +1,40 @@
1
+ """Schema definitions for storage configuration."""
2
+
3
+ import os
4
+ from dataclasses import dataclass
5
+ from enum import StrEnum
6
+
7
+ __all__ = ["OBJECT_STORAGE_PREFIX", "StorageType", "StorageConfig"]
8
+
9
+ OBJECT_STORAGE_PREFIX = "tool_outputs/"
10
+
11
+
12
+ class StorageType(StrEnum):
13
+ """Supported storage types."""
14
+
15
+ MEMORY = "memory"
16
+ OBJECT_STORAGE = "object_storage"
17
+
18
+
19
+ @dataclass
20
+ class StorageConfig:
21
+ """Configuration for storage providers."""
22
+
23
+ storage_type: StorageType = StorageType.MEMORY
24
+ object_prefix: str = OBJECT_STORAGE_PREFIX
25
+ object_use_json: bool = False
26
+
27
+ @classmethod
28
+ def from_env(cls) -> "StorageConfig":
29
+ """Create StorageConfig from environment variables."""
30
+ storage_type_str = os.getenv("TOOL_OUTPUT_STORAGE_TYPE", StorageType.MEMORY.value).lower()
31
+ if storage_type_str == StorageType.MEMORY.value:
32
+ storage_type = StorageType.MEMORY
33
+ else:
34
+ storage_type = StorageType.OBJECT_STORAGE
35
+
36
+ object_prefix = os.getenv("TOOL_OUTPUT_OBJECT_PREFIX", OBJECT_STORAGE_PREFIX)
37
+ use_json_str = os.getenv("TOOL_OUTPUT_USE_JSON", "false").lower()
38
+ use_json = use_json_str in ("true", "1", "yes", "on")
39
+
40
+ return cls(storage_type=storage_type, object_prefix=object_prefix, object_use_json=use_json)
@@ -0,0 +1,68 @@
1
+ """Shared typed contracts for tool input/output payloads.
2
+
3
+ These contracts name the high-fanout tool argument and tool-output summary
4
+ shapes currently typed as ``dict[str, Any]`` in
5
+ ``aip_agents.utils.langgraph.tool_output_management`` and the tool-call event
6
+ surfaces. They are intentionally narrow: full value typing for ``ToolArgs`` is
7
+ deferred to a later typing wave.
8
+
9
+ Authors:
10
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from typing import Any, Required, TypedDict
16
+
17
+ __all__ = [
18
+ "ToolArgs",
19
+ "ToolInvocationPayload",
20
+ "ToolOutputSummaryEntry",
21
+ "ToolOutputStorageStats",
22
+ ]
23
+
24
+ ToolArgs = dict[str, Any]
25
+ """Named alias for the tool-argument payload hotspot.
26
+
27
+ Narrowing the value type fully is deferred to a later typing wave; naming the
28
+ surface now lets adoption slices reference a single canonical alias.
29
+ """
30
+
31
+
32
+ class ToolInvocationPayload(TypedDict, total=False):
33
+ """Serialized tool-call invocation shape exchanged with LangGraph tool messages.
34
+
35
+ Aligns with the ``tool_call`` dict produced by LangGraph and consumed by
36
+ ``schema.langgraph.ToolStorageParams.tool_call``. ``name``, ``args``, and
37
+ ``id`` are always present on a LangGraph tool call (``id`` correlates the
38
+ call with its ``ToolMessage`` result); ``total=False`` is kept for
39
+ structural parity with the other payload contracts.
40
+ """
41
+
42
+ name: Required[str]
43
+ args: Required[ToolArgs]
44
+ id: Required[str]
45
+
46
+
47
+ class ToolOutputSummaryEntry(TypedDict, total=False):
48
+ """One entry in the JSON summary emitted by ``ToolOutputManager.generate_summary``.
49
+
50
+ ``reference`` and ``tool`` are always present; ``description``, ``agent``,
51
+ and ``data_preview`` are conditional on stored metadata.
52
+ """
53
+
54
+ reference: Required[str]
55
+ tool: Required[str]
56
+ description: str
57
+ agent: str
58
+ data_preview: str
59
+
60
+
61
+ class ToolOutputStorageStats(TypedDict):
62
+ """Shape returned by ``ToolOutputManager.get_storage_stats``."""
63
+
64
+ total_outputs: int
65
+ total_size_bytes: int
66
+ external_storage_count: int
67
+ memory_storage_count: int
68
+ storage_provider_type: str
@@ -0,0 +1,11 @@
1
+ """This module provides a centralized way to handle Sentry and OpenTelemetry configuration for GL Connectors SDK.
2
+
3
+ Authors:
4
+ Saul Sayers (saul.sayers@gdplabs.id)
5
+ """
6
+
7
+ from aip_agents.sentry.sentry import setup_telemetry
8
+
9
+ __all__ = [
10
+ "setup_telemetry",
11
+ ]