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,433 @@
|
|
|
1
|
+
"""LangGraph Memory Enhancer Agent.
|
|
2
|
+
|
|
3
|
+
This module implements the ``LangGraphMemoryEnhancerAgent``, a dedicated LangGraph helper agent
|
|
4
|
+
that automatically augments user queries with relevant memories before the primary agent runs.
|
|
5
|
+
It replaces manual memory tool invocation with a consistent preprocessing layer.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import textwrap
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
|
|
16
|
+
from langgraph.graph import END, StateGraph
|
|
17
|
+
from langgraph.graph.state import CompiledStateGraph
|
|
18
|
+
|
|
19
|
+
from aip_agents.agent.langgraph_react_agent import LangGraphReactAgent
|
|
20
|
+
from aip_agents.agent.system_instruction_context import get_current_date_context
|
|
21
|
+
from aip_agents.memory.guidance import MEM0_MEMORY_RECALL_GUIDANCE
|
|
22
|
+
from aip_agents.tools.memory_search_tool import (
|
|
23
|
+
MEMORY_SEARCH_TOOL_NAME,
|
|
24
|
+
LongTermMemorySearchTool,
|
|
25
|
+
Mem0SearchTool,
|
|
26
|
+
)
|
|
27
|
+
from aip_agents.utils.logger import get_logger
|
|
28
|
+
|
|
29
|
+
logger = get_logger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class LangGraphMemoryEnhancerAgent(LangGraphReactAgent):
|
|
33
|
+
"""Simplified mini-agent for automatic memory retrieval and query enhancement.
|
|
34
|
+
|
|
35
|
+
This agent has a simple 2-node LangGraph (agent + tools) and uses existing memory
|
|
36
|
+
infrastructure to enhance user queries with relevant context. It acts as a
|
|
37
|
+
preprocessing layer that automatically attempts memory retrieval for every query.
|
|
38
|
+
|
|
39
|
+
Key features:
|
|
40
|
+
- Uses runtime `memory_user_id` provided via call arguments (no static storage)
|
|
41
|
+
- Uses simplified instruction reusing existing guidance
|
|
42
|
+
- Standard 2-node LangGraph pattern (agent -> tools -> agent)
|
|
43
|
+
- Automatically enhances queries with memory context when available
|
|
44
|
+
- Returns original query unchanged if no relevant memories found
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self, memory, **kwargs) -> None:
|
|
48
|
+
"""Initialize the LangGraphMemoryEnhancerAgent with memory backend and configuration.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
memory: Memory backend instance (Mem0Memory or compatible)
|
|
52
|
+
**kwargs: Additional arguments passed to BaseLangGraphAgent, including:
|
|
53
|
+
- memory_agent_id: Fallback user ID for memory operations
|
|
54
|
+
- model: LLM model to use for memory decisions
|
|
55
|
+
- Other BaseLangGraphAgent parameters
|
|
56
|
+
"""
|
|
57
|
+
memory_tool: LongTermMemorySearchTool = Mem0SearchTool(
|
|
58
|
+
memory=memory,
|
|
59
|
+
default_user_id=kwargs.get("memory_agent_id"),
|
|
60
|
+
user_id_provider=None,
|
|
61
|
+
)
|
|
62
|
+
kwargs["save_interaction_to_memory"] = False
|
|
63
|
+
super().__init__(
|
|
64
|
+
name="LangGraphMemoryEnhancerAgent",
|
|
65
|
+
instruction=self._build_simple_instruction(),
|
|
66
|
+
tools=[memory_tool],
|
|
67
|
+
**kwargs,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def _build_simple_instruction(self) -> str:
|
|
71
|
+
"""Build simplified memory recall instruction reusing existing components.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
str: Complete instruction including date context and memory guidance
|
|
75
|
+
"""
|
|
76
|
+
date_context = get_current_date_context()
|
|
77
|
+
|
|
78
|
+
instruction = textwrap.dedent(f"""
|
|
79
|
+
{date_context}
|
|
80
|
+
|
|
81
|
+
You are a Memory Recall Agent that ONLY decides whether and how to call a memory search tool.
|
|
82
|
+
|
|
83
|
+
Important: You WILL NOT see the tool results. The system will append any retrieved memory
|
|
84
|
+
to the user input after your turn. Your sole responsibility is to trigger the correct tool
|
|
85
|
+
calls with concise arguments based on the user's message.
|
|
86
|
+
|
|
87
|
+
What to do:
|
|
88
|
+
1. Read the user's message as-is (do not rephrase it).
|
|
89
|
+
2. Call the tool `built_in_mem0_search` with minimal, relevant args. Prefer a single call,
|
|
90
|
+
but you MAY make multiple calls when clearly needed (e.g., separate topics or distinct
|
|
91
|
+
time ranges). Avoid duplicate or redundant calls.
|
|
92
|
+
- If the user implies a time frame (e.g., "yesterday", "last week"), set `time_period`.
|
|
93
|
+
- If the user implies a precise range, set `start_date`/`end_date` (YYYY-MM-DD).
|
|
94
|
+
- If the user mentions a topic, set a concise `query` (few words or at most a sentence).
|
|
95
|
+
- Adjust `limit` to higher number to allow more memory to be retrieved if needed.
|
|
96
|
+
- Default when uncertain: omit dates, set a concise `query` derived from the message,
|
|
97
|
+
and set `limit=10`.
|
|
98
|
+
3. Do NOT answer the user's question. Do NOT summarize. Do NOT format output. The system will handle it.
|
|
99
|
+
|
|
100
|
+
Constraints:
|
|
101
|
+
- Keep tool arguments succinct and precise; avoid verbose or speculative queries.
|
|
102
|
+
- Never invent facts. If unsure about time ranges, prefer omitting dates rather than fabricating.
|
|
103
|
+
- Do not include any preambles or explanations in your messages.
|
|
104
|
+
- Make one or more tool calls as needed; avoid duplicates or redundant calls.
|
|
105
|
+
|
|
106
|
+
Reference guidance:
|
|
107
|
+
{MEM0_MEMORY_RECALL_GUIDANCE}
|
|
108
|
+
""").strip()
|
|
109
|
+
|
|
110
|
+
return instruction
|
|
111
|
+
|
|
112
|
+
async def _memory_retrieval_node(self, state: dict, config: dict | None = None) -> dict:
|
|
113
|
+
"""Execute memory retrieval using explicit tool calls or synthesized defaults.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
state: LangGraph state containing the conversation `messages` history.
|
|
117
|
+
config: Optional LangGraph configuration forwarded to the memory tool.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
dict: State update whose `messages` list contains `ToolMessage` outputs.
|
|
121
|
+
"""
|
|
122
|
+
messages = state.get("messages", [])
|
|
123
|
+
tool_calls = self._extract_mem0_tool_calls(messages)
|
|
124
|
+
|
|
125
|
+
if tool_calls:
|
|
126
|
+
tool_messages = await self._execute_mem0_tool_calls(tool_calls, state, config)
|
|
127
|
+
return {"messages": tool_messages}
|
|
128
|
+
|
|
129
|
+
default_query = self._extract_last_human_query(messages)
|
|
130
|
+
tool_messages = await self._execute_default_retrieval(default_query, state, config)
|
|
131
|
+
return {"messages": tool_messages}
|
|
132
|
+
|
|
133
|
+
def _extract_mem0_tool_calls(self, messages: list) -> list[dict[str, Any]]:
|
|
134
|
+
"""Return all Mem0 tool calls from the last message if present.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
messages: Ordered list of LangChain message objects representing the state.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
List of tool call dictionaries filtered for the Mem0 search tool.
|
|
141
|
+
"""
|
|
142
|
+
if not messages:
|
|
143
|
+
return []
|
|
144
|
+
|
|
145
|
+
last_message = messages[-1]
|
|
146
|
+
tool_calls = getattr(last_message, "tool_calls", None)
|
|
147
|
+
if not tool_calls:
|
|
148
|
+
return []
|
|
149
|
+
|
|
150
|
+
return [tc for tc in tool_calls if tc.get("name") == MEMORY_SEARCH_TOOL_NAME]
|
|
151
|
+
|
|
152
|
+
async def _execute_mem0_tool_calls(
|
|
153
|
+
self,
|
|
154
|
+
tool_calls: list[dict[str, Any]],
|
|
155
|
+
state: dict,
|
|
156
|
+
config: dict | None,
|
|
157
|
+
) -> list[ToolMessage]:
|
|
158
|
+
"""Execute the provided Mem0 tool calls and return their messages.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
tool_calls: Tool call dictionaries emitted by the LLM.
|
|
162
|
+
state: LangGraph state containing messages and metadata.
|
|
163
|
+
config: Optional runnable configuration forwarded to the tool.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
List of `ToolMessage` objects describing each execution result.
|
|
167
|
+
"""
|
|
168
|
+
tool_messages: list[ToolMessage] = []
|
|
169
|
+
for index, tool_call in enumerate(tool_calls):
|
|
170
|
+
logger.info("Executing memory search tool call #%s with args: %s", index, tool_call.get("args", {}))
|
|
171
|
+
tool_messages.append(await self._execute_mem0_call(tool_call.get("args", {}), state, config))
|
|
172
|
+
return tool_messages
|
|
173
|
+
|
|
174
|
+
async def _execute_default_retrieval(
|
|
175
|
+
self,
|
|
176
|
+
default_query: str | None,
|
|
177
|
+
state: dict,
|
|
178
|
+
config: dict | None,
|
|
179
|
+
) -> list[ToolMessage]:
|
|
180
|
+
"""Perform a default retrieval when the LLM does not request tools.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
default_query: Latest human utterance content or ``None`` if unavailable.
|
|
184
|
+
state: LangGraph state with message history and metadata.
|
|
185
|
+
config: Optional runnable configuration forwarded to the tool.
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
Single-item list containing the resulting `ToolMessage`.
|
|
189
|
+
"""
|
|
190
|
+
args = self._build_default_mem0_args(default_query)
|
|
191
|
+
tool_message = await self._execute_mem0_call(args, state, config)
|
|
192
|
+
return [tool_message]
|
|
193
|
+
|
|
194
|
+
def _build_default_mem0_args(self, query: str | None) -> dict[str, Any]:
|
|
195
|
+
"""Create safe default arguments for the Mem0 search tool.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
query: Latest human utterance used to derive the search query.
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
Dictionary of keyword arguments passed to the Mem0 search tool.
|
|
202
|
+
"""
|
|
203
|
+
if query:
|
|
204
|
+
trimmed_query = query[:128]
|
|
205
|
+
else:
|
|
206
|
+
trimmed_query = None
|
|
207
|
+
|
|
208
|
+
return {"query": trimmed_query, "limit": 10}
|
|
209
|
+
|
|
210
|
+
async def _execute_mem0_call(
|
|
211
|
+
self,
|
|
212
|
+
args: dict[str, Any],
|
|
213
|
+
state: dict,
|
|
214
|
+
config: dict | None,
|
|
215
|
+
) -> ToolMessage:
|
|
216
|
+
"""Execute a single Mem0 tool call with metadata resolution.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
args: Base arguments supplied by the LLM or synthesized defaults.
|
|
220
|
+
state: LangGraph state that may include additional metadata.
|
|
221
|
+
config: Optional runnable configuration forwarded to the tool.
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
`ToolMessage` containing raw tool output or an error description.
|
|
225
|
+
"""
|
|
226
|
+
args_with_metadata = self._merge_metadata(args, state)
|
|
227
|
+
tool_config = self._create_tool_config(config, state, tool_name=MEMORY_SEARCH_TOOL_NAME)
|
|
228
|
+
mem0_tool = self.resolved_tools[0]
|
|
229
|
+
|
|
230
|
+
try:
|
|
231
|
+
result = await mem0_tool.ainvoke(args_with_metadata, config=tool_config)
|
|
232
|
+
content = str(result)
|
|
233
|
+
except Exception as exc:
|
|
234
|
+
content = f"Error executing memory search: {exc}"
|
|
235
|
+
|
|
236
|
+
return ToolMessage(content=content, tool_call_id=args.get("id", ""))
|
|
237
|
+
|
|
238
|
+
def _merge_metadata(self, args: dict[str, Any], state: dict) -> dict[str, Any]:
|
|
239
|
+
"""Merge resolved metadata into tool arguments.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
args: Tool arguments that may already include metadata.
|
|
243
|
+
state: LangGraph state providing globally resolved metadata values.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Copy of ``args`` containing merged metadata entries.
|
|
247
|
+
"""
|
|
248
|
+
args_with_metadata = dict(args)
|
|
249
|
+
effective_metadata = self._resolve_effective_metadata(state)
|
|
250
|
+
if not effective_metadata:
|
|
251
|
+
return args_with_metadata
|
|
252
|
+
|
|
253
|
+
existing_metadata = args_with_metadata.get("metadata")
|
|
254
|
+
if isinstance(existing_metadata, dict):
|
|
255
|
+
merged_metadata = {**effective_metadata, **existing_metadata}
|
|
256
|
+
else:
|
|
257
|
+
merged_metadata = effective_metadata
|
|
258
|
+
|
|
259
|
+
args_with_metadata["metadata"] = merged_metadata
|
|
260
|
+
return args_with_metadata
|
|
261
|
+
|
|
262
|
+
def _resolve_effective_metadata(self, state: dict) -> dict[str, Any] | None:
|
|
263
|
+
"""Resolve metadata for the Mem0 tool, swallowing resolution errors.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
state: LangGraph state whose ``metadata`` key may include overrides.
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
Resolved metadata dictionary or ``None`` if not available.
|
|
270
|
+
"""
|
|
271
|
+
raw_metadata = state.get("metadata")
|
|
272
|
+
if not isinstance(raw_metadata, dict):
|
|
273
|
+
return None
|
|
274
|
+
|
|
275
|
+
try:
|
|
276
|
+
return self._resolve_tool_metadata(MEMORY_SEARCH_TOOL_NAME, raw_metadata)
|
|
277
|
+
except Exception:
|
|
278
|
+
return None
|
|
279
|
+
|
|
280
|
+
def _extract_last_human_query(self, messages: list) -> str | None:
|
|
281
|
+
"""Return the content of the most recent `HumanMessage` if available.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
messages: Ordered message history produced during the graph run.
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
Text content of the last human message or ``None``.
|
|
288
|
+
"""
|
|
289
|
+
for message in reversed(messages):
|
|
290
|
+
if isinstance(message, HumanMessage):
|
|
291
|
+
if isinstance(message.content, str):
|
|
292
|
+
return message.content
|
|
293
|
+
return str(message.content)
|
|
294
|
+
return None
|
|
295
|
+
|
|
296
|
+
def _finalize_node(self, state: dict) -> dict:
|
|
297
|
+
"""Assemble the enhanced query returned by the memory recall agent.
|
|
298
|
+
|
|
299
|
+
Collects raw memory results from all tool calls, deduplicates by memory ID,
|
|
300
|
+
formats the unique memories, and combines with the original user query.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
state: LangGraph state containing the original conversation messages and the
|
|
304
|
+
tool outputs generated by `_memory_retrieval_node`.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
dict: State update with a single `AIMessage` that concatenates the original user
|
|
308
|
+
query and any deduplicated memory context.
|
|
309
|
+
"""
|
|
310
|
+
messages = state.get("messages", [])
|
|
311
|
+
original_query = self._extract_last_human_query(messages) or self._fallback_query(messages)
|
|
312
|
+
memories = self._collect_unique_memories(messages)
|
|
313
|
+
tagged_memory = self._format_memories(memories)
|
|
314
|
+
|
|
315
|
+
final_text = (f"{original_query}\n\n" + tagged_memory).strip()
|
|
316
|
+
return {"messages": [AIMessage(content=final_text)]}
|
|
317
|
+
|
|
318
|
+
def _fallback_query(self, messages: list) -> str:
|
|
319
|
+
"""Fallback to the last message content when no human message is present.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
messages: Ordered message history produced during the graph run.
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
The string representation of the last message content.
|
|
326
|
+
"""
|
|
327
|
+
if not messages:
|
|
328
|
+
return ""
|
|
329
|
+
last_message = messages[-1]
|
|
330
|
+
content = getattr(last_message, "content", "")
|
|
331
|
+
return content if isinstance(content, str) else str(content)
|
|
332
|
+
|
|
333
|
+
def _collect_unique_memories(self, messages: list) -> list[dict[str, Any]]:
|
|
334
|
+
"""Collect and deduplicate memory hits from tool messages.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
messages: Ordered message history produced during the graph run.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
List of memory dictionaries with unique memory identifiers.
|
|
341
|
+
"""
|
|
342
|
+
unique_memories: list[dict[str, Any]] = []
|
|
343
|
+
seen_ids: set[str] = set()
|
|
344
|
+
|
|
345
|
+
for message in messages:
|
|
346
|
+
for memory in self._extract_memories_from_message(message):
|
|
347
|
+
memory_id = memory.get("id")
|
|
348
|
+
if not memory_id or memory_id in seen_ids:
|
|
349
|
+
continue
|
|
350
|
+
|
|
351
|
+
seen_ids.add(memory_id)
|
|
352
|
+
unique_memories.append(memory)
|
|
353
|
+
|
|
354
|
+
return unique_memories
|
|
355
|
+
|
|
356
|
+
def _extract_memories_from_message(self, message: Any) -> list[dict[str, Any]]:
|
|
357
|
+
"""Return parsed memory dictionaries contained in a tool message.
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
message: Message instance that may contain memory tool output.
|
|
361
|
+
|
|
362
|
+
Returns:
|
|
363
|
+
List of memory dictionaries or an empty list when no memories are present.
|
|
364
|
+
"""
|
|
365
|
+
if not isinstance(message, ToolMessage):
|
|
366
|
+
return []
|
|
367
|
+
|
|
368
|
+
raw_results = self._parse_tool_message_content(message)
|
|
369
|
+
return [memory for memory in raw_results if isinstance(memory, dict)]
|
|
370
|
+
|
|
371
|
+
def _parse_tool_message_content(self, message: ToolMessage) -> list[Any]:
|
|
372
|
+
"""Parse the JSON content of a tool message into a list.
|
|
373
|
+
|
|
374
|
+
Args:
|
|
375
|
+
message: Tool message emitted by the memory search tool.
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
List extracted from the tool message content or an empty list on failure.
|
|
379
|
+
"""
|
|
380
|
+
try:
|
|
381
|
+
raw_results = json.loads(message.content)
|
|
382
|
+
except (json.JSONDecodeError, TypeError) as exc:
|
|
383
|
+
logger.warning(
|
|
384
|
+
"Failed to parse tool result as JSON: %s, content: %s...",
|
|
385
|
+
exc,
|
|
386
|
+
message.content[:200],
|
|
387
|
+
)
|
|
388
|
+
return []
|
|
389
|
+
|
|
390
|
+
if not isinstance(raw_results, list):
|
|
391
|
+
return []
|
|
392
|
+
|
|
393
|
+
return raw_results
|
|
394
|
+
|
|
395
|
+
def _format_memories(self, memories: list[dict[str, Any]]) -> str:
|
|
396
|
+
"""Format memory hits using the underlying tool formatter.
|
|
397
|
+
|
|
398
|
+
Args:
|
|
399
|
+
memories: Deduplicated list of memory dictionaries.
|
|
400
|
+
|
|
401
|
+
Returns:
|
|
402
|
+
Tagged string representation of the relevant memories.
|
|
403
|
+
"""
|
|
404
|
+
if not memories:
|
|
405
|
+
return ""
|
|
406
|
+
return self.resolved_tools[0].format_hits(memories, with_tag=True)
|
|
407
|
+
|
|
408
|
+
def define_graph(self, graph_builder: StateGraph) -> CompiledStateGraph:
|
|
409
|
+
"""Define the 3-node memory recall LangGraph for this agent.
|
|
410
|
+
|
|
411
|
+
This creates a streamlined ReAct-inspired structure that reuses
|
|
412
|
+
`LangGraphReactAgent` helpers for robust LM invocation, token usage tracking,
|
|
413
|
+
error handling, and tool execution.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
graph_builder: LangGraph `StateGraph` builder instance used to register nodes and
|
|
417
|
+
edges for compilation.
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
CompiledStateGraph: The compiled memory recall graph ready for execution.
|
|
421
|
+
"""
|
|
422
|
+
# Reuse parent's robust node implementations
|
|
423
|
+
# Simple 3-step structure for single pass: agent -> memory_retrieval -> finalize -> END
|
|
424
|
+
agent_node = self._create_agent_node() # Handles LM invoker + LangChain + token usage
|
|
425
|
+
graph_builder.add_node("agent", agent_node)
|
|
426
|
+
graph_builder.add_node("memory_retrieval", self._memory_retrieval_node)
|
|
427
|
+
graph_builder.add_node("finalize", self._finalize_node)
|
|
428
|
+
graph_builder.add_edge("agent", "memory_retrieval")
|
|
429
|
+
graph_builder.add_edge("memory_retrieval", "finalize")
|
|
430
|
+
graph_builder.add_edge("finalize", END)
|
|
431
|
+
graph_builder.set_entry_point("agent")
|
|
432
|
+
|
|
433
|
+
return graph_builder.compile(checkpointer=self.checkpointer)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent.langgraph_react_agent import LangGraphReactAgent as LangGraphReactAgent
|
|
3
|
+
from aip_agents.agent.system_instruction_context import get_current_date_context as get_current_date_context
|
|
4
|
+
from aip_agents.memory.guidance import MEM0_MEMORY_RECALL_GUIDANCE as MEM0_MEMORY_RECALL_GUIDANCE
|
|
5
|
+
from aip_agents.tools.memory_search_tool import LongTermMemorySearchTool as LongTermMemorySearchTool, MEMORY_SEARCH_TOOL_NAME as MEMORY_SEARCH_TOOL_NAME, Mem0SearchTool as Mem0SearchTool
|
|
6
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
7
|
+
from langgraph.graph import StateGraph
|
|
8
|
+
from langgraph.graph.state import CompiledStateGraph
|
|
9
|
+
|
|
10
|
+
logger: Incomplete
|
|
11
|
+
|
|
12
|
+
class LangGraphMemoryEnhancerAgent(LangGraphReactAgent):
|
|
13
|
+
"""Simplified mini-agent for automatic memory retrieval and query enhancement.
|
|
14
|
+
|
|
15
|
+
This agent has a simple 2-node LangGraph (agent + tools) and uses existing memory
|
|
16
|
+
infrastructure to enhance user queries with relevant context. It acts as a
|
|
17
|
+
preprocessing layer that automatically attempts memory retrieval for every query.
|
|
18
|
+
|
|
19
|
+
Key features:
|
|
20
|
+
- Uses runtime `memory_user_id` provided via call arguments (no static storage)
|
|
21
|
+
- Uses simplified instruction reusing existing guidance
|
|
22
|
+
- Standard 2-node LangGraph pattern (agent -> tools -> agent)
|
|
23
|
+
- Automatically enhances queries with memory context when available
|
|
24
|
+
- Returns original query unchanged if no relevant memories found
|
|
25
|
+
"""
|
|
26
|
+
def __init__(self, memory, **kwargs) -> None:
|
|
27
|
+
"""Initialize the LangGraphMemoryEnhancerAgent with memory backend and configuration.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
memory: Memory backend instance (Mem0Memory or compatible)
|
|
31
|
+
**kwargs: Additional arguments passed to BaseLangGraphAgent, including:
|
|
32
|
+
- memory_agent_id: Fallback user ID for memory operations
|
|
33
|
+
- model: LLM model to use for memory decisions
|
|
34
|
+
- Other BaseLangGraphAgent parameters
|
|
35
|
+
"""
|
|
36
|
+
def define_graph(self, graph_builder: StateGraph) -> CompiledStateGraph:
|
|
37
|
+
"""Define the 3-node memory recall LangGraph for this agent.
|
|
38
|
+
|
|
39
|
+
This creates a streamlined ReAct-inspired structure that reuses
|
|
40
|
+
`LangGraphReactAgent` helpers for robust LM invocation, token usage tracking,
|
|
41
|
+
error handling, and tool execution.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
graph_builder: LangGraph `StateGraph` builder instance used to register nodes and
|
|
45
|
+
edges for compilation.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
CompiledStateGraph: The compiled memory recall graph ready for execution.
|
|
49
|
+
"""
|