aip-agents-binary 0.5.18__py3-none-any.whl → 0.5.19__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.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.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__.pyi +3 -0
- 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__.pyi +4 -0
- aip_agents/tools/bosa_tools.pyi +37 -0
- aip_agents/tools/browser_use/__init__.py +1 -1
- 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__.py +1 -1
- 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.pyi +135 -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__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -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/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.18.dist-info → aip_agents_binary-0.5.19.dist-info}/METADATA +4 -12
- {aip_agents_binary-0.5.18.dist-info → aip_agents_binary-0.5.19.dist-info}/RECORD +271 -6
- {aip_agents_binary-0.5.18.dist-info → aip_agents_binary-0.5.19.dist-info}/WHEEL +0 -0
- {aip_agents_binary-0.5.18.dist-info → aip_agents_binary-0.5.19.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
+
from collections.abc import Awaitable as Awaitable
|
|
4
|
+
from gllm_inference.lm_invoker.lm_invoker import BaseLMInvoker
|
|
5
|
+
from typing import Any, TypeVar
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
FORMATTER_ENV_VAR: str
|
|
9
|
+
T = TypeVar('T')
|
|
10
|
+
|
|
11
|
+
class FormatterInvokerUnavailableError(RuntimeError):
|
|
12
|
+
"""Raised when no formatter LLM invoker can be resolved."""
|
|
13
|
+
class FormatterInvocationError(RuntimeError):
|
|
14
|
+
"""Raised when invoking the formatter LLM fails."""
|
|
15
|
+
|
|
16
|
+
class FormatterLLMClient:
|
|
17
|
+
"""Stateful helper that manages formatter invoker resolution and execution."""
|
|
18
|
+
def __init__(self) -> None:
|
|
19
|
+
"""Initialize the formatter LLM client with caching and thread safety."""
|
|
20
|
+
def seed_default(self, default_model_id: str | None) -> None:
|
|
21
|
+
"""Populate ``DEFAULT_MODEL_FORMATTER`` when unset.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
default_model_id: Preferred formatter model id to use as a fallback.
|
|
25
|
+
"""
|
|
26
|
+
def resolve_invoker(self, *, reset_cache: bool = False) -> BaseLMInvoker | None:
|
|
27
|
+
"""Return the cached formatter invoker, optionally refreshing it.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
reset_cache: When True, clear the cached invoker before resolving.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
BaseLMInvoker | None: Cached invoker if the formatter is configured, otherwise None.
|
|
34
|
+
"""
|
|
35
|
+
async def invoke(self, *args: Any, invoker: BaseLMInvoker | None = None, timeout: float | None = None, **kwargs: Any) -> Any:
|
|
36
|
+
"""Dispatch formatter prompts asynchronously with timeout/error handling.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
*args: Positional arguments forwarded to the invoker.
|
|
40
|
+
invoker: Explicit invoker instance to reuse instead of resolving one.
|
|
41
|
+
timeout: Optional timeout (seconds) enforced with ``asyncio.timeout``.
|
|
42
|
+
**kwargs: Keyword arguments forwarded to the invoker.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Any: Result returned by the formatter LLM.
|
|
46
|
+
|
|
47
|
+
Raises:
|
|
48
|
+
FormatterInvokerUnavailableError: If no formatter model is configured.
|
|
49
|
+
FormatterInvocationError: When the invocation fails or exceeds the timeout.
|
|
50
|
+
"""
|
|
51
|
+
def invoke_blocking(self, *args: Any, invoker: BaseLMInvoker | None = None, timeout: float | None = None, **kwargs: Any) -> Any:
|
|
52
|
+
"""Invoke the formatter LLM from synchronous contexts.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
*args: Positional arguments forwarded to ``invoke``.
|
|
56
|
+
invoker: Optional invoker to reuse.
|
|
57
|
+
timeout: Optional timeout (seconds) for the async invocation.
|
|
58
|
+
**kwargs: Keyword arguments forwarded to ``invoke``.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Any: Result returned by the formatter LLM.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def get_formatter_llm_client() -> FormatterLLMClient:
|
|
65
|
+
"""Return the process-wide formatter LLM client."""
|
|
66
|
+
def seed_formatter_llm_default(default_model_id: str | None) -> None:
|
|
67
|
+
"""Convenience wrapper for seeding the formatter default model.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
default_model_id: Formatter model identifier to seed when missing.
|
|
71
|
+
"""
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
from aip_agents.utils.langgraph.converter import convert_gllm_tool_call_to_langchain_tool_call as convert_gllm_tool_call_to_langchain_tool_call, convert_langchain_messages_to_gllm_messages as convert_langchain_messages_to_gllm_messages, convert_langchain_tool_call_to_gllm_tool_call as convert_langchain_tool_call_to_gllm_tool_call, convert_lm_output_to_langchain_message as convert_lm_output_to_langchain_message
|
|
2
|
+
|
|
3
|
+
__all__ = ['convert_gllm_tool_call_to_langchain_tool_call', 'convert_langchain_tool_call_to_gllm_tool_call', 'convert_lm_output_to_langchain_message', 'convert_langchain_messages_to_gllm_messages']
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from collections.abc import Sequence
|
|
2
|
+
from gllm_inference.schema import LMOutput, Message, ToolCall as GllmToolCall
|
|
3
|
+
from langchain_core.messages import AIMessage, BaseMessage as BaseMessage
|
|
4
|
+
from langchain_core.messages.tool import ToolCall as LangChainToolCall
|
|
5
|
+
|
|
6
|
+
def convert_langchain_messages_to_gllm_messages(messages: Sequence[BaseMessage], instruction: str) -> list[Message]:
|
|
7
|
+
"""Convert LangChain messages to gllm-inference Message format.
|
|
8
|
+
|
|
9
|
+
This function transforms a sequence of LangChain messages into the Message
|
|
10
|
+
format expected by LM Invoker. It handles system messages, human messages, AI messages
|
|
11
|
+
with tool calls, and tool result messages.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
messages: Sequence of LangChain BaseMessage objects to convert.
|
|
15
|
+
instruction: System instruction to prepend if not already present in messages.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
List of Message objects containing the converted message sequence.
|
|
19
|
+
"""
|
|
20
|
+
def convert_lm_output_to_langchain_message(response: LMOutput | str) -> AIMessage:
|
|
21
|
+
"""Convert LM Invoker output to LangChain AIMessage.
|
|
22
|
+
|
|
23
|
+
This function transforms the output from LM Invoker back into LangChain's
|
|
24
|
+
AIMessage format, handling both text responses and tool calls.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
response: The response from LM Invoker (MultimodalOutput).
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
AIMessage containing the converted response.
|
|
31
|
+
"""
|
|
32
|
+
def convert_langchain_tool_call_to_gllm_tool_call(lc_tool_call: LangChainToolCall) -> GllmToolCall:
|
|
33
|
+
"""Convert LangChain tool call to gllm ToolCall.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
lc_tool_call: LangChain ToolCall (TypedDict).
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
GllmToolCall object for gllm-inference.
|
|
40
|
+
"""
|
|
41
|
+
def convert_gllm_tool_call_to_langchain_tool_call(gllm_tool_call: GllmToolCall) -> LangChainToolCall:
|
|
42
|
+
"""Convert gllm ToolCall to LangChain ToolCall format.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
gllm_tool_call: GllmToolCall object from gllm-inference.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
LangChain ToolCall (TypedDict) with proper type annotation.
|
|
49
|
+
"""
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
from aip_agents.utils.langgraph.tool_managers.a2a_tool_manager import A2AToolManager as A2AToolManager
|
|
2
|
+
from aip_agents.utils.langgraph.tool_managers.base_tool_manager import BaseLangGraphToolManager as BaseLangGraphToolManager
|
|
3
|
+
from aip_agents.utils.langgraph.tool_managers.delegation_tool_manager import DelegationToolManager as DelegationToolManager
|
|
4
|
+
|
|
5
|
+
__all__ = ['BaseLangGraphToolManager', 'A2AToolManager', 'DelegationToolManager']
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from a2a.types import AgentCard as AgentCard
|
|
3
|
+
from aip_agents.utils.a2a_connector import A2AConnector as A2AConnector
|
|
4
|
+
from aip_agents.utils.langgraph.tool_managers.base_tool_manager import BaseLangGraphToolManager as BaseLangGraphToolManager
|
|
5
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
6
|
+
from langchain_core.tools import BaseTool
|
|
7
|
+
|
|
8
|
+
logger: Incomplete
|
|
9
|
+
|
|
10
|
+
class A2AToolManager(BaseLangGraphToolManager):
|
|
11
|
+
"""Manages A2A communication tools for LangGraph agents.
|
|
12
|
+
|
|
13
|
+
This tool manager converts A2A agent cards into LangChain tools that can
|
|
14
|
+
be used in a unified ToolNode within LangGraph agents. Each A2A agent
|
|
15
|
+
becomes a tool that the LLM can call for external communication.
|
|
16
|
+
"""
|
|
17
|
+
registered_agents: list
|
|
18
|
+
def __init__(self) -> None:
|
|
19
|
+
"""Initialize the A2A tool manager."""
|
|
20
|
+
created_tools: Incomplete
|
|
21
|
+
def register_resources(self, agent_cards: list[AgentCard]) -> list[BaseTool]:
|
|
22
|
+
"""Register A2A agents and convert them to LangChain tools.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
agent_cards: List of AgentCard instances for external communication.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
List of created A2A communication tools.
|
|
29
|
+
"""
|
|
30
|
+
def get_resource_names(self) -> list[str]:
|
|
31
|
+
"""Get names of all registered A2A agents.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
list[str]: A list of names of all registered A2A agents.
|
|
35
|
+
"""
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from langchain_core.tools import BaseTool as BaseTool
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
|
|
9
|
+
class BaseLangGraphToolManager(ABC):
|
|
10
|
+
"""Base class for managing specialized tools in LangGraph agents.
|
|
11
|
+
|
|
12
|
+
This abstract base class provides a common interface for tool managers
|
|
13
|
+
that convert different types of capabilities into LangChain tools for
|
|
14
|
+
use in LangGraph agents.
|
|
15
|
+
|
|
16
|
+
The design follows a simple pattern:
|
|
17
|
+
1. Register resources (agents, cards, etc.)
|
|
18
|
+
2. Convert resources to LangChain tools
|
|
19
|
+
3. Provide access to created tools
|
|
20
|
+
"""
|
|
21
|
+
created_tools: list[BaseTool]
|
|
22
|
+
def __init__(self) -> None:
|
|
23
|
+
"""Initialize the tool manager."""
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def register_resources(self, resources: list[Any]) -> list[BaseTool]:
|
|
26
|
+
"""Register resources and convert them to LangChain tools.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
resources: List of resources to convert to tools.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
List of created tools.
|
|
33
|
+
"""
|
|
34
|
+
def get_tools(self) -> list[BaseTool]:
|
|
35
|
+
"""Get all created tools.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Copy of created tools list.
|
|
39
|
+
"""
|
|
40
|
+
def clear_tools(self) -> None:
|
|
41
|
+
"""Clear all created tools."""
|
|
42
|
+
@abstractmethod
|
|
43
|
+
def get_resource_names(self) -> list[str]:
|
|
44
|
+
"""Get names of all registered resources.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
List of resource names.
|
|
48
|
+
"""
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent.base_agent import BaseAgent as BaseAgent
|
|
3
|
+
from aip_agents.schema.step_limit import MaxDelegationDepthExceededError as MaxDelegationDepthExceededError
|
|
4
|
+
from aip_agents.types import A2AEvent as A2AEvent, A2AStreamEventType as A2AStreamEventType
|
|
5
|
+
from aip_agents.utils.artifact_helpers import extract_artifacts_from_agent_response as extract_artifacts_from_agent_response
|
|
6
|
+
from aip_agents.utils.langgraph.tool_managers.base_tool_manager import BaseLangGraphToolManager as BaseLangGraphToolManager
|
|
7
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
8
|
+
from aip_agents.utils.metadata_helper import MetadataFieldKeys as MetadataFieldKeys, get_next_step_number as get_next_step_number
|
|
9
|
+
from aip_agents.utils.pii.pii_helper import anonymize_final_response_content as anonymize_final_response_content, extract_pii_mapping_from_agent_response as extract_pii_mapping_from_agent_response
|
|
10
|
+
from aip_agents.utils.reference_helper import extract_references_from_agent_response as extract_references_from_agent_response
|
|
11
|
+
from aip_agents.utils.step_limit_manager import StepLimitManager as StepLimitManager
|
|
12
|
+
from aip_agents.utils.token_usage_helper import STEP_USAGE_KEY as STEP_USAGE_KEY, TOTAL_USAGE_KEY as TOTAL_USAGE_KEY, USAGE_METADATA_KEY as USAGE_METADATA_KEY, extract_token_usage_from_agent_response as extract_token_usage_from_agent_response
|
|
13
|
+
from langchain_core.tools import BaseTool
|
|
14
|
+
|
|
15
|
+
logger: Incomplete
|
|
16
|
+
OUTPUT_KEY: str
|
|
17
|
+
RESULT_KEY: str
|
|
18
|
+
ARTIFACTS_KEY: str
|
|
19
|
+
METADATA_KEY: str
|
|
20
|
+
METADATA_INTERNAL_PREFIXES: Incomplete
|
|
21
|
+
METADATA_INTERNAL_KEYS: Incomplete
|
|
22
|
+
AGENT_RUN_A2A_STREAMING_METHOD: str
|
|
23
|
+
|
|
24
|
+
class DelegationToolManager(BaseLangGraphToolManager):
|
|
25
|
+
"""Manages internal agent delegation tools for LangGraph agents.
|
|
26
|
+
|
|
27
|
+
This tool manager converts internal agent instances into LangChain tools
|
|
28
|
+
that can be used for task delegation within a unified ToolNode. Each
|
|
29
|
+
delegated agent becomes a tool that the coordinator can call.
|
|
30
|
+
|
|
31
|
+
Simplified version following legacy BaseLangChainAgent patterns.
|
|
32
|
+
"""
|
|
33
|
+
registered_agents: list[BaseAgent]
|
|
34
|
+
parent_agent: Incomplete
|
|
35
|
+
def __init__(self, parent_agent: BaseAgent | None = None) -> None:
|
|
36
|
+
"""Initialize the delegation tool manager.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
parent_agent: The parent agent that creates delegation tools, used for parent step lookup.
|
|
40
|
+
"""
|
|
41
|
+
created_tools: Incomplete
|
|
42
|
+
def register_resources(self, agents: list[BaseAgent]) -> list[BaseTool]:
|
|
43
|
+
"""Register internal agents for delegation and convert them to tools.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
agents: List of BaseAgent instances for internal task delegation.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
List of created delegation tools.
|
|
50
|
+
"""
|
|
51
|
+
def get_resource_names(self) -> list[str]:
|
|
52
|
+
"""Get names of all registered delegation agents.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
list[str]: A list of names of all registered delegation agents.
|
|
56
|
+
"""
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.storage.providers.base import BaseStorageProvider as BaseStorageProvider, StorageError as StorageError
|
|
3
|
+
from aip_agents.storage.providers.memory import InMemoryStorageProvider as InMemoryStorageProvider
|
|
4
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from datetime import datetime, timedelta
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
STRING_TRUNCATION_LENGTH: int
|
|
11
|
+
MAX_TOOL_ARGS_DISPLAY: int
|
|
12
|
+
DATA_PREVIEW_TRUNCATION_LENGTH: int
|
|
13
|
+
TOOL_OUTPUT_REFERENCE_PREFIX: str
|
|
14
|
+
|
|
15
|
+
class ToolReferenceError(Exception):
|
|
16
|
+
"""Specialized exception for tool output reference resolution errors.
|
|
17
|
+
|
|
18
|
+
This exception is raised when there are issues with resolving tool output references,
|
|
19
|
+
such as invalid reference syntax, missing outputs, or security violations.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
reference: The original reference string that caused the error.
|
|
23
|
+
call_id: The call ID that was attempted to be resolved, if applicable.
|
|
24
|
+
details: Additional error details for debugging.
|
|
25
|
+
"""
|
|
26
|
+
reference: Incomplete
|
|
27
|
+
call_id: Incomplete
|
|
28
|
+
details: Incomplete
|
|
29
|
+
def __init__(self, message: str, reference: str | None = None, call_id: str | None = None, details: dict[str, Any] | None = None) -> None:
|
|
30
|
+
"""Initialize a ToolReferenceError.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
message: Human-readable error message describing what went wrong.
|
|
34
|
+
reference: The original reference string that caused the error, if applicable.
|
|
35
|
+
call_id: The call ID that was attempted to be resolved, if applicable.
|
|
36
|
+
details: Additional error details for debugging, if applicable.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
@dataclass
|
|
40
|
+
class ToolOutputConfig:
|
|
41
|
+
"""Configuration for tool output management system.
|
|
42
|
+
|
|
43
|
+
This class defines the operational parameters for the tool output management
|
|
44
|
+
system, including storage limits, cleanup intervals, and lifecycle policies.
|
|
45
|
+
|
|
46
|
+
Attributes:
|
|
47
|
+
max_stored_outputs: Maximum number of tool outputs to store simultaneously.
|
|
48
|
+
When this limit is reached, oldest outputs are evicted. Defaults to 100.
|
|
49
|
+
max_age_minutes: Maximum age in minutes for stored outputs before they
|
|
50
|
+
become eligible for cleanup. Defaults to 60 minutes.
|
|
51
|
+
cleanup_interval: Number of tool calls between automatic cleanup operations.
|
|
52
|
+
Set to 0 to disable automatic cleanup. Defaults to 20.
|
|
53
|
+
storage_provider: Optional storage provider for persistent storage.
|
|
54
|
+
If None, uses in-memory storage (backward compatible). Defaults to None.
|
|
55
|
+
"""
|
|
56
|
+
max_stored_outputs: int = ...
|
|
57
|
+
max_age_minutes: int = ...
|
|
58
|
+
cleanup_interval: int = ...
|
|
59
|
+
storage_provider: BaseStorageProvider | None = ...
|
|
60
|
+
|
|
61
|
+
@dataclass
|
|
62
|
+
class ToolOutput:
|
|
63
|
+
"""Container for tool outputs with optional data payload.
|
|
64
|
+
|
|
65
|
+
This class represents tool output metadata and optionally the actual data.
|
|
66
|
+
When used as metadata only, the data field is None and must be retrieved
|
|
67
|
+
from storage. When loaded with data, it contains the complete output.
|
|
68
|
+
|
|
69
|
+
Attributes:
|
|
70
|
+
call_id: Unique identifier for this tool call, used for reference resolution.
|
|
71
|
+
tool_name: Name of the tool that produced this output.
|
|
72
|
+
timestamp: When this output was created and stored.
|
|
73
|
+
size_bytes: Approximate size of the stored data in bytes for memory management.
|
|
74
|
+
tool_args: Input arguments that were passed to the tool for this call.
|
|
75
|
+
data: Optional actual output data. None when used as metadata only.
|
|
76
|
+
data_description: Optional human-readable description of the data content,
|
|
77
|
+
typically provided by the tool itself.
|
|
78
|
+
tags: Optional list of tags for categorization and filtering.
|
|
79
|
+
agent_name: Name of the agent that created this output, for multi-agent context.
|
|
80
|
+
"""
|
|
81
|
+
call_id: str
|
|
82
|
+
tool_name: str
|
|
83
|
+
timestamp: datetime
|
|
84
|
+
size_bytes: int
|
|
85
|
+
tool_args: dict[str, Any]
|
|
86
|
+
data: Any | None = ...
|
|
87
|
+
data_description: str | None = ...
|
|
88
|
+
tags: list[str] | None = ...
|
|
89
|
+
agent_name: str | None = ...
|
|
90
|
+
@property
|
|
91
|
+
def is_metadata_only(self) -> bool:
|
|
92
|
+
"""Check if this instance contains only metadata without data."""
|
|
93
|
+
def is_expired(self, max_age: timedelta) -> bool:
|
|
94
|
+
"""Check if this output has expired based on the given maximum age.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
max_age (timedelta): The maximum age allowed before expiration.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
bool: True if the output has expired, False otherwise.
|
|
101
|
+
"""
|
|
102
|
+
def get_data_preview(self, max_length: int = 200, storage_provider: BaseStorageProvider | None = None, thread_id: str | None = None) -> str | None:
|
|
103
|
+
"""Get a truncated string representation of the stored data.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
max_length: Maximum length of the preview string.
|
|
107
|
+
storage_provider: Required only if data is not loaded.
|
|
108
|
+
thread_id: Thread ID required for proper storage key generation.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
A string representation of the data, truncated if necessary. None if data is not found.
|
|
112
|
+
"""
|
|
113
|
+
def with_data(self, data: Any) -> ToolOutput:
|
|
114
|
+
"""Create a new instance with data populated.
|
|
115
|
+
|
|
116
|
+
Returns a new ToolOutput instance with the same metadata but with
|
|
117
|
+
data field populated. Useful for converting metadata-only instances
|
|
118
|
+
to complete instances.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
data (Any): The actual output data to populate.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
ToolOutput: A new instance with data populated.
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
@dataclass
|
|
128
|
+
class StoreOutputParams:
|
|
129
|
+
"""Parameters for storing tool outputs.
|
|
130
|
+
|
|
131
|
+
Reduces the number of arguments passed to store_output method.
|
|
132
|
+
|
|
133
|
+
Attributes:
|
|
134
|
+
call_id: Unique identifier for this tool call.
|
|
135
|
+
tool_name: Name of the tool that produced the output.
|
|
136
|
+
data: The actual output data to store.
|
|
137
|
+
tool_args: Input arguments used for the tool call.
|
|
138
|
+
thread_id: Thread/conversation ID to organize outputs by conversation.
|
|
139
|
+
description: Optional human-readable description of the output.
|
|
140
|
+
tags: Optional list of tags for categorization.
|
|
141
|
+
agent_name: Name of the agent that created this output.
|
|
142
|
+
"""
|
|
143
|
+
call_id: str
|
|
144
|
+
tool_name: str
|
|
145
|
+
data: Any
|
|
146
|
+
tool_args: dict[str, Any]
|
|
147
|
+
thread_id: str
|
|
148
|
+
description: str | None = ...
|
|
149
|
+
tags: list[str] | None = ...
|
|
150
|
+
agent_name: str | None = ...
|
|
151
|
+
|
|
152
|
+
class ToolOutputManager:
|
|
153
|
+
"""Production-ready tool output manager with comprehensive lifecycle management.
|
|
154
|
+
|
|
155
|
+
This class provides centralized management of tool outputs including storage,
|
|
156
|
+
retrieval, lifecycle management, and LLM-friendly summarization. It handles
|
|
157
|
+
memory management through configurable cleanup policies and provides secure
|
|
158
|
+
access to stored outputs.
|
|
159
|
+
|
|
160
|
+
Key Features:
|
|
161
|
+
- Automatic and manual storage of tool outputs with metadata
|
|
162
|
+
- Configurable lifecycle management with age and size-based eviction
|
|
163
|
+
- LLM-friendly summary generation with data previews and context
|
|
164
|
+
- Memory management with size tracking and cleanup
|
|
165
|
+
- Thread-safe operations with proper error handling and locking
|
|
166
|
+
- Concurrent access support for multi-agent and parallel processing scenarios
|
|
167
|
+
|
|
168
|
+
Attributes:
|
|
169
|
+
config: Configuration object defining operational parameters.
|
|
170
|
+
"""
|
|
171
|
+
config: Incomplete
|
|
172
|
+
def __init__(self, config: ToolOutputConfig) -> None:
|
|
173
|
+
"""Initialize the ToolOutputManager with the given configuration.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
config: Configuration object defining storage limits and cleanup policies.
|
|
177
|
+
"""
|
|
178
|
+
def store_output(self, params: StoreOutputParams) -> None:
|
|
179
|
+
"""Store a tool output with automatic cleanup and size management.
|
|
180
|
+
|
|
181
|
+
This method stores a tool output along with its metadata, automatically
|
|
182
|
+
handling size limits, cleanup, and memory management. If the same call_id
|
|
183
|
+
is used multiple times within the same thread, the previous output will be overwritten.
|
|
184
|
+
|
|
185
|
+
Thread-safe: This method uses internal locking to ensure safe concurrent access.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
params: StoreOutputParams containing all necessary parameters including thread_id.
|
|
189
|
+
|
|
190
|
+
Raises:
|
|
191
|
+
Exception: If storage operation fails for any reason.
|
|
192
|
+
"""
|
|
193
|
+
def get_output(self, call_id: str, thread_id: str) -> ToolOutput | None:
|
|
194
|
+
"""Retrieve a stored tool output by its call ID and thread ID.
|
|
195
|
+
|
|
196
|
+
Thread-safe: This method uses internal locking to ensure safe concurrent access.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
call_id: The unique identifier for the tool call.
|
|
200
|
+
thread_id: The thread/conversation ID to search in.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
The ToolOutput object with data if found, None otherwise.
|
|
204
|
+
"""
|
|
205
|
+
def has_outputs(self, thread_id: str | None = None) -> bool:
|
|
206
|
+
"""Check if any outputs are currently stored.
|
|
207
|
+
|
|
208
|
+
Thread-safe: This method uses internal locking to ensure safe concurrent access.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
thread_id: Optional thread ID to check for outputs in a specific thread.
|
|
212
|
+
If None, checks across all threads.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
True if there are stored outputs, False otherwise.
|
|
216
|
+
"""
|
|
217
|
+
def generate_summary(self, thread_id: str, max_entries: int = 10) -> str:
|
|
218
|
+
"""Generate an LLM-friendly structured summary as JSON.
|
|
219
|
+
|
|
220
|
+
This method creates a comprehensive, structured summary of stored outputs that
|
|
221
|
+
can be easily parsed by LLMs and other systems. The JSON format provides rich
|
|
222
|
+
metadata and context about each tool output.
|
|
223
|
+
|
|
224
|
+
Thread-safe: This method uses internal locking to ensure safe concurrent access.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
thread_id: Thread ID to generate summary for.
|
|
228
|
+
max_entries: Maximum number of entries to include in the summary.
|
|
229
|
+
Defaults to 10.
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
A JSON string containing structured data about tool outputs. Always returns
|
|
233
|
+
valid JSON, even when no outputs are stored (empty entries list).
|
|
234
|
+
"""
|
|
235
|
+
def clear_all(self) -> None:
|
|
236
|
+
"""Clear all stored outputs from both metadata and storage.
|
|
237
|
+
|
|
238
|
+
Warning:
|
|
239
|
+
This operation is irreversible and will remove all stored tool outputs.
|
|
240
|
+
"""
|
|
241
|
+
def get_storage_stats(self) -> dict[str, Any]:
|
|
242
|
+
"""Get storage statistics for monitoring and debugging.
|
|
243
|
+
|
|
244
|
+
Returns:
|
|
245
|
+
Dictionary containing storage statistics.
|
|
246
|
+
"""
|
|
247
|
+
|
|
248
|
+
class ToolReferenceResolver:
|
|
249
|
+
"""Secure and efficient tool output reference resolution system.
|
|
250
|
+
|
|
251
|
+
This class handles the resolution of tool output references in a secure manner,
|
|
252
|
+
preventing injection attacks while providing simple and reliable access to
|
|
253
|
+
stored tool outputs. It uses a whitelist approach with regex validation to
|
|
254
|
+
ensure only safe references are processed.
|
|
255
|
+
|
|
256
|
+
Security Features:
|
|
257
|
+
- Strict regex pattern matching for reference syntax
|
|
258
|
+
- Whitelist-based validation to prevent injection attacks
|
|
259
|
+
- Fail-fast error handling with detailed error messages
|
|
260
|
+
- Input sanitization and validation at multiple levels
|
|
261
|
+
|
|
262
|
+
Supported Reference Syntax:
|
|
263
|
+
- $tool_output.<call_id> - Direct reference to a tool output by call ID
|
|
264
|
+
|
|
265
|
+
Attributes:
|
|
266
|
+
config: Configuration object for operational parameters.
|
|
267
|
+
"""
|
|
268
|
+
config: Incomplete
|
|
269
|
+
def __init__(self, config: ToolOutputConfig) -> None:
|
|
270
|
+
"""Initialize the ToolReferenceResolver with security configuration.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
config: Configuration object defining operational parameters.
|
|
274
|
+
"""
|
|
275
|
+
def resolve_references(self, args: dict[str, Any], manager: ToolOutputManager, thread_id: str | None = None) -> dict[str, Any]:
|
|
276
|
+
"""Resolve all tool output references in the given arguments dictionary.
|
|
277
|
+
|
|
278
|
+
This method recursively processes a dictionary of tool arguments, finding
|
|
279
|
+
and resolving any tool output references. It supports nested dictionaries
|
|
280
|
+
and lists, providing comprehensive reference resolution.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
args: Dictionary of tool arguments that may contain references.
|
|
284
|
+
manager: ToolOutputManager instance to resolve references against.
|
|
285
|
+
thread_id: Optional thread ID for context-aware resolution.
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
New dictionary with all references resolved to their actual values.
|
|
289
|
+
|
|
290
|
+
Raises:
|
|
291
|
+
ToolReferenceError: If any reference is invalid or cannot be resolved.
|
|
292
|
+
"""
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from _typeshed import Incomplete
|
|
3
|
+
|
|
4
|
+
LOGGER_NAME: str
|
|
5
|
+
LOG_LEVEL: Incomplete
|
|
6
|
+
|
|
7
|
+
class _GoogleAdkLogFilter(logging.Filter):
|
|
8
|
+
"""Suppress noisy Google ADK model registry logs.
|
|
9
|
+
|
|
10
|
+
Google ADK emits a burst of INFO logs when registering Gemini model patterns.
|
|
11
|
+
They are redundant (class is unchanged) and clutter our startup output, so we
|
|
12
|
+
drop them at the logging infrastructure level instead of touching ADK internals.
|
|
13
|
+
"""
|
|
14
|
+
SUPPRESSED_PREFIX: str
|
|
15
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
16
|
+
"""Return False when the log should be discarded.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
record (logging.LogRecord): The log record to filter.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
bool: True if the log should be processed, False if it should be discarded.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
LOG_FILTERS: Incomplete
|
|
26
|
+
logger_manager: Incomplete
|
|
27
|
+
root_logger: Incomplete
|
|
28
|
+
|
|
29
|
+
def get_logger(name: str = ..., level: int = ...) -> logging.Logger:
|
|
30
|
+
"""Get a logger instance.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
name (str): The name of the logger. Defaults to AIPAgentsLogger.
|
|
34
|
+
level (int): The level of the logger. Defaults to INFO.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
logging.Logger: The logger instance.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
logger: Incomplete
|
|
41
|
+
THIRD_PARTY_LOGGER_NAMES: Incomplete
|
|
42
|
+
|
|
43
|
+
class LoggerManager:
|
|
44
|
+
"""A singleton class to manage logging configuration.
|
|
45
|
+
|
|
46
|
+
This class is deprecated and will be removed in a future version.
|
|
47
|
+
Use get_logger() function directly instead.
|
|
48
|
+
"""
|
|
49
|
+
def __new__(cls):
|
|
50
|
+
"""Initialize the singleton instance."""
|
|
51
|
+
def get_logger(self, name: str = ..., level: int = ...) -> logging.Logger:
|
|
52
|
+
"""Get a logger instance.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
name (str): The name of the logger. Defaults to AIPAgentsLogger.
|
|
56
|
+
level (int): The level of the logger. Defaults to INFO.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
logging.Logger: The logger instance.
|
|
60
|
+
"""
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
from aip_agents.utils.metadata.activity_metadata_helper import DEFAULT_ACTIVITY_INFO as DEFAULT_ACTIVITY_INFO, _format_tool_or_subagent_name as _format_tool_or_subagent_name, create_tool_activity_info as create_tool_activity_info
|
|
2
|
+
from aip_agents.utils.metadata.schemas import Activity as Activity, ActivityDataType as ActivityDataType, Thinking as Thinking
|
|
3
|
+
from aip_agents.utils.metadata.thinking_metadata_helper import FINAL_THINKING_INFO as FINAL_THINKING_INFO
|
|
4
|
+
|
|
5
|
+
__all__ = ['Activity', 'ActivityDataType', 'Thinking', 'create_tool_activity_info', 'DEFAULT_ACTIVITY_INFO', '_format_tool_or_subagent_name', 'FINAL_THINKING_INFO']
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.schema.hitl import ApprovalDecisionType as ApprovalDecisionType
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from aip_agents.utils.metadata.activity_narrative import ActivityNarrativeBuilder as ActivityNarrativeBuilder, DELEGATE_PREFIX as DELEGATE_PREFIX, HITL_DECISION_MESSAGES as HITL_DECISION_MESSAGES, HITL_PENDING_DESCRIPTION as HITL_PENDING_DESCRIPTION, HITL_PENDING_TITLE as HITL_PENDING_TITLE
|
|
5
|
+
from aip_agents.utils.metadata.schemas.activity_schema import Activity as Activity
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
logger: Incomplete
|
|
9
|
+
DEFAULT_ACTIVITY_MESSAGE: str
|
|
10
|
+
TOOL_EXECUTION_RUNNING_TEMPLATE: str
|
|
11
|
+
TOOL_EXECUTION_COMPLETE_TEMPLATE: str
|
|
12
|
+
SUBAGENT_DELEGATION_TEMPLATE: str
|
|
13
|
+
SUBAGENT_COMPLETE_TEMPLATE: str
|
|
14
|
+
MIXED_EXECUTION_TEMPLATE: str
|
|
15
|
+
DEFAULT_ACTIVITY_INFO: Incomplete
|
|
16
|
+
|
|
17
|
+
def create_tool_activity_info(original_metadata: dict[str, Any] | None) -> dict[str, str]:
|
|
18
|
+
'''Create activity info payload with optional LLM narrative overrides.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
original_metadata: The original metadata dictionary containing tool_info and hitl data.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
A dict with data_type="activity" and data_value as a JSON string.
|
|
25
|
+
'''
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
from aip_agents.utils.metadata.activity_narrative.builder import ActivityNarrativeBuilder as ActivityNarrativeBuilder, _formatter_llm_client as _formatter_llm_client
|
|
2
|
+
from aip_agents.utils.metadata.activity_narrative.constants import DELEGATE_PREFIX as DELEGATE_PREFIX, HITL_DECISION_MESSAGES as HITL_DECISION_MESSAGES, HITL_PENDING_DESCRIPTION as HITL_PENDING_DESCRIPTION, HITL_PENDING_TITLE as HITL_PENDING_TITLE, OUTPUT_EXCERPT_MAX_CHARS as OUTPUT_EXCERPT_MAX_CHARS, SYSTEM_PROMPT as SYSTEM_PROMPT
|
|
3
|
+
from aip_agents.utils.metadata.activity_narrative.context import ActivityContext as ActivityContext, ActivityPhase as ActivityPhase
|
|
4
|
+
from aip_agents.utils.metadata.activity_narrative.formatters import ArgsFormatter as ArgsFormatter, OutputFormatter as OutputFormatter, SensitiveInfoFilter as SensitiveInfoFilter
|
|
5
|
+
from aip_agents.utils.metadata.activity_narrative.utils import _format_tool_or_subagent_name as _format_tool_or_subagent_name
|
|
6
|
+
|
|
7
|
+
__all__ = ['ActivityNarrativeBuilder', 'ActivityContext', 'ActivityPhase', 'ArgsFormatter', 'OutputFormatter', 'SensitiveInfoFilter', 'DELEGATE_PREFIX', 'HITL_DECISION_MESSAGES', 'HITL_PENDING_DESCRIPTION', 'HITL_PENDING_TITLE', 'OUTPUT_EXCERPT_MAX_CHARS', 'SYSTEM_PROMPT', '_format_tool_or_subagent_name', '_formatter_llm_client']
|