aip-agents-binary 0.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of aip-agents-binary might be problematic. Click here for more details.
- aip_agents/__init__.py +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +3037 -0
- aip_agents/agent/base_langgraph_agent.pyi +233 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +767 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
- aip_agents/agent/langgraph_react_agent.py +2856 -0
- aip_agents/agent/langgraph_react_agent.pyi +170 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +228 -0
- aip_agents/mcp/client/connection_manager.pyi +51 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +612 -0
- aip_agents/mcp/client/persistent_session.pyi +122 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +263 -0
- aip_agents/mcp/client/transports.pyi +132 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +811 -0
- aip_agents/memory/adapters/base_adapter.pyi +176 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/ptc/__init__.py +48 -0
- aip_agents/ptc/__init__.pyi +10 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/doc_gen.pyi +40 -0
- aip_agents/ptc/exceptions.py +39 -0
- aip_agents/ptc/exceptions.pyi +22 -0
- aip_agents/ptc/executor.py +143 -0
- aip_agents/ptc/executor.pyi +73 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/__init__.pyi +7 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
- aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
- aip_agents/ptc/naming.py +184 -0
- aip_agents/ptc/naming.pyi +76 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/payload.pyi +15 -0
- aip_agents/ptc/prompt_builder.py +571 -0
- aip_agents/ptc/prompt_builder.pyi +55 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/ptc_helper.pyi +1 -0
- aip_agents/ptc/sandbox_bridge.py +58 -0
- aip_agents/ptc/sandbox_bridge.pyi +25 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/template_utils.pyi +13 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/__init__.pyi +0 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/sandbox/__init__.py +43 -0
- aip_agents/sandbox/__init__.pyi +5 -0
- aip_agents/sandbox/defaults.py +9 -0
- aip_agents/sandbox/defaults.pyi +2 -0
- aip_agents/sandbox/e2b_runtime.py +267 -0
- aip_agents/sandbox/e2b_runtime.pyi +51 -0
- aip_agents/sandbox/template_builder.py +131 -0
- aip_agents/sandbox/template_builder.pyi +36 -0
- aip_agents/sandbox/types.py +24 -0
- aip_agents/sandbox/types.pyi +14 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/sandbox/validation.pyi +20 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +64 -0
- aip_agents/tools/__init__.pyi +11 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1120 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +815 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/date_range_tool.pyi +21 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/execute_ptc_code.py +308 -0
- aip_agents/tools/execute_ptc_code.pyi +90 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +365 -0
- aip_agents/tools/memory_search/mem0.pyi +29 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search/schema.pyi +25 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1096 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +329 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.6.4.dist-info/METADATA +673 -0
- aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
- aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
- aip_agents_binary-0.6.4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"""Base executor class for LangChain-based A2A executors.
|
|
2
|
+
|
|
3
|
+
This module provides a common base class for executors that work with LangChain-based
|
|
4
|
+
agents, such as LangChainAgent and LangGraphAgent. It implements shared functionality
|
|
5
|
+
for handling streaming responses and managing agent execution.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
9
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
from abc import ABC
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from a2a.server.agent_execution import RequestContext
|
|
17
|
+
from a2a.server.events.event_queue import EventQueue
|
|
18
|
+
from a2a.server.tasks import TaskUpdater
|
|
19
|
+
from a2a.types import TaskState
|
|
20
|
+
from a2a.utils import new_agent_text_message
|
|
21
|
+
|
|
22
|
+
from aip_agents.a2a.server.base_executor import BaseA2AExecutor, StatusUpdateParams
|
|
23
|
+
from aip_agents.agent.interfaces import LangGraphAgentProtocol
|
|
24
|
+
from aip_agents.schema.step_limit import StepLimitConfig
|
|
25
|
+
from aip_agents.utils.logger import get_logger
|
|
26
|
+
|
|
27
|
+
logger = get_logger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class LangGraphA2AExecutor(BaseA2AExecutor, ABC):
|
|
31
|
+
"""Base class for LangChain-based A2A executors.
|
|
32
|
+
|
|
33
|
+
This class extends BaseA2AExecutor to provide common functionality for executors
|
|
34
|
+
that work with LangChain-based agents (LangChainAgent and LangGraphAgent).
|
|
35
|
+
It implements shared methods for handling streaming responses and managing
|
|
36
|
+
agent execution, while leaving agent-specific initialization to subclasses.
|
|
37
|
+
|
|
38
|
+
Attributes:
|
|
39
|
+
agent (LangGraphAgentProtocol): The LangChain-based agent instance to be executed.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
agent: LangGraphAgentProtocol
|
|
43
|
+
|
|
44
|
+
def __init__(self, langgraph_agent_instance: LangGraphAgentProtocol) -> None:
|
|
45
|
+
"""Initializes the LangGraphA2AExecutor.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
langgraph_agent_instance: Component implementing `LangGraphAgentProtocol`.
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
TypeError: If the provided agent does not satisfy `LangGraphAgentProtocol`.
|
|
52
|
+
"""
|
|
53
|
+
super().__init__()
|
|
54
|
+
|
|
55
|
+
if not isinstance(langgraph_agent_instance, LangGraphAgentProtocol):
|
|
56
|
+
_type_name = type(langgraph_agent_instance).__name__
|
|
57
|
+
raise TypeError(
|
|
58
|
+
f"LangGraphA2AExecutor expected an agent implementing LangGraphAgentProtocol, got {_type_name}"
|
|
59
|
+
)
|
|
60
|
+
self.agent = langgraph_agent_instance
|
|
61
|
+
|
|
62
|
+
async def execute(
|
|
63
|
+
self,
|
|
64
|
+
context: RequestContext,
|
|
65
|
+
event_queue: EventQueue,
|
|
66
|
+
) -> None:
|
|
67
|
+
"""Processes an incoming agent request using a LangChain-based agent.
|
|
68
|
+
|
|
69
|
+
This method first performs initial checks using _handle_initial_execute_checks.
|
|
70
|
+
If successful, it prepares the _process_stream coroutine and passes it to
|
|
71
|
+
_execute_agent_processing from the base class to manage its lifecycle.
|
|
72
|
+
The _process_stream method is responsible for calling the agent's
|
|
73
|
+
arun_a2a_stream and handling its output.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
context (RequestContext): The A2A request context containing message details,
|
|
77
|
+
task ID, and context ID.
|
|
78
|
+
event_queue (EventQueue): The queue for sending A2A events (task status,
|
|
79
|
+
artifacts) back to the server.
|
|
80
|
+
"""
|
|
81
|
+
updater, query, metadata = await self._handle_initial_execute_checks(context, event_queue)
|
|
82
|
+
if not updater or query is None: # Checks failed, status already sent
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
agent_processing_coro = self._process_stream(
|
|
86
|
+
query=query,
|
|
87
|
+
updater=updater,
|
|
88
|
+
task_id=context.task_id,
|
|
89
|
+
context_id=context.context_id,
|
|
90
|
+
event_queue=event_queue,
|
|
91
|
+
metadata=metadata,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
await self._execute_agent_processing(
|
|
95
|
+
agent_processing_coro=agent_processing_coro,
|
|
96
|
+
updater=updater,
|
|
97
|
+
task_id=context.task_id,
|
|
98
|
+
context_id=context.context_id,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def _get_configurable_kwargs(self, task_id: str) -> dict[str, Any]:
|
|
102
|
+
"""Get configurable kwargs for agent delegation.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
task_id: The A2A task ID.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
dict[str, Any]: A dictionary with 'configurable' key if the agent
|
|
109
|
+
has 'thread_id_key', otherwise an empty dictionary.
|
|
110
|
+
"""
|
|
111
|
+
if hasattr(self.agent, "thread_id_key"):
|
|
112
|
+
return {"configurable": {self.agent.thread_id_key: task_id}}
|
|
113
|
+
return {}
|
|
114
|
+
|
|
115
|
+
def _build_agent_kwargs(
|
|
116
|
+
self,
|
|
117
|
+
task_id: str,
|
|
118
|
+
metadata: dict[str, Any] | None,
|
|
119
|
+
) -> dict[str, Any]:
|
|
120
|
+
"""Build kwargs for agent stream execution from task and metadata.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
task_id: The A2A task ID for configurable threading settings.
|
|
124
|
+
metadata: Optional request metadata, including files and overrides.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
dict[str, Any]: Keyword arguments to pass to the agent's stream method.
|
|
128
|
+
"""
|
|
129
|
+
kwargs = self._get_configurable_kwargs(task_id)
|
|
130
|
+
|
|
131
|
+
files: list[str | dict[str, Any]] = self._extract_files_from_metadata(metadata)
|
|
132
|
+
if metadata is not None:
|
|
133
|
+
kwargs["metadata"] = metadata
|
|
134
|
+
if isinstance(metadata, dict):
|
|
135
|
+
raw_user_id = metadata.get("memory_user_id") or metadata.get("user_id")
|
|
136
|
+
if raw_user_id:
|
|
137
|
+
kwargs["memory_user_id"] = str(raw_user_id)
|
|
138
|
+
|
|
139
|
+
raw_pii_mapping = metadata.get("pii_mapping")
|
|
140
|
+
if isinstance(raw_pii_mapping, dict) and raw_pii_mapping:
|
|
141
|
+
kwargs["pii_mapping"] = dict(raw_pii_mapping)
|
|
142
|
+
|
|
143
|
+
# Extract invocation-level step limit overrides (Docs-1)
|
|
144
|
+
raw_step_limit_config = metadata.get("step_limit_config")
|
|
145
|
+
if isinstance(raw_step_limit_config, dict | StepLimitConfig):
|
|
146
|
+
kwargs["step_limit_config"] = raw_step_limit_config
|
|
147
|
+
if files:
|
|
148
|
+
kwargs["files"] = files
|
|
149
|
+
|
|
150
|
+
return kwargs
|
|
151
|
+
|
|
152
|
+
async def _process_stream( # noqa: PLR0913
|
|
153
|
+
self,
|
|
154
|
+
query: str,
|
|
155
|
+
updater: TaskUpdater,
|
|
156
|
+
task_id: str,
|
|
157
|
+
context_id: str,
|
|
158
|
+
event_queue: EventQueue,
|
|
159
|
+
metadata: dict[str, Any] | None = None,
|
|
160
|
+
) -> None:
|
|
161
|
+
"""Processes the streaming response from a LangChain-based agent.
|
|
162
|
+
|
|
163
|
+
This coroutine invokes the agent.arun_a2a_stream method with the given query and metadata.
|
|
164
|
+
It then iterates over the asynchronous stream of dictionary chunks yielded by
|
|
165
|
+
the agent. Each chunk is passed to _handle_stream_event from the base class
|
|
166
|
+
to interpret common A2A statuses (working, completed, failed, etc.) and update
|
|
167
|
+
the A2A task accordingly.
|
|
168
|
+
|
|
169
|
+
If asyncio.CancelledError is raised (typically from the task managed by
|
|
170
|
+
_execute_agent_processing), it is re-raised to be handled by the base class.
|
|
171
|
+
Other exceptions during streaming are caught, logged, an A2A 'failed' status
|
|
172
|
+
is sent, and the exception is re-raised.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
query (str): The query string to be processed by the agent.
|
|
176
|
+
updater (TaskUpdater): The TaskUpdater instance for sending status updates.
|
|
177
|
+
task_id (str): The A2A task ID.
|
|
178
|
+
context_id (str): The A2A context ID.
|
|
179
|
+
event_queue (EventQueue): The A2A event queue for sending artifact events.
|
|
180
|
+
metadata (dict[str, Any] | None): Optional metadata from the A2A request.
|
|
181
|
+
|
|
182
|
+
Raises:
|
|
183
|
+
asyncio.CancelledError: If the task is cancelled externally.
|
|
184
|
+
Exception: If any other error occurs during the agent's stream processing.
|
|
185
|
+
"""
|
|
186
|
+
stream = None
|
|
187
|
+
try:
|
|
188
|
+
kwargs = self._build_agent_kwargs(task_id=task_id, metadata=metadata)
|
|
189
|
+
|
|
190
|
+
stream = self.agent.arun_a2a_stream(query=query, **kwargs)
|
|
191
|
+
|
|
192
|
+
current_metadata: dict[str, Any] = metadata.copy() if metadata else {}
|
|
193
|
+
|
|
194
|
+
async for chunk in stream:
|
|
195
|
+
chunk_metadata = chunk.get("metadata")
|
|
196
|
+
if chunk_metadata is not None:
|
|
197
|
+
try:
|
|
198
|
+
current_metadata.update(chunk_metadata)
|
|
199
|
+
except Exception as e:
|
|
200
|
+
logger.warning(f"Invalid metadata payload from chunk: {chunk_metadata}, error: {e}")
|
|
201
|
+
|
|
202
|
+
should_terminate = await self._handle_stream_event(
|
|
203
|
+
chunk=chunk,
|
|
204
|
+
updater=updater,
|
|
205
|
+
task_id=task_id,
|
|
206
|
+
context_id=context_id,
|
|
207
|
+
event_queue=event_queue,
|
|
208
|
+
metadata=current_metadata if current_metadata else None,
|
|
209
|
+
)
|
|
210
|
+
if should_terminate:
|
|
211
|
+
return
|
|
212
|
+
|
|
213
|
+
except asyncio.CancelledError:
|
|
214
|
+
logger.info(f"LangChain stream processing for task {task_id} was cancelled.")
|
|
215
|
+
raise
|
|
216
|
+
except Exception as e:
|
|
217
|
+
logger.error(
|
|
218
|
+
f"Error during LangChain agent streaming for task {task_id}: {e}",
|
|
219
|
+
exc_info=True,
|
|
220
|
+
)
|
|
221
|
+
await self._update_status(
|
|
222
|
+
updater,
|
|
223
|
+
TaskState.failed,
|
|
224
|
+
message=new_agent_text_message(
|
|
225
|
+
f"Error during streaming: {str(e)}",
|
|
226
|
+
context_id=context_id,
|
|
227
|
+
task_id=task_id,
|
|
228
|
+
),
|
|
229
|
+
params=StatusUpdateParams(final=True, task_id=task_id, context_id=context_id),
|
|
230
|
+
)
|
|
231
|
+
raise
|
|
232
|
+
|
|
233
|
+
@staticmethod
|
|
234
|
+
def _extract_files_from_metadata(metadata: dict[str, Any] | None) -> list[str | dict[str, Any]]:
|
|
235
|
+
"""Extract file paths from metadata, removing them since they are passed via kwargs.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
metadata: Metadata dict from the request, potentially containing files.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
List of non-empty file path strings or file metadata dictionaries.
|
|
242
|
+
"""
|
|
243
|
+
if not isinstance(metadata, dict):
|
|
244
|
+
return []
|
|
245
|
+
|
|
246
|
+
try:
|
|
247
|
+
raw_files = metadata.pop("files", None)
|
|
248
|
+
except AttributeError:
|
|
249
|
+
return []
|
|
250
|
+
if raw_files is None:
|
|
251
|
+
return []
|
|
252
|
+
|
|
253
|
+
if not isinstance(raw_files, list):
|
|
254
|
+
logger.warning("Invalid 'files' metadata received; expected list of strings or dicts.")
|
|
255
|
+
return []
|
|
256
|
+
|
|
257
|
+
normalized_files: list[str | dict[str, Any]] = []
|
|
258
|
+
invalid_entry_logged = False
|
|
259
|
+
for entry in raw_files:
|
|
260
|
+
if isinstance(entry, str) and entry:
|
|
261
|
+
normalized_files.append(entry)
|
|
262
|
+
continue
|
|
263
|
+
if isinstance(entry, dict):
|
|
264
|
+
normalized_files.append(entry)
|
|
265
|
+
continue
|
|
266
|
+
if not invalid_entry_logged:
|
|
267
|
+
logger.warning("Invalid file metadata entry received; expected string or dict.")
|
|
268
|
+
invalid_entry_logged = True
|
|
269
|
+
|
|
270
|
+
return normalized_files
|
|
@@ -0,0 +1,47 @@
|
|
|
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 LangGraphAgentProtocol as LangGraphAgentProtocol
|
|
7
|
+
from aip_agents.schema.step_limit import StepLimitConfig as StepLimitConfig
|
|
8
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
9
|
+
|
|
10
|
+
logger: Incomplete
|
|
11
|
+
|
|
12
|
+
class LangGraphA2AExecutor(BaseA2AExecutor, ABC):
|
|
13
|
+
"""Base class for LangChain-based A2A executors.
|
|
14
|
+
|
|
15
|
+
This class extends BaseA2AExecutor to provide common functionality for executors
|
|
16
|
+
that work with LangChain-based agents (LangChainAgent and LangGraphAgent).
|
|
17
|
+
It implements shared methods for handling streaming responses and managing
|
|
18
|
+
agent execution, while leaving agent-specific initialization to subclasses.
|
|
19
|
+
|
|
20
|
+
Attributes:
|
|
21
|
+
agent (LangGraphAgentProtocol): The LangChain-based agent instance to be executed.
|
|
22
|
+
"""
|
|
23
|
+
agent: LangGraphAgentProtocol
|
|
24
|
+
def __init__(self, langgraph_agent_instance: LangGraphAgentProtocol) -> None:
|
|
25
|
+
"""Initializes the LangGraphA2AExecutor.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
langgraph_agent_instance: Component implementing `LangGraphAgentProtocol`.
|
|
29
|
+
|
|
30
|
+
Raises:
|
|
31
|
+
TypeError: If the provided agent does not satisfy `LangGraphAgentProtocol`.
|
|
32
|
+
"""
|
|
33
|
+
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
34
|
+
"""Processes an incoming agent request using a LangChain-based agent.
|
|
35
|
+
|
|
36
|
+
This method first performs initial checks using _handle_initial_execute_checks.
|
|
37
|
+
If successful, it prepares the _process_stream coroutine and passes it to
|
|
38
|
+
_execute_agent_processing from the base class to manage its lifecycle.
|
|
39
|
+
The _process_stream method is responsible for calling the agent's
|
|
40
|
+
arun_a2a_stream and handling its output.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
context (RequestContext): The A2A request context containing message details,
|
|
44
|
+
task ID, and context ID.
|
|
45
|
+
event_queue (EventQueue): The queue for sending A2A events (task status,
|
|
46
|
+
artifacts) back to the server.
|
|
47
|
+
"""
|
aip_agents/a2a/types.py
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""Type definitions and constants for A2A artifact generation.
|
|
2
|
+
|
|
3
|
+
This module provides common MIME types, artifact types, and other constants
|
|
4
|
+
used in A2A artifact generation to ensure consistency across the codebase.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import base64
|
|
11
|
+
from enum import StrEnum
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, Field, field_validator
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MimeType(StrEnum):
|
|
18
|
+
"""Common MIME types for A2A artifacts.
|
|
19
|
+
|
|
20
|
+
This class provides constants for commonly used MIME types in artifact generation,
|
|
21
|
+
ensuring consistency and reducing typos across the codebase.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
# Text formats
|
|
25
|
+
TEXT_PLAIN = "text/plain"
|
|
26
|
+
TEXT_HTML = "text/html"
|
|
27
|
+
TEXT_CSS = "text/css"
|
|
28
|
+
TEXT_JAVASCRIPT = "text/javascript"
|
|
29
|
+
TEXT_CSV = "text/csv"
|
|
30
|
+
TEXT_XML = "text/xml"
|
|
31
|
+
TEXT_MARKDOWN = "text/markdown"
|
|
32
|
+
|
|
33
|
+
# Application formats
|
|
34
|
+
APPLICATION_JSON = "application/json"
|
|
35
|
+
APPLICATION_XML = "application/xml"
|
|
36
|
+
APPLICATION_PDF = "application/pdf"
|
|
37
|
+
APPLICATION_ZIP = "application/zip"
|
|
38
|
+
APPLICATION_GZIP = "application/gzip"
|
|
39
|
+
APPLICATION_TAR = "application/x-tar"
|
|
40
|
+
APPLICATION_OCTET_STREAM = "application/octet-stream"
|
|
41
|
+
|
|
42
|
+
# Microsoft Office formats
|
|
43
|
+
APPLICATION_MSWORD = "application/msword"
|
|
44
|
+
APPLICATION_EXCEL = "application/vnd.ms-excel"
|
|
45
|
+
APPLICATION_POWERPOINT = "application/vnd.ms-powerpoint"
|
|
46
|
+
APPLICATION_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
47
|
+
APPLICATION_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
48
|
+
APPLICATION_PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
|
49
|
+
|
|
50
|
+
# Image formats
|
|
51
|
+
IMAGE_JPEG = "image/jpeg"
|
|
52
|
+
IMAGE_PNG = "image/png"
|
|
53
|
+
IMAGE_GIF = "image/gif"
|
|
54
|
+
IMAGE_WEBP = "image/webp"
|
|
55
|
+
IMAGE_SVG = "image/svg+xml"
|
|
56
|
+
IMAGE_BMP = "image/bmp"
|
|
57
|
+
IMAGE_TIFF = "image/tiff"
|
|
58
|
+
IMAGE_ICO = "image/x-icon"
|
|
59
|
+
|
|
60
|
+
# Audio formats
|
|
61
|
+
AUDIO_MP3 = "audio/mpeg"
|
|
62
|
+
AUDIO_WAV = "audio/wav"
|
|
63
|
+
AUDIO_OGG = "audio/ogg"
|
|
64
|
+
AUDIO_AAC = "audio/aac"
|
|
65
|
+
AUDIO_FLAC = "audio/flac"
|
|
66
|
+
|
|
67
|
+
# Video formats
|
|
68
|
+
VIDEO_MP4 = "video/mp4"
|
|
69
|
+
VIDEO_AVI = "video/x-msvideo"
|
|
70
|
+
VIDEO_MOV = "video/quicktime"
|
|
71
|
+
VIDEO_WMV = "video/x-ms-wmv"
|
|
72
|
+
VIDEO_WEBM = "video/webm"
|
|
73
|
+
VIDEO_MKV = "video/x-matroska"
|
|
74
|
+
|
|
75
|
+
# Font formats
|
|
76
|
+
FONT_TTF = "font/ttf"
|
|
77
|
+
FONT_OTF = "font/otf"
|
|
78
|
+
FONT_WOFF = "font/woff"
|
|
79
|
+
FONT_WOFF2 = "font/woff2"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class ArtifactType(StrEnum):
|
|
83
|
+
"""Common artifact types for A2A artifacts.
|
|
84
|
+
|
|
85
|
+
This class provides constants for artifact types used in the A2A protocol.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
FILE = "file"
|
|
89
|
+
DATA = "data"
|
|
90
|
+
TEXT = "text"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# Common file extension to MIME type mappings
|
|
94
|
+
EXTENSION_TO_MIME_TYPE = {
|
|
95
|
+
# Text files
|
|
96
|
+
".txt": MimeType.TEXT_PLAIN,
|
|
97
|
+
".html": MimeType.TEXT_HTML,
|
|
98
|
+
".htm": MimeType.TEXT_HTML,
|
|
99
|
+
".css": MimeType.TEXT_CSS,
|
|
100
|
+
".js": MimeType.TEXT_JAVASCRIPT,
|
|
101
|
+
".csv": MimeType.TEXT_CSV,
|
|
102
|
+
".xml": MimeType.TEXT_XML,
|
|
103
|
+
".md": MimeType.TEXT_MARKDOWN,
|
|
104
|
+
".markdown": MimeType.TEXT_MARKDOWN,
|
|
105
|
+
# Application files
|
|
106
|
+
".json": MimeType.APPLICATION_JSON,
|
|
107
|
+
".pdf": MimeType.APPLICATION_PDF,
|
|
108
|
+
".zip": MimeType.APPLICATION_ZIP,
|
|
109
|
+
".gz": MimeType.APPLICATION_GZIP,
|
|
110
|
+
".tar": MimeType.APPLICATION_TAR,
|
|
111
|
+
# Microsoft Office
|
|
112
|
+
".doc": MimeType.APPLICATION_MSWORD,
|
|
113
|
+
".xls": MimeType.APPLICATION_EXCEL,
|
|
114
|
+
".ppt": MimeType.APPLICATION_POWERPOINT,
|
|
115
|
+
".docx": MimeType.APPLICATION_DOCX,
|
|
116
|
+
".xlsx": MimeType.APPLICATION_XLSX,
|
|
117
|
+
".pptx": MimeType.APPLICATION_PPTX,
|
|
118
|
+
# Images
|
|
119
|
+
".jpg": MimeType.IMAGE_JPEG,
|
|
120
|
+
".jpeg": MimeType.IMAGE_JPEG,
|
|
121
|
+
".png": MimeType.IMAGE_PNG,
|
|
122
|
+
".gif": MimeType.IMAGE_GIF,
|
|
123
|
+
".webp": MimeType.IMAGE_WEBP,
|
|
124
|
+
".svg": MimeType.IMAGE_SVG,
|
|
125
|
+
".bmp": MimeType.IMAGE_BMP,
|
|
126
|
+
".tiff": MimeType.IMAGE_TIFF,
|
|
127
|
+
".tif": MimeType.IMAGE_TIFF,
|
|
128
|
+
".ico": MimeType.IMAGE_ICO,
|
|
129
|
+
# Audio
|
|
130
|
+
".mp3": MimeType.AUDIO_MP3,
|
|
131
|
+
".wav": MimeType.AUDIO_WAV,
|
|
132
|
+
".ogg": MimeType.AUDIO_OGG,
|
|
133
|
+
".aac": MimeType.AUDIO_AAC,
|
|
134
|
+
".flac": MimeType.AUDIO_FLAC,
|
|
135
|
+
# Video
|
|
136
|
+
".mp4": MimeType.VIDEO_MP4,
|
|
137
|
+
".avi": MimeType.VIDEO_AVI,
|
|
138
|
+
".mov": MimeType.VIDEO_MOV,
|
|
139
|
+
".wmv": MimeType.VIDEO_WMV,
|
|
140
|
+
".webm": MimeType.VIDEO_WEBM,
|
|
141
|
+
".mkv": MimeType.VIDEO_MKV,
|
|
142
|
+
# Fonts
|
|
143
|
+
".ttf": MimeType.FONT_TTF,
|
|
144
|
+
".otf": MimeType.FONT_OTF,
|
|
145
|
+
".woff": MimeType.FONT_WOFF,
|
|
146
|
+
".woff2": MimeType.FONT_WOFF2,
|
|
147
|
+
}
|
|
148
|
+
MIME_TYPE_TO_EXTENSION = {v: k for k, v in EXTENSION_TO_MIME_TYPE.items()}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def get_mime_type_from_filename(filename: str) -> str:
|
|
152
|
+
"""Get MIME type from filename extension.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
filename: The filename to get the MIME type for.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
The MIME type string, or application/octet-stream if unknown.
|
|
159
|
+
|
|
160
|
+
Example:
|
|
161
|
+
>>> get_mime_type_from_filename("data.csv")
|
|
162
|
+
'text/csv'
|
|
163
|
+
>>> get_mime_type_from_filename("image.png")
|
|
164
|
+
'image/png'
|
|
165
|
+
>>> get_mime_type_from_filename("unknown.xyz")
|
|
166
|
+
'application/octet-stream'
|
|
167
|
+
"""
|
|
168
|
+
if "." not in filename:
|
|
169
|
+
return MimeType.APPLICATION_OCTET_STREAM
|
|
170
|
+
|
|
171
|
+
extension = "." + filename.split(".")[-1].lower()
|
|
172
|
+
return EXTENSION_TO_MIME_TYPE.get(extension, MimeType.APPLICATION_OCTET_STREAM)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def get_extension_from_mime_type(mime_type: str) -> str | None:
|
|
176
|
+
"""Get file extension from MIME type.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
mime_type: The MIME type to get the extension for.
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
The file extension (with dot) or None if not found.
|
|
183
|
+
|
|
184
|
+
Example:
|
|
185
|
+
>>> get_extension_from_mime_type("text/csv")
|
|
186
|
+
'.csv'
|
|
187
|
+
>>> get_extension_from_mime_type("image/png")
|
|
188
|
+
'.png'
|
|
189
|
+
>>> get_extension_from_mime_type("unknown/type")
|
|
190
|
+
None
|
|
191
|
+
"""
|
|
192
|
+
return MIME_TYPE_TO_EXTENSION.get(mime_type)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class Artifact(BaseModel):
|
|
196
|
+
"""Represents an artifact payload used by A2A helpers and executors.
|
|
197
|
+
|
|
198
|
+
This model standardizes the structure for artifacts generated by tools and
|
|
199
|
+
passed through the A2A pipeline.
|
|
200
|
+
|
|
201
|
+
Attributes:
|
|
202
|
+
artifact_type (ArtifactType): The type of artifact. Defaults to FILE.
|
|
203
|
+
data (str): Base64-encoded content of the artifact.
|
|
204
|
+
name (str): Display name or filename of the artifact.
|
|
205
|
+
description (str): Optional description for the artifact. Defaults to empty string.
|
|
206
|
+
mime_type (str): MIME type of the artifact content.
|
|
207
|
+
metadata (dict[str, Any] | None): Optional per-artifact metadata to pass through.
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
artifact_type: ArtifactType = Field(default=ArtifactType.FILE)
|
|
211
|
+
data: str
|
|
212
|
+
name: str
|
|
213
|
+
description: str = ""
|
|
214
|
+
mime_type: str
|
|
215
|
+
metadata: dict[str, Any] | None = None
|
|
216
|
+
|
|
217
|
+
@field_validator("data")
|
|
218
|
+
@classmethod
|
|
219
|
+
def validate_base64(cls, v: str) -> str:
|
|
220
|
+
"""Validate that 'data' is a valid base64 string.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
v (str): The base64 string to validate.
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
str: The validated base64 string if valid.
|
|
227
|
+
"""
|
|
228
|
+
try:
|
|
229
|
+
base64.b64decode(v, validate=True)
|
|
230
|
+
except Exception as exc: # noqa: BLE001
|
|
231
|
+
raise ValueError("Artifact.data must be a valid base64-encoded string") from exc
|
|
232
|
+
return v
|
aip_agents/a2a/types.pyi
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from enum import StrEnum
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
class MimeType(StrEnum):
|
|
7
|
+
"""Common MIME types for A2A artifacts.
|
|
8
|
+
|
|
9
|
+
This class provides constants for commonly used MIME types in artifact generation,
|
|
10
|
+
ensuring consistency and reducing typos across the codebase.
|
|
11
|
+
"""
|
|
12
|
+
TEXT_PLAIN: str
|
|
13
|
+
TEXT_HTML: str
|
|
14
|
+
TEXT_CSS: str
|
|
15
|
+
TEXT_JAVASCRIPT: str
|
|
16
|
+
TEXT_CSV: str
|
|
17
|
+
TEXT_XML: str
|
|
18
|
+
TEXT_MARKDOWN: str
|
|
19
|
+
APPLICATION_JSON: str
|
|
20
|
+
APPLICATION_XML: str
|
|
21
|
+
APPLICATION_PDF: str
|
|
22
|
+
APPLICATION_ZIP: str
|
|
23
|
+
APPLICATION_GZIP: str
|
|
24
|
+
APPLICATION_TAR: str
|
|
25
|
+
APPLICATION_OCTET_STREAM: str
|
|
26
|
+
APPLICATION_MSWORD: str
|
|
27
|
+
APPLICATION_EXCEL: str
|
|
28
|
+
APPLICATION_POWERPOINT: str
|
|
29
|
+
APPLICATION_DOCX: str
|
|
30
|
+
APPLICATION_XLSX: str
|
|
31
|
+
APPLICATION_PPTX: str
|
|
32
|
+
IMAGE_JPEG: str
|
|
33
|
+
IMAGE_PNG: str
|
|
34
|
+
IMAGE_GIF: str
|
|
35
|
+
IMAGE_WEBP: str
|
|
36
|
+
IMAGE_SVG: str
|
|
37
|
+
IMAGE_BMP: str
|
|
38
|
+
IMAGE_TIFF: str
|
|
39
|
+
IMAGE_ICO: str
|
|
40
|
+
AUDIO_MP3: str
|
|
41
|
+
AUDIO_WAV: str
|
|
42
|
+
AUDIO_OGG: str
|
|
43
|
+
AUDIO_AAC: str
|
|
44
|
+
AUDIO_FLAC: str
|
|
45
|
+
VIDEO_MP4: str
|
|
46
|
+
VIDEO_AVI: str
|
|
47
|
+
VIDEO_MOV: str
|
|
48
|
+
VIDEO_WMV: str
|
|
49
|
+
VIDEO_WEBM: str
|
|
50
|
+
VIDEO_MKV: str
|
|
51
|
+
FONT_TTF: str
|
|
52
|
+
FONT_OTF: str
|
|
53
|
+
FONT_WOFF: str
|
|
54
|
+
FONT_WOFF2: str
|
|
55
|
+
|
|
56
|
+
class ArtifactType(StrEnum):
|
|
57
|
+
"""Common artifact types for A2A artifacts.
|
|
58
|
+
|
|
59
|
+
This class provides constants for artifact types used in the A2A protocol.
|
|
60
|
+
"""
|
|
61
|
+
FILE: str
|
|
62
|
+
DATA: str
|
|
63
|
+
TEXT: str
|
|
64
|
+
|
|
65
|
+
EXTENSION_TO_MIME_TYPE: Incomplete
|
|
66
|
+
MIME_TYPE_TO_EXTENSION: Incomplete
|
|
67
|
+
|
|
68
|
+
def get_mime_type_from_filename(filename: str) -> str:
|
|
69
|
+
'''Get MIME type from filename extension.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
filename: The filename to get the MIME type for.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
The MIME type string, or application/octet-stream if unknown.
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
>>> get_mime_type_from_filename("data.csv")
|
|
79
|
+
\'text/csv\'
|
|
80
|
+
>>> get_mime_type_from_filename("image.png")
|
|
81
|
+
\'image/png\'
|
|
82
|
+
>>> get_mime_type_from_filename("unknown.xyz")
|
|
83
|
+
\'application/octet-stream\'
|
|
84
|
+
'''
|
|
85
|
+
def get_extension_from_mime_type(mime_type: str) -> str | None:
|
|
86
|
+
'''Get file extension from MIME type.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
mime_type: The MIME type to get the extension for.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
The file extension (with dot) or None if not found.
|
|
93
|
+
|
|
94
|
+
Example:
|
|
95
|
+
>>> get_extension_from_mime_type("text/csv")
|
|
96
|
+
\'.csv\'
|
|
97
|
+
>>> get_extension_from_mime_type("image/png")
|
|
98
|
+
\'.png\'
|
|
99
|
+
>>> get_extension_from_mime_type("unknown/type")
|
|
100
|
+
None
|
|
101
|
+
'''
|
|
102
|
+
|
|
103
|
+
class Artifact(BaseModel):
|
|
104
|
+
"""Represents an artifact payload used by A2A helpers and executors.
|
|
105
|
+
|
|
106
|
+
This model standardizes the structure for artifacts generated by tools and
|
|
107
|
+
passed through the A2A pipeline.
|
|
108
|
+
|
|
109
|
+
Attributes:
|
|
110
|
+
artifact_type (ArtifactType): The type of artifact. Defaults to FILE.
|
|
111
|
+
data (str): Base64-encoded content of the artifact.
|
|
112
|
+
name (str): Display name or filename of the artifact.
|
|
113
|
+
description (str): Optional description for the artifact. Defaults to empty string.
|
|
114
|
+
mime_type (str): MIME type of the artifact content.
|
|
115
|
+
metadata (dict[str, Any] | None): Optional per-artifact metadata to pass through.
|
|
116
|
+
"""
|
|
117
|
+
artifact_type: ArtifactType
|
|
118
|
+
data: str
|
|
119
|
+
name: str
|
|
120
|
+
description: str
|
|
121
|
+
mime_type: str
|
|
122
|
+
metadata: dict[str, Any] | None
|
|
123
|
+
@classmethod
|
|
124
|
+
def validate_base64(cls, v: str) -> str:
|
|
125
|
+
"""Validate that 'data' is a valid base64 string.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
v (str): The base64 string to validate.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
str: The validated base64 string if valid.
|
|
132
|
+
"""
|