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.
- 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,189 @@
|
|
|
1
|
+
"""Mock tools for demonstrating PII handling in parallel tool execution.
|
|
2
|
+
|
|
3
|
+
This module provides tools that return personally identifiable information (PII)
|
|
4
|
+
to demonstrate how the PII handler automatically anonymizes and deanonymizes data
|
|
5
|
+
during tool execution.
|
|
6
|
+
|
|
7
|
+
Tools included:
|
|
8
|
+
- get_customer_info: Returns customer information including email and phone
|
|
9
|
+
- get_employee_data: Returns employee data including name and salary
|
|
10
|
+
- get_user_profile: Returns user profile with personal details
|
|
11
|
+
|
|
12
|
+
Authors:
|
|
13
|
+
Cascade AI Assistant
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from langchain_core.tools import tool
|
|
17
|
+
from pydantic import BaseModel
|
|
18
|
+
|
|
19
|
+
from aip_agents.utils.logger import LoggerManager
|
|
20
|
+
|
|
21
|
+
logger = LoggerManager().get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class CustomerIdSchema(BaseModel):
|
|
25
|
+
"""Schema for customer ID input."""
|
|
26
|
+
|
|
27
|
+
customer_id: str
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class EmployeeIdSchema(BaseModel):
|
|
31
|
+
"""Schema for employee ID input."""
|
|
32
|
+
|
|
33
|
+
employee_id: str
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class UserIdSchema(BaseModel):
|
|
37
|
+
"""Schema for user ID input."""
|
|
38
|
+
|
|
39
|
+
user_id: str
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@tool(args_schema=CustomerIdSchema)
|
|
43
|
+
def get_customer_info(customer_id: str) -> str:
|
|
44
|
+
"""Gets customer information including email and phone number.
|
|
45
|
+
|
|
46
|
+
This tool demonstrates PII handling by returning sensitive customer data
|
|
47
|
+
that will be automatically anonymized by the PII handler.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
customer_id: The ID of the customer to retrieve information for.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A string containing customer information with PII.
|
|
54
|
+
"""
|
|
55
|
+
customer_data = {
|
|
56
|
+
"C001": {
|
|
57
|
+
"name": "John Smith",
|
|
58
|
+
"email": "john.smith@example.com",
|
|
59
|
+
"phone": "+1-555-0101",
|
|
60
|
+
"address": "123 Main St, New York, NY 10001",
|
|
61
|
+
},
|
|
62
|
+
"C002": {
|
|
63
|
+
"name": "Alice Johnson",
|
|
64
|
+
"email": "alice.johnson@example.com",
|
|
65
|
+
"phone": "+1-555-0102",
|
|
66
|
+
"address": "456 Oak Ave, Los Angeles, CA 90001",
|
|
67
|
+
},
|
|
68
|
+
"C003": {
|
|
69
|
+
"name": "Bob Williams",
|
|
70
|
+
"email": "bob.williams@example.com",
|
|
71
|
+
"phone": "+1-555-0103",
|
|
72
|
+
"address": "789 Pine Rd, Chicago, IL 60601",
|
|
73
|
+
},
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
customer = customer_data.get(customer_id.upper())
|
|
77
|
+
if customer:
|
|
78
|
+
logger.info(f"Retrieved customer info for {customer_id}")
|
|
79
|
+
return (
|
|
80
|
+
f"Customer {customer_id}: Name: {customer['name']}, "
|
|
81
|
+
f"Email: {customer['email']}, Phone: {customer['phone']}, "
|
|
82
|
+
f"Address: {customer['address']}"
|
|
83
|
+
)
|
|
84
|
+
else:
|
|
85
|
+
message = f"Customer {customer_id} not found"
|
|
86
|
+
logger.warning(message)
|
|
87
|
+
return message
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@tool(args_schema=EmployeeIdSchema)
|
|
91
|
+
def get_employee_data(employee_id: str) -> str:
|
|
92
|
+
"""Gets employee data including name, email, and salary information.
|
|
93
|
+
|
|
94
|
+
This tool demonstrates PII handling with employee-specific data that includes
|
|
95
|
+
sensitive information like salary and personal email addresses.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
employee_id: The ID of the employee to retrieve data for.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
A string containing employee information with PII.
|
|
102
|
+
"""
|
|
103
|
+
employee_data = {
|
|
104
|
+
"E001": {
|
|
105
|
+
"name": "Carol Davis",
|
|
106
|
+
"email": "carol.davis@company.com",
|
|
107
|
+
"phone": "+1-555-0201",
|
|
108
|
+
"salary": "$85,000",
|
|
109
|
+
"department": "Engineering",
|
|
110
|
+
},
|
|
111
|
+
"E002": {
|
|
112
|
+
"name": "David Miller",
|
|
113
|
+
"email": "david.miller@company.com",
|
|
114
|
+
"phone": "+1-555-0202",
|
|
115
|
+
"salary": "$92,000",
|
|
116
|
+
"department": "Product",
|
|
117
|
+
},
|
|
118
|
+
"E003": {
|
|
119
|
+
"name": "Emma Wilson",
|
|
120
|
+
"email": "emma.wilson@company.com",
|
|
121
|
+
"phone": "+1-555-0203",
|
|
122
|
+
"salary": "$78,000",
|
|
123
|
+
"department": "Marketing",
|
|
124
|
+
},
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
employee = employee_data.get(employee_id.upper())
|
|
128
|
+
if employee:
|
|
129
|
+
logger.info(f"Retrieved employee data for {employee_id}")
|
|
130
|
+
return (
|
|
131
|
+
f"Employee {employee_id}: Name: {employee['name']}, "
|
|
132
|
+
f"Email: {employee['email']}, Phone: {employee['phone']}, "
|
|
133
|
+
f"Salary: {employee['salary']}, Department: {employee['department']}"
|
|
134
|
+
)
|
|
135
|
+
else:
|
|
136
|
+
message = f"Employee {employee_id} not found"
|
|
137
|
+
logger.warning(message)
|
|
138
|
+
return message
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@tool(args_schema=UserIdSchema)
|
|
142
|
+
def get_user_profile(user_id: str) -> str:
|
|
143
|
+
"""Gets user profile information with personal details.
|
|
144
|
+
|
|
145
|
+
This tool demonstrates PII handling with user profile data that includes
|
|
146
|
+
personal information like email, phone, and date of birth.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
user_id: The ID of the user to retrieve profile for.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
A string containing user profile information with PII.
|
|
153
|
+
"""
|
|
154
|
+
user_data = {
|
|
155
|
+
"U001": {
|
|
156
|
+
"username": "john_doe",
|
|
157
|
+
"email": "john.doe@personal.com",
|
|
158
|
+
"phone": "+1-555-0301",
|
|
159
|
+
"dob": "1990-05-15",
|
|
160
|
+
"city": "Seattle, WA",
|
|
161
|
+
},
|
|
162
|
+
"U002": {
|
|
163
|
+
"username": "jane_smith",
|
|
164
|
+
"email": "jane.smith@personal.com",
|
|
165
|
+
"phone": "+1-555-0302",
|
|
166
|
+
"dob": "1992-08-22",
|
|
167
|
+
"city": "Portland, OR",
|
|
168
|
+
},
|
|
169
|
+
"U003": {
|
|
170
|
+
"username": "bob_jones",
|
|
171
|
+
"email": "bob.jones@personal.com",
|
|
172
|
+
"phone": "+1-555-0303",
|
|
173
|
+
"dob": "1988-03-10",
|
|
174
|
+
"city": "San Francisco, CA",
|
|
175
|
+
},
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
user = user_data.get(user_id.upper())
|
|
179
|
+
if user:
|
|
180
|
+
logger.info(f"Retrieved user profile for {user_id}")
|
|
181
|
+
return (
|
|
182
|
+
f"User {user_id}: Username: {user['username']}, "
|
|
183
|
+
f"Email: {user['email']}, Phone: {user['phone']}, "
|
|
184
|
+
f"DOB: {user['dob']}, City: {user['city']}"
|
|
185
|
+
)
|
|
186
|
+
else:
|
|
187
|
+
message = f"User {user_id} not found"
|
|
188
|
+
logger.warning(message)
|
|
189
|
+
return message
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.utils.logger import LoggerManager as LoggerManager
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
logger: Incomplete
|
|
6
|
+
|
|
7
|
+
class CustomerIdSchema(BaseModel):
|
|
8
|
+
"""Schema for customer ID input."""
|
|
9
|
+
customer_id: str
|
|
10
|
+
|
|
11
|
+
class EmployeeIdSchema(BaseModel):
|
|
12
|
+
"""Schema for employee ID input."""
|
|
13
|
+
employee_id: str
|
|
14
|
+
|
|
15
|
+
class UserIdSchema(BaseModel):
|
|
16
|
+
"""Schema for user ID input."""
|
|
17
|
+
user_id: str
|
|
18
|
+
|
|
19
|
+
def get_customer_info(customer_id: str) -> str:
|
|
20
|
+
"""Gets customer information including email and phone number.
|
|
21
|
+
|
|
22
|
+
This tool demonstrates PII handling by returning sensitive customer data
|
|
23
|
+
that will be automatically anonymized by the PII handler.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
customer_id: The ID of the customer to retrieve information for.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
A string containing customer information with PII.
|
|
30
|
+
"""
|
|
31
|
+
def get_employee_data(employee_id: str) -> str:
|
|
32
|
+
"""Gets employee data including name, email, and salary information.
|
|
33
|
+
|
|
34
|
+
This tool demonstrates PII handling with employee-specific data that includes
|
|
35
|
+
sensitive information like salary and personal email addresses.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
employee_id: The ID of the employee to retrieve data for.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
A string containing employee information with PII.
|
|
42
|
+
"""
|
|
43
|
+
def get_user_profile(user_id: str) -> str:
|
|
44
|
+
"""Gets user profile information with personal details.
|
|
45
|
+
|
|
46
|
+
This tool demonstrates PII handling with user profile data that includes
|
|
47
|
+
personal information like email, phone, and date of birth.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
user_id: The ID of the user to retrieve profile for.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A string containing user profile information with PII.
|
|
54
|
+
"""
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""Tool that generates random bar chart artifacts for streaming demos."""
|
|
2
|
+
|
|
3
|
+
import io
|
|
4
|
+
import random
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from langchain_core.tools import BaseTool
|
|
8
|
+
from langgraph.types import Command
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
from aip_agents.a2a.types import MimeType
|
|
12
|
+
from aip_agents.utils.artifact_helpers import create_artifact_command
|
|
13
|
+
|
|
14
|
+
DEFAULT_RANDOM_CHART_TITLE = "Random Insights"
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
from PIL import Image, ImageDraw # type: ignore
|
|
18
|
+
|
|
19
|
+
PIL_AVAILABLE = True
|
|
20
|
+
except ImportError: # pragma: no cover - PIL optional
|
|
21
|
+
PIL_AVAILABLE = False
|
|
22
|
+
Image = None
|
|
23
|
+
ImageDraw = None
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class RandomChartInput(BaseModel):
|
|
27
|
+
"""Input schema for random chart generation."""
|
|
28
|
+
|
|
29
|
+
title: str = Field(
|
|
30
|
+
default=DEFAULT_RANDOM_CHART_TITLE,
|
|
31
|
+
description="Title rendered at the top of the chart.",
|
|
32
|
+
)
|
|
33
|
+
num_bars: int = Field(
|
|
34
|
+
default=5,
|
|
35
|
+
ge=3,
|
|
36
|
+
le=10,
|
|
37
|
+
description="How many bars to render.",
|
|
38
|
+
)
|
|
39
|
+
min_value: int = Field(
|
|
40
|
+
default=10,
|
|
41
|
+
ge=0,
|
|
42
|
+
description="Minimum possible value for a bar.",
|
|
43
|
+
)
|
|
44
|
+
max_value: int = Field(
|
|
45
|
+
default=100,
|
|
46
|
+
gt=10,
|
|
47
|
+
description="Maximum possible value for a bar.",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class RandomChartTool(BaseTool):
|
|
52
|
+
"""Generate random bar chart images without relying on upstream data."""
|
|
53
|
+
|
|
54
|
+
name: str = "random_chart_tool"
|
|
55
|
+
description: str = "Create a random bar chart image artifact to showcase image streaming."
|
|
56
|
+
args_schema: type[BaseModel] = RandomChartInput
|
|
57
|
+
|
|
58
|
+
def _run( # noqa: D401
|
|
59
|
+
self,
|
|
60
|
+
title: str = DEFAULT_RANDOM_CHART_TITLE,
|
|
61
|
+
num_bars: int = 5,
|
|
62
|
+
min_value: int = 10,
|
|
63
|
+
max_value: int = 100,
|
|
64
|
+
**kwargs: Any,
|
|
65
|
+
) -> Command:
|
|
66
|
+
"""Generate the chart synchronously."""
|
|
67
|
+
if min_value >= max_value:
|
|
68
|
+
return Command(
|
|
69
|
+
update={"result": "❌ min_value must be less than max_value", "metadata": {"error": "invalid_range"}}
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
rng = random.Random()
|
|
73
|
+
values = [rng.randint(min_value, max_value) for _ in range(num_bars)]
|
|
74
|
+
labels = [f"Bar {i + 1}" for i in range(num_bars)]
|
|
75
|
+
|
|
76
|
+
if PIL_AVAILABLE:
|
|
77
|
+
image_bytes = self._create_image_with_pil(title, labels, values)
|
|
78
|
+
else:
|
|
79
|
+
image_bytes = self._create_text_artifact(title, labels, values)
|
|
80
|
+
|
|
81
|
+
artifact_mime_type = MimeType.IMAGE_PNG if PIL_AVAILABLE else MimeType.TEXT_PLAIN
|
|
82
|
+
return create_artifact_command(
|
|
83
|
+
result=f"📊 Generated random bar chart '{title}' with {num_bars} bars",
|
|
84
|
+
artifact_data=image_bytes,
|
|
85
|
+
artifact_name=f"{title.lower().replace(' ', '_')}_random_chart.png",
|
|
86
|
+
artifact_description=f"Random bar chart ({num_bars} bars)",
|
|
87
|
+
mime_type=artifact_mime_type,
|
|
88
|
+
metadata_update={
|
|
89
|
+
"visualization": {
|
|
90
|
+
"chart_type": "bar",
|
|
91
|
+
"title": title,
|
|
92
|
+
"data_points": num_bars,
|
|
93
|
+
"randomized": True,
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
async def _arun(
|
|
99
|
+
self,
|
|
100
|
+
title: str = DEFAULT_RANDOM_CHART_TITLE,
|
|
101
|
+
num_bars: int = 5,
|
|
102
|
+
min_value: int = 10,
|
|
103
|
+
max_value: int = 100,
|
|
104
|
+
**kwargs: Any,
|
|
105
|
+
) -> Command:
|
|
106
|
+
"""Async wrapper for random chart generation."""
|
|
107
|
+
return self._run(title=title, num_bars=num_bars, min_value=min_value, max_value=max_value, **kwargs)
|
|
108
|
+
|
|
109
|
+
def _create_image_with_pil(self, title: str, labels: list[str], values: list[int]) -> bytes:
|
|
110
|
+
width, height = 400, 300
|
|
111
|
+
image = Image.new("RGB", (width, height), "white")
|
|
112
|
+
draw = ImageDraw.Draw(image)
|
|
113
|
+
draw.text((10, 10), title[:40], fill="black")
|
|
114
|
+
|
|
115
|
+
chart_x, chart_y = 40, 50
|
|
116
|
+
chart_width = width - 80
|
|
117
|
+
chart_height = height - 100
|
|
118
|
+
|
|
119
|
+
max_val = max(values)
|
|
120
|
+
min_val = min(values)
|
|
121
|
+
val_range = max_val - min_val if max_val != min_val else 1
|
|
122
|
+
bar_width = chart_width // len(values)
|
|
123
|
+
|
|
124
|
+
for idx, (label, value) in enumerate(zip(labels, values, strict=False)):
|
|
125
|
+
x = chart_x + idx * bar_width
|
|
126
|
+
normalized = (value - min_val) / val_range
|
|
127
|
+
y = chart_y + chart_height - (normalized * chart_height)
|
|
128
|
+
|
|
129
|
+
draw.rectangle([x + 2, y, x + bar_width - 4, chart_y + chart_height], fill="#4C78A8", outline="black")
|
|
130
|
+
draw.text((x + 2, chart_y + chart_height + 5), label[:8], fill="black")
|
|
131
|
+
|
|
132
|
+
buf = io.BytesIO()
|
|
133
|
+
image.save(buf, format="PNG")
|
|
134
|
+
return buf.getvalue()
|
|
135
|
+
|
|
136
|
+
def _create_text_artifact(self, title: str, labels: list[str], values: list[int]) -> bytes:
|
|
137
|
+
max_val = max(values)
|
|
138
|
+
lines = [f"=== {title} ===", "", "Random bar chart artifact", ""]
|
|
139
|
+
for label, value in zip(labels, values, strict=False):
|
|
140
|
+
length = int((value / max_val) * 30) if max_val else 0
|
|
141
|
+
lines.append(f"{label:>8}: {'█' * length} ({value})")
|
|
142
|
+
return "\n".join(lines).encode("utf-8")
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from aip_agents.a2a.types import MimeType as MimeType
|
|
2
|
+
from aip_agents.utils.artifact_helpers import create_artifact_command as create_artifact_command
|
|
3
|
+
from langchain_core.tools import BaseTool
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
6
|
+
DEFAULT_RANDOM_CHART_TITLE: str
|
|
7
|
+
PIL_AVAILABLE: bool
|
|
8
|
+
|
|
9
|
+
class RandomChartInput(BaseModel):
|
|
10
|
+
"""Input schema for random chart generation."""
|
|
11
|
+
title: str
|
|
12
|
+
num_bars: int
|
|
13
|
+
min_value: int
|
|
14
|
+
max_value: int
|
|
15
|
+
|
|
16
|
+
class RandomChartTool(BaseTool):
|
|
17
|
+
"""Generate random bar chart images without relying on upstream data."""
|
|
18
|
+
name: str
|
|
19
|
+
description: str
|
|
20
|
+
args_schema: type[BaseModel]
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"""Tool to search Google Serper API.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from gllm_core.schema import Chunk
|
|
13
|
+
from langchain_core.tools import BaseTool
|
|
14
|
+
from pydantic import BaseModel, Field
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class GoogleSerperInput(BaseModel):
|
|
20
|
+
"""Input schema for the GoogleSerperTool."""
|
|
21
|
+
|
|
22
|
+
query: str = Field(..., description="Search query")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class MockGoogleSerperTool(BaseTool):
|
|
26
|
+
"""Mock Tool to simulate Google Serper API results for testing."""
|
|
27
|
+
|
|
28
|
+
name: str = "google_serper"
|
|
29
|
+
description: str = """
|
|
30
|
+
Useful for searching the web using the Google Serper API (mocked).
|
|
31
|
+
Input should be a search query.
|
|
32
|
+
"""
|
|
33
|
+
save_output_history: bool = True
|
|
34
|
+
args_schema: type[BaseModel] = GoogleSerperInput
|
|
35
|
+
|
|
36
|
+
def _run(self, query: str) -> str:
|
|
37
|
+
"""Return a hardcoded mock response as a JSON string.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
query (str): The search query to process.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
str: JSON string containing mock search results.
|
|
44
|
+
"""
|
|
45
|
+
normalized_query = query.lower()
|
|
46
|
+
|
|
47
|
+
# Special-case oncology AI drug discovery queries so the agent
|
|
48
|
+
# naturally sees stock-oriented company context and can call
|
|
49
|
+
# stock tools (get_stock_price, get_stock_news) afterwards.
|
|
50
|
+
if "oncology" in normalized_query or "drug discovery" in normalized_query:
|
|
51
|
+
mock_result = {
|
|
52
|
+
"organic": [
|
|
53
|
+
{
|
|
54
|
+
"title": "NVIDIA (NVDA) - AI infrastructure for healthcare and drug discovery",
|
|
55
|
+
"link": "https://nvidia.example.com/healthcare-ai",
|
|
56
|
+
"snippet": (
|
|
57
|
+
"NVIDIA (ticker: NVDA) provides GPU-accelerated platforms widely used in AI-driven "
|
|
58
|
+
"drug discovery and oncology research. Investors closely watch NVDA stock as demand "
|
|
59
|
+
"for healthcare and life-sciences AI workloads grows."
|
|
60
|
+
),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"title": "Microsoft (MSFT) - Azure AI partnerships with pharma and oncology",
|
|
64
|
+
"link": "https://microsoft.example.com/azure-health",
|
|
65
|
+
"snippet": (
|
|
66
|
+
"Microsoft (MSFT) collaborates with leading pharma companies to apply Azure AI to "
|
|
67
|
+
"oncology and drug discovery workflows. Analysts frequently reference MSFT stock when "
|
|
68
|
+
"discussing enterprise AI in healthcare."
|
|
69
|
+
),
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"title": "Apple (AAPL) - Devices and AI ecosystems in digital health",
|
|
73
|
+
"link": "https://apple.example.com/health-ai",
|
|
74
|
+
"snippet": (
|
|
75
|
+
"Apple (AAPL) integrates AI into health and wellness features that support oncology "
|
|
76
|
+
"patients and clinical research. Market commentary often links AAPL stock to long-term "
|
|
77
|
+
"growth in digital health and AI."
|
|
78
|
+
),
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
"news": [
|
|
82
|
+
{
|
|
83
|
+
"title": "NVDA rallies on new healthcare AI partnerships",
|
|
84
|
+
"link": "https://news.example.com/nvda-oncology-ai",
|
|
85
|
+
"snippet": (
|
|
86
|
+
"NVIDIA (NVDA) announced expanded collaborations focused on oncology and AI-driven "
|
|
87
|
+
"drug discovery, prompting renewed interest in NVDA stock among growth investors."
|
|
88
|
+
),
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"title": "MSFT deepens AI oncology collaborations on Azure",
|
|
92
|
+
"link": "https://news.example.com/msft-azure-oncology",
|
|
93
|
+
"snippet": (
|
|
94
|
+
"Microsoft (MSFT) reported new Azure AI partnerships with oncology research centers, "
|
|
95
|
+
"and analysts highlighted MSFT stock as a key AI infrastructure play in healthcare."
|
|
96
|
+
),
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"title": "AAPL explores AI-enabled health insights for cancer care",
|
|
100
|
+
"link": "https://news.example.com/aapl-health-oncology",
|
|
101
|
+
"snippet": (
|
|
102
|
+
"Apple (AAPL) is reportedly piloting AI-enabled health features that could support "
|
|
103
|
+
"oncology patient monitoring, adding another angle to the long-term AAPL stock story."
|
|
104
|
+
),
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
}
|
|
108
|
+
else:
|
|
109
|
+
# Default mock result used for generic queries.
|
|
110
|
+
mock_result = {
|
|
111
|
+
"organic": [
|
|
112
|
+
{
|
|
113
|
+
"title": "NeoAI - Artificial Intelligence Research",
|
|
114
|
+
"link": "https://neoai.example.com/",
|
|
115
|
+
"snippet": (
|
|
116
|
+
"NeoAI is an AI research and deployment company. Our mission is to ensure that "
|
|
117
|
+
"artificial general intelligence benefits all of humanity."
|
|
118
|
+
),
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"title": "Wikipedia - NeoAI",
|
|
122
|
+
"link": "https://en.wikipedia.org/wiki/NeoAI",
|
|
123
|
+
"snippet": (
|
|
124
|
+
"NeoAI is a fictional artificial intelligence research organization consisting of the "
|
|
125
|
+
"for-profit NeoAI LP and its parent company, the non-profit NeoAI Foundation."
|
|
126
|
+
),
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
"news": [
|
|
130
|
+
{
|
|
131
|
+
"title": "NeoAI unveils new LLM model",
|
|
132
|
+
"link": "https://news.example.com/neoai-llm",
|
|
133
|
+
"snippet": (
|
|
134
|
+
"NeoAI has announced the release of NeoAI-LLM, a new large multimodal model that accepts "
|
|
135
|
+
"image and text inputs."
|
|
136
|
+
),
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return json.dumps(mock_result)
|
|
142
|
+
|
|
143
|
+
def _format_agent_reference(self, tool_output: str) -> list[Chunk]:
|
|
144
|
+
parsed_output = self._parse_tool_output(tool_output)
|
|
145
|
+
if not parsed_output:
|
|
146
|
+
return []
|
|
147
|
+
formatted_chunks = []
|
|
148
|
+
file_id_counter = 0
|
|
149
|
+
for section_name, section_data in parsed_output.items():
|
|
150
|
+
if not isinstance(section_data, list):
|
|
151
|
+
continue
|
|
152
|
+
results = self._process_section_items(section_name, section_data, file_id_counter)
|
|
153
|
+
formatted_chunks.extend(results["chunks"])
|
|
154
|
+
file_id_counter = results["counter"]
|
|
155
|
+
return formatted_chunks
|
|
156
|
+
|
|
157
|
+
def _parse_tool_output(self, tool_output: str) -> dict[str, Any]:
|
|
158
|
+
if isinstance(tool_output, str):
|
|
159
|
+
try:
|
|
160
|
+
return json.loads(tool_output)
|
|
161
|
+
except json.JSONDecodeError:
|
|
162
|
+
logger.error("Error: Unable to parse tool_output as JSON when formatting agent references.")
|
|
163
|
+
return {}
|
|
164
|
+
return tool_output
|
|
165
|
+
|
|
166
|
+
def _process_section_items(self, section_name: str, section_data: list[dict], start_counter: int) -> dict[str, Any]:
|
|
167
|
+
chunks = []
|
|
168
|
+
counter = start_counter
|
|
169
|
+
for item in section_data:
|
|
170
|
+
if not isinstance(item, dict):
|
|
171
|
+
continue
|
|
172
|
+
try:
|
|
173
|
+
chunk = self._create_chunk_from_item(section_name, item, counter)
|
|
174
|
+
if chunk:
|
|
175
|
+
chunks.append(chunk)
|
|
176
|
+
counter += 1
|
|
177
|
+
except Exception as e:
|
|
178
|
+
logger.error(f"Error processing {section_name} result: {e}")
|
|
179
|
+
return {"chunks": chunks, "counter": counter}
|
|
180
|
+
|
|
181
|
+
def _create_chunk_from_item(self, section_name: str, item: dict[str, Any], file_id: int) -> Chunk | None:
|
|
182
|
+
link = item.get("link")
|
|
183
|
+
if not link:
|
|
184
|
+
logger.warning(f"Skipping item {file_id} from {section_name} result: Missing link")
|
|
185
|
+
return None
|
|
186
|
+
content = ""
|
|
187
|
+
if "snippet" in item:
|
|
188
|
+
content = item["snippet"]
|
|
189
|
+
elif "title" in item:
|
|
190
|
+
content = item["title"]
|
|
191
|
+
if not content:
|
|
192
|
+
logger.warning(f"Skipping item {file_id} from {section_name} result: Missing content")
|
|
193
|
+
return None
|
|
194
|
+
metadata = {
|
|
195
|
+
"source": item.get("title", "Untitled Source"),
|
|
196
|
+
"section_type": section_name,
|
|
197
|
+
"source_type": "website",
|
|
198
|
+
"title": item.get("title", "Untitled"),
|
|
199
|
+
"link": link,
|
|
200
|
+
"file_id": str(file_id),
|
|
201
|
+
}
|
|
202
|
+
return Chunk(content=content, metadata=metadata)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from langchain_core.tools import BaseTool
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
logger: Incomplete
|
|
6
|
+
|
|
7
|
+
class GoogleSerperInput(BaseModel):
|
|
8
|
+
"""Input schema for the GoogleSerperTool."""
|
|
9
|
+
query: str
|
|
10
|
+
|
|
11
|
+
class MockGoogleSerperTool(BaseTool):
|
|
12
|
+
"""Mock Tool to simulate Google Serper API results for testing."""
|
|
13
|
+
name: str
|
|
14
|
+
description: str
|
|
15
|
+
save_output_history: bool
|
|
16
|
+
args_schema: type[BaseModel]
|