aip-agents-binary 0.5.20__py3-none-manylinux_2_31_x86_64.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 +2942 -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 +2514 -0
- aip_agents/agent/langgraph_react_agent.pyi +126 -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_bosa_twitter.py +41 -0
- aip_agents/examples/hello_world_langgraph_bosa_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/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 +359 -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 +215 -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 +88 -0
- aip_agents/middleware/base.pyi +71 -0
- aip_agents/middleware/manager.py +128 -0
- aip_agents/middleware/manager.pyi +80 -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 +33 -0
- aip_agents/tools/__init__.pyi +13 -0
- aip_agents/tools/bosa_tools.py +105 -0
- aip_agents/tools/bosa_tools.pyi +37 -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 +257 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -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 +165 -0
- aip_agents/tools/constants.pyi +135 -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 +351 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -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.20.dist-info/METADATA +681 -0
- aip_agents_binary-0.5.20.dist-info/RECORD +546 -0
- aip_agents_binary-0.5.20.dist-info/WHEEL +5 -0
- aip_agents_binary-0.5.20.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from a2a.server.agent_execution import AgentExecutor as A2ASDKExecutor, RequestContext
|
|
3
|
+
from a2a.server.events.event_queue import EventQueue
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from aip_agents.types import A2AEvent as A2AEvent, A2AStreamEventType as A2AStreamEventType
|
|
6
|
+
from aip_agents.utils import serialize_references_for_metadata as serialize_references_for_metadata
|
|
7
|
+
from aip_agents.utils.artifact_helpers import ArtifactHandler as ArtifactHandler
|
|
8
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
9
|
+
from aip_agents.utils.metadata_helper import MetadataFieldKeys as MetadataFieldKeys
|
|
10
|
+
from collections.abc import Callable as Callable
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
logger: Incomplete
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class StatusUpdateParams:
|
|
18
|
+
"""Parameters for status updates."""
|
|
19
|
+
metadata: dict[str, Any] | None = ...
|
|
20
|
+
final: bool = ...
|
|
21
|
+
task_id: str | None = ...
|
|
22
|
+
context_id: str | None = ...
|
|
23
|
+
|
|
24
|
+
class BaseA2AExecutor(A2ASDKExecutor, ABC):
|
|
25
|
+
"""Abstract base class for GLLM Agent framework's A2A server-side executors.
|
|
26
|
+
|
|
27
|
+
This class extends the A2A SDK's `AgentExecutor`. It serves as a common
|
|
28
|
+
foundation for specific executors tailored to different agent types within the
|
|
29
|
+
`aip-agents` framework, such as `LangGraphA2AExecutor` or
|
|
30
|
+
`GoogleADKA2AExecutor`.
|
|
31
|
+
|
|
32
|
+
Subclasses are required to implement the `execute` method to handle A2A
|
|
33
|
+
requests. The `cancel` method has a common implementation.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
_active_tasks (dict[str, asyncio.Task]): A dictionary mapping task IDs to
|
|
37
|
+
their corresponding asyncio.Task instances for active agent executions.
|
|
38
|
+
"""
|
|
39
|
+
def __init__(self) -> None:
|
|
40
|
+
"""Initializes the BaseA2AExecutor."""
|
|
41
|
+
@abstractmethod
|
|
42
|
+
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
43
|
+
"""Processes an incoming agent request and manages its execution.
|
|
44
|
+
|
|
45
|
+
Implementations should interact with the underlying agent (e.g., a LangGraph
|
|
46
|
+
or Google ADK agent) based on the provided `context`. All communications
|
|
47
|
+
regarding task status, artifacts, and completion must be sent through
|
|
48
|
+
the `event_queue`.
|
|
49
|
+
|
|
50
|
+
This method typically involves:
|
|
51
|
+
1. Calling `_handle_initial_execute_checks` for validation and setup.
|
|
52
|
+
2. Defining an agent-specific coroutine for processing (e.g., `_process_stream`).
|
|
53
|
+
3. Calling `_execute_agent_processing` to manage the lifecycle of this coroutine.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
context (RequestContext): The request context containing information about the incoming
|
|
57
|
+
message, task, and other relevant data.
|
|
58
|
+
event_queue (EventQueue): The queue used to send events (e.g., task status updates,
|
|
59
|
+
artifacts) back to the A2A server infrastructure.
|
|
60
|
+
"""
|
|
61
|
+
async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
62
|
+
"""Handles a request to cancel an ongoing agent task.
|
|
63
|
+
|
|
64
|
+
This method attempts to cancel an active asyncio.Task associated with the
|
|
65
|
+
given `context.task_id`. It waits for a short period for the task to handle
|
|
66
|
+
the cancellation gracefully. The `event_queue` is used to report the
|
|
67
|
+
outcome of the cancellation attempt (e.g., success, error during cleanup).
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
context (RequestContext): The request context for the task to be cancelled,
|
|
71
|
+
primarily used to get the `task_id` and `context_id`.
|
|
72
|
+
event_queue (EventQueue): The queue for sending cancellation status events.
|
|
73
|
+
"""
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""A2A server-side executor for Google ADK agent instances.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from a2a.server.agent_execution import RequestContext
|
|
11
|
+
from a2a.server.events.event_queue import EventQueue
|
|
12
|
+
from a2a.server.tasks import TaskUpdater
|
|
13
|
+
from a2a.types import TaskState
|
|
14
|
+
from a2a.utils import new_agent_text_message
|
|
15
|
+
|
|
16
|
+
from aip_agents.a2a.server.base_executor import BaseA2AExecutor, StatusUpdateParams
|
|
17
|
+
from aip_agents.agent.google_adk_constants import DEFAULT_AUTH_URL
|
|
18
|
+
from aip_agents.agent.interfaces import GoogleADKAgentProtocol
|
|
19
|
+
from aip_agents.utils.logger import get_logger
|
|
20
|
+
|
|
21
|
+
logger = get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class GoogleADKExecutor(BaseA2AExecutor):
|
|
25
|
+
"""A2A Executor for serving a `GoogleADKAgent`.
|
|
26
|
+
|
|
27
|
+
This executor bridges the A2A server protocol with a `aip_agents.agent.GoogleADKAgent`.
|
|
28
|
+
It handles incoming requests by invoking the agent's `arun_a2a_stream` method,
|
|
29
|
+
which is specifically designed to yield ADK events in an A2A-compatible dictionary
|
|
30
|
+
format. This executor's `_process_stream` method is tailored to handle this stream,
|
|
31
|
+
including ADK-specific statuses like "auth_required", before delegating common
|
|
32
|
+
status handling to `BaseA2AExecutor._handle_stream_event`.
|
|
33
|
+
|
|
34
|
+
It leverages common functionality from `BaseA2AExecutor` for task management,
|
|
35
|
+
initial request checks, and cancellation.
|
|
36
|
+
|
|
37
|
+
Attributes:
|
|
38
|
+
agent (GoogleADKAgentProtocol): The instance of `GoogleADKAgent`-compatible class to execute.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
agent: GoogleADKAgentProtocol
|
|
42
|
+
|
|
43
|
+
def __init__(self, agent: GoogleADKAgentProtocol) -> None:
|
|
44
|
+
"""Initializes the GoogleADKExecutor.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
agent: Component implementing `GoogleADKAgentProtocol`.
|
|
48
|
+
|
|
49
|
+
Raises:
|
|
50
|
+
TypeError: If the provided agent does not satisfy `GoogleADKAgentProtocol`.
|
|
51
|
+
"""
|
|
52
|
+
super().__init__()
|
|
53
|
+
|
|
54
|
+
if not isinstance(agent, GoogleADKAgentProtocol):
|
|
55
|
+
raise TypeError(
|
|
56
|
+
f"GoogleADKExecutor expected an agent implementing GoogleADKAgentProtocol, got {type(agent).__name__}"
|
|
57
|
+
)
|
|
58
|
+
self.agent = agent
|
|
59
|
+
self._default_auth_url = DEFAULT_AUTH_URL
|
|
60
|
+
|
|
61
|
+
async def execute(
|
|
62
|
+
self,
|
|
63
|
+
context: RequestContext,
|
|
64
|
+
event_queue: EventQueue,
|
|
65
|
+
) -> None:
|
|
66
|
+
"""Processes an incoming agent request using the `GoogleADKAgent`.
|
|
67
|
+
|
|
68
|
+
This method first performs initial checks using `_handle_initial_execute_checks`
|
|
69
|
+
from the base class. If successful, it prepares the `_process_stream` coroutine
|
|
70
|
+
and passes it to `_execute_agent_processing` (also from the base class) to
|
|
71
|
+
manage its execution lifecycle. The `_process_stream` method is responsible for
|
|
72
|
+
calling the agent's `arun_a2a_stream` and handling its ADK-specific output.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
context (RequestContext): The A2A request context containing message details,
|
|
76
|
+
task ID, and context ID.
|
|
77
|
+
event_queue (EventQueue): The queue for sending A2A events (task status,
|
|
78
|
+
artifacts) back to the server.
|
|
79
|
+
"""
|
|
80
|
+
updater, query, metadata = await self._handle_initial_execute_checks(context, event_queue)
|
|
81
|
+
if not updater or query is None: # Checks failed, status already sent by base method
|
|
82
|
+
return
|
|
83
|
+
|
|
84
|
+
agent_processing_coro = self._process_stream(
|
|
85
|
+
query=query,
|
|
86
|
+
updater=updater,
|
|
87
|
+
task_id=context.task_id,
|
|
88
|
+
context_id=context.context_id,
|
|
89
|
+
event_queue=event_queue,
|
|
90
|
+
metadata=metadata,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
await self._execute_agent_processing(
|
|
94
|
+
agent_processing_coro=agent_processing_coro,
|
|
95
|
+
updater=updater,
|
|
96
|
+
task_id=context.task_id,
|
|
97
|
+
context_id=context.context_id,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
async def _process_stream( # noqa: PLR0913
|
|
101
|
+
self,
|
|
102
|
+
query: str,
|
|
103
|
+
updater: TaskUpdater,
|
|
104
|
+
task_id: str,
|
|
105
|
+
context_id: str,
|
|
106
|
+
event_queue: EventQueue,
|
|
107
|
+
metadata: dict[str, Any] | None = None,
|
|
108
|
+
) -> None:
|
|
109
|
+
"""Processes the streaming response from the `GoogleADKAgent`.
|
|
110
|
+
|
|
111
|
+
This coroutine invokes `self.agent.arun_a2a_stream`, which is designed to yield
|
|
112
|
+
dictionary chunks adapting native Google ADK `Event` objects into an A2A-compatible
|
|
113
|
+
format. This method specifically handles the "auth_required" status that can be
|
|
114
|
+
yielded by the agent's stream. For all other statuses, it delegates to the
|
|
115
|
+
`self._handle_stream_event` method from `BaseA2AExecutor` for common processing.
|
|
116
|
+
|
|
117
|
+
The `GoogleADKAgent.arun_a2a_stream` and its helper methods are responsible for
|
|
118
|
+
the ADK-specific event transformation. This executor's role here is to consume
|
|
119
|
+
that adapted stream.
|
|
120
|
+
|
|
121
|
+
If `asyncio.CancelledError` is raised (e.g., by the task managed by
|
|
122
|
+
`_execute_agent_processing`), it is re-raised to be handled by the base class.
|
|
123
|
+
Other exceptions during streaming are caught, logged, an A2A 'failed' status
|
|
124
|
+
is sent, and the exception is re-raised.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
query (str): The query string to be processed by the agent.
|
|
128
|
+
updater (TaskUpdater): The `TaskUpdater` instance for sending status updates.
|
|
129
|
+
task_id (str): The A2A task ID.
|
|
130
|
+
context_id (str): The A2A context ID.
|
|
131
|
+
event_queue (EventQueue): The A2A event queue, used by the base handler
|
|
132
|
+
for sending artifact events.
|
|
133
|
+
metadata (dict[str, Any] | None): Optional metadata from the A2A request.
|
|
134
|
+
|
|
135
|
+
Raises:
|
|
136
|
+
asyncio.CancelledError: If the task is cancelled externally.
|
|
137
|
+
Exception: If any other error occurs during the agent's stream processing.
|
|
138
|
+
"""
|
|
139
|
+
try:
|
|
140
|
+
async for chunk in self.agent.arun_a2a_stream(
|
|
141
|
+
query=query,
|
|
142
|
+
configurable={"thread_id": task_id, "context_id": context_id},
|
|
143
|
+
):
|
|
144
|
+
# Handle ADK-specific statuses first
|
|
145
|
+
if chunk.get("status") == "auth_required":
|
|
146
|
+
auth_content = chunk.get("content", {})
|
|
147
|
+
auth_url = (
|
|
148
|
+
auth_content.get("auth_url", self._default_auth_url)
|
|
149
|
+
if isinstance(auth_content, dict)
|
|
150
|
+
else self._default_auth_url
|
|
151
|
+
)
|
|
152
|
+
auth_message = (
|
|
153
|
+
auth_content.get("message", "Authorization is required.")
|
|
154
|
+
if isinstance(auth_content, dict)
|
|
155
|
+
else "Authorization is required."
|
|
156
|
+
)
|
|
157
|
+
full_message = f"{auth_message} Visit {auth_url}"
|
|
158
|
+
|
|
159
|
+
await self._update_status(
|
|
160
|
+
updater,
|
|
161
|
+
TaskState.auth_required,
|
|
162
|
+
message=new_agent_text_message(full_message, context_id=context_id, task_id=task_id),
|
|
163
|
+
params=StatusUpdateParams(final=True, task_id=task_id, context_id=context_id),
|
|
164
|
+
)
|
|
165
|
+
return # Terminate stream processing as auth is required
|
|
166
|
+
|
|
167
|
+
# For other statuses, use the common handler from BaseA2AExecutor
|
|
168
|
+
should_terminate = await self._handle_stream_event(
|
|
169
|
+
chunk=chunk,
|
|
170
|
+
updater=updater,
|
|
171
|
+
task_id=task_id,
|
|
172
|
+
context_id=context_id,
|
|
173
|
+
event_queue=event_queue,
|
|
174
|
+
metadata=metadata,
|
|
175
|
+
)
|
|
176
|
+
if should_terminate:
|
|
177
|
+
return
|
|
178
|
+
|
|
179
|
+
except asyncio.CancelledError:
|
|
180
|
+
logger.info(f"ADK Stream processing for task {task_id} was cancelled.")
|
|
181
|
+
# Re-raise for _execute_agent_processing to handle and set A2A status
|
|
182
|
+
raise
|
|
183
|
+
except Exception as e:
|
|
184
|
+
logger.error(
|
|
185
|
+
f"Error during ADK agent streaming for task {task_id}: {e}",
|
|
186
|
+
exc_info=True,
|
|
187
|
+
)
|
|
188
|
+
await self._update_status(
|
|
189
|
+
updater,
|
|
190
|
+
TaskState.failed,
|
|
191
|
+
message=new_agent_text_message(
|
|
192
|
+
f"Error during streaming: {str(e)}",
|
|
193
|
+
context_id=context_id,
|
|
194
|
+
task_id=task_id,
|
|
195
|
+
),
|
|
196
|
+
params=StatusUpdateParams(final=True, task_id=task_id, context_id=context_id),
|
|
197
|
+
)
|
|
198
|
+
raise
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from a2a.server.agent_execution import RequestContext
|
|
3
|
+
from a2a.server.events.event_queue import EventQueue
|
|
4
|
+
from aip_agents.a2a.server.base_executor import BaseA2AExecutor as BaseA2AExecutor, StatusUpdateParams as StatusUpdateParams
|
|
5
|
+
from aip_agents.agent.google_adk_constants import DEFAULT_AUTH_URL as DEFAULT_AUTH_URL
|
|
6
|
+
from aip_agents.agent.interfaces import GoogleADKAgentProtocol as GoogleADKAgentProtocol
|
|
7
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
8
|
+
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
|
|
11
|
+
class GoogleADKExecutor(BaseA2AExecutor):
|
|
12
|
+
'''A2A Executor for serving a `GoogleADKAgent`.
|
|
13
|
+
|
|
14
|
+
This executor bridges the A2A server protocol with a `aip_agents.agent.GoogleADKAgent`.
|
|
15
|
+
It handles incoming requests by invoking the agent\'s `arun_a2a_stream` method,
|
|
16
|
+
which is specifically designed to yield ADK events in an A2A-compatible dictionary
|
|
17
|
+
format. This executor\'s `_process_stream` method is tailored to handle this stream,
|
|
18
|
+
including ADK-specific statuses like "auth_required", before delegating common
|
|
19
|
+
status handling to `BaseA2AExecutor._handle_stream_event`.
|
|
20
|
+
|
|
21
|
+
It leverages common functionality from `BaseA2AExecutor` for task management,
|
|
22
|
+
initial request checks, and cancellation.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
agent (GoogleADKAgentProtocol): The instance of `GoogleADKAgent`-compatible class to execute.
|
|
26
|
+
'''
|
|
27
|
+
agent: GoogleADKAgentProtocol
|
|
28
|
+
def __init__(self, agent: GoogleADKAgentProtocol) -> None:
|
|
29
|
+
"""Initializes the GoogleADKExecutor.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
agent: Component implementing `GoogleADKAgentProtocol`.
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
TypeError: If the provided agent does not satisfy `GoogleADKAgentProtocol`.
|
|
36
|
+
"""
|
|
37
|
+
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
38
|
+
"""Processes an incoming agent request using the `GoogleADKAgent`.
|
|
39
|
+
|
|
40
|
+
This method first performs initial checks using `_handle_initial_execute_checks`
|
|
41
|
+
from the base class. If successful, it prepares the `_process_stream` coroutine
|
|
42
|
+
and passes it to `_execute_agent_processing` (also from the base class) to
|
|
43
|
+
manage its execution lifecycle. The `_process_stream` method is responsible for
|
|
44
|
+
calling the agent's `arun_a2a_stream` and handling its ADK-specific output.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
context (RequestContext): The A2A request context containing message details,
|
|
48
|
+
task ID, and context ID.
|
|
49
|
+
event_queue (EventQueue): The queue for sending A2A events (task status,
|
|
50
|
+
artifacts) back to the server.
|
|
51
|
+
"""
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"""A2A executor for Langflow agents.
|
|
2
|
+
|
|
3
|
+
This module provides the LangflowA2AExecutor class that extends BaseA2AExecutor
|
|
4
|
+
to handle A2A requests for Langflow agents, similar to how LangGraphA2AExecutor
|
|
5
|
+
works for LangGraph agents.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import typing
|
|
12
|
+
from abc import ABC
|
|
13
|
+
|
|
14
|
+
from a2a.server.agent_execution import RequestContext
|
|
15
|
+
from a2a.server.events.event_queue import EventQueue
|
|
16
|
+
from a2a.server.tasks import TaskUpdater
|
|
17
|
+
from a2a.types import TaskState
|
|
18
|
+
from a2a.utils import new_agent_text_message
|
|
19
|
+
|
|
20
|
+
from aip_agents.a2a.server.base_executor import BaseA2AExecutor, StatusUpdateParams
|
|
21
|
+
from aip_agents.agent.interfaces import LangflowAgentProtocol
|
|
22
|
+
from aip_agents.utils.logger import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class LangflowA2AExecutor(BaseA2AExecutor, ABC):
|
|
28
|
+
"""A2A executor for Langflow agents.
|
|
29
|
+
|
|
30
|
+
This class extends BaseA2AExecutor to provide A2A execution capabilities
|
|
31
|
+
for Langflow agents. It follows the same patterns as LangGraphA2AExecutor
|
|
32
|
+
but handles Langflow-specific streaming and execution logic.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
agent: The LangflowAgent-compatible instance to be executed.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
agent: LangflowAgentProtocol
|
|
39
|
+
|
|
40
|
+
def __init__(self, langflow_agent_instance: LangflowAgentProtocol) -> None:
|
|
41
|
+
"""Initialize the LangflowA2AExecutor.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
langflow_agent_instance: Component implementing `LangflowAgentProtocol`.
|
|
45
|
+
|
|
46
|
+
Raises:
|
|
47
|
+
TypeError: If the agent does not satisfy `LangflowAgentProtocol`.
|
|
48
|
+
"""
|
|
49
|
+
super().__init__()
|
|
50
|
+
|
|
51
|
+
if not isinstance(langflow_agent_instance, LangflowAgentProtocol):
|
|
52
|
+
type_name = type(langflow_agent_instance).__name__
|
|
53
|
+
raise TypeError(
|
|
54
|
+
f"LangflowA2AExecutor expected an agent implementing LangflowAgentProtocol, got {type_name}"
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
self.agent = langflow_agent_instance
|
|
58
|
+
logger.info(f"Initialized LangflowA2AExecutor for agent '{self.agent.name}'")
|
|
59
|
+
|
|
60
|
+
async def execute(
|
|
61
|
+
self,
|
|
62
|
+
context: RequestContext,
|
|
63
|
+
event_queue: EventQueue,
|
|
64
|
+
) -> None:
|
|
65
|
+
"""Process an incoming agent request using a Langflow agent.
|
|
66
|
+
|
|
67
|
+
This method handles the execution lifecycle for Langflow agents:
|
|
68
|
+
1. Performs initial validation and setup
|
|
69
|
+
2. Creates agent processing coroutine
|
|
70
|
+
3. Manages the execution lifecycle through BaseA2AExecutor
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
context: The A2A request context containing message details,
|
|
74
|
+
task ID, and context ID.
|
|
75
|
+
event_queue: The queue for sending A2A events back to the server.
|
|
76
|
+
"""
|
|
77
|
+
updater, query, metadata = await self._handle_initial_execute_checks(context, event_queue)
|
|
78
|
+
if not updater or query is None:
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
agent_processing_coro = self._process_stream(
|
|
82
|
+
query=query,
|
|
83
|
+
updater=updater,
|
|
84
|
+
task_id=context.task_id,
|
|
85
|
+
context_id=context.context_id,
|
|
86
|
+
event_queue=event_queue,
|
|
87
|
+
metadata=metadata,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
await self._execute_agent_processing(
|
|
91
|
+
agent_processing_coro=agent_processing_coro,
|
|
92
|
+
updater=updater,
|
|
93
|
+
task_id=context.task_id,
|
|
94
|
+
context_id=context.context_id,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def _get_configurable_kwargs(self, task_id: str) -> dict[str, typing.Any]:
|
|
98
|
+
"""Get configurable kwargs for agent execution.
|
|
99
|
+
|
|
100
|
+
For Langflow agents, we use thread_id for session management.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
task_id: The A2A task ID to use as thread_id.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Dictionary with configurable parameters for the agent.
|
|
107
|
+
"""
|
|
108
|
+
return {"configurable": {"thread_id": task_id}}
|
|
109
|
+
|
|
110
|
+
async def _process_stream( # noqa: PLR0913
|
|
111
|
+
self,
|
|
112
|
+
query: str,
|
|
113
|
+
updater: TaskUpdater,
|
|
114
|
+
task_id: str,
|
|
115
|
+
context_id: str,
|
|
116
|
+
event_queue: EventQueue,
|
|
117
|
+
metadata: dict[str, typing.Any] | None = None,
|
|
118
|
+
) -> None:
|
|
119
|
+
"""Process the streaming response from a Langflow agent.
|
|
120
|
+
|
|
121
|
+
This method invokes the agent's arun_a2a_stream method and processes
|
|
122
|
+
the A2A events it yields. It handles event routing through the base
|
|
123
|
+
class's _handle_stream_event method.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
query: The query string to be processed by the agent.
|
|
127
|
+
updater: The TaskUpdater instance for sending status updates.
|
|
128
|
+
task_id: The A2A task ID.
|
|
129
|
+
context_id: The A2A context ID.
|
|
130
|
+
event_queue: The A2A event queue for sending artifact events.
|
|
131
|
+
metadata: Optional metadata from the A2A request.
|
|
132
|
+
|
|
133
|
+
Raises:
|
|
134
|
+
asyncio.CancelledError: If the task is cancelled externally.
|
|
135
|
+
Exception: If any other error occurs during streaming.
|
|
136
|
+
"""
|
|
137
|
+
try:
|
|
138
|
+
kwargs = self._get_configurable_kwargs(task_id)
|
|
139
|
+
if metadata:
|
|
140
|
+
kwargs["metadata"] = metadata
|
|
141
|
+
|
|
142
|
+
logger.debug(f"Starting Langflow agent stream for task {task_id}")
|
|
143
|
+
|
|
144
|
+
current_metadata: dict[str, typing.Any] = metadata.copy() if metadata else {}
|
|
145
|
+
|
|
146
|
+
async for chunk in self.agent.arun_a2a_stream(query=query, **kwargs):
|
|
147
|
+
chunk_metadata = chunk.get("metadata")
|
|
148
|
+
if chunk_metadata and isinstance(chunk_metadata, dict):
|
|
149
|
+
try:
|
|
150
|
+
current_metadata.update(chunk_metadata)
|
|
151
|
+
except Exception as e:
|
|
152
|
+
logger.warning(f"Invalid metadata in chunk: {chunk_metadata}, error: {e}")
|
|
153
|
+
|
|
154
|
+
should_terminate = await self._handle_stream_event(
|
|
155
|
+
chunk=chunk,
|
|
156
|
+
updater=updater,
|
|
157
|
+
task_id=task_id,
|
|
158
|
+
context_id=context_id,
|
|
159
|
+
event_queue=event_queue,
|
|
160
|
+
metadata=current_metadata if current_metadata else None,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
if should_terminate:
|
|
164
|
+
logger.debug(f"Stream terminated for task {task_id}")
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
except Exception as e:
|
|
168
|
+
logger.error(f"Error during Langflow agent streaming for task {task_id}: {e}", exc_info=True)
|
|
169
|
+
|
|
170
|
+
await self._update_status(
|
|
171
|
+
updater,
|
|
172
|
+
TaskState.failed,
|
|
173
|
+
message=new_agent_text_message(
|
|
174
|
+
f"Error during Langflow execution: {str(e)}",
|
|
175
|
+
context_id=context_id,
|
|
176
|
+
task_id=task_id,
|
|
177
|
+
),
|
|
178
|
+
params=StatusUpdateParams(final=True, task_id=task_id, context_id=context_id),
|
|
179
|
+
)
|
|
180
|
+
raise
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from a2a.server.agent_execution import RequestContext
|
|
3
|
+
from a2a.server.events.event_queue import EventQueue
|
|
4
|
+
from abc import ABC
|
|
5
|
+
from aip_agents.a2a.server.base_executor import BaseA2AExecutor as BaseA2AExecutor, StatusUpdateParams as StatusUpdateParams
|
|
6
|
+
from aip_agents.agent.interfaces import LangflowAgentProtocol as LangflowAgentProtocol
|
|
7
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
8
|
+
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
|
|
11
|
+
class LangflowA2AExecutor(BaseA2AExecutor, ABC):
|
|
12
|
+
"""A2A executor for Langflow agents.
|
|
13
|
+
|
|
14
|
+
This class extends BaseA2AExecutor to provide A2A execution capabilities
|
|
15
|
+
for Langflow agents. It follows the same patterns as LangGraphA2AExecutor
|
|
16
|
+
but handles Langflow-specific streaming and execution logic.
|
|
17
|
+
|
|
18
|
+
Attributes:
|
|
19
|
+
agent: The LangflowAgent-compatible instance to be executed.
|
|
20
|
+
"""
|
|
21
|
+
agent: LangflowAgentProtocol
|
|
22
|
+
def __init__(self, langflow_agent_instance: LangflowAgentProtocol) -> None:
|
|
23
|
+
"""Initialize the LangflowA2AExecutor.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
langflow_agent_instance: Component implementing `LangflowAgentProtocol`.
|
|
27
|
+
|
|
28
|
+
Raises:
|
|
29
|
+
TypeError: If the agent does not satisfy `LangflowAgentProtocol`.
|
|
30
|
+
"""
|
|
31
|
+
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
32
|
+
"""Process an incoming agent request using a Langflow agent.
|
|
33
|
+
|
|
34
|
+
This method handles the execution lifecycle for Langflow agents:
|
|
35
|
+
1. Performs initial validation and setup
|
|
36
|
+
2. Creates agent processing coroutine
|
|
37
|
+
3. Manages the execution lifecycle through BaseA2AExecutor
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
context: The A2A request context containing message details,
|
|
41
|
+
task ID, and context ID.
|
|
42
|
+
event_queue: The queue for sending A2A events back to the server.
|
|
43
|
+
"""
|