aip-agents-binary 0.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aip_agents/__init__.py +66 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/base_executor.py +1125 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2ui/__init__.py +26 -0
- aip_agents/a2ui/catalog_provider.py +109 -0
- aip_agents/a2ui/examples/0.8/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.8/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.8/single_column_list.json +1 -0
- aip_agents/a2ui/examples/0.9/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.9/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.9/single_column_list.json +1 -0
- aip_agents/a2ui/middleware.py +754 -0
- aip_agents/a2ui/models.py +153 -0
- aip_agents/a2ui/public_url.py +138 -0
- aip_agents/a2ui/stream_filter.py +67 -0
- aip_agents/agent/__init__.py +72 -0
- aip_agents/agent/base_agent.py +1437 -0
- aip_agents/agent/base_langgraph_agent.py +4048 -0
- aip_agents/agent/google_adk_agent.py +932 -0
- aip_agents/agent/google_adk_constants.py +11 -0
- aip_agents/agent/graph_runtime.py +185 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langgraph_react_agent.py +3741 -0
- aip_agents/agent/model_invocation_adapter.py +346 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/tool_execution_engine.py +587 -0
- aip_agents/audio_interface/__init__.py +30 -0
- aip_agents/audio_interface/audio_agent_adapter.py +254 -0
- aip_agents/audio_interface/config.py +146 -0
- aip_agents/audio_interface/errors.py +15 -0
- aip_agents/audio_interface/livekit_audio_session.py +504 -0
- aip_agents/audio_interface/livekit_realtime_audio_session.py +142 -0
- aip_agents/audio_interface/session_factory.py +40 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/common/__init__.py +5 -0
- aip_agents/common/callable_introspection.py +17 -0
- aip_agents/constants.py +23 -0
- aip_agents/context/__init__.py +5 -0
- aip_agents/context/budget.py +237 -0
- aip_agents/context/compaction.py +339 -0
- aip_agents/context/metadata.py +169 -0
- aip_agents/context/offload.py +449 -0
- aip_agents/context/preparation.py +196 -0
- aip_agents/context/prompt.py +61 -0
- aip_agents/context/runtime.py +149 -0
- aip_agents/context/session_recall.py +69 -0
- aip_agents/context/state.py +48 -0
- aip_agents/context/utils.py +44 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/audio_livekit_session.py +116 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_server.py +141 -0
- aip_agents/examples/gl_connectors_smoke.py +148 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +104 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +77 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +80 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +91 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +83 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +131 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -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_server.py +250 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_filesystem.py +162 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_skills.py +62 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_client.py +57 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_server.py +131 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc_custom_tools.py +83 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +100 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_server.py +113 -0
- aip_agents/examples/hitl_demo.py +724 -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_server.py +125 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +246 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +87 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/multiply_tool.py +43 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/integration/__init__.py +43 -0
- aip_agents/integration/agent.py +58 -0
- aip_agents/integration/guardrails.py +52 -0
- aip_agents/integration/hitl.py +71 -0
- aip_agents/integration/ptc.py +95 -0
- aip_agents/integration/skills.py +37 -0
- aip_agents/integration/storage.py +81 -0
- aip_agents/integration/version.py +103 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/client/__init__.py +60 -0
- aip_agents/mcp/client/base_mcp_client.py +377 -0
- aip_agents/mcp/client/connection_manager.py +231 -0
- aip_agents/mcp/client/errors.py +119 -0
- aip_agents/mcp/client/google_adk/__init__.py +45 -0
- aip_agents/mcp/client/google_adk/client.py +383 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/persistent_session.py +704 -0
- aip_agents/mcp/client/session_pool.py +358 -0
- aip_agents/mcp/client/transports.py +288 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/base_adapter.py +815 -0
- aip_agents/memory/adapters/mem0.py +286 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/middleware/__init__.py +65 -0
- aip_agents/middleware/backends/__init__.py +72 -0
- aip_agents/middleware/backends/in_memory.py +578 -0
- aip_agents/middleware/backends/local_disk.py +1203 -0
- aip_agents/middleware/backends/protocol.py +353 -0
- aip_agents/middleware/backends/sandbox.py +1431 -0
- aip_agents/middleware/backends/sandbox_files.py +113 -0
- aip_agents/middleware/backends/utils.py +293 -0
- aip_agents/middleware/base.py +239 -0
- aip_agents/middleware/filesystem.py +690 -0
- aip_agents/middleware/manager.py +291 -0
- aip_agents/middleware/memory.py +532 -0
- aip_agents/middleware/pii_middleware.py +192 -0
- aip_agents/middleware/schema.py +19 -0
- aip_agents/middleware/skills.py +872 -0
- aip_agents/middleware/task_delegation.py +1656 -0
- aip_agents/middleware/todolist.py +276 -0
- aip_agents/middleware/tools/__init__.py +23 -0
- aip_agents/middleware/tools/edit_file.py +70 -0
- aip_agents/middleware/tools/execute.py +428 -0
- aip_agents/middleware/tools/grep_file.py +79 -0
- aip_agents/middleware/tools/ls.py +71 -0
- aip_agents/middleware/tools/read_file.py +239 -0
- aip_agents/middleware/tools/skill_load.py +193 -0
- aip_agents/middleware/tools/skill_resource.py +338 -0
- aip_agents/middleware/tools/write_file.py +114 -0
- aip_agents/middleware/vision.py +322 -0
- aip_agents/ptc/__init__.py +87 -0
- aip_agents/ptc/custom_tools.py +511 -0
- aip_agents/ptc/custom_tools_payload.py +499 -0
- aip_agents/ptc/custom_tools_templates/__init__.py +1 -0
- aip_agents/ptc/custom_tools_templates/custom_build_function.py.template +24 -0
- aip_agents/ptc/custom_tools_templates/custom_init.py.template +26 -0
- aip_agents/ptc/custom_tools_templates/custom_invoke.py.template +149 -0
- aip_agents/ptc/custom_tools_templates/custom_registry.py.template +112 -0
- aip_agents/ptc/custom_tools_templates/custom_sources_init.py.template +7 -0
- aip_agents/ptc/custom_tools_templates/custom_wrapper.py.template +87 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/exceptions.py +57 -0
- aip_agents/ptc/executor.py +627 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +679 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +240 -0
- aip_agents/ptc/naming.py +430 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/prompt_builder.py +674 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/sandbox_bridge.py +297 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/ptc/tool_def_helpers.py +101 -0
- aip_agents/ptc/tool_enrichment.py +163 -0
- aip_agents/resilience/__init__.py +10 -0
- aip_agents/resilience/base.py +46 -0
- aip_agents/resilience/tool.py +1661 -0
- aip_agents/sandbox/__init__.py +62 -0
- aip_agents/sandbox/defaults.py +220 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1-datasaur.Dockerfile +120 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1.Dockerfile +100 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2-datasaur.Dockerfile +143 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2.Dockerfile +119 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3-datasaur.Dockerfile +173 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3.Dockerfile +130 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.Dockerfile +164 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.patch_js_context.py +41 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.requirements.txt +29 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2.Dockerfile +87 -0
- aip_agents/sandbox/e2b_runtime.py +27 -0
- aip_agents/sandbox/image_registry.py +98 -0
- aip_agents/sandbox/providers/__init__.py +76 -0
- aip_agents/sandbox/providers/base.py +392 -0
- aip_agents/sandbox/providers/bedrock.py +28 -0
- aip_agents/sandbox/providers/e2b.py +230 -0
- aip_agents/sandbox/providers/opensandbox.py +163 -0
- aip_agents/sandbox/sandbox_runtime.py +967 -0
- aip_agents/sandbox/template_builder.py +240 -0
- aip_agents/sandbox/types.py +141 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/schema/__init__.py +106 -0
- aip_agents/schema/a2a.py +58 -0
- aip_agents/schema/agent.py +117 -0
- aip_agents/schema/artifacts.py +75 -0
- aip_agents/schema/attachments.py +425 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/langgraph.py +47 -0
- aip_agents/schema/model_id.py +103 -0
- aip_agents/schema/model_usage.py +50 -0
- aip_agents/schema/runtime_metadata.py +78 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/tool_payloads.py +68 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/sentry.py +267 -0
- aip_agents/skills/__init__.py +30 -0
- aip_agents/skills/errors.py +110 -0
- aip_agents/skills/installer.py +479 -0
- aip_agents/skills/models.py +769 -0
- aip_agents/skills/stager.py +224 -0
- aip_agents/skills/validation.py +53 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/tools/__init__.py +65 -0
- aip_agents/tools/agent_schedule_tool.py +392 -0
- aip_agents/tools/browser_use/__init__.py +83 -0
- aip_agents/tools/browser_use/action_parser.py +104 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1118 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/minio_storage.py +203 -0
- aip_agents/tools/browser_use/schemas.py +121 -0
- aip_agents/tools/browser_use/session.py +13 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/steel_session_recording.py +321 -0
- aip_agents/tools/browser_use/streaming.py +263 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/types.py +37 -0
- aip_agents/tools/code_sandbox/__init__.py +48 -0
- aip_agents/tools/code_sandbox/code_sandbox_tool.py +350 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +346 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +65 -0
- aip_agents/tools/computer_use/__init__.py +75 -0
- aip_agents/tools/computer_use/computer_use_tool.py +910 -0
- aip_agents/tools/computer_use/schemas.py +78 -0
- aip_agents/tools/computer_use/streaming.py +198 -0
- aip_agents/tools/computer_use/types.py +32 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/execute_ptc_code.py +582 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/tool.py +518 -0
- aip_agents/tools/gl_connector_tools.py +170 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/base.py +213 -0
- aip_agents/tools/memory_search/mem0.py +424 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/streaming_common.py +577 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/types/__init__.py +73 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/utils/__init__.py +91 -0
- aip_agents/utils/a2a_connector.py +1758 -0
- aip_agents/utils/artifact_helpers.py +542 -0
- aip_agents/utils/artifacts/__init__.py +20 -0
- aip_agents/utils/artifacts/tracker.py +367 -0
- aip_agents/utils/attachment_helpers.py +178 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/file_prompt_utils.py +276 -0
- aip_agents/utils/file_watchers/__init__.py +33 -0
- aip_agents/utils/file_watchers/base.py +46 -0
- aip_agents/utils/file_watchers/e2b.py +128 -0
- aip_agents/utils/file_watchers/factory.py +39 -0
- aip_agents/utils/file_watchers/ls_diff.py +88 -0
- aip_agents/utils/file_watchers/sandbox.py +66 -0
- aip_agents/utils/file_watchers/watchdog.py +97 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/formatter_llm_client.py +258 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/converter.py +399 -0
- aip_agents/utils/langgraph/delegation_context.py +22 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1329 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +822 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata_helper.py +363 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/pii/__init__.py +29 -0
- aip_agents/utils/pii/pii_handler.py +555 -0
- aip_agents/utils/pii/pii_helper.py +225 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/sse_chunk_transformer.py +836 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/token_usage_helper.py +531 -0
- aip_agents_binary-0.0.0.dist-info/METADATA +825 -0
- aip_agents_binary-0.0.0.dist-info/RECORD +447 -0
- aip_agents_binary-0.0.0.dist-info/WHEEL +5 -0
- aip_agents_binary-0.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"""Mem0-specific adapter built on top of the BaseMemoryAdapter.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import os
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from aip_agents.memory.adapters.base_adapter import DEFAULT_SCOPE, BaseMemoryAdapter, _RetrieveOptions
|
|
14
|
+
from aip_agents.memory.constants import MemoryDefaults
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
# The hosted search API does not support pagination (only top_k). When
|
|
19
|
+
# cross-agent noise fills the top N slots, client-side filtering may return
|
|
20
|
+
# fewer results than requested. Use a generous window to reduce this risk.
|
|
21
|
+
# TODO: replace with paginated search when the backend supports it.
|
|
22
|
+
_HOSTED_SEARCH_WINDOW = 100
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
from gllm_memory import MemoryManager
|
|
26
|
+
|
|
27
|
+
_HAS_GLLM_MEMORY = True
|
|
28
|
+
except ImportError: # pragma: no cover
|
|
29
|
+
MemoryManager = Any # type: ignore[assignment]
|
|
30
|
+
_HAS_GLLM_MEMORY = False
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class Mem0Memory(BaseMemoryAdapter):
|
|
34
|
+
"""Mem0-backed long-term memory adapter using the gllm_memory SDK."""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
*,
|
|
39
|
+
agent_id: str,
|
|
40
|
+
namespace: str | None = None,
|
|
41
|
+
limit: int = MemoryDefaults.RETRIEVAL_LIMIT,
|
|
42
|
+
max_chars: int = MemoryDefaults.MAX_CHARS,
|
|
43
|
+
host: str | None = None,
|
|
44
|
+
instruction: str | None = None,
|
|
45
|
+
) -> None:
|
|
46
|
+
"""Initialize the Mem0 memory adapter.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
agent_id: Unique identifier for the agent using this memory.
|
|
50
|
+
namespace: Optional namespace for organizing memories.
|
|
51
|
+
limit: Maximum number of memories to retrieve in search operations.
|
|
52
|
+
max_chars: Maximum character length for text content.
|
|
53
|
+
host: Optional host URL for the Mem0 service.
|
|
54
|
+
instruction: Optional instruction text for memory operations.
|
|
55
|
+
"""
|
|
56
|
+
if not _HAS_GLLM_MEMORY:
|
|
57
|
+
raise ImportError("optional dependency 'gllm-memory' is required for Mem0Memory")
|
|
58
|
+
|
|
59
|
+
resolved_host = host or os.getenv("MEM0_HOST") or os.getenv("GLLM_MEMORY_HOST")
|
|
60
|
+
resolved_api_key = self._resolve_api_key()
|
|
61
|
+
self._uses_hosted_backend = bool(resolved_host or resolved_api_key)
|
|
62
|
+
manager = self._initialize_manager(host=resolved_host, instruction=instruction, api_key=resolved_api_key)
|
|
63
|
+
super().__init__(
|
|
64
|
+
agent_id=agent_id,
|
|
65
|
+
manager=manager,
|
|
66
|
+
namespace=namespace,
|
|
67
|
+
limit=limit,
|
|
68
|
+
max_chars=max_chars,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def validate_env(cls) -> None:
|
|
73
|
+
"""Ensure the Mem0 API key or host is available."""
|
|
74
|
+
host = os.getenv("MEM0_HOST") or os.getenv("GLLM_MEMORY_HOST")
|
|
75
|
+
if host:
|
|
76
|
+
return # Host is sufficient
|
|
77
|
+
api_key = os.getenv("MEM0_API_KEY") or os.getenv("GLLM_MEMORY_API_KEY")
|
|
78
|
+
if not api_key:
|
|
79
|
+
raise ValueError(
|
|
80
|
+
"Either MEM0_HOST (or GLLM_MEMORY_HOST) or "
|
|
81
|
+
"MEM0_API_KEY (or GLLM_MEMORY_API_KEY) must be configured for Mem0 access."
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
@staticmethod
|
|
85
|
+
def _resolve_api_key() -> str | None:
|
|
86
|
+
"""Resolve the Mem0 API key from environment.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
The API key if set, or None if only host-based auth is used.
|
|
90
|
+
"""
|
|
91
|
+
return os.getenv("MEM0_API_KEY") or os.getenv("GLLM_MEMORY_API_KEY") or None
|
|
92
|
+
|
|
93
|
+
def _initialize_manager(
|
|
94
|
+
self, host: str | None, instruction: str | None, api_key: str | None = None
|
|
95
|
+
) -> MemoryManager:
|
|
96
|
+
"""Create a MemoryManager tailored for the Mem0 backend.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
host: Optional host URL for the Mem0 service.
|
|
100
|
+
instruction: Optional instruction text for memory operations.
|
|
101
|
+
api_key: Optional pre-resolved API key; re-reads env if not provided.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
Configured MemoryManager instance for Mem0.
|
|
105
|
+
"""
|
|
106
|
+
resolved_host = host or os.getenv("MEM0_HOST") or os.getenv("GLLM_MEMORY_HOST")
|
|
107
|
+
resolved_instruction = instruction or os.getenv("GLLM_MEMORY_INSTRUCTION")
|
|
108
|
+
resolved_api_key = api_key if api_key is not None else (self._resolve_api_key() or "")
|
|
109
|
+
if not resolved_host and not resolved_api_key:
|
|
110
|
+
raise ValueError( # pragma: no cover
|
|
111
|
+
"Either MEM0_HOST (or GLLM_MEMORY_HOST) or "
|
|
112
|
+
"MEM0_API_KEY (or GLLM_MEMORY_API_KEY) must be configured for Mem0 access."
|
|
113
|
+
)
|
|
114
|
+
return MemoryManager(
|
|
115
|
+
api_key=resolved_api_key,
|
|
116
|
+
host=resolved_host,
|
|
117
|
+
instruction=resolved_instruction,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
def _create_retrieve_task(self, query: str | None, options: _RetrieveOptions) -> Any:
|
|
121
|
+
if not self._uses_hosted_backend:
|
|
122
|
+
return super()._create_retrieve_task(query, options) # pragma: no cover
|
|
123
|
+
|
|
124
|
+
if query:
|
|
125
|
+
# Use a generous search window — cross-agent noise can otherwise
|
|
126
|
+
# exhaust top_k before we find enough matching chunks to return.
|
|
127
|
+
window = max(_HOSTED_SEARCH_WINDOW, options.top_k)
|
|
128
|
+
task = self._manager.search(
|
|
129
|
+
query=query,
|
|
130
|
+
user_id=options.user_id,
|
|
131
|
+
agent_id=None,
|
|
132
|
+
scopes=DEFAULT_SCOPE,
|
|
133
|
+
metadata=None,
|
|
134
|
+
top_k=window,
|
|
135
|
+
)
|
|
136
|
+
else:
|
|
137
|
+
task = self._manager.list_memories(
|
|
138
|
+
user_id=options.user_id,
|
|
139
|
+
agent_id=None,
|
|
140
|
+
scopes=DEFAULT_SCOPE,
|
|
141
|
+
metadata=None,
|
|
142
|
+
keywords=options.keywords,
|
|
143
|
+
page=options.page,
|
|
144
|
+
page_size=options.top_k,
|
|
145
|
+
)
|
|
146
|
+
return self._filter_hosted_scope(task, limit=options.top_k if query else None)
|
|
147
|
+
|
|
148
|
+
def delete_by_query(
|
|
149
|
+
self,
|
|
150
|
+
*,
|
|
151
|
+
query: str,
|
|
152
|
+
user_id: str,
|
|
153
|
+
top_k: int | None = None,
|
|
154
|
+
threshold: float | None = 0.3,
|
|
155
|
+
filters: dict[str, Any] | None = None,
|
|
156
|
+
) -> list[dict[str, Any]]:
|
|
157
|
+
"""Delete hosted mem0 memories by user-scoped search when metadata filters are unsupported."""
|
|
158
|
+
options = self._build_retrieve_options(user_id=user_id, limit=top_k, filters=filters, page=None)
|
|
159
|
+
if not self._uses_hosted_backend:
|
|
160
|
+
return super().delete_by_query( # pragma: no cover
|
|
161
|
+
query=query,
|
|
162
|
+
user_id=user_id,
|
|
163
|
+
top_k=top_k,
|
|
164
|
+
threshold=threshold,
|
|
165
|
+
filters=filters,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
# Use a larger search window to reduce the chance that cross-agent
|
|
170
|
+
# noise exhausts top_k before we find all matching memories.
|
|
171
|
+
window = max(_HOSTED_SEARCH_WINDOW, options.top_k)
|
|
172
|
+
chunks = self._runner.run(
|
|
173
|
+
self._filter_hosted_scope(
|
|
174
|
+
self._manager.search(
|
|
175
|
+
query=query,
|
|
176
|
+
user_id=options.user_id,
|
|
177
|
+
agent_id=None,
|
|
178
|
+
scopes=DEFAULT_SCOPE,
|
|
179
|
+
metadata=None,
|
|
180
|
+
threshold=threshold,
|
|
181
|
+
top_k=window,
|
|
182
|
+
),
|
|
183
|
+
limit=options.top_k,
|
|
184
|
+
)
|
|
185
|
+
)
|
|
186
|
+
memory_ids = [str(chunk.id) for chunk in chunks if getattr(chunk, "id", None)]
|
|
187
|
+
if not memory_ids:
|
|
188
|
+
return []
|
|
189
|
+
# Deletion by IDs is deterministic (no search window issue).
|
|
190
|
+
deleted = self._delete_hosted_memory_ids(memory_ids=memory_ids, user_id=options.user_id)
|
|
191
|
+
except Exception as exc: # noqa: BLE001
|
|
192
|
+
logger.warning("Mem0Memory.delete_by_query hosted path error: %s", exc)
|
|
193
|
+
return []
|
|
194
|
+
|
|
195
|
+
return [self._chunk_to_hit(chunk) for chunk in deleted]
|
|
196
|
+
|
|
197
|
+
def delete(
|
|
198
|
+
self,
|
|
199
|
+
*,
|
|
200
|
+
memory_ids: list[str] | None,
|
|
201
|
+
user_id: str,
|
|
202
|
+
metadata: dict[str, Any] | None = None,
|
|
203
|
+
categories: list[str] | None = None,
|
|
204
|
+
) -> Any:
|
|
205
|
+
"""Delete hosted mem0 memories while avoiding unsupported metadata filters.
|
|
206
|
+
|
|
207
|
+
The hosted backend's agent_id/metadata filtering is broken, so the
|
|
208
|
+
clear-all path always uses the hosted workaround (list+filter locally)
|
|
209
|
+
regardless of metadata/categories — those filters are best-effort and
|
|
210
|
+
applied server-side only when routing through super().
|
|
211
|
+
"""
|
|
212
|
+
if memory_ids is not None or not self._uses_hosted_backend:
|
|
213
|
+
return super().delete(memory_ids=memory_ids, user_id=user_id, metadata=metadata, categories=categories)
|
|
214
|
+
|
|
215
|
+
effective_user = user_id or self.agent_id or MemoryDefaults.DEFAULT_USER_ID
|
|
216
|
+
try:
|
|
217
|
+
scoped_ids: list[str] = []
|
|
218
|
+
page = 1
|
|
219
|
+
page_size = 100
|
|
220
|
+
while True:
|
|
221
|
+
chunks = self._runner.run(
|
|
222
|
+
self._manager.list_memories(
|
|
223
|
+
user_id=effective_user,
|
|
224
|
+
agent_id=None,
|
|
225
|
+
scopes=DEFAULT_SCOPE,
|
|
226
|
+
metadata=None,
|
|
227
|
+
page=page,
|
|
228
|
+
page_size=page_size,
|
|
229
|
+
)
|
|
230
|
+
)
|
|
231
|
+
scoped_ids.extend(
|
|
232
|
+
str(chunk.id)
|
|
233
|
+
for chunk in chunks
|
|
234
|
+
if getattr(chunk, "id", None) and self._hosted_chunk_matches_scope(chunk)
|
|
235
|
+
)
|
|
236
|
+
if len(chunks) < page_size:
|
|
237
|
+
break
|
|
238
|
+
page += 1
|
|
239
|
+
if not scoped_ids:
|
|
240
|
+
return []
|
|
241
|
+
return self._delete_hosted_memory_ids(memory_ids=scoped_ids, user_id=effective_user)
|
|
242
|
+
except Exception as exc: # noqa: BLE001
|
|
243
|
+
logger.warning("Mem0Memory.delete hosted path error: %s", exc)
|
|
244
|
+
return []
|
|
245
|
+
|
|
246
|
+
def _delete_hosted_memory_ids(self, *, memory_ids: list[str], user_id: str) -> Any:
|
|
247
|
+
deleted = self._runner.run(
|
|
248
|
+
self._manager.delete(
|
|
249
|
+
memory_ids=memory_ids,
|
|
250
|
+
user_id=user_id,
|
|
251
|
+
agent_id=self.agent_id,
|
|
252
|
+
scopes=DEFAULT_SCOPE,
|
|
253
|
+
metadata=None,
|
|
254
|
+
)
|
|
255
|
+
)
|
|
256
|
+
if deleted:
|
|
257
|
+
return deleted
|
|
258
|
+
return self._runner.run(
|
|
259
|
+
self._manager.delete(
|
|
260
|
+
memory_ids=memory_ids,
|
|
261
|
+
user_id=user_id,
|
|
262
|
+
agent_id=None,
|
|
263
|
+
scopes=DEFAULT_SCOPE,
|
|
264
|
+
metadata=None,
|
|
265
|
+
)
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
async def _filter_hosted_scope(self, task: Any, limit: int | None = None) -> list[Any]:
|
|
269
|
+
chunks = await task
|
|
270
|
+
scoped = [chunk for chunk in chunks if self._hosted_chunk_matches_scope(chunk)]
|
|
271
|
+
return scoped[:limit] if limit is not None else scoped
|
|
272
|
+
|
|
273
|
+
def _hosted_chunk_matches_scope(self, chunk: Any) -> bool:
|
|
274
|
+
"""Return True when the chunk belongs to this adapter's scope.
|
|
275
|
+
|
|
276
|
+
When the chunk has no target/agent_id metadata, always reject —
|
|
277
|
+
self.agent_id is never None/empty (coerced to DEFAULT_USER_ID in
|
|
278
|
+
BaseMemoryAdapter.__init__), so the previously-documented "unscoped
|
|
279
|
+
mode" was unreachable dead code. When the chunk has a target, it
|
|
280
|
+
must match this adapter's agent_id exactly.
|
|
281
|
+
"""
|
|
282
|
+
metadata = dict(getattr(chunk, "metadata", {}) or {})
|
|
283
|
+
target = metadata.get("target") or metadata.get("agent_id")
|
|
284
|
+
if target in (None, ""):
|
|
285
|
+
return False
|
|
286
|
+
return target == self.agent_id
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Base Memory Module for AIP Agents.
|
|
2
|
+
|
|
3
|
+
This module defines the BaseMemory class which serves as a template
|
|
4
|
+
for implementing different types of memory for agents.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
8
|
+
|
|
9
|
+
References:
|
|
10
|
+
https://github.com/GDP-ADMIN/gdplabs-exploration/blob/ai-agent-app/backend/aip_agents/memory/base.py
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from abc import ABC, abstractmethod
|
|
14
|
+
from collections.abc import Sequence
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from aip_agents.types import ChatMessage
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class BaseMemory(ABC):
|
|
21
|
+
"""Base class for agent memory.
|
|
22
|
+
|
|
23
|
+
This concrete base class provides a default structure. Subclasses
|
|
24
|
+
can inherit from this class to implement specific memory management
|
|
25
|
+
behaviors.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def validate_env(cls) -> None: # pragma: no cover - default no-op
|
|
30
|
+
"""Validate environment prerequisites for a memory backend.
|
|
31
|
+
|
|
32
|
+
This hook allows memory implementations to fail fast when required
|
|
33
|
+
environment variables or credentials are missing. Default is a no-op.
|
|
34
|
+
"""
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def get_messages(self) -> list[ChatMessage]:
|
|
39
|
+
"""Retrieve a list of messages.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
List[ChatMessage]: A list of messages in a generic format.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def add_message(self, message: ChatMessage) -> None:
|
|
47
|
+
"""Add a message to the memory.
|
|
48
|
+
|
|
49
|
+
Adds a single ChatMessage to the memory storage. The exact implementation
|
|
50
|
+
depends on the specific memory backend.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
message: The ChatMessage object to add to memory. The message should
|
|
54
|
+
contain role and content information.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def add_messages(self, messages: Sequence[ChatMessage]) -> None:
|
|
58
|
+
"""Add multiple messages to the memory.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
messages: A sequence of ChatMessage objects to add.
|
|
62
|
+
"""
|
|
63
|
+
for message in messages:
|
|
64
|
+
self.add_message(message)
|
|
65
|
+
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def clear(self) -> None:
|
|
68
|
+
"""Clears the memory or resets the state of the agent.
|
|
69
|
+
|
|
70
|
+
This method must be implemented to define the specific behavior
|
|
71
|
+
for clearing or resetting the memory of the agent.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
def get_memory_variables(self) -> dict[str, Any]:
|
|
75
|
+
"""Retrieve memory variables.
|
|
76
|
+
|
|
77
|
+
This method returns a dictionary containing memory-related variables.
|
|
78
|
+
The default implementation returns a dictionary with chat_history.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
Dict[str, Any]: A dictionary where keys are variable names and values
|
|
82
|
+
are the corresponding memory-related data.
|
|
83
|
+
"""
|
|
84
|
+
return {"chat_history": self.get_messages()}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Memory constants for AIP Agents.
|
|
2
|
+
|
|
3
|
+
This module defines constants for memory-related method names and other
|
|
4
|
+
memory-related constants to avoid magic strings and numbers throughout the codebase.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MemoryMethod:
|
|
12
|
+
"""Constants for memory method names used in hasattr checks."""
|
|
13
|
+
|
|
14
|
+
SEARCH = "search"
|
|
15
|
+
SAVE_INTERACTION = "save_interaction"
|
|
16
|
+
FORMAT_HITS = "format_hits"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class MemoryDefaults:
|
|
20
|
+
"""Default values for memory configuration parameters."""
|
|
21
|
+
|
|
22
|
+
# Memory retrieval and formatting limits
|
|
23
|
+
MAX_ITEMS = 8 # Maximum number of memory items to include in formatted output
|
|
24
|
+
RETRIEVAL_LIMIT = 5 # Default number of memories to retrieve per search
|
|
25
|
+
MAX_CHARS = 1500 # Maximum characters per memory entry when saving
|
|
26
|
+
|
|
27
|
+
# Logging and display
|
|
28
|
+
LOG_PREVIEW_LENGTH = 100 # Length of text preview in logs
|
|
29
|
+
SMALL_PREVIEW_LENGTH = 16 # Length of text preview in logs
|
|
30
|
+
|
|
31
|
+
# Agent ID generation
|
|
32
|
+
AGENT_ID_PREFIX = "agent-" # Prefix for generated agent IDs
|
|
33
|
+
|
|
34
|
+
# Memory formatting
|
|
35
|
+
MEMORY_TAG_OPEN = "<RELEVANT_MEMORY>"
|
|
36
|
+
MEMORY_TAG_CLOSE = "</RELEVANT_MEMORY>"
|
|
37
|
+
|
|
38
|
+
# Default user ID for compatibility
|
|
39
|
+
DEFAULT_USER_ID = "default"
|
|
40
|
+
|
|
41
|
+
# Date format constants
|
|
42
|
+
DATE_STRING_LENGTH = 10 # Length of "YYYY-MM-DD" format strings
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class MemoryBackends:
|
|
46
|
+
"""Supported memory backend identifiers."""
|
|
47
|
+
|
|
48
|
+
MEM0 = "mem0"
|
|
49
|
+
SUPPORTED = frozenset({MEM0})
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Memory factory for creating memory adapters by backend string.
|
|
2
|
+
|
|
3
|
+
This module provides a single point of construction for memory backends,
|
|
4
|
+
so agent code does not depend on concrete memory implementations.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import importlib
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from aip_agents.memory.base import BaseMemory
|
|
14
|
+
from aip_agents.utils.logger import get_logger
|
|
15
|
+
|
|
16
|
+
logger = get_logger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
BACKENDS = {
|
|
20
|
+
# backend_name: "module_path:ClassName"
|
|
21
|
+
"mem0": "aip_agents.memory.adapters.mem0:Mem0Memory",
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _import_class(path: str) -> type[BaseMemory]:
|
|
26
|
+
"""Import a memory class from a module path string.
|
|
27
|
+
|
|
28
|
+
Dynamically imports a memory implementation class from a string path in
|
|
29
|
+
the format "module_path:ClassName".
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
path: A string in the format "module_path:ClassName" specifying the
|
|
33
|
+
module and class to import.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
type[BaseMemory]: The imported memory class that implements the
|
|
37
|
+
BaseMemory interface.
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
ModuleNotFoundError: If the specified module cannot be imported.
|
|
41
|
+
AttributeError: If the specified class does not exist in the module.
|
|
42
|
+
ValueError: If the path format is invalid (does not contain ':').
|
|
43
|
+
"""
|
|
44
|
+
module_path, class_name = path.split(":", 1)
|
|
45
|
+
module = importlib.import_module(module_path)
|
|
46
|
+
memory_cls = getattr(module, class_name)
|
|
47
|
+
return memory_cls
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class MemoryFactory:
|
|
51
|
+
"""Factory to build concrete memory adapters by backend name."""
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def create(backend: str, **kwargs: Any) -> BaseMemory:
|
|
55
|
+
"""Create a memory adapter instance.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
backend: Backend identifier (e.g., "mem0").
|
|
59
|
+
**kwargs: Keyword args passed to adapter constructor (e.g., limit, max_chars, namespace).
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
BaseMemory: A constructed memory adapter instance.
|
|
63
|
+
|
|
64
|
+
Raises:
|
|
65
|
+
ValueError: If backend is unknown or adapter can't be constructed.
|
|
66
|
+
"""
|
|
67
|
+
if backend not in BACKENDS:
|
|
68
|
+
raise ValueError(f"Unknown memory backend: {backend}")
|
|
69
|
+
|
|
70
|
+
cls_path = BACKENDS[backend]
|
|
71
|
+
memory_cls = _import_class(cls_path)
|
|
72
|
+
|
|
73
|
+
# Validate environment (adapter may raise)
|
|
74
|
+
try:
|
|
75
|
+
if hasattr(memory_cls, "validate_env"):
|
|
76
|
+
memory_cls.validate_env() # type: ignore[misc]
|
|
77
|
+
except Exception as e: # noqa: BLE001
|
|
78
|
+
logger.error(f"MemoryFactory: environment validation failed for '{backend}': {e}")
|
|
79
|
+
raise
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
instance = memory_cls(**kwargs)
|
|
83
|
+
return instance
|
|
84
|
+
except Exception as e: # noqa: BLE001
|
|
85
|
+
logger.error(f"MemoryFactory: failed to create memory adapter '{backend}': {e}")
|
|
86
|
+
raise
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Guidance text helpers for Mem0-based memory recall.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
- Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import textwrap
|
|
8
|
+
|
|
9
|
+
MEM0_MEMORY_RECALL_GUIDANCE = textwrap.dedent("""
|
|
10
|
+
Memory Recall Guidance:
|
|
11
|
+
- Use `built_in_mem0_search` whenever you need facts from long-term memory.
|
|
12
|
+
- You can also use `built_in_mem0_search` for explicit recall or recap requests of
|
|
13
|
+
conversation/chat/discussion by the user.
|
|
14
|
+
Reach for it when prior context such as but not limited to: names, decisions, or
|
|
15
|
+
preferences, will help you respond.
|
|
16
|
+
It is also appropriate when the user asks about the AI's previous responses.
|
|
17
|
+
- Provide a concise `query` that describes what you are looking for (e.g., 'project plan', 'user preferences').
|
|
18
|
+
- If the user specifies a time period for a memory, set `time_period` according to user query
|
|
19
|
+
to retrieve memories based on that time period.
|
|
20
|
+
""").strip()
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Simple Memory Module for AIP Agents.
|
|
2
|
+
|
|
3
|
+
This module provides a basic implementation of the BaseMemory class
|
|
4
|
+
that stores messages in a simple list structure.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from aip_agents.memory.base import BaseMemory, ChatMessage
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SimpleMemory(BaseMemory):
|
|
14
|
+
"""A simple memory implementation that stores messages in a list."""
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
"""Initialize the SimpleMemory instance with an empty message list."""
|
|
18
|
+
self.messages: list[ChatMessage] = []
|
|
19
|
+
|
|
20
|
+
def add_message(self, message_or_role: ChatMessage | str, content: str | None = None) -> None:
|
|
21
|
+
"""Add a message to memory.
|
|
22
|
+
|
|
23
|
+
Supports two calling patterns for backward compatibility:
|
|
24
|
+
1. add_message(ChatMessage) - Adds a ChatMessage object directly
|
|
25
|
+
2. add_message(role, content) - Creates and adds a ChatMessage with the given role and content
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
message_or_role: Either a ChatMessage object or a string role (e.g., "user", "assistant").
|
|
29
|
+
content: Optional content string when using the role+content pattern.
|
|
30
|
+
Required when message_or_role is a string role.
|
|
31
|
+
"""
|
|
32
|
+
if content is not None:
|
|
33
|
+
# Using the role+content pattern
|
|
34
|
+
self.messages.append(ChatMessage(role=message_or_role, content=content))
|
|
35
|
+
else:
|
|
36
|
+
# Using the ChatMessage object pattern
|
|
37
|
+
self.messages.append(message_or_role)
|
|
38
|
+
|
|
39
|
+
def get_messages(self) -> list[ChatMessage]:
|
|
40
|
+
"""Get all messages from memory."""
|
|
41
|
+
return self.messages
|
|
42
|
+
|
|
43
|
+
def clear(self) -> None:
|
|
44
|
+
"""Clear all messages from memory."""
|
|
45
|
+
self.messages = []
|
|
46
|
+
|
|
47
|
+
# Uses the default get_memory_variables implementation from BaseMemory
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Middleware package.
|
|
2
|
+
|
|
3
|
+
Provides composable middleware components for enhancing agent capabilities with
|
|
4
|
+
planning, file storage, memory, and custom lifecycle hooks.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING, Any
|
|
11
|
+
|
|
12
|
+
from aip_agents.middleware.base import AgentMiddleware, ModelRequest
|
|
13
|
+
from aip_agents.middleware.filesystem import FilesystemMiddleware
|
|
14
|
+
from aip_agents.middleware.manager import MiddlewareManager
|
|
15
|
+
from aip_agents.middleware.memory import MemoryMiddleware
|
|
16
|
+
from aip_agents.middleware.pii_middleware import PIIMiddleware
|
|
17
|
+
from aip_agents.middleware.task_delegation import TaskDelegationConfig, TaskDelegationMiddleware
|
|
18
|
+
from aip_agents.middleware.todolist import TodoListMiddleware, TodoStatus
|
|
19
|
+
from aip_agents.middleware.vision import VisionMiddleware
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from aip_agents.middleware.skills import SkillsMiddleware
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"AgentMiddleware",
|
|
26
|
+
"FilesystemMiddleware",
|
|
27
|
+
"ModelRequest",
|
|
28
|
+
"MiddlewareManager",
|
|
29
|
+
"MemoryMiddleware",
|
|
30
|
+
"PIIMiddleware",
|
|
31
|
+
"TaskDelegationConfig",
|
|
32
|
+
"TaskDelegationMiddleware",
|
|
33
|
+
"TodoListMiddleware",
|
|
34
|
+
"TodoStatus",
|
|
35
|
+
"SkillsMiddleware",
|
|
36
|
+
"VisionMiddleware",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def __getattr__(name: str) -> Any:
|
|
41
|
+
"""Lazy import middleware modules to avoid eager optional dependencies.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
name (str): Attribute name requested from this module.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Any: The requested attribute.
|
|
48
|
+
|
|
49
|
+
Raises:
|
|
50
|
+
AttributeError: If the attribute is not defined.
|
|
51
|
+
"""
|
|
52
|
+
if name == "SkillsMiddleware":
|
|
53
|
+
from aip_agents.middleware.skills import SkillsMiddleware as SkillsMiddlewareType
|
|
54
|
+
|
|
55
|
+
return SkillsMiddlewareType
|
|
56
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def __dir__() -> list[str]:
|
|
60
|
+
"""Return module attributes for dir().
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
list[str]: Sorted list of public attributes.
|
|
64
|
+
"""
|
|
65
|
+
return sorted(__all__)
|