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,240 @@
1
+ """Template policy for sandbox templates.
2
+
3
+ This module owns the *aip-agents* template policy and a thin orchestration
4
+ wrapper that delegates the generic build mechanics to gllm-tools'
5
+ ``E2BTemplateBuilder``.
6
+
7
+ Two build inputs are supported, selected at runtime:
8
+
9
+ - **Image registry (preferred).** When ``AIP_SANDBOX_IMAGE_REGISTRY`` is set, the
10
+ template is built from a prebuilt image (see ``image_registry``).
11
+ - **Dockerfile (DEPRECATED — legacy fallback).** When the image registry is not
12
+ configured, the build falls back to the packaged ``dockerfiles/*.Dockerfile``.
13
+ This path and the packaged Dockerfiles are slated for removal once image-based
14
+ building is validated in production; do not extend it.
15
+
16
+ The generic E2B build primitives now live in
17
+ ``gllm_tools.code_interpreter.code_template``; aip-agents no longer imports the
18
+ base ``e2b`` package directly.
19
+
20
+ Authors:
21
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
22
+ """
23
+
24
+ import shlex
25
+ from pathlib import Path
26
+
27
+ from aip_agents.sandbox import image_registry
28
+ from aip_agents.sandbox.defaults import DEFAULT_SANDBOX_TEMPLATE
29
+ from aip_agents.sandbox.validation import validate_package_names
30
+ from aip_agents.utils.logger import get_logger
31
+
32
+ logger = get_logger(__name__)
33
+
34
+ # DEPRECATED: packaged Dockerfile build path. Kept as a gated fallback for
35
+ # environments without an image registry; remove with the packaged Dockerfiles
36
+ # once image-based building is proven in production.
37
+ DEFAULT_SANDBOX_DOCKERFILE_RELATIVE_PATH = Path("dockerfiles/aip-agents-sandbox-v2-3.Dockerfile")
38
+
39
+
40
+ class DockerfileNotFoundError(ValueError):
41
+ """Raised when no packaged Dockerfile matches a requested template alias.
42
+
43
+ DEPRECATED: part of the legacy Dockerfile build path.
44
+ """
45
+
46
+
47
+ def get_default_sandbox_dockerfile_path() -> Path:
48
+ """Return the absolute path to the packaged default sandbox Dockerfile.
49
+
50
+ DEPRECATED: legacy Dockerfile build path; superseded by the image registry
51
+ (``AIP_SANDBOX_IMAGE_REGISTRY``). Slated for removal once image-based
52
+ building is validated.
53
+ """
54
+ return Path(__file__).resolve().parent / DEFAULT_SANDBOX_DOCKERFILE_RELATIVE_PATH
55
+
56
+
57
+ def get_sandbox_dockerfile_path(template_id: str) -> Path:
58
+ """Resolve the packaged Dockerfile path for a sandbox template alias.
59
+
60
+ DEPRECATED: legacy Dockerfile build path; superseded by the image registry
61
+ (``AIP_SANDBOX_IMAGE_REGISTRY``). Slated for removal once image-based
62
+ building is validated.
63
+
64
+ Args:
65
+ template_id: The template alias to resolve.
66
+
67
+ Returns:
68
+ Absolute Dockerfile path for the alias.
69
+
70
+ Raises:
71
+ DockerfileNotFoundError: If no packaged Dockerfile matches ``template_id``.
72
+ """
73
+ default_dockerfile = get_default_sandbox_dockerfile_path()
74
+ if template_id == DEFAULT_SANDBOX_TEMPLATE:
75
+ return default_dockerfile
76
+
77
+ candidate = default_dockerfile.parent / f"{template_id}.Dockerfile"
78
+ if candidate.is_file():
79
+ return candidate
80
+
81
+ raise DockerfileNotFoundError(f"No template-specific Dockerfile found for {template_id!r}. Expected: {candidate}")
82
+
83
+
84
+ def _load_code_template_builder() -> tuple[type, type]:
85
+ """Load the gllm-tools template builder classes only when needed."""
86
+ from gllm_tools.code_interpreter.code_template import TemplateSpec
87
+ from gllm_tools.code_interpreter.code_template.e2b_template_builder import (
88
+ E2BTemplateBuilder,
89
+ )
90
+
91
+ return TemplateSpec, E2BTemplateBuilder
92
+
93
+
94
+ def ensure_sandbox_template(
95
+ template_id: str,
96
+ base_template: str,
97
+ packages: list[str] | None,
98
+ force_rebuild: bool = False,
99
+ dockerfile: str | Path | None = None,
100
+ ) -> str | None:
101
+ """Ensure a sandbox template exists, creating it if necessary.
102
+
103
+ This is an explicit helper that apps can call at startup to ensure the
104
+ template exists. It is never run implicitly by the SDK. The generic build
105
+ mechanics are delegated to gllm-tools' ``E2BTemplateBuilder``; this wrapper
106
+ keeps the aip-agents policy (package validation) and the historical
107
+ string-or-``None`` return shape.
108
+
109
+ Build input is selected at runtime: when ``AIP_SANDBOX_IMAGE_REGISTRY`` is
110
+ set, the template is built from the resolved registry image; otherwise it
111
+ falls back to the **deprecated** Dockerfile path (the ``dockerfile`` arg or
112
+ ``base_template``).
113
+
114
+ Template building requires the base ``e2b`` package, provided transitively by
115
+ gllm-tools' sandbox support; the ``E2BTemplateBuilder`` import below raises
116
+ an actionable ``ImportError`` when it is absent.
117
+
118
+ Args:
119
+ template_id: Unique alias for the template (e.g., "aip-agents-sandbox-v2").
120
+ base_template: Base template alias to build from
121
+ (e.g., "code-interpreter-v1").
122
+ packages: List of packages to install in the template.
123
+ If None or empty, skips pip install step.
124
+ force_rebuild: If True, rebuild even if alias exists.
125
+ dockerfile: Optional Dockerfile path used to create template via
126
+ ``from_dockerfile``. DEPRECATED: ignored when the image registry is
127
+ configured.
128
+
129
+ Returns:
130
+ The template_id on success, None if creation failed.
131
+ Never raises (apart from a missing-``e2b`` ImportError).
132
+ """
133
+ # Pre-validate packages here (aip-agents policy); the library treats the list
134
+ # as trusted. Keep the never-raises contract by mapping a validation error to
135
+ # a None result. Note: validation now runs ahead of the library's
136
+ # "already usable" fast path, so an already-built template re-requested with a
137
+ # now-invalid package list returns None rather than its existing alias.
138
+ if packages:
139
+ try:
140
+ validate_package_names(packages)
141
+ except Exception as e:
142
+ logger.warning(f"Package validation failed for {template_id}: {e}")
143
+ return None
144
+
145
+ if image_registry.resolve_image_ref() is not None:
146
+ try:
147
+ _, builder_type = _load_code_template_builder()
148
+ except ModuleNotFoundError as exc:
149
+ # Keep a stable failure mode for optional dependency availability:
150
+ # tests assert this remains an actionable e2b requirement error.
151
+ raise ImportError("'e2b' package is required to build sandbox templates") from exc
152
+
153
+ try:
154
+ spec = image_registry.build_spec(template_id, packages=packages, force_rebuild=force_rebuild)
155
+ except Exception as e:
156
+ logger.warning(f"Image-registry template config failed for {template_id}: {e}")
157
+ return None
158
+ result = builder_type().ensure(spec)
159
+ else:
160
+ # DEPRECATED: legacy Dockerfile build path. Remove once image-based
161
+ # building is validated in production.
162
+ logger.warning(
163
+ "Building sandbox template %r via the deprecated Dockerfile path (AIP_SANDBOX_IMAGE_REGISTRY not set).",
164
+ template_id,
165
+ )
166
+ if dockerfile is not None:
167
+ return _ensure_e2b_dockerfile_template(
168
+ template_id=template_id,
169
+ packages=packages,
170
+ force_rebuild=force_rebuild,
171
+ dockerfile=Path(dockerfile),
172
+ )
173
+
174
+ try:
175
+ template_spec_type, builder_type = _load_code_template_builder()
176
+ except ModuleNotFoundError as exc:
177
+ # Keep a stable failure mode for optional dependency availability:
178
+ # tests assert this remains an actionable e2b requirement error.
179
+ raise ImportError("'e2b' package is required to build sandbox templates") from exc
180
+
181
+ spec = template_spec_type(
182
+ template_id=template_id,
183
+ base_template=base_template,
184
+ packages=packages,
185
+ dockerfile=None,
186
+ force_rebuild=force_rebuild,
187
+ )
188
+ result = builder_type().ensure(spec)
189
+ # gllm-tools now returns a provider-tagged ``TemplateRef`` (None on failure);
190
+ # unwrap to the E2B alias string to keep this wrapper's historical contract.
191
+ return result.template_ref.value if result.template_ref is not None else None
192
+
193
+
194
+ def _ensure_e2b_dockerfile_template(
195
+ template_id: str,
196
+ packages: list[str] | None,
197
+ force_rebuild: bool,
198
+ dockerfile: Path,
199
+ ) -> str | None:
200
+ """Build an E2B alias from a Dockerfile path with its directory as context.
201
+
202
+ E2B's deprecated ``Template().from_dockerfile(path)`` parser keeps COPY
203
+ sources relative to ``Template(file_context_path=...)``, not automatically
204
+ relative to the Dockerfile path. The generic gllm-tools wrapper currently
205
+ constructs ``Template()`` without that context, so aip-agents owns the
206
+ path-based Dockerfile branch until the generic wrapper grows first-class
207
+ context support.
208
+ """
209
+ from e2b import Template, default_build_logger
210
+
211
+ _, builder_type = _load_code_template_builder()
212
+
213
+ builder = builder_type()
214
+ if not force_rebuild and builder.is_usable(template_id):
215
+ return template_id
216
+
217
+ dockerfile_path = dockerfile.resolve()
218
+
219
+ try:
220
+ template = Template(file_context_path=dockerfile_path.parent).from_dockerfile(str(dockerfile_path))
221
+ if packages:
222
+ packages_str = " ".join(shlex.quote(package) for package in packages)
223
+ template = template.run_cmd(f"pip install -q {packages_str}")
224
+ Template.build(template, alias=template_id, on_build_logs=default_build_logger())
225
+ return template_id
226
+ except Exception as e: # pragma: no cover
227
+ logger.warning(f"E2B Dockerfile template build failed for {template_id}: {e}") # pragma: no cover
228
+ if not force_rebuild and builder.is_usable(template_id): # pragma: no cover
229
+ return template_id # pragma: no cover
230
+ return None # pragma: no cover
231
+
232
+
233
+ def ensure_ptc_template(
234
+ template_id: str,
235
+ base_template: str,
236
+ ptc_packages: list[str] | None,
237
+ force_rebuild: bool = False,
238
+ ) -> str | None:
239
+ """Deprecated: Use ensure_sandbox_template instead."""
240
+ return ensure_sandbox_template(template_id, base_template, ptc_packages, force_rebuild=force_rebuild)
@@ -0,0 +1,141 @@
1
+ """Sandbox execution result types.
2
+
3
+ This module defines types for sandbox execution results.
4
+
5
+ Authors:
6
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
7
+ """
8
+
9
+ from dataclasses import dataclass, field
10
+ from typing import Any, TypeAlias, cast
11
+
12
+ from langchain_core.messages.ai import UsageMetadata
13
+
14
+ from aip_agents.utils.logger import get_logger
15
+ from aip_agents.utils.token_usage_helper import add_usage_metadata
16
+
17
+ logger = get_logger(__name__)
18
+
19
+ JSONValue: TypeAlias = None | bool | int | float | str | list["JSONValue"] | dict[str, "JSONValue"]
20
+
21
+ _USAGE_TOKEN_KEYS = ("input_tokens", "output_tokens", "total_tokens")
22
+ _USAGE_DETAIL_KEYS = ("input_token_details", "output_token_details")
23
+
24
+
25
+ def _is_usage_number(value: JSONValue) -> bool:
26
+ """Return whether a structured-output token value is safely additive."""
27
+ return isinstance(value, int | float) and not isinstance(value, bool)
28
+
29
+
30
+ def _validated_usage_metadata(value: JSONValue | None) -> UsageMetadata | None:
31
+ """Return validated UsageMetadata or None when a sandbox payload is malformed."""
32
+ if not isinstance(value, dict):
33
+ return None
34
+
35
+ for key in _USAGE_TOKEN_KEYS:
36
+ if not _is_usage_number(value.get(key)):
37
+ logger.warning(f"Skipping malformed usage_metadata (expected numeric {key})")
38
+ return None
39
+
40
+ validated: dict[str, Any] = {key: value[key] for key in _USAGE_TOKEN_KEYS}
41
+ for key in _USAGE_DETAIL_KEYS:
42
+ details = value.get(key)
43
+ if details is None:
44
+ continue
45
+ if not isinstance(details, dict) or any(
46
+ not _is_usage_number(detail_value) for detail_value in details.values()
47
+ ):
48
+ logger.warning(f"Skipping malformed usage_metadata (expected numeric {key} values)")
49
+ return None
50
+ validated[key] = details # pragma: no cover
51
+ return cast(UsageMetadata, validated)
52
+
53
+
54
+ @dataclass
55
+ class PTCStructuredOutput:
56
+ """Supported structured updates emitted by sandboxed PTC custom tools."""
57
+
58
+ metadata: dict[str, JSONValue] = field(default_factory=dict)
59
+ artifacts: list[JSONValue] = field(default_factory=list)
60
+ pii_mapping: dict[str, JSONValue] = field(default_factory=dict)
61
+ usage_metadata: dict[str, JSONValue] = field(default_factory=dict)
62
+ warnings: list[str] = field(default_factory=list)
63
+
64
+ def has_updates(self) -> bool:
65
+ """Return True when at least one supported update field is present."""
66
+ return bool(self.metadata or self.artifacts or self.pii_mapping or self.usage_metadata or self.warnings)
67
+
68
+ def merge(self, update: dict[str, JSONValue]) -> None:
69
+ """Merge one supported update using ToolExecutionEngine-compatible semantics."""
70
+ metadata = update.get("metadata")
71
+ if isinstance(metadata, dict):
72
+ self.metadata.update(metadata)
73
+
74
+ artifacts = update.get("artifacts")
75
+ if isinstance(artifacts, list):
76
+ self.artifacts.extend(artifacts)
77
+
78
+ pii_mapping = update.get("pii_mapping")
79
+ if isinstance(pii_mapping, dict):
80
+ # Only accept str->str entries. Downstream masking sorts and matches on
81
+ # value length/content, so a non-string tag or value would poison every
82
+ # later anonymization call.
83
+ for tag, value in pii_mapping.items():
84
+ if isinstance(tag, str) and isinstance(value, str):
85
+ self.pii_mapping[tag] = value
86
+ else:
87
+ logger.warning(f"Skipping malformed pii_mapping entry (expected str->str): {tag!r} -> {value!r}")
88
+
89
+ usage_metadata = _validated_usage_metadata(update.get("usage_metadata"))
90
+ if usage_metadata is not None:
91
+ current_usage = cast(UsageMetadata | None, self.usage_metadata or None)
92
+ self.usage_metadata = cast(dict[str, JSONValue], add_usage_metadata(current_usage, usage_metadata) or {})
93
+
94
+ warnings = update.get("warnings")
95
+ if isinstance(warnings, list):
96
+ self.warnings.extend(warning for warning in warnings if isinstance(warning, str)) # pragma: no cover
97
+
98
+ def add_warning(self, warning: str) -> None:
99
+ """Record a caller-visible non-fatal structured-output warning."""
100
+ self.warnings.append(warning)
101
+
102
+ def to_command_update(self) -> dict[str, JSONValue]:
103
+ """Return only populated supported fields for an outer Command.update."""
104
+ update: dict[str, JSONValue] = {}
105
+ if self.metadata:
106
+ update["metadata"] = self.metadata
107
+ if self.artifacts:
108
+ update["artifacts"] = self.artifacts
109
+ if self.pii_mapping:
110
+ update["pii_mapping"] = self.pii_mapping
111
+ if self.usage_metadata:
112
+ update["usage_metadata"] = self.usage_metadata
113
+ if self.warnings:
114
+ update["warnings"] = cast(JSONValue, list(self.warnings))
115
+ return update
116
+
117
+
118
+ @dataclass
119
+ class SandboxExecutionResult:
120
+ """Result of a sandbox code execution.
121
+
122
+ Attributes:
123
+ stdout: Standard output from the execution.
124
+ stderr: Standard error from the execution.
125
+ exit_code: Exit code (0 for success, non-zero for failure).
126
+ timed_out: Whether the sandbox runtime reported an execution timeout.
127
+ execution_backend: Runtime backend that executed the code or command.
128
+ timeout_source: Specific timeout layer when known.
129
+ timeout_seconds: Timeout value enforced by that layer when known.
130
+ diagnostics: Extra machine-readable execution diagnostics.
131
+ """
132
+
133
+ stdout: str
134
+ stderr: str
135
+ exit_code: int
136
+ structured_output: PTCStructuredOutput = field(default_factory=PTCStructuredOutput)
137
+ timed_out: bool = False
138
+ execution_backend: str | None = None
139
+ timeout_source: str | None = None
140
+ timeout_seconds: float | None = None
141
+ diagnostics: dict[str, Any] = field(default_factory=dict)
@@ -0,0 +1,50 @@
1
+ """Validation utilities for sandbox operations.
2
+
3
+ This module provides validation functions for sandbox-related operations
4
+ such as package name validation.
5
+
6
+ Authors:
7
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
8
+ """
9
+
10
+ import re
11
+
12
+ _PACKAGE_SPEC_PATTERN = re.compile(
13
+ r"^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?"
14
+ r"(?:\[[A-Za-z0-9._-]+(?:,[A-Za-z0-9._-]+)*\])?"
15
+ r"(?:"
16
+ r"(?:==|!=|<=|>=|~=|<|>)[0-9][A-Za-z0-9.*+!_-]*"
17
+ r"(?:,(?:==|!=|<=|>=|~=|<|>)[0-9][A-Za-z0-9.*+!_-]*)*"
18
+ r")?$"
19
+ )
20
+
21
+
22
+ def validate_package_name(package: str) -> bool:
23
+ """Validate package name/specifier format for pip install.
24
+
25
+ Allows standard pip formats: package, package==version, package[extra].
26
+
27
+ Args:
28
+ package: Package name or specifier to validate.
29
+
30
+ Returns:
31
+ True if package name is valid, False otherwise.
32
+ """
33
+ if not package:
34
+ return False
35
+
36
+ return bool(_PACKAGE_SPEC_PATTERN.fullmatch(package))
37
+
38
+
39
+ def validate_package_names(packages: list[str]) -> None:
40
+ """Validate all package names in a list.
41
+
42
+ Args:
43
+ packages: List of package names or specifiers to validate.
44
+
45
+ Raises:
46
+ ValueError: If any package name is invalid.
47
+ """
48
+ for pkg in packages:
49
+ if not validate_package_name(pkg):
50
+ raise ValueError(f"Invalid package name format: {pkg}")
@@ -0,0 +1,106 @@
1
+ """Central schema package for aip_agents data models."""
2
+
3
+ from aip_agents.schema.a2a import A2AEvent, A2AStreamEventType, ToolCallInfo, ToolResultInfo
4
+ from aip_agents.schema.agent import (
5
+ A2AClientConfig,
6
+ AgentConfig,
7
+ BaseAgentConfig,
8
+ CredentialType,
9
+ HttpxClientOptions,
10
+ LangflowAgentConfig,
11
+ StreamMode,
12
+ )
13
+ from aip_agents.schema.artifacts import (
14
+ ArtifactBuildError,
15
+ ArtifactPayload,
16
+ ToolArtifactResponse,
17
+ ToolMultiArtifactResponse,
18
+ TrackedArtifact,
19
+ )
20
+ from aip_agents.schema.attachments import AttachmentEntryPayload
21
+ from aip_agents.schema.hitl import (
22
+ ApprovalDecision,
23
+ ApprovalDecisionType,
24
+ ApprovalLogEntry,
25
+ ApprovalRequest,
26
+ HitlMetadata,
27
+ )
28
+ from aip_agents.schema.langgraph import ToolCallResult, ToolStorageParams
29
+ from aip_agents.schema.model_id import ModelId, ModelProvider
30
+ from aip_agents.schema.model_usage import ModelUsageDelta, ModelUsageRow
31
+ from aip_agents.schema.runtime_metadata import (
32
+ LocalizedMessages,
33
+ RuntimeMetadata,
34
+ )
35
+ from aip_agents.schema.step_limit import (
36
+ MaxDelegationDepthExceededError,
37
+ MaxStepsExceededError,
38
+ StepLimitConfig,
39
+ StepLimitError,
40
+ StepLimitErrorResponse,
41
+ StepLimitErrorType,
42
+ )
43
+ from aip_agents.schema.storage import OBJECT_STORAGE_PREFIX, StorageConfig, StorageType
44
+ from aip_agents.schema.tool_payloads import (
45
+ ToolArgs,
46
+ ToolInvocationPayload,
47
+ ToolOutputStorageStats,
48
+ ToolOutputSummaryEntry,
49
+ )
50
+
51
+ __all__ = [
52
+ # A2A
53
+ "A2AEvent",
54
+ "A2AStreamEventType",
55
+ "ToolCallInfo",
56
+ "ToolResultInfo",
57
+ # Agent
58
+ "A2AClientConfig",
59
+ "AgentConfig",
60
+ "BaseAgentConfig",
61
+ "CredentialType",
62
+ "HttpxClientOptions",
63
+ "LangflowAgentConfig",
64
+ "StreamMode",
65
+ # Artifacts
66
+ "ArtifactBuildError",
67
+ "ArtifactPayload",
68
+ "ToolArtifactResponse",
69
+ "ToolMultiArtifactResponse",
70
+ "TrackedArtifact",
71
+ # Attachments
72
+ "AttachmentEntryPayload",
73
+ # HITL
74
+ "ApprovalDecision",
75
+ "ApprovalDecisionType",
76
+ "ApprovalLogEntry",
77
+ "ApprovalRequest",
78
+ "HitlMetadata",
79
+ # LangGraph
80
+ "ToolCallResult",
81
+ "ToolStorageParams",
82
+ # Model
83
+ "ModelId",
84
+ "ModelProvider",
85
+ "ModelUsageDelta",
86
+ "ModelUsageRow",
87
+ # Runtime metadata
88
+ "LocalizedMessages",
89
+ "RuntimeMetadata",
90
+ # Storage
91
+ "OBJECT_STORAGE_PREFIX",
92
+ "StorageConfig",
93
+ "StorageType",
94
+ # Step Limit
95
+ "MaxDelegationDepthExceededError",
96
+ "MaxStepsExceededError",
97
+ "StepLimitConfig",
98
+ "StepLimitError",
99
+ "StepLimitErrorResponse",
100
+ "StepLimitErrorType",
101
+ # Tool payloads
102
+ "ToolArgs",
103
+ "ToolInvocationPayload",
104
+ "ToolOutputStorageStats",
105
+ "ToolOutputSummaryEntry",
106
+ ]
@@ -0,0 +1,58 @@
1
+ """A2A event schema definitions used for agent-executor communication."""
2
+
3
+ from enum import Enum
4
+ from typing import Any
5
+
6
+ from typing_extensions import TypedDict
7
+
8
+ __all__ = [
9
+ "A2AStreamEventType",
10
+ "A2AEvent",
11
+ "ToolCallInfo",
12
+ "ToolResultInfo",
13
+ ]
14
+
15
+
16
+ class A2AStreamEventType(Enum):
17
+ """Semantic event types for A2A agent-executor communication."""
18
+
19
+ STATUS_UPDATE = "status_update"
20
+ CONTENT_CHUNK = "content_chunk"
21
+ FINAL_RESPONSE = "final_response"
22
+ TOOL_CALL = "tool_call"
23
+ TOOL_RESULT = "tool_result"
24
+ ERROR = "error"
25
+ STEP_LIMIT_EXCEEDED = "step_limit_exceeded"
26
+
27
+
28
+ class A2AEvent(TypedDict):
29
+ """Structured event data used by the A2A connector."""
30
+
31
+ event_type: A2AStreamEventType
32
+ content: str
33
+ metadata: dict[str, Any]
34
+ tool_info: dict[str, Any] | None
35
+ is_final: bool
36
+ artifacts: list[dict[str, Any]] | None
37
+ references: list[Any] | None
38
+ step_usage: dict[str, Any] | None
39
+ total_usage: dict[str, Any] | None
40
+ model_usage_delta: dict[str, Any] | None
41
+ model_usage: list[dict[str, Any]] | None
42
+ thinking_and_activity_info: dict[str, Any] | None
43
+
44
+
45
+ class ToolCallInfo(TypedDict):
46
+ """Structured information for tool invocation events."""
47
+
48
+ tool_calls: list[dict[str, Any]]
49
+ status: str
50
+
51
+
52
+ class ToolResultInfo(TypedDict):
53
+ """Structured information for tool completion events."""
54
+
55
+ name: str
56
+ args: dict[str, Any]
57
+ output: str
58
+ execution_time: float | None