aip-agents-binary 0.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of aip-agents-binary might be problematic. Click here for more details.
- 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 +3037 -0
- aip_agents/agent/base_langgraph_agent.pyi +233 -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 +767 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
- aip_agents/agent/langgraph_react_agent.py +2856 -0
- aip_agents/agent/langgraph_react_agent.pyi +170 -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/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_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc.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 +55 -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 +228 -0
- aip_agents/mcp/client/connection_manager.pyi +51 -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 +612 -0
- aip_agents/mcp/client/persistent_session.pyi +122 -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 +263 -0
- aip_agents/mcp/client/transports.pyi +132 -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 +811 -0
- aip_agents/memory/adapters/base_adapter.pyi +176 -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/ptc/__init__.py +48 -0
- aip_agents/ptc/__init__.pyi +10 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/doc_gen.pyi +40 -0
- aip_agents/ptc/exceptions.py +39 -0
- aip_agents/ptc/exceptions.pyi +22 -0
- aip_agents/ptc/executor.py +143 -0
- aip_agents/ptc/executor.pyi +73 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/__init__.pyi +7 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
- aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
- aip_agents/ptc/naming.py +184 -0
- aip_agents/ptc/naming.pyi +76 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/payload.pyi +15 -0
- aip_agents/ptc/prompt_builder.py +571 -0
- aip_agents/ptc/prompt_builder.pyi +55 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/ptc_helper.pyi +1 -0
- aip_agents/ptc/sandbox_bridge.py +58 -0
- aip_agents/ptc/sandbox_bridge.pyi +25 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/template_utils.pyi +13 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/__init__.pyi +0 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/sandbox/__init__.py +43 -0
- aip_agents/sandbox/__init__.pyi +5 -0
- aip_agents/sandbox/defaults.py +9 -0
- aip_agents/sandbox/defaults.pyi +2 -0
- aip_agents/sandbox/e2b_runtime.py +267 -0
- aip_agents/sandbox/e2b_runtime.pyi +51 -0
- aip_agents/sandbox/template_builder.py +131 -0
- aip_agents/sandbox/template_builder.pyi +36 -0
- aip_agents/sandbox/types.py +24 -0
- aip_agents/sandbox/types.pyi +14 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/sandbox/validation.pyi +20 -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 +64 -0
- aip_agents/tools/__init__.pyi +11 -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 +1120 -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 +815 -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/date_range_tool.py +554 -0
- aip_agents/tools/date_range_tool.pyi +21 -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/execute_ptc_code.py +308 -0
- aip_agents/tools/execute_ptc_code.pyi +90 -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 +29 -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 +365 -0
- aip_agents/tools/memory_search/mem0.pyi +29 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search/schema.pyi +25 -0
- aip_agents/tools/memory_search_tool.py +34 -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 +1096 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +329 -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.6.4.dist-info/METADATA +673 -0
- aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
- aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
- aip_agents_binary-0.6.4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
"""AgentExecutor and GLLMMultiActionAgent for AIP Agents.
|
|
2
|
+
|
|
3
|
+
This module provides a custom implementation of LangChain's AgentExecutor
|
|
4
|
+
and a GLLMMultiActionAgent that bridges between the GLLM Agent implementation
|
|
5
|
+
and LangChain's BaseMultiActionAgent interface.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
9
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from collections.abc import Sequence
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from gllm_core.constants import EventLevel, EventType
|
|
17
|
+
from gllm_core.event import EventEmitter
|
|
18
|
+
from gllm_inference.lm_invoker.lm_invoker import BaseLMInvoker
|
|
19
|
+
from gllm_inference.schema import (
|
|
20
|
+
LMOutput,
|
|
21
|
+
MessageRole,
|
|
22
|
+
ToolCall,
|
|
23
|
+
ToolResult,
|
|
24
|
+
)
|
|
25
|
+
from langchain.agents import (
|
|
26
|
+
AgentExecutor as LangchainAgentExecutor,
|
|
27
|
+
) # Alias for clarity
|
|
28
|
+
from langchain.agents import BaseMultiActionAgent
|
|
29
|
+
from langchain.agents.tools import InvalidTool
|
|
30
|
+
from langchain_core.agents import AgentAction, AgentFinish, AgentStep
|
|
31
|
+
from langchain_core.callbacks import (
|
|
32
|
+
AsyncCallbackManagerForChainRun,
|
|
33
|
+
CallbackManagerForChainRun,
|
|
34
|
+
Callbacks,
|
|
35
|
+
)
|
|
36
|
+
from langchain_core.tools import BaseTool
|
|
37
|
+
from pydantic import ConfigDict
|
|
38
|
+
|
|
39
|
+
from aip_agents.utils.logger import get_logger
|
|
40
|
+
|
|
41
|
+
logger = get_logger(__name__)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class ExecutorConfig:
|
|
46
|
+
"""Configuration for AgentExecutor."""
|
|
47
|
+
|
|
48
|
+
instruction: str
|
|
49
|
+
invoker: BaseLMInvoker
|
|
50
|
+
tools: Sequence[BaseTool]
|
|
51
|
+
max_iterations: int | None = 15
|
|
52
|
+
max_execution_time: float | None = None
|
|
53
|
+
verbose: bool = False
|
|
54
|
+
event_emitter: EventEmitter | None = None
|
|
55
|
+
handle_parsing_errors: bool = True
|
|
56
|
+
prompt_memory: list | None = None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class GLLMMultiActionAgent(BaseMultiActionAgent):
|
|
60
|
+
"""Bridges a GLLM Agent with LangChain's BaseMultiActionAgent interface.
|
|
61
|
+
|
|
62
|
+
This class allows a GLLM Agent (which uses an LMInvoker internally) to be
|
|
63
|
+
used within LangChain's execution framework (e.g., with an AgentExecutor).
|
|
64
|
+
It handles the conversion of prompts and responses between the GLLM Agent's
|
|
65
|
+
LMInvoker system and the format expected by LangChain.
|
|
66
|
+
|
|
67
|
+
Primarily designed for asynchronous operation via the `aplan` method.
|
|
68
|
+
|
|
69
|
+
Attributes:
|
|
70
|
+
instruction (str): The system instruction for the language model.
|
|
71
|
+
invoker (BaseLMInvoker): The LMInvoker instance associated with the GLLM Agent,
|
|
72
|
+
used for making calls to the language model.
|
|
73
|
+
tools (list[BaseTool]): A list of tools available to the GLLM Agent.
|
|
74
|
+
event_emitter (Optional[EventEmitter]): An optional event emitter for streaming
|
|
75
|
+
intermediate steps and other events. Defaults to None.
|
|
76
|
+
input_keys_arg (list[str]): The list of input keys that the agent expects.
|
|
77
|
+
Defaults to ["input"].
|
|
78
|
+
return_keys_arg (list[str]): The list of keys for the agent's return values.
|
|
79
|
+
Defaults to ["output"].
|
|
80
|
+
prompt_memory (list[tuple[MessageRole, list[Any]]]): Pre-formatted prompt memory.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
instruction: str
|
|
84
|
+
invoker: BaseLMInvoker
|
|
85
|
+
tools: list[BaseTool]
|
|
86
|
+
event_emitter: EventEmitter | None = None
|
|
87
|
+
input_keys_arg: list[str] = ["input"]
|
|
88
|
+
return_keys_arg: list[str] = ["output"]
|
|
89
|
+
prompt_memory: list | None = None
|
|
90
|
+
|
|
91
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
92
|
+
|
|
93
|
+
def __init__(
|
|
94
|
+
self,
|
|
95
|
+
instruction: str,
|
|
96
|
+
invoker: BaseLMInvoker,
|
|
97
|
+
tools: list[BaseTool],
|
|
98
|
+
event_emitter: EventEmitter | None = None,
|
|
99
|
+
prompt_memory: list | None = None,
|
|
100
|
+
):
|
|
101
|
+
"""Initializes the GLLMMultiActionAgent.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
instruction (str): The system instruction for the language model.
|
|
105
|
+
invoker (BaseLMInvoker): The LMInvoker from the GLLM Agent.
|
|
106
|
+
tools (list[BaseTool]): Tools available to the GLLM Agent.
|
|
107
|
+
event_emitter (Optional[EventEmitter], optional): Event emitter for streaming.
|
|
108
|
+
Defaults to None.
|
|
109
|
+
prompt_memory (Optional[list], optional):
|
|
110
|
+
Pre-formatted prompt memory. Defaults to None.
|
|
111
|
+
"""
|
|
112
|
+
super().__init__(
|
|
113
|
+
instruction=instruction,
|
|
114
|
+
invoker=invoker,
|
|
115
|
+
tools=tools,
|
|
116
|
+
event_emitter=event_emitter,
|
|
117
|
+
prompt_memory=prompt_memory,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def input_keys(self) -> list[str]:
|
|
122
|
+
"""Input keys for the agent."""
|
|
123
|
+
return self.input_keys_arg
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def return_values(self) -> list[str]:
|
|
127
|
+
"""Return values of the agent."""
|
|
128
|
+
return self.return_keys_arg
|
|
129
|
+
|
|
130
|
+
def plan(
|
|
131
|
+
self,
|
|
132
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
133
|
+
_callbacks: Callbacks = None,
|
|
134
|
+
**kwargs: Any,
|
|
135
|
+
) -> list[AgentAction] | AgentFinish:
|
|
136
|
+
"""Synchronous planning. (Not Implemented).
|
|
137
|
+
|
|
138
|
+
This method is intentionally not implemented to encourage asynchronous
|
|
139
|
+
operations. Please use the `aplan` method.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
intermediate_steps: Steps the LLM has taken to date, along with observations.
|
|
143
|
+
_callbacks: Callbacks to run.
|
|
144
|
+
**kwargs: User inputs.
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
NotImplementedError: This method is not implemented.
|
|
148
|
+
"""
|
|
149
|
+
logger.warning(
|
|
150
|
+
"GLLMMultiActionAgent synchronous 'plan' method was called but is not implemented. Use 'aplan' instead."
|
|
151
|
+
)
|
|
152
|
+
raise NotImplementedError("Synchronous planning is not implemented. Please use the 'aplan' method.")
|
|
153
|
+
|
|
154
|
+
async def aplan(
|
|
155
|
+
self,
|
|
156
|
+
intermediate_steps: list[tuple[AgentAction, str]],
|
|
157
|
+
_callbacks: Callbacks = None,
|
|
158
|
+
**kwargs: Any,
|
|
159
|
+
) -> list[AgentAction] | AgentFinish:
|
|
160
|
+
"""Asynchronously decides the next action(s) or finishes execution.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
intermediate_steps (list[tuple[AgentAction, str]]): A list of previous
|
|
164
|
+
agent actions and their corresponding string observations.
|
|
165
|
+
_callbacks (Callbacks, optional): LangChain callbacks. Not directly used by
|
|
166
|
+
this method but maintained for interface compatibility. Defaults to None.
|
|
167
|
+
**kwargs (Any): Additional keyword arguments representing the initial inputs
|
|
168
|
+
to the agent (e.g., `input="user's query"`).
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
list[AgentAction] | AgentFinish: A list of `AgentAction` objects if the
|
|
172
|
+
agent decides to take one or more actions, or an `AgentFinish` object
|
|
173
|
+
if the agent has completed its work.
|
|
174
|
+
"""
|
|
175
|
+
prompt_messages: list = self._create_prompt(intermediate_steps, **kwargs)
|
|
176
|
+
|
|
177
|
+
logger.debug(f"Prompt messages for GLLMMultiActionAgent aplan: {prompt_messages}")
|
|
178
|
+
response = await self.invoker.invoke(prompt=prompt_messages, event_emitter=self.event_emitter)
|
|
179
|
+
|
|
180
|
+
parsed_response = await self._parse_response(response)
|
|
181
|
+
return parsed_response
|
|
182
|
+
|
|
183
|
+
def get_allowed_tools(self) -> list[str] | None:
|
|
184
|
+
"""Returns a list of tool names that this agent is allowed to use."""
|
|
185
|
+
return [tool.name for tool in self.tools]
|
|
186
|
+
|
|
187
|
+
def return_stopped_response(
|
|
188
|
+
self,
|
|
189
|
+
early_stopping_method: str,
|
|
190
|
+
_intermediate_steps: list[tuple[AgentAction, str]],
|
|
191
|
+
**kwargs: Any,
|
|
192
|
+
) -> AgentFinish:
|
|
193
|
+
"""Returns an AgentFinish object when the agent is stopped early.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
early_stopping_method (str): The method used for early stopping.
|
|
197
|
+
Currently, only "force" is supported.
|
|
198
|
+
_intermediate_steps (list[tuple[AgentAction, str]]): The history of
|
|
199
|
+
actions and observations.
|
|
200
|
+
**kwargs (Any): Additional inputs.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
AgentFinish: An AgentFinish object indicating the agent stopped.
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
ValueError: If `early_stopping_method` is not "force".
|
|
207
|
+
"""
|
|
208
|
+
if early_stopping_method == "force":
|
|
209
|
+
return AgentFinish(
|
|
210
|
+
return_values={"output": "Agent stopped due to iteration limit or time limit."},
|
|
211
|
+
log="Agent stopped due to iteration limit or time limit.\n",
|
|
212
|
+
)
|
|
213
|
+
raise ValueError(f"Got unsupported early_stopping_method `{early_stopping_method}`")
|
|
214
|
+
|
|
215
|
+
def tool_run_logging_kwargs(self) -> dict[str, Any]:
|
|
216
|
+
"""Returns keyword arguments for logging tool runs. Currently empty."""
|
|
217
|
+
return {}
|
|
218
|
+
|
|
219
|
+
def _create_prompt(self, intermediate_steps: list[tuple[AgentAction, str]], **kwargs: Any) -> list:
|
|
220
|
+
"""Create a multimodal prompt from intermediate steps and inputs.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
intermediate_steps: Steps the LLM has taken to date, along with observations.
|
|
224
|
+
**kwargs: User inputs.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
A list (list of prompt message tuples).
|
|
228
|
+
"""
|
|
229
|
+
prompt_msgs: list = []
|
|
230
|
+
|
|
231
|
+
# 1. System instruction
|
|
232
|
+
prompt_msgs.append((MessageRole.SYSTEM, [self.instruction]))
|
|
233
|
+
|
|
234
|
+
# 2. Prepend chat history
|
|
235
|
+
if self.prompt_memory:
|
|
236
|
+
prompt_msgs.extend(self.prompt_memory)
|
|
237
|
+
|
|
238
|
+
# 3. Current user input
|
|
239
|
+
if "input" in kwargs:
|
|
240
|
+
prompt_msgs.append((MessageRole.USER, [kwargs["input"]]))
|
|
241
|
+
|
|
242
|
+
# 4. Intermediate steps (tool calls and observations for the current turn)
|
|
243
|
+
for i, (action, observation) in enumerate(intermediate_steps):
|
|
244
|
+
tool_call_id = f"call_{action.tool}_{i}"
|
|
245
|
+
if isinstance(action.tool_input, dict):
|
|
246
|
+
args = action.tool_input
|
|
247
|
+
else:
|
|
248
|
+
args = {"query": action.tool_input}
|
|
249
|
+
tool_call = ToolCall(id=tool_call_id, name=action.tool, args=args)
|
|
250
|
+
prompt_msgs.append((MessageRole.ASSISTANT, [tool_call]))
|
|
251
|
+
tool_result = ToolResult(id=tool_call_id, output=observation)
|
|
252
|
+
prompt_msgs.append((MessageRole.USER, [tool_result]))
|
|
253
|
+
|
|
254
|
+
return prompt_msgs
|
|
255
|
+
|
|
256
|
+
async def _handle_tool_calls(self, tool_calls: list[ToolCall]) -> list[AgentAction] | None:
|
|
257
|
+
"""Handles tool calls by converting them to AgentActions.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
tool_calls: list of tool calls to process.
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
Optional[list[AgentAction]]: List of agent actions if any tool calls exist.
|
|
264
|
+
"""
|
|
265
|
+
if not tool_calls:
|
|
266
|
+
return None
|
|
267
|
+
|
|
268
|
+
actions = []
|
|
269
|
+
for tool_call in tool_calls:
|
|
270
|
+
tool_input = tool_call.args if tool_call.args else {}
|
|
271
|
+
action_log = f"Invoking: `{tool_call.name}` with `{tool_input}`\n"
|
|
272
|
+
actions.append(
|
|
273
|
+
AgentAction(
|
|
274
|
+
tool=tool_call.name,
|
|
275
|
+
tool_input=tool_input,
|
|
276
|
+
log=f"\n{action_log}\n",
|
|
277
|
+
)
|
|
278
|
+
)
|
|
279
|
+
if self.event_emitter:
|
|
280
|
+
await self.event_emitter.emit(
|
|
281
|
+
event_type=EventType.DATA,
|
|
282
|
+
event_level=EventLevel.INFO,
|
|
283
|
+
value=action_log,
|
|
284
|
+
)
|
|
285
|
+
return actions
|
|
286
|
+
|
|
287
|
+
async def _parse_response(self, response: LMOutput) -> list[AgentAction] | AgentFinish:
|
|
288
|
+
"""Parses the LMInvoker's response into LangChain actions or finish signal.
|
|
289
|
+
|
|
290
|
+
If the response contains tool calls, they are converted to `AgentAction` objects.
|
|
291
|
+
Otherwise, the response is treated as a final answer and converted to an
|
|
292
|
+
`AgentFinish` object.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
response (LMOutput): The output from the LMInvoker.
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
list[AgentAction] | AgentFinish: LangChain actions or finish signal.
|
|
299
|
+
"""
|
|
300
|
+
logger.debug(f"Response from LM Invoker in GLLMMultiActionAgent: {response}")
|
|
301
|
+
|
|
302
|
+
if not isinstance(response, LMOutput):
|
|
303
|
+
return AgentFinish(return_values={"output": response}, log=response)
|
|
304
|
+
|
|
305
|
+
actions = await self._handle_tool_calls(response.tool_calls)
|
|
306
|
+
if actions:
|
|
307
|
+
return actions
|
|
308
|
+
|
|
309
|
+
return AgentFinish(
|
|
310
|
+
return_values={"output": str(response.response)},
|
|
311
|
+
log=str(response.response),
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
class AgentExecutor(LangchainAgentExecutor):
|
|
316
|
+
"""Custom GLLM AgentExecutor extending LangChain's AgentExecutor.
|
|
317
|
+
|
|
318
|
+
This executor orchestrates the execution loop for a GLLM Agent. It receives
|
|
319
|
+
the GLLM Agent instance and necessary components (invoker, tools) and internally
|
|
320
|
+
creates the `GLLMMultiActionAgent` adapter needed for the LangChain execution flow.
|
|
321
|
+
|
|
322
|
+
It prioritizes asynchronous operations (`_aperform_agent_action`) and integrates
|
|
323
|
+
with the GLLM event emitter system.
|
|
324
|
+
"""
|
|
325
|
+
|
|
326
|
+
def __init__(
|
|
327
|
+
self,
|
|
328
|
+
config: ExecutorConfig,
|
|
329
|
+
**kwargs: Any,
|
|
330
|
+
):
|
|
331
|
+
"""Initializes the custom AgentExecutor.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
config: Configuration object containing all executor parameters.
|
|
335
|
+
**kwargs: Additional keyword arguments passed to the parent
|
|
336
|
+
`LangchainAgentExecutor` constructor.
|
|
337
|
+
"""
|
|
338
|
+
action_agent = GLLMMultiActionAgent(
|
|
339
|
+
instruction=config.instruction,
|
|
340
|
+
invoker=config.invoker,
|
|
341
|
+
tools=list(config.tools),
|
|
342
|
+
event_emitter=config.event_emitter,
|
|
343
|
+
prompt_memory=config.prompt_memory,
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
super().__init__(
|
|
347
|
+
agent=action_agent,
|
|
348
|
+
tools=config.tools,
|
|
349
|
+
max_iterations=config.max_iterations,
|
|
350
|
+
max_execution_time=config.max_execution_time,
|
|
351
|
+
verbose=config.verbose,
|
|
352
|
+
handle_parsing_errors=config.handle_parsing_errors,
|
|
353
|
+
**kwargs,
|
|
354
|
+
)
|
|
355
|
+
self._event_emitter = config.event_emitter
|
|
356
|
+
|
|
357
|
+
@property
|
|
358
|
+
def event_emitter(self) -> EventEmitter | None:
|
|
359
|
+
"""Get the event emitter."""
|
|
360
|
+
return self._event_emitter
|
|
361
|
+
|
|
362
|
+
async def _aperform_agent_action(
|
|
363
|
+
self,
|
|
364
|
+
name_to_tool_map: dict[str, BaseTool],
|
|
365
|
+
color_mapping: dict[str, str],
|
|
366
|
+
agent_action: AgentAction,
|
|
367
|
+
run_manager: AsyncCallbackManagerForChainRun | None = None,
|
|
368
|
+
) -> AgentStep:
|
|
369
|
+
"""Asynchronously performs a single agent action (tool execution).
|
|
370
|
+
|
|
371
|
+
This method executes the specified tool with the given input and logs
|
|
372
|
+
the action and observation. If an `event_emitter` is configured, it emits
|
|
373
|
+
events for tool responses and invalid tool requests.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
name_to_tool_map (dict[str, BaseTool]): Mapping of tool names to tool instances.
|
|
377
|
+
color_mapping (dict[str, str]): Mapping of tool names to colors for logging.
|
|
378
|
+
agent_action (AgentAction): The agent action to perform, specifying the tool
|
|
379
|
+
and tool input.
|
|
380
|
+
run_manager (Optional[AsyncCallbackManagerForChainRun], optional): LangChain
|
|
381
|
+
callback manager for the current run. Defaults to None.
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
AgentStep: An `AgentStep` object containing the performed action and the
|
|
385
|
+
resulting observation from the tool.
|
|
386
|
+
"""
|
|
387
|
+
if run_manager:
|
|
388
|
+
await run_manager.on_agent_action(agent_action, verbose=self.verbose, color="green")
|
|
389
|
+
|
|
390
|
+
observation = ""
|
|
391
|
+
tool_to_run: BaseTool | None = name_to_tool_map.get(agent_action.tool)
|
|
392
|
+
|
|
393
|
+
if tool_to_run:
|
|
394
|
+
tool_run_kwargs = self._action_agent.tool_run_logging_kwargs()
|
|
395
|
+
if tool_to_run.return_direct:
|
|
396
|
+
tool_run_kwargs["llm_prefix"] = ""
|
|
397
|
+
|
|
398
|
+
tool_input = await self._preprocess_tool_input(agent_action.tool_input)
|
|
399
|
+
observation = await tool_to_run.arun(
|
|
400
|
+
tool_input,
|
|
401
|
+
verbose=self.verbose,
|
|
402
|
+
color=color_mapping.get(agent_action.tool),
|
|
403
|
+
callbacks=run_manager.get_child() if run_manager else None,
|
|
404
|
+
**tool_run_kwargs,
|
|
405
|
+
)
|
|
406
|
+
observation = await self._postprocess_tool_output(observation)
|
|
407
|
+
logger.info(f"Tool {agent_action.tool} responded: {observation}")
|
|
408
|
+
else:
|
|
409
|
+
tool_run_kwargs = self._action_agent.tool_run_logging_kwargs()
|
|
410
|
+
observation = await InvalidTool().arun(
|
|
411
|
+
tool_input={
|
|
412
|
+
"requested_tool_name": agent_action.tool,
|
|
413
|
+
"available_tool_names": list(name_to_tool_map.keys()),
|
|
414
|
+
},
|
|
415
|
+
verbose=self.verbose,
|
|
416
|
+
color=None,
|
|
417
|
+
callbacks=run_manager.get_child() if run_manager else None,
|
|
418
|
+
**tool_run_kwargs,
|
|
419
|
+
)
|
|
420
|
+
logger.warning(f"Invalid tool requested: {agent_action.tool}. Observation: {observation}")
|
|
421
|
+
return AgentStep(action=agent_action, observation=observation)
|
|
422
|
+
|
|
423
|
+
async def _preprocess_tool_input(self, tool_input: Any) -> Any:
|
|
424
|
+
"""Preprocess the tool input.
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
tool_input (Any): The tool input to preprocess.
|
|
428
|
+
|
|
429
|
+
Returns:
|
|
430
|
+
Any: The preprocessed tool input.
|
|
431
|
+
"""
|
|
432
|
+
return tool_input
|
|
433
|
+
|
|
434
|
+
async def _postprocess_tool_output(self, tool_output: Any) -> Any:
|
|
435
|
+
"""Postprocess the tool output.
|
|
436
|
+
|
|
437
|
+
Args:
|
|
438
|
+
tool_output (Any): The tool output to postprocess.
|
|
439
|
+
|
|
440
|
+
Returns:
|
|
441
|
+
Any: The postprocessed tool output.
|
|
442
|
+
"""
|
|
443
|
+
return tool_output
|
|
444
|
+
|
|
445
|
+
def _perform_agent_action(
|
|
446
|
+
self,
|
|
447
|
+
name_to_tool_map: dict[str, BaseTool],
|
|
448
|
+
color_mapping: dict[str, str],
|
|
449
|
+
agent_action: AgentAction,
|
|
450
|
+
run_manager: CallbackManagerForChainRun | None = None,
|
|
451
|
+
) -> AgentStep:
|
|
452
|
+
"""Synchronous agent action. (Not Implemented).
|
|
453
|
+
|
|
454
|
+
This method is intentionally not implemented to encourage asynchronous
|
|
455
|
+
operations. Please use the `_aperform_agent_action` method.
|
|
456
|
+
|
|
457
|
+
Args:
|
|
458
|
+
name_to_tool_map (dict[str, BaseTool]): Mapping of tool names to tools.
|
|
459
|
+
color_mapping (dict[str, str]): Mapping of tool names to colors.
|
|
460
|
+
agent_action (AgentAction): The action to execute.
|
|
461
|
+
run_manager (Optional[CallbackManagerForChainRun], optional): Callback manager.
|
|
462
|
+
Defaults to None.
|
|
463
|
+
|
|
464
|
+
Raises:
|
|
465
|
+
NotImplementedError: This method is not implemented.
|
|
466
|
+
"""
|
|
467
|
+
logger.warning(
|
|
468
|
+
"AgentExecutor synchronous '_perform_agent_action' was called but is not implemented. "
|
|
469
|
+
"Use '_aperform_agent_action' instead."
|
|
470
|
+
)
|
|
471
|
+
raise NotImplementedError(
|
|
472
|
+
"Synchronous agent action execution is not implemented. Please use the '_aperform_agent_action' method."
|
|
473
|
+
)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Defines the base class for agent executors.
|
|
2
|
+
|
|
3
|
+
Author:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class BaseExecutor(ABC):
|
|
12
|
+
"""Base class for agent executors.
|
|
13
|
+
|
|
14
|
+
This concrete base class provides a default structure for executing agents.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
None. This is an abstract base class that defines an interface.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def invoke(self, _inputs: dict[str, Any], **kwargs: Any) -> dict[str, Any]:
|
|
22
|
+
"""Invoke the agent executor.
|
|
23
|
+
|
|
24
|
+
Subclasses must implement this method with their specific implementation.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
_inputs: A dictionary of inputs for the executor.
|
|
28
|
+
**kwargs: Additional keyword arguments for customizing execution behavior.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
A dictionary containing the execution result.
|
|
32
|
+
"""
|
|
33
|
+
raise NotImplementedError("Subclasses must implement invoke()")
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
async def ainvoke(self, _inputs: dict[str, Any], **kwargs: Any) -> dict[str, Any]:
|
|
37
|
+
"""Asynchronously invoke the agent executor.
|
|
38
|
+
|
|
39
|
+
Subclasses must implement this method with their specific implementation.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
_inputs: A dictionary of inputs for the executor.
|
|
43
|
+
**kwargs: Additional keyword arguments for customizing execution behavior.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
A dictionary containing the execution result.
|
|
47
|
+
"""
|
|
48
|
+
raise NotImplementedError("Subclasses must implement ainvoke()")
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# flake8: noqa: F401
|
|
2
|
+
"""Guardrails package for content filtering and safety checks.
|
|
3
|
+
|
|
4
|
+
This package provides modular guardrail engines and managers for filtering
|
|
5
|
+
harmful content in AI agent interactions. All components support lazy loading
|
|
6
|
+
to work with optional dependencies.
|
|
7
|
+
|
|
8
|
+
Example:
|
|
9
|
+
Basic usage with a phrase matcher engine:
|
|
10
|
+
|
|
11
|
+
.. code-block:: python
|
|
12
|
+
|
|
13
|
+
from aip_agents.guardrails import GuardrailManager, GuardrailMiddleware
|
|
14
|
+
from aip_agents.guardrails.engines import PhraseMatcherEngine
|
|
15
|
+
from aip_agents.guardrails.schemas import GuardrailMode
|
|
16
|
+
|
|
17
|
+
# Create a guardrail engine
|
|
18
|
+
engine = PhraseMatcherEngine(
|
|
19
|
+
banned_phrases=["spam", "inappropriate"]
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# Create a manager
|
|
23
|
+
manager = GuardrailManager(engines=[engine])
|
|
24
|
+
|
|
25
|
+
# Create middleware for agent integration
|
|
26
|
+
middleware = GuardrailMiddleware(guardrail_manager=manager)
|
|
27
|
+
|
|
28
|
+
# Use with agent (components are lazy-loaded)
|
|
29
|
+
from aip_agents.agent import LangGraphReactAgent
|
|
30
|
+
agent = LangGraphReactAgent(
|
|
31
|
+
name="my_agent",
|
|
32
|
+
guardrail=manager,
|
|
33
|
+
# ... other agent config
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
Authors:
|
|
37
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from typing import TYPE_CHECKING, Any
|
|
41
|
+
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
from aip_agents.guardrails.exceptions import GuardrailViolationError
|
|
44
|
+
from aip_agents.guardrails.manager import GuardrailManager
|
|
45
|
+
from aip_agents.guardrails.middleware import GuardrailMiddleware
|
|
46
|
+
from aip_agents.guardrails.schemas import (
|
|
47
|
+
BaseGuardrailEngineConfig,
|
|
48
|
+
GuardrailInput,
|
|
49
|
+
GuardrailMode,
|
|
50
|
+
GuardrailResult,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
_IMPORT_MAP = {
|
|
55
|
+
"GuardrailViolationError": "aip_agents.guardrails.exceptions",
|
|
56
|
+
"GuardrailManager": "aip_agents.guardrails.manager",
|
|
57
|
+
"GuardrailMiddleware": "aip_agents.guardrails.middleware",
|
|
58
|
+
"BaseGuardrailEngineConfig": "aip_agents.guardrails.schemas",
|
|
59
|
+
"GuardrailMode": "aip_agents.guardrails.schemas",
|
|
60
|
+
"GuardrailInput": "aip_agents.guardrails.schemas",
|
|
61
|
+
"GuardrailResult": "aip_agents.guardrails.schemas",
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
_cache: dict[str, Any] = {}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def __getattr__(name: str) -> Any:
|
|
68
|
+
"""Lazy import components on first access."""
|
|
69
|
+
if name in _cache:
|
|
70
|
+
return _cache[name]
|
|
71
|
+
|
|
72
|
+
if name in _IMPORT_MAP:
|
|
73
|
+
try:
|
|
74
|
+
module = __import__(_IMPORT_MAP[name], fromlist=[name])
|
|
75
|
+
_cache[name] = getattr(module, name)
|
|
76
|
+
return _cache[name]
|
|
77
|
+
except ImportError as e:
|
|
78
|
+
raise ImportError(f"Failed to import {name}. Optional dependencies may be missing: {e}") from e
|
|
79
|
+
|
|
80
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
__all__ = list(_IMPORT_MAP.keys())
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from aip_agents.guardrails.exceptions import GuardrailViolationError as GuardrailViolationError
|
|
2
|
+
from aip_agents.guardrails.manager import GuardrailManager as GuardrailManager
|
|
3
|
+
from aip_agents.guardrails.middleware import GuardrailMiddleware as GuardrailMiddleware
|
|
4
|
+
from aip_agents.guardrails.schemas import BaseGuardrailEngineConfig as BaseGuardrailEngineConfig, GuardrailInput as GuardrailInput, GuardrailMode as GuardrailMode, GuardrailResult as GuardrailResult
|
|
5
|
+
|
|
6
|
+
__all__ = ['GuardrailViolationError', 'GuardrailManager', 'GuardrailMiddleware', 'BaseGuardrailEngineConfig', 'GuardrailMode', 'GuardrailInput', 'GuardrailResult']
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# flake8: noqa: F401
|
|
2
|
+
"""Guardrail engines package with lazy loading support.
|
|
3
|
+
|
|
4
|
+
This package provides guardrail engines that wrap GL SDK implementations.
|
|
5
|
+
Engines are loaded lazily to support optional dependencies.
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
Import and use guardrail engines:
|
|
9
|
+
|
|
10
|
+
.. code-block:: python
|
|
11
|
+
|
|
12
|
+
# Lazy import - works even if gllm-guardrail is not installed
|
|
13
|
+
from aip_agents.guardrails.engines import PhraseMatcherEngine, NemoGuardrailEngine
|
|
14
|
+
|
|
15
|
+
# Create a phrase matcher engine
|
|
16
|
+
phrase_engine = PhraseMatcherEngine(
|
|
17
|
+
banned_phrases=["spam", "inappropriate"]
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
# Create a NeMo guardrail engine (requires gllm-guardrail)
|
|
21
|
+
nemo_engine = NemoGuardrailEngine(
|
|
22
|
+
# NeMo-specific configuration
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Use with GuardrailManager
|
|
26
|
+
from aip_agents.guardrails import GuardrailManager
|
|
27
|
+
manager = GuardrailManager(engines=[phrase_engine, nemo_engine])
|
|
28
|
+
|
|
29
|
+
Note:
|
|
30
|
+
All engines support lazy loading. If `gllm-guardrail` is not installed,
|
|
31
|
+
importing these engines will raise an ImportError only when actually
|
|
32
|
+
instantiated, not at import time.
|
|
33
|
+
|
|
34
|
+
Authors:
|
|
35
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from typing import TYPE_CHECKING, Any
|
|
39
|
+
|
|
40
|
+
if TYPE_CHECKING:
|
|
41
|
+
from aip_agents.guardrails.engines.nemo import NemoGuardrailEngine
|
|
42
|
+
from aip_agents.guardrails.engines.phrase_matcher import PhraseMatcherEngine
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
_IMPORT_MAP = {
|
|
46
|
+
"NemoGuardrailEngine": "aip_agents.guardrails.engines.nemo",
|
|
47
|
+
"PhraseMatcherEngine": "aip_agents.guardrails.engines.phrase_matcher",
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
_cache: dict[str, Any] = {}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def __getattr__(name: str) -> Any:
|
|
54
|
+
"""Lazy import engines on first access."""
|
|
55
|
+
if name in _cache:
|
|
56
|
+
return _cache[name]
|
|
57
|
+
|
|
58
|
+
if name in _IMPORT_MAP:
|
|
59
|
+
try:
|
|
60
|
+
module = __import__(_IMPORT_MAP[name], fromlist=[name])
|
|
61
|
+
_cache[name] = getattr(module, name)
|
|
62
|
+
return _cache[name]
|
|
63
|
+
except ImportError as e:
|
|
64
|
+
raise ImportError(f"Failed to import {name}. Optional dependencies may be missing: {e}") from e
|
|
65
|
+
|
|
66
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
__all__ = list(_IMPORT_MAP.keys())
|