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,62 @@
1
+ # flake8: noqa: F401
2
+ """Sandbox module for isolated code execution.
3
+
4
+ This module provides abstractions for running code in sandboxed environments.
5
+ All components support lazy loading to work with optional dependencies (e2b).
6
+
7
+ Authors:
8
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
9
+ """
10
+
11
+ import warnings
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ if TYPE_CHECKING:
15
+ from aip_agents.sandbox.defaults import DEFAULT_SANDBOX_PACKAGES, DEFAULT_SANDBOX_TEMPLATE
16
+ from aip_agents.sandbox.e2b_runtime import E2BSandboxRuntime
17
+ from aip_agents.sandbox.sandbox_runtime import SandboxRuntime
18
+ from aip_agents.sandbox.template_builder import ensure_sandbox_template
19
+ from aip_agents.sandbox.types import SandboxExecutionResult
20
+
21
+ _IMPORT_MAP = {
22
+ "SandboxRuntime": "aip_agents.sandbox.sandbox_runtime",
23
+ "E2BSandboxRuntime": "aip_agents.sandbox.e2b_runtime",
24
+ "ensure_sandbox_template": "aip_agents.sandbox.template_builder",
25
+ "ensure_ptc_template": "aip_agents.sandbox.template_builder",
26
+ "DEFAULT_SANDBOX_TEMPLATE": "aip_agents.sandbox.defaults",
27
+ "DEFAULT_SANDBOX_PACKAGES": "aip_agents.sandbox.defaults",
28
+ "SandboxExecutionResult": "aip_agents.sandbox.types",
29
+ }
30
+
31
+ _DEPRECATED_ALIASES = {
32
+ "ensure_ptc_template": "ensure_sandbox_template",
33
+ }
34
+
35
+ _cache: dict[str, Any] = {}
36
+
37
+
38
+ def __getattr__(name: str) -> Any:
39
+ """Lazy import components on first access."""
40
+ if name in _cache:
41
+ return _cache[name]
42
+
43
+ if name in _IMPORT_MAP:
44
+ try:
45
+ module = __import__(_IMPORT_MAP[name], fromlist=[name])
46
+ target_name = _DEPRECATED_ALIASES.get(name, name)
47
+ _cache[name] = getattr(module, target_name)
48
+
49
+ if target_name != name:
50
+ warnings.warn(
51
+ f"{name} is deprecated; use {target_name} instead",
52
+ DeprecationWarning,
53
+ stacklevel=2,
54
+ )
55
+ return _cache[name]
56
+ except ImportError as e:
57
+ raise ImportError(f"Failed to import {name}. Install with: pip install aip-agents[local]") from e
58
+
59
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
60
+
61
+
62
+ __all__ = list(_IMPORT_MAP.keys())
@@ -0,0 +1,220 @@
1
+ """Defaults for sandbox templates and packages.
2
+
3
+ Authors:
4
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
5
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import TYPE_CHECKING
11
+
12
+ if TYPE_CHECKING:
13
+ from aip_agents.mcp.client.base_mcp_client import BaseMCPClient
14
+ from aip_agents.ptc.custom_tools import PTCCustomToolConfig
15
+
16
+ DEFAULT_SANDBOX_TEMPLATE = "aip-agents-sandbox-v2-3"
17
+ AIP_AGENTS_BINARY_LOCAL = "aip-agents-binary[local]"
18
+ DEFAULT_SANDBOX_PACKAGES: tuple[str, ...] = (
19
+ AIP_AGENTS_BINARY_LOCAL,
20
+ "mcp",
21
+ "httpx",
22
+ )
23
+
24
+ # Backward compatibility aliases
25
+ DEFAULT_PTC_TEMPLATE = DEFAULT_SANDBOX_TEMPLATE
26
+ DEFAULT_PTC_PACKAGES = DEFAULT_SANDBOX_PACKAGES
27
+
28
+
29
+ def _has_mcp_tools(mcp_client: BaseMCPClient | None) -> bool:
30
+ """Check if MCP tools are present.
31
+
32
+ Args:
33
+ mcp_client: The MCP client to check.
34
+
35
+ Returns:
36
+ True if MCP client has servers configured.
37
+ """
38
+ return mcp_client is not None and bool(getattr(mcp_client, "servers", None))
39
+
40
+
41
+ def _has_custom_tools(custom_tools_config: PTCCustomToolConfig | None) -> bool:
42
+ """Check if custom tools are present and enabled.
43
+
44
+ Args:
45
+ custom_tools_config: The custom tools configuration to check.
46
+
47
+ Returns:
48
+ True if custom tools are enabled and tools list is non-empty.
49
+ """
50
+ return custom_tools_config is not None and custom_tools_config.enabled and bool(custom_tools_config.tools)
51
+
52
+
53
+ def _has_native_aip_tools(custom_tools_config: PTCCustomToolConfig | None) -> bool:
54
+ """Check if native AIP tools are present.
55
+
56
+ Native AIP tools are package-based custom tools with import_path starting with "aip_agents.tools.".
57
+
58
+ Args:
59
+ custom_tools_config: The custom tools configuration to check.
60
+
61
+ Returns:
62
+ True if at least one native AIP tool is found.
63
+ """
64
+ if not _has_custom_tools(custom_tools_config):
65
+ return False
66
+
67
+ assert custom_tools_config is not None
68
+ for tool in custom_tools_config.tools:
69
+ if tool.get("kind") == "package":
70
+ import_path = tool.get("import_path", "")
71
+ if import_path.startswith("aip_agents.tools."):
72
+ return True
73
+
74
+ return False
75
+
76
+
77
+ def _merge_requirements(packages: list[str], requirements: list[str]) -> None:
78
+ """Merge requirements into packages list, avoiding duplicates.
79
+
80
+ Args:
81
+ packages: Target list to merge into (modified in place).
82
+ requirements: Requirements to merge.
83
+ """
84
+ for req in requirements:
85
+ if req not in packages:
86
+ packages.append(req)
87
+
88
+
89
+ def _merge_custom_requirements(
90
+ packages: list[str],
91
+ custom_tools_config: PTCCustomToolConfig | None,
92
+ ) -> None:
93
+ """Merge custom tool requirements into packages list.
94
+
95
+ Args:
96
+ packages: Target list to merge into (modified in place).
97
+ custom_tools_config: Custom tools configuration.
98
+ """
99
+ if not _has_custom_tools(custom_tools_config):
100
+ return
101
+
102
+ assert custom_tools_config is not None
103
+ if custom_tools_config.requirements:
104
+ _merge_requirements(packages, custom_tools_config.requirements)
105
+
106
+
107
+ def _packages_for_default_template(
108
+ custom_tools_config: PTCCustomToolConfig | None,
109
+ user_packages: list[str] | None,
110
+ ) -> list[str] | None:
111
+ """Build package list when using the default template.
112
+
113
+ Args:
114
+ custom_tools_config: Custom tools configuration.
115
+ user_packages: Explicitly provided packages by user (None if not set).
116
+
117
+ Returns:
118
+ List of packages to install, or None to skip installation.
119
+ """
120
+ packages = list(user_packages) if user_packages is not None else []
121
+ _merge_custom_requirements(packages, custom_tools_config)
122
+ return packages if packages else None
123
+
124
+
125
+ def _packages_for_other_templates(
126
+ *,
127
+ mcp_client: BaseMCPClient | None,
128
+ custom_tools_config: PTCCustomToolConfig | None,
129
+ user_packages: list[str] | None,
130
+ ) -> list[str] | None:
131
+ """Build package list when using a non-default template.
132
+
133
+ Args:
134
+ mcp_client: The MCP client (check if has servers for MCP tools).
135
+ custom_tools_config: Custom tools configuration.
136
+ user_packages: Explicitly provided packages by user (None if not set).
137
+
138
+ Returns:
139
+ List of packages to install, or None to skip installation.
140
+ """
141
+ packages = list(user_packages) if user_packages is not None else []
142
+ base_packages = _build_base_packages(mcp_client=mcp_client, custom_tools_config=custom_tools_config)
143
+ _merge_requirements(packages, base_packages)
144
+ _merge_custom_requirements(packages, custom_tools_config)
145
+ return packages if packages else None
146
+
147
+
148
+ def _build_base_packages(
149
+ *,
150
+ mcp_client: BaseMCPClient | None,
151
+ custom_tools_config: PTCCustomToolConfig | None,
152
+ ) -> list[str]:
153
+ """Build base package list based on tool types.
154
+
155
+ Args:
156
+ mcp_client: The MCP client (check if has servers for MCP tools).
157
+ custom_tools_config: Custom tools configuration.
158
+
159
+ Returns:
160
+ List of base packages needed for the tool types present.
161
+ """
162
+ packages: list[str] = []
163
+
164
+ if _has_mcp_tools(mcp_client):
165
+ packages.extend(["mcp", "httpx"])
166
+
167
+ if _has_custom_tools(custom_tools_config):
168
+ packages.append("langchain")
169
+
170
+ if _has_native_aip_tools(custom_tools_config):
171
+ if AIP_AGENTS_BINARY_LOCAL not in packages:
172
+ packages.append(AIP_AGENTS_BINARY_LOCAL)
173
+
174
+ return packages
175
+
176
+
177
+ def select_sandbox_packages(
178
+ *,
179
+ mcp_client: BaseMCPClient | None,
180
+ custom_tools_config: PTCCustomToolConfig | None,
181
+ template: str | None,
182
+ user_packages: list[str] | None = None,
183
+ # Backward compatibility: accept old parameter name
184
+ user_ptc_packages: list[str] | None = None,
185
+ ) -> list[str] | None:
186
+ """Select minimal packages to install in sandbox based on tool types.
187
+
188
+ This function implements the smart package selection logic:
189
+ - DEFAULT_SANDBOX_TEMPLATE + no user packages: Skip install (template has all deps)
190
+ - DEFAULT_SANDBOX_TEMPLATE + user packages: User packages + PTCCustomToolConfig.requirements
191
+ - Other template + no user packages: Build packages from tool types
192
+ - Other template + user packages: User packages + tool-type packages + PTCCustomToolConfig.requirements
193
+
194
+ Key principle: Tools won't work without their required packages. Always ensure:
195
+ - MCP tools → mcp + httpx installed
196
+ - Custom LangChain tools → langchain installed
197
+ - Native AIP tools → aip-agents-binary[local] installed
198
+
199
+ Args:
200
+ mcp_client: The MCP client (check if has servers for MCP tools).
201
+ custom_tools_config: Custom tools configuration (includes tools list and .requirements field).
202
+ template: Sandbox template being used.
203
+ user_packages: Explicitly provided packages by user (None if not set).
204
+ user_ptc_packages: Deprecated. Use user_packages instead.
205
+
206
+ Returns:
207
+ List of packages to install, or None to skip installation.
208
+ """
209
+ # Handle backward compatibility
210
+ if user_ptc_packages is not None and user_packages is None:
211
+ user_packages = user_ptc_packages
212
+
213
+ if template == DEFAULT_SANDBOX_TEMPLATE:
214
+ return _packages_for_default_template(custom_tools_config, user_packages)
215
+
216
+ return _packages_for_other_templates(
217
+ mcp_client=mcp_client,
218
+ custom_tools_config=custom_tools_config,
219
+ user_packages=user_packages,
220
+ )
@@ -0,0 +1,120 @@
1
+ FROM python:3.12
2
+
3
+ USER root
4
+ WORKDIR /root
5
+
6
+ ENV JUPYTER_CONFIG_PATH=/root/.jupyter \
7
+ IPYTHON_CONFIG_PATH=/root/.ipython \
8
+ SERVER_PATH=/root/.server \
9
+ JAVA_VERSION=11 \
10
+ JAVA_HOME=/usr/lib/jvm/jdk-${JAVA_VERSION} \
11
+ IJAVA_VERSION=1.3.0 \
12
+ DENO_INSTALL=/opt/deno \
13
+ DENO_VERSION=v2.4.0 \
14
+ R_VERSION=4.5.* \
15
+ BUN_VERSION=1.1.38
16
+
17
+ RUN : "1) Install base OS deps + signed NodeSource repo + nodejs" && \
18
+ apt-get update && \
19
+ DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes \
20
+ apt-get install -y --no-install-recommends \
21
+ build-essential \
22
+ ca-certificates \
23
+ curl \
24
+ fonts-noto-cjk \
25
+ git \
26
+ gnupg \
27
+ jq \
28
+ ripgrep \
29
+ sudo \
30
+ util-linux && \
31
+ mkdir -p /etc/apt/keyrings && \
32
+ curl --proto '=https' --tlsv1.2 -fsSL \
33
+ -o /etc/apt/keyrings/nodesource.asc \
34
+ https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key && \
35
+ gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg /etc/apt/keyrings/nodesource.asc && \
36
+ chmod 644 /etc/apt/keyrings/nodesource.gpg && \
37
+ rm -f /etc/apt/keyrings/nodesource.asc && \
38
+ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" > /etc/apt/sources.list.d/nodesource.list && \
39
+ apt-get update && \
40
+ DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes \
41
+ apt-get install -y --no-install-recommends nodejs && \
42
+ rm -rf /var/lib/apt/lists/* && \
43
+ : "" && \
44
+ : "2) Bootstrap code-interpreter template files" && \
45
+ git clone --depth 1 --branch "@e2b/code-interpreter-template@0.2.1" \
46
+ https://github.com/e2b-dev/code-interpreter /tmp/code-interpreter-template && \
47
+ cp /tmp/code-interpreter-template/template/requirements.txt /root/requirements.txt && \
48
+ cp -r /tmp/code-interpreter-template/template/server /root/.server && \
49
+ mkdir -p /root/.config/matplotlib /root/.jupyter /root/.ipython/profile_default/startup && \
50
+ cp /tmp/code-interpreter-template/template/matplotlibrc /root/.config/matplotlib/.matplotlibrc && \
51
+ cp /tmp/code-interpreter-template/template/start-up.sh /root/.jupyter/start-up.sh && \
52
+ cp /tmp/code-interpreter-template/template/jupyter_server_config.py /root/.jupyter/ && \
53
+ cp /tmp/code-interpreter-template/template/ipython_kernel_config.py /root/.ipython/profile_default/ && \
54
+ cp -r /tmp/code-interpreter-template/template/startup_scripts /root/.ipython/profile_default/startup && \
55
+ rm -rf /tmp/code-interpreter-template && \
56
+ : "" && \
57
+ : "3) Install Python/Node runtimes and patch server timeout" && \
58
+ pip install --no-cache-dir -r requirements.txt && \
59
+ pip install --no-cache-dir "aip-agents-binary[local]" httpx mcp && \
60
+ pip install --no-cache-dir bash_kernel && \
61
+ ipython kernel install --name "python3" --user && \
62
+ python -m bash_kernel.install --user && \
63
+ # Pinned to latest commit as of 2026-05-20 (no semver tags exist in this repo).
64
+ # Commit hash avoids SonarCloud SCA "unresolved dependency version" warning.
65
+ npm install -g --ignore-scripts git+https://github.com/e2b-dev/ijavascript.git#79cb7d56dcfe0df9ff55eff0ca4dc920a6dcc361 && \
66
+ npm rebuild -g && \
67
+ ijsinstall --install=global && \
68
+ sed -i \
69
+ "s/client = httpx.AsyncClient()/client = httpx.AsyncClient(timeout=httpx.Timeout(30.0))/" \
70
+ /root/.server/main.py && \
71
+ grep -q \
72
+ "client = httpx.AsyncClient(timeout=httpx.Timeout(30.0))" \
73
+ /root/.server/main.py && \
74
+ python -m venv .server/.venv && \
75
+ .server/.venv/bin/pip install --no-cache-dir -r .server/requirements.txt && \
76
+ chmod +x .jupyter/start-up.sh && \
77
+ : "" && \
78
+ : "4) Install Datasaur runtime dependencies" && \
79
+ apt-get update && \
80
+ apt-get install -y --no-install-recommends unzip && \
81
+ mkdir -p /etc/apt/keyrings && \
82
+ curl --proto '=https' --tlsv1.2 -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
83
+ | gpg --dearmor -o /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
84
+ chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
85
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
86
+ > /etc/apt/sources.list.d/github-cli.list && \
87
+ apt-get update && \
88
+ apt-get install -y --no-install-recommends gh && \
89
+ curl --proto '=https' --tlsv1.2 -fsSL https://bun.sh/install | bash -s -- "bun-v${BUN_VERSION}" && \
90
+ export BUN_INSTALL=/root/.bun && \
91
+ export PATH="$BUN_INSTALL/bin:$PATH" && \
92
+ npm install -g @playwright/cli@1.50.0 --ignore-scripts && \
93
+ playwright-cli install --skills && \
94
+ npx -y playwright install chrome && \
95
+ command -v gh && \
96
+ command -v node && \
97
+ command -v npm && \
98
+ command -v bun && \
99
+ command -v playwright-cli && \
100
+ gh --version && \
101
+ node --version && \
102
+ npm --version && \
103
+ bun --version && \
104
+ playwright-cli --version && \
105
+ rm -rf /var/lib/apt/lists/* && \
106
+ : "" && \
107
+ : "5) Create runtime user and sudo policy" && \
108
+ (id -u user >/dev/null 2>&1 || useradd -m user) && \
109
+ mkdir -p /home/user && \
110
+ chown -R user:user /home/user && \
111
+ (grep -q "^user ALL=(ALL) NOPASSWD: ALL$" /etc/sudoers || \
112
+ echo "user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers)
113
+
114
+ ENV BUN_INSTALL=/root/.bun
115
+ ENV PATH="$BUN_INSTALL/bin:$PATH"
116
+
117
+ USER user
118
+ WORKDIR /home/user
119
+
120
+ ENTRYPOINT ["sudo", "/root/.jupyter/start-up.sh"]
@@ -0,0 +1,100 @@
1
+ FROM python:3.12
2
+
3
+ USER root
4
+ WORKDIR /root
5
+
6
+ ENV JUPYTER_CONFIG_PATH=/root/.jupyter \
7
+ IPYTHON_CONFIG_PATH=/root/.ipython \
8
+ SERVER_PATH=/root/.server
9
+
10
+ RUN : "1) Install base OS deps + signed NodeSource repo + nodejs" && \
11
+ apt-get update && \
12
+ DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes \
13
+ apt-get install -y --no-install-recommends \
14
+ build-essential \
15
+ ca-certificates \
16
+ curl \
17
+ fonts-noto-cjk \
18
+ git \
19
+ gnupg \
20
+ jq \
21
+ libcairo2-dev \
22
+ libgirepository1.0-dev \
23
+ pkg-config \
24
+ python3-dev \
25
+ ripgrep \
26
+ sudo \
27
+ util-linux && \
28
+ mkdir -p /etc/apt/keyrings && \
29
+ curl --proto '=https' --tlsv1.2 -fsSL \
30
+ -o /etc/apt/keyrings/nodesource.asc \
31
+ https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key && \
32
+ gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg /etc/apt/keyrings/nodesource.asc && \
33
+ chmod 644 /etc/apt/keyrings/nodesource.gpg && \
34
+ rm -f /etc/apt/keyrings/nodesource.asc && \
35
+ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" > /etc/apt/sources.list.d/nodesource.list && \
36
+ apt-get update && \
37
+ DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes \
38
+ apt-get install -y --no-install-recommends nodejs && \
39
+ rm -rf /var/lib/apt/lists/* && \
40
+ : "" && \
41
+ : "2) Bootstrap code-interpreter template files" && \
42
+ git clone --depth 1 --branch "@e2b/code-interpreter-template@0.2.1" \
43
+ https://github.com/e2b-dev/code-interpreter /tmp/code-interpreter-template && \
44
+ cp /tmp/code-interpreter-template/template/requirements.txt /root/requirements.txt && \
45
+ cp -r /tmp/code-interpreter-template/template/server /root/.server && \
46
+ mkdir -p /root/.config/matplotlib /root/.jupyter /root/.ipython/profile_default/startup && \
47
+ cp /tmp/code-interpreter-template/template/matplotlibrc /root/.config/matplotlib/.matplotlibrc && \
48
+ cp /tmp/code-interpreter-template/template/start-up.sh /root/.jupyter/start-up.sh && \
49
+ cp /tmp/code-interpreter-template/template/jupyter_server_config.py /root/.jupyter/ && \
50
+ cp /tmp/code-interpreter-template/template/ipython_kernel_config.py /root/.ipython/profile_default/ && \
51
+ cp -r /tmp/code-interpreter-template/template/startup_scripts /root/.ipython/profile_default/startup && \
52
+ rm -rf /tmp/code-interpreter-template && \
53
+ : "" && \
54
+ : "3) Install Python/Node runtimes and patch server timeout" && \
55
+ PIP_INDEX_URL=https://download.pytorch.org/whl/cpu \
56
+ PIP_EXTRA_INDEX_URL=https://pypi.org/simple \
57
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: "torch==2.5.1+cpu" && \
58
+ echo "torch==2.5.1+cpu" > /tmp/constraints.txt && \
59
+ PIP_INDEX_URL=https://download.pytorch.org/whl/cpu \
60
+ PIP_EXTRA_INDEX_URL=https://pypi.org/simple \
61
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: -c /tmp/constraints.txt -r requirements.txt && \
62
+ PIP_INDEX_URL=https://download.pytorch.org/whl/cpu \
63
+ PIP_EXTRA_INDEX_URL=https://pypi.org/simple \
64
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: \
65
+ "aip-agents-binary[local]~=0.6.62" \
66
+ "httpx==0.28.1" \
67
+ "mcp==1.25.0" && \
68
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: "bash_kernel==0.10.0" && \
69
+ ipython kernel install --name "python3" --user && \
70
+ python -m bash_kernel.install --user && \
71
+ # Pinned to latest commit as of 2026-05-20 (no semver tags exist in this repo).
72
+ # Commit hash avoids SonarCloud SCA "unresolved dependency version" warning.
73
+ npm install -g --ignore-scripts git+https://github.com/e2b-dev/ijavascript.git#79cb7d56dcfe0df9ff55eff0ca4dc920a6dcc361 && \
74
+ npm rebuild -g && \
75
+ ijsinstall --install=global && \
76
+ sed -i \
77
+ "s/client = httpx.AsyncClient()/client = httpx.AsyncClient(timeout=httpx.Timeout(30.0))/" \
78
+ /root/.server/main.py && \
79
+ grep -q \
80
+ "client = httpx.AsyncClient(timeout=httpx.Timeout(30.0))" \
81
+ /root/.server/main.py && \
82
+ python -m venv .server/.venv && \
83
+ # Do NOT add --only-binary :all: here. The server's requirements.txt may include
84
+ # packages that require compilation (e.g. C extensions). --only-binary silently
85
+ # skips them, leaving the venv incomplete. uvicorn then fails to start on port
86
+ # 49999 at sandbox boot, causing the "port not open" error in E2B sandboxes.
87
+ .server/.venv/bin/pip install --no-cache-dir -r .server/requirements.txt && \
88
+ chmod +x .jupyter/start-up.sh && \
89
+ : "" && \
90
+ : "4) Create runtime user and sudo policy" && \
91
+ (id -u user >/dev/null 2>&1 || useradd -m user) && \
92
+ mkdir -p /home/user && \
93
+ chown -R user:user /home/user && \
94
+ (grep -q "^user ALL=(ALL) NOPASSWD: ALL$" /etc/sudoers || \
95
+ echo "user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers)
96
+
97
+ USER user
98
+ WORKDIR /home/user
99
+
100
+ ENTRYPOINT ["sudo", "/root/.jupyter/start-up.sh"]
@@ -0,0 +1,143 @@
1
+ FROM python:3.12
2
+
3
+ USER root
4
+ WORKDIR /root
5
+
6
+ ENV JUPYTER_CONFIG_PATH=/root/.jupyter \
7
+ IPYTHON_CONFIG_PATH=/root/.ipython \
8
+ SERVER_PATH=/root/.server \
9
+ BUN_VERSION=1.1.38
10
+
11
+ RUN : "1) Install base OS deps + signed NodeSource repo + nodejs" && \
12
+ apt-get update && \
13
+ DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes \
14
+ apt-get install -y --no-install-recommends \
15
+ build-essential \
16
+ ca-certificates \
17
+ curl \
18
+ fonts-noto-cjk \
19
+ git \
20
+ gnupg \
21
+ jq \
22
+ libcairo2-dev \
23
+ libgirepository1.0-dev \
24
+ pkg-config \
25
+ python3-dev \
26
+ ripgrep \
27
+ sudo \
28
+ util-linux && \
29
+ mkdir -p /etc/apt/keyrings && \
30
+ curl --proto '=https' --tlsv1.2 -fsSL \
31
+ -o /etc/apt/keyrings/nodesource.asc \
32
+ https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key && \
33
+ gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg /etc/apt/keyrings/nodesource.asc && \
34
+ chmod 644 /etc/apt/keyrings/nodesource.gpg && \
35
+ rm -f /etc/apt/keyrings/nodesource.asc && \
36
+ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" > /etc/apt/sources.list.d/nodesource.list && \
37
+ apt-get update && \
38
+ DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes \
39
+ apt-get install -y --no-install-recommends nodejs && \
40
+ rm -rf /var/lib/apt/lists/* && \
41
+ : "" && \
42
+ : "2) Bootstrap code-interpreter template files" && \
43
+ git clone --depth 1 --branch "@e2b/code-interpreter-template@0.2.1" \
44
+ https://github.com/e2b-dev/code-interpreter /tmp/code-interpreter-template && \
45
+ cp /tmp/code-interpreter-template/template/requirements.txt /root/requirements.txt && \
46
+ cp -r /tmp/code-interpreter-template/template/server /root/.server && \
47
+ mkdir -p /root/.config/matplotlib /root/.jupyter /root/.ipython/profile_default/startup && \
48
+ cp /tmp/code-interpreter-template/template/matplotlibrc /root/.config/matplotlib/.matplotlibrc && \
49
+ cp /tmp/code-interpreter-template/template/start-up.sh /root/.jupyter/start-up.sh && \
50
+ cp /tmp/code-interpreter-template/template/jupyter_server_config.py /root/.jupyter/ && \
51
+ cp /tmp/code-interpreter-template/template/ipython_kernel_config.py /root/.ipython/profile_default/ && \
52
+ cp -r /tmp/code-interpreter-template/template/startup_scripts /root/.ipython/profile_default/startup && \
53
+ rm -rf /tmp/code-interpreter-template && \
54
+ : "" && \
55
+ : "3) Install Python/Node runtimes and patch server timeout" && \
56
+ PIP_INDEX_URL=https://download.pytorch.org/whl/cpu \
57
+ PIP_EXTRA_INDEX_URL=https://pypi.org/simple \
58
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: "torch==2.5.1+cpu" && \
59
+ echo "torch==2.5.1+cpu" > /tmp/constraints.txt && \
60
+ PIP_INDEX_URL=https://download.pytorch.org/whl/cpu \
61
+ PIP_EXTRA_INDEX_URL=https://pypi.org/simple \
62
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: -c /tmp/constraints.txt -r requirements.txt && \
63
+ PIP_INDEX_URL=https://download.pytorch.org/whl/cpu \
64
+ PIP_EXTRA_INDEX_URL=https://pypi.org/simple \
65
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: \
66
+ "aip-agents-binary[local]~=0.6.62" \
67
+ "boto3==1.43.6" \
68
+ "httpx==0.28.1" \
69
+ "mcp==1.25.0" && \
70
+ TMPDIR=/var/tmp pip install --no-cache-dir --only-binary :all: "bash_kernel==0.10.0" && \
71
+ ipython kernel install --name "python3" --user && \
72
+ python -m bash_kernel.install --user && \
73
+ # Pinned to latest commit as of 2026-05-20 (no semver tags exist in this repo).
74
+ # Commit hash avoids SonarCloud SCA "unresolved dependency version" warning.
75
+ npm install -g --ignore-scripts git+https://github.com/e2b-dev/ijavascript.git#79cb7d56dcfe0df9ff55eff0ca4dc920a6dcc361 && \
76
+ npm rebuild -g && \
77
+ ijsinstall --install=global && \
78
+ sed -i \
79
+ "s/client = httpx.AsyncClient()/client = httpx.AsyncClient(timeout=httpx.Timeout(30.0))/" \
80
+ /root/.server/main.py && \
81
+ grep -q \
82
+ "client = httpx.AsyncClient(timeout=httpx.Timeout(30.0))" \
83
+ /root/.server/main.py && \
84
+ python -m venv .server/.venv && \
85
+ # Do NOT add --only-binary :all: here. The server's requirements.txt may include
86
+ # packages that require compilation (e.g. C extensions). --only-binary silently
87
+ # skips them, leaving the venv incomplete. uvicorn then fails to start on port
88
+ # 49999 at sandbox boot, causing the "port not open" error in E2B sandboxes.
89
+ .server/.venv/bin/pip install --no-cache-dir -r .server/requirements.txt && \
90
+ chmod +x .jupyter/start-up.sh && \
91
+ : "" && \
92
+ : "4) Install Datasaur runtime dependencies" && \
93
+ apt-get update && \
94
+ apt-get install -y --no-install-recommends unzip && \
95
+ mkdir -p /etc/apt/keyrings && \
96
+ curl --proto '=https' --tlsv1.2 -fsSL \
97
+ -o /tmp/githubcli-archive-keyring.gpg \
98
+ https://cli.github.com/packages/githubcli-archive-keyring.gpg && \
99
+ gpg --dearmor -o /etc/apt/keyrings/githubcli-archive-keyring.gpg \
100
+ /tmp/githubcli-archive-keyring.gpg && \
101
+ rm -f /tmp/githubcli-archive-keyring.gpg && \
102
+ chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
103
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
104
+ > /etc/apt/sources.list.d/github-cli.list && \
105
+ apt-get update && \
106
+ apt-get install -y --no-install-recommends gh && \
107
+ curl --proto '=https' --tlsv1.2 -fsSL \
108
+ -o /tmp/bun-install.sh \
109
+ https://bun.sh/install && \
110
+ echo "bab8acfb046aac8c72407bdcce903957665d655d7acaa3e11c7c4616beae68dd /tmp/bun-install.sh" | sha256sum -c - && \
111
+ bash /tmp/bun-install.sh -- "bun-v${BUN_VERSION}" && \
112
+ rm -f /tmp/bun-install.sh && \
113
+ export BUN_INSTALL=/root/.bun && \
114
+ export PATH="$BUN_INSTALL/bin:$PATH" && \
115
+ npm install -g @playwright/cli@0.1.11 --ignore-scripts && \
116
+ playwright-cli install --skills && \
117
+ npx --ignore-scripts -y playwright install chrome && \
118
+ command -v gh && \
119
+ command -v node && \
120
+ command -v npm && \
121
+ command -v bun && \
122
+ command -v playwright-cli && \
123
+ gh --version && \
124
+ node --version && \
125
+ npm --version && \
126
+ bun --version && \
127
+ playwright-cli --version && \
128
+ rm -rf /var/lib/apt/lists/* && \
129
+ : "" && \
130
+ : "5) Create runtime user and sudo policy" && \
131
+ (id -u user >/dev/null 2>&1 || useradd -m user) && \
132
+ mkdir -p /home/user && \
133
+ chown -R user:user /home/user && \
134
+ (grep -q "^user ALL=(ALL) NOPASSWD: ALL$" /etc/sudoers || \
135
+ echo "user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers)
136
+
137
+ ENV BUN_INSTALL=/root/.bun
138
+ ENV PATH="$BUN_INSTALL/bin:$PATH"
139
+
140
+ USER user
141
+ WORKDIR /home/user
142
+
143
+ ENTRYPOINT ["sudo", "/root/.jupyter/start-up.sh"]