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,133 @@
|
|
|
1
|
+
"""This is a simple FastAPI app to test Sentry with Open Telemetry from GL Connectors SDK.
|
|
2
|
+
|
|
3
|
+
To run this example, make sure to set the following environment variables:
|
|
4
|
+
SENTRY_DSN
|
|
5
|
+
SENTRY_ENVIRONMENT
|
|
6
|
+
SENTRY_PROJECT
|
|
7
|
+
VERSION_NUMBER
|
|
8
|
+
BUILD_NUMBER
|
|
9
|
+
USE_OPENTELEMETRY
|
|
10
|
+
|
|
11
|
+
Authors:
|
|
12
|
+
Saul Sayers (saul.sayers@gdplabs.id)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import io
|
|
16
|
+
import os
|
|
17
|
+
import subprocess
|
|
18
|
+
import sys
|
|
19
|
+
import threading
|
|
20
|
+
import time
|
|
21
|
+
|
|
22
|
+
import uvicorn
|
|
23
|
+
from fastapi import FastAPI
|
|
24
|
+
from fastapi.responses import JSONResponse
|
|
25
|
+
from fastapi.staticfiles import StaticFiles
|
|
26
|
+
|
|
27
|
+
from aip_agents.examples.hello_world_langgraph import langgraph_example
|
|
28
|
+
from aip_agents.sentry import setup_telemetry
|
|
29
|
+
from aip_agents.utils.logger import get_logger
|
|
30
|
+
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
BASE_URL = "http://localhost:8585"
|
|
34
|
+
SENTRY_ENVIRONMENT = os.getenv("SENTRY_ENVIRONMENT", "development")
|
|
35
|
+
USE_OPENTELEMETRY = os.getenv("USE_OPENTELEMETRY", "true").lower() == "true"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def fetch_endpoints():
|
|
39
|
+
"""Fetch all endpoints from the server."""
|
|
40
|
+
BASE_URL = "http://127.0.0.1:8585"
|
|
41
|
+
endpoints = [
|
|
42
|
+
"/",
|
|
43
|
+
"/langgraph-hello-world",
|
|
44
|
+
"/test-telemetry",
|
|
45
|
+
"/raise-error",
|
|
46
|
+
]
|
|
47
|
+
for ep in endpoints:
|
|
48
|
+
url = BASE_URL + ep
|
|
49
|
+
try:
|
|
50
|
+
# Because using request.get() will trigger sentry, but the ep name is not saved.
|
|
51
|
+
# Instead of GET /langgraph-hello-world, sentry will save it as GET
|
|
52
|
+
url = f"http://127.0.0.1:8585{ep}"
|
|
53
|
+
result = subprocess.run(["curl", "-i", url], capture_output=True, text=True, check=False)
|
|
54
|
+
logger.info(result.stdout)
|
|
55
|
+
except Exception as e:
|
|
56
|
+
logger.error(f"Error fetching {ep}: {e}")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def create_app() -> FastAPI:
|
|
60
|
+
"""Create and configure the FastAPI application.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
FastAPI: The configured FastAPI application.
|
|
64
|
+
"""
|
|
65
|
+
app = FastAPI(
|
|
66
|
+
title="GL Connectors SDK - Sentry with Open Telemetry",
|
|
67
|
+
description="This is a simple FastAPI app to test Sentry with Open Telemetry.",
|
|
68
|
+
version="0.0.1",
|
|
69
|
+
docs_url=None,
|
|
70
|
+
redoc_url="/docs",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if os.path.isdir("static"):
|
|
74
|
+
app.mount("/static", StaticFiles(directory="static"), name="static")
|
|
75
|
+
setup_telemetry(app)
|
|
76
|
+
|
|
77
|
+
@app.get("/", tags=["Root"])
|
|
78
|
+
async def index():
|
|
79
|
+
if USE_OPENTELEMETRY:
|
|
80
|
+
return {
|
|
81
|
+
"message": "Application running with Sentry + OpenTelemetry.",
|
|
82
|
+
"telemetry_mode": "Sentry with OpenTelemetry",
|
|
83
|
+
"environment": SENTRY_ENVIRONMENT,
|
|
84
|
+
}
|
|
85
|
+
else:
|
|
86
|
+
return {
|
|
87
|
+
"message": "Application running with Sentry only (no OpenTelemetry).",
|
|
88
|
+
"telemetry_mode": "Sentry only",
|
|
89
|
+
"environment": SENTRY_ENVIRONMENT,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@app.get("/langgraph-hello-world", tags=["LangGraph"])
|
|
93
|
+
async def langgraph_hello_world():
|
|
94
|
+
old_stdout = sys.stdout
|
|
95
|
+
sys.stdout = mystdout = io.StringIO()
|
|
96
|
+
try:
|
|
97
|
+
await langgraph_example()
|
|
98
|
+
output = mystdout.getvalue()
|
|
99
|
+
finally:
|
|
100
|
+
sys.stdout = old_stdout
|
|
101
|
+
return JSONResponse(content={"output": output})
|
|
102
|
+
|
|
103
|
+
@app.get("/test-telemetry", tags=["Root"])
|
|
104
|
+
async def test_telemetry():
|
|
105
|
+
return {
|
|
106
|
+
"message": "Telemetry test endpoint called.",
|
|
107
|
+
"using_opentelemetry": USE_OPENTELEMETRY,
|
|
108
|
+
"check": "Check your Sentry dashboard for traces.",
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@app.get("/raise-error", tags=["Root"])
|
|
112
|
+
async def raise_error():
|
|
113
|
+
raise RuntimeError("This is a test error for Sentry!")
|
|
114
|
+
|
|
115
|
+
return app
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def run_server():
|
|
119
|
+
"""Run the FastAPI server."""
|
|
120
|
+
uvicorn.run(
|
|
121
|
+
"aip_agents.examples.hello_world_sentry:create_app",
|
|
122
|
+
host="127.0.0.1",
|
|
123
|
+
port=8585,
|
|
124
|
+
factory=True,
|
|
125
|
+
log_level="info",
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
if __name__ == "__main__":
|
|
130
|
+
server_thread = threading.Thread(target=run_server, daemon=True)
|
|
131
|
+
server_thread.start()
|
|
132
|
+
time.sleep(2)
|
|
133
|
+
fetch_endpoints()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.examples.hello_world_langgraph import langgraph_example as langgraph_example
|
|
3
|
+
from aip_agents.sentry import setup_telemetry as setup_telemetry
|
|
4
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
5
|
+
from fastapi import FastAPI
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
BASE_URL: str
|
|
9
|
+
SENTRY_ENVIRONMENT: Incomplete
|
|
10
|
+
USE_OPENTELEMETRY: Incomplete
|
|
11
|
+
|
|
12
|
+
def fetch_endpoints() -> None:
|
|
13
|
+
"""Fetch all endpoints from the server."""
|
|
14
|
+
def create_app() -> FastAPI:
|
|
15
|
+
"""Create and configure the FastAPI application.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
FastAPI: The configured FastAPI application.
|
|
19
|
+
"""
|
|
20
|
+
def run_server() -> None:
|
|
21
|
+
"""Run the FastAPI server."""
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"""Example demonstrating configurable step limits and delegation depth tracking.
|
|
2
|
+
|
|
3
|
+
This example shows how to:
|
|
4
|
+
1. Configure maximum steps for an agent
|
|
5
|
+
2. Configure maximum delegation depth
|
|
6
|
+
3. Handle step limit exceeded errors gracefully
|
|
7
|
+
4. Track delegation chains across multi-agent hierarchies
|
|
8
|
+
|
|
9
|
+
Authors:
|
|
10
|
+
Saul Sayers (saul.sayers@gdplabs.id)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import os
|
|
15
|
+
|
|
16
|
+
from langchain_openai import ChatOpenAI
|
|
17
|
+
|
|
18
|
+
from aip_agents.agent import LangGraphReactAgent
|
|
19
|
+
from aip_agents.examples.tools.langchain_arithmetic_tools import add_numbers
|
|
20
|
+
from aip_agents.schema.step_limit import MaxStepsExceededError, StepLimitConfig
|
|
21
|
+
from aip_agents.utils.step_limit_manager import StepLimitManager
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def print_config_validation(config: StepLimitConfig | None, context: str):
|
|
25
|
+
"""Print step limit configuration validation."""
|
|
26
|
+
print(f"\n{'=' * 60}")
|
|
27
|
+
print(f"Configuration Validation - {context}")
|
|
28
|
+
print(f"{'=' * 60}")
|
|
29
|
+
if config is None:
|
|
30
|
+
print("✓ Config: None (will use platform defaults)")
|
|
31
|
+
print(" Expected: max_steps=25, max_delegation_depth=5")
|
|
32
|
+
else:
|
|
33
|
+
print(f"✓ max_steps: {config.max_steps}")
|
|
34
|
+
print(f"✓ max_delegation_depth: {config.max_delegation_depth}")
|
|
35
|
+
|
|
36
|
+
# Validate ranges
|
|
37
|
+
if 1 <= config.max_steps <= 1000:
|
|
38
|
+
print(" ✓ max_steps is valid (1-1000)")
|
|
39
|
+
else:
|
|
40
|
+
print(" ✗ max_steps is INVALID (should be 1-1000)")
|
|
41
|
+
|
|
42
|
+
if 0 <= config.max_delegation_depth <= 10:
|
|
43
|
+
print(" ✓ max_delegation_depth is valid (0-10)")
|
|
44
|
+
else:
|
|
45
|
+
print(" ✗ max_delegation_depth is INVALID (should be 0-10)")
|
|
46
|
+
print(f"{'=' * 60}\n")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
async def test_case_1_success_no_limits():
|
|
50
|
+
"""Test Case 1: Success - High limits, no warnings."""
|
|
51
|
+
print("\n" + "=" * 60)
|
|
52
|
+
print("TEST CASE 1: Success - High Limits (No Warnings)")
|
|
53
|
+
print("=" * 60)
|
|
54
|
+
|
|
55
|
+
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
|
|
56
|
+
tools = [add_numbers]
|
|
57
|
+
|
|
58
|
+
# Very high limits - should complete successfully
|
|
59
|
+
step_limit_config = StepLimitConfig(
|
|
60
|
+
max_steps=100, # High limit
|
|
61
|
+
max_delegation_depth=5, # High depth
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
print_config_validation(step_limit_config, "High Limits")
|
|
65
|
+
|
|
66
|
+
agent = LangGraphReactAgent(
|
|
67
|
+
name="SuccessAgent",
|
|
68
|
+
instruction="You are a helpful math assistant.",
|
|
69
|
+
model=model,
|
|
70
|
+
tools=tools,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
query = "What is 5 + 3?"
|
|
74
|
+
print(f"Query: {query}")
|
|
75
|
+
print("Expected: Should complete successfully without warnings\n")
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
response = await agent.arun(
|
|
79
|
+
query=query,
|
|
80
|
+
step_limit_config=step_limit_config,
|
|
81
|
+
configurable={"thread_id": "test_case_1"},
|
|
82
|
+
)
|
|
83
|
+
print(f"✅ SUCCESS: {response['output']}")
|
|
84
|
+
print("✅ Test passed: Agent completed without hitting limits\n")
|
|
85
|
+
except Exception as e:
|
|
86
|
+
print(f"❌ FAILED: {e}\n")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
async def test_case_2_parallel_tool_batch_accounting():
|
|
90
|
+
"""Test Case 2: Demonstrate that parallel tool batches consume multiple steps."""
|
|
91
|
+
manager = StepLimitManager(StepLimitConfig(max_steps=6))
|
|
92
|
+
print("\n" + "=" * 60)
|
|
93
|
+
print("TEST CASE 2: Parallel Tool Batch Accounting")
|
|
94
|
+
print("=" * 60)
|
|
95
|
+
print("Simulating one agent reasoning step plus 5 parallel tool calls.\n")
|
|
96
|
+
|
|
97
|
+
print(f"Initial steps: {manager.context.current_step}, remaining budget: {manager.context.remaining_step_budget}")
|
|
98
|
+
manager.increment_step() # Agent LLM call
|
|
99
|
+
print(
|
|
100
|
+
f"After agent turn -> steps: {manager.context.current_step}, remaining: {manager.context.remaining_step_budget}"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Simulate a batch of 5 tool calls executed in parallel
|
|
104
|
+
manager.increment_step(count=5)
|
|
105
|
+
print("After 5 parallel tool calls (count=5):")
|
|
106
|
+
print(f"Steps used: {manager.context.current_step}, remaining: {manager.context.remaining_step_budget}")
|
|
107
|
+
|
|
108
|
+
# Ensure limit is enforced now
|
|
109
|
+
try:
|
|
110
|
+
manager.check_step_limit()
|
|
111
|
+
except MaxStepsExceededError as exc:
|
|
112
|
+
print(f"✅ Limit enforcement triggered immediately: {exc}")
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
print("❌ Expected the limit to be hit after consuming 6 steps, but it was not.")
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
async def test_case_3_step_limit_exceeded():
|
|
119
|
+
"""Test Case 3: Step Limit Exceeded - Only 2 steps allowed."""
|
|
120
|
+
print("\n" + "=" * 60)
|
|
121
|
+
print("TEST CASE 3: Step Limit Exceeded (max_steps=2)")
|
|
122
|
+
print("=" * 60)
|
|
123
|
+
|
|
124
|
+
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
|
|
125
|
+
tools = [add_numbers]
|
|
126
|
+
|
|
127
|
+
# Very low step limit - will hit limit
|
|
128
|
+
step_limit_config = StepLimitConfig(
|
|
129
|
+
max_steps=2, # Only 2 steps: 1 for thinking, 1 for tool call
|
|
130
|
+
max_delegation_depth=0,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
print_config_validation(step_limit_config, "Very Low Step Limit")
|
|
134
|
+
|
|
135
|
+
agent = LangGraphReactAgent(
|
|
136
|
+
name="LimitedAgent",
|
|
137
|
+
instruction="You are a helpful math assistant. Always use the add_numbers tool.",
|
|
138
|
+
model=model,
|
|
139
|
+
tools=tools,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
query = "Use the add_numbers tool to calculate 7 + 8, then add 10 to the result"
|
|
143
|
+
print(f"Query: {query}")
|
|
144
|
+
print("Expected: Should hit step limit after 2 steps\n")
|
|
145
|
+
print("Step 0: Initial LLM call")
|
|
146
|
+
print("Step 1: Tool call (add_numbers)")
|
|
147
|
+
print("Step 2: Would be final response, but LIMIT HIT!\n")
|
|
148
|
+
|
|
149
|
+
try:
|
|
150
|
+
response = await agent.arun(
|
|
151
|
+
query=query,
|
|
152
|
+
step_limit_config=step_limit_config,
|
|
153
|
+
configurable={"thread_id": "test_case_3"},
|
|
154
|
+
)
|
|
155
|
+
output = response["output"]
|
|
156
|
+
print(f"Response: {output}\n")
|
|
157
|
+
|
|
158
|
+
# Check if the response indicates limit was hit
|
|
159
|
+
if "exceeded" in output.lower() or "limit" in output.lower():
|
|
160
|
+
print("✅ SUCCESS: Step limit was enforced!")
|
|
161
|
+
print("✅ Test passed: Agent terminated at limit\n")
|
|
162
|
+
else:
|
|
163
|
+
print("⚠️ Agent completed without hitting limit")
|
|
164
|
+
print(" (This might happen if task was very simple)\n")
|
|
165
|
+
except Exception as e:
|
|
166
|
+
print(f"Exception raised: {type(e).__name__}: {e}")
|
|
167
|
+
print("✅ Test passed: Step limit enforced via exception\n")
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
async def test_case_4_delegation_depth_exceeded():
|
|
171
|
+
"""Test Case 4: Delegation Depth Exceeded - Zero depth."""
|
|
172
|
+
print("\n" + "=" * 60)
|
|
173
|
+
print("TEST CASE 4: Delegation Depth Exceeded (depth=0)")
|
|
174
|
+
print("=" * 60)
|
|
175
|
+
|
|
176
|
+
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
|
|
177
|
+
|
|
178
|
+
# Create sub-agent
|
|
179
|
+
math_agent = LangGraphReactAgent(
|
|
180
|
+
name="MathAgent",
|
|
181
|
+
instruction="You are a math specialist. Use add_numbers tool for calculations.",
|
|
182
|
+
model=model,
|
|
183
|
+
tools=[add_numbers],
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
# Create coordinator
|
|
187
|
+
coordinator = LangGraphReactAgent(
|
|
188
|
+
name="Coordinator",
|
|
189
|
+
instruction="You coordinate tasks. You MUST delegate all math to MathAgent using the delegate_to_agent tool.",
|
|
190
|
+
model=model,
|
|
191
|
+
tools=[],
|
|
192
|
+
)
|
|
193
|
+
coordinator.register_delegation_agents([math_agent])
|
|
194
|
+
|
|
195
|
+
# Zero delegation depth - should block delegation
|
|
196
|
+
step_limit_config = StepLimitConfig(
|
|
197
|
+
max_steps=50, # High steps
|
|
198
|
+
max_delegation_depth=0, # NO delegation allowed!
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
print_config_validation(step_limit_config, "Zero Delegation Depth")
|
|
202
|
+
|
|
203
|
+
query = "Delegate to MathAgent to calculate 20 + 30"
|
|
204
|
+
print(f"Query: {query}")
|
|
205
|
+
print("Expected: Delegation should be BLOCKED (depth=0)\n")
|
|
206
|
+
print("The coordinator will try to delegate but should get an error\n")
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
response = await coordinator.arun(
|
|
210
|
+
query=query,
|
|
211
|
+
step_limit_config=step_limit_config,
|
|
212
|
+
configurable={"thread_id": "test_case_4"},
|
|
213
|
+
)
|
|
214
|
+
output = response["output"]
|
|
215
|
+
print(f"Response: {output}\n")
|
|
216
|
+
|
|
217
|
+
# Check if delegation was blocked
|
|
218
|
+
if (
|
|
219
|
+
"cannot" in output.lower()
|
|
220
|
+
or "depth" in output.lower()
|
|
221
|
+
or "exceeded" in output.lower()
|
|
222
|
+
or "error" in output.lower()
|
|
223
|
+
):
|
|
224
|
+
print("✅ SUCCESS: Delegation depth limit enforced!")
|
|
225
|
+
print("✅ Test passed: Delegation was blocked\n")
|
|
226
|
+
else:
|
|
227
|
+
print("⚠️ Agent responded without delegating")
|
|
228
|
+
print(" (Coordinator may have answered directly instead)\n")
|
|
229
|
+
except Exception as e:
|
|
230
|
+
print(f"Exception raised: {type(e).__name__}: {e}")
|
|
231
|
+
if "delegation" in str(e).lower() or "depth" in str(e).lower():
|
|
232
|
+
print("✅ Test passed: Delegation depth enforced via exception\n")
|
|
233
|
+
else:
|
|
234
|
+
print("⚠️ Different error occurred\n")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
async def main():
|
|
238
|
+
"""Run all test cases."""
|
|
239
|
+
print("=" * 60)
|
|
240
|
+
print("Step Limit Configuration - Test Suite")
|
|
241
|
+
print("=" * 60)
|
|
242
|
+
print("\nRunning 4 test cases:")
|
|
243
|
+
print("1. Success with high limits")
|
|
244
|
+
print("2. Parallel tool batch accounting demo")
|
|
245
|
+
print("3. Step limit exceeded")
|
|
246
|
+
print("4. Delegation depth exceeded")
|
|
247
|
+
print("\nNOTE: Some limits are enforced silently via the agent's")
|
|
248
|
+
print(" internal logic. Check for error messages in responses.")
|
|
249
|
+
|
|
250
|
+
await test_case_1_success_no_limits()
|
|
251
|
+
await test_case_2_parallel_tool_batch_accounting()
|
|
252
|
+
await test_case_3_step_limit_exceeded()
|
|
253
|
+
await test_case_4_delegation_depth_exceeded()
|
|
254
|
+
|
|
255
|
+
print("\n" + "=" * 60)
|
|
256
|
+
print("All test cases completed!")
|
|
257
|
+
print("=" * 60)
|
|
258
|
+
print("\n📝 Summary:")
|
|
259
|
+
print("- Test 1: Should show successful completion")
|
|
260
|
+
print("- Test 2: Shows that parallel tool batches consume multiple steps at once")
|
|
261
|
+
print("- Test 3: Should show step limit enforcement")
|
|
262
|
+
print("- Test 4: Should show delegation blocking")
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
if __name__ == "__main__":
|
|
266
|
+
# Check for API key
|
|
267
|
+
if not os.getenv("OPENAI_API_KEY"):
|
|
268
|
+
print("ERROR: OPENAI_API_KEY environment variable not set!")
|
|
269
|
+
print("Please set it before running:")
|
|
270
|
+
print('export OPENAI_API_KEY="your-key-here"')
|
|
271
|
+
exit(1)
|
|
272
|
+
|
|
273
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from aip_agents.agent import LangGraphReactAgent as LangGraphReactAgent
|
|
2
|
+
from aip_agents.examples.tools.langchain_arithmetic_tools import add_numbers as add_numbers
|
|
3
|
+
from aip_agents.schema.step_limit import MaxStepsExceededError as MaxStepsExceededError, StepLimitConfig as StepLimitConfig
|
|
4
|
+
from aip_agents.utils.step_limit_manager import StepLimitManager as StepLimitManager
|
|
5
|
+
|
|
6
|
+
def print_config_validation(config: StepLimitConfig | None, context: str):
|
|
7
|
+
"""Print step limit configuration validation."""
|
|
8
|
+
async def test_case_1_success_no_limits() -> None:
|
|
9
|
+
"""Test Case 1: Success - High limits, no warnings."""
|
|
10
|
+
async def test_case_2_parallel_tool_batch_accounting() -> None:
|
|
11
|
+
"""Test Case 2: Demonstrate that parallel tool batches consume multiple steps."""
|
|
12
|
+
async def test_case_3_step_limit_exceeded() -> None:
|
|
13
|
+
"""Test Case 3: Step Limit Exceeded - Only 2 steps allowed."""
|
|
14
|
+
async def test_case_4_delegation_depth_exceeded() -> None:
|
|
15
|
+
"""Test Case 4: Delegation Depth Exceeded - Zero depth."""
|
|
16
|
+
async def main() -> None:
|
|
17
|
+
"""Run all test cases."""
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Stock Market A2A Server Example.
|
|
2
|
+
|
|
3
|
+
This server provides stock market information and can be used as an A2A agent.
|
|
4
|
+
|
|
5
|
+
To run:
|
|
6
|
+
python aip_agents/examples/hello_world_stock_a2a_server.py --port 8002
|
|
7
|
+
|
|
8
|
+
Authors:
|
|
9
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
|
|
14
|
+
import click
|
|
15
|
+
import uvicorn
|
|
16
|
+
from a2a.types import AgentCapabilities, AgentCard, AgentSkill
|
|
17
|
+
from langchain_core.tools import BaseTool
|
|
18
|
+
from langchain_openai import ChatOpenAI
|
|
19
|
+
|
|
20
|
+
from aip_agents.agent import LangGraphAgent
|
|
21
|
+
from aip_agents.examples.tools.stock_tools import StockNewsInput, StockPriceInput, get_stock_news, get_stock_price
|
|
22
|
+
from aip_agents.utils.logger import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
SERVER_AGENT_NAME = "StockAgent"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
stock_tools: list[BaseTool] = [get_stock_price, get_stock_news]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@click.command()
|
|
33
|
+
@click.option("--host", "host", default="0.0.0.0", help="Host to bind the server to.")
|
|
34
|
+
@click.option("--port", "port", default=8002, help="Port to bind the server to.")
|
|
35
|
+
def main(host: str, port: int):
|
|
36
|
+
"""Runs the StockAgent A2A server.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
host (str): Host to bind the server to.
|
|
40
|
+
port (int): Port to bind the server to.
|
|
41
|
+
"""
|
|
42
|
+
logger.info(f"Starting {SERVER_AGENT_NAME} on http://{host}:{port}")
|
|
43
|
+
|
|
44
|
+
agent_card = AgentCard(
|
|
45
|
+
name=SERVER_AGENT_NAME,
|
|
46
|
+
description="Provides stock market information including prices and news.",
|
|
47
|
+
url=f"http://{host}:{port}",
|
|
48
|
+
version="1.0.0",
|
|
49
|
+
defaultInputModes=["text"],
|
|
50
|
+
defaultOutputModes=["text"],
|
|
51
|
+
capabilities=AgentCapabilities(streaming=True, tools=True),
|
|
52
|
+
skills=[
|
|
53
|
+
AgentSkill(
|
|
54
|
+
id="get_stock_price",
|
|
55
|
+
name="Get Stock Price",
|
|
56
|
+
description="Retrieves the current stock price and performance data for a given symbol.",
|
|
57
|
+
examples=["What's the price of AAPL?", "Stock price for MSFT"],
|
|
58
|
+
tags=["finance", "stocks", "price"],
|
|
59
|
+
input_schema=StockPriceInput.model_json_schema(),
|
|
60
|
+
),
|
|
61
|
+
AgentSkill(
|
|
62
|
+
id="get_stock_news",
|
|
63
|
+
name="Get Stock News",
|
|
64
|
+
description="Fetches recent news articles for a specified stock symbol.",
|
|
65
|
+
examples=[
|
|
66
|
+
"Latest news for GOOGL",
|
|
67
|
+
"Stock news for TSLA over last 3 days",
|
|
68
|
+
],
|
|
69
|
+
tags=["finance", "stocks", "news"],
|
|
70
|
+
input_schema=StockNewsInput.model_json_schema(),
|
|
71
|
+
),
|
|
72
|
+
],
|
|
73
|
+
tags=["finance", "stocks"],
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# For A2A, the LLM is used by the *client* agent to decide to call this agent.
|
|
77
|
+
# This agent itself just executes its tools based on the A2A request.
|
|
78
|
+
# However, LangGraphAgent requires an LLM, so we provide a basic one.
|
|
79
|
+
llm = ChatOpenAI(
|
|
80
|
+
model="gpt-4.1",
|
|
81
|
+
temperature=0,
|
|
82
|
+
streaming=True,
|
|
83
|
+
openai_api_key=os.getenv("OPENAI_API_KEY"),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
langgraph_agent = LangGraphAgent(
|
|
87
|
+
name=SERVER_AGENT_NAME,
|
|
88
|
+
instruction="You are a Stock Agent. You can get stock prices and news. Use your tools to answer user queries.",
|
|
89
|
+
model=llm,
|
|
90
|
+
tools=stock_tools,
|
|
91
|
+
verbose=True,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
app = langgraph_agent.to_a2a(
|
|
95
|
+
agent_card=agent_card,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
logger.info("A2A application configured. Starting Uvicorn server...")
|
|
99
|
+
uvicorn.run(app, host=host, port=port)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if __name__ == "__main__":
|
|
103
|
+
main()
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent import LangGraphAgent as LangGraphAgent
|
|
3
|
+
from aip_agents.examples.tools.stock_tools import StockNewsInput as StockNewsInput, StockPriceInput as StockPriceInput, get_stock_news as get_stock_news, get_stock_price as get_stock_price
|
|
4
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
5
|
+
from langchain_core.tools import BaseTool as BaseTool
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
SERVER_AGENT_NAME: str
|
|
9
|
+
stock_tools: list[BaseTool]
|
|
10
|
+
|
|
11
|
+
def main(host: str, port: int):
|
|
12
|
+
"""Runs the StockAgent A2A server.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
host (str): Host to bind the server to.
|
|
16
|
+
port (int): Port to bind the server to.
|
|
17
|
+
"""
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Simple A2A client demonstrating tool output management.
|
|
2
|
+
|
|
3
|
+
This client connects to the data visualization server and demonstrates
|
|
4
|
+
how tools can reference each other's outputs using the tool output
|
|
5
|
+
management system.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import asyncio
|
|
12
|
+
|
|
13
|
+
from dotenv import load_dotenv
|
|
14
|
+
|
|
15
|
+
from aip_agents.agent import LangGraphReactAgent
|
|
16
|
+
from aip_agents.schema.agent import A2AClientConfig
|
|
17
|
+
|
|
18
|
+
load_dotenv()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async def main():
|
|
22
|
+
"""Demonstrate tool output management with data visualization."""
|
|
23
|
+
# Create client agent
|
|
24
|
+
client = LangGraphReactAgent(
|
|
25
|
+
name="Client",
|
|
26
|
+
instruction="You request data visualization services.",
|
|
27
|
+
model="openai/gpt-4o-mini",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# Discover server agent
|
|
31
|
+
agents = client.discover_agents(A2AClientConfig(discovery_urls=["http://localhost:8885"]))
|
|
32
|
+
server_agent = agents[0]
|
|
33
|
+
|
|
34
|
+
async for chunk in client.astream_to_agent(
|
|
35
|
+
server_agent,
|
|
36
|
+
"Generate sales data for 1000 months and create a bar chart from it",
|
|
37
|
+
):
|
|
38
|
+
if chunk.get("content"):
|
|
39
|
+
print(chunk["content"], end="", flush=True)
|
|
40
|
+
if chunk.get("metadata"):
|
|
41
|
+
print(f"\nMetadata: {chunk['metadata']}", end="\n\n", flush=True)
|
|
42
|
+
tool_info = chunk.get("metadata", {}).get("tool_info") if isinstance(chunk.get("metadata"), dict) else None
|
|
43
|
+
if isinstance(tool_info, dict):
|
|
44
|
+
for tool_call in tool_info.get("tool_calls", []):
|
|
45
|
+
if tool_call.get("name") == "data_visualizer":
|
|
46
|
+
data_source = tool_call.get("args", {}).get("data_source")
|
|
47
|
+
if not (isinstance(data_source, str) and data_source.startswith("$tool_output.")):
|
|
48
|
+
raise RuntimeError(
|
|
49
|
+
"Tool output sharing failed: expected data_source to reference $tool_output.<call_id>."
|
|
50
|
+
)
|
|
51
|
+
print("\n")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
if __name__ == "__main__":
|
|
55
|
+
asyncio.run(main())
|