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.
- aip_agents/__init__.py +66 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/base_executor.py +1125 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2ui/__init__.py +26 -0
- aip_agents/a2ui/catalog_provider.py +109 -0
- aip_agents/a2ui/examples/0.8/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.8/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.8/single_column_list.json +1 -0
- aip_agents/a2ui/examples/0.9/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.9/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.9/single_column_list.json +1 -0
- aip_agents/a2ui/middleware.py +754 -0
- aip_agents/a2ui/models.py +153 -0
- aip_agents/a2ui/public_url.py +138 -0
- aip_agents/a2ui/stream_filter.py +67 -0
- aip_agents/agent/__init__.py +72 -0
- aip_agents/agent/base_agent.py +1437 -0
- aip_agents/agent/base_langgraph_agent.py +4048 -0
- aip_agents/agent/google_adk_agent.py +932 -0
- aip_agents/agent/google_adk_constants.py +11 -0
- aip_agents/agent/graph_runtime.py +185 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langgraph_react_agent.py +3741 -0
- aip_agents/agent/model_invocation_adapter.py +346 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/tool_execution_engine.py +587 -0
- aip_agents/audio_interface/__init__.py +30 -0
- aip_agents/audio_interface/audio_agent_adapter.py +254 -0
- aip_agents/audio_interface/config.py +146 -0
- aip_agents/audio_interface/errors.py +15 -0
- aip_agents/audio_interface/livekit_audio_session.py +504 -0
- aip_agents/audio_interface/livekit_realtime_audio_session.py +142 -0
- aip_agents/audio_interface/session_factory.py +40 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/common/__init__.py +5 -0
- aip_agents/common/callable_introspection.py +17 -0
- aip_agents/constants.py +23 -0
- aip_agents/context/__init__.py +5 -0
- aip_agents/context/budget.py +237 -0
- aip_agents/context/compaction.py +339 -0
- aip_agents/context/metadata.py +169 -0
- aip_agents/context/offload.py +449 -0
- aip_agents/context/preparation.py +196 -0
- aip_agents/context/prompt.py +61 -0
- aip_agents/context/runtime.py +149 -0
- aip_agents/context/session_recall.py +69 -0
- aip_agents/context/state.py +48 -0
- aip_agents/context/utils.py +44 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/audio_livekit_session.py +116 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_server.py +141 -0
- aip_agents/examples/gl_connectors_smoke.py +148 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +104 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +77 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +80 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +91 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +83 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +131 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +250 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_filesystem.py +162 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_skills.py +62 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_client.py +57 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_server.py +131 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc_custom_tools.py +83 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +100 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_server.py +113 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_server.py +125 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +246 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +87 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/multiply_tool.py +43 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/integration/__init__.py +43 -0
- aip_agents/integration/agent.py +58 -0
- aip_agents/integration/guardrails.py +52 -0
- aip_agents/integration/hitl.py +71 -0
- aip_agents/integration/ptc.py +95 -0
- aip_agents/integration/skills.py +37 -0
- aip_agents/integration/storage.py +81 -0
- aip_agents/integration/version.py +103 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/client/__init__.py +60 -0
- aip_agents/mcp/client/base_mcp_client.py +377 -0
- aip_agents/mcp/client/connection_manager.py +231 -0
- aip_agents/mcp/client/errors.py +119 -0
- aip_agents/mcp/client/google_adk/__init__.py +45 -0
- aip_agents/mcp/client/google_adk/client.py +383 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/persistent_session.py +704 -0
- aip_agents/mcp/client/session_pool.py +358 -0
- aip_agents/mcp/client/transports.py +288 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/base_adapter.py +815 -0
- aip_agents/memory/adapters/mem0.py +286 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/middleware/__init__.py +65 -0
- aip_agents/middleware/backends/__init__.py +72 -0
- aip_agents/middleware/backends/in_memory.py +578 -0
- aip_agents/middleware/backends/local_disk.py +1203 -0
- aip_agents/middleware/backends/protocol.py +353 -0
- aip_agents/middleware/backends/sandbox.py +1431 -0
- aip_agents/middleware/backends/sandbox_files.py +113 -0
- aip_agents/middleware/backends/utils.py +293 -0
- aip_agents/middleware/base.py +239 -0
- aip_agents/middleware/filesystem.py +690 -0
- aip_agents/middleware/manager.py +291 -0
- aip_agents/middleware/memory.py +532 -0
- aip_agents/middleware/pii_middleware.py +192 -0
- aip_agents/middleware/schema.py +19 -0
- aip_agents/middleware/skills.py +872 -0
- aip_agents/middleware/task_delegation.py +1656 -0
- aip_agents/middleware/todolist.py +276 -0
- aip_agents/middleware/tools/__init__.py +23 -0
- aip_agents/middleware/tools/edit_file.py +70 -0
- aip_agents/middleware/tools/execute.py +428 -0
- aip_agents/middleware/tools/grep_file.py +79 -0
- aip_agents/middleware/tools/ls.py +71 -0
- aip_agents/middleware/tools/read_file.py +239 -0
- aip_agents/middleware/tools/skill_load.py +193 -0
- aip_agents/middleware/tools/skill_resource.py +338 -0
- aip_agents/middleware/tools/write_file.py +114 -0
- aip_agents/middleware/vision.py +322 -0
- aip_agents/ptc/__init__.py +87 -0
- aip_agents/ptc/custom_tools.py +511 -0
- aip_agents/ptc/custom_tools_payload.py +499 -0
- aip_agents/ptc/custom_tools_templates/__init__.py +1 -0
- aip_agents/ptc/custom_tools_templates/custom_build_function.py.template +24 -0
- aip_agents/ptc/custom_tools_templates/custom_init.py.template +26 -0
- aip_agents/ptc/custom_tools_templates/custom_invoke.py.template +149 -0
- aip_agents/ptc/custom_tools_templates/custom_registry.py.template +112 -0
- aip_agents/ptc/custom_tools_templates/custom_sources_init.py.template +7 -0
- aip_agents/ptc/custom_tools_templates/custom_wrapper.py.template +87 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/exceptions.py +57 -0
- aip_agents/ptc/executor.py +627 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +679 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +240 -0
- aip_agents/ptc/naming.py +430 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/prompt_builder.py +674 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/sandbox_bridge.py +297 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/ptc/tool_def_helpers.py +101 -0
- aip_agents/ptc/tool_enrichment.py +163 -0
- aip_agents/resilience/__init__.py +10 -0
- aip_agents/resilience/base.py +46 -0
- aip_agents/resilience/tool.py +1661 -0
- aip_agents/sandbox/__init__.py +62 -0
- aip_agents/sandbox/defaults.py +220 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1-datasaur.Dockerfile +120 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1.Dockerfile +100 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2-datasaur.Dockerfile +143 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2.Dockerfile +119 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3-datasaur.Dockerfile +173 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3.Dockerfile +130 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.Dockerfile +164 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.patch_js_context.py +41 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.requirements.txt +29 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2.Dockerfile +87 -0
- aip_agents/sandbox/e2b_runtime.py +27 -0
- aip_agents/sandbox/image_registry.py +98 -0
- aip_agents/sandbox/providers/__init__.py +76 -0
- aip_agents/sandbox/providers/base.py +392 -0
- aip_agents/sandbox/providers/bedrock.py +28 -0
- aip_agents/sandbox/providers/e2b.py +230 -0
- aip_agents/sandbox/providers/opensandbox.py +163 -0
- aip_agents/sandbox/sandbox_runtime.py +967 -0
- aip_agents/sandbox/template_builder.py +240 -0
- aip_agents/sandbox/types.py +141 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/schema/__init__.py +106 -0
- aip_agents/schema/a2a.py +58 -0
- aip_agents/schema/agent.py +117 -0
- aip_agents/schema/artifacts.py +75 -0
- aip_agents/schema/attachments.py +425 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/langgraph.py +47 -0
- aip_agents/schema/model_id.py +103 -0
- aip_agents/schema/model_usage.py +50 -0
- aip_agents/schema/runtime_metadata.py +78 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/tool_payloads.py +68 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/sentry.py +267 -0
- aip_agents/skills/__init__.py +30 -0
- aip_agents/skills/errors.py +110 -0
- aip_agents/skills/installer.py +479 -0
- aip_agents/skills/models.py +769 -0
- aip_agents/skills/stager.py +224 -0
- aip_agents/skills/validation.py +53 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/tools/__init__.py +65 -0
- aip_agents/tools/agent_schedule_tool.py +392 -0
- aip_agents/tools/browser_use/__init__.py +83 -0
- aip_agents/tools/browser_use/action_parser.py +104 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1118 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/minio_storage.py +203 -0
- aip_agents/tools/browser_use/schemas.py +121 -0
- aip_agents/tools/browser_use/session.py +13 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/steel_session_recording.py +321 -0
- aip_agents/tools/browser_use/streaming.py +263 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/types.py +37 -0
- aip_agents/tools/code_sandbox/__init__.py +48 -0
- aip_agents/tools/code_sandbox/code_sandbox_tool.py +350 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +346 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +65 -0
- aip_agents/tools/computer_use/__init__.py +75 -0
- aip_agents/tools/computer_use/computer_use_tool.py +910 -0
- aip_agents/tools/computer_use/schemas.py +78 -0
- aip_agents/tools/computer_use/streaming.py +198 -0
- aip_agents/tools/computer_use/types.py +32 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/execute_ptc_code.py +582 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/tool.py +518 -0
- aip_agents/tools/gl_connector_tools.py +170 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/base.py +213 -0
- aip_agents/tools/memory_search/mem0.py +424 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/streaming_common.py +577 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/types/__init__.py +73 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/utils/__init__.py +91 -0
- aip_agents/utils/a2a_connector.py +1758 -0
- aip_agents/utils/artifact_helpers.py +542 -0
- aip_agents/utils/artifacts/__init__.py +20 -0
- aip_agents/utils/artifacts/tracker.py +367 -0
- aip_agents/utils/attachment_helpers.py +178 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/file_prompt_utils.py +276 -0
- aip_agents/utils/file_watchers/__init__.py +33 -0
- aip_agents/utils/file_watchers/base.py +46 -0
- aip_agents/utils/file_watchers/e2b.py +128 -0
- aip_agents/utils/file_watchers/factory.py +39 -0
- aip_agents/utils/file_watchers/ls_diff.py +88 -0
- aip_agents/utils/file_watchers/sandbox.py +66 -0
- aip_agents/utils/file_watchers/watchdog.py +97 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/formatter_llm_client.py +258 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/converter.py +399 -0
- aip_agents/utils/langgraph/delegation_context.py +22 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1329 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +822 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata_helper.py +363 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/pii/__init__.py +29 -0
- aip_agents/utils/pii/pii_handler.py +555 -0
- aip_agents/utils/pii/pii_helper.py +225 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/sse_chunk_transformer.py +836 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/token_usage_helper.py +531 -0
- aip_agents_binary-0.0.0.dist-info/METADATA +825 -0
- aip_agents_binary-0.0.0.dist-info/RECORD +447 -0
- aip_agents_binary-0.0.0.dist-info/WHEEL +5 -0
- 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"]
|