aip-agents-binary 0.5.25b1__py3-none-macosx_13_0_arm64.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 +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +2948 -0
- aip_agents/agent/base_langgraph_agent.pyi +232 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
- aip_agents/agent/langgraph_react_agent.py +2596 -0
- aip_agents/agent/langgraph_react_agent.pyi +131 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/demo_memory_recall.py +401 -0
- aip_agents/examples/demo_memory_recall.pyi +58 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -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_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +46 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -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_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +193 -0
- aip_agents/mcp/client/connection_manager.pyi +48 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +362 -0
- aip_agents/mcp/client/persistent_session.pyi +113 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +228 -0
- aip_agents/mcp/client/transports.pyi +123 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +717 -0
- aip_agents/memory/adapters/base_adapter.pyi +150 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +53 -0
- aip_agents/tools/__init__.pyi +9 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +813 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.py +22 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +258 -0
- aip_agents/tools/memory_search/mem0.pyi +19 -0
- aip_agents/tools/memory_search/schema.py +48 -0
- aip_agents/tools/memory_search/schema.pyi +15 -0
- aip_agents/tools/memory_search_tool.py +26 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +967 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.5.25b1.dist-info/METADATA +681 -0
- aip_agents_binary-0.5.25b1.dist-info/RECORD +566 -0
- aip_agents_binary-0.5.25b1.dist-info/WHEEL +5 -0
- aip_agents_binary-0.5.25b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Shared data structures for the browser-use tool.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class BrowserUseFatalError(RuntimeError):
|
|
14
|
+
"""Raised when the Browser Use session must terminate immediately."""
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class ToolCallInfo:
|
|
19
|
+
"""Structured information for a single tool call."""
|
|
20
|
+
|
|
21
|
+
name: str
|
|
22
|
+
args: dict[str, Any]
|
|
23
|
+
output: str
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class StreamingResponse:
|
|
28
|
+
"""Standardized streaming response structure."""
|
|
29
|
+
|
|
30
|
+
event_type: str
|
|
31
|
+
content: str
|
|
32
|
+
thinking_and_activity_info: dict
|
|
33
|
+
is_final: bool
|
|
34
|
+
tool_info: dict[str, Any] | None = None
|
|
35
|
+
metadata: dict[str, Any] | None = None
|
|
36
|
+
|
|
37
|
+
def to_dict(self) -> dict[str, Any]:
|
|
38
|
+
"""Convert to dictionary format for yielding."""
|
|
39
|
+
return {
|
|
40
|
+
"event_type": self.event_type,
|
|
41
|
+
"content": self.content,
|
|
42
|
+
"thinking_and_activity_info": self.thinking_and_activity_info,
|
|
43
|
+
"tool_info": self.tool_info,
|
|
44
|
+
"is_final": self.is_final,
|
|
45
|
+
"metadata": self.metadata,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass
|
|
50
|
+
class StreamingState:
|
|
51
|
+
"""State management for streaming operations."""
|
|
52
|
+
|
|
53
|
+
debug_url: str
|
|
54
|
+
recording_url: str
|
|
55
|
+
step_count: int = 0
|
|
56
|
+
is_complete: bool = False
|
|
57
|
+
session_id: str | None = None
|
|
58
|
+
terminal_error: str | None = None
|
|
59
|
+
recording_started: bool = False
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class RetryDecision:
|
|
64
|
+
"""Encapsulate retry metadata when Steel sessions need to be restarted."""
|
|
65
|
+
|
|
66
|
+
retries_remaining: int
|
|
67
|
+
attempted_retries: int
|
|
68
|
+
message: str
|
|
69
|
+
delay: float
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
__all__ = [
|
|
73
|
+
"BrowserUseFatalError",
|
|
74
|
+
"RetryDecision",
|
|
75
|
+
"StreamingResponse",
|
|
76
|
+
"StreamingState",
|
|
77
|
+
"ToolCallInfo",
|
|
78
|
+
]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
__all__ = ['BrowserUseFatalError', 'RetryDecision', 'StreamingResponse', 'StreamingState', 'ToolCallInfo']
|
|
5
|
+
|
|
6
|
+
class BrowserUseFatalError(RuntimeError):
|
|
7
|
+
"""Raised when the Browser Use session must terminate immediately."""
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class ToolCallInfo:
|
|
11
|
+
"""Structured information for a single tool call."""
|
|
12
|
+
name: str
|
|
13
|
+
args: dict[str, Any]
|
|
14
|
+
output: str
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class StreamingResponse:
|
|
18
|
+
"""Standardized streaming response structure."""
|
|
19
|
+
event_type: str
|
|
20
|
+
content: str
|
|
21
|
+
thinking_and_activity_info: dict
|
|
22
|
+
is_final: bool
|
|
23
|
+
tool_info: dict[str, Any] | None = ...
|
|
24
|
+
metadata: dict[str, Any] | None = ...
|
|
25
|
+
def to_dict(self) -> dict[str, Any]:
|
|
26
|
+
"""Convert to dictionary format for yielding."""
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class StreamingState:
|
|
30
|
+
"""State management for streaming operations."""
|
|
31
|
+
debug_url: str
|
|
32
|
+
recording_url: str
|
|
33
|
+
step_count: int = ...
|
|
34
|
+
is_complete: bool = ...
|
|
35
|
+
session_id: str | None = ...
|
|
36
|
+
terminal_error: str | None = ...
|
|
37
|
+
recording_started: bool = ...
|
|
38
|
+
|
|
39
|
+
@dataclass
|
|
40
|
+
class RetryDecision:
|
|
41
|
+
"""Encapsulate retry metadata when Steel sessions need to be restarted."""
|
|
42
|
+
retries_remaining: int
|
|
43
|
+
attempted_retries: int
|
|
44
|
+
message: str
|
|
45
|
+
delay: float
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# flake8: noqa: F401
|
|
2
|
+
"""Code Sandbox Tools for AI Agents.
|
|
3
|
+
|
|
4
|
+
This package provides code execution capabilities for AI agents through integration
|
|
5
|
+
with E2B Cloud Sandbox environment.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import warnings
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import e2b
|
|
15
|
+
|
|
16
|
+
from aip_agents.tools.code_sandbox.e2b_sandbox_tool import E2BCodeSandboxTool
|
|
17
|
+
|
|
18
|
+
__all__ = ["E2BCodeSandboxTool"]
|
|
19
|
+
|
|
20
|
+
except ImportError:
|
|
21
|
+
warnings.warn(
|
|
22
|
+
"Code sandbox tools not available. Install with: pip install aip-agents[local]",
|
|
23
|
+
ImportWarning,
|
|
24
|
+
stacklevel=2,
|
|
25
|
+
)
|
|
26
|
+
__all__ = []
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Constants for Code Sandbox tool.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Komang Elang Surya Prawira (komang.e.s.prawira@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# The filename `data.csv` is used as a hard-coded value because we currently lack a mechanism
|
|
8
|
+
# to dynamically determine the actual filename. This static filename is used for saving files
|
|
9
|
+
# inside the sandbox, and any pre-population steps will need to read from this filename.
|
|
10
|
+
# Code interacting with the sandbox can directly access the content of the file using the pre-defined variable,
|
|
11
|
+
# eliminating the need to load the file again. Agents or LLMs do not need to be aware of this filename.
|
|
12
|
+
DATA_FILE_NAME = "data.csv"
|
|
13
|
+
DATA_FILE_PATH = f"/files/{DATA_FILE_NAME}"
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"""Tool for E2B Cloud Sandbox code execution.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
|
+
Komang Elang Surya Prawira (komang.e.s.prawira@gdplabs.id)
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import time
|
|
10
|
+
from http import HTTPStatus
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import requests
|
|
14
|
+
from e2b_code_interpreter import Sandbox
|
|
15
|
+
from gllm_inference.schema import Attachment
|
|
16
|
+
from gllm_tools.code_interpreter.code_sandbox.e2b_sandbox import E2BSandbox
|
|
17
|
+
from gllm_tools.code_interpreter.code_sandbox.models import ExecutionResult, ExecutionStatus
|
|
18
|
+
from gllm_tools.code_interpreter.code_sandbox.utils import calculate_duration_ms
|
|
19
|
+
|
|
20
|
+
from aip_agents.tools.code_sandbox.constant import DATA_FILE_PATH
|
|
21
|
+
from aip_agents.utils.logger import get_logger
|
|
22
|
+
|
|
23
|
+
logger = get_logger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SandboxFileWatcher:
|
|
27
|
+
"""File watcher for monitoring file creation in sandbox environments."""
|
|
28
|
+
|
|
29
|
+
def __init__(self, sandbox: Any):
|
|
30
|
+
"""Initialize the file watcher with a sandbox instance.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
sandbox (Any): The sandbox instance to monitor.
|
|
34
|
+
"""
|
|
35
|
+
self.sandbox = sandbox
|
|
36
|
+
self._created_files: list[str] = []
|
|
37
|
+
self._watchers_with_dirs: list[tuple[Any, str]] = []
|
|
38
|
+
|
|
39
|
+
def setup_monitoring(self) -> None:
|
|
40
|
+
"""Set up filesystem watchers for monitoring file creation.
|
|
41
|
+
|
|
42
|
+
Note: /tmp/output is a sandbox-isolated directory, not a shared system /tmp.
|
|
43
|
+
This directory is scoped to the E2B sandbox instance and is safe for use.
|
|
44
|
+
"""
|
|
45
|
+
output_dirs = [
|
|
46
|
+
"/tmp/output", # NOSONAR: python:S5443 - Sandbox-isolated directory, safe for temp outputs
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
self._watchers_with_dirs = []
|
|
50
|
+
|
|
51
|
+
for output_dir in output_dirs:
|
|
52
|
+
try:
|
|
53
|
+
# Create the directory if it doesn't exist
|
|
54
|
+
# NOSONAR: python:S5443 - Sandbox-isolated directory, safe for use
|
|
55
|
+
self.sandbox.files.make_dir(output_dir)
|
|
56
|
+
|
|
57
|
+
# Watch the directory for new files
|
|
58
|
+
watcher = self.sandbox.files.watch_dir(output_dir, recursive=True)
|
|
59
|
+
self._watchers_with_dirs.append((watcher, output_dir))
|
|
60
|
+
|
|
61
|
+
logger.debug(f"Set up file watcher for directory: {output_dir}")
|
|
62
|
+
|
|
63
|
+
except Exception as e:
|
|
64
|
+
logger.debug(f"Could not set up watcher for {output_dir}: {str(e)}")
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
def _process_single_event(self, event: Any, output_dir: str) -> None:
|
|
68
|
+
"""Process a single filesystem event and add created files to the list.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
event: The filesystem event to process.
|
|
72
|
+
output_dir: The directory being watched.
|
|
73
|
+
"""
|
|
74
|
+
if not (hasattr(event, "name") and hasattr(event, "type")):
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
if str(event.type) != "FilesystemEventType.CREATE":
|
|
78
|
+
logger.debug(f"Ignored filesystem event: {event.type} - {event.name}")
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
# Construct full path by combining output_dir with filename
|
|
82
|
+
full_path = f"{output_dir}/{event.name}".replace("//", "/")
|
|
83
|
+
logger.info(f"New file created: {full_path}")
|
|
84
|
+
if full_path not in self._created_files:
|
|
85
|
+
self._created_files.append(full_path)
|
|
86
|
+
|
|
87
|
+
def _process_watcher_events(self, watcher: Any, output_dir: str) -> None:
|
|
88
|
+
"""Process all events from a single watcher.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
watcher: The filesystem watcher instance.
|
|
92
|
+
output_dir: The directory being watched.
|
|
93
|
+
"""
|
|
94
|
+
try:
|
|
95
|
+
events = watcher.get_new_events()
|
|
96
|
+
for event in events:
|
|
97
|
+
logger.debug(f"Event: {event}")
|
|
98
|
+
self._process_single_event(event, output_dir)
|
|
99
|
+
watcher.stop()
|
|
100
|
+
except Exception as e:
|
|
101
|
+
logger.debug(f"Error processing watcher events: {str(e)}")
|
|
102
|
+
|
|
103
|
+
async def process_events(self) -> None:
|
|
104
|
+
"""Process filesystem events from watchers and update created files list."""
|
|
105
|
+
# Poll for file system events (allow time for events to be generated)
|
|
106
|
+
await asyncio.sleep(0.5)
|
|
107
|
+
|
|
108
|
+
for watcher, output_dir in self._watchers_with_dirs:
|
|
109
|
+
self._process_watcher_events(watcher, output_dir)
|
|
110
|
+
|
|
111
|
+
def reset_created_files(self) -> None:
|
|
112
|
+
"""Reset the list of created files."""
|
|
113
|
+
self._created_files = []
|
|
114
|
+
|
|
115
|
+
def get_created_files(self) -> list[str]:
|
|
116
|
+
"""Get the list of files created during monitoring.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
list[str]: List of file paths that were created.
|
|
120
|
+
"""
|
|
121
|
+
return self._created_files.copy()
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class MyE2BCloudSandbox(E2BSandbox):
|
|
125
|
+
"""Extended E2B sandbox with filesystem monitoring capabilities.
|
|
126
|
+
|
|
127
|
+
Use `create()` in production to build a fully initialized sandbox wrapper.
|
|
128
|
+
Direct construction is intentionally blocked to prevent partially initialized
|
|
129
|
+
instances that lack the underlying E2B sandbox clients.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
def __init__(self, language: str = "python", *, _unsafe_allow_init: bool = False) -> None:
|
|
133
|
+
"""Initialize the sandbox wrapper.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
language (str): Language to execute inside the sandbox.
|
|
137
|
+
_unsafe_allow_init (bool): Escape hatch for tests/mocks only.
|
|
138
|
+
|
|
139
|
+
Raises:
|
|
140
|
+
RuntimeError: When instantiated directly without `create()`.
|
|
141
|
+
"""
|
|
142
|
+
if not _unsafe_allow_init:
|
|
143
|
+
raise RuntimeError("Use MyE2BCloudSandbox.create(...) to initialize a sandbox instance.")
|
|
144
|
+
super().__init__(language=language)
|
|
145
|
+
self.file_watcher: SandboxFileWatcher | None = None
|
|
146
|
+
|
|
147
|
+
@classmethod
|
|
148
|
+
async def create(
|
|
149
|
+
cls,
|
|
150
|
+
api_key: str,
|
|
151
|
+
domain: str | None = None,
|
|
152
|
+
template: str | None = None,
|
|
153
|
+
language: str = "python",
|
|
154
|
+
additional_packages: list[str] | None = None,
|
|
155
|
+
**kwargs: Any,
|
|
156
|
+
) -> "MyE2BCloudSandbox":
|
|
157
|
+
"""Create a fully initialized sandbox wrapper.
|
|
158
|
+
|
|
159
|
+
This is the supported construction path for production usage. It wires
|
|
160
|
+
the E2B sandbox instance and its filesystem/command clients, then
|
|
161
|
+
installs language dependencies.
|
|
162
|
+
"""
|
|
163
|
+
sandbox = Sandbox.create(api_key=api_key, domain=domain, template=template, **kwargs)
|
|
164
|
+
|
|
165
|
+
instance = cls(language=language, _unsafe_allow_init=True)
|
|
166
|
+
instance.sandbox = sandbox
|
|
167
|
+
instance.files = sandbox.files
|
|
168
|
+
instance.commands = sandbox.commands
|
|
169
|
+
instance.additional_packages = additional_packages or []
|
|
170
|
+
|
|
171
|
+
instance._install_language_dependencies()
|
|
172
|
+
|
|
173
|
+
return instance
|
|
174
|
+
|
|
175
|
+
async def execute_code(
|
|
176
|
+
self,
|
|
177
|
+
code: str,
|
|
178
|
+
timeout: int = 30,
|
|
179
|
+
files: list[Attachment] | None = None,
|
|
180
|
+
**kwargs: Any,
|
|
181
|
+
) -> ExecutionResult:
|
|
182
|
+
"""Execute code in the E2B Cloud sandbox with filesystem monitoring.
|
|
183
|
+
|
|
184
|
+
This override fixes the Pydantic validation error by ensuring execution.error
|
|
185
|
+
is converted to string. Always enables filesystem monitoring to track
|
|
186
|
+
created files.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
code (str): The code to execute.
|
|
190
|
+
timeout (int, optional): Maximum execution time in seconds. Defaults to 30.
|
|
191
|
+
files (list[Attachment] | None, optional): List of Attachment objects with file details. Defaults to None.
|
|
192
|
+
**kwargs (Any): Additional execution parameters.
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
ExecutionResult: Structured result of the execution.
|
|
196
|
+
|
|
197
|
+
Raises:
|
|
198
|
+
RuntimeError: If sandbox is not initialized.
|
|
199
|
+
"""
|
|
200
|
+
if not self.sandbox or not self.files or not self.commands:
|
|
201
|
+
raise RuntimeError("Sandbox is not initialized")
|
|
202
|
+
|
|
203
|
+
start_time = time.time()
|
|
204
|
+
try:
|
|
205
|
+
# Initialize filesystem monitoring
|
|
206
|
+
self.file_watcher = SandboxFileWatcher(self.sandbox)
|
|
207
|
+
self.file_watcher.reset_created_files()
|
|
208
|
+
self.file_watcher.setup_monitoring()
|
|
209
|
+
|
|
210
|
+
self._upload_files(files)
|
|
211
|
+
# Pre-populate the variable `df` for direct use in the code
|
|
212
|
+
if files:
|
|
213
|
+
logger.info("Pre-populating the variable `df` with the data from the file.")
|
|
214
|
+
self.sandbox.run_code(
|
|
215
|
+
f"import pandas as pd; df = pd.read_csv('{DATA_FILE_PATH}')",
|
|
216
|
+
language=self.language,
|
|
217
|
+
timeout=timeout,
|
|
218
|
+
)
|
|
219
|
+
execution = self.sandbox.run_code(code, language=self.language, timeout=timeout)
|
|
220
|
+
duration_ms = calculate_duration_ms(start_time)
|
|
221
|
+
status = ExecutionStatus.ERROR if execution.error else ExecutionStatus.SUCCESS
|
|
222
|
+
|
|
223
|
+
# Process filesystem events
|
|
224
|
+
if self.file_watcher:
|
|
225
|
+
await self.file_watcher.process_events()
|
|
226
|
+
created_files_count = len(self.file_watcher.get_created_files())
|
|
227
|
+
logger.info(f"File monitoring detected {created_files_count} newly created files")
|
|
228
|
+
|
|
229
|
+
# Fix: Convert execution.error to string
|
|
230
|
+
return ExecutionResult.create(
|
|
231
|
+
status=status,
|
|
232
|
+
code=code,
|
|
233
|
+
stdout=("\n".join(execution.logs.stdout) if execution.logs and execution.logs.stdout else ""),
|
|
234
|
+
stderr=("\n".join(execution.logs.stderr) if execution.logs and execution.logs.stderr else ""),
|
|
235
|
+
error=(str(execution.error) if execution.error else ""), # Convert to string here
|
|
236
|
+
duration_ms=duration_ms,
|
|
237
|
+
)
|
|
238
|
+
except Exception as e:
|
|
239
|
+
logger.warning(f"Error executing code in {self.language} sandbox: {str(e)}")
|
|
240
|
+
return ExecutionResult.create(
|
|
241
|
+
status=ExecutionStatus.ERROR,
|
|
242
|
+
code=code,
|
|
243
|
+
error=str(e),
|
|
244
|
+
duration_ms=calculate_duration_ms(start_time),
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def get_created_files(self) -> list[str]:
|
|
248
|
+
"""Get the list of files created during the last monitored execution.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
list[str]: List of file paths that were created.
|
|
252
|
+
"""
|
|
253
|
+
if self.file_watcher:
|
|
254
|
+
return self.file_watcher.get_created_files()
|
|
255
|
+
return []
|
|
256
|
+
|
|
257
|
+
def download_file(self, file_path: str) -> bytes | None:
|
|
258
|
+
"""Download file content from the sandbox.
|
|
259
|
+
|
|
260
|
+
Uses download_url when available to avoid binary corruption issues.
|
|
261
|
+
Falls back to the filesystem API when download_url fails or is unavailable.
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
file_path (str): Path to the file in the sandbox.
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
bytes | None: File content as bytes, or None if download fails.
|
|
268
|
+
|
|
269
|
+
Raises:
|
|
270
|
+
RuntimeError: If sandbox is not initialized.
|
|
271
|
+
"""
|
|
272
|
+
if not self.sandbox:
|
|
273
|
+
raise RuntimeError("Sandbox is not initialized")
|
|
274
|
+
|
|
275
|
+
try:
|
|
276
|
+
if hasattr(self.sandbox, "download_url"):
|
|
277
|
+
logger.info(f"Downloading {file_path} via download_url method")
|
|
278
|
+
|
|
279
|
+
try:
|
|
280
|
+
url = self.sandbox.download_url(file_path)
|
|
281
|
+
except Exception as e:
|
|
282
|
+
logger.warning(f"Failed to get download URL: {str(e)}")
|
|
283
|
+
else:
|
|
284
|
+
logger.debug(f"Got download URL: {url}")
|
|
285
|
+
|
|
286
|
+
try:
|
|
287
|
+
response = requests.get(url, timeout=30)
|
|
288
|
+
except Exception as e:
|
|
289
|
+
logger.warning(f"URL download failed with error: {str(e)}")
|
|
290
|
+
else:
|
|
291
|
+
if response.status_code == HTTPStatus.OK:
|
|
292
|
+
content = response.content
|
|
293
|
+
logger.info(f"Successfully downloaded {len(content)} bytes via URL")
|
|
294
|
+
return content
|
|
295
|
+
logger.warning(f"URL download failed with status {response.status_code}")
|
|
296
|
+
|
|
297
|
+
if self.files:
|
|
298
|
+
logger.info(f"Downloading {file_path} via filesystem API")
|
|
299
|
+
content = self.files.read(file_path, format="bytes")
|
|
300
|
+
return bytes(content)
|
|
301
|
+
|
|
302
|
+
return None
|
|
303
|
+
|
|
304
|
+
except Exception as e:
|
|
305
|
+
logger.warning(f"Failed to download file {file_path}: {str(e)}")
|
|
306
|
+
return None
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.tools.code_sandbox.constant import DATA_FILE_PATH as DATA_FILE_PATH
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from gllm_inference.schema import Attachment as Attachment
|
|
5
|
+
from gllm_tools.code_interpreter.code_sandbox.e2b_sandbox import E2BSandbox
|
|
6
|
+
from gllm_tools.code_interpreter.code_sandbox.models import ExecutionResult
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
|
|
11
|
+
class SandboxFileWatcher:
|
|
12
|
+
"""File watcher for monitoring file creation in sandbox environments."""
|
|
13
|
+
sandbox: Incomplete
|
|
14
|
+
def __init__(self, sandbox: Any) -> None:
|
|
15
|
+
"""Initialize the file watcher with a sandbox instance.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
sandbox (Any): The sandbox instance to monitor.
|
|
19
|
+
"""
|
|
20
|
+
def setup_monitoring(self) -> None:
|
|
21
|
+
"""Set up filesystem watchers for monitoring file creation.
|
|
22
|
+
|
|
23
|
+
Note: /tmp/output is a sandbox-isolated directory, not a shared system /tmp.
|
|
24
|
+
This directory is scoped to the E2B sandbox instance and is safe for use.
|
|
25
|
+
"""
|
|
26
|
+
async def process_events(self) -> None:
|
|
27
|
+
"""Process filesystem events from watchers and update created files list."""
|
|
28
|
+
def reset_created_files(self) -> None:
|
|
29
|
+
"""Reset the list of created files."""
|
|
30
|
+
def get_created_files(self) -> list[str]:
|
|
31
|
+
"""Get the list of files created during monitoring.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
list[str]: List of file paths that were created.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
class MyE2BCloudSandbox(E2BSandbox):
|
|
38
|
+
"""Extended E2B sandbox with filesystem monitoring capabilities.
|
|
39
|
+
|
|
40
|
+
Use `create()` in production to build a fully initialized sandbox wrapper.
|
|
41
|
+
Direct construction is intentionally blocked to prevent partially initialized
|
|
42
|
+
instances that lack the underlying E2B sandbox clients.
|
|
43
|
+
"""
|
|
44
|
+
file_watcher: SandboxFileWatcher | None
|
|
45
|
+
def __init__(self, language: str = 'python', *, _unsafe_allow_init: bool = False) -> None:
|
|
46
|
+
"""Initialize the sandbox wrapper.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
language (str): Language to execute inside the sandbox.
|
|
50
|
+
_unsafe_allow_init (bool): Escape hatch for tests/mocks only.
|
|
51
|
+
|
|
52
|
+
Raises:
|
|
53
|
+
RuntimeError: When instantiated directly without `create()`.
|
|
54
|
+
"""
|
|
55
|
+
@classmethod
|
|
56
|
+
async def create(cls, api_key: str, domain: str | None = None, template: str | None = None, language: str = 'python', additional_packages: list[str] | None = None, **kwargs: Any) -> MyE2BCloudSandbox:
|
|
57
|
+
"""Create a fully initialized sandbox wrapper.
|
|
58
|
+
|
|
59
|
+
This is the supported construction path for production usage. It wires
|
|
60
|
+
the E2B sandbox instance and its filesystem/command clients, then
|
|
61
|
+
installs language dependencies.
|
|
62
|
+
"""
|
|
63
|
+
async def execute_code(self, code: str, timeout: int = 30, files: list[Attachment] | None = None, **kwargs: Any) -> ExecutionResult:
|
|
64
|
+
"""Execute code in the E2B Cloud sandbox with filesystem monitoring.
|
|
65
|
+
|
|
66
|
+
This override fixes the Pydantic validation error by ensuring execution.error
|
|
67
|
+
is converted to string. Always enables filesystem monitoring to track
|
|
68
|
+
created files.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
code (str): The code to execute.
|
|
72
|
+
timeout (int, optional): Maximum execution time in seconds. Defaults to 30.
|
|
73
|
+
files (list[Attachment] | None, optional): List of Attachment objects with file details. Defaults to None.
|
|
74
|
+
**kwargs (Any): Additional execution parameters.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
ExecutionResult: Structured result of the execution.
|
|
78
|
+
|
|
79
|
+
Raises:
|
|
80
|
+
RuntimeError: If sandbox is not initialized.
|
|
81
|
+
"""
|
|
82
|
+
def get_created_files(self) -> list[str]:
|
|
83
|
+
"""Get the list of files created during the last monitored execution.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
list[str]: List of file paths that were created.
|
|
87
|
+
"""
|
|
88
|
+
def download_file(self, file_path: str) -> bytes | None:
|
|
89
|
+
"""Download file content from the sandbox.
|
|
90
|
+
|
|
91
|
+
Uses download_url when available to avoid binary corruption issues.
|
|
92
|
+
Falls back to the filesystem API when download_url fails or is unavailable.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
file_path (str): Path to the file in the sandbox.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
bytes | None: File content as bytes, or None if download fails.
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
RuntimeError: If sandbox is not initialized.
|
|
102
|
+
"""
|