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,200 @@
|
|
|
1
|
+
"""Abstract base class for long-term memory search tools.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
from abc import ABC, abstractmethod
|
|
11
|
+
from collections.abc import Callable
|
|
12
|
+
from typing import Any, ClassVar, Protocol, runtime_checkable
|
|
13
|
+
|
|
14
|
+
from langchain_core.runnables import RunnableConfig
|
|
15
|
+
from langchain_core.tools import BaseTool
|
|
16
|
+
from pydantic import BaseModel
|
|
17
|
+
|
|
18
|
+
from aip_agents.memory.constants import MemoryDefaults
|
|
19
|
+
from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput, MemoryConfig
|
|
20
|
+
from aip_agents.utils.logger import get_logger
|
|
21
|
+
|
|
22
|
+
logger = get_logger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@runtime_checkable
|
|
26
|
+
class LongTermMemoryBackend(Protocol):
|
|
27
|
+
"""Protocol for memory adapters that support retrieval and formatting."""
|
|
28
|
+
|
|
29
|
+
def retrieve(
|
|
30
|
+
self,
|
|
31
|
+
*,
|
|
32
|
+
query: str | None,
|
|
33
|
+
user_id: str,
|
|
34
|
+
limit: int | None = None,
|
|
35
|
+
filters: dict[str, Any] | None = None,
|
|
36
|
+
page: int | None = None,
|
|
37
|
+
) -> list[dict[str, Any]]:
|
|
38
|
+
"""Retrieve memories matching the given query and filters.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
query: Optional search query string.
|
|
42
|
+
user_id: User identifier for scoped retrieval.
|
|
43
|
+
limit: Maximum number of results to return.
|
|
44
|
+
filters: Optional filters to apply to the retrieval.
|
|
45
|
+
page: Page number for pagination.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
List of memory hit dictionaries.
|
|
49
|
+
"""
|
|
50
|
+
...
|
|
51
|
+
|
|
52
|
+
def format_hits(
|
|
53
|
+
self,
|
|
54
|
+
hits: list[dict[str, Any]],
|
|
55
|
+
max_items: int = MemoryDefaults.MAX_ITEMS,
|
|
56
|
+
with_tag: bool = True,
|
|
57
|
+
) -> str:
|
|
58
|
+
"""Format memory hits into a readable string.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
hits: List of memory hit dictionaries to format.
|
|
62
|
+
max_items: Maximum number of hits to include in output.
|
|
63
|
+
with_tag: Whether to wrap output with memory tags.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Formatted string representation of memory hits.
|
|
67
|
+
"""
|
|
68
|
+
...
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class LongTermMemorySearchTool(BaseTool, ABC):
|
|
72
|
+
"""Abstract base class for provider-specific long-term memory search tools."""
|
|
73
|
+
|
|
74
|
+
name: str = "long_term_memory_search"
|
|
75
|
+
description: str = "Abstract interface for tools that retrieve long-term memories."
|
|
76
|
+
args_schema: type[LongTermMemorySearchInput] = LongTermMemorySearchInput
|
|
77
|
+
tool_config_schema: type[BaseModel] = MemoryConfig
|
|
78
|
+
memory: LongTermMemoryBackend
|
|
79
|
+
default_user_id: str | None = None
|
|
80
|
+
user_id_provider: Callable[[], str | None] | None = None
|
|
81
|
+
MINIMUM_MEMORY_RETRIEVAL: ClassVar[int] = 5
|
|
82
|
+
LOG_PREFIX: ClassVar[str] = "LongTermMemorySearchTool"
|
|
83
|
+
|
|
84
|
+
def __init__(
|
|
85
|
+
self,
|
|
86
|
+
memory: LongTermMemoryBackend,
|
|
87
|
+
*,
|
|
88
|
+
default_user_id: str | None = None,
|
|
89
|
+
user_id_provider: Callable[[], str | None] | None = None,
|
|
90
|
+
**kwargs: Any,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Initialize the long-term memory search tool.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
memory: Memory adapter instance with retrieve() and format_hits() methods.
|
|
96
|
+
default_user_id: Default user ID to use if not provided in metadata.
|
|
97
|
+
user_id_provider: Callable that returns a user ID.
|
|
98
|
+
**kwargs: Additional keyword arguments passed to the parent class.
|
|
99
|
+
"""
|
|
100
|
+
required_attributes = {"retrieve", "format_hits"}
|
|
101
|
+
if not all(hasattr(memory, attr) for attr in required_attributes):
|
|
102
|
+
raise ValueError(
|
|
103
|
+
"LongTermMemorySearchTool requires a memory instance that implements retrieve() and format_hits()."
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
super().__init__(
|
|
107
|
+
memory=memory,
|
|
108
|
+
default_user_id=default_user_id,
|
|
109
|
+
user_id_provider=user_id_provider,
|
|
110
|
+
**kwargs,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
@abstractmethod
|
|
114
|
+
async def _arun(
|
|
115
|
+
self,
|
|
116
|
+
query: str | None = None,
|
|
117
|
+
config: RunnableConfig | None = None,
|
|
118
|
+
run_manager: Any | None = None,
|
|
119
|
+
**kwargs: Any,
|
|
120
|
+
) -> str:
|
|
121
|
+
"""Execute provider-specific retrieval logic.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
query: Optional search query string.
|
|
125
|
+
config: Runnable configuration for the execution.
|
|
126
|
+
run_manager: Optional run manager for execution tracking.
|
|
127
|
+
**kwargs: Additional keyword arguments.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Formatted string of retrieved memories.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
def _run(
|
|
134
|
+
self,
|
|
135
|
+
query: str | None = None,
|
|
136
|
+
config: RunnableConfig | None = None,
|
|
137
|
+
run_manager: Any | None = None,
|
|
138
|
+
**kwargs: Any,
|
|
139
|
+
) -> str:
|
|
140
|
+
"""Synchronous wrapper that delegates to `_arun` using `asyncio.run`.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
query: Optional search query string.
|
|
144
|
+
config: Runnable configuration for the execution.
|
|
145
|
+
run_manager: Optional run manager for execution tracking.
|
|
146
|
+
**kwargs: Additional keyword arguments.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Formatted string of retrieved memories.
|
|
150
|
+
"""
|
|
151
|
+
return asyncio.run(self._arun(query=query, config=config, run_manager=run_manager, **kwargs))
|
|
152
|
+
|
|
153
|
+
def _resolve_user_id(self, metadata: dict[str, Any] | None, config: RunnableConfig | None = None) -> str:
|
|
154
|
+
"""Resolve the user ID for memory operations in a provider-agnostic way.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
metadata: Optional metadata dictionary that may contain user_id.
|
|
158
|
+
config: Optional runnable configuration for tool context.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
The resolved user ID string.
|
|
162
|
+
"""
|
|
163
|
+
user_id: str | None = None
|
|
164
|
+
|
|
165
|
+
if isinstance(metadata, dict):
|
|
166
|
+
user_id = metadata.get("user_id")
|
|
167
|
+
|
|
168
|
+
if not user_id and config and hasattr(self, "get_tool_config"):
|
|
169
|
+
logger.info("%s: Resolving user_id from RunnableConfig", self.LOG_PREFIX)
|
|
170
|
+
try:
|
|
171
|
+
tool_config = self.get_tool_config(config) # injected by tool_config_injector
|
|
172
|
+
logger.info("%s: Injected tool_config: %s", self.LOG_PREFIX, tool_config)
|
|
173
|
+
if tool_config and hasattr(tool_config, "user_id"):
|
|
174
|
+
user_id = tool_config.user_id
|
|
175
|
+
logger.info("%s: Using user_id from tool config: %s", self.LOG_PREFIX, user_id)
|
|
176
|
+
except Exception as exc: # noqa: BLE001
|
|
177
|
+
logger.warning("%s: get_tool_config failed: %s", self.LOG_PREFIX, exc)
|
|
178
|
+
|
|
179
|
+
if not user_id and self.user_id_provider:
|
|
180
|
+
try:
|
|
181
|
+
user_id = self.user_id_provider()
|
|
182
|
+
logger.info("%s: Using user_id from provider: %s", self.LOG_PREFIX, user_id)
|
|
183
|
+
except Exception as exc: # noqa: BLE001
|
|
184
|
+
logger.warning("%s: user_id_provider failed: %s", self.LOG_PREFIX, exc)
|
|
185
|
+
|
|
186
|
+
resolved_user_id = user_id or self.default_user_id or MemoryDefaults.DEFAULT_USER_ID
|
|
187
|
+
logger.info("%s: Resolved user_id: %s", self.LOG_PREFIX, resolved_user_id)
|
|
188
|
+
return resolved_user_id
|
|
189
|
+
|
|
190
|
+
def format_hits(self, hits: list[dict[str, Any]], with_tag: bool = False) -> str:
|
|
191
|
+
"""Format hits into a string with optional tags.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
hits: List of memory hit dictionaries to format.
|
|
195
|
+
with_tag: Whether to wrap the output with memory tags.
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
Formatted string representation of the memory hits.
|
|
199
|
+
"""
|
|
200
|
+
return self.memory.format_hits(hits, max_items=len(hits), with_tag=with_tag)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from abc import ABC
|
|
3
|
+
from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
|
|
4
|
+
from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput, MemoryConfig as MemoryConfig
|
|
5
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
6
|
+
from collections.abc import Callable
|
|
7
|
+
from langchain_core.tools import BaseTool
|
|
8
|
+
from pydantic import BaseModel as BaseModel
|
|
9
|
+
from typing import Any, ClassVar, Protocol
|
|
10
|
+
|
|
11
|
+
logger: Incomplete
|
|
12
|
+
|
|
13
|
+
class LongTermMemoryBackend(Protocol):
|
|
14
|
+
"""Protocol for memory adapters that support retrieval and formatting."""
|
|
15
|
+
def retrieve(self, *, query: str | None, user_id: str, limit: int | None = None, filters: dict[str, Any] | None = None, page: int | None = None) -> list[dict[str, Any]]:
|
|
16
|
+
"""Retrieve memories matching the given query and filters.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
query: Optional search query string.
|
|
20
|
+
user_id: User identifier for scoped retrieval.
|
|
21
|
+
limit: Maximum number of results to return.
|
|
22
|
+
filters: Optional filters to apply to the retrieval.
|
|
23
|
+
page: Page number for pagination.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
List of memory hit dictionaries.
|
|
27
|
+
"""
|
|
28
|
+
def format_hits(self, hits: list[dict[str, Any]], max_items: int = ..., with_tag: bool = True) -> str:
|
|
29
|
+
"""Format memory hits into a readable string.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
hits: List of memory hit dictionaries to format.
|
|
33
|
+
max_items: Maximum number of hits to include in output.
|
|
34
|
+
with_tag: Whether to wrap output with memory tags.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Formatted string representation of memory hits.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
class LongTermMemorySearchTool(BaseTool, ABC):
|
|
41
|
+
"""Abstract base class for provider-specific long-term memory search tools."""
|
|
42
|
+
name: str
|
|
43
|
+
description: str
|
|
44
|
+
args_schema: type[LongTermMemorySearchInput]
|
|
45
|
+
tool_config_schema: type[BaseModel]
|
|
46
|
+
memory: LongTermMemoryBackend
|
|
47
|
+
default_user_id: str | None
|
|
48
|
+
user_id_provider: Callable[[], str | None] | None
|
|
49
|
+
MINIMUM_MEMORY_RETRIEVAL: ClassVar[int]
|
|
50
|
+
LOG_PREFIX: ClassVar[str]
|
|
51
|
+
def __init__(self, memory: LongTermMemoryBackend, *, default_user_id: str | None = None, user_id_provider: Callable[[], str | None] | None = None, **kwargs: Any) -> None:
|
|
52
|
+
"""Initialize the long-term memory search tool.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
memory: Memory adapter instance with retrieve() and format_hits() methods.
|
|
56
|
+
default_user_id: Default user ID to use if not provided in metadata.
|
|
57
|
+
user_id_provider: Callable that returns a user ID.
|
|
58
|
+
**kwargs: Additional keyword arguments passed to the parent class.
|
|
59
|
+
"""
|
|
60
|
+
def format_hits(self, hits: list[dict[str, Any]], with_tag: bool = False) -> str:
|
|
61
|
+
"""Format hits into a string with optional tags.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
hits: List of memory hit dictionaries to format.
|
|
65
|
+
with_tag: Whether to wrap the output with memory tags.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Formatted string representation of the memory hits.
|
|
69
|
+
"""
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"""Mem0-specific implementation of the long-term memory search tool.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
from typing import Any, ClassVar
|
|
11
|
+
|
|
12
|
+
from langchain_core.runnables import RunnableConfig
|
|
13
|
+
|
|
14
|
+
from aip_agents.memory.constants import MemoryDefaults
|
|
15
|
+
from aip_agents.tools.memory_search.base import LongTermMemorySearchTool
|
|
16
|
+
from aip_agents.tools.memory_search.schema import LongTermMemoryDeleteInput, LongTermMemorySearchInput
|
|
17
|
+
from aip_agents.utils.datetime import is_valid_date_string, next_day_iso
|
|
18
|
+
from aip_agents.utils.logger import get_logger
|
|
19
|
+
|
|
20
|
+
logger = get_logger(__name__)
|
|
21
|
+
|
|
22
|
+
MEMORY_SEARCH_TOOL_NAME = "built_in_mem0_search"
|
|
23
|
+
MEMORY_DELETE_TOOL_NAME = "built_in_mem0_delete"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Mem0SearchTool(LongTermMemorySearchTool):
|
|
27
|
+
"""Mem0-specific implementation of the long-term memory search tool."""
|
|
28
|
+
|
|
29
|
+
name: str = MEMORY_SEARCH_TOOL_NAME
|
|
30
|
+
description: str = (
|
|
31
|
+
"Search or retrieve memories from long-term mem0 storage. Supports two modes:\n"
|
|
32
|
+
"1. SEMANTIC SEARCH: Provide 'query' to search for relevant memories by content\n"
|
|
33
|
+
"2. DATE-BASED RECALL: Omit 'query' to get all memories from an explicit date period\n\n"
|
|
34
|
+
"Time periods only support explicit dates ('start_date'/'end_date' in YYYY-MM-DD format).\n\n"
|
|
35
|
+
"Use for: names, preferences, past plans, conversations, or when user asks "
|
|
36
|
+
"'What did we discuss last week?' or 'Search for project notes'"
|
|
37
|
+
)
|
|
38
|
+
args_schema: type[LongTermMemorySearchInput] = LongTermMemorySearchInput
|
|
39
|
+
LOG_PREFIX: ClassVar[str] = "Mem0SearchTool"
|
|
40
|
+
METADATA_FILTER_BLOCKLIST: ClassVar[set[str]] = {"user_id", "memory_user_id"}
|
|
41
|
+
|
|
42
|
+
async def _arun(
|
|
43
|
+
self,
|
|
44
|
+
query: str | None = None,
|
|
45
|
+
config: RunnableConfig | None = None,
|
|
46
|
+
run_manager: Any | None = None,
|
|
47
|
+
**kwargs: Any,
|
|
48
|
+
) -> str:
|
|
49
|
+
"""Execute the memory search asynchronously for LangChain.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
query: Semantic search query when provided.
|
|
53
|
+
config: Runnable configuration containing LangChain metadata.
|
|
54
|
+
run_manager: LangChain callbacks (unused).
|
|
55
|
+
**kwargs: Additional filters such as ``start_date``, ``end_date``, ``limit``, ``categories``, ``metadata``.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
str: JSON-encoded retrieval results or an error message.
|
|
59
|
+
"""
|
|
60
|
+
logger.info("%s: Received config: %s", self.LOG_PREFIX, config)
|
|
61
|
+
|
|
62
|
+
start_date: str | None = kwargs.get("start_date")
|
|
63
|
+
end_date: str | None = kwargs.get("end_date")
|
|
64
|
+
limit: int | None = kwargs.get("limit")
|
|
65
|
+
categories: list[str] | None = kwargs.get("categories")
|
|
66
|
+
metadata: dict[str, Any] | None = kwargs.get("metadata")
|
|
67
|
+
|
|
68
|
+
user_id = self._resolve_user_id(metadata=metadata, config=config)
|
|
69
|
+
|
|
70
|
+
metadata_filter = None
|
|
71
|
+
if isinstance(metadata, dict):
|
|
72
|
+
metadata_filter = {k: v for k, v in metadata.items() if k not in self.METADATA_FILTER_BLOCKLIST} or None
|
|
73
|
+
|
|
74
|
+
date_filter_result = self._parse_date_filters(
|
|
75
|
+
start_date=start_date,
|
|
76
|
+
end_date=end_date,
|
|
77
|
+
user_id=user_id,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
if "error" in date_filter_result:
|
|
81
|
+
return f"Error: {date_filter_result['error']}"
|
|
82
|
+
|
|
83
|
+
filters = self._add_additional_filters(
|
|
84
|
+
filters=date_filter_result["filters"],
|
|
85
|
+
categories=categories,
|
|
86
|
+
metadata=metadata_filter,
|
|
87
|
+
user_id=user_id,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
time_spec = f"{start_date or 'unbounded'} to {end_date or 'unbounded'}"
|
|
91
|
+
|
|
92
|
+
raw_results = self._perform_retrieval(
|
|
93
|
+
query=query,
|
|
94
|
+
user_id=user_id,
|
|
95
|
+
limit=limit,
|
|
96
|
+
filters=filters,
|
|
97
|
+
time_spec=time_spec,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return json.dumps(raw_results)
|
|
101
|
+
|
|
102
|
+
def _parse_date_filters(
|
|
103
|
+
self,
|
|
104
|
+
*,
|
|
105
|
+
start_date: str | None,
|
|
106
|
+
end_date: str | None,
|
|
107
|
+
user_id: str,
|
|
108
|
+
) -> dict[str, Any]:
|
|
109
|
+
"""Build normalized date filters validated against YYYY-MM-DD strings.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
start_date: Inclusive start date for recall filtering.
|
|
113
|
+
end_date: Inclusive end date for recall filtering.
|
|
114
|
+
user_id: User identifier to scope the memories.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
dict[str, Any]: Payload including ``filters`` or an ``error`` entry when validation fails.
|
|
118
|
+
"""
|
|
119
|
+
filters: dict[str, Any] = {"AND": [{"user_id": user_id}]}
|
|
120
|
+
if start_date or end_date:
|
|
121
|
+
try:
|
|
122
|
+
date_range_filter = self._build_explicit_date_filter(start_date, end_date)
|
|
123
|
+
if date_range_filter:
|
|
124
|
+
filters["AND"].append(date_range_filter)
|
|
125
|
+
logger.info(
|
|
126
|
+
"%s: Using explicit date range [%s, %s] for user_id='%s'",
|
|
127
|
+
self.LOG_PREFIX,
|
|
128
|
+
start_date or "unbounded",
|
|
129
|
+
end_date or "unbounded",
|
|
130
|
+
user_id,
|
|
131
|
+
)
|
|
132
|
+
except ValueError as exc:
|
|
133
|
+
logger.warning("%s: Invalid explicit date range: %s", self.LOG_PREFIX, exc)
|
|
134
|
+
return {"error": str(exc), "hits": [], "count": 0}
|
|
135
|
+
|
|
136
|
+
return {"filters": filters}
|
|
137
|
+
|
|
138
|
+
def _build_explicit_date_filter(self, start_date: str | None, end_date: str | None) -> dict[str, Any] | None:
|
|
139
|
+
"""Return the mem0-compatible date clause for explicit ranges.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
start_date: Inclusive start date string.
|
|
143
|
+
end_date: Inclusive end date string.
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
dict[str, Any] | None: Date filter clause or None when no bounds were provided.
|
|
147
|
+
|
|
148
|
+
Raises:
|
|
149
|
+
ValueError: If either date fails the YYYY-MM-DD validation.
|
|
150
|
+
"""
|
|
151
|
+
if not start_date and not end_date:
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
date_filter: dict[str, Any] = {}
|
|
155
|
+
|
|
156
|
+
if start_date:
|
|
157
|
+
if not is_valid_date_string(start_date, "%Y-%m-%d"):
|
|
158
|
+
raise ValueError(f"Invalid start_date format '{start_date}'. Expected YYYY-MM-DD.")
|
|
159
|
+
date_filter["gte"] = start_date
|
|
160
|
+
|
|
161
|
+
if end_date:
|
|
162
|
+
if not is_valid_date_string(end_date, "%Y-%m-%d"):
|
|
163
|
+
raise ValueError(f"Invalid end_date format '{end_date}'. Expected YYYY-MM-DD.")
|
|
164
|
+
date_filter["lt"] = next_day_iso(end_date)
|
|
165
|
+
|
|
166
|
+
return {"created_at": date_filter}
|
|
167
|
+
|
|
168
|
+
def _add_additional_filters(
|
|
169
|
+
self,
|
|
170
|
+
*,
|
|
171
|
+
filters: dict[str, Any],
|
|
172
|
+
categories: list[str] | None,
|
|
173
|
+
metadata: dict[str, Any] | None,
|
|
174
|
+
user_id: str,
|
|
175
|
+
) -> dict[str, Any]:
|
|
176
|
+
"""Augment filters with categories and metadata selections.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
filters: Existing filter payload (mutated in place).
|
|
180
|
+
categories: Optional category list attached to the request.
|
|
181
|
+
metadata: Additional metadata equality filters.
|
|
182
|
+
user_id: User identifier for logging context.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
dict[str, Any]: Updated filters object.
|
|
186
|
+
"""
|
|
187
|
+
if categories:
|
|
188
|
+
filters["AND"].append({"categories": {"in": categories}})
|
|
189
|
+
logger.info("%s: Added categories filter %s for user_id='%s'", self.LOG_PREFIX, categories, user_id)
|
|
190
|
+
|
|
191
|
+
if metadata:
|
|
192
|
+
filters["AND"].append({"metadata": metadata})
|
|
193
|
+
logger.info("%s: Added metadata filter %s for user_id='%s'", self.LOG_PREFIX, metadata, user_id)
|
|
194
|
+
|
|
195
|
+
return filters
|
|
196
|
+
|
|
197
|
+
def _perform_retrieval(
|
|
198
|
+
self,
|
|
199
|
+
*,
|
|
200
|
+
query: str | None,
|
|
201
|
+
user_id: str,
|
|
202
|
+
limit: int | None,
|
|
203
|
+
filters: dict[str, Any],
|
|
204
|
+
time_spec: str,
|
|
205
|
+
) -> list[dict[str, Any]]:
|
|
206
|
+
"""Execute the underlying memory retrieval call with guardrails.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
query: Semantic query string or None for chronological listing.
|
|
210
|
+
user_id: Identifier associated with the stored memories.
|
|
211
|
+
limit: Requested number of memories to fetch.
|
|
212
|
+
filters: Filter payload produced by ``_add_additional_filters``.
|
|
213
|
+
time_spec: Human-readable time range string used for logging.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
list[dict[str, Any]]: Retrieved memories or empty list on failure.
|
|
217
|
+
"""
|
|
218
|
+
effective_limit = max(limit or MemoryDefaults.RETRIEVAL_LIMIT, self.MINIMUM_MEMORY_RETRIEVAL)
|
|
219
|
+
if limit is not None and effective_limit != limit:
|
|
220
|
+
logger.info(
|
|
221
|
+
"%s: Enforced minimum limit of %s (requested: %s, using: %s)",
|
|
222
|
+
self.LOG_PREFIX,
|
|
223
|
+
self.MINIMUM_MEMORY_RETRIEVAL,
|
|
224
|
+
limit,
|
|
225
|
+
effective_limit,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
try:
|
|
229
|
+
results = self.memory.retrieve(
|
|
230
|
+
query=query,
|
|
231
|
+
user_id=user_id,
|
|
232
|
+
limit=effective_limit,
|
|
233
|
+
filters=filters,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
retrieval_mode = "semantic search" if query else "date-based recall"
|
|
237
|
+
|
|
238
|
+
logger.info(
|
|
239
|
+
"%s: %s complete for user_id='%s', query='%s', time_spec='%s', "
|
|
240
|
+
"limit=%s (effective: %s), filters=%s, results_count=%s",
|
|
241
|
+
self.LOG_PREFIX,
|
|
242
|
+
retrieval_mode.title(),
|
|
243
|
+
user_id,
|
|
244
|
+
query or "None",
|
|
245
|
+
time_spec,
|
|
246
|
+
limit,
|
|
247
|
+
effective_limit,
|
|
248
|
+
filters,
|
|
249
|
+
len(results),
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
return results
|
|
253
|
+
|
|
254
|
+
except Exception as exc: # noqa: BLE001
|
|
255
|
+
logger.error("%s: Retrieval failed for user_id='%s': %s", self.LOG_PREFIX, user_id, exc)
|
|
256
|
+
return []
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
Mem0SearchInput = LongTermMemorySearchInput
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
class Mem0DeleteTool(LongTermMemorySearchTool):
|
|
263
|
+
"""Mem0-specific implementation of the long-term memory delete tool."""
|
|
264
|
+
|
|
265
|
+
name: str = MEMORY_DELETE_TOOL_NAME
|
|
266
|
+
description: str = (
|
|
267
|
+
"Delete memories from long-term mem0 storage. Supports three modes:\n"
|
|
268
|
+
"1. DELETE BY IDS: Provide 'memory_ids'\n"
|
|
269
|
+
"2. DELETE BY QUERY: Provide 'query'\n"
|
|
270
|
+
"3. DELETE ALL: Provide 'delete_all=true' with no query/IDs\n"
|
|
271
|
+
)
|
|
272
|
+
args_schema: type[LongTermMemoryDeleteInput] = LongTermMemoryDeleteInput
|
|
273
|
+
LOG_PREFIX: ClassVar[str] = "Mem0DeleteTool"
|
|
274
|
+
METADATA_FILTER_BLOCKLIST: ClassVar[set[str]] = {"user_id", "memory_user_id"}
|
|
275
|
+
|
|
276
|
+
async def _arun(
|
|
277
|
+
self,
|
|
278
|
+
query: str | None = None,
|
|
279
|
+
config: RunnableConfig | None = None,
|
|
280
|
+
run_manager: Any | None = None,
|
|
281
|
+
**kwargs: Any,
|
|
282
|
+
) -> str:
|
|
283
|
+
"""Execute the memory delete asynchronously for LangChain.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
query: Semantic delete query when provided.
|
|
287
|
+
config: Runnable configuration containing LangChain metadata.
|
|
288
|
+
run_manager: LangChain callbacks (unused).
|
|
289
|
+
**kwargs: Additional arguments such as ``memory_ids``, ``delete_all``, ``metadata``.
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
str: JSON-encoded delete result or an error message.
|
|
293
|
+
"""
|
|
294
|
+
logger.info("%s: Received config: %s", self.LOG_PREFIX, config)
|
|
295
|
+
|
|
296
|
+
memory_ids: list[str] | None = kwargs.get("memory_ids")
|
|
297
|
+
delete_all: bool | None = kwargs.get("delete_all")
|
|
298
|
+
threshold: float | None = kwargs.get("threshold")
|
|
299
|
+
top_k: int | None = kwargs.get("top_k")
|
|
300
|
+
categories: list[str] | None = kwargs.get("categories")
|
|
301
|
+
metadata: dict[str, Any] | None = kwargs.get("metadata")
|
|
302
|
+
|
|
303
|
+
user_id = self._resolve_user_id(metadata=metadata, config=config)
|
|
304
|
+
|
|
305
|
+
metadata_filter = None
|
|
306
|
+
if isinstance(metadata, dict):
|
|
307
|
+
metadata_filter = {k: v for k, v in metadata.items() if k not in self.METADATA_FILTER_BLOCKLIST} or None
|
|
308
|
+
|
|
309
|
+
if memory_ids:
|
|
310
|
+
if not hasattr(self.memory, "delete"):
|
|
311
|
+
return f"Error executing memory tool '{self.name}': backend does not support delete()"
|
|
312
|
+
mode = "ids"
|
|
313
|
+
result = self.memory.delete( # type: ignore[attr-defined]
|
|
314
|
+
memory_ids=memory_ids,
|
|
315
|
+
user_id=user_id,
|
|
316
|
+
metadata=metadata_filter,
|
|
317
|
+
categories=categories,
|
|
318
|
+
)
|
|
319
|
+
elif query:
|
|
320
|
+
if not hasattr(self.memory, "delete_by_query"):
|
|
321
|
+
return f"Error executing memory tool '{self.name}': backend does not support delete_by_query()"
|
|
322
|
+
mode = "query"
|
|
323
|
+
result = self.memory.delete_by_query( # type: ignore[attr-defined]
|
|
324
|
+
query=query,
|
|
325
|
+
user_id=user_id,
|
|
326
|
+
metadata=metadata_filter,
|
|
327
|
+
threshold=threshold,
|
|
328
|
+
top_k=top_k,
|
|
329
|
+
categories=categories,
|
|
330
|
+
)
|
|
331
|
+
elif delete_all:
|
|
332
|
+
if not hasattr(self.memory, "delete"):
|
|
333
|
+
return f"Error executing memory tool '{self.name}': backend does not support delete()"
|
|
334
|
+
mode = "all"
|
|
335
|
+
result = self.memory.delete( # type: ignore[attr-defined]
|
|
336
|
+
memory_ids=None,
|
|
337
|
+
user_id=user_id,
|
|
338
|
+
metadata=metadata_filter,
|
|
339
|
+
categories=categories,
|
|
340
|
+
)
|
|
341
|
+
else:
|
|
342
|
+
return f"Error executing memory tool '{self.name}': provide memory_ids, query, or delete_all=true."
|
|
343
|
+
|
|
344
|
+
count = None
|
|
345
|
+
if isinstance(result, dict):
|
|
346
|
+
count = result.get("count") or result.get("deleted") or result.get("total")
|
|
347
|
+
|
|
348
|
+
logger.info(
|
|
349
|
+
"%s: delete mode=%s user_id='%s' count=%s",
|
|
350
|
+
self.LOG_PREFIX,
|
|
351
|
+
mode,
|
|
352
|
+
user_id,
|
|
353
|
+
count if count is not None else "unknown",
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
payload = {"status": "success", "mode": mode}
|
|
357
|
+
try:
|
|
358
|
+
json.dumps(result)
|
|
359
|
+
payload["result"] = result
|
|
360
|
+
except TypeError:
|
|
361
|
+
payload["result"] = str(result)
|
|
362
|
+
return json.dumps(payload)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
Mem0DeleteInput = LongTermMemoryDeleteInput
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
|
|
3
|
+
from aip_agents.tools.memory_search.base import LongTermMemorySearchTool as LongTermMemorySearchTool
|
|
4
|
+
from aip_agents.tools.memory_search.schema import LongTermMemoryDeleteInput as LongTermMemoryDeleteInput, LongTermMemorySearchInput as LongTermMemorySearchInput
|
|
5
|
+
from aip_agents.utils.datetime import is_valid_date_string as is_valid_date_string, next_day_iso as next_day_iso
|
|
6
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
7
|
+
from typing import ClassVar
|
|
8
|
+
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
MEMORY_SEARCH_TOOL_NAME: str
|
|
11
|
+
MEMORY_DELETE_TOOL_NAME: str
|
|
12
|
+
|
|
13
|
+
class Mem0SearchTool(LongTermMemorySearchTool):
|
|
14
|
+
"""Mem0-specific implementation of the long-term memory search tool."""
|
|
15
|
+
name: str
|
|
16
|
+
description: str
|
|
17
|
+
args_schema: type[LongTermMemorySearchInput]
|
|
18
|
+
LOG_PREFIX: ClassVar[str]
|
|
19
|
+
METADATA_FILTER_BLOCKLIST: ClassVar[set[str]]
|
|
20
|
+
Mem0SearchInput = LongTermMemorySearchInput
|
|
21
|
+
|
|
22
|
+
class Mem0DeleteTool(LongTermMemorySearchTool):
|
|
23
|
+
"""Mem0-specific implementation of the long-term memory delete tool."""
|
|
24
|
+
name: str
|
|
25
|
+
description: str
|
|
26
|
+
args_schema: type[LongTermMemoryDeleteInput]
|
|
27
|
+
LOG_PREFIX: ClassVar[str]
|
|
28
|
+
METADATA_FILTER_BLOCKLIST: ClassVar[set[str]]
|
|
29
|
+
Mem0DeleteInput = LongTermMemoryDeleteInput
|