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,411 @@
|
|
|
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 json
|
|
10
|
+
import os
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
from gllm_inference.schema import Attachment
|
|
15
|
+
from gllm_tools.code_interpreter.code_sandbox.sandbox import BaseSandbox
|
|
16
|
+
from langchain_core.tools import BaseTool
|
|
17
|
+
from langgraph.types import Command
|
|
18
|
+
from pydantic import BaseModel, Field
|
|
19
|
+
|
|
20
|
+
from aip_agents.a2a.types import get_mime_type_from_filename
|
|
21
|
+
from aip_agents.tools.code_sandbox.constant import DATA_FILE_NAME
|
|
22
|
+
from aip_agents.tools.code_sandbox.e2b_cloud_sandbox_extended import MyE2BCloudSandbox
|
|
23
|
+
from aip_agents.utils.artifact_helpers import (
|
|
24
|
+
ArtifactHandler,
|
|
25
|
+
create_multiple_artifacts_response,
|
|
26
|
+
)
|
|
27
|
+
from aip_agents.utils.logger import get_logger
|
|
28
|
+
|
|
29
|
+
logger = get_logger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class E2BCodeSandboxInput(BaseModel):
|
|
33
|
+
"""Input schema for the E2BCodeSandboxTool."""
|
|
34
|
+
|
|
35
|
+
code: str = Field(
|
|
36
|
+
...,
|
|
37
|
+
description=(
|
|
38
|
+
"Python code to execute in the sandbox. "
|
|
39
|
+
"If `data_source` is provided, the data will be automatically pre-loaded into "
|
|
40
|
+
"the sandbox as a Pandas DataFrame. "
|
|
41
|
+
"You can access the data directly via a variable named `df`. "
|
|
42
|
+
"The final result must be printed to stdout."
|
|
43
|
+
),
|
|
44
|
+
min_length=1,
|
|
45
|
+
)
|
|
46
|
+
data_source: str | list[dict[str, Any]] | None = Field(
|
|
47
|
+
default=None,
|
|
48
|
+
description=(
|
|
49
|
+
"The data source used during code execution. "
|
|
50
|
+
"It can be a tool output reference (using $tool_output) or raw data. "
|
|
51
|
+
"If the code requires a data source, this field should not be left empty. "
|
|
52
|
+
"When an output reference is available, prioritize the output reference over raw data."
|
|
53
|
+
),
|
|
54
|
+
)
|
|
55
|
+
timeout: int = Field(default=30, description="Maximum execution time in seconds", ge=1, le=300)
|
|
56
|
+
language: str = Field(default="python", description="Programming language for the sandbox")
|
|
57
|
+
additional_packages: list[str] | None = Field(
|
|
58
|
+
default=None,
|
|
59
|
+
description="Additional Python packages to install before execution",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class E2BCodeSandboxTool(BaseTool):
|
|
64
|
+
"""Tool to execute Python code in E2B Cloud Sandbox."""
|
|
65
|
+
|
|
66
|
+
name: str = "e2b_sandbox_tool"
|
|
67
|
+
description: str = (
|
|
68
|
+
"Useful for executing Python code in a secure cloud sandbox environment. "
|
|
69
|
+
"Input should include the Python code to execute and optional data source, timeout, and packages. "
|
|
70
|
+
"Returns execution results including stdout, stderr, and any errors. "
|
|
71
|
+
"Automatically downloads all files created during execution as artifacts."
|
|
72
|
+
)
|
|
73
|
+
save_output_history: bool = Field(default=True)
|
|
74
|
+
args_schema: type[BaseModel] = E2BCodeSandboxInput
|
|
75
|
+
api_key: str = Field(
|
|
76
|
+
default_factory=lambda: os.getenv("E2B_API_KEY", ""),
|
|
77
|
+
description="E2B API key for cloud sandbox access",
|
|
78
|
+
)
|
|
79
|
+
default_additional_packages: list[str] = Field(
|
|
80
|
+
default_factory=lambda: [
|
|
81
|
+
pkg.strip() for pkg in os.getenv("E2B_SANDBOX_TOOL_ADDITIONAL_PACKAGES", "").split(",") if pkg.strip()
|
|
82
|
+
],
|
|
83
|
+
description="Default additional packages from environment variable",
|
|
84
|
+
)
|
|
85
|
+
store_final_output: bool = False
|
|
86
|
+
|
|
87
|
+
def _run(
|
|
88
|
+
self,
|
|
89
|
+
code: str,
|
|
90
|
+
data_source: str | list[dict[str, Any]] | None = None,
|
|
91
|
+
timeout: int = 30,
|
|
92
|
+
language: str = "python",
|
|
93
|
+
additional_packages: list[str] | None = None,
|
|
94
|
+
) -> str | dict[str, Any]:
|
|
95
|
+
"""Execute code in E2B Cloud Sandbox and return the result with artifacts.
|
|
96
|
+
|
|
97
|
+
This method calls the async _arun method to avoid code duplication.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
code (str): The Python code to execute.
|
|
101
|
+
data_source (str | list[dict[str, Any]] | None, optional): Data source to be used during code execution.
|
|
102
|
+
Defaults to None.
|
|
103
|
+
timeout (int, optional): Maximum execution time in seconds. Defaults to 30.
|
|
104
|
+
language (str, optional): Programming language for the sandbox. Defaults to "python".
|
|
105
|
+
additional_packages (list[str] | None, optional): Additional packages to install. Defaults to None.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
str | dict[str, Any]: The execution result as JSON string, or dict with artifacts if files downloaded.
|
|
109
|
+
"""
|
|
110
|
+
try:
|
|
111
|
+
loop = asyncio.new_event_loop()
|
|
112
|
+
asyncio.set_event_loop(loop)
|
|
113
|
+
try:
|
|
114
|
+
return loop.run_until_complete(self._arun(code, data_source, timeout, language, additional_packages))
|
|
115
|
+
finally:
|
|
116
|
+
loop.close()
|
|
117
|
+
except Exception as e:
|
|
118
|
+
logger.warning(f"Error in synchronous execution wrapper: {str(e)}")
|
|
119
|
+
return self._create_error_result(code, str(e))
|
|
120
|
+
|
|
121
|
+
def _create_error_result(self, code: str, error_message: str, duration_ms: int = 0) -> str:
|
|
122
|
+
"""Create a standardized error result.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
code (str): The code that was being executed.
|
|
126
|
+
error_message (str): The error message.
|
|
127
|
+
duration_ms (int, optional): Duration in milliseconds. Defaults to 0.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
str: JSON string of error result.
|
|
131
|
+
"""
|
|
132
|
+
error_result = {
|
|
133
|
+
"status": "error",
|
|
134
|
+
"code": code,
|
|
135
|
+
"stdout": "",
|
|
136
|
+
"stderr": "",
|
|
137
|
+
"error": error_message,
|
|
138
|
+
"duration_ms": duration_ms,
|
|
139
|
+
}
|
|
140
|
+
return json.dumps(error_result, indent=2)
|
|
141
|
+
|
|
142
|
+
def _prepare_packages(self, additional_packages: list[str] | None) -> list[str]:
|
|
143
|
+
"""Prepare the final list of packages by combining defaults with additional packages.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
additional_packages (list[str] | None): Additional packages to install.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
list[str]: Deduplicated list of packages.
|
|
150
|
+
"""
|
|
151
|
+
all_packages = list(self.default_additional_packages) + (additional_packages or [])
|
|
152
|
+
return list(dict.fromkeys(all_packages))
|
|
153
|
+
|
|
154
|
+
def _convert_execution_result_to_dict(self, result) -> dict[str, Any]:
|
|
155
|
+
"""Convert execution result to dictionary for JSON serialization.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
result: The execution result from sandbox.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
dict[str, Any]: Dictionary representation of the result.
|
|
162
|
+
"""
|
|
163
|
+
return {
|
|
164
|
+
"status": (result.status.value if hasattr(result.status, "value") else str(result.status)),
|
|
165
|
+
"code": result.code,
|
|
166
|
+
"stdout": result.stdout,
|
|
167
|
+
"stderr": result.stderr,
|
|
168
|
+
"error": str(result.error) if result.error else "",
|
|
169
|
+
"duration_ms": result.duration_ms,
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async def _arun(
|
|
173
|
+
self,
|
|
174
|
+
code: str,
|
|
175
|
+
data_source: str | list[dict[str, Any]] | None = None,
|
|
176
|
+
timeout: int = 30,
|
|
177
|
+
language: str = "python",
|
|
178
|
+
additional_packages: list[str] | None = None,
|
|
179
|
+
) -> str | dict[str, Any]:
|
|
180
|
+
"""Async version of code execution in E2B Cloud Sandbox.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
code (str): The Python code to execute.
|
|
184
|
+
data_source (str | list[dict[str, Any]] | None, optional): Data source to be used during code execution.
|
|
185
|
+
Defaults to None.
|
|
186
|
+
timeout (int, optional): Maximum execution time in seconds. Defaults to 30.
|
|
187
|
+
language (str, optional): Programming language for the sandbox. Defaults to "python".
|
|
188
|
+
additional_packages (list[str] | None, optional): Additional packages to install. Defaults to None.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
str | dict[str, Any]: The execution result as JSON string, or dict with artifacts if files downloaded.
|
|
192
|
+
"""
|
|
193
|
+
sandbox = None
|
|
194
|
+
try:
|
|
195
|
+
if isinstance(data_source, str) and data_source.startswith("$tool_output"):
|
|
196
|
+
logger.warning(f"Reference {data_source!r} not resolved! Skipping the code execution.")
|
|
197
|
+
return self._create_error_result(code, f"Reference {data_source!r} not resolved!")
|
|
198
|
+
|
|
199
|
+
files = await self._create_files(data_source)
|
|
200
|
+
sandbox = await self._create_sandbox(language, additional_packages)
|
|
201
|
+
result = await sandbox.execute_code(code, timeout=timeout, files=files)
|
|
202
|
+
return await self._process_execution_result(sandbox, result)
|
|
203
|
+
|
|
204
|
+
except Exception as e:
|
|
205
|
+
logger.error(f"Error executing code in E2B sandbox: {str(e)}")
|
|
206
|
+
return self._create_error_result(code, str(e))
|
|
207
|
+
|
|
208
|
+
finally:
|
|
209
|
+
self._cleanup_sandbox(sandbox)
|
|
210
|
+
|
|
211
|
+
async def _create_files(self, data_source: Command | list[dict[str, Any]] | None) -> list[Attachment] | None:
|
|
212
|
+
"""Create files from data source.
|
|
213
|
+
|
|
214
|
+
This method will convert the data source to a CSV file and return it as an Attachment object,
|
|
215
|
+
as required by the E2B Cloud Sandbox library.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
data_source (Command | list[dict[str, Any]] | None): Data source to be used during code execution.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
list[Attachment] | None: List of Attachment objects.
|
|
222
|
+
|
|
223
|
+
Note:
|
|
224
|
+
1. Command is the expected data type when this method receives data from the tool output sharing.
|
|
225
|
+
2. The known use cases so far only require a single file, hence the current implementation only accepts
|
|
226
|
+
a single list of dictionaries and creates one file, even though the Sandbox supports multiple files.
|
|
227
|
+
"""
|
|
228
|
+
if isinstance(data_source, Command):
|
|
229
|
+
data_source: list[dict[str, Any]] = data_source.update["result"]
|
|
230
|
+
|
|
231
|
+
if not (isinstance(data_source, list) and data_source and all(isinstance(row, dict) for row in data_source)):
|
|
232
|
+
if not data_source:
|
|
233
|
+
logger.info("No data source provided. Ignoring the data source.")
|
|
234
|
+
else:
|
|
235
|
+
logger.warning(
|
|
236
|
+
"Unsupported `data_source` type. Expected a non-empty list of dictionaries. "
|
|
237
|
+
"Ignoring the data source.",
|
|
238
|
+
)
|
|
239
|
+
return None
|
|
240
|
+
|
|
241
|
+
try:
|
|
242
|
+
logger.info("Creating files from data source to upload to the sandbox...")
|
|
243
|
+
df = pd.DataFrame(data_source)
|
|
244
|
+
csv_string = df.to_csv(index=False)
|
|
245
|
+
csv_bytes = csv_string.encode("utf-8")
|
|
246
|
+
return [Attachment.from_bytes(csv_bytes, filename=DATA_FILE_NAME)]
|
|
247
|
+
except Exception as e:
|
|
248
|
+
logger.warning(f"Error creating files from data source: {str(e)}. Ignoring the data source.")
|
|
249
|
+
return None
|
|
250
|
+
|
|
251
|
+
async def _create_sandbox(self, language: str, additional_packages: list[str] | None) -> MyE2BCloudSandbox:
|
|
252
|
+
"""Create and initialize the E2B Cloud Sandbox.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
language (str): Programming language for the sandbox.
|
|
256
|
+
additional_packages (list[str] | None): Additional packages to install.
|
|
257
|
+
|
|
258
|
+
Returns:
|
|
259
|
+
MyE2BCloudSandbox: Initialized sandbox instance.
|
|
260
|
+
"""
|
|
261
|
+
unique_packages = self._prepare_packages(additional_packages)
|
|
262
|
+
|
|
263
|
+
return await MyE2BCloudSandbox.create(
|
|
264
|
+
api_key=self.api_key,
|
|
265
|
+
language=language,
|
|
266
|
+
additional_packages=unique_packages,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
async def _process_execution_result(self, sandbox: MyE2BCloudSandbox, result: Any) -> str | dict[str, Any]:
|
|
270
|
+
"""Process the execution result and handle file artifacts.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
sandbox (MyE2BCloudSandbox): The sandbox instance.
|
|
274
|
+
result (Any): The execution result from sandbox.
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
str | dict[str, Any]: Processed result as JSON or dict with artifacts.
|
|
278
|
+
"""
|
|
279
|
+
result_dict = self._convert_execution_result_to_dict(result)
|
|
280
|
+
created_files = sandbox.get_created_files()
|
|
281
|
+
|
|
282
|
+
if not created_files:
|
|
283
|
+
result_dict["message"] = "No new files were created during execution"
|
|
284
|
+
return json.dumps(result_dict, indent=2)
|
|
285
|
+
|
|
286
|
+
downloaded_artifacts = self._create_artifacts_from_files(sandbox, created_files)
|
|
287
|
+
|
|
288
|
+
if downloaded_artifacts:
|
|
289
|
+
execution_summary = self._create_execution_summary(result_dict, created_files)
|
|
290
|
+
return create_multiple_artifacts_response(result=execution_summary, artifacts=downloaded_artifacts)
|
|
291
|
+
|
|
292
|
+
logger.warning("Files were detected but could not be downloaded")
|
|
293
|
+
return json.dumps(result_dict, indent=2)
|
|
294
|
+
|
|
295
|
+
def _cleanup_sandbox(self, sandbox: MyE2BCloudSandbox | None) -> None:
|
|
296
|
+
"""Clean up sandbox resources.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
sandbox (MyE2BCloudSandbox | None): The sandbox instance to cleanup.
|
|
300
|
+
"""
|
|
301
|
+
if sandbox:
|
|
302
|
+
try:
|
|
303
|
+
sandbox.terminate()
|
|
304
|
+
except Exception as e:
|
|
305
|
+
logger.warning(f"Error terminating sandbox: {str(e)}")
|
|
306
|
+
|
|
307
|
+
def _create_artifacts_from_files(self, sandbox: BaseSandbox, file_paths: list[str]) -> list[dict[str, Any]]:
|
|
308
|
+
"""Create artifacts from a list of file paths using ArtifactHandler.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
sandbox (BaseSandbox): The active sandbox instance.
|
|
312
|
+
file_paths (list[str]): List of file paths to download.
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
list[dict[str, Any]]: List of artifact dictionaries.
|
|
316
|
+
"""
|
|
317
|
+
artifacts = []
|
|
318
|
+
|
|
319
|
+
try:
|
|
320
|
+
for file_path in file_paths:
|
|
321
|
+
logger.debug(f"Processing newly created file: {file_path}")
|
|
322
|
+
artifact_dict = self._download_and_create_artifact(sandbox, file_path)
|
|
323
|
+
if artifact_dict:
|
|
324
|
+
artifacts.append(artifact_dict)
|
|
325
|
+
|
|
326
|
+
except Exception as e:
|
|
327
|
+
logger.error(f"Error creating artifacts from files: {str(e)}")
|
|
328
|
+
|
|
329
|
+
return artifacts
|
|
330
|
+
|
|
331
|
+
def _create_execution_summary(self, result_dict: dict[str, Any], created_files: list[str]) -> str:
|
|
332
|
+
"""Create execution summary with file information.
|
|
333
|
+
|
|
334
|
+
Args:
|
|
335
|
+
result_dict (dict[str, Any]): The execution result dictionary.
|
|
336
|
+
created_files (list[str]): List of created file paths.
|
|
337
|
+
|
|
338
|
+
Returns:
|
|
339
|
+
str: Formatted execution summary.
|
|
340
|
+
"""
|
|
341
|
+
execution_summary = f"Code executed successfully (status: {result_dict['status']}).\n"
|
|
342
|
+
|
|
343
|
+
if result_dict["stdout"]:
|
|
344
|
+
execution_summary += f"Output: {result_dict['stdout']}\n"
|
|
345
|
+
|
|
346
|
+
execution_summary += f"Downloaded {len(created_files)} file(s) created during execution:\n\n"
|
|
347
|
+
|
|
348
|
+
# Add markdown format for each file, especially images
|
|
349
|
+
for file_path in created_files:
|
|
350
|
+
filename = self._extract_filename(file_path)
|
|
351
|
+
mime_type = get_mime_type_from_filename(filename)
|
|
352
|
+
|
|
353
|
+
if mime_type.startswith("image/"):
|
|
354
|
+
# Use just the filename for both alt text and display name
|
|
355
|
+
execution_summary += f"- **{filename}** (Image): \n"
|
|
356
|
+
else:
|
|
357
|
+
execution_summary += f"- **{filename}** ({mime_type}): `{file_path}`\n"
|
|
358
|
+
|
|
359
|
+
return execution_summary
|
|
360
|
+
|
|
361
|
+
def _download_and_create_artifact(self, sandbox: BaseSandbox, file_path: str) -> dict[str, Any] | None:
|
|
362
|
+
"""Download a single file and create an artifact using ArtifactHandler.
|
|
363
|
+
|
|
364
|
+
Args:
|
|
365
|
+
sandbox (BaseSandbox): The active sandbox instance.
|
|
366
|
+
file_path (str): Path to the file in the sandbox.
|
|
367
|
+
|
|
368
|
+
Returns:
|
|
369
|
+
dict[str, Any] | None: Artifact dictionary or None if download failed.
|
|
370
|
+
"""
|
|
371
|
+
try:
|
|
372
|
+
# Download file content
|
|
373
|
+
file_content = sandbox.download_file(file_path)
|
|
374
|
+
if file_content is None:
|
|
375
|
+
logger.warning(f"Failed to download file: {file_path}")
|
|
376
|
+
return None
|
|
377
|
+
|
|
378
|
+
# Extract filename from path
|
|
379
|
+
filename = self._extract_filename(file_path)
|
|
380
|
+
|
|
381
|
+
# Create artifact using ArtifactHandler
|
|
382
|
+
artifact_response = ArtifactHandler().create_file_artifact(
|
|
383
|
+
result=f"File created during execution: {file_path}",
|
|
384
|
+
artifact_data=file_content,
|
|
385
|
+
artifact_name=filename,
|
|
386
|
+
artifact_description=f"File created during execution: {file_path}",
|
|
387
|
+
enable_deduplication=False,
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
logger.info(f"Successfully downloaded newly created file: {file_path} ({len(file_content)} bytes)")
|
|
391
|
+
|
|
392
|
+
# Return just the artifact part (not the response wrapper)
|
|
393
|
+
return artifact_response["artifact"]
|
|
394
|
+
|
|
395
|
+
except Exception as e:
|
|
396
|
+
logger.warning(f"Failed to download file {file_path}: {str(e)}")
|
|
397
|
+
return None
|
|
398
|
+
|
|
399
|
+
def _extract_filename(self, file_path: str) -> str:
|
|
400
|
+
"""Extract filename from file path with fallback.
|
|
401
|
+
|
|
402
|
+
Args:
|
|
403
|
+
file_path (str): The file path.
|
|
404
|
+
|
|
405
|
+
Returns:
|
|
406
|
+
str: The extracted filename.
|
|
407
|
+
"""
|
|
408
|
+
filename = os.path.basename(file_path)
|
|
409
|
+
if not filename:
|
|
410
|
+
filename = f"sandbox_file_{hash(file_path) % 10000}"
|
|
411
|
+
return filename
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.a2a.types import get_mime_type_from_filename as get_mime_type_from_filename
|
|
3
|
+
from aip_agents.tools.code_sandbox.constant import DATA_FILE_NAME as DATA_FILE_NAME
|
|
4
|
+
from aip_agents.tools.code_sandbox.e2b_cloud_sandbox_extended import MyE2BCloudSandbox as MyE2BCloudSandbox
|
|
5
|
+
from aip_agents.utils.artifact_helpers import ArtifactHandler as ArtifactHandler, create_multiple_artifacts_response as create_multiple_artifacts_response
|
|
6
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
7
|
+
from langchain_core.tools import BaseTool
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
logger: Incomplete
|
|
12
|
+
|
|
13
|
+
class E2BCodeSandboxInput(BaseModel):
|
|
14
|
+
"""Input schema for the E2BCodeSandboxTool."""
|
|
15
|
+
code: str
|
|
16
|
+
data_source: str | list[dict[str, Any]] | None
|
|
17
|
+
timeout: int
|
|
18
|
+
language: str
|
|
19
|
+
additional_packages: list[str] | None
|
|
20
|
+
|
|
21
|
+
class E2BCodeSandboxTool(BaseTool):
|
|
22
|
+
"""Tool to execute Python code in E2B Cloud Sandbox."""
|
|
23
|
+
name: str
|
|
24
|
+
description: str
|
|
25
|
+
save_output_history: bool
|
|
26
|
+
args_schema: type[BaseModel]
|
|
27
|
+
api_key: str
|
|
28
|
+
default_additional_packages: list[str]
|
|
29
|
+
store_final_output: bool
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Constants for tools using GL Connectors.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Saul Sayers (saul.sayers@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
from enum import Enum, StrEnum
|
|
9
|
+
|
|
10
|
+
GL_CONNECTORS_BASE_URL = (
|
|
11
|
+
os.getenv("GL_CONNECTORS_BASE_URL")
|
|
12
|
+
or os.getenv("GL_CONNECTORS_API_BASE_URL")
|
|
13
|
+
or os.getenv("BOSA_API_BASE_URL")
|
|
14
|
+
or os.getenv("BOSA_BASE_URL")
|
|
15
|
+
)
|
|
16
|
+
GL_CONNECTORS_API_KEY = os.getenv("GL_CONNECTORS_API_KEY") or os.getenv("BOSA_API_KEY")
|
|
17
|
+
GL_CONNECTORS_FETCH_MAX_RETRIES = int(
|
|
18
|
+
os.getenv("GL_CONNECTORS_FETCH_MAX_RETRIES") or os.getenv("BOSA_FETCH_MAX_RETRIES") or 3
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# For backward compatibility
|
|
22
|
+
BOSA_API_BASE_URL = GL_CONNECTORS_BASE_URL
|
|
23
|
+
BOSA_API_KEY = GL_CONNECTORS_API_KEY
|
|
24
|
+
BOSA_FETCH_MAX_RETRIES = GL_CONNECTORS_FETCH_MAX_RETRIES
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ToolType(StrEnum):
|
|
28
|
+
"""Tool types for GL Connectors."""
|
|
29
|
+
|
|
30
|
+
GLLM = "gllm"
|
|
31
|
+
LANGCHAIN = "langchain"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Action(Enum):
|
|
35
|
+
"""Actions for GL Connectors."""
|
|
36
|
+
|
|
37
|
+
GITHUB = "github"
|
|
38
|
+
GOOGLE = "google"
|
|
39
|
+
GOOGLE_DRIVE = "google_drive"
|
|
40
|
+
GOOGLE_MAIL = "google_mail"
|
|
41
|
+
TWITTER = "twitter"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class GitHubEndpoint(Enum):
|
|
45
|
+
"""GitHub endpoints for GL Connectors."""
|
|
46
|
+
|
|
47
|
+
INTEGRATIONS = "integrations"
|
|
48
|
+
USER_HAS_INTEGRATION = "integration-exists"
|
|
49
|
+
SUCCESS_AUTHORIZE_CALLBACK = "success-authorize-callback"
|
|
50
|
+
CREATE_ISSUE_HANDLER = "create_issue"
|
|
51
|
+
GET_ISSUE_HANDLER = "get_issue"
|
|
52
|
+
LIST_ISSUES = "list_issues"
|
|
53
|
+
LIST_ISSUES_COMMENTS = "list_issues_comments"
|
|
54
|
+
SEARCH_ALL_ISSUES = "search_issues"
|
|
55
|
+
GET_COMMITS = "list_commits"
|
|
56
|
+
SEARCH_COMMITS = "search_commits"
|
|
57
|
+
GET_COLLABORATORS = "list_collaborators"
|
|
58
|
+
GET_RELEASES = "list_releases"
|
|
59
|
+
GET_CONTRIBUTORS = "list_contributors"
|
|
60
|
+
GET_LANGUAGES = "list_languages"
|
|
61
|
+
SEARCH_CONTRIBUTIONS = "search_contributions"
|
|
62
|
+
LIST_PULL_REQUESTS = "list_pull_requests"
|
|
63
|
+
SEARCH_PR = "search_pull_requests"
|
|
64
|
+
GET_PULL = "get_pull"
|
|
65
|
+
GET_ALL_CONTRIBUTOR_COMMIT_ACTIVITIES = "get_all_contributor_commit_activities"
|
|
66
|
+
GET_COMMIT_ACTIVITY = "get_the_last_year_of_commit_activity"
|
|
67
|
+
GET_WEEKLY_COMMIT_COUNTS = "get_weekly_commit_count "
|
|
68
|
+
GET_USER_CONTRIBUTION_STATISTICS = "get_user_contribution_statistics"
|
|
69
|
+
LIST_PROJECT_ITEMS = "list_project_items"
|
|
70
|
+
LIST_PROJECTS = "list_projects"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class GoogleDriveEndpoint(Enum):
|
|
74
|
+
"""Google Drive endpoints for GL Connectors."""
|
|
75
|
+
|
|
76
|
+
INTEGRATIONS = "integrations"
|
|
77
|
+
USER_HAS_INTEGRATION = "integration-exists"
|
|
78
|
+
SUCCESS_AUTHORIZE_CALLBACK = "success-authorize-callback"
|
|
79
|
+
SEARCH_FILES = "search_files"
|
|
80
|
+
GET_FILE = "get_file"
|
|
81
|
+
CREATE_FILE = "create_file"
|
|
82
|
+
CREATE_FOLDER = "create_folder"
|
|
83
|
+
UPDATE_FILE = "update_file"
|
|
84
|
+
UPDATE_FOLDER = "update_folder"
|
|
85
|
+
COPY_FILE = "copy_file"
|
|
86
|
+
DELETE_FILE = "delete_file"
|
|
87
|
+
SUMMARIZE_FOLDER_FILES_BY_TYPE = "summarize_folder_files_by_type"
|
|
88
|
+
SUMMARIZE_TOTAL_FILES_BY_TYPE = "summarize_total_files_by_type"
|
|
89
|
+
RECENT_FILES = "list_recent_files_from_yesterday"
|
|
90
|
+
CREATE_PERMISSION = "create_permission"
|
|
91
|
+
LIST_PERMISSIONS = "list_permissions"
|
|
92
|
+
GET_PERMISSION = "get_permission"
|
|
93
|
+
UPDATE_PERMISSION = "update_permission"
|
|
94
|
+
DELETE_PERMISSION = "delete_permission"
|
|
95
|
+
DOWNLOAD_FILE = "download_file"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class GoogleDocsEndpoint(Enum):
|
|
99
|
+
"""Google Docs endpoints for GL Connectors."""
|
|
100
|
+
|
|
101
|
+
INTEGRATIONS = "integrations"
|
|
102
|
+
USER_HAS_INTEGRATION = "integration-exists"
|
|
103
|
+
SUCCESS_AUTHORIZE_CALLBACK = "success-authorize-callback"
|
|
104
|
+
GET_DOCUMENT = "get_document"
|
|
105
|
+
LIST_DOCUMENTS = "list_documents"
|
|
106
|
+
CREATE_DOCUMENT = "create_document"
|
|
107
|
+
UPDATE_DOCUMENT = "update_document"
|
|
108
|
+
COPY_CONTENT = "copy_content"
|
|
109
|
+
UPDATE_DOCUMENT_MARKDOWN = "update_document_markdown"
|
|
110
|
+
LIST_COMMENTS = "list_comments"
|
|
111
|
+
SUMMARIZE_COMMENTS = "summarize_comments"
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class GoogleEndpoint(Enum):
|
|
115
|
+
"""Google endpoints for GL Connectors."""
|
|
116
|
+
|
|
117
|
+
INTEGRATIONS = "integrations"
|
|
118
|
+
USER_HAS_INTEGRATION = "integration-exists"
|
|
119
|
+
SUCCESS_AUTHORIZE_CALLBACK = "success-authorize-callback"
|
|
120
|
+
USERINFO = "userinfo"
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class TwitterEndpoint(Enum):
|
|
124
|
+
"""Twitter endpoints for GL Connectors."""
|
|
125
|
+
|
|
126
|
+
INTEGRATIONS = "integrations"
|
|
127
|
+
USER_HAS_INTEGRATION = "integration-exists"
|
|
128
|
+
SUCCESS_AUTHORIZE_CALLBACK = "success-authorize-callback"
|
|
129
|
+
SEARCH = "tweet_search"
|
|
130
|
+
GET_TWEETS = "get_tweets"
|
|
131
|
+
GET_THREAD = "get_thread"
|
|
132
|
+
GET_USERS = "get_users"
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class GoogleMailEndpoint(Enum):
|
|
136
|
+
"""Google Mail endpoints for GL Connectors."""
|
|
137
|
+
|
|
138
|
+
INTEGRATIONS = "integrations"
|
|
139
|
+
USER_HAS_INTEGRATION = "integration-exists"
|
|
140
|
+
SUCCESS_AUTHORIZE_CALLBACK = "success-authorize-callback"
|
|
141
|
+
CREATE_DRAFT = "create_draft"
|
|
142
|
+
LIST_DRAFTS = "list_drafts"
|
|
143
|
+
SEND_DRAFT = "send_draft"
|
|
144
|
+
GET_DRAFT = "get_draft"
|
|
145
|
+
MODIFY_DRAFT = "modify_draft"
|
|
146
|
+
LIST_LABELS = "list_labels"
|
|
147
|
+
LABEL_STATS = "label_stats"
|
|
148
|
+
GET_LABEL_DETAILS = "get_label_details"
|
|
149
|
+
CREATE_LABELS = "create_labels"
|
|
150
|
+
MODIFY_LABELS = "modify_labels"
|
|
151
|
+
DELETE_LABELS = "delete_labels"
|
|
152
|
+
SEND_EMAIL = "send_email"
|
|
153
|
+
LIST_EMAILS = "list_emails"
|
|
154
|
+
GET_EMAIL_DETAILS = "get_email_details"
|
|
155
|
+
MODIFY_EMAIL = "modify_email"
|
|
156
|
+
DELETE_EMAIL = "delete_email"
|
|
157
|
+
TRASH_EMAIL = "trash_email"
|
|
158
|
+
UNTRASH_EMAIL = "untrash_email"
|
|
159
|
+
LIST_THREADS = "list_threads"
|
|
160
|
+
THREAD_DETAILS = "thread_details"
|
|
161
|
+
MODIFY_THREAD = "modify_thread"
|
|
162
|
+
GET_AUTO_REPLY = "get_auto_reply"
|
|
163
|
+
SET_AUTO_REPLY = "set_auto_reply"
|
|
164
|
+
GET_ATTACHMENT = "get_attachment"
|
|
165
|
+
USERINFO = "userinfo"
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class ActionEndpointMap:
|
|
169
|
+
"""Maps Action enums to their corresponding Endpoint enums."""
|
|
170
|
+
|
|
171
|
+
MAP: dict[Action, type[Enum]] = {
|
|
172
|
+
Action.GITHUB: GitHubEndpoint,
|
|
173
|
+
Action.GOOGLE: GoogleEndpoint,
|
|
174
|
+
Action.GOOGLE_DRIVE: GoogleDriveEndpoint,
|
|
175
|
+
Action.GOOGLE_MAIL: GoogleMailEndpoint,
|
|
176
|
+
Action.TWITTER: TwitterEndpoint,
|
|
177
|
+
}
|