aip-agents-binary 0.5.20__py3-none-any.whl → 0.5.22__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__.pyi +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.pyi +232 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
- aip_agents/agent/langgraph_react_agent.pyi +126 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/demo_memory_recall.pyi +58 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -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.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -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.pyi +45 -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.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/{hello_world_langgraph_bosa_twitter.py → hello_world_langgraph_gl_connector_twitter.py} +10 -8
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +8 -7
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.pyi +48 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.pyi +113 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.pyi +123 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.pyi +150 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.pyi +71 -0
- aip_agents/middleware/manager.pyi +80 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +1 -1
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +17 -10
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +26 -6
- aip_agents/tools/__init__.pyi +9 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +86 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +26 -12
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/gl_connector/__init__.py +1 -1
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +104 -45
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +122 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.pyi +19 -0
- aip_agents/tools/memory_search/schema.pyi +15 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +292 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- {aip_agents_binary-0.5.20.dist-info → aip_agents_binary-0.5.22.dist-info}/METADATA +3 -3
- aip_agents_binary-0.5.22.dist-info/RECORD +546 -0
- aip_agents/tools/bosa_tools.py +0 -105
- aip_agents_binary-0.5.20.dist-info/RECORD +0 -280
- {aip_agents_binary-0.5.20.dist-info → aip_agents_binary-0.5.22.dist-info}/WHEEL +0 -0
- {aip_agents_binary-0.5.20.dist-info → aip_agents_binary-0.5.22.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Wrapper for GL Connectors.
|
|
2
2
|
|
|
3
3
|
Authors:
|
|
4
4
|
Saul Sayers (saul.sayers@gdplabs.id)
|
|
5
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
6
|
|
|
6
7
|
Reference:
|
|
7
8
|
https://gl-docs.gitbook.io/bosa/gl-connector/gl-connector
|
|
@@ -13,19 +14,30 @@ import os
|
|
|
13
14
|
from collections.abc import Iterable
|
|
14
15
|
from typing import Any
|
|
15
16
|
|
|
17
|
+
from aip_agents.tools.constants import ToolType
|
|
16
18
|
from bosa_connectors import BosaConnector, BOSAConnectorToolGenerator
|
|
17
19
|
from langchain_core.runnables import RunnableConfig
|
|
18
20
|
from langchain_core.tools import BaseTool
|
|
19
21
|
from pydantic import ConfigDict, PrivateAttr
|
|
20
22
|
|
|
21
|
-
from aip_agents.tools.constants import ToolType
|
|
22
|
-
|
|
23
23
|
_REQUIRED_ENV_VARS: tuple[str, ...] = (
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
24
|
+
"GL_CONNECTORS_BASE_URL",
|
|
25
|
+
"GL_CONNECTORS_API_KEY",
|
|
26
|
+
"GL_CONNECTORS_USERNAME",
|
|
27
|
+
"GL_CONNECTORS_PASSWORD",
|
|
28
28
|
)
|
|
29
|
+
|
|
30
|
+
_ENV_VAR_MAPPING: dict[str, tuple[str, ...]] = {
|
|
31
|
+
"GL_CONNECTORS_BASE_URL": (
|
|
32
|
+
"GL_CONNECTORS_BASE_URL",
|
|
33
|
+
"BOSA_BASE_URL",
|
|
34
|
+
"BOSA_API_BASE_URL",
|
|
35
|
+
),
|
|
36
|
+
"GL_CONNECTORS_API_KEY": ("GL_CONNECTORS_API_KEY", "BOSA_API_KEY"),
|
|
37
|
+
"GL_CONNECTORS_USERNAME": ("GL_CONNECTORS_USERNAME", "BOSA_USERNAME"),
|
|
38
|
+
"GL_CONNECTORS_PASSWORD": ("GL_CONNECTORS_PASSWORD", "BOSA_PASSWORD"),
|
|
39
|
+
"GL_CONNECTORS_IDENTIFIER": ("GL_CONNECTORS_IDENTIFIER", "BOSA_IDENTIFIER"),
|
|
40
|
+
}
|
|
29
41
|
_TOP_LEVEL_KEYS: tuple[str, ...] = (
|
|
30
42
|
"token",
|
|
31
43
|
"identifier",
|
|
@@ -54,7 +66,9 @@ class _InjectedTool(BaseTool):
|
|
|
54
66
|
Returns:
|
|
55
67
|
None
|
|
56
68
|
"""
|
|
57
|
-
base_fields = {
|
|
69
|
+
base_fields = {
|
|
70
|
+
field: getattr(base_tool, field) for field in BaseTool.model_fields
|
|
71
|
+
}
|
|
58
72
|
super().__init__(**base_fields)
|
|
59
73
|
self._base_tool = base_tool
|
|
60
74
|
self._token = token
|
|
@@ -84,7 +98,9 @@ class _InjectedTool(BaseTool):
|
|
|
84
98
|
"""
|
|
85
99
|
return await self._base_tool._arun(*args, **kwargs)
|
|
86
100
|
|
|
87
|
-
def invoke(
|
|
101
|
+
def invoke(
|
|
102
|
+
self, input: Any, config: RunnableConfig | None = None, **kwargs: Any
|
|
103
|
+
) -> Any:
|
|
88
104
|
"""Invoke the tool with token and optional identifier injected.
|
|
89
105
|
|
|
90
106
|
Args:
|
|
@@ -98,7 +114,9 @@ class _InjectedTool(BaseTool):
|
|
|
98
114
|
injected = _inject_params(input, self._token, self._identifier, self._base_tool)
|
|
99
115
|
return super().invoke(injected, config=config, **kwargs)
|
|
100
116
|
|
|
101
|
-
async def ainvoke(
|
|
117
|
+
async def ainvoke(
|
|
118
|
+
self, input: Any, config: RunnableConfig | None = None, **kwargs: Any
|
|
119
|
+
) -> Any:
|
|
102
120
|
"""Invoke the tool asynchronously with token and optional identifier injected.
|
|
103
121
|
|
|
104
122
|
Args:
|
|
@@ -122,7 +140,9 @@ class _InjectedTool(BaseTool):
|
|
|
122
140
|
Returns:
|
|
123
141
|
The result of running the tool with injected parameters.
|
|
124
142
|
"""
|
|
125
|
-
injected = _inject_params(
|
|
143
|
+
injected = _inject_params(
|
|
144
|
+
tool_input, self._token, self._identifier, self._base_tool
|
|
145
|
+
)
|
|
126
146
|
return super().run(injected, **kwargs)
|
|
127
147
|
|
|
128
148
|
async def arun(self, tool_input: Any, **kwargs: Any) -> Any:
|
|
@@ -135,7 +155,9 @@ class _InjectedTool(BaseTool):
|
|
|
135
155
|
Returns:
|
|
136
156
|
The result of running the tool with injected parameters.
|
|
137
157
|
"""
|
|
138
|
-
injected = _inject_params(
|
|
158
|
+
injected = _inject_params(
|
|
159
|
+
tool_input, self._token, self._identifier, self._base_tool
|
|
160
|
+
)
|
|
139
161
|
return await super().arun(injected, **kwargs)
|
|
140
162
|
|
|
141
163
|
|
|
@@ -145,12 +167,12 @@ def GLConnectorTool(
|
|
|
145
167
|
api_key: str | None = None,
|
|
146
168
|
identifier: str | None = None,
|
|
147
169
|
) -> BaseTool:
|
|
148
|
-
"""Create a single GL
|
|
170
|
+
"""Create a single tool from GL Connectors by exact tool name.
|
|
149
171
|
|
|
150
172
|
Args:
|
|
151
173
|
tool_name: Exact tool name (not module name).
|
|
152
|
-
api_key: Optional override for
|
|
153
|
-
identifier: Optional override for
|
|
174
|
+
api_key: Optional override for GL Connectors API key.
|
|
175
|
+
identifier: Optional override for GL Connectors identifier.
|
|
154
176
|
|
|
155
177
|
Returns:
|
|
156
178
|
A single LangChain BaseTool with token injection.
|
|
@@ -159,14 +181,17 @@ def GLConnectorTool(
|
|
|
159
181
|
raise ValueError("tool_name must be a non-empty string")
|
|
160
182
|
|
|
161
183
|
env_values = _load_env(api_key=api_key, identifier=identifier)
|
|
162
|
-
connector = BosaConnector(
|
|
184
|
+
connector = BosaConnector(
|
|
185
|
+
api_base_url=env_values["GL_CONNECTORS_BASE_URL"],
|
|
186
|
+
api_key=env_values["GL_CONNECTORS_API_KEY"],
|
|
187
|
+
)
|
|
163
188
|
|
|
164
189
|
modules = _get_available_modules(connector)
|
|
165
190
|
module_name = _resolve_module(tool_name, modules)
|
|
166
191
|
|
|
167
192
|
generator = BOSAConnectorToolGenerator(
|
|
168
|
-
api_base_url=env_values["
|
|
169
|
-
api_key=env_values["
|
|
193
|
+
api_base_url=env_values["GL_CONNECTORS_BASE_URL"],
|
|
194
|
+
api_key=env_values["GL_CONNECTORS_API_KEY"],
|
|
170
195
|
app_name=module_name,
|
|
171
196
|
)
|
|
172
197
|
tools = generator.generate_tools(tool_type=ToolType.LANGCHAIN)
|
|
@@ -175,18 +200,24 @@ def GLConnectorTool(
|
|
|
175
200
|
if not matching:
|
|
176
201
|
raise ValueError(f"Tool '{tool_name}' not found in module '{module_name}'")
|
|
177
202
|
if len(matching) > 1:
|
|
178
|
-
raise ValueError(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
203
|
+
raise ValueError(
|
|
204
|
+
f"Multiple tools named '{tool_name}' found in module '{module_name}'"
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
token = _create_token(
|
|
208
|
+
connector,
|
|
209
|
+
env_values["GL_CONNECTORS_USERNAME"],
|
|
210
|
+
env_values["GL_CONNECTORS_PASSWORD"],
|
|
211
|
+
)
|
|
212
|
+
return _InjectedTool(matching[0], token, env_values.get("GL_CONNECTORS_IDENTIFIER"))
|
|
182
213
|
|
|
183
214
|
|
|
184
215
|
def _load_env(*, api_key: str | None, identifier: str | None) -> dict[str, str]:
|
|
185
216
|
"""Load and validate environment configuration for connector access.
|
|
186
217
|
|
|
187
218
|
Args:
|
|
188
|
-
api_key: Optional override for
|
|
189
|
-
identifier: Optional override for
|
|
219
|
+
api_key: Optional override for GL Connectors API key.
|
|
220
|
+
identifier: Optional override for GL Connectors identifier.
|
|
190
221
|
|
|
191
222
|
Returns:
|
|
192
223
|
Dictionary containing environment configuration values.
|
|
@@ -194,28 +225,42 @@ def _load_env(*, api_key: str | None, identifier: str | None) -> dict[str, str]:
|
|
|
194
225
|
Raises:
|
|
195
226
|
ValueError: If required environment variables are missing.
|
|
196
227
|
"""
|
|
197
|
-
env
|
|
228
|
+
env: dict[str, str | None] = {}
|
|
198
229
|
|
|
199
|
-
|
|
200
|
-
|
|
230
|
+
# Load from environment using mapping (prefers GL_CONNECTORS_* over BOSA_*)
|
|
231
|
+
for internal_key, env_vars in _ENV_VAR_MAPPING.items():
|
|
232
|
+
val = None
|
|
233
|
+
for var_name in env_vars:
|
|
234
|
+
val = os.getenv(var_name)
|
|
235
|
+
if val:
|
|
236
|
+
break
|
|
237
|
+
env[internal_key] = val
|
|
201
238
|
|
|
202
|
-
|
|
239
|
+
if api_key:
|
|
240
|
+
env["GL_CONNECTORS_API_KEY"] = api_key
|
|
203
241
|
|
|
204
|
-
if
|
|
205
|
-
env["
|
|
242
|
+
if identifier:
|
|
243
|
+
env["GL_CONNECTORS_IDENTIFIER"] = identifier
|
|
206
244
|
|
|
207
|
-
missing = [key for key
|
|
245
|
+
missing = [key for key in _REQUIRED_ENV_VARS if not env.get(key)]
|
|
208
246
|
if missing:
|
|
209
|
-
|
|
247
|
+
# Map back to human-friendly names for the error message
|
|
248
|
+
friendly_missing = []
|
|
249
|
+
for m in missing:
|
|
250
|
+
preferred = _ENV_VAR_MAPPING[m][0]
|
|
251
|
+
friendly_missing.append(preferred)
|
|
252
|
+
raise ValueError(
|
|
253
|
+
f"Missing required environment variables: {', '.join(friendly_missing)}"
|
|
254
|
+
)
|
|
210
255
|
|
|
211
|
-
return {
|
|
256
|
+
return {k: v for k, v in env.items() if v is not None}
|
|
212
257
|
|
|
213
258
|
|
|
214
259
|
def _get_available_modules(connector: BosaConnector) -> list[str]:
|
|
215
260
|
"""Return available connector modules or raise an actionable error.
|
|
216
261
|
|
|
217
262
|
Args:
|
|
218
|
-
connector:
|
|
263
|
+
connector: GL Connectors instance to query for modules.
|
|
219
264
|
|
|
220
265
|
Returns:
|
|
221
266
|
List of available module names.
|
|
@@ -246,13 +291,21 @@ def _resolve_module(tool_name: str, modules: Iterable[str]) -> str:
|
|
|
246
291
|
Raises:
|
|
247
292
|
ValueError: If no matching module is found or multiple ambiguous matches exist.
|
|
248
293
|
"""
|
|
249
|
-
candidates = [
|
|
294
|
+
candidates = [
|
|
295
|
+
module
|
|
296
|
+
for module in modules
|
|
297
|
+
if tool_name == module or tool_name.startswith(f"{module}_")
|
|
298
|
+
]
|
|
250
299
|
if not candidates:
|
|
251
|
-
raise ValueError(
|
|
300
|
+
raise ValueError(
|
|
301
|
+
f"Unable to resolve module for tool '{tool_name}'. Available modules: {', '.join(modules)}"
|
|
302
|
+
)
|
|
252
303
|
|
|
253
304
|
candidates.sort(key=len, reverse=True)
|
|
254
305
|
if len(candidates) > 1 and len(candidates[0]) == len(candidates[1]):
|
|
255
|
-
raise ValueError(
|
|
306
|
+
raise ValueError(
|
|
307
|
+
f"Ambiguous module match for tool '{tool_name}'. Matches: {', '.join(candidates)}"
|
|
308
|
+
)
|
|
256
309
|
return candidates[0]
|
|
257
310
|
|
|
258
311
|
|
|
@@ -260,9 +313,9 @@ def _create_token(connector: BosaConnector, username: str, password: str) -> str
|
|
|
260
313
|
"""Authenticate the connector user and return a user token.
|
|
261
314
|
|
|
262
315
|
Args:
|
|
263
|
-
connector:
|
|
264
|
-
username:
|
|
265
|
-
password:
|
|
316
|
+
connector: GL Connectors instance for authentication.
|
|
317
|
+
username: GL Connectors username for authentication.
|
|
318
|
+
password: GL Connectors password for authentication.
|
|
266
319
|
|
|
267
320
|
Returns:
|
|
268
321
|
Authentication token string.
|
|
@@ -273,15 +326,17 @@ def _create_token(connector: BosaConnector, username: str, password: str) -> str
|
|
|
273
326
|
try:
|
|
274
327
|
user = connector.authenticate_bosa_user(username, password)
|
|
275
328
|
except Exception as exc:
|
|
276
|
-
raise ValueError("Failed to authenticate
|
|
329
|
+
raise ValueError("Failed to authenticate GL Connectors user") from exc
|
|
277
330
|
|
|
278
331
|
token = getattr(user, "token", None)
|
|
279
332
|
if not token:
|
|
280
|
-
raise ValueError("
|
|
333
|
+
raise ValueError("GL Connectors user token missing after authentication")
|
|
281
334
|
return token
|
|
282
335
|
|
|
283
336
|
|
|
284
|
-
def _inject_params(
|
|
337
|
+
def _inject_params(
|
|
338
|
+
tool_input: Any, token: str, identifier: str | None, base_tool: BaseTool
|
|
339
|
+
) -> dict[str, Any]:
|
|
285
340
|
"""Inject token and optional identifier into tool input.
|
|
286
341
|
|
|
287
342
|
Args:
|
|
@@ -319,7 +374,9 @@ def _inject_params(tool_input: Any, token: str, identifier: str | None, base_too
|
|
|
319
374
|
return injected
|
|
320
375
|
|
|
321
376
|
|
|
322
|
-
def _wrap_request_if_needed(
|
|
377
|
+
def _wrap_request_if_needed(
|
|
378
|
+
tool_input: dict[str, Any], base_tool: BaseTool
|
|
379
|
+
) -> dict[str, Any]:
|
|
323
380
|
"""Wrap flat inputs into a 'request' payload when required by schema.
|
|
324
381
|
|
|
325
382
|
Args:
|
|
@@ -330,7 +387,9 @@ def _wrap_request_if_needed(tool_input: dict[str, Any], base_tool: BaseTool) ->
|
|
|
330
387
|
Dictionary with inputs wrapped in 'request' key if needed, otherwise unchanged.
|
|
331
388
|
"""
|
|
332
389
|
args_schema = getattr(base_tool, "args_schema", None)
|
|
333
|
-
if not (
|
|
390
|
+
if not (
|
|
391
|
+
isinstance(args_schema, dict) and "request" in args_schema.get("properties", {})
|
|
392
|
+
):
|
|
334
393
|
return tool_input
|
|
335
394
|
|
|
336
395
|
request_payload = {}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.tools.constants import ToolType as ToolType
|
|
3
|
+
from langchain_core.runnables import RunnableConfig
|
|
4
|
+
from langchain_core.tools import BaseTool
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
class _InjectedTool(BaseTool):
|
|
8
|
+
"""Wrap a BaseTool to inject token and optional identifier into inputs."""
|
|
9
|
+
model_config: Incomplete
|
|
10
|
+
def __init__(self, base_tool: BaseTool, token: str, identifier: str | None) -> None:
|
|
11
|
+
"""Initialize the injected tool wrapper.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
base_tool: The base tool to wrap.
|
|
15
|
+
token: Authentication token to inject into tool inputs.
|
|
16
|
+
identifier: Optional identifier to inject into tool inputs.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
None
|
|
20
|
+
"""
|
|
21
|
+
def invoke(self, input: Any, config: RunnableConfig | None = None, **kwargs: Any) -> Any:
|
|
22
|
+
"""Invoke the tool with token and optional identifier injected.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
input: Tool input to process.
|
|
26
|
+
config: Optional runnable configuration.
|
|
27
|
+
**kwargs: Additional keyword arguments.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
The result of invoking the tool with injected parameters.
|
|
31
|
+
"""
|
|
32
|
+
async def ainvoke(self, input: Any, config: RunnableConfig | None = None, **kwargs: Any) -> Any:
|
|
33
|
+
"""Invoke the tool asynchronously with token and optional identifier injected.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
input: Tool input to process.
|
|
37
|
+
config: Optional runnable configuration.
|
|
38
|
+
**kwargs: Additional keyword arguments.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
The result of invoking the tool with injected parameters.
|
|
42
|
+
"""
|
|
43
|
+
def run(self, tool_input: Any, **kwargs: Any) -> Any:
|
|
44
|
+
"""Run the tool with token and optional identifier injected.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
tool_input: Tool input to process.
|
|
48
|
+
**kwargs: Additional keyword arguments.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
The result of running the tool with injected parameters.
|
|
52
|
+
"""
|
|
53
|
+
async def arun(self, tool_input: Any, **kwargs: Any) -> Any:
|
|
54
|
+
"""Run the tool asynchronously with token and optional identifier injected.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
tool_input: Tool input to process.
|
|
58
|
+
**kwargs: Additional keyword arguments.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
The result of running the tool with injected parameters.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def GLConnectorTool(tool_name: str, *, api_key: str | None = None, identifier: str | None = None) -> BaseTool:
|
|
65
|
+
"""Create a single tool from GL Connectors by exact tool name.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
tool_name: Exact tool name (not module name).
|
|
69
|
+
api_key: Optional override for GL Connectors API key.
|
|
70
|
+
identifier: Optional override for GL Connectors identifier.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
A single LangChain BaseTool with token injection.
|
|
74
|
+
"""
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Auto-generated tools from GL Connectors.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Saul Sayers (saul.sayers@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aip_agents.tools.constants import (
|
|
8
|
+
GL_CONNECTORS_API_KEY,
|
|
9
|
+
GL_CONNECTORS_BASE_URL,
|
|
10
|
+
GL_CONNECTORS_FETCH_MAX_RETRIES,
|
|
11
|
+
ToolType,
|
|
12
|
+
)
|
|
13
|
+
from aip_agents.utils.logger import get_logger
|
|
14
|
+
from bosa_connectors import BosaConnector, BOSAConnectorToolGenerator
|
|
15
|
+
from langchain_core.tools import BaseTool
|
|
16
|
+
|
|
17
|
+
logger = get_logger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_gl_connector_modules_with_retry() -> list[str]:
|
|
21
|
+
"""Try to get available modules with retries.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
List of available modules.
|
|
25
|
+
"""
|
|
26
|
+
if not GL_CONNECTORS_BASE_URL or not GL_CONNECTORS_API_KEY:
|
|
27
|
+
logger.warning(
|
|
28
|
+
"GL Connectors credentials missing (base_url or api_key); returning empty modules list"
|
|
29
|
+
)
|
|
30
|
+
return []
|
|
31
|
+
|
|
32
|
+
connector = BosaConnector(
|
|
33
|
+
api_base_url=GL_CONNECTORS_BASE_URL, api_key=GL_CONNECTORS_API_KEY
|
|
34
|
+
)
|
|
35
|
+
modules = []
|
|
36
|
+
for attempt in range(GL_CONNECTORS_FETCH_MAX_RETRIES):
|
|
37
|
+
try:
|
|
38
|
+
modules = list(connector.get_available_modules())
|
|
39
|
+
if modules:
|
|
40
|
+
return modules
|
|
41
|
+
logger.warning(
|
|
42
|
+
f"Failed to get GL Connectors available modules, retrying... (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES})"
|
|
43
|
+
)
|
|
44
|
+
except Exception as e:
|
|
45
|
+
logger.exception(
|
|
46
|
+
f"Exception when getting GL Connectors available modules (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES}): {e}"
|
|
47
|
+
)
|
|
48
|
+
logger.error("Failed to get GL Connectors available modules after maximum retries")
|
|
49
|
+
return modules
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class LazyGLConnectorToolsDict(dict):
|
|
53
|
+
"""Lazy dictionary for GL Connectors."""
|
|
54
|
+
|
|
55
|
+
def __missing__(self, app):
|
|
56
|
+
"""When a key is missing, create the tools and store them in the dictionary.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
app: Name of the GL Connectors.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
List of tools generated by the GL Connectors tool generator.
|
|
63
|
+
"""
|
|
64
|
+
if app not in get_gl_connector_modules():
|
|
65
|
+
return []
|
|
66
|
+
tools = []
|
|
67
|
+
for attempt in range(GL_CONNECTORS_FETCH_MAX_RETRIES):
|
|
68
|
+
try:
|
|
69
|
+
tools = BOSAConnectorToolGenerator(
|
|
70
|
+
api_base_url=GL_CONNECTORS_BASE_URL,
|
|
71
|
+
api_key=GL_CONNECTORS_API_KEY,
|
|
72
|
+
app_name=app,
|
|
73
|
+
).generate_tools(tool_type=ToolType.LANGCHAIN)
|
|
74
|
+
if tools:
|
|
75
|
+
self[app] = tools
|
|
76
|
+
return tools
|
|
77
|
+
logger.warning(
|
|
78
|
+
f"Failed to create GL Connectors, retrying... (attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES})"
|
|
79
|
+
)
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.exception(
|
|
82
|
+
f"Exception when creating GL Connectors for app '{app}' "
|
|
83
|
+
f"(attempt {attempt + 1} / {GL_CONNECTORS_FETCH_MAX_RETRIES}): {e}"
|
|
84
|
+
)
|
|
85
|
+
logger.error("Failed to create GL Connectors after maximum retries")
|
|
86
|
+
return tools
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Supported modules (dynamic)
|
|
90
|
+
def get_gl_connector_modules() -> list[str]:
|
|
91
|
+
"""Lazily fetch and cache GL Connectors modules.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
List of GL Connectors modules.
|
|
95
|
+
"""
|
|
96
|
+
if not hasattr(get_gl_connector_modules, "_cache"):
|
|
97
|
+
get_gl_connector_modules._cache = get_gl_connector_modules_with_retry()
|
|
98
|
+
return get_gl_connector_modules._cache
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# FOR BACKWARDS COMPATIBILITY
|
|
102
|
+
def get_bosa_modules() -> list[str]:
|
|
103
|
+
"""Backward-compatible alias for get_gl_connector_modules."""
|
|
104
|
+
return get_gl_connector_modules()
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
GL_CONNECTORS_MODULES = [
|
|
108
|
+
"github",
|
|
109
|
+
"twitter",
|
|
110
|
+
"google",
|
|
111
|
+
"google_drive",
|
|
112
|
+
"google_mail",
|
|
113
|
+
"google_docs",
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
# FOR BACKWARDS COMPATIBILITY
|
|
117
|
+
BOSA_MODULES = GL_CONNECTORS_MODULES
|
|
118
|
+
|
|
119
|
+
GL_CONNECTORS_AUTOMATED_TOOLS: dict[str, list[BaseTool]] = LazyGLConnectorToolsDict()
|
|
120
|
+
|
|
121
|
+
# FOR BACKWARDS COMPATIBILITY
|
|
122
|
+
BOSA_AUTOMATED_TOOLS = GL_CONNECTORS_AUTOMATED_TOOLS
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.tools.constants import GL_CONNECTORS_API_KEY as GL_CONNECTORS_API_KEY, GL_CONNECTORS_BASE_URL as GL_CONNECTORS_BASE_URL, GL_CONNECTORS_FETCH_MAX_RETRIES as GL_CONNECTORS_FETCH_MAX_RETRIES, ToolType as ToolType
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from langchain_core.tools import BaseTool as BaseTool
|
|
5
|
+
|
|
6
|
+
logger: Incomplete
|
|
7
|
+
|
|
8
|
+
def get_gl_connector_modules_with_retry() -> list[str]:
|
|
9
|
+
"""Try to get available modules with retries.
|
|
10
|
+
|
|
11
|
+
Returns:
|
|
12
|
+
List of available modules.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
class LazyGLConnectorToolsDict(dict):
|
|
16
|
+
"""Lazy dictionary for GL Connectors."""
|
|
17
|
+
def __missing__(self, app):
|
|
18
|
+
"""When a key is missing, create the tools and store them in the dictionary.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
app: Name of the GL Connectors.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
List of tools generated by the GL Connectors tool generator.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def get_gl_connector_modules() -> list[str]:
|
|
28
|
+
"""Lazily fetch and cache GL Connectors modules.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
List of GL Connectors modules.
|
|
32
|
+
"""
|
|
33
|
+
def get_bosa_modules() -> list[str]:
|
|
34
|
+
"""Backward-compatible alias for get_gl_connector_modules."""
|
|
35
|
+
|
|
36
|
+
GL_CONNECTORS_MODULES: Incomplete
|
|
37
|
+
BOSA_MODULES = GL_CONNECTORS_MODULES
|
|
38
|
+
GL_CONNECTORS_AUTOMATED_TOOLS: dict[str, list[BaseTool]]
|
|
39
|
+
BOSA_AUTOMATED_TOOLS = GL_CONNECTORS_AUTOMATED_TOOLS
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
from aip_agents.tools.memory_search.base import LongTermMemorySearchTool as LongTermMemorySearchTool
|
|
2
|
+
from aip_agents.tools.memory_search.mem0 import MEMORY_SEARCH_TOOL_NAME as MEMORY_SEARCH_TOOL_NAME, Mem0SearchInput as Mem0SearchInput, Mem0SearchTool as Mem0SearchTool
|
|
3
|
+
from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput, MemoryConfig as MemoryConfig
|
|
4
|
+
|
|
5
|
+
__all__ = ['MemoryConfig', 'LongTermMemorySearchInput', 'LongTermMemorySearchTool', 'Mem0SearchInput', 'Mem0SearchTool', 'MEMORY_SEARCH_TOOL_NAME']
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from abc import ABC
|
|
3
|
+
from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
|
|
4
|
+
from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput, MemoryConfig as MemoryConfig
|
|
5
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
6
|
+
from collections.abc import Callable
|
|
7
|
+
from langchain_core.tools import BaseTool
|
|
8
|
+
from pydantic import BaseModel as BaseModel
|
|
9
|
+
from typing import Any, ClassVar, Protocol
|
|
10
|
+
|
|
11
|
+
logger: Incomplete
|
|
12
|
+
|
|
13
|
+
class LongTermMemoryBackend(Protocol):
|
|
14
|
+
"""Protocol for memory adapters that support retrieval and formatting."""
|
|
15
|
+
def retrieve(self, *, query: str | None, user_id: str, limit: int | None = None, filters: dict[str, Any] | None = None, page: int | None = None) -> list[dict[str, Any]]:
|
|
16
|
+
"""Retrieve memories matching the given query and filters.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
query: Optional search query string.
|
|
20
|
+
user_id: User identifier for scoped retrieval.
|
|
21
|
+
limit: Maximum number of results to return.
|
|
22
|
+
filters: Optional filters to apply to the retrieval.
|
|
23
|
+
page: Page number for pagination.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
List of memory hit dictionaries.
|
|
27
|
+
"""
|
|
28
|
+
def format_hits(self, hits: list[dict[str, Any]], max_items: int = ..., with_tag: bool = True) -> str:
|
|
29
|
+
"""Format memory hits into a readable string.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
hits: List of memory hit dictionaries to format.
|
|
33
|
+
max_items: Maximum number of hits to include in output.
|
|
34
|
+
with_tag: Whether to wrap output with memory tags.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Formatted string representation of memory hits.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
class LongTermMemorySearchTool(BaseTool, ABC):
|
|
41
|
+
"""Abstract base class for provider-specific long-term memory search tools."""
|
|
42
|
+
name: str
|
|
43
|
+
description: str
|
|
44
|
+
args_schema: type[LongTermMemorySearchInput]
|
|
45
|
+
tool_config_schema: type[BaseModel]
|
|
46
|
+
memory: LongTermMemoryBackend
|
|
47
|
+
default_user_id: str | None
|
|
48
|
+
user_id_provider: Callable[[], str | None] | None
|
|
49
|
+
MINIMUM_MEMORY_RETRIEVAL: ClassVar[int]
|
|
50
|
+
LOG_PREFIX: ClassVar[str]
|
|
51
|
+
def __init__(self, memory: LongTermMemoryBackend, *, default_user_id: str | None = None, user_id_provider: Callable[[], str | None] | None = None, **kwargs: Any) -> None:
|
|
52
|
+
"""Initialize the long-term memory search tool.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
memory: Memory adapter instance with retrieve() and format_hits() methods.
|
|
56
|
+
default_user_id: Default user ID to use if not provided in metadata.
|
|
57
|
+
user_id_provider: Callable that returns a user ID.
|
|
58
|
+
**kwargs: Additional keyword arguments passed to the parent class.
|
|
59
|
+
"""
|
|
60
|
+
def format_hits(self, hits: list[dict[str, Any]], with_tag: bool = False) -> str:
|
|
61
|
+
"""Format hits into a string with optional tags.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
hits: List of memory hit dictionaries to format.
|
|
65
|
+
with_tag: Whether to wrap the output with memory tags.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Formatted string representation of the memory hits.
|
|
69
|
+
"""
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
|
|
3
|
+
from aip_agents.tools.memory_search.base import LongTermMemorySearchTool as LongTermMemorySearchTool
|
|
4
|
+
from aip_agents.tools.memory_search.schema import LongTermMemorySearchInput as LongTermMemorySearchInput
|
|
5
|
+
from aip_agents.utils.datetime import is_valid_date_string as is_valid_date_string, next_day_iso as next_day_iso
|
|
6
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
7
|
+
from typing import ClassVar
|
|
8
|
+
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
MEMORY_SEARCH_TOOL_NAME: str
|
|
11
|
+
|
|
12
|
+
class Mem0SearchTool(LongTermMemorySearchTool):
|
|
13
|
+
"""Mem0-specific implementation of the long-term memory search tool."""
|
|
14
|
+
name: str
|
|
15
|
+
description: str
|
|
16
|
+
args_schema: type[LongTermMemorySearchInput]
|
|
17
|
+
LOG_PREFIX: ClassVar[str]
|
|
18
|
+
METADATA_FILTER_BLOCKLIST: ClassVar[set[str]]
|
|
19
|
+
Mem0SearchInput = LongTermMemorySearchInput
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from pydantic import BaseModel
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
class MemoryConfig(BaseModel):
|
|
5
|
+
"""Tool configuration schema for memory operations."""
|
|
6
|
+
user_id: str
|
|
7
|
+
|
|
8
|
+
class LongTermMemorySearchInput(BaseModel):
|
|
9
|
+
"""Input schema for unified long-term memory retrieval."""
|
|
10
|
+
query: str | None
|
|
11
|
+
start_date: str | None
|
|
12
|
+
end_date: str | None
|
|
13
|
+
limit: int | None
|
|
14
|
+
categories: list[str] | None
|
|
15
|
+
metadata: dict[str, Any] | None
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
from aip_agents.tools.memory_search import LongTermMemorySearchInput as LongTermMemorySearchInput, LongTermMemorySearchTool as LongTermMemorySearchTool, MEMORY_SEARCH_TOOL_NAME as MEMORY_SEARCH_TOOL_NAME, Mem0SearchInput as Mem0SearchInput, Mem0SearchTool as Mem0SearchTool, MemoryConfig as MemoryConfig
|
|
2
|
+
|
|
3
|
+
__all__ = ['MemoryConfig', 'LongTermMemorySearchInput', 'LongTermMemorySearchTool', 'Mem0SearchInput', 'Mem0SearchTool', 'MEMORY_SEARCH_TOOL_NAME']
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from langchain_core.tools import BaseTool
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
|
|
4
|
+
FORMAT_STRING: str
|
|
5
|
+
DEFAULT_TIMEZONE: str
|
|
6
|
+
|
|
7
|
+
class TimeToolInput(BaseModel):
|
|
8
|
+
"""Input schema for the TimeTool."""
|
|
9
|
+
datetime_format: str
|
|
10
|
+
timezone: str | None
|
|
11
|
+
|
|
12
|
+
class TimeTool(BaseTool):
|
|
13
|
+
"""Tool to get the current time."""
|
|
14
|
+
name: str
|
|
15
|
+
description: str
|
|
16
|
+
args_schema: type[BaseModel]
|