aip-agents-binary 0.5.25b8__py3-none-any.whl → 0.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aip_agents/__init__.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.py +137 -68
- aip_agents/agent/base_langgraph_agent.pyi +233 -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.py +58 -14
- aip_agents/agent/langgraph_react_agent.pyi +131 -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.py +2 -2
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +1 -1
- 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_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.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.py +9 -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.py +2 -2
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +1 -1
- 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/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +6 -6
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.pyi +19 -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.py +36 -1
- aip_agents/mcp/client/connection_manager.pyi +51 -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.py +318 -68
- aip_agents/mcp/client/persistent_session.pyi +122 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +33 -2
- aip_agents/mcp/client/transports.pyi +132 -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 +75 -0
- aip_agents/middleware/manager.pyi +84 -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 +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.py +8 -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.py +2 -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 +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- 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__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -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.py +26 -1
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +80 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +329 -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.25b8.dist-info → aip_agents_binary-0.6.0.dist-info}/METADATA +51 -48
- aip_agents_binary-0.6.0.dist-info/RECORD +566 -0
- aip_agents_binary-0.5.25b8.dist-info/RECORD +0 -290
- {aip_agents_binary-0.5.25b8.dist-info → aip_agents_binary-0.6.0.dist-info}/WHEEL +0 -0
- {aip_agents_binary-0.5.25b8.dist-info → aip_agents_binary-0.6.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.schema.a2a import A2AStreamEventType as A2AStreamEventType
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
logger: Incomplete
|
|
7
|
+
|
|
8
|
+
class EventHandlerRegistry:
|
|
9
|
+
"""Registry for tracking known streaming events with pass-through behaviour."""
|
|
10
|
+
def __init__(self) -> None:
|
|
11
|
+
"""Initialize the event handler registry with known event types."""
|
|
12
|
+
def handle(self, event_type: A2AStreamEventType | str | None, payload: dict[str, Any]) -> dict[str, Any]:
|
|
13
|
+
"""Return the payload unchanged while logging unknown events.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
event_type (A2AStreamEventType | str | None): The type of the streaming event.
|
|
17
|
+
payload (dict[str, Any]): The event payload data.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
dict[str, Any]: The payload unchanged (pass-through).
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
DEFAULT_EVENT_HANDLER_REGISTRY: Incomplete
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
+
|
|
4
|
+
logger: Incomplete
|
|
5
|
+
FILE_PATH_SYSTEM_NOTE: str
|
|
6
|
+
FILE_PATH_INACCESSIBLE_NOTE: str
|
|
7
|
+
FILE_URL_SYSTEM_NOTE: str
|
|
8
|
+
|
|
9
|
+
def augment_query_with_file_paths(query: str, files: list[str | dict[str, object]]) -> str:
|
|
10
|
+
"""Augment query with file path system notes.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
query: The original user query string.
|
|
14
|
+
files: List of local filesystem paths or file metadata dicts to include.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
The query with system notes appended for each file path.
|
|
18
|
+
|
|
19
|
+
Raises:
|
|
20
|
+
ValueError: If files is not a list of strings or metadata dicts.
|
|
21
|
+
"""
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
__all__ = ['FinalResponseMetadataOptions', 'assemble_final_response']
|
|
6
|
+
|
|
7
|
+
@dataclass(slots=True)
|
|
8
|
+
class FinalResponseMetadataOptions:
|
|
9
|
+
"""Container for optional metadata fields on final response events."""
|
|
10
|
+
step_id: str | None = ...
|
|
11
|
+
previous_step_ids: list[str] | None = ...
|
|
12
|
+
tool_info: dict[str, Any] | None = ...
|
|
13
|
+
thinking_and_activity_info: dict[str, Any] | None = ...
|
|
14
|
+
completion_reason: str | None = ...
|
|
15
|
+
timeout_seconds: float | None = ...
|
|
16
|
+
message: dict[str, Any] | None = ...
|
|
17
|
+
partial_result: str | None = ...
|
|
18
|
+
metadata_extra: dict[str, Any] | None = ...
|
|
19
|
+
|
|
20
|
+
def assemble_final_response(*, content: str, artifacts: list[dict[str, Any]] | None = None, metadata_options: FinalResponseMetadataOptions | None = None, status: str = 'success', task_state: str = 'completed', extra_fields: dict[str, Any] | None = None, timestamp: datetime | None = None) -> dict[str, Any]:
|
|
21
|
+
'''Create a final response event with optional artifacts and overrides.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
content: Human readable message for the final response.
|
|
25
|
+
artifacts: Optional list of artifact dictionaries to attach.
|
|
26
|
+
metadata_options: Metadata overrides passed through to the underlying builder.
|
|
27
|
+
status: Top-level status string; defaults to ``"success"``.
|
|
28
|
+
task_state: State string describing the task; defaults to ``"completed"``.
|
|
29
|
+
extra_fields: Additional top-level fields to merge onto the event.
|
|
30
|
+
timestamp: Explicit timestamp for the event. Defaults to ``datetime.now(UTC)``.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
dict[str, Any]: Final response event payload ready for downstream streaming.
|
|
34
|
+
'''
|
|
@@ -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
|
+
"""
|
|
@@ -134,7 +134,19 @@ class DelegationToolManager(BaseLangGraphToolManager):
|
|
|
134
134
|
Returns:
|
|
135
135
|
The result from the delegated agent, including artifacts if any.
|
|
136
136
|
"""
|
|
137
|
-
|
|
137
|
+
try:
|
|
138
|
+
writer: StreamWriter = get_stream_writer()
|
|
139
|
+
except Exception as exc:
|
|
140
|
+
logger.warning(
|
|
141
|
+
"DelegationToolManager: Stream writer unavailable; delegation streaming disabled.",
|
|
142
|
+
extra={"error": str(exc), "error_type": type(exc).__name__},
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def _noop_writer(_: Any) -> None:
|
|
146
|
+
"""No-op writer for non-graph execution contexts."""
|
|
147
|
+
return None
|
|
148
|
+
|
|
149
|
+
writer = _noop_writer
|
|
138
150
|
|
|
139
151
|
try:
|
|
140
152
|
# Check delegation depth limit before executing
|
|
@@ -295,6 +307,19 @@ class DelegationToolManager(BaseLangGraphToolManager):
|
|
|
295
307
|
cfg_conf = cfg.get("configurable") if isinstance(cfg, dict) else None
|
|
296
308
|
if isinstance(cfg_conf, dict):
|
|
297
309
|
parent_step_id = cfg_conf.get("parent_step_id")
|
|
310
|
+
if not parent_step_id:
|
|
311
|
+
metadata = cfg.get("metadata") or {}
|
|
312
|
+
tool_call_id = (
|
|
313
|
+
cfg_conf.get("tool_call_id")
|
|
314
|
+
or metadata.get("tool_call_id")
|
|
315
|
+
or metadata.get("id")
|
|
316
|
+
or (metadata.get("tool_call") or {}).get("id")
|
|
317
|
+
)
|
|
318
|
+
if tool_call_id and self.parent_agent is not None:
|
|
319
|
+
thread_key = getattr(self.parent_agent, "thread_id_key", "thread_id")
|
|
320
|
+
thread_id = cfg_conf.get(thread_key)
|
|
321
|
+
parent_map = self.parent_agent._tool_parent_map_by_thread.get(str(thread_id), {})
|
|
322
|
+
parent_step_id = parent_map.get(str(tool_call_id))
|
|
298
323
|
_DELEGATION_PARENT_STEP_ID_CVAR.set(parent_step_id)
|
|
299
324
|
except Exception:
|
|
300
325
|
_DELEGATION_PARENT_STEP_ID_CVAR.set(None)
|
|
@@ -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
|
+
"""
|
|
@@ -471,6 +471,86 @@ class ToolOutputManager:
|
|
|
471
471
|
"""
|
|
472
472
|
return self._generate_json_summary(thread_id, max_entries)
|
|
473
473
|
|
|
474
|
+
def get_latest_reference(self, thread_id: str) -> str | None:
|
|
475
|
+
"""Return the most recent tool output reference for a thread.
|
|
476
|
+
|
|
477
|
+
Args:
|
|
478
|
+
thread_id: Thread ID to retrieve the latest output reference for.
|
|
479
|
+
|
|
480
|
+
Returns:
|
|
481
|
+
Latest tool output reference string or None when unavailable.
|
|
482
|
+
"""
|
|
483
|
+
try:
|
|
484
|
+
summary = json.loads(self.generate_summary(thread_id, max_entries=1))
|
|
485
|
+
except Exception as exc:
|
|
486
|
+
logger.debug("Failed to parse tool output summary: %s", exc)
|
|
487
|
+
return None
|
|
488
|
+
|
|
489
|
+
if not summary:
|
|
490
|
+
return None
|
|
491
|
+
latest = summary[0].get("reference")
|
|
492
|
+
return latest if isinstance(latest, str) and latest else None
|
|
493
|
+
|
|
494
|
+
def has_reference(self, value: Any) -> bool:
|
|
495
|
+
"""Check whether a value contains a tool output reference.
|
|
496
|
+
|
|
497
|
+
Args:
|
|
498
|
+
value: Value to inspect for tool output references.
|
|
499
|
+
|
|
500
|
+
Returns:
|
|
501
|
+
True if any tool output reference is present.
|
|
502
|
+
"""
|
|
503
|
+
if isinstance(value, str):
|
|
504
|
+
return value.startswith(TOOL_OUTPUT_REFERENCE_PREFIX)
|
|
505
|
+
if isinstance(value, dict):
|
|
506
|
+
return any(self.has_reference(item) for item in value.values())
|
|
507
|
+
if isinstance(value, list):
|
|
508
|
+
return any(self.has_reference(item) for item in value)
|
|
509
|
+
return False
|
|
510
|
+
|
|
511
|
+
def should_replace_with_reference(self, value: Any) -> bool:
|
|
512
|
+
"""Check whether a tool argument value should use a tool output reference.
|
|
513
|
+
|
|
514
|
+
Args:
|
|
515
|
+
value: Value to evaluate for replacement.
|
|
516
|
+
|
|
517
|
+
Returns:
|
|
518
|
+
True if the value should be replaced with a reference.
|
|
519
|
+
"""
|
|
520
|
+
if isinstance(value, dict | list | tuple):
|
|
521
|
+
return True
|
|
522
|
+
if isinstance(value, str):
|
|
523
|
+
return len(value) > DATA_PREVIEW_TRUNCATION_LENGTH
|
|
524
|
+
return False
|
|
525
|
+
|
|
526
|
+
def rewrite_args_with_latest_reference(self, args: dict[str, Any], thread_id: str) -> dict[str, Any]:
|
|
527
|
+
"""Rewrite tool args to use the latest tool output reference when appropriate.
|
|
528
|
+
|
|
529
|
+
Args:
|
|
530
|
+
args: Tool arguments to rewrite.
|
|
531
|
+
thread_id: Thread ID used for resolving stored outputs.
|
|
532
|
+
|
|
533
|
+
Returns:
|
|
534
|
+
Updated args dictionary with references substituted when needed.
|
|
535
|
+
"""
|
|
536
|
+
if not self.has_outputs(thread_id):
|
|
537
|
+
return args
|
|
538
|
+
if self.has_reference(args):
|
|
539
|
+
return args
|
|
540
|
+
|
|
541
|
+
latest_reference = self.get_latest_reference(thread_id)
|
|
542
|
+
if not latest_reference:
|
|
543
|
+
return args
|
|
544
|
+
|
|
545
|
+
updated_args = dict(args)
|
|
546
|
+
replaced_any = False
|
|
547
|
+
for key, value in args.items():
|
|
548
|
+
if self.should_replace_with_reference(value):
|
|
549
|
+
updated_args[key] = latest_reference
|
|
550
|
+
replaced_any = True
|
|
551
|
+
|
|
552
|
+
return updated_args if replaced_any else args
|
|
553
|
+
|
|
474
554
|
def _generate_json_summary(self, thread_id: str, max_entries: int) -> str:
|
|
475
555
|
"""Generate simplified JSON summary optimized for LLM prompts.
|
|
476
556
|
|