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,90 @@
|
|
|
1
|
+
"""Base interfaces and protocols for guardrail engines.
|
|
2
|
+
|
|
3
|
+
This module defines the base protocol that all guardrail engines must implement,
|
|
4
|
+
providing a consistent interface for content safety checking.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
8
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from abc import ABC, abstractmethod
|
|
12
|
+
from typing import Protocol
|
|
13
|
+
|
|
14
|
+
from aip_agents.guardrails.schemas import (
|
|
15
|
+
BaseGuardrailEngineConfig,
|
|
16
|
+
GuardrailResult,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GuardrailEngine(Protocol):
|
|
21
|
+
"""Protocol defining the interface for guardrail engines.
|
|
22
|
+
|
|
23
|
+
All guardrail engines must implement this protocol to be compatible
|
|
24
|
+
with GuardrailManager. Engines check content for safety violations.
|
|
25
|
+
|
|
26
|
+
Attributes:
|
|
27
|
+
config: Configuration for this engine's behavior
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
config: BaseGuardrailEngineConfig
|
|
31
|
+
|
|
32
|
+
@abstractmethod
|
|
33
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
34
|
+
"""Check user input content for safety violations.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
content: The user input content to check
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
GuardrailResult indicating if content is safe
|
|
41
|
+
"""
|
|
42
|
+
...
|
|
43
|
+
|
|
44
|
+
@abstractmethod
|
|
45
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
46
|
+
"""Check AI output content for safety violations.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
content: The AI output content to check
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
GuardrailResult indicating if content is safe
|
|
53
|
+
"""
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def model_dump(self) -> dict:
|
|
58
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class BaseGuardrailEngine(ABC):
|
|
63
|
+
"""Abstract base class for guardrail engines.
|
|
64
|
+
|
|
65
|
+
Provides common functionality and ensures proper configuration handling.
|
|
66
|
+
Concrete engines should inherit from this class.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
def __init__(self, config: BaseGuardrailEngineConfig | None = None) -> None:
|
|
70
|
+
"""Initialize the engine with configuration.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
config: Engine configuration. Uses defaults if None provided.
|
|
74
|
+
"""
|
|
75
|
+
self.config = config or BaseGuardrailEngineConfig()
|
|
76
|
+
|
|
77
|
+
@abstractmethod
|
|
78
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
79
|
+
"""Check user input content for safety violations."""
|
|
80
|
+
...
|
|
81
|
+
|
|
82
|
+
@abstractmethod
|
|
83
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
84
|
+
"""Check AI output content for safety violations."""
|
|
85
|
+
...
|
|
86
|
+
|
|
87
|
+
@abstractmethod
|
|
88
|
+
def model_dump(self) -> dict:
|
|
89
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
90
|
+
...
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from aip_agents.guardrails.schemas import BaseGuardrailEngineConfig as BaseGuardrailEngineConfig, GuardrailResult as GuardrailResult
|
|
4
|
+
from typing import Protocol
|
|
5
|
+
|
|
6
|
+
class GuardrailEngine(Protocol):
|
|
7
|
+
"""Protocol defining the interface for guardrail engines.
|
|
8
|
+
|
|
9
|
+
All guardrail engines must implement this protocol to be compatible
|
|
10
|
+
with GuardrailManager. Engines check content for safety violations.
|
|
11
|
+
|
|
12
|
+
Attributes:
|
|
13
|
+
config: Configuration for this engine's behavior
|
|
14
|
+
"""
|
|
15
|
+
config: BaseGuardrailEngineConfig
|
|
16
|
+
@abstractmethod
|
|
17
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
18
|
+
"""Check user input content for safety violations.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
content: The user input content to check
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
GuardrailResult indicating if content is safe
|
|
25
|
+
"""
|
|
26
|
+
@abstractmethod
|
|
27
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
28
|
+
"""Check AI output content for safety violations.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
content: The AI output content to check
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
GuardrailResult indicating if content is safe
|
|
35
|
+
"""
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def model_dump(self) -> dict:
|
|
38
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
39
|
+
|
|
40
|
+
class BaseGuardrailEngine(ABC):
|
|
41
|
+
"""Abstract base class for guardrail engines.
|
|
42
|
+
|
|
43
|
+
Provides common functionality and ensures proper configuration handling.
|
|
44
|
+
Concrete engines should inherit from this class.
|
|
45
|
+
"""
|
|
46
|
+
config: Incomplete
|
|
47
|
+
def __init__(self, config: BaseGuardrailEngineConfig | None = None) -> None:
|
|
48
|
+
"""Initialize the engine with configuration.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
config: Engine configuration. Uses defaults if None provided.
|
|
52
|
+
"""
|
|
53
|
+
@abstractmethod
|
|
54
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
55
|
+
"""Check user input content for safety violations."""
|
|
56
|
+
@abstractmethod
|
|
57
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
58
|
+
"""Check AI output content for safety violations."""
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def model_dump(self) -> dict:
|
|
61
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""NemoGuardrailEngine wrapper for GL SDK guardrails.
|
|
2
|
+
|
|
3
|
+
This module wraps the GL SDK's NemoGuardrailEngine to provide advanced
|
|
4
|
+
LLM-based content filtering capabilities.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from aip_agents.guardrails.engines.base import BaseGuardrailEngine
|
|
13
|
+
from aip_agents.guardrails.schemas import (
|
|
14
|
+
BaseGuardrailEngineConfig,
|
|
15
|
+
GuardrailResult,
|
|
16
|
+
)
|
|
17
|
+
from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class NemoGuardrailEngine(BaseGuardrailEngine):
|
|
21
|
+
"""Wrapper for GL SDK NemoGuardrailEngine with aip-agents interface.
|
|
22
|
+
|
|
23
|
+
This engine provides advanced LLM-based content filtering using NVIDIA's
|
|
24
|
+
NeMo Guardrails. It can detect more complex safety violations beyond
|
|
25
|
+
simple phrase matching.
|
|
26
|
+
|
|
27
|
+
Note: Import of gllm_guardrail is deferred to __init__ to support
|
|
28
|
+
lazy loading when guardrails are optional dependency.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, config: BaseGuardrailEngineConfig | None = None, **nemo_config: dict[str, Any]) -> None:
|
|
32
|
+
"""Initialize the NemoGuardrailEngine.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
config: Engine configuration. Uses defaults if None provided.
|
|
36
|
+
**nemo_config: Additional configuration passed to the underlying
|
|
37
|
+
NeMo engine (e.g., model paths, thresholds, etc.)
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
ImportError: If gllm-guardrail is not installed.
|
|
41
|
+
"""
|
|
42
|
+
super().__init__(config)
|
|
43
|
+
|
|
44
|
+
# Lazy import to support optional dependency and avoid import errors
|
|
45
|
+
# when gllm-guardrail is not installed
|
|
46
|
+
try:
|
|
47
|
+
from gllm_guardrail import NemoGuardrailEngine as GLNemoGuardrailEngine
|
|
48
|
+
from gllm_guardrail.engine.nemo_engine import NemoGuardrailEngineConfig as GLNemoGuardrailEngineConfig
|
|
49
|
+
except ImportError as e:
|
|
50
|
+
raise ImportError(
|
|
51
|
+
"gllm-guardrail is required for guardrails. Install with: pip install 'aip-agents[guardrails]'"
|
|
52
|
+
) from e
|
|
53
|
+
|
|
54
|
+
# Convert our GuardrailMode to GL SDK's GuardrailMode
|
|
55
|
+
gl_mode = convert_guardrail_mode_to_gl_sdk(self.config.guardrail_mode)
|
|
56
|
+
|
|
57
|
+
# Create GL SDK config with guardrail_mode and any additional NeMo config
|
|
58
|
+
# NemoGuardrailEngineConfig accepts guardrail_mode and other NeMo-specific params directly
|
|
59
|
+
gl_config = GLNemoGuardrailEngineConfig(guardrail_mode=gl_mode, **nemo_config)
|
|
60
|
+
|
|
61
|
+
# Initialize the underlying GL SDK engine
|
|
62
|
+
self._engine = GLNemoGuardrailEngine(config=gl_config)
|
|
63
|
+
|
|
64
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
65
|
+
"""Check user input content using wrapped GL SDK NeMo engine.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
content: The user input content to check
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
GuardrailResult indicating if content is safe
|
|
72
|
+
"""
|
|
73
|
+
gl_result = await self._engine.check_input(content)
|
|
74
|
+
return GuardrailResult(
|
|
75
|
+
is_safe=gl_result.is_safe,
|
|
76
|
+
reason=gl_result.reason,
|
|
77
|
+
filtered_content=gl_result.filtered_content,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
81
|
+
"""Check AI output content using wrapped GL SDK NeMo engine.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
content: The AI output content to check
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
GuardrailResult indicating if content is safe
|
|
88
|
+
"""
|
|
89
|
+
gl_result = await self._engine.check_output(content)
|
|
90
|
+
return GuardrailResult(
|
|
91
|
+
is_safe=gl_result.is_safe,
|
|
92
|
+
reason=gl_result.reason,
|
|
93
|
+
filtered_content=gl_result.filtered_content,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
def model_dump(self) -> dict:
|
|
97
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
98
|
+
return {
|
|
99
|
+
"type": "nemo",
|
|
100
|
+
"config": self._engine.config.model_dump(),
|
|
101
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from aip_agents.guardrails.engines.base import BaseGuardrailEngine as BaseGuardrailEngine
|
|
2
|
+
from aip_agents.guardrails.schemas import BaseGuardrailEngineConfig as BaseGuardrailEngineConfig, GuardrailResult as GuardrailResult
|
|
3
|
+
from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk as convert_guardrail_mode_to_gl_sdk
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
class NemoGuardrailEngine(BaseGuardrailEngine):
|
|
7
|
+
"""Wrapper for GL SDK NemoGuardrailEngine with aip-agents interface.
|
|
8
|
+
|
|
9
|
+
This engine provides advanced LLM-based content filtering using NVIDIA's
|
|
10
|
+
NeMo Guardrails. It can detect more complex safety violations beyond
|
|
11
|
+
simple phrase matching.
|
|
12
|
+
|
|
13
|
+
Note: Import of gllm_guardrail is deferred to __init__ to support
|
|
14
|
+
lazy loading when guardrails are optional dependency.
|
|
15
|
+
"""
|
|
16
|
+
def __init__(self, config: BaseGuardrailEngineConfig | None = None, **nemo_config: dict[str, Any]) -> None:
|
|
17
|
+
"""Initialize the NemoGuardrailEngine.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
config: Engine configuration. Uses defaults if None provided.
|
|
21
|
+
**nemo_config: Additional configuration passed to the underlying
|
|
22
|
+
NeMo engine (e.g., model paths, thresholds, etc.)
|
|
23
|
+
|
|
24
|
+
Raises:
|
|
25
|
+
ImportError: If gllm-guardrail is not installed.
|
|
26
|
+
"""
|
|
27
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
28
|
+
"""Check user input content using wrapped GL SDK NeMo engine.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
content: The user input content to check
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
GuardrailResult indicating if content is safe
|
|
35
|
+
"""
|
|
36
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
37
|
+
"""Check AI output content using wrapped GL SDK NeMo engine.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
content: The AI output content to check
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
GuardrailResult indicating if content is safe
|
|
44
|
+
"""
|
|
45
|
+
def model_dump(self) -> dict:
|
|
46
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""PhraseMatcherEngine wrapper for GL SDK guardrails.
|
|
2
|
+
|
|
3
|
+
This module wraps the GL SDK's PhraseMatcherEngine to provide a consistent
|
|
4
|
+
interface for the aip-agents guardrails system.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from aip_agents.guardrails.engines.base import BaseGuardrailEngine
|
|
11
|
+
from aip_agents.guardrails.schemas import (
|
|
12
|
+
BaseGuardrailEngineConfig,
|
|
13
|
+
GuardrailResult,
|
|
14
|
+
)
|
|
15
|
+
from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class PhraseMatcherEngine(BaseGuardrailEngine):
|
|
19
|
+
"""Wrapper for GL SDK PhraseMatcherEngine with aip-agents interface.
|
|
20
|
+
|
|
21
|
+
This engine performs rule-based banned phrase detection using the
|
|
22
|
+
GL SDK's PhraseMatcherEngine. It checks for exact phrase matches
|
|
23
|
+
and blocks content containing banned phrases.
|
|
24
|
+
|
|
25
|
+
Note: Import of gllm_guardrail is deferred to __init__ to support
|
|
26
|
+
lazy loading when guardrails are optional dependency.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
config: BaseGuardrailEngineConfig | None = None,
|
|
32
|
+
banned_phrases: list[str] | None = None,
|
|
33
|
+
) -> None:
|
|
34
|
+
"""Initialize the PhraseMatcherEngine.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
config: Engine configuration. Uses defaults if None provided.
|
|
38
|
+
banned_phrases: List of phrases that should trigger blocking.
|
|
39
|
+
Defaults to empty list if None provided.
|
|
40
|
+
|
|
41
|
+
Raises:
|
|
42
|
+
ImportError: If gllm-guardrail is not installed.
|
|
43
|
+
"""
|
|
44
|
+
super().__init__(config)
|
|
45
|
+
|
|
46
|
+
# Lazy import to support optional dependency and avoid import errors
|
|
47
|
+
# when gllm-guardrail is not installed
|
|
48
|
+
try:
|
|
49
|
+
from gllm_guardrail import PhraseMatcherEngine as GLPhraseMatcherEngine
|
|
50
|
+
from gllm_guardrail.engine.base_engine import BaseGuardrailEngineConfig as GLBaseGuardrailEngineConfig
|
|
51
|
+
except ImportError as e:
|
|
52
|
+
raise ImportError(
|
|
53
|
+
"gllm-guardrail is required for guardrails. Install with: pip install 'aip-agents[guardrails]'"
|
|
54
|
+
) from e
|
|
55
|
+
|
|
56
|
+
# Convert our GuardrailMode to GL SDK's GuardrailMode
|
|
57
|
+
gl_mode = convert_guardrail_mode_to_gl_sdk(self.config.guardrail_mode)
|
|
58
|
+
|
|
59
|
+
# Create GL SDK config
|
|
60
|
+
gl_config = GLBaseGuardrailEngineConfig(guardrail_mode=gl_mode)
|
|
61
|
+
|
|
62
|
+
# Initialize the underlying GL SDK engine
|
|
63
|
+
self._engine = GLPhraseMatcherEngine(
|
|
64
|
+
config=gl_config,
|
|
65
|
+
banned_phrases=banned_phrases or [],
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def banned_phrases(self) -> list[str]:
|
|
70
|
+
"""Get the list of banned phrases."""
|
|
71
|
+
return self._engine.banned_phrases
|
|
72
|
+
|
|
73
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
74
|
+
"""Check user input content using wrapped GL SDK engine.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
content: The user input content to check
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
GuardrailResult indicating if content is safe
|
|
81
|
+
"""
|
|
82
|
+
gl_result = await self._engine.check_input(content)
|
|
83
|
+
return GuardrailResult(
|
|
84
|
+
is_safe=gl_result.is_safe,
|
|
85
|
+
reason=gl_result.reason,
|
|
86
|
+
filtered_content=gl_result.filtered_content,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
90
|
+
"""Check AI output content using wrapped GL SDK engine.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
content: The AI output content to check
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
GuardrailResult indicating if content is safe
|
|
97
|
+
"""
|
|
98
|
+
gl_result = await self._engine.check_output(content)
|
|
99
|
+
return GuardrailResult(
|
|
100
|
+
is_safe=gl_result.is_safe,
|
|
101
|
+
reason=gl_result.reason,
|
|
102
|
+
filtered_content=gl_result.filtered_content,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
def model_dump(self) -> dict:
|
|
106
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
107
|
+
return {
|
|
108
|
+
"type": "phrase_matcher",
|
|
109
|
+
"config": {
|
|
110
|
+
**self.config.model_dump(),
|
|
111
|
+
"banned_phrases": self.banned_phrases,
|
|
112
|
+
},
|
|
113
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from aip_agents.guardrails.engines.base import BaseGuardrailEngine as BaseGuardrailEngine
|
|
2
|
+
from aip_agents.guardrails.schemas import BaseGuardrailEngineConfig as BaseGuardrailEngineConfig, GuardrailResult as GuardrailResult
|
|
3
|
+
from aip_agents.guardrails.utils import convert_guardrail_mode_to_gl_sdk as convert_guardrail_mode_to_gl_sdk
|
|
4
|
+
|
|
5
|
+
class PhraseMatcherEngine(BaseGuardrailEngine):
|
|
6
|
+
"""Wrapper for GL SDK PhraseMatcherEngine with aip-agents interface.
|
|
7
|
+
|
|
8
|
+
This engine performs rule-based banned phrase detection using the
|
|
9
|
+
GL SDK's PhraseMatcherEngine. It checks for exact phrase matches
|
|
10
|
+
and blocks content containing banned phrases.
|
|
11
|
+
|
|
12
|
+
Note: Import of gllm_guardrail is deferred to __init__ to support
|
|
13
|
+
lazy loading when guardrails are optional dependency.
|
|
14
|
+
"""
|
|
15
|
+
def __init__(self, config: BaseGuardrailEngineConfig | None = None, banned_phrases: list[str] | None = None) -> None:
|
|
16
|
+
"""Initialize the PhraseMatcherEngine.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
config: Engine configuration. Uses defaults if None provided.
|
|
20
|
+
banned_phrases: List of phrases that should trigger blocking.
|
|
21
|
+
Defaults to empty list if None provided.
|
|
22
|
+
|
|
23
|
+
Raises:
|
|
24
|
+
ImportError: If gllm-guardrail is not installed.
|
|
25
|
+
"""
|
|
26
|
+
@property
|
|
27
|
+
def banned_phrases(self) -> list[str]:
|
|
28
|
+
"""Get the list of banned phrases."""
|
|
29
|
+
async def check_input(self, content: str) -> GuardrailResult:
|
|
30
|
+
"""Check user input content using wrapped GL SDK engine.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
content: The user input content to check
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
GuardrailResult indicating if content is safe
|
|
37
|
+
"""
|
|
38
|
+
async def check_output(self, content: str) -> GuardrailResult:
|
|
39
|
+
"""Check AI output content using wrapped GL SDK engine.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
content: The AI output content to check
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
GuardrailResult indicating if content is safe
|
|
46
|
+
"""
|
|
47
|
+
def model_dump(self) -> dict:
|
|
48
|
+
"""Serialize engine configuration into a JSON-compatible dictionary."""
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Exceptions raised by the guardrails system.
|
|
2
|
+
|
|
3
|
+
This module defines custom exceptions that are raised when guardrail
|
|
4
|
+
violations occur or when guardrail operations fail.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from aip_agents.guardrails.schemas import GuardrailResult
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class GuardrailViolationError(Exception):
|
|
14
|
+
"""Exception raised when unsafe content is detected by guardrails.
|
|
15
|
+
|
|
16
|
+
This exception is raised by GuardrailMiddleware when content violates
|
|
17
|
+
safety policies. It contains the GuardrailResult with details about
|
|
18
|
+
why the content was blocked.
|
|
19
|
+
|
|
20
|
+
Attributes:
|
|
21
|
+
result: The GuardrailResult containing safety check details
|
|
22
|
+
message: Human-readable error message
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, result: GuardrailResult, message: str | None = None) -> None:
|
|
26
|
+
"""Initialize the exception.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
result: The GuardrailResult from the failed safety check
|
|
30
|
+
message: Optional custom error message
|
|
31
|
+
"""
|
|
32
|
+
self.result = result
|
|
33
|
+
self.message = message or f"Content blocked by guardrails: {result.reason}"
|
|
34
|
+
|
|
35
|
+
super().__init__(self.message)
|
|
36
|
+
|
|
37
|
+
def __str__(self) -> str:
|
|
38
|
+
"""Return string representation of the exception."""
|
|
39
|
+
return self.message
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.guardrails.schemas import GuardrailResult as GuardrailResult
|
|
3
|
+
|
|
4
|
+
class GuardrailViolationError(Exception):
|
|
5
|
+
"""Exception raised when unsafe content is detected by guardrails.
|
|
6
|
+
|
|
7
|
+
This exception is raised by GuardrailMiddleware when content violates
|
|
8
|
+
safety policies. It contains the GuardrailResult with details about
|
|
9
|
+
why the content was blocked.
|
|
10
|
+
|
|
11
|
+
Attributes:
|
|
12
|
+
result: The GuardrailResult containing safety check details
|
|
13
|
+
message: Human-readable error message
|
|
14
|
+
"""
|
|
15
|
+
result: Incomplete
|
|
16
|
+
message: Incomplete
|
|
17
|
+
def __init__(self, result: GuardrailResult, message: str | None = None) -> None:
|
|
18
|
+
"""Initialize the exception.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
result: The GuardrailResult from the failed safety check
|
|
22
|
+
message: Optional custom error message
|
|
23
|
+
"""
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""GuardrailManager for orchestrating multiple guardrail engines.
|
|
2
|
+
|
|
3
|
+
This module provides the GuardrailManager class that coordinates multiple
|
|
4
|
+
guardrail engines with fail-fast behavior.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
|
+
|
|
14
|
+
from aip_agents.guardrails.schemas import GuardrailInput, GuardrailMode, GuardrailResult
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from aip_agents.guardrails.engines.base import GuardrailEngine
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GuardrailManager:
|
|
21
|
+
"""Orchestrates multiple guardrail engines with fail-fast behavior.
|
|
22
|
+
|
|
23
|
+
The manager accepts one or more guardrail engines and runs them in sequence.
|
|
24
|
+
If any engine reports unsafe content, execution stops immediately (fail-fast)
|
|
25
|
+
and returns the violation result.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
engines: List of guardrail engines to orchestrate
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
engine: GuardrailEngine | list[GuardrailEngine] | None = None,
|
|
34
|
+
engines: list[GuardrailEngine] | None = None,
|
|
35
|
+
) -> None:
|
|
36
|
+
"""Initialize the GuardrailManager.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
engine: Single guardrail engine to use
|
|
40
|
+
engines: List of guardrail engines to use
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
ValueError: If both engine and engines are provided
|
|
44
|
+
"""
|
|
45
|
+
self.enabled = True
|
|
46
|
+
if engine is not None and engines is not None:
|
|
47
|
+
raise ValueError("Cannot specify both 'engine' and 'engines'")
|
|
48
|
+
|
|
49
|
+
if engine is not None:
|
|
50
|
+
if isinstance(engine, list):
|
|
51
|
+
self.engines = engine
|
|
52
|
+
else:
|
|
53
|
+
self.engines = [engine]
|
|
54
|
+
elif engines is not None:
|
|
55
|
+
self.engines = engines
|
|
56
|
+
else:
|
|
57
|
+
self.engines = []
|
|
58
|
+
|
|
59
|
+
def model_dump(self) -> dict[str, Any]:
|
|
60
|
+
"""Serialize manager configuration into a JSON-compatible dictionary."""
|
|
61
|
+
return {
|
|
62
|
+
"enabled": self.enabled,
|
|
63
|
+
"engines": [engine.model_dump() for engine in self.engines],
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async def check_content(self, content: str | GuardrailInput) -> GuardrailResult:
|
|
67
|
+
"""Check content against all registered engines.
|
|
68
|
+
|
|
69
|
+
Executes engines in order with fail-fast behavior. If any engine
|
|
70
|
+
reports unsafe content, returns immediately with that result.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
content: Content to check. Can be a string (treated as input-only)
|
|
74
|
+
or GuardrailInput with input/output fields.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
GuardrailResult indicating if content passed all checks
|
|
78
|
+
"""
|
|
79
|
+
# Normalize input to GuardrailInput
|
|
80
|
+
guardrail_input = self._normalize_content(content)
|
|
81
|
+
|
|
82
|
+
# Execute engines in order (fail-fast on first unsafe result)
|
|
83
|
+
for engine in self.engines:
|
|
84
|
+
result = await self._check_engine(engine, guardrail_input)
|
|
85
|
+
if result is not None:
|
|
86
|
+
return result
|
|
87
|
+
|
|
88
|
+
# All engines passed
|
|
89
|
+
return GuardrailResult(is_safe=True, reason=None, filtered_content=None)
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def _normalize_content(content: str | GuardrailInput) -> GuardrailInput:
|
|
93
|
+
"""Normalize content input to GuardrailInput.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
content: Content to normalize
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
GuardrailInput object
|
|
100
|
+
"""
|
|
101
|
+
if isinstance(content, str):
|
|
102
|
+
return GuardrailInput(input=content, output=None)
|
|
103
|
+
return content
|
|
104
|
+
|
|
105
|
+
async def _check_engine(self, engine: GuardrailEngine, guardrail_input: GuardrailInput) -> GuardrailResult | None:
|
|
106
|
+
"""Check content against a single engine.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
engine: The guardrail engine to check against
|
|
110
|
+
guardrail_input: The content to check
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
GuardrailResult if unsafe content detected, None if safe
|
|
114
|
+
"""
|
|
115
|
+
engine_mode = engine.config.guardrail_mode
|
|
116
|
+
|
|
117
|
+
# Skip disabled engines
|
|
118
|
+
if engine_mode == GuardrailMode.DISABLED:
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
if self._should_check_input(engine_mode, guardrail_input) and guardrail_input.input is not None:
|
|
122
|
+
result = await engine.check_input(guardrail_input.input)
|
|
123
|
+
if not result.is_safe:
|
|
124
|
+
return result
|
|
125
|
+
|
|
126
|
+
if self._should_check_output(engine_mode, guardrail_input) and guardrail_input.output is not None:
|
|
127
|
+
result = await engine.check_output(guardrail_input.output)
|
|
128
|
+
if not result.is_safe:
|
|
129
|
+
return result
|
|
130
|
+
|
|
131
|
+
return None
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def _should_check_input(engine_mode: GuardrailMode, guardrail_input: GuardrailInput) -> bool:
|
|
135
|
+
"""Determine if input should be checked based on engine mode.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
engine_mode: The guardrail mode of the engine
|
|
139
|
+
guardrail_input: The content to check
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
True if input should be checked, False otherwise
|
|
143
|
+
"""
|
|
144
|
+
return guardrail_input.input is not None and engine_mode in (
|
|
145
|
+
GuardrailMode.INPUT_ONLY,
|
|
146
|
+
GuardrailMode.INPUT_OUTPUT,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
@staticmethod
|
|
150
|
+
def _should_check_output(engine_mode: GuardrailMode, guardrail_input: GuardrailInput) -> bool:
|
|
151
|
+
"""Determine if output should be checked based on engine mode.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
engine_mode: The guardrail mode of the engine
|
|
155
|
+
guardrail_input: The content to check
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
True if output should be checked, False otherwise
|
|
159
|
+
"""
|
|
160
|
+
return guardrail_input.output is not None and engine_mode in (
|
|
161
|
+
GuardrailMode.OUTPUT_ONLY,
|
|
162
|
+
GuardrailMode.INPUT_OUTPUT,
|
|
163
|
+
)
|