aip-agents-binary 0.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of aip-agents-binary might be problematic. Click here for more details.
- aip_agents/__init__.py +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +3037 -0
- aip_agents/agent/base_langgraph_agent.pyi +233 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +767 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
- aip_agents/agent/langgraph_react_agent.py +2856 -0
- aip_agents/agent/langgraph_react_agent.pyi +170 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +228 -0
- aip_agents/mcp/client/connection_manager.pyi +51 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +612 -0
- aip_agents/mcp/client/persistent_session.pyi +122 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +263 -0
- aip_agents/mcp/client/transports.pyi +132 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +811 -0
- aip_agents/memory/adapters/base_adapter.pyi +176 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/ptc/__init__.py +48 -0
- aip_agents/ptc/__init__.pyi +10 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/doc_gen.pyi +40 -0
- aip_agents/ptc/exceptions.py +39 -0
- aip_agents/ptc/exceptions.pyi +22 -0
- aip_agents/ptc/executor.py +143 -0
- aip_agents/ptc/executor.pyi +73 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/__init__.pyi +7 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
- aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
- aip_agents/ptc/naming.py +184 -0
- aip_agents/ptc/naming.pyi +76 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/payload.pyi +15 -0
- aip_agents/ptc/prompt_builder.py +571 -0
- aip_agents/ptc/prompt_builder.pyi +55 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/ptc_helper.pyi +1 -0
- aip_agents/ptc/sandbox_bridge.py +58 -0
- aip_agents/ptc/sandbox_bridge.pyi +25 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/template_utils.pyi +13 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/__init__.pyi +0 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/sandbox/__init__.py +43 -0
- aip_agents/sandbox/__init__.pyi +5 -0
- aip_agents/sandbox/defaults.py +9 -0
- aip_agents/sandbox/defaults.pyi +2 -0
- aip_agents/sandbox/e2b_runtime.py +267 -0
- aip_agents/sandbox/e2b_runtime.pyi +51 -0
- aip_agents/sandbox/template_builder.py +131 -0
- aip_agents/sandbox/template_builder.pyi +36 -0
- aip_agents/sandbox/types.py +24 -0
- aip_agents/sandbox/types.pyi +14 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/sandbox/validation.pyi +20 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +64 -0
- aip_agents/tools/__init__.pyi +11 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1120 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +815 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/date_range_tool.pyi +21 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/execute_ptc_code.py +308 -0
- aip_agents/tools/execute_ptc_code.pyi +90 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +365 -0
- aip_agents/tools/memory_search/mem0.pyi +29 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search/schema.pyi +25 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1096 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +329 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.6.4.dist-info/METADATA +673 -0
- aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
- aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
- aip_agents_binary-0.6.4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""Timezone-related helper functions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Final
|
|
7
|
+
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
|
8
|
+
|
|
9
|
+
from aip_agents.utils.logger import get_logger
|
|
10
|
+
|
|
11
|
+
__all__ = ["get_timezone_aware_now", "ensure_utc_datetime"]
|
|
12
|
+
|
|
13
|
+
logger: Final = get_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def get_timezone_aware_now(timezone: str, fallback_timezone: str = "UTC") -> tuple[datetime, str, bool]:
|
|
17
|
+
"""Return a timezone-aware datetime alongside a timezone label.
|
|
18
|
+
|
|
19
|
+
This function creates a timezone-aware datetime object using the modern
|
|
20
|
+
zoneinfo module (Python 3.9+). It gracefully falls back to UTC if the
|
|
21
|
+
requested timezone is invalid.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
timezone: Desired timezone name in IANA format (e.g., "America/New_York",
|
|
25
|
+
"Europe/London", "Asia/Tokyo"). Must be a non-empty string.
|
|
26
|
+
fallback_timezone: Fallback timezone name to use when the primary
|
|
27
|
+
timezone is invalid. Defaults to "UTC". Must be a non-empty string.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
tuple[datetime, str, bool]: A 3-tuple containing:
|
|
31
|
+
- now: A timezone-aware datetime object representing the current time
|
|
32
|
+
- timezone_label: A human-readable timezone label (e.g., "EST", "UTC")
|
|
33
|
+
- used_fallback: Boolean indicating whether the fallback timezone was used
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
ValueError: If timezone or fallback_timezone are empty/invalid, or if both
|
|
37
|
+
the requested timezone and fallback timezone are invalid.
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
>>> now, label, fallback = get_timezone_aware_now("America/New_York")
|
|
41
|
+
>>> print(f"Current time: {now}, Timezone: {label}, Used fallback: {fallback}")
|
|
42
|
+
Current time: 2024-01-15 10:30:00-05:00, Timezone: EST, Used fallback: False
|
|
43
|
+
|
|
44
|
+
>>> now, label, fallback = get_timezone_aware_now("Invalid/Timezone")
|
|
45
|
+
>>> print(f"Used fallback: {fallback}, Label: {label}")
|
|
46
|
+
Used fallback: True, Label: UTC
|
|
47
|
+
"""
|
|
48
|
+
timezone = _normalize_timezone("timezone", timezone)
|
|
49
|
+
fallback_timezone = _normalize_timezone("fallback_timezone", fallback_timezone)
|
|
50
|
+
|
|
51
|
+
tz, used_fallback = _load_timezone_with_case_enforcement(timezone, fallback_timezone)
|
|
52
|
+
now = datetime.now(tz)
|
|
53
|
+
timezone_label = _resolve_timezone_label(now, timezone, fallback_timezone, used_fallback)
|
|
54
|
+
|
|
55
|
+
return now, timezone_label, used_fallback
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def ensure_utc_datetime(value: datetime) -> datetime:
|
|
59
|
+
"""Normalize a datetime to UTC (attaching UTC to naive values).
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
value: Datetime to normalize.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
datetime: Timezone-aware datetime expressed in UTC.
|
|
66
|
+
|
|
67
|
+
Raises:
|
|
68
|
+
TypeError: If ``value`` is not a ``datetime`` instance.
|
|
69
|
+
"""
|
|
70
|
+
if not isinstance(value, datetime):
|
|
71
|
+
raise TypeError(f"Expected datetime, received {type(value).__name__}")
|
|
72
|
+
|
|
73
|
+
if value.tzinfo is None or value.tzinfo.utcoffset(value) is None:
|
|
74
|
+
return value.replace(tzinfo=ZoneInfo("UTC"))
|
|
75
|
+
|
|
76
|
+
return value.astimezone(ZoneInfo("UTC"))
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _normalize_timezone(param_name: str, value: str) -> str:
|
|
80
|
+
"""Validate and normalize a timezone parameter.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
param_name: Name of the parameter being validated, used in error messages.
|
|
84
|
+
value: Raw timezone string provided by the caller.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
A stripped, non-empty timezone string.
|
|
88
|
+
|
|
89
|
+
Raises:
|
|
90
|
+
ValueError: If ``value`` is not a non-empty string.
|
|
91
|
+
"""
|
|
92
|
+
if not isinstance(value, str) or not value.strip():
|
|
93
|
+
raise ValueError(f"{param_name} must be a non-empty string")
|
|
94
|
+
return value.strip()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _load_timezone_with_case_enforcement(timezone: str, fallback_timezone: str) -> tuple[ZoneInfo, bool]:
|
|
98
|
+
"""Load timezone ensuring case-sensitive behavior, falling back when needed.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
timezone: Requested timezone name in IANA format.
|
|
102
|
+
fallback_timezone: Fallback timezone to use when the requested one is invalid.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
A tuple containing the resolved ``ZoneInfo`` object and a boolean indicating
|
|
106
|
+
whether the fallback timezone was used.
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
ValueError: If both ``timezone`` and ``fallback_timezone`` are invalid.
|
|
110
|
+
"""
|
|
111
|
+
requested_tz = _load_requested_timezone(timezone)
|
|
112
|
+
if requested_tz is not None:
|
|
113
|
+
return requested_tz, False
|
|
114
|
+
|
|
115
|
+
logger.warning(
|
|
116
|
+
"Timezone '%s' unavailable, attempting fallback to '%s'",
|
|
117
|
+
timezone,
|
|
118
|
+
fallback_timezone,
|
|
119
|
+
)
|
|
120
|
+
return _load_fallback_timezone(timezone, fallback_timezone)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _load_requested_timezone(timezone: str) -> ZoneInfo | None:
|
|
124
|
+
"""Attempt to load the requested timezone with case enforcement.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
timezone: Requested timezone name in IANA format.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
The corresponding ``ZoneInfo`` if the timezone exists and matches case,
|
|
131
|
+
otherwise ``None``.
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
candidate_tz = ZoneInfo(timezone)
|
|
135
|
+
except ZoneInfoNotFoundError:
|
|
136
|
+
logger.warning("Timezone '%s' was not found", timezone)
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
canonical_key = getattr(candidate_tz, "key", None)
|
|
140
|
+
if canonical_key and canonical_key.lower() == timezone.lower() and canonical_key != timezone:
|
|
141
|
+
logger.warning(
|
|
142
|
+
"Timezone '%s' resolved to canonical key '%s'; case-sensitive handling requires an exact match",
|
|
143
|
+
timezone,
|
|
144
|
+
canonical_key,
|
|
145
|
+
)
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
logger.debug("Successfully loaded timezone: %s", timezone)
|
|
149
|
+
return candidate_tz
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _load_fallback_timezone(timezone: str, fallback_timezone: str) -> tuple[ZoneInfo, bool]:
|
|
153
|
+
"""Load the fallback timezone or raise a descriptive error.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
timezone: Original requested timezone name, used for error messaging.
|
|
157
|
+
fallback_timezone: Fallback timezone to attempt loading.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
A tuple containing the fallback ``ZoneInfo`` and ``True`` to indicate that the
|
|
161
|
+
fallback was used.
|
|
162
|
+
|
|
163
|
+
Raises:
|
|
164
|
+
ValueError: If the fallback timezone is also invalid.
|
|
165
|
+
"""
|
|
166
|
+
try:
|
|
167
|
+
fallback_tz = ZoneInfo(fallback_timezone)
|
|
168
|
+
except ZoneInfoNotFoundError as ex:
|
|
169
|
+
error_msg = (
|
|
170
|
+
f"Both requested timezone '{timezone}' and fallback timezone "
|
|
171
|
+
f"'{fallback_timezone}' are invalid. Please provide valid IANA timezone names."
|
|
172
|
+
)
|
|
173
|
+
logger.error(error_msg)
|
|
174
|
+
raise ValueError(error_msg) from ex
|
|
175
|
+
|
|
176
|
+
logger.debug("Successfully loaded fallback timezone: %s", fallback_timezone)
|
|
177
|
+
return fallback_tz, True
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _resolve_timezone_label(
|
|
181
|
+
now: datetime,
|
|
182
|
+
timezone: str,
|
|
183
|
+
fallback_timezone: str,
|
|
184
|
+
used_fallback: bool,
|
|
185
|
+
) -> str:
|
|
186
|
+
"""Determine the human-readable label for the timezone used.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
now: The timezone-aware datetime generated using the resolved timezone.
|
|
190
|
+
timezone: Requested timezone name in IANA format.
|
|
191
|
+
fallback_timezone: Fallback timezone name in IANA format.
|
|
192
|
+
used_fallback: Whether the fallback timezone was used.
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
A human-readable timezone label for display purposes.
|
|
196
|
+
"""
|
|
197
|
+
if used_fallback:
|
|
198
|
+
return fallback_timezone
|
|
199
|
+
|
|
200
|
+
try:
|
|
201
|
+
timezone_label = now.strftime("%Z")
|
|
202
|
+
if not timezone_label:
|
|
203
|
+
return timezone
|
|
204
|
+
return timezone_label
|
|
205
|
+
except (ValueError, OSError):
|
|
206
|
+
return timezone
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
__all__ = ['get_timezone_aware_now', 'ensure_utc_datetime']
|
|
4
|
+
|
|
5
|
+
def get_timezone_aware_now(timezone: str, fallback_timezone: str = 'UTC') -> tuple[datetime, str, bool]:
|
|
6
|
+
'''Return a timezone-aware datetime alongside a timezone label.
|
|
7
|
+
|
|
8
|
+
This function creates a timezone-aware datetime object using the modern
|
|
9
|
+
zoneinfo module (Python 3.9+). It gracefully falls back to UTC if the
|
|
10
|
+
requested timezone is invalid.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
timezone: Desired timezone name in IANA format (e.g., "America/New_York",
|
|
14
|
+
"Europe/London", "Asia/Tokyo"). Must be a non-empty string.
|
|
15
|
+
fallback_timezone: Fallback timezone name to use when the primary
|
|
16
|
+
timezone is invalid. Defaults to "UTC". Must be a non-empty string.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
tuple[datetime, str, bool]: A 3-tuple containing:
|
|
20
|
+
- now: A timezone-aware datetime object representing the current time
|
|
21
|
+
- timezone_label: A human-readable timezone label (e.g., "EST", "UTC")
|
|
22
|
+
- used_fallback: Boolean indicating whether the fallback timezone was used
|
|
23
|
+
|
|
24
|
+
Raises:
|
|
25
|
+
ValueError: If timezone or fallback_timezone are empty/invalid, or if both
|
|
26
|
+
the requested timezone and fallback timezone are invalid.
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
>>> now, label, fallback = get_timezone_aware_now("America/New_York")
|
|
30
|
+
>>> print(f"Current time: {now}, Timezone: {label}, Used fallback: {fallback}")
|
|
31
|
+
Current time: 2024-01-15 10:30:00-05:00, Timezone: EST, Used fallback: False
|
|
32
|
+
|
|
33
|
+
>>> now, label, fallback = get_timezone_aware_now("Invalid/Timezone")
|
|
34
|
+
>>> print(f"Used fallback: {fallback}, Label: {label}")
|
|
35
|
+
Used fallback: True, Label: UTC
|
|
36
|
+
'''
|
|
37
|
+
def ensure_utc_datetime(value: datetime) -> datetime:
|
|
38
|
+
"""Normalize a datetime to UTC (attaching UTC to naive values).
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
value: Datetime to normalize.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
datetime: Timezone-aware datetime expressed in UTC.
|
|
45
|
+
|
|
46
|
+
Raises:
|
|
47
|
+
TypeError: If ``value`` is not a ``datetime`` instance.
|
|
48
|
+
"""
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Utility helpers for loading local .env files in examples and apps."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_local_env(override: bool = True) -> None:
|
|
11
|
+
"""Load environment variables from a .env file if python-dotenv is available.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
override (bool, optional): Whether to override existing environment variables. Defaults to True.
|
|
15
|
+
"""
|
|
16
|
+
try:
|
|
17
|
+
from dotenv import find_dotenv, load_dotenv # type: ignore[import-not-found] # noqa: PLC0415
|
|
18
|
+
except ImportError:
|
|
19
|
+
logger.warning("Could not load .env file: python-dotenv not installed")
|
|
20
|
+
return
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
env_path = find_dotenv(usecwd=True)
|
|
24
|
+
load_dotenv(env_path, override=override)
|
|
25
|
+
logger.debug("Successfully loaded .env from %s", env_path)
|
|
26
|
+
except Exception as exc: # pragma: no cover - behaviour depends on environment
|
|
27
|
+
logger.warning("Could not load .env file: %s", exc)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
|
|
3
|
+
logger: Incomplete
|
|
4
|
+
|
|
5
|
+
def load_local_env(override: bool = True) -> None:
|
|
6
|
+
"""Load environment variables from a .env file if python-dotenv is available.
|
|
7
|
+
|
|
8
|
+
Args:
|
|
9
|
+
override (bool, optional): Whether to override existing environment variables. Defaults to True.
|
|
10
|
+
"""
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Shared event handler registry for streaming payload processing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from aip_agents.schema.a2a import A2AStreamEventType
|
|
8
|
+
from aip_agents.utils.logger import get_logger
|
|
9
|
+
|
|
10
|
+
logger = get_logger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class EventHandlerRegistry:
|
|
14
|
+
"""Registry for tracking known streaming events with pass-through behaviour."""
|
|
15
|
+
|
|
16
|
+
def __init__(self) -> None:
|
|
17
|
+
"""Initialize the event handler registry with known event types."""
|
|
18
|
+
self._known_events: set[str] = {self._normalize_event_type(event) for event in A2AStreamEventType}
|
|
19
|
+
|
|
20
|
+
def handle(self, event_type: A2AStreamEventType | str | None, payload: dict[str, Any]) -> dict[str, Any]:
|
|
21
|
+
"""Return the payload unchanged while logging unknown events.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
event_type (A2AStreamEventType | str | None): The type of the streaming event.
|
|
25
|
+
payload (dict[str, Any]): The event payload data.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
dict[str, Any]: The payload unchanged (pass-through).
|
|
29
|
+
"""
|
|
30
|
+
normalized = self._normalize_event_type(event_type)
|
|
31
|
+
if normalized not in self._known_events:
|
|
32
|
+
logger.info(
|
|
33
|
+
"Unknown event type encountered in event handler registry; using default passthrough.",
|
|
34
|
+
extra={
|
|
35
|
+
"event_type": normalized,
|
|
36
|
+
"metadata_keys": list((payload.get("metadata") or {}).keys()) if isinstance(payload, dict) else [],
|
|
37
|
+
},
|
|
38
|
+
)
|
|
39
|
+
return payload
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def _normalize_event_type(event_type: A2AStreamEventType | str | None) -> str:
|
|
43
|
+
"""Return a lowercase string for the supplied event type or ``unknown``.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
event_type: Enum instance, string literal, or None representing the event.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
str: Normalized event type identifier.
|
|
50
|
+
"""
|
|
51
|
+
if isinstance(event_type, A2AStreamEventType):
|
|
52
|
+
return event_type.value
|
|
53
|
+
if isinstance(event_type, str) and event_type:
|
|
54
|
+
return event_type
|
|
55
|
+
return "unknown"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
DEFAULT_EVENT_HANDLER_REGISTRY = EventHandlerRegistry()
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.schema.a2a import A2AStreamEventType as A2AStreamEventType
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
logger: Incomplete
|
|
7
|
+
|
|
8
|
+
class EventHandlerRegistry:
|
|
9
|
+
"""Registry for tracking known streaming events with pass-through behaviour."""
|
|
10
|
+
def __init__(self) -> None:
|
|
11
|
+
"""Initialize the event handler registry with known event types."""
|
|
12
|
+
def handle(self, event_type: A2AStreamEventType | str | None, payload: dict[str, Any]) -> dict[str, Any]:
|
|
13
|
+
"""Return the payload unchanged while logging unknown events.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
event_type (A2AStreamEventType | str | None): The type of the streaming event.
|
|
17
|
+
payload (dict[str, Any]): The event payload data.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
dict[str, Any]: The payload unchanged (pass-through).
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
DEFAULT_EVENT_HANDLER_REGISTRY: Incomplete
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"""Utilities for augmenting prompts with local file path notes.
|
|
2
|
+
|
|
3
|
+
This module adds file path metadata to queries but does not read file contents.
|
|
4
|
+
|
|
5
|
+
Authors:
|
|
6
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
|
|
11
|
+
from aip_agents.utils.logger import get_logger
|
|
12
|
+
|
|
13
|
+
logger = get_logger(__name__)
|
|
14
|
+
|
|
15
|
+
FILE_PATH_SYSTEM_NOTE = (
|
|
16
|
+
"\n\n[System Note: The user has provided a file named '{filename}'. "
|
|
17
|
+
"It is available at the following local path: {path}]"
|
|
18
|
+
)
|
|
19
|
+
FILE_PATH_INACCESSIBLE_NOTE = (
|
|
20
|
+
"\n\n[System Note: A file path was provided ({path}), but the file is not accessible. "
|
|
21
|
+
"Please inform the user about this issue.]"
|
|
22
|
+
)
|
|
23
|
+
FILE_URL_SYSTEM_NOTE = (
|
|
24
|
+
"\n\n[System Note: The file is also available at the following URL: {url} (expires in {expires_in} {hour_unit}).]"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _normalize_file_entry(entry: str | dict[str, object]) -> dict[str, object] | None:
|
|
29
|
+
"""Normalize a single file entry into a dict.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
entry: A string file path or a metadata dict.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
A normalized metadata dict or None if the entry is falsy.
|
|
36
|
+
|
|
37
|
+
Raises:
|
|
38
|
+
ValueError: If metadata dicts do not include a valid path.
|
|
39
|
+
"""
|
|
40
|
+
if not entry:
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
if isinstance(entry, str):
|
|
44
|
+
return {"path": entry}
|
|
45
|
+
|
|
46
|
+
if isinstance(entry, dict):
|
|
47
|
+
path = entry.get("path") or entry.get("local_path")
|
|
48
|
+
if not isinstance(path, str) or not path:
|
|
49
|
+
raise ValueError("file metadata dicts must include a non-empty 'path'")
|
|
50
|
+
return {
|
|
51
|
+
"path": path,
|
|
52
|
+
"filename": entry.get("filename"),
|
|
53
|
+
"s3_url": entry.get("s3_url") or entry.get("url") or entry.get("file_uri"),
|
|
54
|
+
"expires_in_hours": entry.get("expires_in_hours"),
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
raise ValueError("files must be a list of strings or dicts")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _dedupe_file_entries(files: list[str | dict[str, object]]) -> list[dict[str, object]]:
|
|
61
|
+
"""Normalize and deduplicate file entries by their resolved path.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
files: List of local filesystem paths or file metadata dicts.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Deduplicated list of normalized dict entries.
|
|
68
|
+
"""
|
|
69
|
+
seen: set[str] = set()
|
|
70
|
+
deduped_entries: list[dict[str, object]] = []
|
|
71
|
+
|
|
72
|
+
for raw_entry in files:
|
|
73
|
+
try:
|
|
74
|
+
normalized = _normalize_file_entry(raw_entry)
|
|
75
|
+
except ValueError as exc:
|
|
76
|
+
logger.warning(f"Skipping invalid file entry: {exc}")
|
|
77
|
+
continue
|
|
78
|
+
if not normalized:
|
|
79
|
+
continue
|
|
80
|
+
path_value = normalized.get("path")
|
|
81
|
+
path = path_value if isinstance(path_value, str) else str(path_value)
|
|
82
|
+
if path in seen:
|
|
83
|
+
continue
|
|
84
|
+
seen.add(path)
|
|
85
|
+
deduped_entries.append(normalized)
|
|
86
|
+
|
|
87
|
+
return deduped_entries
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _format_expiration_hours(expires_in_hours: object) -> tuple[object, str]:
|
|
91
|
+
"""Format expiration hours for display.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
expires_in_hours: Expiration hours value.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
Tuple of (expires_value, hour_unit).
|
|
98
|
+
"""
|
|
99
|
+
if isinstance(expires_in_hours, int):
|
|
100
|
+
return expires_in_hours, "hour" if expires_in_hours == 1 else "hours"
|
|
101
|
+
|
|
102
|
+
if isinstance(expires_in_hours, str) and expires_in_hours.isdigit():
|
|
103
|
+
expires_value = int(expires_in_hours)
|
|
104
|
+
return expires_value, "hour" if expires_value == 1 else "hours"
|
|
105
|
+
|
|
106
|
+
return "unknown", "hours"
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _build_file_path_note(entry: dict[str, object]) -> str:
|
|
110
|
+
"""Build the system note for a file path entry.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
entry: Normalized file metadata dict.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
System note string describing the file path accessibility.
|
|
117
|
+
"""
|
|
118
|
+
path = str(entry["path"])
|
|
119
|
+
is_accessible = os.path.isfile(path) and os.access(path, os.R_OK)
|
|
120
|
+
if is_accessible:
|
|
121
|
+
filename_value = entry.get("filename")
|
|
122
|
+
filename = filename_value if isinstance(filename_value, str) and filename_value else os.path.basename(path)
|
|
123
|
+
return FILE_PATH_SYSTEM_NOTE.format(filename=filename, path=path)
|
|
124
|
+
|
|
125
|
+
logger.warning(f"File path is not accessible: {path}")
|
|
126
|
+
return FILE_PATH_INACCESSIBLE_NOTE.format(path=path)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _build_file_url_note(entry: dict[str, object]) -> str:
|
|
130
|
+
"""Build the system note for a file URL entry.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
entry: Normalized file metadata dict.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
System note string describing the URL, or an empty string if no URL exists.
|
|
137
|
+
"""
|
|
138
|
+
url = entry.get("s3_url")
|
|
139
|
+
if not isinstance(url, str) or not url:
|
|
140
|
+
return ""
|
|
141
|
+
|
|
142
|
+
expires_value, hour_unit = _format_expiration_hours(entry.get("expires_in_hours"))
|
|
143
|
+
return FILE_URL_SYSTEM_NOTE.format(
|
|
144
|
+
url=url,
|
|
145
|
+
expires_in=expires_value,
|
|
146
|
+
hour_unit=hour_unit,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def augment_query_with_file_paths(query: str, files: list[str | dict[str, object]]) -> str:
|
|
151
|
+
"""Augment query with file path system notes.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
query: The original user query string.
|
|
155
|
+
files: List of local filesystem paths or file metadata dicts to include.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
The query with system notes appended for each file path.
|
|
159
|
+
|
|
160
|
+
Raises:
|
|
161
|
+
ValueError: If files is not a list of strings or metadata dicts.
|
|
162
|
+
"""
|
|
163
|
+
if not isinstance(files, list):
|
|
164
|
+
raise ValueError("files must be a list of strings or dicts")
|
|
165
|
+
|
|
166
|
+
deduped_entries = _dedupe_file_entries(files)
|
|
167
|
+
|
|
168
|
+
if not deduped_entries:
|
|
169
|
+
return query
|
|
170
|
+
|
|
171
|
+
augmented_query = query
|
|
172
|
+
for entry in deduped_entries:
|
|
173
|
+
augmented_query += _build_file_path_note(entry)
|
|
174
|
+
augmented_query += _build_file_url_note(entry)
|
|
175
|
+
|
|
176
|
+
return augmented_query
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
+
|
|
4
|
+
logger: Incomplete
|
|
5
|
+
FILE_PATH_SYSTEM_NOTE: str
|
|
6
|
+
FILE_PATH_INACCESSIBLE_NOTE: str
|
|
7
|
+
FILE_URL_SYSTEM_NOTE: str
|
|
8
|
+
|
|
9
|
+
def augment_query_with_file_paths(query: str, files: list[str | dict[str, object]]) -> str:
|
|
10
|
+
"""Augment query with file path system notes.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
query: The original user query string.
|
|
14
|
+
files: List of local filesystem paths or file metadata dicts to include.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
The query with system notes appended for each file path.
|
|
18
|
+
|
|
19
|
+
Raises:
|
|
20
|
+
ValueError: If files is not a list of strings or metadata dicts.
|
|
21
|
+
"""
|