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,247 @@
|
|
|
1
|
+
"""Multi-Agent PII Demo Server - Demonstrates PII handling across agent hierarchy.
|
|
2
|
+
|
|
3
|
+
This server hosts a hierarchical agent system demonstrating PII propagation:
|
|
4
|
+
1. Level 1 (Coordinator): Main orchestrator that routes requests
|
|
5
|
+
2. Level 2 (Specialists): Domain-specific agents with PII-returning tools
|
|
6
|
+
- CustomerServiceAgent: Handles customer inquiries
|
|
7
|
+
- HRAgent: Handles employee data requests
|
|
8
|
+
- UserSupportAgent: Handles user profile requests
|
|
9
|
+
|
|
10
|
+
Architecture:
|
|
11
|
+
PIICoordinator (A2A Server)
|
|
12
|
+
├── CustomerServiceAgent (with get_customer_info tool)
|
|
13
|
+
├── HRAgent (with get_employee_data tool)
|
|
14
|
+
└── UserSupportAgent (with get_user_profile tool)
|
|
15
|
+
|
|
16
|
+
Features demonstrated:
|
|
17
|
+
- PII anonymization in tool outputs
|
|
18
|
+
- PII propagation from child agents to parent
|
|
19
|
+
- Multi-agent delegation with PII mapping merge
|
|
20
|
+
- Collision handling when multiple agents discover PII
|
|
21
|
+
|
|
22
|
+
To run this server:
|
|
23
|
+
export NER_API_URL=http://localhost:8080
|
|
24
|
+
export NER_API_KEY=your-api-key
|
|
25
|
+
python aip_agents/examples/pii_demo_multi_agent_server.py
|
|
26
|
+
|
|
27
|
+
It will listen on http://localhost:8003 by default.
|
|
28
|
+
|
|
29
|
+
Authors:
|
|
30
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
import click
|
|
34
|
+
import uvicorn
|
|
35
|
+
from a2a.types import AgentCapabilities, AgentCard, AgentSkill
|
|
36
|
+
from dotenv import load_dotenv
|
|
37
|
+
from langchain_openai import ChatOpenAI
|
|
38
|
+
|
|
39
|
+
from aip_agents.agent import LangGraphAgent
|
|
40
|
+
from aip_agents.examples.tools.pii_demo_tools import (
|
|
41
|
+
get_customer_info,
|
|
42
|
+
get_employee_data,
|
|
43
|
+
get_user_profile,
|
|
44
|
+
)
|
|
45
|
+
from aip_agents.utils.logger import LoggerManager
|
|
46
|
+
|
|
47
|
+
load_dotenv()
|
|
48
|
+
|
|
49
|
+
logger = LoggerManager().get_logger(__name__)
|
|
50
|
+
|
|
51
|
+
SERVER_AGENT_NAME = "PIICoordinator"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def create_specialist_agents(llm: ChatOpenAI) -> tuple[LangGraphAgent, LangGraphAgent, LangGraphAgent]:
|
|
55
|
+
"""Create Level 2 specialist agents with PII-returning tools.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
llm: The language model to use for the specialist agents.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Tuple of (customer_service_agent, hr_agent, user_support_agent).
|
|
62
|
+
"""
|
|
63
|
+
# Customer Service Agent - handles customer inquiries
|
|
64
|
+
customer_service_agent = LangGraphAgent(
|
|
65
|
+
name="CustomerServiceAgent",
|
|
66
|
+
instruction="""You are a customer service specialist. You help retrieve customer information.
|
|
67
|
+
|
|
68
|
+
You have access to the get_customer_info tool to retrieve customer details.
|
|
69
|
+
When asked about customers, use this tool to get their information.
|
|
70
|
+
|
|
71
|
+
You will receive output from tools in masked version with PII tags like <PERSON_xxx>, <EMAIL_ADDRESS_xxx>.
|
|
72
|
+
Present the information as-is without trying to reveal or change the masked values.
|
|
73
|
+
|
|
74
|
+
Always be helpful and professional in your responses.""",
|
|
75
|
+
model=llm,
|
|
76
|
+
tools=[get_customer_info],
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# HR Agent - handles employee data requests
|
|
80
|
+
hr_agent = LangGraphAgent(
|
|
81
|
+
name="HRAgent",
|
|
82
|
+
instruction="""You are an HR specialist. You help retrieve employee information.
|
|
83
|
+
|
|
84
|
+
You have access to the get_employee_data tool to retrieve employee details.
|
|
85
|
+
When asked about employees, use this tool to get their information.
|
|
86
|
+
|
|
87
|
+
You will receive output from tools in masked version with PII tags like <PERSON_xxx>, <EMAIL_ADDRESS_xxx>.
|
|
88
|
+
Present the information as-is without trying to reveal or change the masked values.
|
|
89
|
+
|
|
90
|
+
Always maintain confidentiality and professionalism.""",
|
|
91
|
+
model=llm,
|
|
92
|
+
tools=[get_employee_data],
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# User Support Agent - handles user profile requests
|
|
96
|
+
user_support_agent = LangGraphAgent(
|
|
97
|
+
name="UserSupportAgent",
|
|
98
|
+
instruction="""You are a user support specialist. You help retrieve user profile information.
|
|
99
|
+
|
|
100
|
+
You have access to the get_user_profile tool to retrieve user details.
|
|
101
|
+
When asked about users, use this tool to get their profile information.
|
|
102
|
+
|
|
103
|
+
You will receive output from tools in masked version with PII tags like <PERSON_xxx>, <EMAIL_ADDRESS_xxx>.
|
|
104
|
+
Present the information as-is without trying to reveal or change the masked values.
|
|
105
|
+
|
|
106
|
+
Always be helpful and respect user privacy.""",
|
|
107
|
+
model=llm,
|
|
108
|
+
tools=[get_user_profile],
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
return customer_service_agent, hr_agent, user_support_agent
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def create_coordinator_agent(
|
|
115
|
+
llm: ChatOpenAI,
|
|
116
|
+
specialist_agents: tuple[LangGraphAgent, LangGraphAgent, LangGraphAgent],
|
|
117
|
+
) -> LangGraphAgent:
|
|
118
|
+
"""Create Level 1 coordinator agent that orchestrates specialist agents.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
llm: The language model to use for the coordinator agent.
|
|
122
|
+
specialist_agents: Tuple of specialist agents.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
The configured coordinator agent.
|
|
126
|
+
"""
|
|
127
|
+
customer_service_agent, hr_agent, user_support_agent = specialist_agents
|
|
128
|
+
|
|
129
|
+
coordinator = LangGraphAgent(
|
|
130
|
+
name=SERVER_AGENT_NAME,
|
|
131
|
+
instruction="""You are a coordinator that manages requests across different departments.
|
|
132
|
+
|
|
133
|
+
You oversee three specialist teams:
|
|
134
|
+
- CustomerServiceAgent: Handles customer information requests (customer IDs like C001, C002, C003)
|
|
135
|
+
- HRAgent: Handles employee data requests (employee IDs like E001, E002, E003)
|
|
136
|
+
- UserSupportAgent: Handles user profile requests (user IDs like U001, U002, U003)
|
|
137
|
+
|
|
138
|
+
For each request, analyze what type of information is needed and delegate appropriately:
|
|
139
|
+
- Customer-related requests -> CustomerServiceAgent
|
|
140
|
+
- Employee/HR-related requests -> HRAgent
|
|
141
|
+
- User profile requests -> UserSupportAgent
|
|
142
|
+
- Complex requests may require multiple specialists
|
|
143
|
+
|
|
144
|
+
You will receive responses with PII tags like <PERSON_xxx>, <EMAIL_ADDRESS_xxx>.
|
|
145
|
+
Present the information as-is without trying to reveal or change the masked values.
|
|
146
|
+
|
|
147
|
+
Always provide a clear summary of the information gathered from your specialists.""",
|
|
148
|
+
model=llm,
|
|
149
|
+
agents=[customer_service_agent, hr_agent, user_support_agent],
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
return coordinator
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
@click.command()
|
|
156
|
+
@click.option("--host", "host", default="localhost", help="Host to bind the server to.")
|
|
157
|
+
@click.option("--port", "port", default=8003, help="Port to bind the server to.")
|
|
158
|
+
def main(host: str, port: int):
|
|
159
|
+
"""Runs the Multi-Agent PII Demo A2A server.
|
|
160
|
+
|
|
161
|
+
This server demonstrates PII handling across a multi-agent hierarchy:
|
|
162
|
+
- PII anonymization in tool outputs
|
|
163
|
+
- PII propagation from child agents to parent
|
|
164
|
+
- Multi-agent delegation with PII mapping merge
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
host: Host to bind the server to.
|
|
168
|
+
port: Port to bind the server to.
|
|
169
|
+
"""
|
|
170
|
+
logger.info(f"Starting {SERVER_AGENT_NAME} on http://{host}:{port}")
|
|
171
|
+
logger.info("Multi-agent PII handling demo with 3 specialist agents")
|
|
172
|
+
|
|
173
|
+
agent_card = AgentCard(
|
|
174
|
+
name=SERVER_AGENT_NAME,
|
|
175
|
+
description=(
|
|
176
|
+
"A coordinator agent managing 3 specialist agents for customer, employee, "
|
|
177
|
+
"and user information with automatic PII handling across the hierarchy."
|
|
178
|
+
),
|
|
179
|
+
url=f"http://{host}:{port}",
|
|
180
|
+
version="1.0.0",
|
|
181
|
+
defaultInputModes=["text"],
|
|
182
|
+
defaultOutputModes=["text"],
|
|
183
|
+
capabilities=AgentCapabilities(streaming=True),
|
|
184
|
+
skills=[
|
|
185
|
+
AgentSkill(
|
|
186
|
+
id="multi_agent_coordination",
|
|
187
|
+
name="Multi-Agent PII Coordination",
|
|
188
|
+
description="Coordinates requests across multiple specialist agents with PII handling.",
|
|
189
|
+
examples=[
|
|
190
|
+
"Get information for customer C001 and employee E001",
|
|
191
|
+
"Compare customer C002 with user U002",
|
|
192
|
+
"Get all available information about John",
|
|
193
|
+
],
|
|
194
|
+
tags=["coordination", "multi-agent", "pii"],
|
|
195
|
+
),
|
|
196
|
+
AgentSkill(
|
|
197
|
+
id="customer_service",
|
|
198
|
+
name="Customer Service",
|
|
199
|
+
description="Retrieves customer information via CustomerServiceAgent.",
|
|
200
|
+
examples=[
|
|
201
|
+
"Get customer info for C001",
|
|
202
|
+
"What is the email for customer C002?",
|
|
203
|
+
],
|
|
204
|
+
tags=["customer", "pii"],
|
|
205
|
+
),
|
|
206
|
+
AgentSkill(
|
|
207
|
+
id="hr_services",
|
|
208
|
+
name="HR Services",
|
|
209
|
+
description="Retrieves employee data via HRAgent.",
|
|
210
|
+
examples=[
|
|
211
|
+
"Get employee data for E001",
|
|
212
|
+
"What department is employee E002 in?",
|
|
213
|
+
],
|
|
214
|
+
tags=["employee", "hr", "pii"],
|
|
215
|
+
),
|
|
216
|
+
AgentSkill(
|
|
217
|
+
id="user_support",
|
|
218
|
+
name="User Support",
|
|
219
|
+
description="Retrieves user profile information via UserSupportAgent.",
|
|
220
|
+
examples=[
|
|
221
|
+
"Get user profile for U001",
|
|
222
|
+
"What city does user U002 live in?",
|
|
223
|
+
],
|
|
224
|
+
tags=["user", "profile", "pii"],
|
|
225
|
+
),
|
|
226
|
+
],
|
|
227
|
+
tags=["pii", "demo", "multi-agent", "hierarchy"],
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
llm = ChatOpenAI(model="gpt-4.1", temperature=0, streaming=True)
|
|
231
|
+
|
|
232
|
+
# Build the 2-level hierarchy
|
|
233
|
+
logger.info("Creating Level 2 specialist agents...")
|
|
234
|
+
specialist_agents = create_specialist_agents(llm)
|
|
235
|
+
|
|
236
|
+
logger.info("Creating Level 1 coordinator agent...")
|
|
237
|
+
coordinator_agent = create_coordinator_agent(llm, specialist_agents)
|
|
238
|
+
|
|
239
|
+
app = coordinator_agent.to_a2a(agent_card=agent_card)
|
|
240
|
+
|
|
241
|
+
logger.info("A2A application configured. Starting Uvicorn server...")
|
|
242
|
+
logger.info("Hierarchy: 1 Coordinator -> 3 Specialists (each with PII tools)")
|
|
243
|
+
uvicorn.run(app, host=host, port=port)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
if __name__ == "__main__":
|
|
247
|
+
main()
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent import LangGraphAgent as LangGraphAgent
|
|
3
|
+
from aip_agents.examples.tools.pii_demo_tools import get_customer_info as get_customer_info, get_employee_data as get_employee_data, get_user_profile as get_user_profile
|
|
4
|
+
from aip_agents.utils.logger import LoggerManager as LoggerManager
|
|
5
|
+
from langchain_openai import ChatOpenAI
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
SERVER_AGENT_NAME: str
|
|
9
|
+
|
|
10
|
+
def create_specialist_agents(llm: ChatOpenAI) -> tuple[LangGraphAgent, LangGraphAgent, LangGraphAgent]:
|
|
11
|
+
"""Create Level 2 specialist agents with PII-returning tools.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
llm: The language model to use for the specialist agents.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
Tuple of (customer_service_agent, hr_agent, user_support_agent).
|
|
18
|
+
"""
|
|
19
|
+
def create_coordinator_agent(llm: ChatOpenAI, specialist_agents: tuple[LangGraphAgent, LangGraphAgent, LangGraphAgent]) -> LangGraphAgent:
|
|
20
|
+
"""Create Level 1 coordinator agent that orchestrates specialist agents.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
llm: The language model to use for the coordinator agent.
|
|
24
|
+
specialist_agents: Tuple of specialist agents.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
The configured coordinator agent.
|
|
28
|
+
"""
|
|
29
|
+
def main(host: str, port: int):
|
|
30
|
+
"""Runs the Multi-Agent PII Demo A2A server.
|
|
31
|
+
|
|
32
|
+
This server demonstrates PII handling across a multi-agent hierarchy:
|
|
33
|
+
- PII anonymization in tool outputs
|
|
34
|
+
- PII propagation from child agents to parent
|
|
35
|
+
- Multi-agent delegation with PII mapping merge
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
host: Host to bind the server to.
|
|
39
|
+
port: Port to bind the server to.
|
|
40
|
+
"""
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""A2A client for the planning LangGraphReactAgent.
|
|
2
|
+
|
|
3
|
+
Run the planning server first:
|
|
4
|
+
uv run python -m aip_agents.examples.todolist_planning_a2a_langgraph_server
|
|
5
|
+
|
|
6
|
+
Then run this client:
|
|
7
|
+
uv run python -m aip_agents.examples.todolist_planning_a2a_langchain_client
|
|
8
|
+
|
|
9
|
+
You should see streaming output, including when write_todos_tool is called.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import json
|
|
14
|
+
|
|
15
|
+
from dotenv import load_dotenv
|
|
16
|
+
from langchain_openai import ChatOpenAI
|
|
17
|
+
|
|
18
|
+
from aip_agents.agent import LangChainAgent
|
|
19
|
+
from aip_agents.schema.agent import A2AClientConfig
|
|
20
|
+
|
|
21
|
+
load_dotenv()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
async def main() -> None:
|
|
25
|
+
"""Connect to the planning A2A server and stream a planning query."""
|
|
26
|
+
assistant_agent = LangChainAgent(
|
|
27
|
+
name="PlanningClientAgent",
|
|
28
|
+
instruction=(
|
|
29
|
+
"You are a user-facing assistant that asks a planning agent "
|
|
30
|
+
"to break work into a todo list before executing it."
|
|
31
|
+
),
|
|
32
|
+
model=ChatOpenAI(model="gpt-4.1", temperature=0),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
client_a2a_config = A2AClientConfig(
|
|
36
|
+
discovery_urls=["http://localhost:8002"],
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
agent_cards = assistant_agent.discover_agents(client_a2a_config)
|
|
40
|
+
if not agent_cards:
|
|
41
|
+
print("No agents discovered at http://localhost:8002")
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
agent_card = agent_cards[0]
|
|
45
|
+
print(f"Discovered agent: {agent_card.name} @ {agent_card.url}")
|
|
46
|
+
|
|
47
|
+
query = "Research the latest advances in AI-driven drug discovery for oncology and synthesize findings into a comprehensive report—drawing on recent web-sourced literature and relevant company/market context—highlighting key breakthroughs, potential future directions, and a dedicated section on ethical considerations."
|
|
48
|
+
|
|
49
|
+
print("\nSending query to planning agent (streaming)...\n")
|
|
50
|
+
|
|
51
|
+
async for chunk in assistant_agent.astream_to_agent(agent_card, message=query):
|
|
52
|
+
content = chunk.get("content")
|
|
53
|
+
metadata = chunk.get("metadata", {})
|
|
54
|
+
status = metadata.get("status") or metadata.get("state")
|
|
55
|
+
|
|
56
|
+
if status and status.lower() in ("running", "processing"):
|
|
57
|
+
print("Query:", query)
|
|
58
|
+
if "tool_info" in metadata:
|
|
59
|
+
print("Tool Info:", json.dumps(metadata["tool_info"], indent=2))
|
|
60
|
+
|
|
61
|
+
if status and status.lower() in ("finished", "completed"):
|
|
62
|
+
print("\n=== Completed — final output ===\n")
|
|
63
|
+
if content:
|
|
64
|
+
print(content)
|
|
65
|
+
elif metadata.get("output"):
|
|
66
|
+
print(metadata.get("output"))
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
if __name__ == "__main__": # pragma: no cover - manual smoke script
|
|
70
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""A2A server exposing a LangGraphReactAgent with planning (TodoListMiddleware).
|
|
2
|
+
|
|
3
|
+
Run:
|
|
4
|
+
uv run python -m aip_agents.examples.todolist_planning_a2a_langgraph_server \
|
|
5
|
+
--host localhost --port 8002
|
|
6
|
+
|
|
7
|
+
Then connect with the matching A2A client to observe write_todos_tool calls.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import click
|
|
11
|
+
import langchain
|
|
12
|
+
import uvicorn
|
|
13
|
+
from a2a.types import AgentCapabilities, AgentCard, AgentSkill
|
|
14
|
+
from dotenv import load_dotenv
|
|
15
|
+
from langchain_openai import ChatOpenAI
|
|
16
|
+
|
|
17
|
+
from aip_agents.agent import LangGraphReactAgent
|
|
18
|
+
from aip_agents.examples.tools.serper_tool import MockGoogleSerperTool
|
|
19
|
+
from aip_agents.examples.tools.stock_tools import get_stock_price
|
|
20
|
+
from aip_agents.utils.logger import get_logger
|
|
21
|
+
|
|
22
|
+
langchain.debug = True
|
|
23
|
+
|
|
24
|
+
load_dotenv()
|
|
25
|
+
|
|
26
|
+
logger = get_logger(__name__)
|
|
27
|
+
|
|
28
|
+
SERVER_AGENT_NAME = "PlanningTodoAgent"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@click.command()
|
|
32
|
+
@click.option("--host", "host", default="localhost", help="Host to bind the server to.")
|
|
33
|
+
@click.option("--port", "port", default=8002, help="Port to bind the server to.")
|
|
34
|
+
def main(host: str, port: int) -> None:
|
|
35
|
+
"""Run an A2A server with a planning-enabled LangGraphReactAgent.
|
|
36
|
+
|
|
37
|
+
The agent has TodoListMiddleware attached via planning=True and will
|
|
38
|
+
expose the write_todos_tool over A2A with token streaming enabled.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
host: The host to bind the server to.
|
|
42
|
+
port: The port to bind the server to.
|
|
43
|
+
"""
|
|
44
|
+
logger.info(f"Starting {SERVER_AGENT_NAME} on http://{host}:{port}")
|
|
45
|
+
|
|
46
|
+
agent_card = AgentCard(
|
|
47
|
+
name=SERVER_AGENT_NAME,
|
|
48
|
+
description="Planning agent that breaks tasks into todos using write_todos.",
|
|
49
|
+
url=f"http://{host}:{port}",
|
|
50
|
+
version="1.0.0",
|
|
51
|
+
defaultInputModes=["text"],
|
|
52
|
+
defaultOutputModes=["text"],
|
|
53
|
+
capabilities=AgentCapabilities(streaming=True),
|
|
54
|
+
skills=[
|
|
55
|
+
AgentSkill(
|
|
56
|
+
id="planning",
|
|
57
|
+
name="Planning and Todo Management",
|
|
58
|
+
description="Breaks high-level tasks into a todo list and tracks progress.",
|
|
59
|
+
examples=[
|
|
60
|
+
"Plan a 3-step migration task and show the todo list.",
|
|
61
|
+
"Create a todo list for building a small feature.",
|
|
62
|
+
],
|
|
63
|
+
tags=["planning", "todos"],
|
|
64
|
+
)
|
|
65
|
+
],
|
|
66
|
+
tags=["planning", "todos"],
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
llm = ChatOpenAI(model="gpt-4.1", temperature=0, streaming=True)
|
|
70
|
+
|
|
71
|
+
# No custom tools; planning=True will attach TodoListMiddleware and
|
|
72
|
+
# provide write_todos_tool automatically.
|
|
73
|
+
agent = LangGraphReactAgent(
|
|
74
|
+
name=SERVER_AGENT_NAME,
|
|
75
|
+
instruction=("You are an Assistant Agent, your job is to answer based on a query."),
|
|
76
|
+
model=llm,
|
|
77
|
+
tools=[MockGoogleSerperTool(), get_stock_price],
|
|
78
|
+
planning=True,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
app = agent.to_a2a(agent_card=agent_card)
|
|
82
|
+
|
|
83
|
+
logger.info("Planning A2A application configured. Starting Uvicorn server...")
|
|
84
|
+
uvicorn.run(app, host=host, port=port)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
if __name__ == "__main__": # pragma: no cover - manual smoke script
|
|
88
|
+
main()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent import LangGraphReactAgent as LangGraphReactAgent
|
|
3
|
+
from aip_agents.examples.tools.serper_tool import MockGoogleSerperTool as MockGoogleSerperTool
|
|
4
|
+
from aip_agents.examples.tools.stock_tools import get_stock_price as get_stock_price
|
|
5
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
SERVER_AGENT_NAME: str
|
|
9
|
+
|
|
10
|
+
def main(host: str, port: int) -> None:
|
|
11
|
+
"""Run an A2A server with a planning-enabled LangGraphReactAgent.
|
|
12
|
+
|
|
13
|
+
The agent has TodoListMiddleware attached via planning=True and will
|
|
14
|
+
expose the write_todos_tool over A2A with token streaming enabled.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
host: The host to bind the server to.
|
|
18
|
+
port: The port to bind the server to.
|
|
19
|
+
"""
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Tools for the examples.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aip_agents.examples.tools.adk_weather_tool import (
|
|
8
|
+
get_weather as weather_tool_adk,
|
|
9
|
+
)
|
|
10
|
+
from aip_agents.examples.tools.langchain_weather_tool import (
|
|
11
|
+
weather_tool as weather_tool_langchain,
|
|
12
|
+
)
|
|
13
|
+
from aip_agents.examples.tools.langgraph_streaming_tool import LangGraphStreamingTool as langgraph_streaming_tool
|
|
14
|
+
from aip_agents.examples.tools.mock_retrieval_tool import MockRetrievalTool as mock_retrieval_tool
|
|
15
|
+
from aip_agents.examples.tools.random_chart_tool import RandomChartTool as random_chart_tool
|
|
16
|
+
from aip_agents.examples.tools.serper_tool import MockGoogleSerperTool as google_serper_tool
|
|
17
|
+
from aip_agents.examples.tools.time_tool import TimeTool as time_tool
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"weather_tool_langchain",
|
|
21
|
+
"weather_tool_adk",
|
|
22
|
+
"time_tool",
|
|
23
|
+
"google_serper_tool",
|
|
24
|
+
"langgraph_streaming_tool",
|
|
25
|
+
"mock_retrieval_tool",
|
|
26
|
+
"random_chart_tool",
|
|
27
|
+
]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from aip_agents.examples.tools.adk_weather_tool import get_weather as weather_tool_adk
|
|
2
|
+
from aip_agents.examples.tools.langchain_weather_tool import weather_tool as weather_tool_langchain
|
|
3
|
+
from aip_agents.examples.tools.langgraph_streaming_tool import LangGraphStreamingTool as langgraph_streaming_tool
|
|
4
|
+
from aip_agents.examples.tools.mock_retrieval_tool import MockRetrievalTool as mock_retrieval_tool
|
|
5
|
+
from aip_agents.examples.tools.random_chart_tool import RandomChartTool as random_chart_tool
|
|
6
|
+
from aip_agents.examples.tools.serper_tool import MockGoogleSerperTool as google_serper_tool
|
|
7
|
+
from aip_agents.examples.tools.time_tool import TimeTool as time_tool
|
|
8
|
+
|
|
9
|
+
__all__ = ['weather_tool_langchain', 'weather_tool_adk', 'time_tool', 'google_serper_tool', 'langgraph_streaming_tool', 'mock_retrieval_tool', 'random_chart_tool']
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Common arithmetic tools for GLLM agent examples."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def add_numbers(a: int, b: int) -> str:
|
|
5
|
+
"""Adds two integer numbers together and returns the result as a string.
|
|
6
|
+
|
|
7
|
+
For example, to add 5 and 3, you would call this with a=5 and b=3.
|
|
8
|
+
|
|
9
|
+
Args:
|
|
10
|
+
a: The first number.
|
|
11
|
+
b: The second number.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
The sum of the two numbers as a string, or an error message if addition fails.
|
|
15
|
+
"""
|
|
16
|
+
try:
|
|
17
|
+
result = a + b
|
|
18
|
+
return str(result)
|
|
19
|
+
except Exception as e:
|
|
20
|
+
return f"Error: Could not add numbers. Reason: {str(e)}"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def sum_numbers(a: int, b: int) -> int:
|
|
24
|
+
"""Adds two integer numbers together and returns the integer result.
|
|
25
|
+
|
|
26
|
+
Used specifically in Google ADK examples where an integer return is expected.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
a: The first number.
|
|
30
|
+
b: The second number.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
The sum of the two numbers as an integer.
|
|
34
|
+
"""
|
|
35
|
+
print(f"Tool executed: sum_numbers({a}, {b})")
|
|
36
|
+
return a + b
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
def add_numbers(a: int, b: int) -> str:
|
|
2
|
+
"""Adds two integer numbers together and returns the result as a string.
|
|
3
|
+
|
|
4
|
+
For example, to add 5 and 3, you would call this with a=5 and b=3.
|
|
5
|
+
|
|
6
|
+
Args:
|
|
7
|
+
a: The first number.
|
|
8
|
+
b: The second number.
|
|
9
|
+
|
|
10
|
+
Returns:
|
|
11
|
+
The sum of the two numbers as a string, or an error message if addition fails.
|
|
12
|
+
"""
|
|
13
|
+
def sum_numbers(a: int, b: int) -> int:
|
|
14
|
+
"""Adds two integer numbers together and returns the integer result.
|
|
15
|
+
|
|
16
|
+
Used specifically in Google ADK examples where an integer return is expected.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
a: The first number.
|
|
20
|
+
b: The second number.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
The sum of the two numbers as an integer.
|
|
24
|
+
"""
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Defines a weather tool that can be used to get the weather for a specified city.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from aip_agents.utils.logger import get_logger
|
|
9
|
+
|
|
10
|
+
logger = get_logger(__name__)
|
|
11
|
+
|
|
12
|
+
# Combined weather data storage with detailed information
|
|
13
|
+
WEATHER_DATA = {
|
|
14
|
+
"Jakarta": {"temperature": "32°C", "conditions": "Partly cloudy with high humidity", "humidity": "78%"},
|
|
15
|
+
"Singapore": {"temperature": "30°C", "conditions": "Scattered thunderstorms", "humidity": "85%"},
|
|
16
|
+
"Tokyo": {"temperature": "25°C", "conditions": "Clear skies", "humidity": "65%"},
|
|
17
|
+
"London": {"temperature": "18°C", "conditions": "Light rain", "humidity": "82%"},
|
|
18
|
+
"New York": {"temperature": "22°C", "conditions": "Sunny", "humidity": "60%"},
|
|
19
|
+
"Sydney": {"temperature": "24°C", "conditions": "Clear", "humidity": "70%"},
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def get_weather(location: str) -> dict:
|
|
24
|
+
"""Gets detailed weather information for a specified location.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
location: The name of the city to get weather for.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
A dictionary containing:
|
|
31
|
+
- location: The requested location name
|
|
32
|
+
- weather: A dictionary with temperature, conditions, and humidity
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
city_name = location.split(",")[0].strip().title()
|
|
36
|
+
weather = WEATHER_DATA.get(city_name)
|
|
37
|
+
|
|
38
|
+
if weather:
|
|
39
|
+
logger.info(f"Found weather for {city_name}: {weather}")
|
|
40
|
+
return {"location": city_name, "weather": weather}
|
|
41
|
+
else:
|
|
42
|
+
message = f"Weather data not available for {location}"
|
|
43
|
+
logger.warning(message)
|
|
44
|
+
return {
|
|
45
|
+
"location": city_name,
|
|
46
|
+
"weather": {"temperature": "Unknown", "conditions": "No data available", "humidity": "Unknown"},
|
|
47
|
+
"message": message,
|
|
48
|
+
}
|
|
49
|
+
except Exception as e:
|
|
50
|
+
error_msg = f"Error getting weather for {location}: {str(e)}"
|
|
51
|
+
logger.error(error_msg)
|
|
52
|
+
return {
|
|
53
|
+
"location": location,
|
|
54
|
+
"error": error_msg,
|
|
55
|
+
"weather": {"temperature": "Error", "conditions": "Error retrieving data", "humidity": "Error"},
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# Alias for backward compatibility
|
|
60
|
+
weather_tool = get_weather
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
+
|
|
4
|
+
logger: Incomplete
|
|
5
|
+
WEATHER_DATA: Incomplete
|
|
6
|
+
|
|
7
|
+
def get_weather(location: str) -> dict:
|
|
8
|
+
"""Gets detailed weather information for a specified location.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
location: The name of the city to get weather for.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
A dictionary containing:
|
|
15
|
+
- location: The requested location name
|
|
16
|
+
- weather: A dictionary with temperature, conditions, and humidity
|
|
17
|
+
"""
|
|
18
|
+
weather_tool = get_weather
|