aip-agents-binary 0.6.1__py3-none-any.whl → 0.6.2__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/examples/hello_world_ptc.py +1 -3
- aip_agents/tools/execute_ptc_code.py +19 -16
- {aip_agents_binary-0.6.1.dist-info → aip_agents_binary-0.6.2.dist-info}/METADATA +1 -1
- {aip_agents_binary-0.6.1.dist-info → aip_agents_binary-0.6.2.dist-info}/RECORD +6 -304
- aip_agents/__init__.pyi +0 -19
- aip_agents/a2a/__init__.pyi +0 -3
- aip_agents/a2a/server/__init__.pyi +0 -4
- aip_agents/a2a/server/base_executor.pyi +0 -73
- aip_agents/a2a/server/google_adk_executor.pyi +0 -51
- aip_agents/a2a/server/langflow_executor.pyi +0 -43
- aip_agents/a2a/server/langgraph_executor.pyi +0 -47
- aip_agents/a2a/types.pyi +0 -132
- aip_agents/agent/__init__.pyi +0 -9
- aip_agents/agent/base_agent.pyi +0 -221
- aip_agents/agent/base_langgraph_agent.pyi +0 -233
- aip_agents/agent/google_adk_agent.pyi +0 -141
- aip_agents/agent/google_adk_constants.pyi +0 -3
- aip_agents/agent/hitl/__init__.pyi +0 -6
- aip_agents/agent/hitl/config.pyi +0 -15
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +0 -42
- aip_agents/agent/hitl/manager.pyi +0 -200
- aip_agents/agent/hitl/models.pyi +0 -3
- aip_agents/agent/hitl/prompt/__init__.pyi +0 -4
- aip_agents/agent/hitl/prompt/base.pyi +0 -24
- aip_agents/agent/hitl/prompt/deferred.pyi +0 -30
- aip_agents/agent/hitl/registry.pyi +0 -101
- aip_agents/agent/interface.pyi +0 -81
- aip_agents/agent/interfaces.pyi +0 -44
- aip_agents/agent/langflow_agent.pyi +0 -133
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +0 -49
- aip_agents/agent/langgraph_react_agent.pyi +0 -170
- aip_agents/agent/system_instruction_context.pyi +0 -13
- aip_agents/clients/__init__.pyi +0 -4
- aip_agents/clients/langflow/__init__.pyi +0 -4
- aip_agents/clients/langflow/client.pyi +0 -140
- aip_agents/clients/langflow/types.pyi +0 -7
- aip_agents/constants.pyi +0 -7
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.pyi +0 -48
- aip_agents/examples/compare_streaming_server.pyi +0 -18
- aip_agents/examples/demo_memory_recall.pyi +0 -58
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +0 -9
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +0 -9
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +0 -9
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +0 -15
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +0 -15
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +0 -15
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +0 -15
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +0 -9
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +0 -14
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +0 -16
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +0 -9
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +0 -9
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +0 -2
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +0 -9
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +0 -5
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +0 -14
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +0 -15
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +0 -15
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +0 -48
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +0 -48
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +0 -45
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +0 -5
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +0 -15
- aip_agents/examples/hello_world_google_adk.pyi +0 -5
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +0 -5
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +0 -5
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +0 -5
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +0 -5
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +0 -5
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +0 -5
- aip_agents/examples/hello_world_google_adk_stream.pyi +0 -5
- aip_agents/examples/hello_world_langchain.pyi +0 -5
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +0 -2
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +0 -5
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +0 -16
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +0 -5
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +0 -18
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +0 -5
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +0 -5
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +0 -5
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +0 -5
- aip_agents/examples/hello_world_langchain_stream.pyi +0 -5
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +0 -5
- aip_agents/examples/hello_world_langflow_agent.pyi +0 -35
- aip_agents/examples/hello_world_langgraph.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_stream.pyi +0 -5
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +0 -5
- aip_agents/examples/hello_world_model_switch_cli.pyi +0 -30
- aip_agents/examples/hello_world_multi_agent_adk.pyi +0 -6
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +0 -5
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +0 -5
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +0 -5
- aip_agents/examples/hello_world_pii_logger.pyi +0 -5
- aip_agents/examples/hello_world_ptc.pyi +0 -5
- aip_agents/examples/hello_world_sentry.pyi +0 -21
- aip_agents/examples/hello_world_step_limits.pyi +0 -17
- aip_agents/examples/hello_world_stock_a2a_server.pyi +0 -17
- aip_agents/examples/hello_world_tool_output_client.pyi +0 -5
- aip_agents/examples/hello_world_tool_output_server.pyi +0 -19
- aip_agents/examples/hitl_demo.pyi +0 -67
- aip_agents/examples/pii_demo_langgraph_client.pyi +0 -5
- aip_agents/examples/pii_demo_langgraph_server.pyi +0 -20
- aip_agents/examples/pii_demo_multi_agent_client.pyi +0 -5
- aip_agents/examples/pii_demo_multi_agent_server.pyi +0 -40
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +0 -5
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +0 -19
- aip_agents/examples/tools/__init__.pyi +0 -9
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +0 -24
- aip_agents/examples/tools/adk_weather_tool.pyi +0 -18
- aip_agents/examples/tools/data_generator_tool.pyi +0 -15
- aip_agents/examples/tools/data_visualization_tool.pyi +0 -19
- aip_agents/examples/tools/image_artifact_tool.pyi +0 -26
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +0 -17
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +0 -20
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +0 -25
- aip_agents/examples/tools/langchain_weather_tool.pyi +0 -19
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +0 -43
- aip_agents/examples/tools/mock_retrieval_tool.pyi +0 -13
- aip_agents/examples/tools/pii_demo_tools.pyi +0 -54
- aip_agents/examples/tools/random_chart_tool.pyi +0 -20
- aip_agents/examples/tools/serper_tool.pyi +0 -16
- aip_agents/examples/tools/stock_tools.pyi +0 -36
- aip_agents/examples/tools/table_generator_tool.pyi +0 -22
- aip_agents/examples/tools/time_tool.pyi +0 -15
- aip_agents/examples/tools/weather_forecast_tool.pyi +0 -14
- aip_agents/guardrails/__init__.pyi +0 -6
- aip_agents/guardrails/engines/__init__.pyi +0 -4
- aip_agents/guardrails/engines/base.pyi +0 -61
- aip_agents/guardrails/engines/nemo.pyi +0 -46
- aip_agents/guardrails/engines/phrase_matcher.pyi +0 -48
- aip_agents/guardrails/exceptions.pyi +0 -23
- aip_agents/guardrails/manager.pyi +0 -42
- aip_agents/guardrails/middleware.pyi +0 -87
- aip_agents/guardrails/schemas.pyi +0 -43
- aip_agents/guardrails/utils.pyi +0 -19
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.pyi +0 -5
- aip_agents/mcp/client/base_mcp_client.pyi +0 -148
- aip_agents/mcp/client/connection_manager.pyi +0 -51
- aip_agents/mcp/client/google_adk/__init__.pyi +0 -3
- aip_agents/mcp/client/google_adk/client.pyi +0 -75
- aip_agents/mcp/client/langchain/__init__.pyi +0 -3
- aip_agents/mcp/client/langchain/client.pyi +0 -48
- aip_agents/mcp/client/persistent_session.pyi +0 -122
- aip_agents/mcp/client/session_pool.pyi +0 -101
- aip_agents/mcp/client/transports.pyi +0 -132
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.pyi +0 -82
- aip_agents/memory/__init__.pyi +0 -5
- aip_agents/memory/adapters/__init__.pyi +0 -4
- aip_agents/memory/adapters/base_adapter.pyi +0 -150
- aip_agents/memory/adapters/mem0.pyi +0 -22
- aip_agents/memory/base.pyi +0 -60
- aip_agents/memory/constants.pyi +0 -25
- aip_agents/memory/factory.pyi +0 -24
- aip_agents/memory/guidance.pyi +0 -3
- aip_agents/memory/simple_memory.pyi +0 -23
- aip_agents/middleware/__init__.pyi +0 -5
- aip_agents/middleware/base.pyi +0 -75
- aip_agents/middleware/manager.pyi +0 -84
- aip_agents/middleware/todolist.pyi +0 -125
- aip_agents/ptc/__init__.pyi +0 -10
- aip_agents/ptc/doc_gen.pyi +0 -40
- aip_agents/ptc/exceptions.pyi +0 -22
- aip_agents/ptc/executor.pyi +0 -73
- aip_agents/ptc/mcp/__init__.pyi +0 -7
- aip_agents/ptc/mcp/sandbox_bridge.pyi +0 -47
- aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
- aip_agents/ptc/naming.pyi +0 -76
- aip_agents/ptc/payload.pyi +0 -15
- aip_agents/ptc/prompt_builder.pyi +0 -55
- aip_agents/ptc/ptc_helper.pyi +0 -1
- aip_agents/ptc/sandbox_bridge.pyi +0 -25
- aip_agents/ptc/template_utils.pyi +0 -13
- aip_agents/ptc/templates/__init__.pyi +0 -0
- aip_agents/sandbox/__init__.pyi +0 -5
- aip_agents/sandbox/defaults.pyi +0 -2
- aip_agents/sandbox/e2b_runtime.pyi +0 -51
- aip_agents/sandbox/template_builder.pyi +0 -36
- aip_agents/sandbox/types.pyi +0 -14
- aip_agents/sandbox/validation.pyi +0 -20
- aip_agents/schema/__init__.pyi +0 -9
- aip_agents/schema/a2a.pyi +0 -40
- aip_agents/schema/agent.pyi +0 -65
- aip_agents/schema/hitl.pyi +0 -89
- aip_agents/schema/langgraph.pyi +0 -28
- aip_agents/schema/model_id.pyi +0 -54
- aip_agents/schema/step_limit.pyi +0 -63
- aip_agents/schema/storage.pyi +0 -21
- aip_agents/sentry/__init__.pyi +0 -3
- aip_agents/sentry/sentry.pyi +0 -48
- aip_agents/storage/__init__.pyi +0 -8
- aip_agents/storage/base.pyi +0 -58
- aip_agents/storage/clients/__init__.pyi +0 -3
- aip_agents/storage/clients/minio_client.pyi +0 -137
- aip_agents/storage/config.pyi +0 -29
- aip_agents/storage/providers/__init__.pyi +0 -5
- aip_agents/storage/providers/base.pyi +0 -88
- aip_agents/storage/providers/memory.pyi +0 -79
- aip_agents/storage/providers/object_storage.pyi +0 -98
- aip_agents/tools/__init__.pyi +0 -10
- aip_agents/tools/browser_use/__init__.pyi +0 -14
- aip_agents/tools/browser_use/action_parser.pyi +0 -18
- aip_agents/tools/browser_use/browser_use_tool.pyi +0 -50
- aip_agents/tools/browser_use/llm_config.pyi +0 -52
- aip_agents/tools/browser_use/minio_storage.pyi +0 -109
- aip_agents/tools/browser_use/schemas.pyi +0 -32
- aip_agents/tools/browser_use/session.pyi +0 -4
- aip_agents/tools/browser_use/session_errors.pyi +0 -53
- aip_agents/tools/browser_use/steel_session_recording.pyi +0 -63
- aip_agents/tools/browser_use/streaming.pyi +0 -81
- aip_agents/tools/browser_use/structured_data_parser.pyi +0 -86
- aip_agents/tools/browser_use/structured_data_recovery.pyi +0 -43
- aip_agents/tools/browser_use/types.pyi +0 -45
- aip_agents/tools/code_sandbox/__init__.pyi +0 -3
- aip_agents/tools/code_sandbox/constant.pyi +0 -4
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +0 -102
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +0 -29
- aip_agents/tools/constants.pyi +0 -138
- aip_agents/tools/document_loader/__init__.pyi +0 -7
- aip_agents/tools/document_loader/base_reader.pyi +0 -75
- aip_agents/tools/document_loader/docx_reader_tool.pyi +0 -10
- aip_agents/tools/document_loader/excel_reader_tool.pyi +0 -26
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +0 -11
- aip_agents/tools/document_loader/pdf_splitter.pyi +0 -18
- aip_agents/tools/execute_ptc_code.pyi +0 -87
- aip_agents/tools/gl_connector/__init__.pyi +0 -3
- aip_agents/tools/gl_connector/tool.pyi +0 -74
- aip_agents/tools/gl_connector_tools.pyi +0 -39
- aip_agents/tools/memory_search/__init__.pyi +0 -5
- aip_agents/tools/memory_search/base.pyi +0 -69
- aip_agents/tools/memory_search/mem0.pyi +0 -19
- aip_agents/tools/memory_search/schema.pyi +0 -15
- aip_agents/tools/memory_search_tool.pyi +0 -3
- aip_agents/tools/time_tool.pyi +0 -16
- aip_agents/tools/tool_config_injector.pyi +0 -26
- aip_agents/tools/web_search/__init__.pyi +0 -3
- aip_agents/tools/web_search/serper_tool.pyi +0 -19
- aip_agents/types/__init__.pyi +0 -36
- aip_agents/types/a2a_events.pyi +0 -3
- aip_agents/utils/__init__.pyi +0 -11
- aip_agents/utils/a2a_connector.pyi +0 -146
- aip_agents/utils/artifact_helpers.pyi +0 -203
- aip_agents/utils/constants.pyi +0 -10
- aip_agents/utils/datetime/__init__.pyi +0 -4
- aip_agents/utils/datetime/normalization.pyi +0 -95
- aip_agents/utils/datetime/timezone.pyi +0 -48
- aip_agents/utils/env_loader.pyi +0 -10
- aip_agents/utils/event_handler_registry.pyi +0 -23
- aip_agents/utils/file_prompt_utils.pyi +0 -21
- aip_agents/utils/final_response_builder.pyi +0 -34
- aip_agents/utils/formatter_llm_client.pyi +0 -71
- aip_agents/utils/langgraph/__init__.pyi +0 -3
- aip_agents/utils/langgraph/converter.pyi +0 -49
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +0 -5
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +0 -35
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +0 -48
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +0 -56
- aip_agents/utils/langgraph/tool_output_management.pyi +0 -329
- aip_agents/utils/logger.pyi +0 -60
- aip_agents/utils/metadata/__init__.pyi +0 -5
- aip_agents/utils/metadata/activity_metadata_helper.pyi +0 -25
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +0 -7
- aip_agents/utils/metadata/activity_narrative/builder.pyi +0 -35
- aip_agents/utils/metadata/activity_narrative/constants.pyi +0 -10
- aip_agents/utils/metadata/activity_narrative/context.pyi +0 -32
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +0 -48
- aip_agents/utils/metadata/activity_narrative/utils.pyi +0 -12
- aip_agents/utils/metadata/schemas/__init__.pyi +0 -4
- aip_agents/utils/metadata/schemas/activity_schema.pyi +0 -18
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +0 -20
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +0 -4
- aip_agents/utils/metadata_helper.pyi +0 -117
- aip_agents/utils/name_preprocessor/__init__.pyi +0 -6
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +0 -52
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +0 -38
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +0 -41
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +0 -34
- aip_agents/utils/pii/__init__.pyi +0 -5
- aip_agents/utils/pii/pii_handler.pyi +0 -96
- aip_agents/utils/pii/pii_helper.pyi +0 -78
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +0 -73
- aip_agents/utils/reference_helper.pyi +0 -81
- aip_agents/utils/sse_chunk_transformer.pyi +0 -166
- aip_agents/utils/step_limit_manager.pyi +0 -112
- aip_agents/utils/token_usage_helper.pyi +0 -60
- {aip_agents_binary-0.6.1.dist-info → aip_agents_binary-0.6.2.dist-info}/WHEEL +0 -0
- {aip_agents_binary-0.6.1.dist-info → aip_agents_binary-0.6.2.dist-info}/top_level.txt +0 -0
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from a2a.types import AgentCard as AgentCard
|
|
3
|
-
from abc import abstractmethod
|
|
4
|
-
from aip_agents.agent.base_agent import BaseAgent as BaseAgent
|
|
5
|
-
from aip_agents.agent.system_instruction_context import get_current_date_context as get_current_date_context
|
|
6
|
-
from aip_agents.constants import TEXT_PREVIEW_LENGTH as TEXT_PREVIEW_LENGTH
|
|
7
|
-
from aip_agents.mcp.client import LangchainMCPClient as LangchainMCPClient
|
|
8
|
-
from aip_agents.memory import BaseMemory as BaseMemory, MemoryFactory as MemoryFactory, MemoryMethod as MemoryMethod
|
|
9
|
-
from aip_agents.memory.constants import MemoryDefaults as MemoryDefaults
|
|
10
|
-
from aip_agents.schema.agent import StreamMode as StreamMode
|
|
11
|
-
from aip_agents.schema.hitl import HitlMetadata as HitlMetadata
|
|
12
|
-
from aip_agents.tools.tool_config_injector import CONFIG_SCHEMA_ATTR as CONFIG_SCHEMA_ATTR, TOOL_CONFIG_SCHEMA_ATTR as TOOL_CONFIG_SCHEMA_ATTR, inject_config_methods_into_tool as inject_config_methods_into_tool
|
|
13
|
-
from aip_agents.types import A2AEvent as A2AEvent, A2AStreamEventType as A2AStreamEventType
|
|
14
|
-
from aip_agents.utils import augment_query_with_file_paths as augment_query_with_file_paths, validate_references as validate_references
|
|
15
|
-
from aip_agents.utils.langgraph.tool_managers.a2a_tool_manager import A2AToolManager as A2AToolManager
|
|
16
|
-
from aip_agents.utils.langgraph.tool_managers.delegation_tool_manager import DelegationToolManager as DelegationToolManager
|
|
17
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
18
|
-
from aip_agents.utils.metadata.activity_metadata_helper import create_tool_activity_info as create_tool_activity_info
|
|
19
|
-
from aip_agents.utils.metadata_helper import DefaultStepMessages as DefaultStepMessages, Kind as Kind, MetadataFieldKeys as MetadataFieldKeys, Status as Status, end_step_counter_scope as end_step_counter_scope, get_next_step_number as get_next_step_number, start_step_counter_scope as start_step_counter_scope
|
|
20
|
-
from aip_agents.utils.pii import deanonymize_final_response_content as deanonymize_final_response_content
|
|
21
|
-
from aip_agents.utils.sse_chunk_transformer import SSEChunkTransformer as SSEChunkTransformer
|
|
22
|
-
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
|
|
23
|
-
from collections.abc import AsyncGenerator, Sequence
|
|
24
|
-
from dataclasses import dataclass
|
|
25
|
-
from gllm_core.event import EventEmitter
|
|
26
|
-
from gllm_core.schema import Chunk as Chunk
|
|
27
|
-
from langchain_core.tools import BaseTool
|
|
28
|
-
from langgraph.graph import StateGraph
|
|
29
|
-
from langgraph.graph.message import add_messages as add_messages
|
|
30
|
-
from langgraph.graph.state import CompiledStateGraph
|
|
31
|
-
from langgraph.types import Checkpointer
|
|
32
|
-
from typing import Any
|
|
33
|
-
|
|
34
|
-
logger: Incomplete
|
|
35
|
-
|
|
36
|
-
@dataclass
|
|
37
|
-
class _StreamingContext:
|
|
38
|
-
"""Context object for managing streaming state and configuration."""
|
|
39
|
-
original_query: str
|
|
40
|
-
graph_input: dict[str, Any]
|
|
41
|
-
config: dict[str, Any]
|
|
42
|
-
memory_user_id: str | None
|
|
43
|
-
current_thread_id: str
|
|
44
|
-
token: Any
|
|
45
|
-
enable_token_streaming: bool
|
|
46
|
-
final_event_yielded: bool = ...
|
|
47
|
-
pending_artifacts: list | None = ...
|
|
48
|
-
seen_artifact_hashes: set | None = ...
|
|
49
|
-
processed_message_count: int = ...
|
|
50
|
-
final_state: dict[str, Any] | None = ...
|
|
51
|
-
last_final_content: str | None = ...
|
|
52
|
-
saved_memory: bool = ...
|
|
53
|
-
is_token_streaming: bool = ...
|
|
54
|
-
def __post_init__(self) -> None:
|
|
55
|
-
"""Initialize mutable defaults."""
|
|
56
|
-
|
|
57
|
-
class BaseLangGraphAgent(BaseAgent):
|
|
58
|
-
"""Base class for LangGraph-based agents with unified tool approach.
|
|
59
|
-
|
|
60
|
-
Provides core LangGraph functionality including:
|
|
61
|
-
- Graph compilation and execution
|
|
62
|
-
- State schema management
|
|
63
|
-
- I/O mapping between user inputs and graph states
|
|
64
|
-
- Event emission support
|
|
65
|
-
- Tool resolution and handling
|
|
66
|
-
- A2A communication capabilities via tools
|
|
67
|
-
- Agent delegation capabilities via tools
|
|
68
|
-
- MCP server integration via tools
|
|
69
|
-
- Enhanced output extraction from various state formats
|
|
70
|
-
|
|
71
|
-
Tool Management:
|
|
72
|
-
- regular_tools: Standard LangChain tools provided during initialization
|
|
73
|
-
- mcp_tools: Tools retrieved from MCP servers
|
|
74
|
-
- resolved_tools: Combined collection of all tools for graph execution
|
|
75
|
-
|
|
76
|
-
Subclasses must implement:
|
|
77
|
-
- define_graph(): Define the specific graph structure
|
|
78
|
-
- _prepare_graph_input(): Convert user input to graph state
|
|
79
|
-
- _format_graph_output(): Convert final graph state to user output
|
|
80
|
-
"""
|
|
81
|
-
state_schema: Incomplete
|
|
82
|
-
thread_id_key: Incomplete
|
|
83
|
-
enable_a2a_token_streaming: Incomplete
|
|
84
|
-
event_emitter: Incomplete
|
|
85
|
-
checkpointer: Incomplete
|
|
86
|
-
tool_output_manager: Incomplete
|
|
87
|
-
memory: BaseMemory | None
|
|
88
|
-
a2a_tool_manager: Incomplete
|
|
89
|
-
delegation_tool_manager: Incomplete
|
|
90
|
-
regular_tools: list[BaseTool]
|
|
91
|
-
mcp_tools: list[BaseTool]
|
|
92
|
-
resolved_tools: list[BaseTool]
|
|
93
|
-
def __init__(self, name: str, instruction: str, description: str | None = None, model: Any | None = None, tools: Sequence[BaseTool] | None = None, state_schema: type | None = None, thread_id_key: str = 'thread_id', event_emitter: EventEmitter | None = None, checkpointer: Checkpointer | None = None, enable_a2a_token_streaming: bool = False, **kwargs: Any) -> None:
|
|
94
|
-
'''Initialize the BaseLangGraphAgent.
|
|
95
|
-
|
|
96
|
-
Args:
|
|
97
|
-
name: The name of the agent.
|
|
98
|
-
instruction: The system instruction for the agent.
|
|
99
|
-
description: Human-readable description of the agent.
|
|
100
|
-
model: The model to use (lm_invoker, LangChain model, string, etc.).
|
|
101
|
-
tools: Sequence of regular LangChain tools (not A2A or delegation tools).
|
|
102
|
-
state_schema: The state schema for the LangGraph. Defaults to basic message state.
|
|
103
|
-
thread_id_key: Key for thread ID in configuration.
|
|
104
|
-
event_emitter: Optional event emitter for streaming updates.
|
|
105
|
-
checkpointer: Optional checkpointer for conversation persistence.
|
|
106
|
-
enable_a2a_token_streaming: Enable token-level streaming for A2A responses.
|
|
107
|
-
- False (default): Stream message-level events only
|
|
108
|
-
- True: Stream individual tokens plus message-level events
|
|
109
|
-
**kwargs: Additional keyword arguments passed to BaseAgent (including tool_configs and memory settings).
|
|
110
|
-
Memory settings include:
|
|
111
|
-
- memory_backend: Memory backend (e.g., "mem0")
|
|
112
|
-
- agent_id: Agent identifier for memory scoping
|
|
113
|
-
- memory_namespace: Memory namespace
|
|
114
|
-
- save_interaction_to_memory: Whether to save interactions (default True)
|
|
115
|
-
'''
|
|
116
|
-
def set_operation_mode(self, mode: str) -> None:
|
|
117
|
-
'''Set the operation mode for dependency tracking.
|
|
118
|
-
|
|
119
|
-
Args:
|
|
120
|
-
mode: Operation mode - "parallel" (default) or "sequential"
|
|
121
|
-
'''
|
|
122
|
-
@abstractmethod
|
|
123
|
-
def define_graph(self, graph_builder: StateGraph) -> CompiledStateGraph:
|
|
124
|
-
"""Define the specific graph structure for this agent type.
|
|
125
|
-
|
|
126
|
-
Subclasses must implement this method to:
|
|
127
|
-
1. Add nodes to the graph_builder
|
|
128
|
-
2. Add edges and conditional edges
|
|
129
|
-
3. Set entry points
|
|
130
|
-
4. Return the compiled graph
|
|
131
|
-
|
|
132
|
-
Args:
|
|
133
|
-
graph_builder: The StateGraph builder to define nodes and edges on.
|
|
134
|
-
|
|
135
|
-
Returns:
|
|
136
|
-
The compiled graph ready for execution.
|
|
137
|
-
"""
|
|
138
|
-
def register_a2a_agents(self, agent_cards: list[AgentCard]) -> None:
|
|
139
|
-
"""Register A2A communication capabilities using the A2A tool manager.
|
|
140
|
-
|
|
141
|
-
Args:
|
|
142
|
-
agent_cards (list[AgentCard]): List of AgentCard instances for external communication.
|
|
143
|
-
"""
|
|
144
|
-
def register_delegation_agents(self, agents: list[BaseAgent]) -> None:
|
|
145
|
-
"""Register internal agent delegation capabilities using the delegation tool manager.
|
|
146
|
-
|
|
147
|
-
Args:
|
|
148
|
-
agents: List of BaseAgent instances for internal task delegation.
|
|
149
|
-
"""
|
|
150
|
-
tools: Incomplete
|
|
151
|
-
def update_regular_tools(self, new_tools: list[BaseTool], rebuild_graph: bool | None = None) -> None:
|
|
152
|
-
"""Update regular tools (not capabilities).
|
|
153
|
-
|
|
154
|
-
Args:
|
|
155
|
-
new_tools: New list of regular tools to use.
|
|
156
|
-
rebuild_graph: Whether to rebuild graph. If None, uses auto_rebuild_graph setting.
|
|
157
|
-
"""
|
|
158
|
-
def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
159
|
-
"""Synchronously run the LangGraph agent.
|
|
160
|
-
|
|
161
|
-
Args:
|
|
162
|
-
query: The input query for the agent.
|
|
163
|
-
**kwargs: Additional keyword arguments.
|
|
164
|
-
|
|
165
|
-
Returns:
|
|
166
|
-
Dictionary containing the agent's response.
|
|
167
|
-
"""
|
|
168
|
-
async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
169
|
-
"""Asynchronously run the LangGraph agent with lazy MCP initialization.
|
|
170
|
-
|
|
171
|
-
Args:
|
|
172
|
-
query: The input query for the agent.
|
|
173
|
-
**kwargs: Additional keyword arguments including configurable for LangGraph.
|
|
174
|
-
|
|
175
|
-
Returns:
|
|
176
|
-
Dictionary containing the agent's response and full final state.
|
|
177
|
-
"""
|
|
178
|
-
async def arun_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[str | dict[str, Any], None]:
|
|
179
|
-
"""Asynchronously stream the LangGraph agent's response.
|
|
180
|
-
|
|
181
|
-
If MCP configuration exists, connects to the MCP server and registers tools before streaming.
|
|
182
|
-
This method properly handles both LM Invoker and LangChain model streaming:
|
|
183
|
-
- For LM Invoker: Uses StreamEventHandler to capture streaming events
|
|
184
|
-
- For LangChain models: Uses LangGraph's native streaming implementation
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
query: The input query for the agent.
|
|
188
|
-
**kwargs: Additional keyword arguments.
|
|
189
|
-
|
|
190
|
-
Yields:
|
|
191
|
-
Chunks of output (strings or dicts) from the streaming response.
|
|
192
|
-
"""
|
|
193
|
-
async def cleanup(self) -> None:
|
|
194
|
-
"""Cleanup MCP resources including persistent sessions.
|
|
195
|
-
|
|
196
|
-
This method performs best-effort cleanup of MCP client resources.
|
|
197
|
-
Errors during cleanup are logged but do not raise exceptions to ensure
|
|
198
|
-
the cleanup process completes gracefully.
|
|
199
|
-
"""
|
|
200
|
-
async def arun_a2a_stream(self, query: str, **kwargs: Any) -> AsyncGenerator[A2AEvent, None]:
|
|
201
|
-
'''Asynchronously streams the agent\'s response in A2A format.
|
|
202
|
-
|
|
203
|
-
Args:
|
|
204
|
-
query: The input query for the agent.
|
|
205
|
-
**kwargs: Additional keyword arguments.
|
|
206
|
-
|
|
207
|
-
Yields:
|
|
208
|
-
Dictionaries with "status" and "content" keys.
|
|
209
|
-
Possible statuses: "working", "completed", "failed", "canceled".
|
|
210
|
-
'''
|
|
211
|
-
async def arun_sse_stream(self, query: str, task_id: str | None = None, context_id: str | None = None, **kwargs: Any) -> AsyncGenerator[A2AEvent, None]:
|
|
212
|
-
'''Stream agent response as SSE-compatible chunks.
|
|
213
|
-
|
|
214
|
-
This method wraps arun_a2a_stream and transforms output to the normalized
|
|
215
|
-
dict format matching A2AConnector.astream_to_agent output, enabling direct
|
|
216
|
-
streaming without A2A server overhead.
|
|
217
|
-
|
|
218
|
-
Args:
|
|
219
|
-
query: The input query for the agent.
|
|
220
|
-
task_id: Optional task identifier for the stream.
|
|
221
|
-
context_id: Optional context identifier for the stream.
|
|
222
|
-
**kwargs: Additional arguments passed to arun_a2a_stream.
|
|
223
|
-
|
|
224
|
-
Yields:
|
|
225
|
-
SSEChunk dicts with normalized structure:
|
|
226
|
-
- status: "success" | "error"
|
|
227
|
-
- task_state: "working" | "completed" | "failed" | "canceled"
|
|
228
|
-
- content: Text content or None
|
|
229
|
-
- event_type: Always string (never enum)
|
|
230
|
-
- final: True for terminal events
|
|
231
|
-
- metadata: Normalized metadata dict
|
|
232
|
-
- artifacts: Only present when non-empty
|
|
233
|
-
'''
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from a2a.types import AgentCard
|
|
3
|
-
from aip_agents.agent.base_agent import BaseAgent as BaseAgent
|
|
4
|
-
from aip_agents.agent.google_adk_constants import DEFAULT_AUTH_URL as DEFAULT_AUTH_URL
|
|
5
|
-
from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient as GoogleADKMCPClient
|
|
6
|
-
from aip_agents.utils.a2a_connector import A2AConnector as A2AConnector
|
|
7
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
8
|
-
from collections.abc import AsyncGenerator, AsyncIterator
|
|
9
|
-
from google.adk.agents import LlmAgent
|
|
10
|
-
from google.adk.tools.langchain_tool import LangchainTool
|
|
11
|
-
from langchain.tools import BaseTool as LangchainBaseTool
|
|
12
|
-
from pydantic import BaseModel
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
logger: Incomplete
|
|
16
|
-
MODEL_TEMPERATURE: float
|
|
17
|
-
|
|
18
|
-
class A2AToolInput(BaseModel):
|
|
19
|
-
"""Input for the A2ATool."""
|
|
20
|
-
query: str
|
|
21
|
-
|
|
22
|
-
class A2ATool(LangchainBaseTool):
|
|
23
|
-
"""A tool that communicates with an A2A agent."""
|
|
24
|
-
name: str
|
|
25
|
-
description: str
|
|
26
|
-
args_schema: type[BaseModel]
|
|
27
|
-
agent_card: AgentCard
|
|
28
|
-
|
|
29
|
-
def create_a2a_tool(agent_card: AgentCard) -> LangchainTool:
|
|
30
|
-
"""Create a LangChain tool from an A2A agent card.
|
|
31
|
-
|
|
32
|
-
Args:
|
|
33
|
-
agent_card (AgentCard): The A2A agent card to create a tool for.
|
|
34
|
-
|
|
35
|
-
Returns:
|
|
36
|
-
LangchainTool: A LangChain tool that can communicate with the A2A agent.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
class GoogleADKAgent(BaseAgent):
|
|
40
|
-
"""An agent that wraps a native Google ADK Agent with MCP support.
|
|
41
|
-
|
|
42
|
-
This class implements the AgentInterface and uses Google's LlmAgent
|
|
43
|
-
to handle the core conversation and tool execution logic via ADK's
|
|
44
|
-
async-first design. It includes persistent MCP session management for
|
|
45
|
-
stateful tool execution across multiple calls.
|
|
46
|
-
|
|
47
|
-
The agent supports:
|
|
48
|
-
- Native ADK tools (FunctionTool, LangchainTool)
|
|
49
|
-
- MCP tools via GoogleADKMCPClient with session persistence
|
|
50
|
-
- Sub-agent delegation using ADK's built-in multi-agent capabilities
|
|
51
|
-
- A2A communication through tool integration
|
|
52
|
-
"""
|
|
53
|
-
adk_native_agent: LlmAgent
|
|
54
|
-
model: Incomplete
|
|
55
|
-
max_iterations: Incomplete
|
|
56
|
-
tools: Incomplete
|
|
57
|
-
agents: Incomplete
|
|
58
|
-
session_service: Incomplete
|
|
59
|
-
name: Incomplete
|
|
60
|
-
def __init__(self, name: str, instruction: str, model: str, tools: list[Any] | None = None, description: str | None = None, max_iterations: int = 3, agents: list['GoogleADKAgent'] | None = None, **kwargs: Any) -> None:
|
|
61
|
-
'''Initializes the GoogleADKAgent with MCP support.
|
|
62
|
-
|
|
63
|
-
Args:
|
|
64
|
-
name: The name of this wrapper agent.
|
|
65
|
-
instruction: The instruction for this wrapper agent.
|
|
66
|
-
model: The name of the Google ADK model to use (e.g., "gemini-1.5-pro-latest").
|
|
67
|
-
tools: An optional list of callable tools for the ADK agent.
|
|
68
|
-
description: An optional human-readable description.
|
|
69
|
-
max_iterations: Maximum number of iterations to run (default: 3).
|
|
70
|
-
agents: Optional list of sub-agents that this agent can delegate to using ADK\'s
|
|
71
|
-
built-in multi-agent capabilities. These will be passed as sub_agents to the
|
|
72
|
-
underlying LlmAgent.
|
|
73
|
-
**kwargs: Additional keyword arguments passed to the parent `__init__`.
|
|
74
|
-
'''
|
|
75
|
-
def run(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
76
|
-
'''Synchronously runs the Google ADK agent by wrapping the internal async run method.
|
|
77
|
-
|
|
78
|
-
Args:
|
|
79
|
-
query: The input query for the agent.
|
|
80
|
-
**kwargs: Additional keyword arguments passed to the internal async run method.
|
|
81
|
-
Supports "session_id", "user_id", "app_name".
|
|
82
|
-
|
|
83
|
-
Returns:
|
|
84
|
-
A dictionary containing the agent\'s response.
|
|
85
|
-
|
|
86
|
-
Raises:
|
|
87
|
-
RuntimeError: If `asyncio.run()` is called from an already running event loop,
|
|
88
|
-
or for other unhandled errors during synchronous execution.
|
|
89
|
-
'''
|
|
90
|
-
async def arun(self, query: str, **kwargs: Any) -> dict[str, Any]:
|
|
91
|
-
'''Asynchronously runs the agent with MCP tool support.
|
|
92
|
-
|
|
93
|
-
This method ensures MCP tools are properly initialized before execution
|
|
94
|
-
and provides persistent session management for stateful MCP tools.
|
|
95
|
-
|
|
96
|
-
Args:
|
|
97
|
-
query: The user\'s query to process.
|
|
98
|
-
**kwargs: Additional keyword arguments. Supports "session_id", "user_id", "app_name".
|
|
99
|
-
|
|
100
|
-
Returns:
|
|
101
|
-
A dictionary containing the output, tool_calls, and session_id.
|
|
102
|
-
'''
|
|
103
|
-
async def cleanup(self) -> None:
|
|
104
|
-
"""Clean up ADK and MCP resources."""
|
|
105
|
-
async def arun_stream(self, query: str, **kwargs: Any) -> AsyncIterator[str]:
|
|
106
|
-
'''Runs the agent with the given query and streams the response parts.
|
|
107
|
-
|
|
108
|
-
Args:
|
|
109
|
-
query: The user\'s query to process.
|
|
110
|
-
**kwargs: Additional keyword arguments. Supports "session_id", "user_id", "app_name".
|
|
111
|
-
|
|
112
|
-
Yields:
|
|
113
|
-
Text response chunks from the model. If an error occurs, the error message is yielded.
|
|
114
|
-
'''
|
|
115
|
-
def register_a2a_agents(self, agent_cards: list[AgentCard]) -> None:
|
|
116
|
-
"""Convert known A2A agents to LangChain tools.
|
|
117
|
-
|
|
118
|
-
This method takes the agents from a2a_config.known_agents, creates A2AAgent
|
|
119
|
-
instances for each one, and wraps them in LangChain tools.
|
|
120
|
-
|
|
121
|
-
Args:
|
|
122
|
-
agent_cards (list[AgentCard]): List of A2A agent cards to register as tools.
|
|
123
|
-
|
|
124
|
-
Returns:
|
|
125
|
-
None: The tools are added to the existing tools list.
|
|
126
|
-
"""
|
|
127
|
-
async def arun_a2a_stream(self, query: str, configurable: dict[str, Any] | None = None, **kwargs: Any) -> AsyncGenerator[dict[str, Any], None]:
|
|
128
|
-
'''Asynchronously streams the agent\'s response in a format compatible with A2A.
|
|
129
|
-
|
|
130
|
-
This method formats the ADK agent\'s streaming responses into a consistent format
|
|
131
|
-
that the A2A executor can understand and process.
|
|
132
|
-
|
|
133
|
-
Args:
|
|
134
|
-
query: The input query for the agent.
|
|
135
|
-
configurable: Optional dictionary for configuration, may include:
|
|
136
|
-
- thread_id: The A2A task ID (used as session_id).
|
|
137
|
-
**kwargs: Additional keyword arguments. Supports "user_id", "app_name".
|
|
138
|
-
|
|
139
|
-
Yields:
|
|
140
|
-
Dictionary with \'status\' and \'content\' fields that describe the agent\'s response state.
|
|
141
|
-
'''
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
from aip_agents.agent.hitl.config import ToolApprovalConfig as ToolApprovalConfig
|
|
2
|
-
from aip_agents.agent.hitl.manager import ApprovalManager as ApprovalManager
|
|
3
|
-
from aip_agents.agent.hitl.prompt import BasePromptHandler as BasePromptHandler, DeferredPromptHandler as DeferredPromptHandler
|
|
4
|
-
from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalLogEntry as ApprovalLogEntry, ApprovalRequest as ApprovalRequest
|
|
5
|
-
|
|
6
|
-
__all__ = ['ToolApprovalConfig', 'ApprovalManager', 'ApprovalDecision', 'ApprovalLogEntry', 'ApprovalRequest', 'BasePromptHandler', 'DeferredPromptHandler']
|
aip_agents/agent/hitl/config.pyi
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
|
|
3
|
-
@dataclass
|
|
4
|
-
class ToolApprovalConfig:
|
|
5
|
-
"""Configuration for HITL approval behavior attached to a tool.
|
|
6
|
-
|
|
7
|
-
Supplying this configuration marks the tool as requiring approval. Only the
|
|
8
|
-
timeout is configurable; timeouts always result in a safe skip.
|
|
9
|
-
|
|
10
|
-
Attributes:
|
|
11
|
-
timeout_seconds: Defaults to 300; must be >0.
|
|
12
|
-
"""
|
|
13
|
-
timeout_seconds: int = ...
|
|
14
|
-
def __post_init__(self) -> None:
|
|
15
|
-
"""Validate configuration after initialization."""
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.agent.hitl.config import ToolApprovalConfig as ToolApprovalConfig
|
|
3
|
-
from aip_agents.agent.hitl.manager import ApprovalManager as ApprovalManager
|
|
4
|
-
from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalDecisionType as ApprovalDecisionType, ApprovalRequest as ApprovalRequest, HitlMetadata as HitlMetadata
|
|
5
|
-
from aip_agents.schema.langgraph import ToolCallResult as ToolCallResult
|
|
6
|
-
from aip_agents.tools.tool_config_injector import TOOL_CONFIGS_KEY as TOOL_CONFIGS_KEY
|
|
7
|
-
from aip_agents.utils.datetime import ensure_utc_datetime as ensure_utc_datetime
|
|
8
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
9
|
-
from collections.abc import Callable
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
logger: Incomplete
|
|
13
|
-
MAX_CONTEXT_MESSAGE_LENGTH: int
|
|
14
|
-
|
|
15
|
-
class LangGraphHitLMixin:
|
|
16
|
-
"""Provide Human-in-the-Loop helpers for LangGraph agents."""
|
|
17
|
-
tool_configs: dict[str, Any] | None
|
|
18
|
-
name: str
|
|
19
|
-
@property
|
|
20
|
-
def hitl_manager(self) -> ApprovalManager | None:
|
|
21
|
-
"""Return the active ``ApprovalManager``, creating one if needed."""
|
|
22
|
-
@hitl_manager.setter
|
|
23
|
-
def hitl_manager(self, manager: ApprovalManager | None) -> None:
|
|
24
|
-
"""Set the HITL approval manager instance.
|
|
25
|
-
|
|
26
|
-
Args:
|
|
27
|
-
manager: ApprovalManager instance or None.
|
|
28
|
-
"""
|
|
29
|
-
def ensure_hitl_manager(self) -> ApprovalManager | None:
|
|
30
|
-
"""Ensure an ``ApprovalManager`` exists when HITL configs are present."""
|
|
31
|
-
def use_hitl_manager(self, manager: ApprovalManager) -> None:
|
|
32
|
-
"""Replace the current ``ApprovalManager`` with the supplied instance.
|
|
33
|
-
|
|
34
|
-
Args:
|
|
35
|
-
manager: The ApprovalManager instance to use for HITL approvals.
|
|
36
|
-
"""
|
|
37
|
-
def register_hitl_notifier(self, notifier: Callable[[ApprovalRequest], None]) -> None:
|
|
38
|
-
"""Register a notifier callback to receive HITL approval requests.
|
|
39
|
-
|
|
40
|
-
Args:
|
|
41
|
-
notifier: Callback function that will be called with approval requests.
|
|
42
|
-
"""
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.agent.hitl.config import ToolApprovalConfig as ToolApprovalConfig
|
|
3
|
-
from aip_agents.agent.hitl.prompt import BasePromptHandler as BasePromptHandler, DeferredPromptHandler as DeferredPromptHandler
|
|
4
|
-
from aip_agents.agent.hitl.registry import hitl_registry as hitl_registry
|
|
5
|
-
from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalDecisionType as ApprovalDecisionType, ApprovalLogEntry as ApprovalLogEntry, ApprovalRequest as ApprovalRequest
|
|
6
|
-
from collections.abc import Callable as Callable, Iterable
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
MAX_ARGUMENTS_PREVIEW_LENGTH: int
|
|
10
|
-
DECISION_MESSAGE_MAP: Incomplete
|
|
11
|
-
TOOL_EXECUTION_BLOCKING_DECISIONS: Incomplete
|
|
12
|
-
|
|
13
|
-
class ApprovalManager:
|
|
14
|
-
"""Manages the HITL approval workflow for tools.
|
|
15
|
-
|
|
16
|
-
This class coordinates the approval process from configuration through
|
|
17
|
-
to final decision, handling timeouts and cleanup.
|
|
18
|
-
"""
|
|
19
|
-
def __init__(self, prompt_handler: BasePromptHandler | None = None) -> None:
|
|
20
|
-
"""Initialize the approval manager.
|
|
21
|
-
|
|
22
|
-
Args:
|
|
23
|
-
prompt_handler: Optional prompt handler for user interaction.
|
|
24
|
-
Defaults to DeferredPromptHandler which exposes pending requests
|
|
25
|
-
for out-of-band resolution.
|
|
26
|
-
"""
|
|
27
|
-
def create_approval_request(self, tool_name: str, arguments: dict[str, Any], config: ToolApprovalConfig, context: dict[str, str] | None = None) -> ApprovalRequest:
|
|
28
|
-
"""Create a new approval request for a tool call.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
tool_name: Name of the tool being called.
|
|
32
|
-
arguments: Tool arguments (will be JSON serialized).
|
|
33
|
-
config: Approval configuration for this tool.
|
|
34
|
-
context: Optional context metadata. Defaults to None.
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
The created approval request.
|
|
38
|
-
"""
|
|
39
|
-
def get_pending_request(self, request_id: str) -> ApprovalRequest | None:
|
|
40
|
-
"""Get a pending approval request by ID.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
request_id: The unique identifier of the approval request.
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
The pending approval request if found, None otherwise.
|
|
47
|
-
"""
|
|
48
|
-
def approve_request(self, request: ApprovalRequest, operator_input: str = 'approved') -> ApprovalDecision:
|
|
49
|
-
'''Record an approval decision for a request.
|
|
50
|
-
|
|
51
|
-
This method creates an approval decision, calculates latency metrics,
|
|
52
|
-
and removes the request from the active requests queue.
|
|
53
|
-
|
|
54
|
-
Args:
|
|
55
|
-
request: The approval request to approve.
|
|
56
|
-
operator_input: Raw operator input that led to this decision. Defaults to "approved".
|
|
57
|
-
|
|
58
|
-
Returns:
|
|
59
|
-
The recorded approval decision.
|
|
60
|
-
'''
|
|
61
|
-
def reject_request(self, request: ApprovalRequest, operator_input: str = 'rejected') -> ApprovalDecision:
|
|
62
|
-
'''Record a rejection decision for a request.
|
|
63
|
-
|
|
64
|
-
This method creates a rejection decision, calculates latency metrics,
|
|
65
|
-
and removes the request from the active requests queue.
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
request: The approval request to reject.
|
|
69
|
-
operator_input: Raw operator input that led to this decision. Defaults to "rejected".
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
The recorded rejection decision.
|
|
73
|
-
'''
|
|
74
|
-
def skip_request(self, request: ApprovalRequest, operator_input: str = 'skipped') -> ApprovalDecision:
|
|
75
|
-
'''Record a skip decision for a request.
|
|
76
|
-
|
|
77
|
-
This method creates a skip decision, calculates latency metrics,
|
|
78
|
-
and removes the request from the active requests queue.
|
|
79
|
-
|
|
80
|
-
Args:
|
|
81
|
-
request: The approval request to skip.
|
|
82
|
-
operator_input: Raw operator input that led to this decision. Defaults to "skipped".
|
|
83
|
-
|
|
84
|
-
Returns:
|
|
85
|
-
The recorded skip decision.
|
|
86
|
-
'''
|
|
87
|
-
def timeout_request(self, request: ApprovalRequest, operator_input: str = 'TIMEOUT') -> ApprovalDecision:
|
|
88
|
-
'''Record a timeout decision for a request, always skipping the tool.
|
|
89
|
-
|
|
90
|
-
Args:
|
|
91
|
-
request (ApprovalRequest): The approval request that timed out.
|
|
92
|
-
operator_input (str, optional): Input from the operator (defaults to "TIMEOUT").
|
|
93
|
-
|
|
94
|
-
Returns:
|
|
95
|
-
ApprovalDecision: The timeout decision.
|
|
96
|
-
'''
|
|
97
|
-
def check_timeout(self, request: ApprovalRequest) -> ApprovalDecision | None:
|
|
98
|
-
"""Check if a request has timed out and return timeout decision if so.
|
|
99
|
-
|
|
100
|
-
Args:
|
|
101
|
-
request: The approval request to check.
|
|
102
|
-
|
|
103
|
-
Returns:
|
|
104
|
-
Timeout decision if timed out, None otherwise.
|
|
105
|
-
"""
|
|
106
|
-
async def prompt_for_decision(self, request: ApprovalRequest, timeout_seconds: int, context_keys: list[str] | None = None) -> ApprovalDecision:
|
|
107
|
-
"""Prompt for a decision using the configured handler.
|
|
108
|
-
|
|
109
|
-
This method delegates to the configured prompt handler to obtain
|
|
110
|
-
an approval decision from the operator. The handler may be interactive
|
|
111
|
-
(CLI) or deferred (programmatic, resume-in-place).
|
|
112
|
-
|
|
113
|
-
Args:
|
|
114
|
-
request: The approval request to prompt for.
|
|
115
|
-
timeout_seconds: How long to wait for input.
|
|
116
|
-
context_keys: Optional keys to display from context. Defaults to None.
|
|
117
|
-
|
|
118
|
-
Returns:
|
|
119
|
-
The operator's decision on the request.
|
|
120
|
-
"""
|
|
121
|
-
def list_pending_requests(self) -> Iterable[ApprovalRequest]:
|
|
122
|
-
"""Return a snapshot of currently pending requests.
|
|
123
|
-
|
|
124
|
-
This method provides a thread-safe snapshot of all currently active
|
|
125
|
-
approval requests that are waiting for operator decisions.
|
|
126
|
-
|
|
127
|
-
Returns:
|
|
128
|
-
An iterable of all pending approval requests.
|
|
129
|
-
"""
|
|
130
|
-
def resolve_pending_request(self, request_id: str, decision: str, operator_input: str = '') -> ApprovalDecision:
|
|
131
|
-
'''Resolve a pending request with an explicit decision.
|
|
132
|
-
|
|
133
|
-
Args:
|
|
134
|
-
request_id: The unique identifier of the pending approval request.
|
|
135
|
-
decision: The decision string (e.g., "approved", "rejected", "skipped").
|
|
136
|
-
operator_input: Optional raw operator input, defaults to the decision string. Defaults to "".
|
|
137
|
-
|
|
138
|
-
Returns:
|
|
139
|
-
The recorded approval decision.
|
|
140
|
-
|
|
141
|
-
Raises:
|
|
142
|
-
KeyError: If no pending request exists with the given request_id.
|
|
143
|
-
ValueError: If the decision string is not supported.
|
|
144
|
-
'''
|
|
145
|
-
def create_log_entry(self, decision: ApprovalDecision, tool_name: str, agent_id: str | None = None, thread_id: str | None = None, additional_context: dict[str, Any] | None = None) -> ApprovalLogEntry:
|
|
146
|
-
"""Create a log entry for a decision.
|
|
147
|
-
|
|
148
|
-
Args:
|
|
149
|
-
decision: The approval decision.
|
|
150
|
-
tool_name: Name of the tool.
|
|
151
|
-
agent_id: Optional agent identifier. Defaults to None.
|
|
152
|
-
thread_id: Optional thread/session identifier. Defaults to None.
|
|
153
|
-
additional_context: Optional additional logging context. Defaults to None.
|
|
154
|
-
|
|
155
|
-
Returns:
|
|
156
|
-
Structured log entry.
|
|
157
|
-
"""
|
|
158
|
-
def cleanup_expired_requests(self) -> int:
|
|
159
|
-
"""Clean up expired requests and return count of cleaned requests.
|
|
160
|
-
|
|
161
|
-
This method removes all approval requests that have exceeded their
|
|
162
|
-
timeout period from the active requests queue. This is typically
|
|
163
|
-
called periodically to prevent memory leaks from abandoned requests.
|
|
164
|
-
|
|
165
|
-
Returns:
|
|
166
|
-
The number of expired requests that were cleaned up.
|
|
167
|
-
"""
|
|
168
|
-
def register_waiter(self, request_id: str, future: Any) -> None:
|
|
169
|
-
"""Register a waiter future for an approval request.
|
|
170
|
-
|
|
171
|
-
Args:
|
|
172
|
-
request_id: The id for which to wait.
|
|
173
|
-
future: An asyncio.Future that will receive a tuple(decision, operator_input).
|
|
174
|
-
"""
|
|
175
|
-
def unregister_waiter(self, request_id: str) -> None:
|
|
176
|
-
"""Unregister a waiter if present (used on timeout/cancellation).
|
|
177
|
-
|
|
178
|
-
Args:
|
|
179
|
-
request_id (str): The ID of the request to unregister the waiter for.
|
|
180
|
-
"""
|
|
181
|
-
async def wait_for_pending_decision(self, request: ApprovalRequest, timeout_seconds: int) -> ApprovalDecision:
|
|
182
|
-
"""Wait for a pending request to be resolved and return the final decision.
|
|
183
|
-
|
|
184
|
-
Args:
|
|
185
|
-
request: The pending approval request to wait for.
|
|
186
|
-
timeout_seconds: Maximum time to wait before treating as timeout.
|
|
187
|
-
|
|
188
|
-
Returns:
|
|
189
|
-
The finalized approval decision.
|
|
190
|
-
"""
|
|
191
|
-
@staticmethod
|
|
192
|
-
def get_decision_message(decision: ApprovalDecision) -> str:
|
|
193
|
-
"""Get the appropriate message for a HITL decision.
|
|
194
|
-
|
|
195
|
-
Args:
|
|
196
|
-
decision: The approval decision to get a message for.
|
|
197
|
-
|
|
198
|
-
Returns:
|
|
199
|
-
A human-readable message explaining the decision outcome.
|
|
200
|
-
"""
|
aip_agents/agent/hitl/models.pyi
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
from aip_agents.schema.hitl import ApprovalDecision as ApprovalDecision, ApprovalDecisionType as ApprovalDecisionType, ApprovalLogEntry as ApprovalLogEntry, ApprovalRequest as ApprovalRequest
|
|
2
|
-
|
|
3
|
-
__all__ = ['ApprovalDecisionType', 'ApprovalRequest', 'ApprovalDecision', 'ApprovalLogEntry']
|