aip-agents-binary 0.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aip_agents/__init__.py +66 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/base_executor.py +1125 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2ui/__init__.py +26 -0
- aip_agents/a2ui/catalog_provider.py +109 -0
- aip_agents/a2ui/examples/0.8/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.8/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.8/single_column_list.json +1 -0
- aip_agents/a2ui/examples/0.9/booking_form.json +1 -0
- aip_agents/a2ui/examples/0.9/confirmation.json +1 -0
- aip_agents/a2ui/examples/0.9/single_column_list.json +1 -0
- aip_agents/a2ui/middleware.py +754 -0
- aip_agents/a2ui/models.py +153 -0
- aip_agents/a2ui/public_url.py +138 -0
- aip_agents/a2ui/stream_filter.py +67 -0
- aip_agents/agent/__init__.py +72 -0
- aip_agents/agent/base_agent.py +1437 -0
- aip_agents/agent/base_langgraph_agent.py +4048 -0
- aip_agents/agent/google_adk_agent.py +932 -0
- aip_agents/agent/google_adk_constants.py +11 -0
- aip_agents/agent/graph_runtime.py +185 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langgraph_react_agent.py +3741 -0
- aip_agents/agent/model_invocation_adapter.py +346 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/tool_execution_engine.py +587 -0
- aip_agents/audio_interface/__init__.py +30 -0
- aip_agents/audio_interface/audio_agent_adapter.py +254 -0
- aip_agents/audio_interface/config.py +146 -0
- aip_agents/audio_interface/errors.py +15 -0
- aip_agents/audio_interface/livekit_audio_session.py +504 -0
- aip_agents/audio_interface/livekit_realtime_audio_session.py +142 -0
- aip_agents/audio_interface/session_factory.py +40 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/common/__init__.py +5 -0
- aip_agents/common/callable_introspection.py +17 -0
- aip_agents/constants.py +23 -0
- aip_agents/context/__init__.py +5 -0
- aip_agents/context/budget.py +237 -0
- aip_agents/context/compaction.py +339 -0
- aip_agents/context/metadata.py +169 -0
- aip_agents/context/offload.py +449 -0
- aip_agents/context/preparation.py +196 -0
- aip_agents/context/prompt.py +61 -0
- aip_agents/context/runtime.py +149 -0
- aip_agents/context/session_recall.py +69 -0
- aip_agents/context/state.py +48 -0
- aip_agents/context/utils.py +44 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/audio_livekit_session.py +116 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_server.py +141 -0
- aip_agents/examples/gl_connectors_smoke.py +148 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +104 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +77 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +80 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +91 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +83 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +131 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +250 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_filesystem.py +162 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_skills.py +62 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_client.py +57 -0
- aip_agents/examples/hello_world_multi_agent_tool_output_server.py +131 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc_custom_tools.py +83 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +100 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_server.py +113 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_server.py +125 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +246 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +87 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/multiply_tool.py +43 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/integration/__init__.py +43 -0
- aip_agents/integration/agent.py +58 -0
- aip_agents/integration/guardrails.py +52 -0
- aip_agents/integration/hitl.py +71 -0
- aip_agents/integration/ptc.py +95 -0
- aip_agents/integration/skills.py +37 -0
- aip_agents/integration/storage.py +81 -0
- aip_agents/integration/version.py +103 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/client/__init__.py +60 -0
- aip_agents/mcp/client/base_mcp_client.py +377 -0
- aip_agents/mcp/client/connection_manager.py +231 -0
- aip_agents/mcp/client/errors.py +119 -0
- aip_agents/mcp/client/google_adk/__init__.py +45 -0
- aip_agents/mcp/client/google_adk/client.py +383 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/persistent_session.py +704 -0
- aip_agents/mcp/client/session_pool.py +358 -0
- aip_agents/mcp/client/transports.py +288 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/base_adapter.py +815 -0
- aip_agents/memory/adapters/mem0.py +286 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/middleware/__init__.py +65 -0
- aip_agents/middleware/backends/__init__.py +72 -0
- aip_agents/middleware/backends/in_memory.py +578 -0
- aip_agents/middleware/backends/local_disk.py +1203 -0
- aip_agents/middleware/backends/protocol.py +353 -0
- aip_agents/middleware/backends/sandbox.py +1431 -0
- aip_agents/middleware/backends/sandbox_files.py +113 -0
- aip_agents/middleware/backends/utils.py +293 -0
- aip_agents/middleware/base.py +239 -0
- aip_agents/middleware/filesystem.py +690 -0
- aip_agents/middleware/manager.py +291 -0
- aip_agents/middleware/memory.py +532 -0
- aip_agents/middleware/pii_middleware.py +192 -0
- aip_agents/middleware/schema.py +19 -0
- aip_agents/middleware/skills.py +872 -0
- aip_agents/middleware/task_delegation.py +1656 -0
- aip_agents/middleware/todolist.py +276 -0
- aip_agents/middleware/tools/__init__.py +23 -0
- aip_agents/middleware/tools/edit_file.py +70 -0
- aip_agents/middleware/tools/execute.py +428 -0
- aip_agents/middleware/tools/grep_file.py +79 -0
- aip_agents/middleware/tools/ls.py +71 -0
- aip_agents/middleware/tools/read_file.py +239 -0
- aip_agents/middleware/tools/skill_load.py +193 -0
- aip_agents/middleware/tools/skill_resource.py +338 -0
- aip_agents/middleware/tools/write_file.py +114 -0
- aip_agents/middleware/vision.py +322 -0
- aip_agents/ptc/__init__.py +87 -0
- aip_agents/ptc/custom_tools.py +511 -0
- aip_agents/ptc/custom_tools_payload.py +499 -0
- aip_agents/ptc/custom_tools_templates/__init__.py +1 -0
- aip_agents/ptc/custom_tools_templates/custom_build_function.py.template +24 -0
- aip_agents/ptc/custom_tools_templates/custom_init.py.template +26 -0
- aip_agents/ptc/custom_tools_templates/custom_invoke.py.template +149 -0
- aip_agents/ptc/custom_tools_templates/custom_registry.py.template +112 -0
- aip_agents/ptc/custom_tools_templates/custom_sources_init.py.template +7 -0
- aip_agents/ptc/custom_tools_templates/custom_wrapper.py.template +87 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/exceptions.py +57 -0
- aip_agents/ptc/executor.py +627 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +679 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +240 -0
- aip_agents/ptc/naming.py +430 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/prompt_builder.py +674 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/sandbox_bridge.py +297 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/ptc/tool_def_helpers.py +101 -0
- aip_agents/ptc/tool_enrichment.py +163 -0
- aip_agents/resilience/__init__.py +10 -0
- aip_agents/resilience/base.py +46 -0
- aip_agents/resilience/tool.py +1661 -0
- aip_agents/sandbox/__init__.py +62 -0
- aip_agents/sandbox/defaults.py +220 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1-datasaur.Dockerfile +120 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1.Dockerfile +100 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2-datasaur.Dockerfile +143 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2.Dockerfile +119 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3-datasaur.Dockerfile +173 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3.Dockerfile +130 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.Dockerfile +164 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.patch_js_context.py +41 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.requirements.txt +29 -0
- aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2.Dockerfile +87 -0
- aip_agents/sandbox/e2b_runtime.py +27 -0
- aip_agents/sandbox/image_registry.py +98 -0
- aip_agents/sandbox/providers/__init__.py +76 -0
- aip_agents/sandbox/providers/base.py +392 -0
- aip_agents/sandbox/providers/bedrock.py +28 -0
- aip_agents/sandbox/providers/e2b.py +230 -0
- aip_agents/sandbox/providers/opensandbox.py +163 -0
- aip_agents/sandbox/sandbox_runtime.py +967 -0
- aip_agents/sandbox/template_builder.py +240 -0
- aip_agents/sandbox/types.py +141 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/schema/__init__.py +106 -0
- aip_agents/schema/a2a.py +58 -0
- aip_agents/schema/agent.py +117 -0
- aip_agents/schema/artifacts.py +75 -0
- aip_agents/schema/attachments.py +425 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/langgraph.py +47 -0
- aip_agents/schema/model_id.py +103 -0
- aip_agents/schema/model_usage.py +50 -0
- aip_agents/schema/runtime_metadata.py +78 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/tool_payloads.py +68 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/sentry.py +267 -0
- aip_agents/skills/__init__.py +30 -0
- aip_agents/skills/errors.py +110 -0
- aip_agents/skills/installer.py +479 -0
- aip_agents/skills/models.py +769 -0
- aip_agents/skills/stager.py +224 -0
- aip_agents/skills/validation.py +53 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/tools/__init__.py +65 -0
- aip_agents/tools/agent_schedule_tool.py +392 -0
- aip_agents/tools/browser_use/__init__.py +83 -0
- aip_agents/tools/browser_use/action_parser.py +104 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1118 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/minio_storage.py +203 -0
- aip_agents/tools/browser_use/schemas.py +121 -0
- aip_agents/tools/browser_use/session.py +13 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/steel_session_recording.py +321 -0
- aip_agents/tools/browser_use/streaming.py +263 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/types.py +37 -0
- aip_agents/tools/code_sandbox/__init__.py +48 -0
- aip_agents/tools/code_sandbox/code_sandbox_tool.py +350 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +346 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +65 -0
- aip_agents/tools/computer_use/__init__.py +75 -0
- aip_agents/tools/computer_use/computer_use_tool.py +910 -0
- aip_agents/tools/computer_use/schemas.py +78 -0
- aip_agents/tools/computer_use/streaming.py +198 -0
- aip_agents/tools/computer_use/types.py +32 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/execute_ptc_code.py +582 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/tool.py +518 -0
- aip_agents/tools/gl_connector_tools.py +170 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/base.py +213 -0
- aip_agents/tools/memory_search/mem0.py +424 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/streaming_common.py +577 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/types/__init__.py +73 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/utils/__init__.py +91 -0
- aip_agents/utils/a2a_connector.py +1758 -0
- aip_agents/utils/artifact_helpers.py +542 -0
- aip_agents/utils/artifacts/__init__.py +20 -0
- aip_agents/utils/artifacts/tracker.py +367 -0
- aip_agents/utils/attachment_helpers.py +178 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/file_prompt_utils.py +276 -0
- aip_agents/utils/file_watchers/__init__.py +33 -0
- aip_agents/utils/file_watchers/base.py +46 -0
- aip_agents/utils/file_watchers/e2b.py +128 -0
- aip_agents/utils/file_watchers/factory.py +39 -0
- aip_agents/utils/file_watchers/ls_diff.py +88 -0
- aip_agents/utils/file_watchers/sandbox.py +66 -0
- aip_agents/utils/file_watchers/watchdog.py +97 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/formatter_llm_client.py +258 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/converter.py +399 -0
- aip_agents/utils/langgraph/delegation_context.py +22 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1329 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +822 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata_helper.py +363 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/pii/__init__.py +29 -0
- aip_agents/utils/pii/pii_handler.py +555 -0
- aip_agents/utils/pii/pii_helper.py +225 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/sse_chunk_transformer.py +836 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/token_usage_helper.py +531 -0
- aip_agents_binary-0.0.0.dist-info/METADATA +825 -0
- aip_agents_binary-0.0.0.dist-info/RECORD +447 -0
- aip_agents_binary-0.0.0.dist-info/WHEEL +5 -0
- aip_agents_binary-0.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""Generated registry for custom tools.
|
|
2
|
+
|
|
3
|
+
This module provides factory functions to build tool instances from metadata.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from langchain_core.tools import BaseTool
|
|
11
|
+
|
|
12
|
+
_DEFAULTS_PATH = Path(__file__).with_name("custom_defaults.json")
|
|
13
|
+
|
|
14
|
+
# Attribute name for tool config schema
|
|
15
|
+
TOOL_CONFIG_SCHEMA_ATTR = "tool_config_schema"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _load_defaults() -> dict[str, Any]:
|
|
19
|
+
"""Load tool config defaults from JSON file."""
|
|
20
|
+
if not _DEFAULTS_PATH.exists():
|
|
21
|
+
return {}
|
|
22
|
+
return json.loads(_DEFAULTS_PATH.read_text(encoding="utf-8"))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _inject_config_methods(tool: BaseTool, config_schema: type) -> None:
|
|
26
|
+
"""Inject configuration methods into a tool instance.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
tool: Tool instance to inject methods into.
|
|
30
|
+
config_schema: Pydantic model class for configuration validation.
|
|
31
|
+
"""
|
|
32
|
+
CONFIG_SCHEMA_ATTR = "_config_schema"
|
|
33
|
+
CONFIG_ATTR = "_config"
|
|
34
|
+
|
|
35
|
+
# Add configuration attributes
|
|
36
|
+
object.__setattr__(tool, CONFIG_SCHEMA_ATTR, config_schema)
|
|
37
|
+
object.__setattr__(tool, CONFIG_ATTR, None)
|
|
38
|
+
|
|
39
|
+
def set_tool_config(config: Any) -> None:
|
|
40
|
+
"""Set the tool's agent-level default configuration with validation."""
|
|
41
|
+
if config is None:
|
|
42
|
+
object.__setattr__(tool, CONFIG_ATTR, None)
|
|
43
|
+
return
|
|
44
|
+
|
|
45
|
+
config_schema_obj = getattr(tool, CONFIG_SCHEMA_ATTR)
|
|
46
|
+
if isinstance(config, dict):
|
|
47
|
+
object.__setattr__(tool, CONFIG_ATTR, config_schema_obj(**config))
|
|
48
|
+
elif isinstance(config, config_schema_obj):
|
|
49
|
+
object.__setattr__(tool, CONFIG_ATTR, config)
|
|
50
|
+
else:
|
|
51
|
+
raise ValueError(f"Config must be an instance of {config_schema_obj.__name__} or dict")
|
|
52
|
+
|
|
53
|
+
def get_tool_config(config: Any = None) -> Any:
|
|
54
|
+
"""Get the effective tool configuration."""
|
|
55
|
+
return getattr(tool, CONFIG_ATTR)
|
|
56
|
+
|
|
57
|
+
# Inject methods
|
|
58
|
+
object.__setattr__(tool, "set_tool_config", set_tool_config)
|
|
59
|
+
object.__setattr__(tool, "get_tool_config", get_tool_config)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _configure_tool(tool: BaseTool, tool_name: str) -> None:
|
|
63
|
+
"""Configure tool with defaults if it has tool_config_schema.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
tool: Tool instance to configure.
|
|
67
|
+
tool_name: Name of the tool for defaults lookup.
|
|
68
|
+
"""
|
|
69
|
+
defaults_by_tool = _load_defaults()
|
|
70
|
+
has_defaults = tool_name in defaults_by_tool
|
|
71
|
+
defaults = defaults_by_tool.get(tool_name)
|
|
72
|
+
|
|
73
|
+
# Check if tool has tool_config_schema
|
|
74
|
+
if hasattr(tool, TOOL_CONFIG_SCHEMA_ATTR):
|
|
75
|
+
# Inject config methods if not present
|
|
76
|
+
if not hasattr(tool, "get_tool_config"):
|
|
77
|
+
config_schema = getattr(tool, TOOL_CONFIG_SCHEMA_ATTR)
|
|
78
|
+
_inject_config_methods(tool, config_schema)
|
|
79
|
+
|
|
80
|
+
# Set tool config when defaults explicitly provided (even empty dict)
|
|
81
|
+
if has_defaults and hasattr(tool, "set_tool_config"):
|
|
82
|
+
tool.set_tool_config(defaults)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def build_runtime_config(tool_name: str) -> dict[str, Any]:
|
|
86
|
+
"""Build runtime config metadata for a custom tool invocation.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
tool_name: Sanitized tool name to look up defaults.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
Dict with metadata key containing flattened defaults and tool_configs.
|
|
93
|
+
"""
|
|
94
|
+
defaults_by_tool = _load_defaults()
|
|
95
|
+
defaults = defaults_by_tool.get(tool_name) or {}
|
|
96
|
+
# Build metadata without aliasing the original defaults dict so a
|
|
97
|
+
# pre-existing tool_configs key in custom_defaults.json does not produce
|
|
98
|
+
# a self-referential metadata dict. Filter out tool_configs first; the
|
|
99
|
+
# merged value is rebuilt below.
|
|
100
|
+
metadata = {k: v for k, v in defaults.items() if k != "tool_configs"}
|
|
101
|
+
existing_tool_configs = defaults.get("tool_configs")
|
|
102
|
+
if isinstance(existing_tool_configs, dict):
|
|
103
|
+
tool_configs = dict(existing_tool_configs)
|
|
104
|
+
else:
|
|
105
|
+
# Tolerate malformed (non-dict) tool_configs entries without raising.
|
|
106
|
+
tool_configs = {}
|
|
107
|
+
tool_configs[tool_name] = dict(metadata)
|
|
108
|
+
metadata["tool_configs"] = tool_configs
|
|
109
|
+
return {"metadata": metadata}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
$build_functions
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""Generated wrapper for custom tool: $original_name
|
|
2
|
+
|
|
3
|
+
This module provides a sync wrapper for calling the tool in PTC code.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import inspect
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from tools.custom_registry import build_$sanitized_name, build_runtime_config
|
|
10
|
+
from tools.custom_invoke import run_tool
|
|
11
|
+
|
|
12
|
+
_SCHEMA_TO_PARAM = $schema_to_param
|
|
13
|
+
_PARAM_TO_SCHEMA = $param_to_schema
|
|
14
|
+
_REQUIRED_PARAMS = $required_params
|
|
15
|
+
_OPTIONAL_PARAMS = $optional_params
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _resolve_logical_param(input_key: str) -> str | None:
|
|
19
|
+
"""Resolve incoming key to logical sanitized parameter name."""
|
|
20
|
+
if input_key in _SCHEMA_TO_PARAM:
|
|
21
|
+
return _SCHEMA_TO_PARAM[input_key]
|
|
22
|
+
if input_key in _PARAM_TO_SCHEMA:
|
|
23
|
+
return input_key
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _normalize_arguments(args: tuple[Any, ...], kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
28
|
+
"""Normalize supported call patterns into final tool arguments."""
|
|
29
|
+
if len(args) > 1:
|
|
30
|
+
raise TypeError("expected at most one positional dict")
|
|
31
|
+
|
|
32
|
+
positional_payload: dict[str, Any] = {}
|
|
33
|
+
if args:
|
|
34
|
+
first_arg = args[0]
|
|
35
|
+
if not isinstance(first_arg, dict):
|
|
36
|
+
raise TypeError("expected at most one positional dict")
|
|
37
|
+
positional_payload = first_arg
|
|
38
|
+
|
|
39
|
+
known_values: dict[str, Any] = {}
|
|
40
|
+
passthrough: dict[str, Any] = {}
|
|
41
|
+
seen_sources: dict[str, str] = {}
|
|
42
|
+
|
|
43
|
+
for source_dict in (positional_payload, kwargs):
|
|
44
|
+
for input_key, value in source_dict.items():
|
|
45
|
+
logical_param = _resolve_logical_param(input_key)
|
|
46
|
+
if logical_param is None:
|
|
47
|
+
passthrough[input_key] = value
|
|
48
|
+
continue
|
|
49
|
+
|
|
50
|
+
prior_key = seen_sources.get(logical_param)
|
|
51
|
+
if prior_key is not None:
|
|
52
|
+
raise TypeError(
|
|
53
|
+
f"duplicate argument for {logical_param}: conflicting keys '{prior_key}' and '{input_key}'"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
seen_sources[logical_param] = input_key
|
|
57
|
+
known_values[logical_param] = value
|
|
58
|
+
|
|
59
|
+
for required_param in _REQUIRED_PARAMS:
|
|
60
|
+
if required_param not in known_values:
|
|
61
|
+
raise TypeError(f"missing required argument: {required_param}")
|
|
62
|
+
|
|
63
|
+
arguments: dict[str, Any] = {}
|
|
64
|
+
for param_name, value in known_values.items():
|
|
65
|
+
if param_name in _OPTIONAL_PARAMS and value is None:
|
|
66
|
+
continue
|
|
67
|
+
schema_key = _PARAM_TO_SCHEMA.get(param_name, param_name)
|
|
68
|
+
arguments[schema_key] = value
|
|
69
|
+
|
|
70
|
+
arguments.update(passthrough)
|
|
71
|
+
return arguments
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def $sanitized_name(*args: Any, **kwargs: Any):
|
|
75
|
+
"""Call $original_name with signature: ($canonical_params).
|
|
76
|
+
|
|
77
|
+
Supports kwargs and a single positional dict compatibility payload.
|
|
78
|
+
"""
|
|
79
|
+
arguments = _normalize_arguments(args, kwargs)
|
|
80
|
+
return run_tool(build_$sanitized_name(), arguments, config=build_runtime_config("$sanitized_name"))
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
$sanitized_name.__signature__ = inspect.Signature(
|
|
84
|
+
parameters=[
|
|
85
|
+
$runtime_signature_params
|
|
86
|
+
]
|
|
87
|
+
)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Documentation generation utilities for PTC.
|
|
2
|
+
|
|
3
|
+
Shared constants and helpers for generating tool documentation in sandbox payloads.
|
|
4
|
+
|
|
5
|
+
Authors:
|
|
6
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from aip_agents.ptc.naming import sanitize_function_name
|
|
12
|
+
|
|
13
|
+
# Documentation limits (fixed constants per plan)
|
|
14
|
+
DOC_DESC_LIMIT = 120 # Tool description trim limit
|
|
15
|
+
DOC_PARAM_DESC_LIMIT = 80 # Parameter description trim limit
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def json_type_to_display(json_type: Any) -> str:
|
|
19
|
+
"""Convert JSON type to display string.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
json_type: JSON schema type.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
Human-readable type string.
|
|
26
|
+
"""
|
|
27
|
+
if isinstance(json_type, list):
|
|
28
|
+
return "any"
|
|
29
|
+
type_map = {
|
|
30
|
+
"string": "str",
|
|
31
|
+
"integer": "int",
|
|
32
|
+
"number": "float",
|
|
33
|
+
"boolean": "bool",
|
|
34
|
+
"array": "list",
|
|
35
|
+
"object": "dict",
|
|
36
|
+
"null": "None",
|
|
37
|
+
}
|
|
38
|
+
return type_map.get(str(json_type), "any")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def trim_text(text: str | None, limit: int) -> str:
|
|
42
|
+
"""Trim text to limit with ellipsis if needed.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
text: Text to trim.
|
|
46
|
+
limit: Maximum length before trimming.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Trimmed text.
|
|
50
|
+
"""
|
|
51
|
+
if not text:
|
|
52
|
+
return ""
|
|
53
|
+
if len(text) > limit:
|
|
54
|
+
return text[:limit] + "..."
|
|
55
|
+
return text
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def render_tool_doc(
|
|
59
|
+
func_name: str,
|
|
60
|
+
signature: str,
|
|
61
|
+
description: str,
|
|
62
|
+
schema: dict[str, Any],
|
|
63
|
+
is_stub: bool = False,
|
|
64
|
+
example_code: str | None = None,
|
|
65
|
+
example_heading: str = "## Example",
|
|
66
|
+
) -> str:
|
|
67
|
+
"""Render markdown documentation for a tool.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
func_name: Sanitized function name.
|
|
71
|
+
signature: Full function signature.
|
|
72
|
+
description: Tool description.
|
|
73
|
+
schema: Input schema for parameters.
|
|
74
|
+
is_stub: Whether this is a stub documentation.
|
|
75
|
+
example_code: Optional example code block content (without ```python).
|
|
76
|
+
example_heading: Heading for the example section.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
Markdown documentation string.
|
|
80
|
+
"""
|
|
81
|
+
if is_stub:
|
|
82
|
+
desc = "Details unavailable because tool definitions are not loaded yet."
|
|
83
|
+
else:
|
|
84
|
+
desc = trim_text(description, DOC_DESC_LIMIT) or "No description available."
|
|
85
|
+
|
|
86
|
+
lines = [
|
|
87
|
+
f"# {func_name}",
|
|
88
|
+
"",
|
|
89
|
+
f"**Description:** {desc}",
|
|
90
|
+
"",
|
|
91
|
+
f"**Signature:** `{signature}`",
|
|
92
|
+
"",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
# Add parameters section
|
|
96
|
+
properties = schema.get("properties", {})
|
|
97
|
+
required = set(schema.get("required", []))
|
|
98
|
+
|
|
99
|
+
if properties:
|
|
100
|
+
lines.append("## Parameters")
|
|
101
|
+
lines.append("")
|
|
102
|
+
for prop_name, prop_schema in sorted(properties.items()):
|
|
103
|
+
safe_param = sanitize_function_name(prop_name)
|
|
104
|
+
prop_type = json_type_to_display(prop_schema.get("type", "any"))
|
|
105
|
+
is_required = "required" if prop_name in required else "optional"
|
|
106
|
+
|
|
107
|
+
# Trim param description
|
|
108
|
+
raw_param_desc = prop_schema.get("description", "")
|
|
109
|
+
param_desc = trim_text(raw_param_desc, DOC_PARAM_DESC_LIMIT)
|
|
110
|
+
|
|
111
|
+
lines.append(f"- **{safe_param}** ({prop_type}, {is_required}): {param_desc}")
|
|
112
|
+
lines.append("")
|
|
113
|
+
|
|
114
|
+
# Add example section
|
|
115
|
+
if example_code:
|
|
116
|
+
lines.append(example_heading)
|
|
117
|
+
lines.append("")
|
|
118
|
+
lines.append("```python")
|
|
119
|
+
lines.append(example_code)
|
|
120
|
+
lines.append("```")
|
|
121
|
+
|
|
122
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""PTC-specific exceptions.
|
|
2
|
+
|
|
3
|
+
This module defines exceptions for Programmatic Tool Calling operations.
|
|
4
|
+
|
|
5
|
+
Authors:
|
|
6
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PTCError(Exception):
|
|
11
|
+
"""Base exception for PTC errors."""
|
|
12
|
+
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class PTCToolError(PTCError):
|
|
17
|
+
"""Error during tool execution.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
server_name: The MCP server where the error occurred.
|
|
21
|
+
tool_name: The tool that failed.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
message: str,
|
|
27
|
+
server_name: str | None = None,
|
|
28
|
+
tool_name: str | None = None,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Initialize PTCToolError.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
message: Error message.
|
|
34
|
+
server_name: The MCP server name (optional).
|
|
35
|
+
tool_name: The tool name (optional).
|
|
36
|
+
"""
|
|
37
|
+
super().__init__(message)
|
|
38
|
+
self.server_name = server_name
|
|
39
|
+
self.tool_name = tool_name
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class PTCPayloadConflictError(PTCError):
|
|
43
|
+
"""Error when merging payloads with conflicting file paths.
|
|
44
|
+
|
|
45
|
+
Attributes:
|
|
46
|
+
conflicts: Set of conflicting file paths.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, message: str, conflicts: set[str]) -> None:
|
|
50
|
+
"""Initialize PTCPayloadConflictError.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
message: Error message.
|
|
54
|
+
conflicts: Set of conflicting file paths.
|
|
55
|
+
"""
|
|
56
|
+
super().__init__(message)
|
|
57
|
+
self.conflicts = conflicts
|