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,240 @@
|
|
|
1
|
+
"""Template policy for sandbox templates.
|
|
2
|
+
|
|
3
|
+
This module owns the *aip-agents* template policy and a thin orchestration
|
|
4
|
+
wrapper that delegates the generic build mechanics to gllm-tools'
|
|
5
|
+
``E2BTemplateBuilder``.
|
|
6
|
+
|
|
7
|
+
Two build inputs are supported, selected at runtime:
|
|
8
|
+
|
|
9
|
+
- **Image registry (preferred).** When ``AIP_SANDBOX_IMAGE_REGISTRY`` is set, the
|
|
10
|
+
template is built from a prebuilt image (see ``image_registry``).
|
|
11
|
+
- **Dockerfile (DEPRECATED — legacy fallback).** When the image registry is not
|
|
12
|
+
configured, the build falls back to the packaged ``dockerfiles/*.Dockerfile``.
|
|
13
|
+
This path and the packaged Dockerfiles are slated for removal once image-based
|
|
14
|
+
building is validated in production; do not extend it.
|
|
15
|
+
|
|
16
|
+
The generic E2B build primitives now live in
|
|
17
|
+
``gllm_tools.code_interpreter.code_template``; aip-agents no longer imports the
|
|
18
|
+
base ``e2b`` package directly.
|
|
19
|
+
|
|
20
|
+
Authors:
|
|
21
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import shlex
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
|
|
27
|
+
from aip_agents.sandbox import image_registry
|
|
28
|
+
from aip_agents.sandbox.defaults import DEFAULT_SANDBOX_TEMPLATE
|
|
29
|
+
from aip_agents.sandbox.validation import validate_package_names
|
|
30
|
+
from aip_agents.utils.logger import get_logger
|
|
31
|
+
|
|
32
|
+
logger = get_logger(__name__)
|
|
33
|
+
|
|
34
|
+
# DEPRECATED: packaged Dockerfile build path. Kept as a gated fallback for
|
|
35
|
+
# environments without an image registry; remove with the packaged Dockerfiles
|
|
36
|
+
# once image-based building is proven in production.
|
|
37
|
+
DEFAULT_SANDBOX_DOCKERFILE_RELATIVE_PATH = Path("dockerfiles/aip-agents-sandbox-v2-3.Dockerfile")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class DockerfileNotFoundError(ValueError):
|
|
41
|
+
"""Raised when no packaged Dockerfile matches a requested template alias.
|
|
42
|
+
|
|
43
|
+
DEPRECATED: part of the legacy Dockerfile build path.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_default_sandbox_dockerfile_path() -> Path:
|
|
48
|
+
"""Return the absolute path to the packaged default sandbox Dockerfile.
|
|
49
|
+
|
|
50
|
+
DEPRECATED: legacy Dockerfile build path; superseded by the image registry
|
|
51
|
+
(``AIP_SANDBOX_IMAGE_REGISTRY``). Slated for removal once image-based
|
|
52
|
+
building is validated.
|
|
53
|
+
"""
|
|
54
|
+
return Path(__file__).resolve().parent / DEFAULT_SANDBOX_DOCKERFILE_RELATIVE_PATH
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def get_sandbox_dockerfile_path(template_id: str) -> Path:
|
|
58
|
+
"""Resolve the packaged Dockerfile path for a sandbox template alias.
|
|
59
|
+
|
|
60
|
+
DEPRECATED: legacy Dockerfile build path; superseded by the image registry
|
|
61
|
+
(``AIP_SANDBOX_IMAGE_REGISTRY``). Slated for removal once image-based
|
|
62
|
+
building is validated.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
template_id: The template alias to resolve.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Absolute Dockerfile path for the alias.
|
|
69
|
+
|
|
70
|
+
Raises:
|
|
71
|
+
DockerfileNotFoundError: If no packaged Dockerfile matches ``template_id``.
|
|
72
|
+
"""
|
|
73
|
+
default_dockerfile = get_default_sandbox_dockerfile_path()
|
|
74
|
+
if template_id == DEFAULT_SANDBOX_TEMPLATE:
|
|
75
|
+
return default_dockerfile
|
|
76
|
+
|
|
77
|
+
candidate = default_dockerfile.parent / f"{template_id}.Dockerfile"
|
|
78
|
+
if candidate.is_file():
|
|
79
|
+
return candidate
|
|
80
|
+
|
|
81
|
+
raise DockerfileNotFoundError(f"No template-specific Dockerfile found for {template_id!r}. Expected: {candidate}")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _load_code_template_builder() -> tuple[type, type]:
|
|
85
|
+
"""Load the gllm-tools template builder classes only when needed."""
|
|
86
|
+
from gllm_tools.code_interpreter.code_template import TemplateSpec
|
|
87
|
+
from gllm_tools.code_interpreter.code_template.e2b_template_builder import (
|
|
88
|
+
E2BTemplateBuilder,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
return TemplateSpec, E2BTemplateBuilder
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def ensure_sandbox_template(
|
|
95
|
+
template_id: str,
|
|
96
|
+
base_template: str,
|
|
97
|
+
packages: list[str] | None,
|
|
98
|
+
force_rebuild: bool = False,
|
|
99
|
+
dockerfile: str | Path | None = None,
|
|
100
|
+
) -> str | None:
|
|
101
|
+
"""Ensure a sandbox template exists, creating it if necessary.
|
|
102
|
+
|
|
103
|
+
This is an explicit helper that apps can call at startup to ensure the
|
|
104
|
+
template exists. It is never run implicitly by the SDK. The generic build
|
|
105
|
+
mechanics are delegated to gllm-tools' ``E2BTemplateBuilder``; this wrapper
|
|
106
|
+
keeps the aip-agents policy (package validation) and the historical
|
|
107
|
+
string-or-``None`` return shape.
|
|
108
|
+
|
|
109
|
+
Build input is selected at runtime: when ``AIP_SANDBOX_IMAGE_REGISTRY`` is
|
|
110
|
+
set, the template is built from the resolved registry image; otherwise it
|
|
111
|
+
falls back to the **deprecated** Dockerfile path (the ``dockerfile`` arg or
|
|
112
|
+
``base_template``).
|
|
113
|
+
|
|
114
|
+
Template building requires the base ``e2b`` package, provided transitively by
|
|
115
|
+
gllm-tools' sandbox support; the ``E2BTemplateBuilder`` import below raises
|
|
116
|
+
an actionable ``ImportError`` when it is absent.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
template_id: Unique alias for the template (e.g., "aip-agents-sandbox-v2").
|
|
120
|
+
base_template: Base template alias to build from
|
|
121
|
+
(e.g., "code-interpreter-v1").
|
|
122
|
+
packages: List of packages to install in the template.
|
|
123
|
+
If None or empty, skips pip install step.
|
|
124
|
+
force_rebuild: If True, rebuild even if alias exists.
|
|
125
|
+
dockerfile: Optional Dockerfile path used to create template via
|
|
126
|
+
``from_dockerfile``. DEPRECATED: ignored when the image registry is
|
|
127
|
+
configured.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
The template_id on success, None if creation failed.
|
|
131
|
+
Never raises (apart from a missing-``e2b`` ImportError).
|
|
132
|
+
"""
|
|
133
|
+
# Pre-validate packages here (aip-agents policy); the library treats the list
|
|
134
|
+
# as trusted. Keep the never-raises contract by mapping a validation error to
|
|
135
|
+
# a None result. Note: validation now runs ahead of the library's
|
|
136
|
+
# "already usable" fast path, so an already-built template re-requested with a
|
|
137
|
+
# now-invalid package list returns None rather than its existing alias.
|
|
138
|
+
if packages:
|
|
139
|
+
try:
|
|
140
|
+
validate_package_names(packages)
|
|
141
|
+
except Exception as e:
|
|
142
|
+
logger.warning(f"Package validation failed for {template_id}: {e}")
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
if image_registry.resolve_image_ref() is not None:
|
|
146
|
+
try:
|
|
147
|
+
_, builder_type = _load_code_template_builder()
|
|
148
|
+
except ModuleNotFoundError as exc:
|
|
149
|
+
# Keep a stable failure mode for optional dependency availability:
|
|
150
|
+
# tests assert this remains an actionable e2b requirement error.
|
|
151
|
+
raise ImportError("'e2b' package is required to build sandbox templates") from exc
|
|
152
|
+
|
|
153
|
+
try:
|
|
154
|
+
spec = image_registry.build_spec(template_id, packages=packages, force_rebuild=force_rebuild)
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.warning(f"Image-registry template config failed for {template_id}: {e}")
|
|
157
|
+
return None
|
|
158
|
+
result = builder_type().ensure(spec)
|
|
159
|
+
else:
|
|
160
|
+
# DEPRECATED: legacy Dockerfile build path. Remove once image-based
|
|
161
|
+
# building is validated in production.
|
|
162
|
+
logger.warning(
|
|
163
|
+
"Building sandbox template %r via the deprecated Dockerfile path (AIP_SANDBOX_IMAGE_REGISTRY not set).",
|
|
164
|
+
template_id,
|
|
165
|
+
)
|
|
166
|
+
if dockerfile is not None:
|
|
167
|
+
return _ensure_e2b_dockerfile_template(
|
|
168
|
+
template_id=template_id,
|
|
169
|
+
packages=packages,
|
|
170
|
+
force_rebuild=force_rebuild,
|
|
171
|
+
dockerfile=Path(dockerfile),
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
try:
|
|
175
|
+
template_spec_type, builder_type = _load_code_template_builder()
|
|
176
|
+
except ModuleNotFoundError as exc:
|
|
177
|
+
# Keep a stable failure mode for optional dependency availability:
|
|
178
|
+
# tests assert this remains an actionable e2b requirement error.
|
|
179
|
+
raise ImportError("'e2b' package is required to build sandbox templates") from exc
|
|
180
|
+
|
|
181
|
+
spec = template_spec_type(
|
|
182
|
+
template_id=template_id,
|
|
183
|
+
base_template=base_template,
|
|
184
|
+
packages=packages,
|
|
185
|
+
dockerfile=None,
|
|
186
|
+
force_rebuild=force_rebuild,
|
|
187
|
+
)
|
|
188
|
+
result = builder_type().ensure(spec)
|
|
189
|
+
# gllm-tools now returns a provider-tagged ``TemplateRef`` (None on failure);
|
|
190
|
+
# unwrap to the E2B alias string to keep this wrapper's historical contract.
|
|
191
|
+
return result.template_ref.value if result.template_ref is not None else None
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _ensure_e2b_dockerfile_template(
|
|
195
|
+
template_id: str,
|
|
196
|
+
packages: list[str] | None,
|
|
197
|
+
force_rebuild: bool,
|
|
198
|
+
dockerfile: Path,
|
|
199
|
+
) -> str | None:
|
|
200
|
+
"""Build an E2B alias from a Dockerfile path with its directory as context.
|
|
201
|
+
|
|
202
|
+
E2B's deprecated ``Template().from_dockerfile(path)`` parser keeps COPY
|
|
203
|
+
sources relative to ``Template(file_context_path=...)``, not automatically
|
|
204
|
+
relative to the Dockerfile path. The generic gllm-tools wrapper currently
|
|
205
|
+
constructs ``Template()`` without that context, so aip-agents owns the
|
|
206
|
+
path-based Dockerfile branch until the generic wrapper grows first-class
|
|
207
|
+
context support.
|
|
208
|
+
"""
|
|
209
|
+
from e2b import Template, default_build_logger
|
|
210
|
+
|
|
211
|
+
_, builder_type = _load_code_template_builder()
|
|
212
|
+
|
|
213
|
+
builder = builder_type()
|
|
214
|
+
if not force_rebuild and builder.is_usable(template_id):
|
|
215
|
+
return template_id
|
|
216
|
+
|
|
217
|
+
dockerfile_path = dockerfile.resolve()
|
|
218
|
+
|
|
219
|
+
try:
|
|
220
|
+
template = Template(file_context_path=dockerfile_path.parent).from_dockerfile(str(dockerfile_path))
|
|
221
|
+
if packages:
|
|
222
|
+
packages_str = " ".join(shlex.quote(package) for package in packages)
|
|
223
|
+
template = template.run_cmd(f"pip install -q {packages_str}")
|
|
224
|
+
Template.build(template, alias=template_id, on_build_logs=default_build_logger())
|
|
225
|
+
return template_id
|
|
226
|
+
except Exception as e: # pragma: no cover
|
|
227
|
+
logger.warning(f"E2B Dockerfile template build failed for {template_id}: {e}") # pragma: no cover
|
|
228
|
+
if not force_rebuild and builder.is_usable(template_id): # pragma: no cover
|
|
229
|
+
return template_id # pragma: no cover
|
|
230
|
+
return None # pragma: no cover
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def ensure_ptc_template(
|
|
234
|
+
template_id: str,
|
|
235
|
+
base_template: str,
|
|
236
|
+
ptc_packages: list[str] | None,
|
|
237
|
+
force_rebuild: bool = False,
|
|
238
|
+
) -> str | None:
|
|
239
|
+
"""Deprecated: Use ensure_sandbox_template instead."""
|
|
240
|
+
return ensure_sandbox_template(template_id, base_template, ptc_packages, force_rebuild=force_rebuild)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Sandbox execution result types.
|
|
2
|
+
|
|
3
|
+
This module defines types for sandbox execution results.
|
|
4
|
+
|
|
5
|
+
Authors:
|
|
6
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Any, TypeAlias, cast
|
|
11
|
+
|
|
12
|
+
from langchain_core.messages.ai import UsageMetadata
|
|
13
|
+
|
|
14
|
+
from aip_agents.utils.logger import get_logger
|
|
15
|
+
from aip_agents.utils.token_usage_helper import add_usage_metadata
|
|
16
|
+
|
|
17
|
+
logger = get_logger(__name__)
|
|
18
|
+
|
|
19
|
+
JSONValue: TypeAlias = None | bool | int | float | str | list["JSONValue"] | dict[str, "JSONValue"]
|
|
20
|
+
|
|
21
|
+
_USAGE_TOKEN_KEYS = ("input_tokens", "output_tokens", "total_tokens")
|
|
22
|
+
_USAGE_DETAIL_KEYS = ("input_token_details", "output_token_details")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _is_usage_number(value: JSONValue) -> bool:
|
|
26
|
+
"""Return whether a structured-output token value is safely additive."""
|
|
27
|
+
return isinstance(value, int | float) and not isinstance(value, bool)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _validated_usage_metadata(value: JSONValue | None) -> UsageMetadata | None:
|
|
31
|
+
"""Return validated UsageMetadata or None when a sandbox payload is malformed."""
|
|
32
|
+
if not isinstance(value, dict):
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
for key in _USAGE_TOKEN_KEYS:
|
|
36
|
+
if not _is_usage_number(value.get(key)):
|
|
37
|
+
logger.warning(f"Skipping malformed usage_metadata (expected numeric {key})")
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
validated: dict[str, Any] = {key: value[key] for key in _USAGE_TOKEN_KEYS}
|
|
41
|
+
for key in _USAGE_DETAIL_KEYS:
|
|
42
|
+
details = value.get(key)
|
|
43
|
+
if details is None:
|
|
44
|
+
continue
|
|
45
|
+
if not isinstance(details, dict) or any(
|
|
46
|
+
not _is_usage_number(detail_value) for detail_value in details.values()
|
|
47
|
+
):
|
|
48
|
+
logger.warning(f"Skipping malformed usage_metadata (expected numeric {key} values)")
|
|
49
|
+
return None
|
|
50
|
+
validated[key] = details # pragma: no cover
|
|
51
|
+
return cast(UsageMetadata, validated)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass
|
|
55
|
+
class PTCStructuredOutput:
|
|
56
|
+
"""Supported structured updates emitted by sandboxed PTC custom tools."""
|
|
57
|
+
|
|
58
|
+
metadata: dict[str, JSONValue] = field(default_factory=dict)
|
|
59
|
+
artifacts: list[JSONValue] = field(default_factory=list)
|
|
60
|
+
pii_mapping: dict[str, JSONValue] = field(default_factory=dict)
|
|
61
|
+
usage_metadata: dict[str, JSONValue] = field(default_factory=dict)
|
|
62
|
+
warnings: list[str] = field(default_factory=list)
|
|
63
|
+
|
|
64
|
+
def has_updates(self) -> bool:
|
|
65
|
+
"""Return True when at least one supported update field is present."""
|
|
66
|
+
return bool(self.metadata or self.artifacts or self.pii_mapping or self.usage_metadata or self.warnings)
|
|
67
|
+
|
|
68
|
+
def merge(self, update: dict[str, JSONValue]) -> None:
|
|
69
|
+
"""Merge one supported update using ToolExecutionEngine-compatible semantics."""
|
|
70
|
+
metadata = update.get("metadata")
|
|
71
|
+
if isinstance(metadata, dict):
|
|
72
|
+
self.metadata.update(metadata)
|
|
73
|
+
|
|
74
|
+
artifacts = update.get("artifacts")
|
|
75
|
+
if isinstance(artifacts, list):
|
|
76
|
+
self.artifacts.extend(artifacts)
|
|
77
|
+
|
|
78
|
+
pii_mapping = update.get("pii_mapping")
|
|
79
|
+
if isinstance(pii_mapping, dict):
|
|
80
|
+
# Only accept str->str entries. Downstream masking sorts and matches on
|
|
81
|
+
# value length/content, so a non-string tag or value would poison every
|
|
82
|
+
# later anonymization call.
|
|
83
|
+
for tag, value in pii_mapping.items():
|
|
84
|
+
if isinstance(tag, str) and isinstance(value, str):
|
|
85
|
+
self.pii_mapping[tag] = value
|
|
86
|
+
else:
|
|
87
|
+
logger.warning(f"Skipping malformed pii_mapping entry (expected str->str): {tag!r} -> {value!r}")
|
|
88
|
+
|
|
89
|
+
usage_metadata = _validated_usage_metadata(update.get("usage_metadata"))
|
|
90
|
+
if usage_metadata is not None:
|
|
91
|
+
current_usage = cast(UsageMetadata | None, self.usage_metadata or None)
|
|
92
|
+
self.usage_metadata = cast(dict[str, JSONValue], add_usage_metadata(current_usage, usage_metadata) or {})
|
|
93
|
+
|
|
94
|
+
warnings = update.get("warnings")
|
|
95
|
+
if isinstance(warnings, list):
|
|
96
|
+
self.warnings.extend(warning for warning in warnings if isinstance(warning, str)) # pragma: no cover
|
|
97
|
+
|
|
98
|
+
def add_warning(self, warning: str) -> None:
|
|
99
|
+
"""Record a caller-visible non-fatal structured-output warning."""
|
|
100
|
+
self.warnings.append(warning)
|
|
101
|
+
|
|
102
|
+
def to_command_update(self) -> dict[str, JSONValue]:
|
|
103
|
+
"""Return only populated supported fields for an outer Command.update."""
|
|
104
|
+
update: dict[str, JSONValue] = {}
|
|
105
|
+
if self.metadata:
|
|
106
|
+
update["metadata"] = self.metadata
|
|
107
|
+
if self.artifacts:
|
|
108
|
+
update["artifacts"] = self.artifacts
|
|
109
|
+
if self.pii_mapping:
|
|
110
|
+
update["pii_mapping"] = self.pii_mapping
|
|
111
|
+
if self.usage_metadata:
|
|
112
|
+
update["usage_metadata"] = self.usage_metadata
|
|
113
|
+
if self.warnings:
|
|
114
|
+
update["warnings"] = cast(JSONValue, list(self.warnings))
|
|
115
|
+
return update
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclass
|
|
119
|
+
class SandboxExecutionResult:
|
|
120
|
+
"""Result of a sandbox code execution.
|
|
121
|
+
|
|
122
|
+
Attributes:
|
|
123
|
+
stdout: Standard output from the execution.
|
|
124
|
+
stderr: Standard error from the execution.
|
|
125
|
+
exit_code: Exit code (0 for success, non-zero for failure).
|
|
126
|
+
timed_out: Whether the sandbox runtime reported an execution timeout.
|
|
127
|
+
execution_backend: Runtime backend that executed the code or command.
|
|
128
|
+
timeout_source: Specific timeout layer when known.
|
|
129
|
+
timeout_seconds: Timeout value enforced by that layer when known.
|
|
130
|
+
diagnostics: Extra machine-readable execution diagnostics.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
stdout: str
|
|
134
|
+
stderr: str
|
|
135
|
+
exit_code: int
|
|
136
|
+
structured_output: PTCStructuredOutput = field(default_factory=PTCStructuredOutput)
|
|
137
|
+
timed_out: bool = False
|
|
138
|
+
execution_backend: str | None = None
|
|
139
|
+
timeout_source: str | None = None
|
|
140
|
+
timeout_seconds: float | None = None
|
|
141
|
+
diagnostics: dict[str, Any] = field(default_factory=dict)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Validation utilities for sandbox operations.
|
|
2
|
+
|
|
3
|
+
This module provides validation functions for sandbox-related operations
|
|
4
|
+
such as package name validation.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import re
|
|
11
|
+
|
|
12
|
+
_PACKAGE_SPEC_PATTERN = re.compile(
|
|
13
|
+
r"^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?"
|
|
14
|
+
r"(?:\[[A-Za-z0-9._-]+(?:,[A-Za-z0-9._-]+)*\])?"
|
|
15
|
+
r"(?:"
|
|
16
|
+
r"(?:==|!=|<=|>=|~=|<|>)[0-9][A-Za-z0-9.*+!_-]*"
|
|
17
|
+
r"(?:,(?:==|!=|<=|>=|~=|<|>)[0-9][A-Za-z0-9.*+!_-]*)*"
|
|
18
|
+
r")?$"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def validate_package_name(package: str) -> bool:
|
|
23
|
+
"""Validate package name/specifier format for pip install.
|
|
24
|
+
|
|
25
|
+
Allows standard pip formats: package, package==version, package[extra].
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
package: Package name or specifier to validate.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
True if package name is valid, False otherwise.
|
|
32
|
+
"""
|
|
33
|
+
if not package:
|
|
34
|
+
return False
|
|
35
|
+
|
|
36
|
+
return bool(_PACKAGE_SPEC_PATTERN.fullmatch(package))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def validate_package_names(packages: list[str]) -> None:
|
|
40
|
+
"""Validate all package names in a list.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
packages: List of package names or specifiers to validate.
|
|
44
|
+
|
|
45
|
+
Raises:
|
|
46
|
+
ValueError: If any package name is invalid.
|
|
47
|
+
"""
|
|
48
|
+
for pkg in packages:
|
|
49
|
+
if not validate_package_name(pkg):
|
|
50
|
+
raise ValueError(f"Invalid package name format: {pkg}")
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Central schema package for aip_agents data models."""
|
|
2
|
+
|
|
3
|
+
from aip_agents.schema.a2a import A2AEvent, A2AStreamEventType, ToolCallInfo, ToolResultInfo
|
|
4
|
+
from aip_agents.schema.agent import (
|
|
5
|
+
A2AClientConfig,
|
|
6
|
+
AgentConfig,
|
|
7
|
+
BaseAgentConfig,
|
|
8
|
+
CredentialType,
|
|
9
|
+
HttpxClientOptions,
|
|
10
|
+
LangflowAgentConfig,
|
|
11
|
+
StreamMode,
|
|
12
|
+
)
|
|
13
|
+
from aip_agents.schema.artifacts import (
|
|
14
|
+
ArtifactBuildError,
|
|
15
|
+
ArtifactPayload,
|
|
16
|
+
ToolArtifactResponse,
|
|
17
|
+
ToolMultiArtifactResponse,
|
|
18
|
+
TrackedArtifact,
|
|
19
|
+
)
|
|
20
|
+
from aip_agents.schema.attachments import AttachmentEntryPayload
|
|
21
|
+
from aip_agents.schema.hitl import (
|
|
22
|
+
ApprovalDecision,
|
|
23
|
+
ApprovalDecisionType,
|
|
24
|
+
ApprovalLogEntry,
|
|
25
|
+
ApprovalRequest,
|
|
26
|
+
HitlMetadata,
|
|
27
|
+
)
|
|
28
|
+
from aip_agents.schema.langgraph import ToolCallResult, ToolStorageParams
|
|
29
|
+
from aip_agents.schema.model_id import ModelId, ModelProvider
|
|
30
|
+
from aip_agents.schema.model_usage import ModelUsageDelta, ModelUsageRow
|
|
31
|
+
from aip_agents.schema.runtime_metadata import (
|
|
32
|
+
LocalizedMessages,
|
|
33
|
+
RuntimeMetadata,
|
|
34
|
+
)
|
|
35
|
+
from aip_agents.schema.step_limit import (
|
|
36
|
+
MaxDelegationDepthExceededError,
|
|
37
|
+
MaxStepsExceededError,
|
|
38
|
+
StepLimitConfig,
|
|
39
|
+
StepLimitError,
|
|
40
|
+
StepLimitErrorResponse,
|
|
41
|
+
StepLimitErrorType,
|
|
42
|
+
)
|
|
43
|
+
from aip_agents.schema.storage import OBJECT_STORAGE_PREFIX, StorageConfig, StorageType
|
|
44
|
+
from aip_agents.schema.tool_payloads import (
|
|
45
|
+
ToolArgs,
|
|
46
|
+
ToolInvocationPayload,
|
|
47
|
+
ToolOutputStorageStats,
|
|
48
|
+
ToolOutputSummaryEntry,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
__all__ = [
|
|
52
|
+
# A2A
|
|
53
|
+
"A2AEvent",
|
|
54
|
+
"A2AStreamEventType",
|
|
55
|
+
"ToolCallInfo",
|
|
56
|
+
"ToolResultInfo",
|
|
57
|
+
# Agent
|
|
58
|
+
"A2AClientConfig",
|
|
59
|
+
"AgentConfig",
|
|
60
|
+
"BaseAgentConfig",
|
|
61
|
+
"CredentialType",
|
|
62
|
+
"HttpxClientOptions",
|
|
63
|
+
"LangflowAgentConfig",
|
|
64
|
+
"StreamMode",
|
|
65
|
+
# Artifacts
|
|
66
|
+
"ArtifactBuildError",
|
|
67
|
+
"ArtifactPayload",
|
|
68
|
+
"ToolArtifactResponse",
|
|
69
|
+
"ToolMultiArtifactResponse",
|
|
70
|
+
"TrackedArtifact",
|
|
71
|
+
# Attachments
|
|
72
|
+
"AttachmentEntryPayload",
|
|
73
|
+
# HITL
|
|
74
|
+
"ApprovalDecision",
|
|
75
|
+
"ApprovalDecisionType",
|
|
76
|
+
"ApprovalLogEntry",
|
|
77
|
+
"ApprovalRequest",
|
|
78
|
+
"HitlMetadata",
|
|
79
|
+
# LangGraph
|
|
80
|
+
"ToolCallResult",
|
|
81
|
+
"ToolStorageParams",
|
|
82
|
+
# Model
|
|
83
|
+
"ModelId",
|
|
84
|
+
"ModelProvider",
|
|
85
|
+
"ModelUsageDelta",
|
|
86
|
+
"ModelUsageRow",
|
|
87
|
+
# Runtime metadata
|
|
88
|
+
"LocalizedMessages",
|
|
89
|
+
"RuntimeMetadata",
|
|
90
|
+
# Storage
|
|
91
|
+
"OBJECT_STORAGE_PREFIX",
|
|
92
|
+
"StorageConfig",
|
|
93
|
+
"StorageType",
|
|
94
|
+
# Step Limit
|
|
95
|
+
"MaxDelegationDepthExceededError",
|
|
96
|
+
"MaxStepsExceededError",
|
|
97
|
+
"StepLimitConfig",
|
|
98
|
+
"StepLimitError",
|
|
99
|
+
"StepLimitErrorResponse",
|
|
100
|
+
"StepLimitErrorType",
|
|
101
|
+
# Tool payloads
|
|
102
|
+
"ToolArgs",
|
|
103
|
+
"ToolInvocationPayload",
|
|
104
|
+
"ToolOutputStorageStats",
|
|
105
|
+
"ToolOutputSummaryEntry",
|
|
106
|
+
]
|
aip_agents/schema/a2a.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""A2A event schema definitions used for agent-executor communication."""
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from typing_extensions import TypedDict
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"A2AStreamEventType",
|
|
10
|
+
"A2AEvent",
|
|
11
|
+
"ToolCallInfo",
|
|
12
|
+
"ToolResultInfo",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class A2AStreamEventType(Enum):
|
|
17
|
+
"""Semantic event types for A2A agent-executor communication."""
|
|
18
|
+
|
|
19
|
+
STATUS_UPDATE = "status_update"
|
|
20
|
+
CONTENT_CHUNK = "content_chunk"
|
|
21
|
+
FINAL_RESPONSE = "final_response"
|
|
22
|
+
TOOL_CALL = "tool_call"
|
|
23
|
+
TOOL_RESULT = "tool_result"
|
|
24
|
+
ERROR = "error"
|
|
25
|
+
STEP_LIMIT_EXCEEDED = "step_limit_exceeded"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class A2AEvent(TypedDict):
|
|
29
|
+
"""Structured event data used by the A2A connector."""
|
|
30
|
+
|
|
31
|
+
event_type: A2AStreamEventType
|
|
32
|
+
content: str
|
|
33
|
+
metadata: dict[str, Any]
|
|
34
|
+
tool_info: dict[str, Any] | None
|
|
35
|
+
is_final: bool
|
|
36
|
+
artifacts: list[dict[str, Any]] | None
|
|
37
|
+
references: list[Any] | None
|
|
38
|
+
step_usage: dict[str, Any] | None
|
|
39
|
+
total_usage: dict[str, Any] | None
|
|
40
|
+
model_usage_delta: dict[str, Any] | None
|
|
41
|
+
model_usage: list[dict[str, Any]] | None
|
|
42
|
+
thinking_and_activity_info: dict[str, Any] | None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ToolCallInfo(TypedDict):
|
|
46
|
+
"""Structured information for tool invocation events."""
|
|
47
|
+
|
|
48
|
+
tool_calls: list[dict[str, Any]]
|
|
49
|
+
status: str
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ToolResultInfo(TypedDict):
|
|
53
|
+
"""Structured information for tool completion events."""
|
|
54
|
+
|
|
55
|
+
name: str
|
|
56
|
+
args: dict[str, Any]
|
|
57
|
+
output: str
|
|
58
|
+
execution_time: float | None
|