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.
- 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,42 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.guardrails.engines.base import GuardrailEngine as GuardrailEngine
|
|
3
|
+
from aip_agents.guardrails.schemas import GuardrailInput as GuardrailInput, GuardrailMode as GuardrailMode, GuardrailResult as GuardrailResult
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
class GuardrailManager:
|
|
7
|
+
"""Orchestrates multiple guardrail engines with fail-fast behavior.
|
|
8
|
+
|
|
9
|
+
The manager accepts one or more guardrail engines and runs them in sequence.
|
|
10
|
+
If any engine reports unsafe content, execution stops immediately (fail-fast)
|
|
11
|
+
and returns the violation result.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
engines: List of guardrail engines to orchestrate
|
|
15
|
+
"""
|
|
16
|
+
enabled: bool
|
|
17
|
+
engines: Incomplete
|
|
18
|
+
def __init__(self, engine: GuardrailEngine | list[GuardrailEngine] | None = None, engines: list[GuardrailEngine] | None = None) -> None:
|
|
19
|
+
"""Initialize the GuardrailManager.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
engine: Single guardrail engine to use
|
|
23
|
+
engines: List of guardrail engines to use
|
|
24
|
+
|
|
25
|
+
Raises:
|
|
26
|
+
ValueError: If both engine and engines are provided
|
|
27
|
+
"""
|
|
28
|
+
def model_dump(self) -> dict[str, Any]:
|
|
29
|
+
"""Serialize manager configuration into a JSON-compatible dictionary."""
|
|
30
|
+
async def check_content(self, content: str | GuardrailInput) -> GuardrailResult:
|
|
31
|
+
"""Check content against all registered engines.
|
|
32
|
+
|
|
33
|
+
Executes engines in order with fail-fast behavior. If any engine
|
|
34
|
+
reports unsafe content, returns immediately with that result.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
content: Content to check. Can be a string (treated as input-only)
|
|
38
|
+
or GuardrailInput with input/output fields.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
GuardrailResult indicating if content passed all checks
|
|
42
|
+
"""
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""GuardrailMiddleware for integrating guardrails into agent execution.
|
|
2
|
+
|
|
3
|
+
This module provides GuardrailMiddleware that hooks into the agent execution
|
|
4
|
+
flow to automatically check content before and after model invocations.
|
|
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 langchain_core.messages import AIMessage, HumanMessage
|
|
15
|
+
|
|
16
|
+
from aip_agents.guardrails.exceptions import GuardrailViolationError
|
|
17
|
+
from aip_agents.guardrails.schemas import GuardrailInput
|
|
18
|
+
from aip_agents.middleware.base import AgentMiddleware, ModelRequest
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from aip_agents.guardrails.manager import GuardrailManager
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class GuardrailMiddleware(AgentMiddleware):
|
|
25
|
+
"""Middleware that integrates guardrails into agent execution.
|
|
26
|
+
|
|
27
|
+
This middleware wraps a GuardrailManager and automatically checks content
|
|
28
|
+
at appropriate points during agent execution:
|
|
29
|
+
|
|
30
|
+
- Before model invocation: checks user input from messages
|
|
31
|
+
- After model invocation: checks AI output from messages
|
|
32
|
+
|
|
33
|
+
If unsafe content is detected, raises GuardrailViolationError to stop execution.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
guardrail_manager: The GuardrailManager to use for content checking
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, guardrail_manager: GuardrailManager) -> None:
|
|
40
|
+
"""Initialize the GuardrailMiddleware.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
guardrail_manager: GuardrailManager instance to use for checking
|
|
44
|
+
"""
|
|
45
|
+
self.guardrail_manager = guardrail_manager
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def tools(self) -> list:
|
|
49
|
+
"""Guardrails are passive filters and don't contribute tools."""
|
|
50
|
+
return []
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def system_prompt_additions(self) -> str | None:
|
|
54
|
+
"""Guardrails are passive filters and don't modify system prompts."""
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
async def abefore_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
58
|
+
"""Asynchronously check user input before model invocation.
|
|
59
|
+
|
|
60
|
+
Extracts the last user message from state and checks it with guardrails.
|
|
61
|
+
If unsafe, raises GuardrailViolationError to stop execution.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
state: Current agent state containing messages and context
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Empty dict (no state modifications needed)
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
GuardrailViolationError: If user input violates safety policies
|
|
71
|
+
"""
|
|
72
|
+
# Extract last user message from state
|
|
73
|
+
messages = state.get("messages", [])
|
|
74
|
+
user_input = self._extract_last_user_message(messages)
|
|
75
|
+
|
|
76
|
+
if user_input is not None:
|
|
77
|
+
# Check input content
|
|
78
|
+
result = await self.guardrail_manager.check_content(user_input)
|
|
79
|
+
|
|
80
|
+
if not result.is_safe:
|
|
81
|
+
raise GuardrailViolationError(result)
|
|
82
|
+
|
|
83
|
+
return {}
|
|
84
|
+
|
|
85
|
+
def before_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
86
|
+
"""Check user input before model invocation (synchronous wrapper).
|
|
87
|
+
|
|
88
|
+
Note:
|
|
89
|
+
This is a synchronous wrapper for the async `abefore_model()` method.
|
|
90
|
+
LangGraph agents primarily use `abefore_model()` in async contexts.
|
|
91
|
+
This method should rarely be called directly. If called from an async
|
|
92
|
+
context with a running event loop, it will attempt to handle it,
|
|
93
|
+
but `abefore_model()` should be preferred.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
state: Current agent state containing messages and context
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Empty dict (no state modifications needed)
|
|
100
|
+
|
|
101
|
+
Raises:
|
|
102
|
+
GuardrailViolationError: If user input violates safety policies
|
|
103
|
+
"""
|
|
104
|
+
import asyncio
|
|
105
|
+
|
|
106
|
+
user_input = self._extract_last_user_message(state.get("messages", []))
|
|
107
|
+
if user_input is None:
|
|
108
|
+
return {}
|
|
109
|
+
|
|
110
|
+
# Check if we're in an async context with a running loop
|
|
111
|
+
try:
|
|
112
|
+
loop = asyncio.get_running_loop()
|
|
113
|
+
if loop.is_running():
|
|
114
|
+
# We're in an async context with a running loop
|
|
115
|
+
# Use nest_asyncio to allow nested event loops
|
|
116
|
+
# This enables calling asyncio.run() from within a running loop
|
|
117
|
+
import nest_asyncio
|
|
118
|
+
|
|
119
|
+
nest_asyncio.apply()
|
|
120
|
+
result = asyncio.run(self.guardrail_manager.check_content(user_input))
|
|
121
|
+
else:
|
|
122
|
+
# Loop exists but not running - safe to use asyncio.run()
|
|
123
|
+
result = asyncio.run(self.guardrail_manager.check_content(user_input))
|
|
124
|
+
except RuntimeError:
|
|
125
|
+
# No running loop - safe to use asyncio.run()
|
|
126
|
+
result = asyncio.run(self.guardrail_manager.check_content(user_input))
|
|
127
|
+
|
|
128
|
+
if not result.is_safe:
|
|
129
|
+
raise GuardrailViolationError(result)
|
|
130
|
+
|
|
131
|
+
return {}
|
|
132
|
+
|
|
133
|
+
def modify_model_request(self, request: ModelRequest, state: dict[str, Any]) -> ModelRequest:
|
|
134
|
+
"""Guardrails don't modify model requests."""
|
|
135
|
+
return request
|
|
136
|
+
|
|
137
|
+
async def aafter_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
138
|
+
"""Asynchronously check AI output after model invocation.
|
|
139
|
+
|
|
140
|
+
Extracts the last AI message from state and checks it with guardrails.
|
|
141
|
+
If unsafe, raises GuardrailViolationError to stop execution.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
state: Current agent state after model invocation
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Empty dict (no state modifications needed)
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
GuardrailViolationError: If AI output violates safety policies
|
|
151
|
+
"""
|
|
152
|
+
# Extract last AI message from state
|
|
153
|
+
messages = state.get("messages", [])
|
|
154
|
+
ai_output = self._extract_last_ai_message(messages)
|
|
155
|
+
|
|
156
|
+
if ai_output is not None:
|
|
157
|
+
# Check output content
|
|
158
|
+
result = await self.guardrail_manager.check_content(GuardrailInput(input=None, output=ai_output))
|
|
159
|
+
|
|
160
|
+
if not result.is_safe:
|
|
161
|
+
raise GuardrailViolationError(result)
|
|
162
|
+
|
|
163
|
+
return {}
|
|
164
|
+
|
|
165
|
+
def after_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
166
|
+
"""Check AI output after model invocation (synchronous wrapper)."""
|
|
167
|
+
return {}
|
|
168
|
+
|
|
169
|
+
def _extract_last_user_message(self, messages: list) -> str | None:
|
|
170
|
+
"""Extract the last user message from a list of messages.
|
|
171
|
+
|
|
172
|
+
Searches backwards through messages to find the most recent HumanMessage.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
messages: List of message objects
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Content of the last user message, or None if not found
|
|
179
|
+
"""
|
|
180
|
+
for message in reversed(messages):
|
|
181
|
+
if isinstance(message, HumanMessage) and message.content:
|
|
182
|
+
return str(message.content)
|
|
183
|
+
return None
|
|
184
|
+
|
|
185
|
+
def _extract_last_ai_message(self, messages: list) -> str | None:
|
|
186
|
+
"""Extract the last AI message from a list of messages.
|
|
187
|
+
|
|
188
|
+
Searches backwards through messages to find the most recent AIMessage.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
messages: List of message objects
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
Content of the last AI message, or None if not found
|
|
195
|
+
"""
|
|
196
|
+
for message in reversed(messages):
|
|
197
|
+
if isinstance(message, AIMessage) and message.content:
|
|
198
|
+
return str(message.content)
|
|
199
|
+
return None
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.guardrails.exceptions import GuardrailViolationError as GuardrailViolationError
|
|
3
|
+
from aip_agents.guardrails.manager import GuardrailManager as GuardrailManager
|
|
4
|
+
from aip_agents.guardrails.schemas import GuardrailInput as GuardrailInput
|
|
5
|
+
from aip_agents.middleware.base import AgentMiddleware as AgentMiddleware, ModelRequest as ModelRequest
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
class GuardrailMiddleware(AgentMiddleware):
|
|
9
|
+
"""Middleware that integrates guardrails into agent execution.
|
|
10
|
+
|
|
11
|
+
This middleware wraps a GuardrailManager and automatically checks content
|
|
12
|
+
at appropriate points during agent execution:
|
|
13
|
+
|
|
14
|
+
- Before model invocation: checks user input from messages
|
|
15
|
+
- After model invocation: checks AI output from messages
|
|
16
|
+
|
|
17
|
+
If unsafe content is detected, raises GuardrailViolationError to stop execution.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
guardrail_manager: The GuardrailManager to use for content checking
|
|
21
|
+
"""
|
|
22
|
+
guardrail_manager: Incomplete
|
|
23
|
+
def __init__(self, guardrail_manager: GuardrailManager) -> None:
|
|
24
|
+
"""Initialize the GuardrailMiddleware.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
guardrail_manager: GuardrailManager instance to use for checking
|
|
28
|
+
"""
|
|
29
|
+
@property
|
|
30
|
+
def tools(self) -> list:
|
|
31
|
+
"""Guardrails are passive filters and don't contribute tools."""
|
|
32
|
+
@property
|
|
33
|
+
def system_prompt_additions(self) -> str | None:
|
|
34
|
+
"""Guardrails are passive filters and don't modify system prompts."""
|
|
35
|
+
async def abefore_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
36
|
+
"""Asynchronously check user input before model invocation.
|
|
37
|
+
|
|
38
|
+
Extracts the last user message from state and checks it with guardrails.
|
|
39
|
+
If unsafe, raises GuardrailViolationError to stop execution.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
state: Current agent state containing messages and context
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Empty dict (no state modifications needed)
|
|
46
|
+
|
|
47
|
+
Raises:
|
|
48
|
+
GuardrailViolationError: If user input violates safety policies
|
|
49
|
+
"""
|
|
50
|
+
def before_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
51
|
+
"""Check user input before model invocation (synchronous wrapper).
|
|
52
|
+
|
|
53
|
+
Note:
|
|
54
|
+
This is a synchronous wrapper for the async `abefore_model()` method.
|
|
55
|
+
LangGraph agents primarily use `abefore_model()` in async contexts.
|
|
56
|
+
This method should rarely be called directly. If called from an async
|
|
57
|
+
context with a running event loop, it will attempt to handle it,
|
|
58
|
+
but `abefore_model()` should be preferred.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
state: Current agent state containing messages and context
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
Empty dict (no state modifications needed)
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
GuardrailViolationError: If user input violates safety policies
|
|
68
|
+
"""
|
|
69
|
+
def modify_model_request(self, request: ModelRequest, state: dict[str, Any]) -> ModelRequest:
|
|
70
|
+
"""Guardrails don't modify model requests."""
|
|
71
|
+
async def aafter_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
72
|
+
"""Asynchronously check AI output after model invocation.
|
|
73
|
+
|
|
74
|
+
Extracts the last AI message from state and checks it with guardrails.
|
|
75
|
+
If unsafe, raises GuardrailViolationError to stop execution.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
state: Current agent state after model invocation
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
Empty dict (no state modifications needed)
|
|
82
|
+
|
|
83
|
+
Raises:
|
|
84
|
+
GuardrailViolationError: If AI output violates safety policies
|
|
85
|
+
"""
|
|
86
|
+
def after_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
87
|
+
"""Check AI output after model invocation (synchronous wrapper)."""
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Schemas for guardrail input, output, and configuration.
|
|
2
|
+
|
|
3
|
+
This module defines the data structures used throughout the guardrails system,
|
|
4
|
+
including input/output schemas and configuration objects.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from enum import StrEnum
|
|
11
|
+
|
|
12
|
+
from pydantic import BaseModel, ConfigDict
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class GuardrailMode(StrEnum):
|
|
16
|
+
"""Modes determining what content an engine checks."""
|
|
17
|
+
|
|
18
|
+
INPUT_ONLY = "input_only"
|
|
19
|
+
OUTPUT_ONLY = "output_only"
|
|
20
|
+
INPUT_OUTPUT = "input_output"
|
|
21
|
+
DISABLED = "disabled"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class GuardrailInput(BaseModel):
|
|
25
|
+
"""Input schema for guardrail checks.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
input: User input content to check (queries, prompts, context)
|
|
29
|
+
output: AI output content to check (responses, generated text)
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
model_config = ConfigDict(extra="forbid")
|
|
33
|
+
|
|
34
|
+
input: str | None = None
|
|
35
|
+
output: str | None = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class GuardrailResult(BaseModel):
|
|
39
|
+
"""Result schema returned by guardrail engines and managers.
|
|
40
|
+
|
|
41
|
+
Attributes:
|
|
42
|
+
is_safe: Whether the content passed all checks
|
|
43
|
+
reason: Explanation when content is blocked (None if safe)
|
|
44
|
+
filtered_content: Cleaned/sanitized content if engine provides it
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
model_config = ConfigDict(extra="forbid")
|
|
48
|
+
|
|
49
|
+
is_safe: bool
|
|
50
|
+
reason: str | None = None
|
|
51
|
+
filtered_content: str | None = None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class BaseGuardrailEngineConfig(BaseModel):
|
|
55
|
+
"""Base configuration for guardrail engines.
|
|
56
|
+
|
|
57
|
+
Attributes:
|
|
58
|
+
guardrail_mode: What content this engine should check
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
model_config = ConfigDict(extra="forbid")
|
|
62
|
+
|
|
63
|
+
guardrail_mode: GuardrailMode = GuardrailMode.INPUT_OUTPUT
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from enum import StrEnum
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
class GuardrailMode(StrEnum):
|
|
6
|
+
"""Modes determining what content an engine checks."""
|
|
7
|
+
INPUT_ONLY: str
|
|
8
|
+
OUTPUT_ONLY: str
|
|
9
|
+
INPUT_OUTPUT: str
|
|
10
|
+
DISABLED: str
|
|
11
|
+
|
|
12
|
+
class GuardrailInput(BaseModel):
|
|
13
|
+
"""Input schema for guardrail checks.
|
|
14
|
+
|
|
15
|
+
Attributes:
|
|
16
|
+
input: User input content to check (queries, prompts, context)
|
|
17
|
+
output: AI output content to check (responses, generated text)
|
|
18
|
+
"""
|
|
19
|
+
model_config: Incomplete
|
|
20
|
+
input: str | None
|
|
21
|
+
output: str | None
|
|
22
|
+
|
|
23
|
+
class GuardrailResult(BaseModel):
|
|
24
|
+
"""Result schema returned by guardrail engines and managers.
|
|
25
|
+
|
|
26
|
+
Attributes:
|
|
27
|
+
is_safe: Whether the content passed all checks
|
|
28
|
+
reason: Explanation when content is blocked (None if safe)
|
|
29
|
+
filtered_content: Cleaned/sanitized content if engine provides it
|
|
30
|
+
"""
|
|
31
|
+
model_config: Incomplete
|
|
32
|
+
is_safe: bool
|
|
33
|
+
reason: str | None
|
|
34
|
+
filtered_content: str | None
|
|
35
|
+
|
|
36
|
+
class BaseGuardrailEngineConfig(BaseModel):
|
|
37
|
+
"""Base configuration for guardrail engines.
|
|
38
|
+
|
|
39
|
+
Attributes:
|
|
40
|
+
guardrail_mode: What content this engine should check
|
|
41
|
+
"""
|
|
42
|
+
model_config: Incomplete
|
|
43
|
+
guardrail_mode: GuardrailMode
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Utility functions for guardrail mode conversion.
|
|
2
|
+
|
|
3
|
+
This module provides utilities for converting between aip-agents GuardrailMode
|
|
4
|
+
and gllm-guardrail GuardrailMode enums.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from aip_agents.guardrails.schemas import GuardrailMode
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def convert_guardrail_mode_to_gl_sdk(mode: GuardrailMode) -> Any:
|
|
16
|
+
"""Convert aip-agents GuardrailMode to gllm-guardrail GuardrailMode.
|
|
17
|
+
|
|
18
|
+
This function performs lazy import of gllm-guardrail to support optional
|
|
19
|
+
dependencies. The conversion is necessary because we maintain our own
|
|
20
|
+
GuardrailMode enum for API consistency while wrapping the external library.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
mode: The aip-agents GuardrailMode to convert
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
The corresponding gllm-guardrail GuardrailMode enum value
|
|
27
|
+
|
|
28
|
+
Raises:
|
|
29
|
+
ImportError: If gllm-guardrail is not installed
|
|
30
|
+
"""
|
|
31
|
+
try:
|
|
32
|
+
from gllm_guardrail.constants import GuardrailMode as GLGuardrailMode # pragma: no cover
|
|
33
|
+
except ImportError as e: # pragma: no cover
|
|
34
|
+
raise ImportError(
|
|
35
|
+
"gllm-guardrail is required for guardrails. Install with: pip install 'aip-agents[guardrails]'"
|
|
36
|
+
) from e # pragma: no cover
|
|
37
|
+
|
|
38
|
+
mode_mapping = {
|
|
39
|
+
GuardrailMode.INPUT_ONLY: GLGuardrailMode.INPUT_ONLY,
|
|
40
|
+
GuardrailMode.OUTPUT_ONLY: GLGuardrailMode.OUTPUT_ONLY,
|
|
41
|
+
GuardrailMode.INPUT_OUTPUT: GLGuardrailMode.BOTH,
|
|
42
|
+
GuardrailMode.DISABLED: GLGuardrailMode.DISABLED,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return mode_mapping[mode]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from aip_agents.guardrails.schemas import GuardrailMode as GuardrailMode
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
def convert_guardrail_mode_to_gl_sdk(mode: GuardrailMode) -> Any:
|
|
5
|
+
"""Convert aip-agents GuardrailMode to gllm-guardrail GuardrailMode.
|
|
6
|
+
|
|
7
|
+
This function performs lazy import of gllm-guardrail to support optional
|
|
8
|
+
dependencies. The conversion is necessary because we maintain our own
|
|
9
|
+
GuardrailMode enum for API consistency while wrapping the external library.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
mode: The aip-agents GuardrailMode to convert
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
The corresponding gllm-guardrail GuardrailMode enum value
|
|
16
|
+
|
|
17
|
+
Raises:
|
|
18
|
+
ImportError: If gllm-guardrail is not installed
|
|
19
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Model Context Protocol related classes and functions."""
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""MCP Client.
|
|
2
|
+
|
|
3
|
+
This module provides a adapter client for interacting with MCP servers.
|
|
4
|
+
|
|
5
|
+
Authors:
|
|
6
|
+
Fachriza Dian Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
7
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient
|
|
11
|
+
from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient
|
|
12
|
+
from aip_agents.mcp.client.langchain.client import LangchainMCPClient
|
|
13
|
+
|
|
14
|
+
__all__ = ["GoogleADKMCPClient", "LangchainMCPClient", "BaseMCPClient"]
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient as BaseMCPClient
|
|
2
|
+
from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient as GoogleADKMCPClient
|
|
3
|
+
from aip_agents.mcp.client.langchain.client import LangchainMCPClient as LangchainMCPClient
|
|
4
|
+
|
|
5
|
+
__all__ = ['GoogleADKMCPClient', 'LangchainMCPClient', 'BaseMCPClient']
|