aip-agents-binary 0.6.3__py3-none-any.whl → 0.6.5__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/agent/__init__.py +44 -4
- aip_agents/agent/base_langgraph_agent.py +26 -6
- aip_agents/agent/langgraph_memory_enhancer_agent.py +368 -34
- aip_agents/agent/langgraph_react_agent.py +30 -6
- aip_agents/mcp/client/__init__.py +38 -2
- aip_agents/mcp/client/transports.py +5 -1
- aip_agents/memory/adapters/base_adapter.py +94 -0
- aip_agents/sentry/sentry.py +29 -8
- aip_agents/tools/memory_search/__init__.py +8 -1
- aip_agents/tools/memory_search/mem0.py +108 -1
- aip_agents/tools/memory_search/schema.py +33 -0
- aip_agents/tools/memory_search_tool.py +8 -0
- {aip_agents_binary-0.6.3.dist-info → aip_agents_binary-0.6.5.dist-info}/METADATA +4 -16
- aip_agents_binary-0.6.5.dist-info/RECORD +314 -0
- 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.py +0 -401
- 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 -11
- 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/date_range_tool.pyi +0 -21
- 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 -90
- 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.3.dist-info/RECORD +0 -614
- {aip_agents_binary-0.6.3.dist-info → aip_agents_binary-0.6.5.dist-info}/WHEEL +0 -0
- {aip_agents_binary-0.6.3.dist-info → aip_agents_binary-0.6.5.dist-info}/top_level.txt +0 -0
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
__all__ = ['_format_tool_or_subagent_name']
|
|
2
|
-
|
|
3
|
-
def _format_tool_or_subagent_name(name: str, remove_delegate_prefix: bool = False) -> str:
|
|
4
|
-
"""Format tool/agent names to 'Camel Case' consistently.
|
|
5
|
-
|
|
6
|
-
Args:
|
|
7
|
-
name: Raw tool or sub-agent identifier.
|
|
8
|
-
remove_delegate_prefix: Whether to strip the ``delegate::`` prefix before formatting.
|
|
9
|
-
|
|
10
|
-
Returns:
|
|
11
|
-
str: Display-friendly tool or agent name.
|
|
12
|
-
"""
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
from enum import StrEnum
|
|
2
|
-
from pydantic import BaseModel
|
|
3
|
-
|
|
4
|
-
class ActivityDataType(StrEnum):
|
|
5
|
-
"""Enumeration of activity data types."""
|
|
6
|
-
ACTIVITY: str
|
|
7
|
-
|
|
8
|
-
class Activity(BaseModel):
|
|
9
|
-
'''Schema for activity info payload.
|
|
10
|
-
|
|
11
|
-
Fields:
|
|
12
|
-
- data_type: always "activity"
|
|
13
|
-
- id: UUID string identifying this activity event
|
|
14
|
-
- data_value: JSON string with additional info (e.g., {"message": "..."})
|
|
15
|
-
'''
|
|
16
|
-
data_type: ActivityDataType
|
|
17
|
-
id: str
|
|
18
|
-
data_value: str
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
from enum import StrEnum
|
|
2
|
-
from pydantic import BaseModel
|
|
3
|
-
|
|
4
|
-
class ThinkingDataType(StrEnum):
|
|
5
|
-
"""Enum for thinking data types."""
|
|
6
|
-
THINKING: str
|
|
7
|
-
THINKING_START: str
|
|
8
|
-
THINKING_END: str
|
|
9
|
-
|
|
10
|
-
class Thinking(BaseModel):
|
|
11
|
-
'''Schema for thinking info payload.
|
|
12
|
-
|
|
13
|
-
Fields:
|
|
14
|
-
- data_type: type of thinking event
|
|
15
|
-
- id: UUID string identifying this thinking event
|
|
16
|
-
- data_value: JSON string with additional info (e.g., {"message": "..."})
|
|
17
|
-
'''
|
|
18
|
-
data_type: ThinkingDataType
|
|
19
|
-
id: str
|
|
20
|
-
data_value: str
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
-
from aip_agents.utils.metadata import create_tool_activity_info as create_tool_activity_info
|
|
4
|
-
from aip_agents.utils.token_usage_helper import STEP_USAGE_KEY as STEP_USAGE_KEY, TOTAL_USAGE_KEY as TOTAL_USAGE_KEY
|
|
5
|
-
from enum import StrEnum
|
|
6
|
-
from typing import Any
|
|
7
|
-
|
|
8
|
-
logger: Incomplete
|
|
9
|
-
|
|
10
|
-
def start_step_counter_scope(start: int = 1) -> None:
|
|
11
|
-
"""Begin a step counter scope, resetting only when entering the outermost scope.
|
|
12
|
-
|
|
13
|
-
Args:
|
|
14
|
-
start: Starting step number for the counter. Defaults to 1.
|
|
15
|
-
"""
|
|
16
|
-
def end_step_counter_scope() -> None:
|
|
17
|
-
"""Exit a step counter scope, maintaining parent scope counters.
|
|
18
|
-
|
|
19
|
-
Decrements the depth counter while preserving the step count for parent scopes.
|
|
20
|
-
"""
|
|
21
|
-
def get_next_step_number() -> int:
|
|
22
|
-
"""Return the next step number within the active scope.
|
|
23
|
-
|
|
24
|
-
Returns:
|
|
25
|
-
int: The next sequential step number in the current scope.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
class DefaultStepMessages(StrEnum):
|
|
29
|
-
"""Constants for default step indicator messages."""
|
|
30
|
-
EN: str
|
|
31
|
-
ID: str
|
|
32
|
-
|
|
33
|
-
class Kind(StrEnum):
|
|
34
|
-
"""Constants for metadata kind values."""
|
|
35
|
-
AGENT_STEP: str
|
|
36
|
-
AGENT_THINKING_STEP: str
|
|
37
|
-
FINAL_RESPONSE: str
|
|
38
|
-
FINAL_THINKING_STEP: str
|
|
39
|
-
AGENT_DEFAULT: str
|
|
40
|
-
TOKEN: str
|
|
41
|
-
|
|
42
|
-
class Status(StrEnum):
|
|
43
|
-
"""Constants for metadata status values."""
|
|
44
|
-
RUNNING: str
|
|
45
|
-
FINISHED: str
|
|
46
|
-
STOPPED: str
|
|
47
|
-
|
|
48
|
-
class MetadataFieldKeys(StrEnum):
|
|
49
|
-
"""Enumeration of standard metadata field keys used in A2A events."""
|
|
50
|
-
KIND: str
|
|
51
|
-
STATUS: str
|
|
52
|
-
TIME: str
|
|
53
|
-
MESSAGE: str
|
|
54
|
-
TOOL_INFO: str
|
|
55
|
-
REFERENCES: str
|
|
56
|
-
THINKING_AND_ACTIVITY_INFO: str
|
|
57
|
-
HITL: str
|
|
58
|
-
STEP_USAGE = STEP_USAGE_KEY
|
|
59
|
-
TOTAL_USAGE = TOTAL_USAGE_KEY
|
|
60
|
-
TOKEN_STREAMING: str
|
|
61
|
-
PII_MAPPING: str
|
|
62
|
-
|
|
63
|
-
class MetadataTimeTracker:
|
|
64
|
-
"""Tracks cumulative execution time across agent steps for final response metadata.
|
|
65
|
-
|
|
66
|
-
This class provides a clean way to accumulate execution times from individual
|
|
67
|
-
agent steps and apply the total time to final response metadata.
|
|
68
|
-
|
|
69
|
-
Attributes:
|
|
70
|
-
FLOAT_EPSILON: Epsilon value for floating point comparisons to avoid precision issues.
|
|
71
|
-
"""
|
|
72
|
-
FLOAT_EPSILON: float
|
|
73
|
-
def __init__(self) -> None:
|
|
74
|
-
"""Initialize the time tracker with zero accumulated time."""
|
|
75
|
-
def update_response_metadata(self, response: dict[str, Any]) -> dict[str, Any]:
|
|
76
|
-
"""Update response metadata with accumulated time tracking.
|
|
77
|
-
|
|
78
|
-
Args:
|
|
79
|
-
response: Response dictionary containing metadata to update.
|
|
80
|
-
|
|
81
|
-
Returns:
|
|
82
|
-
dict[str, Any]: Response with updated metadata for final responses. If any error occurs,
|
|
83
|
-
returns the original response unchanged.
|
|
84
|
-
"""
|
|
85
|
-
|
|
86
|
-
def create_metadata(content: str = '', status: Status = ..., is_final: bool = False, existing_metadata: dict[str, Any] | None = None) -> dict[str, Any]:
|
|
87
|
-
"""Create metadata for A2A responses with content-based message.
|
|
88
|
-
|
|
89
|
-
Args:
|
|
90
|
-
content: The content to create metadata for.
|
|
91
|
-
status: The status of the content.
|
|
92
|
-
is_final: Whether the content is final.
|
|
93
|
-
existing_metadata: Optional existing metadata to merge with. Existing metadata
|
|
94
|
-
takes precedence over generated metadata for conflicting keys.
|
|
95
|
-
|
|
96
|
-
Returns:
|
|
97
|
-
dict[str, Any]: The metadata for the content, merged with existing metadata if provided.
|
|
98
|
-
"""
|
|
99
|
-
def create_tool_processing_metadata(original_metadata: dict[str, Any] | None = None) -> dict[str, Any]:
|
|
100
|
-
"""Create metadata for tool processing events (tool_call and tool_result).
|
|
101
|
-
|
|
102
|
-
Args:
|
|
103
|
-
original_metadata: Optional original metadata to merge with.
|
|
104
|
-
|
|
105
|
-
Returns:
|
|
106
|
-
dict[str, Any]: Metadata dictionary with agent_thinking_step kind and no message/time/status.
|
|
107
|
-
"""
|
|
108
|
-
def create_status_update_metadata(content: str, custom_metadata: dict[str, Any] | None = None) -> dict[str, Any]:
|
|
109
|
-
"""Create metadata for status update events with content-based rules.
|
|
110
|
-
|
|
111
|
-
Args:
|
|
112
|
-
content: The content of the status update.
|
|
113
|
-
custom_metadata: Optional custom metadata to merge with.
|
|
114
|
-
|
|
115
|
-
Returns:
|
|
116
|
-
dict[str, Any]: Metadata dictionary following the specific rules for different content types.
|
|
117
|
-
"""
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
from aip_agents.utils.name_preprocessor.base_name_preprocessor import BaseNamePreprocessor as BaseNamePreprocessor
|
|
2
|
-
from aip_agents.utils.name_preprocessor.google_name_preprocessor import GoogleNamePreprocessor as GoogleNamePreprocessor
|
|
3
|
-
from aip_agents.utils.name_preprocessor.name_preprocessor import NamePreprocessor as NamePreprocessor
|
|
4
|
-
from aip_agents.utils.name_preprocessor.openai_name_preprocessor import OpenAINamePreprocessor as OpenAINamePreprocessor
|
|
5
|
-
|
|
6
|
-
__all__ = ['GoogleNamePreprocessor', 'OpenAINamePreprocessor', 'BaseNamePreprocessor', 'NamePreprocessor']
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
from abc import ABC, abstractmethod
|
|
2
|
-
|
|
3
|
-
class BaseNamePreprocessor(ABC):
|
|
4
|
-
"""Base class for name preprocessing.
|
|
5
|
-
|
|
6
|
-
It contains the common methods for name preprocessing.
|
|
7
|
-
"""
|
|
8
|
-
def regex_substitute(self, name: str, regex: str, replacement: str) -> str:
|
|
9
|
-
"""Substitute a regex pattern in a name.
|
|
10
|
-
|
|
11
|
-
Args:
|
|
12
|
-
name: The input name to preprocess.
|
|
13
|
-
regex: The regex pattern to substitute.
|
|
14
|
-
replacement: The replacement string.
|
|
15
|
-
|
|
16
|
-
Returns:
|
|
17
|
-
A name that is valid for the name processor.
|
|
18
|
-
"""
|
|
19
|
-
def clean_up_name(self, name: str) -> str:
|
|
20
|
-
"""Process a processed name.
|
|
21
|
-
|
|
22
|
-
Step:
|
|
23
|
-
1. collapse multiple underscores to single underscore
|
|
24
|
-
2. remove trailing underscores
|
|
25
|
-
3. if name is empty after clean up, add a single underscore
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
name: The input name to preprocess.
|
|
29
|
-
|
|
30
|
-
Returns:
|
|
31
|
-
A name that starts with a letter or an underscore.
|
|
32
|
-
"""
|
|
33
|
-
@abstractmethod
|
|
34
|
-
def sanitize_agent_name(self, name: str) -> str:
|
|
35
|
-
"""Process a name according to the rules of the name processor.
|
|
36
|
-
|
|
37
|
-
Args:
|
|
38
|
-
name: The input name to preprocess.
|
|
39
|
-
|
|
40
|
-
Returns:
|
|
41
|
-
A name that is valid for the name processor.
|
|
42
|
-
"""
|
|
43
|
-
@abstractmethod
|
|
44
|
-
def sanitize_tool_name(self, name: str) -> str:
|
|
45
|
-
"""Process a name according to the rules of the name processor.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
name: The input name to preprocess.
|
|
49
|
-
|
|
50
|
-
Returns:
|
|
51
|
-
A name that is valid for the name processor.
|
|
52
|
-
"""
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
-
from aip_agents.utils.name_preprocessor import BaseNamePreprocessor as BaseNamePreprocessor
|
|
4
|
-
|
|
5
|
-
logger: Incomplete
|
|
6
|
-
|
|
7
|
-
class GoogleNamePreprocessor(BaseNamePreprocessor):
|
|
8
|
-
"""Concrete implementation of NamePreprocessor according to Google's name requirements."""
|
|
9
|
-
NAME_SETTINGS: Incomplete
|
|
10
|
-
CUT_OFF_INDEX: int
|
|
11
|
-
def sanitize_agent_name(self, name: str) -> str:
|
|
12
|
-
"""Preprocess an input name according to Google's name requirements for agents.
|
|
13
|
-
|
|
14
|
-
Args:
|
|
15
|
-
name: The input name to preprocess.
|
|
16
|
-
|
|
17
|
-
Returns:
|
|
18
|
-
A name that is valid for Google.
|
|
19
|
-
|
|
20
|
-
Notes:
|
|
21
|
-
Name should start with a letter (a-z, A-Z) or an underscore (_),
|
|
22
|
-
and can only contain letters, digits (0-9), and underscores.
|
|
23
|
-
It has no length limit. ( based on experiment )
|
|
24
|
-
"""
|
|
25
|
-
def sanitize_tool_name(self, name: str) -> str:
|
|
26
|
-
"""Preprocess an input name according to Google's name requirements for tools.
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
name: The input name to preprocess.
|
|
30
|
-
|
|
31
|
-
Returns:
|
|
32
|
-
A name that is valid for Google.
|
|
33
|
-
|
|
34
|
-
Notes:
|
|
35
|
-
Name should start with a letter (a-z, A-Z) or an underscore (_),
|
|
36
|
-
and can only contain letters, digits (0-9), underscores, and dashes.
|
|
37
|
-
It has a length limit of 64 characters, but google throws error if the length is exactly 64, so cut to 63.
|
|
38
|
-
"""
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
-
from aip_agents.utils.name_preprocessor.base_name_preprocessor import BaseNamePreprocessor as BaseNamePreprocessor
|
|
4
|
-
from aip_agents.utils.name_preprocessor.google_name_preprocessor import GoogleNamePreprocessor as GoogleNamePreprocessor
|
|
5
|
-
from aip_agents.utils.name_preprocessor.openai_name_preprocessor import OpenAINamePreprocessor as OpenAINamePreprocessor
|
|
6
|
-
|
|
7
|
-
logger: Incomplete
|
|
8
|
-
|
|
9
|
-
class NamePreprocessor:
|
|
10
|
-
"""Name Preprocessor for Google ADK and OpenAI compatible models.
|
|
11
|
-
|
|
12
|
-
Args:
|
|
13
|
-
provider: The provider of the model.
|
|
14
|
-
"""
|
|
15
|
-
PROVIDER_TO_NAME_PREPROCESSOR_MAP: Incomplete
|
|
16
|
-
provider: Incomplete
|
|
17
|
-
preprocessor: Incomplete
|
|
18
|
-
def __init__(self, provider: str) -> None:
|
|
19
|
-
"""Initialize the name preprocessor.
|
|
20
|
-
|
|
21
|
-
Args:
|
|
22
|
-
provider: The provider of the model.
|
|
23
|
-
"""
|
|
24
|
-
def sanitize_agent_name(self, name: str) -> str:
|
|
25
|
-
"""Preprocess an input name according to the rules of the name processor.
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
name: The input name to preprocess.
|
|
29
|
-
|
|
30
|
-
Returns:
|
|
31
|
-
A name that is valid for the name processor.
|
|
32
|
-
"""
|
|
33
|
-
def sanitize_tool_name(self, name: str) -> str:
|
|
34
|
-
"""Preprocess an input name according to the rules of the name processor.
|
|
35
|
-
|
|
36
|
-
Args:
|
|
37
|
-
name: The input name to preprocess.
|
|
38
|
-
|
|
39
|
-
Returns:
|
|
40
|
-
A name that is valid for the name processor.
|
|
41
|
-
"""
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
|
-
from aip_agents.utils.name_preprocessor import BaseNamePreprocessor as BaseNamePreprocessor
|
|
4
|
-
|
|
5
|
-
logger: Incomplete
|
|
6
|
-
|
|
7
|
-
class OpenAINamePreprocessor(BaseNamePreprocessor):
|
|
8
|
-
"""Concrete implementation of NamePreprocessor according to OpenAI's name requirements."""
|
|
9
|
-
CUT_OFF_INDEX: int
|
|
10
|
-
def sanitize_agent_name(self, name: str) -> str:
|
|
11
|
-
"""Preprocess an input name according to OpenAI's name requirements for agents.
|
|
12
|
-
|
|
13
|
-
As of now, OpenAI only has rule for tool name, and it is the same as Google's tool name rule,
|
|
14
|
-
so just return the name as is.
|
|
15
|
-
|
|
16
|
-
Args:
|
|
17
|
-
name: The input name to preprocess.
|
|
18
|
-
|
|
19
|
-
Returns:
|
|
20
|
-
A name that is valid for OpenAI.
|
|
21
|
-
"""
|
|
22
|
-
def sanitize_tool_name(self, name: str) -> str:
|
|
23
|
-
"""Preprocess an input name according to OpenAI's name requirements for tools.
|
|
24
|
-
|
|
25
|
-
Args:
|
|
26
|
-
name: The input name to preprocess.
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
A name that is valid for OpenAI.
|
|
30
|
-
|
|
31
|
-
Notes:
|
|
32
|
-
Only contain letters (a-z, A-Z), digits (0-9), underscores (_), and dashes (-).
|
|
33
|
-
It has a length limit of 64 characters.
|
|
34
|
-
"""
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
from aip_agents.utils.pii.pii_handler import ToolPIIHandler as ToolPIIHandler
|
|
2
|
-
from aip_agents.utils.pii.pii_helper import add_pii_mappings as add_pii_mappings, anonymize_final_response_content as anonymize_final_response_content, deanonymize_final_response_content as deanonymize_final_response_content, extract_pii_mapping_from_agent_response as extract_pii_mapping_from_agent_response, normalize_enable_pii as normalize_enable_pii
|
|
3
|
-
from aip_agents.utils.pii.uuid_deanonymizer_mapping import UUIDDeanonymizerMapping as UUIDDeanonymizerMapping
|
|
4
|
-
|
|
5
|
-
__all__ = ['ToolPIIHandler', 'add_pii_mappings', 'anonymize_final_response_content', 'deanonymize_final_response_content', 'extract_pii_mapping_from_agent_response', 'normalize_enable_pii', 'UUIDDeanonymizerMapping']
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.logger import LoggerManager as LoggerManager
|
|
3
|
-
from aip_agents.utils.pii.uuid_deanonymizer_mapping import UUIDDeanonymizerMapping as UUIDDeanonymizerMapping
|
|
4
|
-
from enum import Enum
|
|
5
|
-
from gllm_privacy.pii_detector import TextAnalyzer, TextAnonymizer
|
|
6
|
-
from typing import Any
|
|
7
|
-
|
|
8
|
-
TextAnalyzer = Any
|
|
9
|
-
TextAnonymizer = Any
|
|
10
|
-
GDPLabsNerApiRemoteRecognizer = Any
|
|
11
|
-
|
|
12
|
-
class _Operation(str, Enum):
|
|
13
|
-
ANONYMIZE: str
|
|
14
|
-
DEANONYMIZE: str
|
|
15
|
-
|
|
16
|
-
logger: Incomplete
|
|
17
|
-
NER_API_URL_ENV_VAR: str
|
|
18
|
-
NER_API_KEY_ENV_VAR: str
|
|
19
|
-
NER_API_TIMEOUT: int
|
|
20
|
-
EXCLUDED_ENTITIES: Incomplete
|
|
21
|
-
DEFAULT_SUPPORTED_ENTITIES: Incomplete
|
|
22
|
-
|
|
23
|
-
class ToolPIIHandler:
|
|
24
|
-
"""Handles PII masking/demasking for tool calling.
|
|
25
|
-
|
|
26
|
-
Tag replacement based on runner-provided mappings always works. Optional
|
|
27
|
-
NER-powered masking/de-masking is only enabled when NER_API_URL and
|
|
28
|
-
NER_API_KEY environment variables are set.
|
|
29
|
-
|
|
30
|
-
Attributes:
|
|
31
|
-
flat_pii_mapping: Flat mapping from runner service (tag → value)
|
|
32
|
-
text_analyzer: GLLM Privacy TextAnalyzer instance
|
|
33
|
-
text_anonymizer: GLLM Privacy TextAnonymizer instance
|
|
34
|
-
enable_ner: Whether NER is enabled
|
|
35
|
-
"""
|
|
36
|
-
flat_pii_mapping: dict[str, str]
|
|
37
|
-
enable_ner: bool
|
|
38
|
-
text_analyzer: TextAnalyzer | None
|
|
39
|
-
text_anonymizer: TextAnonymizer | None
|
|
40
|
-
def __init__(self, pii_mapping: dict[str, str] | None = None, ner_api_url: str | None = None, ner_api_key: str | None = None) -> None:
|
|
41
|
-
"""Initialize PII handler (private - use create_if_enabled() instead).
|
|
42
|
-
|
|
43
|
-
Initializes GLLM Privacy components (TextAnalyzer, TextAnonymizer) if NER credentials
|
|
44
|
-
are provided. Creates dual recognizers for Indonesian and English languages.
|
|
45
|
-
Pre-loads any existing PII mappings into the anonymizer's internal state.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
pii_mapping: Existing PII mapping from runner service (flat format: tag -> value)
|
|
49
|
-
ner_api_url: NER API endpoint URL
|
|
50
|
-
ner_api_key: NER API authentication key
|
|
51
|
-
"""
|
|
52
|
-
@classmethod
|
|
53
|
-
def create_if_enabled(cls, pii_mapping: dict[str, str] | None = None) -> ToolPIIHandler | None:
|
|
54
|
-
"""Create ToolPIIHandler when mappings or NER configuration exist.
|
|
55
|
-
|
|
56
|
-
Args:
|
|
57
|
-
pii_mapping: Existing PII mapping from runner service
|
|
58
|
-
|
|
59
|
-
Returns:
|
|
60
|
-
ToolPIIHandler instance when mapping or NER config is available, None otherwise
|
|
61
|
-
"""
|
|
62
|
-
@classmethod
|
|
63
|
-
def create_mapping_only(cls, pii_mapping: dict[str, str] | None = None) -> ToolPIIHandler | None:
|
|
64
|
-
"""Create ToolPIIHandler in mapping-only mode (no NER).
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
pii_mapping: Existing PII mapping from runner service
|
|
68
|
-
|
|
69
|
-
Returns:
|
|
70
|
-
ToolPIIHandler instance when mapping exists, None otherwise
|
|
71
|
-
"""
|
|
72
|
-
def deanonymize_tool_args(self, args: dict[str, Any]) -> dict[str, Any]:
|
|
73
|
-
"""Replace PII tags in tool arguments with real values.
|
|
74
|
-
|
|
75
|
-
Recursively processes dictionaries, lists, and strings to replace all PII tags
|
|
76
|
-
(e.g., '<EMAIL_1>') with their corresponding real values from flat_pii_mapping.
|
|
77
|
-
|
|
78
|
-
Args:
|
|
79
|
-
args: Tool arguments that may contain PII tags
|
|
80
|
-
|
|
81
|
-
Returns:
|
|
82
|
-
Arguments with tags replaced by real values
|
|
83
|
-
"""
|
|
84
|
-
def anonymize_tool_output(self, output: Any) -> tuple[Any, dict[str, str]]:
|
|
85
|
-
"""Mask PII values in tool output.
|
|
86
|
-
|
|
87
|
-
Handles string and dictionary outputs. For strings, uses two-phase anonymization:
|
|
88
|
-
first masks known PII, then detects new PII via NER. For dictionaries, recursively
|
|
89
|
-
processes all string values. Returns updated mapping with any newly discovered PII.
|
|
90
|
-
|
|
91
|
-
Args:
|
|
92
|
-
output: Tool output that may contain PII values (string, dict, or other)
|
|
93
|
-
|
|
94
|
-
Returns:
|
|
95
|
-
Tuple of (anonymized_output, updated_flat_pii_mapping)
|
|
96
|
-
"""
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.logger import LoggerManager as LoggerManager
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
logger: Incomplete
|
|
6
|
-
|
|
7
|
-
def normalize_enable_pii(enable_pii: Any) -> bool | None:
|
|
8
|
-
"""Normalize enable_pii value from agent configuration.
|
|
9
|
-
|
|
10
|
-
Args:
|
|
11
|
-
enable_pii: Raw enable_pii value from agent configuration.
|
|
12
|
-
|
|
13
|
-
Returns:
|
|
14
|
-
The normalized enable_pii flag when explicitly set (True/False), otherwise None.
|
|
15
|
-
"""
|
|
16
|
-
def add_pii_mappings(left: dict[str, str] | None, right: dict[str, str] | None) -> dict[str, str]:
|
|
17
|
-
"""Reducer function to merge PII mappings from multiple sources.
|
|
18
|
-
|
|
19
|
-
This is a LangGraph reducer function that merges PII mappings from:
|
|
20
|
-
- Parent agent's initial mapping
|
|
21
|
-
- Tool outputs with newly discovered PII
|
|
22
|
-
- Subagent responses with their discovered PII
|
|
23
|
-
|
|
24
|
-
Args:
|
|
25
|
-
left: Existing PII mapping (or None)
|
|
26
|
-
right: New PII mapping to merge (or None)
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
Merged PII mapping dictionary
|
|
30
|
-
|
|
31
|
-
Note:
|
|
32
|
-
- Right (new) mappings take precedence over left (existing)
|
|
33
|
-
- Handles None/non-dict cases gracefully
|
|
34
|
-
- Preserves all unique PII tags
|
|
35
|
-
- Returns empty dict if both inputs are None/empty
|
|
36
|
-
"""
|
|
37
|
-
def extract_pii_mapping_from_agent_response(result: Any) -> dict[str, str] | None:
|
|
38
|
-
"""Extract PII mapping from subagent response.
|
|
39
|
-
|
|
40
|
-
Used by DelegationToolManager to propagate PII mappings from subagents
|
|
41
|
-
back to parent agents.
|
|
42
|
-
|
|
43
|
-
Args:
|
|
44
|
-
result: The result returned by the delegated agent
|
|
45
|
-
|
|
46
|
-
Returns:
|
|
47
|
-
PII mapping dictionary if found, None otherwise
|
|
48
|
-
|
|
49
|
-
Note:
|
|
50
|
-
- Checks if result is a dict
|
|
51
|
-
- Extracts 'full_final_state' from result
|
|
52
|
-
- Extracts 'pii_mapping' from full_final_state
|
|
53
|
-
- Validates mapping is a non-empty dict
|
|
54
|
-
- Returns None if any step fails
|
|
55
|
-
"""
|
|
56
|
-
def deanonymize_final_response_content(content: str, is_final_response: bool, metadata: dict[str, Any] | None) -> str:
|
|
57
|
-
"""Deanonymize final response content using PII mapping from metadata.
|
|
58
|
-
|
|
59
|
-
Args:
|
|
60
|
-
content: Final response content that may contain PII tags.
|
|
61
|
-
is_final_response: Flag indicating whether this message is a final response.
|
|
62
|
-
metadata: Optional metadata dict (or event payload containing ``metadata``) with
|
|
63
|
-
``pii_mapping`` tag-to-value mapping.
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
Content string with PII tags replaced by real values when applicable.
|
|
67
|
-
"""
|
|
68
|
-
def anonymize_final_response_content(content: str, metadata: dict[str, Any] | None) -> str:
|
|
69
|
-
"""Anonymize final response content using PII mapping from metadata.
|
|
70
|
-
|
|
71
|
-
Args:
|
|
72
|
-
content: Final response content that may contain real PII values.
|
|
73
|
-
metadata: Metadata dict (or event payload containing ``metadata``) with
|
|
74
|
-
``pii_mapping`` tag-to-value mapping.
|
|
75
|
-
|
|
76
|
-
Returns:
|
|
77
|
-
Content string with real PII values replaced by their PII tags when mapping is present.
|
|
78
|
-
"""
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.constants import DEFAULT_PII_TAG_NAMESPACE as DEFAULT_PII_TAG_NAMESPACE
|
|
3
|
-
from gllm_privacy.pii_detector.utils.deanonymizer_mapping import DeanonymizerMapping, MappingDataType
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
MappingDataType = dict[str, dict[str, str]]
|
|
7
|
-
|
|
8
|
-
class DeanonymizerMapping:
|
|
9
|
-
"""Fallback deanonymizer mapping when optional dependency is missing.
|
|
10
|
-
|
|
11
|
-
This class exists only to keep the module importable when `gllm-privacy`
|
|
12
|
-
is not installed.
|
|
13
|
-
"""
|
|
14
|
-
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
15
|
-
"""Initialize the mapping.
|
|
16
|
-
|
|
17
|
-
Raises:
|
|
18
|
-
ImportError: Always raised because `gllm-privacy` is required.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
logger: Incomplete
|
|
22
|
-
|
|
23
|
-
def format_operator_with_uuid(operator_name: str, uuid_suffix: str) -> str:
|
|
24
|
-
"""Format the operator name with a UUID suffix.
|
|
25
|
-
|
|
26
|
-
Args:
|
|
27
|
-
operator_name: The operator name.
|
|
28
|
-
uuid_suffix: The UUID suffix to append.
|
|
29
|
-
|
|
30
|
-
Returns:
|
|
31
|
-
The formatted operator name with UUID suffix.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
class UUIDDeanonymizerMapping(DeanonymizerMapping):
|
|
35
|
-
"""Class to store the deanonymizer mapping with UUID suffixes.
|
|
36
|
-
|
|
37
|
-
This class extends DeanonymizerMapping to use UUID suffixes instead of
|
|
38
|
-
sequential numbers for differentiating multiple entities of the same type.
|
|
39
|
-
|
|
40
|
-
Attributes:
|
|
41
|
-
mapping: The deanonymizer mapping.
|
|
42
|
-
skip_format_duplicates: Whether to skip formatting duplicated operators.
|
|
43
|
-
uuid_length: The length of the UUID suffix to use (default: 8).
|
|
44
|
-
"""
|
|
45
|
-
mapping: Incomplete
|
|
46
|
-
skip_format_duplicates: Incomplete
|
|
47
|
-
uuid_length: Incomplete
|
|
48
|
-
def __init__(self, mapping: MappingDataType | None = None, skip_format_duplicates: bool = False, uuid_length: int = 8) -> None:
|
|
49
|
-
"""Initialize UUIDDeanonymizerMapping.
|
|
50
|
-
|
|
51
|
-
Args:
|
|
52
|
-
mapping: The deanonymizer mapping. If None, creates an empty defaultdict(dict).
|
|
53
|
-
skip_format_duplicates: Whether to skip formatting duplicated operators.
|
|
54
|
-
uuid_length: The length of the UUID suffix to use (default: 8).
|
|
55
|
-
"""
|
|
56
|
-
def update(self, new_mapping: MappingDataType, use_uuid_suffix: bool | None = None) -> None:
|
|
57
|
-
"""Update the deanonymizer mapping with new values using UUID suffixes.
|
|
58
|
-
|
|
59
|
-
Duplicated values will not be added. If there are multiple entities of the same type,
|
|
60
|
-
the mapping will include a UUID suffix to differentiate them. For example, if there are
|
|
61
|
-
two names in the input text, the mapping will include NAME_<uuid1> and NAME_<uuid2>.
|
|
62
|
-
|
|
63
|
-
Args:
|
|
64
|
-
new_mapping: The new mapping to be added to the existing deanonymizer mapping.
|
|
65
|
-
use_uuid_suffix: Whether to apply UUID suffixes to keys.
|
|
66
|
-
If True, keys will always be formatted with UUID suffixes.
|
|
67
|
-
If False, keys will be used as-is without UUID formatting.
|
|
68
|
-
If None, behavior falls back to the instance configuration via
|
|
69
|
-
skip_format_duplicates (preserving existing behavior).
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
None
|
|
73
|
-
"""
|