aip-agents-binary 0.5.25b1__py3-none-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aip_agents/__init__.py +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +2948 -0
- aip_agents/agent/base_langgraph_agent.pyi +232 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
- aip_agents/agent/langgraph_react_agent.py +2596 -0
- aip_agents/agent/langgraph_react_agent.pyi +131 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/demo_memory_recall.py +401 -0
- aip_agents/examples/demo_memory_recall.pyi +58 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +46 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +193 -0
- aip_agents/mcp/client/connection_manager.pyi +48 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +362 -0
- aip_agents/mcp/client/persistent_session.pyi +113 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +228 -0
- aip_agents/mcp/client/transports.pyi +123 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +717 -0
- aip_agents/memory/adapters/base_adapter.pyi +150 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +53 -0
- aip_agents/tools/__init__.pyi +9 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +813 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.py +22 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +258 -0
- aip_agents/tools/memory_search/mem0.pyi +19 -0
- aip_agents/tools/memory_search/schema.py +48 -0
- aip_agents/tools/memory_search/schema.pyi +15 -0
- aip_agents/tools/memory_search_tool.py +26 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +967 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.5.25b1.dist-info/METADATA +681 -0
- aip_agents_binary-0.5.25b1.dist-info/RECORD +566 -0
- aip_agents_binary-0.5.25b1.dist-info/WHEEL +5 -0
- aip_agents_binary-0.5.25b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.schema.hitl import ApprovalDecisionType as ApprovalDecisionType, HitlMetadata as HitlMetadata
|
|
3
|
+
from aip_agents.utils.formatter_llm_client import FormatterInvocationError as FormatterInvocationError, FormatterInvokerUnavailableError as FormatterInvokerUnavailableError, get_formatter_llm_client as get_formatter_llm_client
|
|
4
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
5
|
+
from aip_agents.utils.metadata.activity_narrative.constants import DELEGATE_PREFIX as DELEGATE_PREFIX, HITL_DECISION_MESSAGES as HITL_DECISION_MESSAGES, HITL_PENDING_DESCRIPTION as HITL_PENDING_DESCRIPTION, HITL_PENDING_TITLE as HITL_PENDING_TITLE, OUTPUT_EXCERPT_MAX_CHARS as OUTPUT_EXCERPT_MAX_CHARS, SYSTEM_PROMPT as SYSTEM_PROMPT
|
|
6
|
+
from aip_agents.utils.metadata.activity_narrative.context import ActivityContext as ActivityContext, ActivityPhase as ActivityPhase
|
|
7
|
+
from aip_agents.utils.metadata.activity_narrative.formatters import ArgsFormatter as ArgsFormatter, OutputFormatter as OutputFormatter, SensitiveInfoFilter as SensitiveInfoFilter
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
logger: Incomplete
|
|
11
|
+
|
|
12
|
+
class ActivityNarrativeBuilder:
|
|
13
|
+
"""Generate structured activity payloads via formatter LLM.
|
|
14
|
+
|
|
15
|
+
High-level flow:
|
|
16
|
+
1. Gather raw metadata about a tool/delegate event and normalize it into an ``ActivityContext``.
|
|
17
|
+
2. Sanitize arguments and outputs so no sensitive values reach downstream renderers or the formatter model.
|
|
18
|
+
3. Prompt the shared formatter with phase-specific instructions (e.g., describe intent on start, summarize results on end).
|
|
19
|
+
4. If the formatter responds with usable heading/body text, surface it; otherwise fall back to deterministic templates
|
|
20
|
+
built from the sanitized context.
|
|
21
|
+
|
|
22
|
+
This approach keeps SSE activity cards readable when the formatter is healthy while still providing sensible copy when
|
|
23
|
+
the formatter is unavailable or returns low-quality text.
|
|
24
|
+
"""
|
|
25
|
+
def __init__(self) -> None:
|
|
26
|
+
"""Initialize the activity narrative builder."""
|
|
27
|
+
def build_payload(self, metadata: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
28
|
+
"""Build enriched payload for the provided metadata.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
metadata: The metadata dictionary containing tool_info, hitl, and other context.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Dictionary payload with a rendered message, or None when not available.
|
|
35
|
+
"""
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Shared constants for activity narrative generation.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from aip_agents.schema.hitl import ApprovalDecisionType
|
|
10
|
+
|
|
11
|
+
SYSTEM_PROMPT = """You summarize agent activity for operator dashboards.
|
|
12
|
+
- Describe what happened in short, factual sentences that highlight the most relevant arguments or outputs.
|
|
13
|
+
- Do not mention execution time, latency, token counts, or other operational metrics.
|
|
14
|
+
- Never mention internal IDs, UUIDs, or opaque agent identifiers. Prefer tool/delegate display names.
|
|
15
|
+
- Mention errors only when an actual error is present; never say that no errors occurred.
|
|
16
|
+
- Summaries should avoid quoting raw JSON unless necessary."""
|
|
17
|
+
|
|
18
|
+
DELEGATE_PREFIX = "delegate_to_"
|
|
19
|
+
OUTPUT_EXCERPT_MAX_CHARS = 512 # no specific reason, just a guess
|
|
20
|
+
|
|
21
|
+
HITL_PENDING_TITLE = "**Awaiting Review**"
|
|
22
|
+
HITL_PENDING_DESCRIPTION = (
|
|
23
|
+
"This action requires human verification. The agent is paused until a reviewer approves or rejects the request."
|
|
24
|
+
)
|
|
25
|
+
HITL_DECISION_MESSAGES: dict[ApprovalDecisionType, tuple[str, str]] = {
|
|
26
|
+
ApprovalDecisionType.APPROVED: (
|
|
27
|
+
"**Request Approved**",
|
|
28
|
+
"The reviewer approved this action. Execution will continue as planned.",
|
|
29
|
+
),
|
|
30
|
+
ApprovalDecisionType.REJECTED: (
|
|
31
|
+
"**Request Rejected**",
|
|
32
|
+
"The reviewer rejected this action. The workflow moves to the next applicable step.",
|
|
33
|
+
),
|
|
34
|
+
ApprovalDecisionType.SKIPPED: (
|
|
35
|
+
"**Request Skipped**",
|
|
36
|
+
"The reviewer skipped this action. Execution proceeds without performing it.",
|
|
37
|
+
),
|
|
38
|
+
ApprovalDecisionType.TIMEOUT_SKIP: (
|
|
39
|
+
"**Request Timed Out**",
|
|
40
|
+
"No decision arrived before the timeout so the request was skipped automatically.",
|
|
41
|
+
),
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
__all__ = [
|
|
45
|
+
"SYSTEM_PROMPT",
|
|
46
|
+
"DELEGATE_PREFIX",
|
|
47
|
+
"OUTPUT_EXCERPT_MAX_CHARS",
|
|
48
|
+
"HITL_PENDING_TITLE",
|
|
49
|
+
"HITL_PENDING_DESCRIPTION",
|
|
50
|
+
"HITL_DECISION_MESSAGES",
|
|
51
|
+
]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from aip_agents.schema.hitl import ApprovalDecisionType
|
|
2
|
+
|
|
3
|
+
__all__ = ['SYSTEM_PROMPT', 'DELEGATE_PREFIX', 'OUTPUT_EXCERPT_MAX_CHARS', 'HITL_PENDING_TITLE', 'HITL_PENDING_DESCRIPTION', 'HITL_DECISION_MESSAGES']
|
|
4
|
+
|
|
5
|
+
SYSTEM_PROMPT: str
|
|
6
|
+
DELEGATE_PREFIX: str
|
|
7
|
+
OUTPUT_EXCERPT_MAX_CHARS: int
|
|
8
|
+
HITL_PENDING_TITLE: str
|
|
9
|
+
HITL_PENDING_DESCRIPTION: str
|
|
10
|
+
HITL_DECISION_MESSAGES: dict[ApprovalDecisionType, tuple[str, str]]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Context objects describing activity-builder inputs.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from enum import StrEnum
|
|
11
|
+
|
|
12
|
+
from aip_agents.schema.hitl import ApprovalDecisionType, HitlMetadata
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ActivityPhase(StrEnum):
|
|
16
|
+
"""Lifecycle phases for tool, delegate, and HITL events."""
|
|
17
|
+
|
|
18
|
+
TOOL_START = "tool_start"
|
|
19
|
+
TOOL_END = "tool_end"
|
|
20
|
+
DELEGATE_START = "delegate_start"
|
|
21
|
+
DELEGATE_END = "delegate_end"
|
|
22
|
+
HITL_PENDING = "hitl_pending"
|
|
23
|
+
HITL_RESOLVED = "hitl_resolved"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
JSONScalar = str | int | float | bool | None
|
|
27
|
+
JSONValue = JSONScalar | dict[str, "JSONValue"] | list["JSONValue"]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class ActivityContext:
|
|
32
|
+
"""Structured representation of an activity event."""
|
|
33
|
+
|
|
34
|
+
phase: ActivityPhase
|
|
35
|
+
agent_name: str | None
|
|
36
|
+
subject_name: str | None
|
|
37
|
+
sanitized_args: dict[str, JSONValue] | None
|
|
38
|
+
sanitized_output: JSONValue | None
|
|
39
|
+
arguments_excerpt: str | None
|
|
40
|
+
output_excerpt: str | None
|
|
41
|
+
error_excerpt: str | None
|
|
42
|
+
step_id: str | None = None
|
|
43
|
+
is_delegate: bool = False
|
|
44
|
+
hitl_metadata: HitlMetadata | None = None
|
|
45
|
+
hitl_decision: ApprovalDecisionType | None = None
|
|
46
|
+
default_heading: str | None = None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
__all__ = ["ActivityContext", "ActivityPhase"]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from aip_agents.schema.hitl import ApprovalDecisionType, HitlMetadata
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from enum import StrEnum
|
|
4
|
+
|
|
5
|
+
__all__ = ['ActivityContext', 'ActivityPhase']
|
|
6
|
+
|
|
7
|
+
class ActivityPhase(StrEnum):
|
|
8
|
+
"""Lifecycle phases for tool, delegate, and HITL events."""
|
|
9
|
+
TOOL_START: str
|
|
10
|
+
TOOL_END: str
|
|
11
|
+
DELEGATE_START: str
|
|
12
|
+
DELEGATE_END: str
|
|
13
|
+
HITL_PENDING: str
|
|
14
|
+
HITL_RESOLVED: str
|
|
15
|
+
JSONScalar = str | int | float | bool | None
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class ActivityContext:
|
|
19
|
+
"""Structured representation of an activity event."""
|
|
20
|
+
phase: ActivityPhase
|
|
21
|
+
agent_name: str | None
|
|
22
|
+
subject_name: str | None
|
|
23
|
+
sanitized_args: dict[str, JSONValue] | None
|
|
24
|
+
sanitized_output: JSONValue | None
|
|
25
|
+
arguments_excerpt: str | None
|
|
26
|
+
output_excerpt: str | None
|
|
27
|
+
error_excerpt: str | None
|
|
28
|
+
step_id: str | None = ...
|
|
29
|
+
is_delegate: bool = ...
|
|
30
|
+
hitl_metadata: HitlMetadata | None = ...
|
|
31
|
+
hitl_decision: ApprovalDecisionType | None = ...
|
|
32
|
+
default_heading: str | None = ...
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"""Formatting and sanitization helpers for activity narratives.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import re
|
|
11
|
+
from collections.abc import Callable
|
|
12
|
+
|
|
13
|
+
from aip_agents.utils.logger import get_logger
|
|
14
|
+
from aip_agents.utils.metadata.activity_narrative.constants import OUTPUT_EXCERPT_MAX_CHARS
|
|
15
|
+
|
|
16
|
+
logger = get_logger(__name__)
|
|
17
|
+
|
|
18
|
+
JSONScalar = str | int | float | bool | None
|
|
19
|
+
JSONValue = JSONScalar | dict[str, "JSONValue"] | list["JSONValue"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SensitiveInfoFilter:
|
|
23
|
+
"""Redact sensitive argument/output values before rendering or sending to LLMs."""
|
|
24
|
+
|
|
25
|
+
REDACTED = "<redacted>"
|
|
26
|
+
SENSITIVE_KEY_PATTERNS = (
|
|
27
|
+
"token",
|
|
28
|
+
"secret",
|
|
29
|
+
"password",
|
|
30
|
+
"api_key",
|
|
31
|
+
"apikey",
|
|
32
|
+
"credential",
|
|
33
|
+
"auth",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def __init__(self) -> None:
|
|
37
|
+
"""Initialize the sensitive info filter."""
|
|
38
|
+
self._logger = logger
|
|
39
|
+
|
|
40
|
+
def sanitize(
|
|
41
|
+
self,
|
|
42
|
+
args: dict[str, JSONValue] | None,
|
|
43
|
+
output: JSONValue | None,
|
|
44
|
+
tool_sanitizer: Callable[[dict[str, JSONValue] | None, JSONValue | None], dict[str, JSONValue]] | None = None,
|
|
45
|
+
) -> tuple[dict[str, JSONValue] | None, JSONValue | None]:
|
|
46
|
+
"""Return sanitized arguments/output with optional tool overrides.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
args: Raw arguments dictionary emitted by the tool.
|
|
50
|
+
output: Raw tool output which may be nested JSON.
|
|
51
|
+
tool_sanitizer: Optional callable that can override sanitized values.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
tuple: Sanitized args and output payloads.
|
|
55
|
+
"""
|
|
56
|
+
sanitized_args = self._sanitize_structure(args)
|
|
57
|
+
sanitized_output = self._sanitize_structure(output)
|
|
58
|
+
|
|
59
|
+
if callable(tool_sanitizer):
|
|
60
|
+
try:
|
|
61
|
+
replacement = tool_sanitizer(args, output) or {}
|
|
62
|
+
if isinstance(replacement, dict):
|
|
63
|
+
if "args" in replacement:
|
|
64
|
+
sanitized_args = replacement.get("args")
|
|
65
|
+
if "output" in replacement:
|
|
66
|
+
sanitized_output = replacement.get("output")
|
|
67
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
68
|
+
self._logger.warning("activity sanitizer hook failed: %s", exc)
|
|
69
|
+
|
|
70
|
+
return sanitized_args, sanitized_output
|
|
71
|
+
|
|
72
|
+
def _sanitize_structure(self, value: JSONValue) -> JSONValue:
|
|
73
|
+
"""Recursively sanitize nested structures by redacting sensitive data.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
value: Arbitrary nested JSON-esque payload.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
JSONValue: Sanitized structure with sensitive values redacted.
|
|
80
|
+
"""
|
|
81
|
+
if value is None:
|
|
82
|
+
return None
|
|
83
|
+
if isinstance(value, dict):
|
|
84
|
+
sanitized: dict[str, JSONValue] = {}
|
|
85
|
+
for key, val in value.items():
|
|
86
|
+
sanitized[key] = self.REDACTED if self._is_sensitive_key(key) else self._sanitize_structure(val)
|
|
87
|
+
return sanitized
|
|
88
|
+
if isinstance(value, list):
|
|
89
|
+
return [self._sanitize_structure(item) for item in value]
|
|
90
|
+
if isinstance(value, str):
|
|
91
|
+
return self._sanitize_string(value)
|
|
92
|
+
return value
|
|
93
|
+
|
|
94
|
+
def _sanitize_string(self, value: str) -> str:
|
|
95
|
+
"""Sanitize a string value by checking if it looks like a secret.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
value: Raw string to inspect.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
str: Either the original trimmed string or ``<redacted>``.
|
|
102
|
+
"""
|
|
103
|
+
stripped = value.strip()
|
|
104
|
+
if self._looks_like_secret(stripped):
|
|
105
|
+
return self.REDACTED
|
|
106
|
+
return stripped
|
|
107
|
+
|
|
108
|
+
def _is_sensitive_key(self, key: str) -> bool:
|
|
109
|
+
"""Check if a key name indicates sensitive data.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
key: Key name from the argument/output structure.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
bool: True when the key hints at credentials or tokens.
|
|
116
|
+
"""
|
|
117
|
+
lowered = key.lower()
|
|
118
|
+
return any(pattern in lowered for pattern in self.SENSITIVE_KEY_PATTERNS)
|
|
119
|
+
|
|
120
|
+
def _looks_like_secret(self, value: str) -> bool:
|
|
121
|
+
"""Check if a string value looks like a secret or API key.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
value: Text candidate to evaluate.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
bool: True when the string matches secret heuristics.
|
|
128
|
+
"""
|
|
129
|
+
if not value:
|
|
130
|
+
return False
|
|
131
|
+
if value.startswith("sk-") or value.startswith("rk-"):
|
|
132
|
+
return True
|
|
133
|
+
if len(value) >= 64 and re.fullmatch(r"[A-Za-z0-9+/=_-]+", value):
|
|
134
|
+
return True
|
|
135
|
+
return False
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class ArgsFormatter:
|
|
139
|
+
"""Simple formatter that surfaces at most two argument key/value pairs."""
|
|
140
|
+
|
|
141
|
+
def format(self, args: dict[str, JSONValue] | None) -> str | None:
|
|
142
|
+
"""Format tool arguments into a short excerpt.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
args: Tool arguments dictionary.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
str | None: Concise representation of up to two key/value pairs.
|
|
149
|
+
"""
|
|
150
|
+
if not args:
|
|
151
|
+
return None
|
|
152
|
+
parts: list[str] = []
|
|
153
|
+
for key in sorted(args.keys()):
|
|
154
|
+
if len(parts) >= 2:
|
|
155
|
+
break
|
|
156
|
+
value = self._stringify(args[key])
|
|
157
|
+
if value:
|
|
158
|
+
parts.append(f"{key}: {value}")
|
|
159
|
+
return "; ".join(parts) if parts else None
|
|
160
|
+
|
|
161
|
+
def _stringify(self, value: JSONValue) -> str | None:
|
|
162
|
+
"""Convert a value to a string representation.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
value: Value lifted from the arguments dictionary.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
str | None: Stringified value truncated when overly long.
|
|
169
|
+
"""
|
|
170
|
+
if value is None:
|
|
171
|
+
return None
|
|
172
|
+
if isinstance(value, str):
|
|
173
|
+
value = value.strip()
|
|
174
|
+
return value or None
|
|
175
|
+
try:
|
|
176
|
+
text = json.dumps(value, ensure_ascii=False)
|
|
177
|
+
except Exception:
|
|
178
|
+
text = str(value)
|
|
179
|
+
text = text.strip()
|
|
180
|
+
if not text:
|
|
181
|
+
return None
|
|
182
|
+
if len(text) > 200:
|
|
183
|
+
return text[:199].rstrip() + "…"
|
|
184
|
+
return text
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class OutputFormatter:
|
|
188
|
+
"""Lightweight formatter that truncates serialized output."""
|
|
189
|
+
|
|
190
|
+
def format(self, output: JSONValue | None) -> str | None:
|
|
191
|
+
"""Format tool output into a readable excerpt.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
output: Raw tool output.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
str | None: Truncated representation suitable for logs.
|
|
198
|
+
"""
|
|
199
|
+
if output is None:
|
|
200
|
+
return None
|
|
201
|
+
if isinstance(output, str):
|
|
202
|
+
text = output.strip()
|
|
203
|
+
if not text:
|
|
204
|
+
return None
|
|
205
|
+
return self._truncate(text)
|
|
206
|
+
try:
|
|
207
|
+
text = json.dumps(output, ensure_ascii=False)
|
|
208
|
+
except Exception:
|
|
209
|
+
text = str(output)
|
|
210
|
+
text = text.strip()
|
|
211
|
+
if not text:
|
|
212
|
+
return None
|
|
213
|
+
return self._truncate(text)
|
|
214
|
+
|
|
215
|
+
def _truncate(self, text: str, limit: int = OUTPUT_EXCERPT_MAX_CHARS) -> str:
|
|
216
|
+
"""Truncate text to a maximum length with ellipsis.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
text: Text value to truncate.
|
|
220
|
+
limit: Maximum permitted character count.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
str: Text clipped to the configured limit.
|
|
224
|
+
"""
|
|
225
|
+
if len(text) <= limit:
|
|
226
|
+
return text
|
|
227
|
+
return text[: limit - 1].rstrip() + "…"
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
__all__ = ["ArgsFormatter", "OutputFormatter", "SensitiveInfoFilter"]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from collections.abc import Callable
|
|
3
|
+
|
|
4
|
+
__all__ = ['ArgsFormatter', 'OutputFormatter', 'SensitiveInfoFilter']
|
|
5
|
+
|
|
6
|
+
JSONScalar = str | int | float | bool | None
|
|
7
|
+
|
|
8
|
+
class SensitiveInfoFilter:
|
|
9
|
+
"""Redact sensitive argument/output values before rendering or sending to LLMs."""
|
|
10
|
+
REDACTED: str
|
|
11
|
+
SENSITIVE_KEY_PATTERNS: Incomplete
|
|
12
|
+
def __init__(self) -> None:
|
|
13
|
+
"""Initialize the sensitive info filter."""
|
|
14
|
+
def sanitize(self, args: dict[str, JSONValue] | None, output: JSONValue | None, tool_sanitizer: Callable[[dict[str, JSONValue] | None, JSONValue | None], dict[str, JSONValue]] | None = None) -> tuple[dict[str, JSONValue] | None, JSONValue | None]:
|
|
15
|
+
"""Return sanitized arguments/output with optional tool overrides.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
args: Raw arguments dictionary emitted by the tool.
|
|
19
|
+
output: Raw tool output which may be nested JSON.
|
|
20
|
+
tool_sanitizer: Optional callable that can override sanitized values.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
tuple: Sanitized args and output payloads.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
class ArgsFormatter:
|
|
27
|
+
"""Simple formatter that surfaces at most two argument key/value pairs."""
|
|
28
|
+
def format(self, args: dict[str, JSONValue] | None) -> str | None:
|
|
29
|
+
"""Format tool arguments into a short excerpt.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
args: Tool arguments dictionary.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
str | None: Concise representation of up to two key/value pairs.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
class OutputFormatter:
|
|
39
|
+
"""Lightweight formatter that truncates serialized output."""
|
|
40
|
+
def format(self, output: JSONValue | None) -> str | None:
|
|
41
|
+
"""Format tool output into a readable excerpt.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
output: Raw tool output.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
str | None: Truncated representation suitable for logs.
|
|
48
|
+
"""
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Helper utilities used across the activity narrative package.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import re
|
|
10
|
+
|
|
11
|
+
from aip_agents.utils.metadata.activity_narrative.constants import DELEGATE_PREFIX
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _format_tool_or_subagent_name(name: str, remove_delegate_prefix: bool = False) -> str:
|
|
15
|
+
"""Format tool/agent names to 'Camel Case' consistently.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
name: Raw tool or sub-agent identifier.
|
|
19
|
+
remove_delegate_prefix: Whether to strip the ``delegate::`` prefix before formatting.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
str: Display-friendly tool or agent name.
|
|
23
|
+
"""
|
|
24
|
+
clean_name = name.replace(DELEGATE_PREFIX, "") if remove_delegate_prefix else name
|
|
25
|
+
s = clean_name.replace("_", " ")
|
|
26
|
+
|
|
27
|
+
if s == s.lower():
|
|
28
|
+
return " ".join(w.capitalize() for w in s.split())
|
|
29
|
+
|
|
30
|
+
s = re.sub(r"(?<=[a-z0-9])(?=[A-Z])", " ", s)
|
|
31
|
+
s = re.sub(r"(?<=[A-Z])(?=[A-Z][a-z])", " ", s)
|
|
32
|
+
return " ".join(word if word.isupper() else (word[:1].upper() + word[1:].lower()) for word in s.split())
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
__all__ = ["_format_tool_or_subagent_name"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
__all__ = ['_format_tool_or_subagent_name']
|
|
2
|
+
|
|
3
|
+
def _format_tool_or_subagent_name(name: str, remove_delegate_prefix: bool = False) -> str:
|
|
4
|
+
"""Format tool/agent names to 'Camel Case' consistently.
|
|
5
|
+
|
|
6
|
+
Args:
|
|
7
|
+
name: Raw tool or sub-agent identifier.
|
|
8
|
+
remove_delegate_prefix: Whether to strip the ``delegate::`` prefix before formatting.
|
|
9
|
+
|
|
10
|
+
Returns:
|
|
11
|
+
str: Display-friendly tool or agent name.
|
|
12
|
+
"""
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Metadata schemas module.
|
|
2
|
+
|
|
3
|
+
This module contains Pydantic schemas for metadata objects.
|
|
4
|
+
|
|
5
|
+
Authors:
|
|
6
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from aip_agents.utils.metadata.schemas.activity_schema import Activity, ActivityDataType
|
|
10
|
+
from aip_agents.utils.metadata.schemas.thinking_schema import Thinking
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"Activity",
|
|
14
|
+
"ActivityDataType",
|
|
15
|
+
"Thinking",
|
|
16
|
+
]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Pydantic schemas for activity metadata.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import StrEnum
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ActivityDataType(StrEnum):
|
|
13
|
+
"""Enumeration of activity data types."""
|
|
14
|
+
|
|
15
|
+
ACTIVITY = "activity"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Activity(BaseModel):
|
|
19
|
+
"""Schema for activity info payload.
|
|
20
|
+
|
|
21
|
+
Fields:
|
|
22
|
+
- data_type: always "activity"
|
|
23
|
+
- id: UUID string identifying this activity event
|
|
24
|
+
- data_value: JSON string with additional info (e.g., {"message": "..."})
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
data_type: ActivityDataType = Field(default=ActivityDataType.ACTIVITY)
|
|
28
|
+
id: str
|
|
29
|
+
data_value: str
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
|
|
4
|
+
class ActivityDataType(StrEnum):
|
|
5
|
+
"""Enumeration of activity data types."""
|
|
6
|
+
ACTIVITY: str
|
|
7
|
+
|
|
8
|
+
class Activity(BaseModel):
|
|
9
|
+
'''Schema for activity info payload.
|
|
10
|
+
|
|
11
|
+
Fields:
|
|
12
|
+
- data_type: always "activity"
|
|
13
|
+
- id: UUID string identifying this activity event
|
|
14
|
+
- data_value: JSON string with additional info (e.g., {"message": "..."})
|
|
15
|
+
'''
|
|
16
|
+
data_type: ActivityDataType
|
|
17
|
+
id: str
|
|
18
|
+
data_value: str
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Pydantic schemas for thinking metadata.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import StrEnum
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ThinkingDataType(StrEnum):
|
|
13
|
+
"""Enum for thinking data types."""
|
|
14
|
+
|
|
15
|
+
THINKING = "thinking"
|
|
16
|
+
THINKING_START = "thinking_start"
|
|
17
|
+
THINKING_END = "thinking_end"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Thinking(BaseModel):
|
|
21
|
+
"""Schema for thinking info payload.
|
|
22
|
+
|
|
23
|
+
Fields:
|
|
24
|
+
- data_type: type of thinking event
|
|
25
|
+
- id: UUID string identifying this thinking event
|
|
26
|
+
- data_value: JSON string with additional info (e.g., {"message": "..."})
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
data_type: ThinkingDataType = Field(default=ThinkingDataType.THINKING)
|
|
30
|
+
id: str
|
|
31
|
+
data_value: str
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
|
|
4
|
+
class ThinkingDataType(StrEnum):
|
|
5
|
+
"""Enum for thinking data types."""
|
|
6
|
+
THINKING: str
|
|
7
|
+
THINKING_START: str
|
|
8
|
+
THINKING_END: str
|
|
9
|
+
|
|
10
|
+
class Thinking(BaseModel):
|
|
11
|
+
'''Schema for thinking info payload.
|
|
12
|
+
|
|
13
|
+
Fields:
|
|
14
|
+
- data_type: type of thinking event
|
|
15
|
+
- id: UUID string identifying this thinking event
|
|
16
|
+
- data_value: JSON string with additional info (e.g., {"message": "..."})
|
|
17
|
+
'''
|
|
18
|
+
data_type: ThinkingDataType
|
|
19
|
+
id: str
|
|
20
|
+
data_value: str
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Thinking metadata helper utilities.
|
|
2
|
+
|
|
3
|
+
Provides helpers to build thinking messages.
|
|
4
|
+
|
|
5
|
+
Authors:
|
|
6
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from aip_agents.utils.metadata.schemas.thinking_schema import Thinking, ThinkingDataType
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _create_thinking_info(
|
|
13
|
+
message: str,
|
|
14
|
+
top_level_id: str = "default_thinking_id",
|
|
15
|
+
data_type: ThinkingDataType = "thinking",
|
|
16
|
+
) -> dict[str, str]:
|
|
17
|
+
r"""Create thinking info payload with a customizable ID, data_type, and message.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
message: The message content for the thinking info.
|
|
21
|
+
top_level_id: The ID for the thinking info. Defaults to "default_thinking_id".
|
|
22
|
+
data_type: The type of the data. Defaults to "thinking".
|
|
23
|
+
|
|
24
|
+
Returns a dict with top-level id and data_value as JSON string:
|
|
25
|
+
{
|
|
26
|
+
"data_type": "thinking",
|
|
27
|
+
"id": "<id>",
|
|
28
|
+
"data_value": "**title**\n\n..."
|
|
29
|
+
}
|
|
30
|
+
"""
|
|
31
|
+
thinking = Thinking(data_type=data_type, id=top_level_id, data_value=message)
|
|
32
|
+
return thinking.model_dump()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# Exported default/terminal thinking info
|
|
36
|
+
FINAL_THINKING_INFO = _create_thinking_info(
|
|
37
|
+
"**All process has finished**\n\nThe tasks have been finished.", "default_thinking_id"
|
|
38
|
+
)
|