aip-agents-binary 0.5.25b1__py3-none-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aip_agents/__init__.py +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +2948 -0
- aip_agents/agent/base_langgraph_agent.pyi +232 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
- aip_agents/agent/langgraph_react_agent.py +2596 -0
- aip_agents/agent/langgraph_react_agent.pyi +131 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/demo_memory_recall.py +401 -0
- aip_agents/examples/demo_memory_recall.pyi +58 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +46 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +193 -0
- aip_agents/mcp/client/connection_manager.pyi +48 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +362 -0
- aip_agents/mcp/client/persistent_session.pyi +113 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +228 -0
- aip_agents/mcp/client/transports.pyi +123 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +717 -0
- aip_agents/memory/adapters/base_adapter.pyi +150 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +53 -0
- aip_agents/tools/__init__.pyi +9 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +813 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.py +22 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +258 -0
- aip_agents/tools/memory_search/mem0.pyi +19 -0
- aip_agents/tools/memory_search/schema.py +48 -0
- aip_agents/tools/memory_search/schema.pyi +15 -0
- aip_agents/tools/memory_search_tool.py +26 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +967 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.5.25b1.dist-info/METADATA +681 -0
- aip_agents_binary-0.5.25b1.dist-info/RECORD +566 -0
- aip_agents_binary-0.5.25b1.dist-info/WHEEL +5 -0
- aip_agents_binary-0.5.25b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
"""Langflow agent implementation for integrating with Langflow API.
|
|
2
|
+
|
|
3
|
+
This module provides the LangflowAgent class that integrates with Langflow flows
|
|
4
|
+
through the SDK's agent framework, supporting both streaming and non-streaming
|
|
5
|
+
execution modes with full A2A compatibility.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import asyncio
|
|
12
|
+
import uuid
|
|
13
|
+
from collections.abc import AsyncGenerator
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from a2a.types import AgentCard
|
|
17
|
+
|
|
18
|
+
from aip_agents.agent.base_agent import BaseAgent
|
|
19
|
+
from aip_agents.clients.langflow import LangflowApiClient
|
|
20
|
+
from aip_agents.clients.langflow.types import LangflowEventType
|
|
21
|
+
from aip_agents.schema.agent import LangflowAgentConfig
|
|
22
|
+
from aip_agents.types import A2AEvent, A2AStreamEventType
|
|
23
|
+
from aip_agents.utils.logger import get_logger
|
|
24
|
+
from aip_agents.utils.sse_chunk_transformer import SSEChunkTransformer
|
|
25
|
+
|
|
26
|
+
logger = get_logger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class LangflowAgent(BaseAgent):
|
|
30
|
+
"""Langflow agent implementation for executing Langflow flows.
|
|
31
|
+
|
|
32
|
+
This agent integrates with Langflow APIs to execute flows while providing
|
|
33
|
+
full compatibility with the SDK's agent framework, including:
|
|
34
|
+
- Synchronous and asynchronous execution
|
|
35
|
+
- Regular and A2A streaming support
|
|
36
|
+
- Session management for conversation continuity
|
|
37
|
+
- Error handling and retry logic
|
|
38
|
+
- Credential management through BaseAgent
|
|
39
|
+
|
|
40
|
+
The agent builds on BaseAgent to gain shared A2A utilities while focusing on
|
|
41
|
+
Langflow-specific execution logic.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__( # noqa: PLR0913
|
|
45
|
+
self,
|
|
46
|
+
name: str,
|
|
47
|
+
flow_id: str,
|
|
48
|
+
description: str | None = None,
|
|
49
|
+
base_url: str | None = None,
|
|
50
|
+
api_key: str | None = None,
|
|
51
|
+
config: LangflowAgentConfig | dict[str, Any] | None = None,
|
|
52
|
+
**kwargs: Any,
|
|
53
|
+
):
|
|
54
|
+
"""Initialize the LangflowAgent.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
name: The name of the agent.
|
|
58
|
+
flow_id: The unique identifier of the Langflow flow to execute.
|
|
59
|
+
description: Human-readable description.
|
|
60
|
+
base_url: The base URL of the Langflow API server.
|
|
61
|
+
api_key: The API key for Langflow authentication.
|
|
62
|
+
config: Langflow-specific configuration or dict.
|
|
63
|
+
**kwargs: Additional keyword arguments passed to BaseAgent.
|
|
64
|
+
"""
|
|
65
|
+
config = self._create_or_update_config(flow_id, base_url, api_key, config)
|
|
66
|
+
|
|
67
|
+
super().__init__(
|
|
68
|
+
name=name,
|
|
69
|
+
instruction="",
|
|
70
|
+
description=description,
|
|
71
|
+
model=None,
|
|
72
|
+
tools=None,
|
|
73
|
+
config=config,
|
|
74
|
+
**kwargs,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
self.langflow_config = config
|
|
78
|
+
self.flow_id = flow_id
|
|
79
|
+
self.api_client = LangflowApiClient(
|
|
80
|
+
flow_id=config.flow_id,
|
|
81
|
+
base_url=config.base_url,
|
|
82
|
+
api_key=config.api_key,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
logger.info(f"Initialized LangflowAgent '{name}' for flow {self.flow_id}")
|
|
86
|
+
|
|
87
|
+
def _create_or_update_config(
|
|
88
|
+
self,
|
|
89
|
+
flow_id: str,
|
|
90
|
+
base_url: str | None,
|
|
91
|
+
api_key: str | None,
|
|
92
|
+
config: LangflowAgentConfig | dict[str, Any] | None,
|
|
93
|
+
) -> LangflowAgentConfig:
|
|
94
|
+
"""Create or update LangflowAgentConfig based on provided parameters.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
flow_id: The unique identifier of the Langflow flow to execute.
|
|
98
|
+
base_url: The base URL of the Langflow API server.
|
|
99
|
+
api_key: The API key for Langflow authentication.
|
|
100
|
+
config: Existing configuration to update or None to create new.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
LangflowAgentConfig instance with updated values.
|
|
104
|
+
"""
|
|
105
|
+
if config is None:
|
|
106
|
+
return LangflowAgentConfig(
|
|
107
|
+
flow_id=flow_id,
|
|
108
|
+
base_url=base_url,
|
|
109
|
+
api_key=api_key,
|
|
110
|
+
)
|
|
111
|
+
elif isinstance(config, dict):
|
|
112
|
+
config_dict = config.copy()
|
|
113
|
+
config_dict.update(
|
|
114
|
+
{
|
|
115
|
+
"flow_id": flow_id,
|
|
116
|
+
"base_url": base_url or config_dict.get("base_url"),
|
|
117
|
+
"api_key": api_key or config_dict.get("api_key"),
|
|
118
|
+
}
|
|
119
|
+
)
|
|
120
|
+
return LangflowAgentConfig(**config_dict)
|
|
121
|
+
elif isinstance(config, LangflowAgentConfig):
|
|
122
|
+
if flow_id:
|
|
123
|
+
config.flow_id = flow_id
|
|
124
|
+
if base_url:
|
|
125
|
+
config.base_url = base_url
|
|
126
|
+
if api_key:
|
|
127
|
+
config.api_key = api_key
|
|
128
|
+
return config
|
|
129
|
+
|
|
130
|
+
return LangflowAgentConfig(flow_id=flow_id, base_url=base_url, api_key=api_key)
|
|
131
|
+
|
|
132
|
+
def _get_or_create_session(self, **kwargs: Any) -> str:
|
|
133
|
+
"""Get or create a session ID for the current conversation context.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
**kwargs: Keyword arguments that may contain configurable with thread_id.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
Session ID for the conversation.
|
|
140
|
+
"""
|
|
141
|
+
configurable = kwargs.get("configurable", {})
|
|
142
|
+
thread_id = configurable.get("thread_id")
|
|
143
|
+
|
|
144
|
+
if thread_id:
|
|
145
|
+
logger.debug(f"Using thread_id as session_id: {thread_id}")
|
|
146
|
+
return thread_id
|
|
147
|
+
else:
|
|
148
|
+
session_id = str(uuid.uuid4())
|
|
149
|
+
logger.debug(f"Generated new session_id: {session_id}")
|
|
150
|
+
return session_id
|
|
151
|
+
|
|
152
|
+
def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
153
|
+
"""Synchronously run the Langflow agent.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
query: The input query for the agent.
|
|
157
|
+
**kwargs: Additional keyword arguments.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
Dictionary containing the agent's response.
|
|
161
|
+
"""
|
|
162
|
+
try:
|
|
163
|
+
try:
|
|
164
|
+
loop = asyncio.get_running_loop()
|
|
165
|
+
if loop.is_running():
|
|
166
|
+
logger.warning(
|
|
167
|
+
f"Agent '{self.name}': Cannot use sync 'run' from within async context. Use 'arun' instead."
|
|
168
|
+
)
|
|
169
|
+
raise RuntimeError(f"Agent '{self.name}': sync 'run' cannot be called from within an async context")
|
|
170
|
+
except RuntimeError:
|
|
171
|
+
pass
|
|
172
|
+
|
|
173
|
+
return asyncio.run(self.arun(query, **kwargs))
|
|
174
|
+
except RuntimeError as e:
|
|
175
|
+
raise RuntimeError(f"Agent '{self.name}': Error in sync 'run'. Original: {e}") from e
|
|
176
|
+
|
|
177
|
+
async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
178
|
+
"""Asynchronously run the Langflow agent.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
query: The input query for the agent.
|
|
182
|
+
**kwargs: Additional keyword arguments.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
Dictionary containing the agent's response and metadata.
|
|
186
|
+
"""
|
|
187
|
+
try:
|
|
188
|
+
session_id = self._get_or_create_session(**kwargs)
|
|
189
|
+
|
|
190
|
+
logger.debug(f"Agent '{self.name}': Executing flow {self.flow_id} with session {session_id}")
|
|
191
|
+
|
|
192
|
+
result = await self.api_client.call_flow(input_value=query, session_id=session_id, **kwargs)
|
|
193
|
+
|
|
194
|
+
return result["outputs"][0]["outputs"][0]["results"]["message"]["text"]
|
|
195
|
+
except Exception as e:
|
|
196
|
+
logger.error(f"Agent '{self.name}': Error during execution: {e}")
|
|
197
|
+
raise RuntimeError(f"Agent '{self.name}': Execution failed: {e}") from e
|
|
198
|
+
|
|
199
|
+
async def arun_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[str | dict[str, Any], None]:
|
|
200
|
+
"""Asynchronously stream the Langflow agent's response.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
query: The input query for the agent.
|
|
204
|
+
**kwargs: Additional keyword arguments.
|
|
205
|
+
|
|
206
|
+
Yields:
|
|
207
|
+
Chunks of output (strings or dicts) from the streaming response.
|
|
208
|
+
"""
|
|
209
|
+
try:
|
|
210
|
+
session_id = self._get_or_create_session(**kwargs)
|
|
211
|
+
|
|
212
|
+
logger.debug(f"Agent '{self.name}': Streaming flow {self.flow_id} with session {session_id}")
|
|
213
|
+
|
|
214
|
+
async for event_data in self.api_client.stream_flow(input_value=query, session_id=session_id, **kwargs):
|
|
215
|
+
parsed_event = self.api_client.parse_stream_event(event_data)
|
|
216
|
+
if parsed_event:
|
|
217
|
+
content = parsed_event.get("content", "")
|
|
218
|
+
if content:
|
|
219
|
+
yield content
|
|
220
|
+
|
|
221
|
+
except Exception as e:
|
|
222
|
+
logger.error(f"Agent '{self.name}': Error during streaming: {e}")
|
|
223
|
+
yield {"error": f"Streaming failed: {e}"}
|
|
224
|
+
|
|
225
|
+
async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
|
|
226
|
+
"""Asynchronously stream the agent's response in A2A format.
|
|
227
|
+
|
|
228
|
+
This method converts Langflow streaming events into A2A-compatible events
|
|
229
|
+
following the patterns established by BaseLangGraphAgent.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
query: The input query for the agent.
|
|
233
|
+
**kwargs: Additional keyword arguments.
|
|
234
|
+
|
|
235
|
+
Yields:
|
|
236
|
+
A2A-compatible event dictionaries with semantic event types.
|
|
237
|
+
"""
|
|
238
|
+
try:
|
|
239
|
+
session_id = self._get_or_create_session(**kwargs)
|
|
240
|
+
logger.debug(f"Agent '{self.name}': A2A streaming flow {self.flow_id} with session {session_id}")
|
|
241
|
+
|
|
242
|
+
# Yield initial status update
|
|
243
|
+
yield self._create_initial_status_event(session_id)
|
|
244
|
+
|
|
245
|
+
final_content = ""
|
|
246
|
+
|
|
247
|
+
async for event_data in self.api_client.stream_flow(input_value=query, session_id=session_id, **kwargs):
|
|
248
|
+
parsed_event = self.api_client.parse_stream_event(event_data)
|
|
249
|
+
if not parsed_event:
|
|
250
|
+
continue
|
|
251
|
+
|
|
252
|
+
event_type = parsed_event.get("type")
|
|
253
|
+
content = parsed_event.get("content", "")
|
|
254
|
+
|
|
255
|
+
if event_type == LangflowEventType.ADD_MESSAGE:
|
|
256
|
+
if content:
|
|
257
|
+
final_content = content
|
|
258
|
+
|
|
259
|
+
elif event_type == LangflowEventType.END:
|
|
260
|
+
yield self._create_final_response_event(final_content, session_id)
|
|
261
|
+
return
|
|
262
|
+
|
|
263
|
+
elif content:
|
|
264
|
+
yield self._create_a2a_event(
|
|
265
|
+
event_type=A2AStreamEventType.STATUS_UPDATE,
|
|
266
|
+
content=content,
|
|
267
|
+
is_final=False,
|
|
268
|
+
session_id=session_id,
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
yield self._create_final_response_event(final_content, session_id)
|
|
272
|
+
|
|
273
|
+
except Exception as e:
|
|
274
|
+
logger.error(f"Agent '{self.name}': Error during A2A streaming: {e}")
|
|
275
|
+
error_session_id = self._get_error_session_id(**kwargs)
|
|
276
|
+
yield self._create_error_event(str(e), error_session_id)
|
|
277
|
+
|
|
278
|
+
async def arun_sse_stream(
|
|
279
|
+
self,
|
|
280
|
+
query: str,
|
|
281
|
+
task_id: str | None = None,
|
|
282
|
+
context_id: str | None = None,
|
|
283
|
+
**kwargs: Any,
|
|
284
|
+
) -> AsyncGenerator[dict[str, Any], None]:
|
|
285
|
+
"""Stream agent response as SSE-compatible chunks.
|
|
286
|
+
|
|
287
|
+
This method wraps arun_a2a_stream and transforms output to the normalized
|
|
288
|
+
dict format matching A2AConnector.astream_to_agent output, enabling direct
|
|
289
|
+
streaming without A2A server overhead.
|
|
290
|
+
|
|
291
|
+
Args:
|
|
292
|
+
query: The input query for the agent.
|
|
293
|
+
task_id: Optional task identifier for the stream.
|
|
294
|
+
context_id: Optional context identifier for the stream.
|
|
295
|
+
**kwargs: Additional arguments passed to arun_a2a_stream.
|
|
296
|
+
|
|
297
|
+
Yields:
|
|
298
|
+
SSEChunk dicts with normalized structure:
|
|
299
|
+
- status: "success" | "error"
|
|
300
|
+
- task_state: "working" | "completed" | "failed" | "canceled"
|
|
301
|
+
- content: Text content or None
|
|
302
|
+
- event_type: Always string (never enum)
|
|
303
|
+
- final: True for terminal events
|
|
304
|
+
- metadata: Normalized metadata dict
|
|
305
|
+
- artifacts: Only present when non-empty
|
|
306
|
+
"""
|
|
307
|
+
if task_id is None:
|
|
308
|
+
task_id = str(uuid.uuid4())
|
|
309
|
+
if context_id is None:
|
|
310
|
+
context_id = str(uuid.uuid4())
|
|
311
|
+
|
|
312
|
+
# Extract pii_mapping from kwargs to pass to transformer (matching A2A executor behavior)
|
|
313
|
+
pii_mapping = kwargs.get("pii_mapping")
|
|
314
|
+
transformer = SSEChunkTransformer(task_id=task_id, context_id=context_id, pii_mapping=pii_mapping)
|
|
315
|
+
try:
|
|
316
|
+
async for chunk in transformer.transform_stream(self.arun_a2a_stream(query, **kwargs)):
|
|
317
|
+
yield chunk
|
|
318
|
+
except Exception as e:
|
|
319
|
+
logger.error(f"Agent '{self.name}': Error in arun_sse_stream: {e}", exc_info=True)
|
|
320
|
+
yield SSEChunkTransformer._create_error_chunk(f"Error during streaming: {e}")
|
|
321
|
+
|
|
322
|
+
def _create_initial_status_event(self, session_id: str) -> A2AEvent:
|
|
323
|
+
"""Create the initial status update event for A2A streaming.
|
|
324
|
+
|
|
325
|
+
Args:
|
|
326
|
+
session_id: The session ID for the conversation.
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
A2A event dictionary for initial status update.
|
|
330
|
+
"""
|
|
331
|
+
return self._create_a2a_event(
|
|
332
|
+
event_type=A2AStreamEventType.STATUS_UPDATE,
|
|
333
|
+
content="Performing agent tasks",
|
|
334
|
+
is_final=False,
|
|
335
|
+
metadata={
|
|
336
|
+
"agent_name": self.name,
|
|
337
|
+
"step_id": "status_update_001",
|
|
338
|
+
"previous_step_ids": [],
|
|
339
|
+
"session_id": session_id,
|
|
340
|
+
},
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
def _create_final_response_event(self, content: str, session_id: str) -> A2AEvent:
|
|
344
|
+
"""Create a final response event for A2A streaming.
|
|
345
|
+
|
|
346
|
+
Args:
|
|
347
|
+
content: The final response content.
|
|
348
|
+
session_id: The session ID for the conversation.
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
A2A event dictionary for final response.
|
|
352
|
+
"""
|
|
353
|
+
return self._create_a2a_event(
|
|
354
|
+
event_type=A2AStreamEventType.FINAL_RESPONSE,
|
|
355
|
+
content=content,
|
|
356
|
+
is_final=True,
|
|
357
|
+
session_id=session_id,
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
def _get_error_session_id(self, **kwargs: Any) -> str | None:
|
|
361
|
+
"""Get session ID for error handling, with fallback to None if fails.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
**kwargs: Keyword arguments that may contain configurable with thread_id.
|
|
365
|
+
|
|
366
|
+
Returns:
|
|
367
|
+
Session ID for error reporting, or None if unable to obtain.
|
|
368
|
+
"""
|
|
369
|
+
try:
|
|
370
|
+
return self._get_or_create_session(**kwargs)
|
|
371
|
+
except Exception as e:
|
|
372
|
+
logger.error(f"Agent '{self.name}': Error getting session_id: {e}")
|
|
373
|
+
return None
|
|
374
|
+
|
|
375
|
+
def _create_error_event(self, error_message: str, session_id: str | None) -> A2AEvent:
|
|
376
|
+
"""Create an error event for A2A streaming.
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
error_message: The error message to include.
|
|
380
|
+
session_id: The session ID for the conversation, if available.
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
A2A event dictionary for error reporting.
|
|
384
|
+
"""
|
|
385
|
+
return self._create_a2a_event(
|
|
386
|
+
event_type=A2AStreamEventType.ERROR,
|
|
387
|
+
content=f"A2A streaming failed: {error_message}",
|
|
388
|
+
is_final=True,
|
|
389
|
+
session_id=session_id,
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
def _create_a2a_event(
|
|
393
|
+
self,
|
|
394
|
+
event_type: A2AStreamEventType,
|
|
395
|
+
content: str,
|
|
396
|
+
is_final: bool = False,
|
|
397
|
+
metadata: dict[str, Any] | None = None,
|
|
398
|
+
session_id: str | None = None,
|
|
399
|
+
) -> A2AEvent:
|
|
400
|
+
"""Create an A2A-compatible event following BaseLangGraphAgent patterns.
|
|
401
|
+
|
|
402
|
+
Args:
|
|
403
|
+
event_type: The semantic type of the event.
|
|
404
|
+
content: The main text content of the event.
|
|
405
|
+
is_final: Whether this is a final event.
|
|
406
|
+
metadata: Additional metadata for the event.
|
|
407
|
+
session_id: Optional session ID to include in metadata.
|
|
408
|
+
|
|
409
|
+
Returns:
|
|
410
|
+
A2A event dictionary.
|
|
411
|
+
"""
|
|
412
|
+
if metadata is None:
|
|
413
|
+
metadata = {"agent_name": self.name, "step_id": f"langflow_{uuid.uuid4().hex[:8]}", "previous_step_ids": []}
|
|
414
|
+
|
|
415
|
+
if session_id:
|
|
416
|
+
metadata["session_id"] = session_id
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
"event_type": event_type,
|
|
420
|
+
"content": content,
|
|
421
|
+
"metadata": metadata,
|
|
422
|
+
"tool_info": None,
|
|
423
|
+
"is_final": is_final,
|
|
424
|
+
"artifacts": None,
|
|
425
|
+
"references": None,
|
|
426
|
+
"step_usage": None,
|
|
427
|
+
"total_usage": None,
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
def register_a2a_agents(self, agents: list[AgentCard]) -> None:
|
|
431
|
+
"""Register A2A agents (not supported for Langflow agents).
|
|
432
|
+
|
|
433
|
+
Args:
|
|
434
|
+
agents: List of AgentCard instances.
|
|
435
|
+
|
|
436
|
+
Raises:
|
|
437
|
+
NotImplementedError: Langflow agents don't support A2A agent registration.
|
|
438
|
+
"""
|
|
439
|
+
logger.warning(f"Agent '{self.name}': A2A agent registration not supported for Langflow agents")
|
|
440
|
+
raise NotImplementedError("Langflow agents don't support A2A agent registration")
|
|
441
|
+
|
|
442
|
+
def add_mcp_server(self, mcp_config: dict[str, dict[str, Any]]) -> None:
|
|
443
|
+
"""Add MCP server configuration (not supported for Langflow agents).
|
|
444
|
+
|
|
445
|
+
Args:
|
|
446
|
+
mcp_config: MCP server configuration.
|
|
447
|
+
|
|
448
|
+
Raises:
|
|
449
|
+
NotImplementedError: Langflow agents don't support MCP servers.
|
|
450
|
+
"""
|
|
451
|
+
logger.warning(f"Agent '{self.name}': MCP server configuration not supported for Langflow agents")
|
|
452
|
+
raise NotImplementedError("Langflow agents don't support MCP servers")
|
|
453
|
+
|
|
454
|
+
async def health_check(self) -> bool:
|
|
455
|
+
"""Check if the Langflow API is accessible.
|
|
456
|
+
|
|
457
|
+
Returns:
|
|
458
|
+
True if the API is accessible, False otherwise.
|
|
459
|
+
"""
|
|
460
|
+
try:
|
|
461
|
+
return await self.api_client.health_check()
|
|
462
|
+
except Exception as e:
|
|
463
|
+
logger.warning(f"Agent '{self.name}': Health check failed: {e}")
|
|
464
|
+
return False
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from a2a.types import AgentCard as AgentCard
|
|
3
|
+
from aip_agents.agent.base_agent import BaseAgent as BaseAgent
|
|
4
|
+
from aip_agents.clients.langflow import LangflowApiClient as LangflowApiClient
|
|
5
|
+
from aip_agents.clients.langflow.types import LangflowEventType as LangflowEventType
|
|
6
|
+
from aip_agents.schema.agent import LangflowAgentConfig as LangflowAgentConfig
|
|
7
|
+
from aip_agents.types import A2AEvent as A2AEvent, A2AStreamEventType as A2AStreamEventType
|
|
8
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
9
|
+
from aip_agents.utils.sse_chunk_transformer import SSEChunkTransformer as SSEChunkTransformer
|
|
10
|
+
from collections.abc import AsyncGenerator
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
logger: Incomplete
|
|
14
|
+
|
|
15
|
+
class LangflowAgent(BaseAgent):
|
|
16
|
+
"""Langflow agent implementation for executing Langflow flows.
|
|
17
|
+
|
|
18
|
+
This agent integrates with Langflow APIs to execute flows while providing
|
|
19
|
+
full compatibility with the SDK's agent framework, including:
|
|
20
|
+
- Synchronous and asynchronous execution
|
|
21
|
+
- Regular and A2A streaming support
|
|
22
|
+
- Session management for conversation continuity
|
|
23
|
+
- Error handling and retry logic
|
|
24
|
+
- Credential management through BaseAgent
|
|
25
|
+
|
|
26
|
+
The agent builds on BaseAgent to gain shared A2A utilities while focusing on
|
|
27
|
+
Langflow-specific execution logic.
|
|
28
|
+
"""
|
|
29
|
+
langflow_config: Incomplete
|
|
30
|
+
flow_id: Incomplete
|
|
31
|
+
api_client: Incomplete
|
|
32
|
+
def __init__(self, name: str, flow_id: str, description: str | None = None, base_url: str | None = None, api_key: str | None = None, config: LangflowAgentConfig | dict[str, Any] | None = None, **kwargs: Any) -> None:
|
|
33
|
+
"""Initialize the LangflowAgent.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
name: The name of the agent.
|
|
37
|
+
flow_id: The unique identifier of the Langflow flow to execute.
|
|
38
|
+
description: Human-readable description.
|
|
39
|
+
base_url: The base URL of the Langflow API server.
|
|
40
|
+
api_key: The API key for Langflow authentication.
|
|
41
|
+
config: Langflow-specific configuration or dict.
|
|
42
|
+
**kwargs: Additional keyword arguments passed to BaseAgent.
|
|
43
|
+
"""
|
|
44
|
+
def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
45
|
+
"""Synchronously run the Langflow agent.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
query: The input query for the agent.
|
|
49
|
+
**kwargs: Additional keyword arguments.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Dictionary containing the agent's response.
|
|
53
|
+
"""
|
|
54
|
+
async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
55
|
+
"""Asynchronously run the Langflow agent.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
query: The input query for the agent.
|
|
59
|
+
**kwargs: Additional keyword arguments.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
Dictionary containing the agent's response and metadata.
|
|
63
|
+
"""
|
|
64
|
+
async def arun_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[str | dict[str, Any], None]:
|
|
65
|
+
"""Asynchronously stream the Langflow agent's response.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
query: The input query for the agent.
|
|
69
|
+
**kwargs: Additional keyword arguments.
|
|
70
|
+
|
|
71
|
+
Yields:
|
|
72
|
+
Chunks of output (strings or dicts) from the streaming response.
|
|
73
|
+
"""
|
|
74
|
+
async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
|
|
75
|
+
"""Asynchronously stream the agent's response in A2A format.
|
|
76
|
+
|
|
77
|
+
This method converts Langflow streaming events into A2A-compatible events
|
|
78
|
+
following the patterns established by BaseLangGraphAgent.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
query: The input query for the agent.
|
|
82
|
+
**kwargs: Additional keyword arguments.
|
|
83
|
+
|
|
84
|
+
Yields:
|
|
85
|
+
A2A-compatible event dictionaries with semantic event types.
|
|
86
|
+
"""
|
|
87
|
+
async def arun_sse_stream(self, query: str, task_id: str | None = None, context_id: str | None = None, **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
|
|
88
|
+
'''Stream agent response as SSE-compatible chunks.
|
|
89
|
+
|
|
90
|
+
This method wraps arun_a2a_stream and transforms output to the normalized
|
|
91
|
+
dict format matching A2AConnector.astream_to_agent output, enabling direct
|
|
92
|
+
streaming without A2A server overhead.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
query: The input query for the agent.
|
|
96
|
+
task_id: Optional task identifier for the stream.
|
|
97
|
+
context_id: Optional context identifier for the stream.
|
|
98
|
+
**kwargs: Additional arguments passed to arun_a2a_stream.
|
|
99
|
+
|
|
100
|
+
Yields:
|
|
101
|
+
SSEChunk dicts with normalized structure:
|
|
102
|
+
- status: "success" | "error"
|
|
103
|
+
- task_state: "working" | "completed" | "failed" | "canceled"
|
|
104
|
+
- content: Text content or None
|
|
105
|
+
- event_type: Always string (never enum)
|
|
106
|
+
- final: True for terminal events
|
|
107
|
+
- metadata: Normalized metadata dict
|
|
108
|
+
- artifacts: Only present when non-empty
|
|
109
|
+
'''
|
|
110
|
+
def register_a2a_agents(self, agents: list[AgentCard]) -> None:
|
|
111
|
+
"""Register A2A agents (not supported for Langflow agents).
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
agents: List of AgentCard instances.
|
|
115
|
+
|
|
116
|
+
Raises:
|
|
117
|
+
NotImplementedError: Langflow agents don't support A2A agent registration.
|
|
118
|
+
"""
|
|
119
|
+
def add_mcp_server(self, mcp_config: dict[str, dict[str, Any]]) -> None:
|
|
120
|
+
"""Add MCP server configuration (not supported for Langflow agents).
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
mcp_config: MCP server configuration.
|
|
124
|
+
|
|
125
|
+
Raises:
|
|
126
|
+
NotImplementedError: Langflow agents don't support MCP servers.
|
|
127
|
+
"""
|
|
128
|
+
async def health_check(self) -> bool:
|
|
129
|
+
"""Check if the Langflow API is accessible.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
True if the API is accessible, False otherwise.
|
|
133
|
+
"""
|