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,153 @@
|
|
|
1
|
+
"""A2UI data and action models.
|
|
2
|
+
|
|
3
|
+
These models represent the minimal runtime contract for A2UI validation across
|
|
4
|
+
the supported standard-catalog schema versions (v0.8, v0.9) and public
|
|
5
|
+
URL-backed custom catalogs.
|
|
6
|
+
|
|
7
|
+
Authors:
|
|
8
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from datetime import datetime
|
|
14
|
+
from enum import StrEnum
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from a2ui.schema.constants import VERSION_0_9
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
19
|
+
|
|
20
|
+
from aip_agents.a2ui.public_url import validate_public_url_shape
|
|
21
|
+
|
|
22
|
+
ModelConfig = ConfigDict(extra="allow")
|
|
23
|
+
|
|
24
|
+
STANDARD_SCHEMA_VERSION = VERSION_0_9
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class A2UIContentMetadataStatus(StrEnum):
|
|
28
|
+
"""Status of the A2UI content metadata."""
|
|
29
|
+
|
|
30
|
+
VALID = "valid"
|
|
31
|
+
FALLBACK = "fallback"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class A2UIActionStatus(StrEnum):
|
|
35
|
+
"""Status of the A2UI action."""
|
|
36
|
+
|
|
37
|
+
VALID = "valid"
|
|
38
|
+
INVALID = "invalid"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class A2UICatalogConfig(BaseModel):
|
|
42
|
+
"""Public URL-backed catalog configuration with optional example fixtures."""
|
|
43
|
+
|
|
44
|
+
catalog_url: str
|
|
45
|
+
example_urls: list[str] = Field(default_factory=list)
|
|
46
|
+
|
|
47
|
+
model_config = ModelConfig
|
|
48
|
+
|
|
49
|
+
@field_validator("catalog_url")
|
|
50
|
+
@classmethod
|
|
51
|
+
def _validate_catalog_url(cls, value: str) -> str:
|
|
52
|
+
validate_public_url_shape(value)
|
|
53
|
+
return value
|
|
54
|
+
|
|
55
|
+
@field_validator("example_urls")
|
|
56
|
+
@classmethod
|
|
57
|
+
def _validate_example_urls(cls, value: list[str]) -> list[str]:
|
|
58
|
+
for url in value:
|
|
59
|
+
validate_public_url_shape(url)
|
|
60
|
+
return value
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class A2UIContext(BaseModel):
|
|
64
|
+
"""Agent-provided A2UI capability context."""
|
|
65
|
+
|
|
66
|
+
enabled: bool = False
|
|
67
|
+
schema_version: str = STANDARD_SCHEMA_VERSION
|
|
68
|
+
catalog_configs: list[A2UICatalogConfig] = Field(default_factory=list)
|
|
69
|
+
allow_user_actions: bool = True
|
|
70
|
+
fallback_to_text: bool = True
|
|
71
|
+
|
|
72
|
+
model_config = ModelConfig
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class A2UIContentMetadata(BaseModel):
|
|
76
|
+
"""Final-response metadata payload stored in ``metadata.a2ui_content``."""
|
|
77
|
+
|
|
78
|
+
schema_version: str = STANDARD_SCHEMA_VERSION
|
|
79
|
+
messages: list[dict[str, Any]]
|
|
80
|
+
validation: dict[str, Any] | None = None
|
|
81
|
+
|
|
82
|
+
model_config = ModelConfig
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def is_valid(self) -> bool:
|
|
86
|
+
"""Check if the content is valid."""
|
|
87
|
+
return bool(self.validation and self.validation.get("status") == A2UIContentMetadataStatus.VALID)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class A2UIActionContext(BaseModel):
|
|
91
|
+
"""Normalized inbound `userAction` context."""
|
|
92
|
+
|
|
93
|
+
name: str
|
|
94
|
+
surface_id: str
|
|
95
|
+
source_component_id: str
|
|
96
|
+
timestamp: str
|
|
97
|
+
context: dict[str, Any] | None = None
|
|
98
|
+
|
|
99
|
+
model_config = ModelConfig
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def from_normalized_payload(
|
|
103
|
+
cls, name: str, surface_id: str, source_component_id: str, timestamp: str, context: Any
|
|
104
|
+
) -> A2UIActionContext:
|
|
105
|
+
"""Create an action context from a normalized payload."""
|
|
106
|
+
if not isinstance(context, dict):
|
|
107
|
+
context_dict: dict[str, Any] = {}
|
|
108
|
+
else:
|
|
109
|
+
context_dict = context
|
|
110
|
+
|
|
111
|
+
if not timestamp:
|
|
112
|
+
raise ValueError("timestamp is required")
|
|
113
|
+
normalized_timestamp = _normalize_iso_timestamp(timestamp)
|
|
114
|
+
|
|
115
|
+
return cls(
|
|
116
|
+
name=name,
|
|
117
|
+
surface_id=surface_id,
|
|
118
|
+
source_component_id=source_component_id,
|
|
119
|
+
timestamp=normalized_timestamp,
|
|
120
|
+
context=context_dict,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class A2UIActionValidationResult(BaseModel):
|
|
125
|
+
"""Result container for inbound action normalization."""
|
|
126
|
+
|
|
127
|
+
status: A2UIActionStatus = A2UIActionStatus.VALID
|
|
128
|
+
normalized_action: A2UIActionContext | None = None
|
|
129
|
+
errors: list[str] = Field(default_factory=list)
|
|
130
|
+
|
|
131
|
+
model_config = ModelConfig
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _normalize_iso_timestamp(value: str) -> str:
|
|
135
|
+
"""Convert incoming timestamp input into a stable ISO-8601 string."""
|
|
136
|
+
try:
|
|
137
|
+
normalized = datetime.fromisoformat(str(value).replace("Z", "+00:00"))
|
|
138
|
+
return normalized.isoformat()
|
|
139
|
+
except Exception:
|
|
140
|
+
raise ValueError("timestamp must be ISO-8601 parsable")
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
__all__ = [
|
|
144
|
+
"A2UICatalogConfig",
|
|
145
|
+
"A2UIContext",
|
|
146
|
+
"A2UIContentMetadata",
|
|
147
|
+
"A2UIActionContext",
|
|
148
|
+
"A2UIActionValidationResult",
|
|
149
|
+
"A2UIContentMetadataStatus",
|
|
150
|
+
"A2UIActionStatus",
|
|
151
|
+
"STANDARD_SCHEMA_VERSION",
|
|
152
|
+
"_normalize_iso_timestamp",
|
|
153
|
+
]
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""Public HTTP/HTTPS URL validation for A2UI catalog and example endpoints.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import ipaddress
|
|
10
|
+
import socket
|
|
11
|
+
from urllib.parse import urlparse
|
|
12
|
+
|
|
13
|
+
import requests
|
|
14
|
+
|
|
15
|
+
_BLOCKED_HOSTNAMES = frozenset({"localhost", "metadata"})
|
|
16
|
+
|
|
17
|
+
DEFAULT_PUBLIC_URL_FETCH_TIMEOUT_SECONDS = 10.0
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _is_non_public_ip(address: ipaddress.IPv4Address | ipaddress.IPv6Address) -> bool:
|
|
21
|
+
return (
|
|
22
|
+
address.is_private
|
|
23
|
+
or address.is_loopback
|
|
24
|
+
or address.is_link_local
|
|
25
|
+
or address.is_multicast
|
|
26
|
+
or address.is_reserved
|
|
27
|
+
or address.is_unspecified
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _reject_blocked_hostname(hostname: str) -> None:
|
|
32
|
+
normalized = hostname.rstrip(".").lower()
|
|
33
|
+
if normalized in _BLOCKED_HOSTNAMES or normalized.endswith(".localhost") or normalized.endswith(".internal"):
|
|
34
|
+
raise ValueError(f"Non-public URL host is not allowed: {hostname}")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _reject_literal_non_public_ip(hostname: str) -> None:
|
|
38
|
+
normalized = hostname.rstrip(".").lower()
|
|
39
|
+
try:
|
|
40
|
+
ip_address = ipaddress.ip_address(normalized)
|
|
41
|
+
except ValueError:
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
if _is_non_public_ip(ip_address):
|
|
45
|
+
raise ValueError(f"Non-public URL host is not allowed: {hostname}")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _resolve_host_addresses(hostname: str) -> list[ipaddress.IPv4Address | ipaddress.IPv6Address]:
|
|
49
|
+
try:
|
|
50
|
+
addrinfos = socket.getaddrinfo(hostname, None, type=socket.SOCK_STREAM)
|
|
51
|
+
except socket.gaierror as exc:
|
|
52
|
+
raise ValueError(f"Could not resolve URL host: {hostname}") from exc
|
|
53
|
+
|
|
54
|
+
addresses: list[ipaddress.IPv4Address | ipaddress.IPv6Address] = []
|
|
55
|
+
seen: set[str] = set()
|
|
56
|
+
|
|
57
|
+
for _family, _type, _proto, _canonname, sockaddr in addrinfos:
|
|
58
|
+
ip_str = sockaddr[0]
|
|
59
|
+
if ip_str in seen:
|
|
60
|
+
continue
|
|
61
|
+
seen.add(ip_str)
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
addresses.append(ipaddress.ip_address(ip_str))
|
|
65
|
+
except ValueError:
|
|
66
|
+
continue
|
|
67
|
+
|
|
68
|
+
if not addresses:
|
|
69
|
+
raise ValueError(f"Could not resolve URL host: {hostname}")
|
|
70
|
+
|
|
71
|
+
return addresses
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def validate_public_url_shape(url: str) -> None:
|
|
75
|
+
"""Reject invalid URL schemes and obviously non-public host forms without DNS."""
|
|
76
|
+
parsed = urlparse(url)
|
|
77
|
+
if parsed.scheme not in ("http", "https"):
|
|
78
|
+
raise ValueError(f"Unsupported URL scheme: {url}")
|
|
79
|
+
|
|
80
|
+
hostname = parsed.hostname
|
|
81
|
+
if not hostname:
|
|
82
|
+
raise ValueError(f"Invalid URL: {url}")
|
|
83
|
+
|
|
84
|
+
_reject_blocked_hostname(hostname)
|
|
85
|
+
_reject_literal_non_public_ip(hostname)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def validate_public_url(url: str) -> None:
|
|
89
|
+
"""Reject non-public URL schemes and hosts, including DNS-resolved hostnames."""
|
|
90
|
+
validate_public_url_shape(url)
|
|
91
|
+
hostname = urlparse(url).hostname
|
|
92
|
+
if not hostname:
|
|
93
|
+
raise ValueError(f"Invalid URL: {url}")
|
|
94
|
+
|
|
95
|
+
normalized = hostname.rstrip(".").lower()
|
|
96
|
+
try:
|
|
97
|
+
ipaddress.ip_address(normalized)
|
|
98
|
+
except ValueError:
|
|
99
|
+
for resolved in _resolve_host_addresses(normalized):
|
|
100
|
+
if _is_non_public_ip(resolved):
|
|
101
|
+
raise ValueError(f"Non-public URL host is not allowed: {hostname}")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def fetch_public_url(
|
|
105
|
+
url: str,
|
|
106
|
+
*,
|
|
107
|
+
session: requests.Session | None = None,
|
|
108
|
+
timeout: float = DEFAULT_PUBLIC_URL_FETCH_TIMEOUT_SECONDS,
|
|
109
|
+
) -> requests.Response:
|
|
110
|
+
"""Fetch a validated public URL without following redirects."""
|
|
111
|
+
try:
|
|
112
|
+
validate_public_url(url)
|
|
113
|
+
except ValueError as exc:
|
|
114
|
+
raise OSError(f"Invalid public URL {url}: {exc}") from exc
|
|
115
|
+
|
|
116
|
+
http_session = session or requests.Session()
|
|
117
|
+
try:
|
|
118
|
+
response = http_session.get(url, timeout=timeout, allow_redirects=False)
|
|
119
|
+
except requests.RequestException as exc:
|
|
120
|
+
raise OSError(f"Could not fetch public URL {url}: {exc}") from exc
|
|
121
|
+
|
|
122
|
+
if 300 <= response.status_code < 400:
|
|
123
|
+
raise OSError(f"Redirect responses are not allowed for public URL: {url}")
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
response.raise_for_status()
|
|
127
|
+
except requests.RequestException as exc:
|
|
128
|
+
raise OSError(f"Could not fetch public URL {url}: {exc}") from exc
|
|
129
|
+
|
|
130
|
+
return response
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
__all__ = [
|
|
134
|
+
"DEFAULT_PUBLIC_URL_FETCH_TIMEOUT_SECONDS",
|
|
135
|
+
"fetch_public_url",
|
|
136
|
+
"validate_public_url",
|
|
137
|
+
"validate_public_url_shape",
|
|
138
|
+
]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Incremental A2UI markup suppression for token streaming.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Reinhart Linanda (reinhart.linanda@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from a2ui.schema.constants import A2UI_CLOSE_TAG, A2UI_OPEN_TAG
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class A2UIStreamTextFilter:
|
|
13
|
+
"""Strip ``<a2ui-json>`` regions from streamed text chunks.
|
|
14
|
+
|
|
15
|
+
The filter buffers partial open/close tag boundaries across chunks so token
|
|
16
|
+
streaming can stay text-oriented while final-response middleware remains the
|
|
17
|
+
authoritative A2UI validation path.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self) -> None:
|
|
21
|
+
"""Initialize the A2UI stream text filter."""
|
|
22
|
+
self._buffer = ""
|
|
23
|
+
self._inside_a2ui = False
|
|
24
|
+
|
|
25
|
+
def feed(self, chunk: str) -> str:
|
|
26
|
+
"""Return visible text extracted from ``chunk``, suppressing A2UI regions."""
|
|
27
|
+
if not chunk:
|
|
28
|
+
return ""
|
|
29
|
+
|
|
30
|
+
self._buffer += chunk
|
|
31
|
+
visible_parts: list[str] = []
|
|
32
|
+
|
|
33
|
+
while self._buffer:
|
|
34
|
+
if self._inside_a2ui:
|
|
35
|
+
close_index = self._buffer.find(A2UI_CLOSE_TAG)
|
|
36
|
+
if close_index == -1:
|
|
37
|
+
_, self._buffer = _split_partial_tag_suffix(self._buffer, A2UI_CLOSE_TAG)
|
|
38
|
+
break
|
|
39
|
+
|
|
40
|
+
self._buffer = self._buffer[close_index + len(A2UI_CLOSE_TAG) :]
|
|
41
|
+
self._inside_a2ui = False
|
|
42
|
+
continue
|
|
43
|
+
|
|
44
|
+
open_index = self._buffer.find(A2UI_OPEN_TAG)
|
|
45
|
+
if open_index == -1:
|
|
46
|
+
safe_text, self._buffer = _split_partial_tag_suffix(self._buffer, A2UI_OPEN_TAG)
|
|
47
|
+
if safe_text:
|
|
48
|
+
visible_parts.append(safe_text)
|
|
49
|
+
break
|
|
50
|
+
|
|
51
|
+
if open_index > 0:
|
|
52
|
+
visible_parts.append(self._buffer[:open_index])
|
|
53
|
+
|
|
54
|
+
self._buffer = self._buffer[open_index + len(A2UI_OPEN_TAG) :]
|
|
55
|
+
self._inside_a2ui = True
|
|
56
|
+
|
|
57
|
+
return "".join(visible_parts)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _split_partial_tag_suffix(text: str, tag: str) -> tuple[str, str]:
|
|
61
|
+
"""Emit safe prefix text and retain a possible partial tag suffix."""
|
|
62
|
+
max_suffix = len(tag) - 1
|
|
63
|
+
for suffix_len in range(min(len(text), max_suffix), 0, -1):
|
|
64
|
+
suffix = text[-suffix_len:]
|
|
65
|
+
if tag.startswith(suffix):
|
|
66
|
+
return text[:-suffix_len], suffix
|
|
67
|
+
return text, ""
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""This module initializes the agent package.
|
|
2
|
+
|
|
3
|
+
Exposes the core agent classes and interfaces.
|
|
4
|
+
|
|
5
|
+
Author:
|
|
6
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import importlib.util
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
|
+
|
|
14
|
+
from aip_agents.agent.base_agent import BaseAgent
|
|
15
|
+
from aip_agents.agent.google_adk_constants import GOOGLE_ADK_IMPORT_ERROR_MESSAGE
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from aip_agents.agent.google_adk_agent import GoogleADKAgent
|
|
19
|
+
from aip_agents.agent.langflow_agent import LangflowAgent
|
|
20
|
+
from aip_agents.agent.base_langgraph_agent import BaseLangGraphAgent
|
|
21
|
+
from aip_agents.agent.interface import AgentInterface
|
|
22
|
+
from aip_agents.agent.langgraph_react_agent import (
|
|
23
|
+
LangChainAgent,
|
|
24
|
+
LangGraphAgent,
|
|
25
|
+
LangGraphReactAgent,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
"AgentInterface",
|
|
30
|
+
"BaseAgent",
|
|
31
|
+
"BaseLangGraphAgent",
|
|
32
|
+
"LangGraphReactAgent",
|
|
33
|
+
"LangGraphAgent",
|
|
34
|
+
"LangChainAgent",
|
|
35
|
+
"LangflowAgent",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
if importlib.util.find_spec("google.adk") is not None:
|
|
39
|
+
__all__.append("GoogleADKAgent")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def __getattr__(name: str) -> Any:
|
|
43
|
+
"""Lazy import of heavy agent implementations.
|
|
44
|
+
|
|
45
|
+
This avoids importing heavy dependencies (Google ADK, etc.)
|
|
46
|
+
when they are not needed.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
name: Attribute name to import.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
The requested class.
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
AttributeError: If attribute is not found.
|
|
56
|
+
"""
|
|
57
|
+
if name == "GoogleADKAgent":
|
|
58
|
+
try:
|
|
59
|
+
from aip_agents.agent.google_adk_agent import (
|
|
60
|
+
GoogleADKAgent as _GoogleADKAgent,
|
|
61
|
+
)
|
|
62
|
+
except ModuleNotFoundError as e:
|
|
63
|
+
if e.name and e.name.startswith("google"):
|
|
64
|
+
raise ImportError(GOOGLE_ADK_IMPORT_ERROR_MESSAGE) from e
|
|
65
|
+
raise
|
|
66
|
+
|
|
67
|
+
return _GoogleADKAgent
|
|
68
|
+
elif name == "LangflowAgent":
|
|
69
|
+
from aip_agents.agent.langflow_agent import LangflowAgent as _LangflowAgent
|
|
70
|
+
|
|
71
|
+
return _LangflowAgent
|
|
72
|
+
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|