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,276 @@
|
|
|
1
|
+
"""TodoList middleware for agent planning and task decomposition.
|
|
2
|
+
|
|
3
|
+
Provides a write_todos tool that allows agents to break down complex tasks
|
|
4
|
+
into discrete, trackable steps with status management.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import threading
|
|
8
|
+
from enum import StrEnum
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from langchain_core.runnables import RunnableConfig
|
|
12
|
+
from langchain_core.tools import BaseTool
|
|
13
|
+
from pydantic import BaseModel, Field, SkipValidation
|
|
14
|
+
|
|
15
|
+
from aip_agents.middleware.base import ModelRequest
|
|
16
|
+
from aip_agents.middleware.schema import MiddlewareToolConfig
|
|
17
|
+
from aip_agents.utils.logger import get_logger
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TodoStatus(StrEnum):
|
|
23
|
+
"""Enumeration of possible todo item statuses."""
|
|
24
|
+
|
|
25
|
+
PENDING = "pending"
|
|
26
|
+
IN_PROGRESS = "in_progress"
|
|
27
|
+
COMPLETED = "completed"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
WRITE_TODOS_SYSTEM_PROMPT = """## Task Planning with `write_todos`
|
|
31
|
+
|
|
32
|
+
Use `write_todos` to plan and track complex multi-step objectives (3+ steps, multiple deliverables, or tasks described as "comprehensive"). Skip for trivial single-action requests.
|
|
33
|
+
|
|
34
|
+
**Execution rules:**
|
|
35
|
+
1. Create the plan with `write_todos` BEFORE executing work
|
|
36
|
+
2. Execute ALL tasks autonomously—do NOT pause to ask "should I continue?" or "would you like a preview?"
|
|
37
|
+
3. Revise the plan as needed when new information emerges
|
|
38
|
+
4. Mark tasks completed as you finish them
|
|
39
|
+
5. **CRITICAL: Before your final response, call `write_todos` one last time to mark ALL tasks as `completed`. Never respond to the user while any task is `pending` or `in_progress`.**
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
EMPTY_TODO_REMINDER = (
|
|
43
|
+
"\n\n**Todo List Reminder:** Your todo list is currently empty. "
|
|
44
|
+
"If you are working on tasks that would benefit from a todo list, "
|
|
45
|
+
"use the write_todos tool to create one. This helps track progress "
|
|
46
|
+
"and ensures you don't forget important steps.\n"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class TodoItem(BaseModel):
|
|
51
|
+
"""Represents a single todo item in the agent's plan.
|
|
52
|
+
|
|
53
|
+
Attributes:
|
|
54
|
+
content: Human-readable description of the task.
|
|
55
|
+
active_form: Short imperative phrase for UI display.
|
|
56
|
+
status: Current status of the todo item.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
content: str = Field(description="Description of what needs to be done")
|
|
60
|
+
active_form: str = Field(description="Short active form for display (e.g., 'researching topic')")
|
|
61
|
+
status: TodoStatus = Field(default=TodoStatus.PENDING, description="Current status of this todo")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class TodoList(BaseModel):
|
|
65
|
+
"""Represents a complete todo list for a thread.
|
|
66
|
+
|
|
67
|
+
Attributes:
|
|
68
|
+
items: List of todo items in order.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
items: list[TodoItem] = Field(default_factory=list)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
WRITE_TODOS_TOOL_DESCRIPTION = """Create and manage a structured task list for complex work sessions (3+ steps).
|
|
75
|
+
|
|
76
|
+
## When to Use
|
|
77
|
+
- Multi-step tasks with 3+ distinct steps
|
|
78
|
+
- Requests with multiple deliverables
|
|
79
|
+
- User provides a list of tasks
|
|
80
|
+
- User explicitly requests a todo list
|
|
81
|
+
|
|
82
|
+
## When to Skip
|
|
83
|
+
- Single straightforward action
|
|
84
|
+
- Trivial tasks with no tracking benefit
|
|
85
|
+
|
|
86
|
+
## Task States
|
|
87
|
+
- `pending`: Not started
|
|
88
|
+
- `in_progress`: Currently working
|
|
89
|
+
- `completed`: Fully finished
|
|
90
|
+
|
|
91
|
+
## Workflow
|
|
92
|
+
1. **Plan first**: Call `write_todos` before executing work. Mark first task(s) as `in_progress`.
|
|
93
|
+
2. **Stay autonomous**: Execute all tasks without pausing for user confirmation.
|
|
94
|
+
3. **Adapt the plan**: Add new tasks as discovered, remove irrelevant ones.
|
|
95
|
+
4. **Mark progress**: Update task status as you complete work.
|
|
96
|
+
5. **Final update**: Before responding to user, call `write_todos` to mark ALL remaining tasks `completed`.
|
|
97
|
+
|
|
98
|
+
## CRITICAL: Final Response Rule
|
|
99
|
+
You must NOT respond to the user until EVERY task is marked `completed`. Your final action before responding should be a `write_todos` call that marks the last task(s) complete. If any task remains `pending` or `in_progress`, you are not done—keep working or update the plan."""
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class WriteTodosInput(BaseModel):
|
|
103
|
+
"""Input schema for the write_todos tool."""
|
|
104
|
+
|
|
105
|
+
todos: TodoList = Field(
|
|
106
|
+
...,
|
|
107
|
+
description="List of todo items, each with 'content' and 'activeForm' keys.",
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class WriteTodosTool(BaseTool):
|
|
112
|
+
"""LangChain-compatible tool for managing todo lists via TodoListMiddleware."""
|
|
113
|
+
|
|
114
|
+
name: str = "write_todos_tool"
|
|
115
|
+
description: str = WRITE_TODOS_TOOL_DESCRIPTION
|
|
116
|
+
args_schema: type[BaseModel] = WriteTodosInput
|
|
117
|
+
tool_config_schema: type[BaseModel] = MiddlewareToolConfig
|
|
118
|
+
|
|
119
|
+
# Instance reference to middleware storage (excluded from serialization, skip validation)
|
|
120
|
+
storage: SkipValidation[dict[str, TodoList]] = Field(default_factory=dict, exclude=True)
|
|
121
|
+
storage_lock: SkipValidation[threading.RLock] = Field(default_factory=threading.RLock, exclude=True)
|
|
122
|
+
|
|
123
|
+
def _run(self, todos: TodoList, config: RunnableConfig | None = None) -> str: # type: ignore[override]
|
|
124
|
+
"""Synchronous entrypoint used by generic tool runners.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
todos: The todo list to write.
|
|
128
|
+
config: Optional configuration for the tool run.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
str: A success message indicating the number of todo items written.
|
|
132
|
+
"""
|
|
133
|
+
tid = "default"
|
|
134
|
+
if config and "configurable" in config:
|
|
135
|
+
tid = config["configurable"].get("thread_id", "default")
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
# Store in thread-safe manner
|
|
139
|
+
with self.storage_lock:
|
|
140
|
+
self.storage[tid] = todos
|
|
141
|
+
|
|
142
|
+
return f"Successfully wrote {len(todos.items)} todo items to your plan."
|
|
143
|
+
except Exception as e: # pragma: no cover - defensive
|
|
144
|
+
return f"Error writing todos: {str(e)}"
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class TodoListMiddleware:
|
|
148
|
+
"""Middleware that provides planning capabilities via todo list management.
|
|
149
|
+
|
|
150
|
+
Adds the write_todos tool and enhances the system prompt with planning
|
|
151
|
+
instructions, encouraging agents to break down complex tasks.
|
|
152
|
+
|
|
153
|
+
This middleware maintains thread-isolated todo lists, ensuring that
|
|
154
|
+
different conversation threads don't interfere with each other.
|
|
155
|
+
|
|
156
|
+
Each middleware instance has its own storage, preventing race conditions
|
|
157
|
+
when multiple agent instances are used concurrently.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
def __init__(self) -> None:
|
|
161
|
+
"""Initialize the TodoList middleware with planning tools and instructions."""
|
|
162
|
+
# Instance-level storage to prevent race conditions across agent instances
|
|
163
|
+
self._storage: dict[str, TodoList] = {}
|
|
164
|
+
self._storage_lock = threading.RLock()
|
|
165
|
+
|
|
166
|
+
# Create tool with reference to this instance's storage
|
|
167
|
+
self.tools = [WriteTodosTool(storage=self._storage, storage_lock=self._storage_lock)]
|
|
168
|
+
self.system_prompt_additions = WRITE_TODOS_SYSTEM_PROMPT
|
|
169
|
+
|
|
170
|
+
def before_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
171
|
+
"""Hook executed before model invocation.
|
|
172
|
+
|
|
173
|
+
Syncs todos FROM state TO internal storage for LangGraph agents.
|
|
174
|
+
This allows todos to be persisted via LangGraph checkpointer.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
state: Current agent state (may contain 'todos' key).
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Empty dict (no state updates needed).
|
|
181
|
+
"""
|
|
182
|
+
# Sync from LangGraph state to internal storage (if state has todos)
|
|
183
|
+
if "todos" in state and state["todos"] is not None:
|
|
184
|
+
thread_id = state.get("thread_id", "default")
|
|
185
|
+
|
|
186
|
+
# Deep copy to prevent mutation issues between state and storage
|
|
187
|
+
with self._storage_lock:
|
|
188
|
+
self._storage[thread_id] = state["todos"].model_copy(deep=True)
|
|
189
|
+
|
|
190
|
+
return {}
|
|
191
|
+
|
|
192
|
+
def modify_model_request(self, request: ModelRequest, state: dict[str, Any]) -> ModelRequest:
|
|
193
|
+
"""Hook to modify model request before invocation.
|
|
194
|
+
|
|
195
|
+
Injects current todo list status into the system prompt, ensuring
|
|
196
|
+
the agent has visibility into its current plan on every turn.
|
|
197
|
+
This follows Claude Code's pattern of injecting system reminders.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
request: The model request.
|
|
201
|
+
state: Current agent state.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
Modified request with todo status injected into system prompt.
|
|
205
|
+
"""
|
|
206
|
+
thread_id = state.get("thread_id", "default")
|
|
207
|
+
|
|
208
|
+
# Get current todos from storage
|
|
209
|
+
with self._storage_lock:
|
|
210
|
+
current_todos = self._storage.get(thread_id)
|
|
211
|
+
|
|
212
|
+
# Inject todo status into system prompt
|
|
213
|
+
if current_todos and current_todos.items:
|
|
214
|
+
# Build todo status reminder
|
|
215
|
+
todo_reminder = "\n\n## Current Todo List Status\n\n"
|
|
216
|
+
todo_reminder += "Your current todo list:\n"
|
|
217
|
+
|
|
218
|
+
for item in current_todos.items:
|
|
219
|
+
todo_reminder += f"[{item.status.value.upper()}] {item.content}\n"
|
|
220
|
+
|
|
221
|
+
todo_reminder += "\n**Remember to update the todo list as you complete tasks using write_todos.**\n"
|
|
222
|
+
|
|
223
|
+
# Append to system prompt
|
|
224
|
+
current_system_prompt = request.get("system_prompt", "")
|
|
225
|
+
request["system_prompt"] = current_system_prompt + todo_reminder
|
|
226
|
+
else:
|
|
227
|
+
# Static reminder when no todos exist
|
|
228
|
+
current_system_prompt = request.get("system_prompt", "")
|
|
229
|
+
request["system_prompt"] = current_system_prompt + EMPTY_TODO_REMINDER
|
|
230
|
+
|
|
231
|
+
return request
|
|
232
|
+
|
|
233
|
+
def after_model(self, state: dict[str, Any]) -> dict[str, Any]:
|
|
234
|
+
"""Hook executed after model invocation.
|
|
235
|
+
|
|
236
|
+
Syncs todos FROM internal storage TO state for LangGraph agents.
|
|
237
|
+
This ensures any tool updates are reflected in the checkpointed state.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
state: Current agent state.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
Dict with 'todos' key containing updated TodoList, or empty dict.
|
|
244
|
+
"""
|
|
245
|
+
thread_id = state.get("thread_id", "default")
|
|
246
|
+
|
|
247
|
+
with self._storage_lock:
|
|
248
|
+
if thread_id in self._storage:
|
|
249
|
+
# Deep copy to prevent mutation issues between storage and state
|
|
250
|
+
return {"todos": self._storage[thread_id].model_copy(deep=True)}
|
|
251
|
+
|
|
252
|
+
return {}
|
|
253
|
+
|
|
254
|
+
def get_todos(self, thread_id: str = "default") -> TodoList:
|
|
255
|
+
"""Retrieve the todo list for a specific thread.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
thread_id: Thread identifier. Defaults to "default".
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
TodoList for the thread, or empty list if none exists.
|
|
262
|
+
"""
|
|
263
|
+
with self._storage_lock:
|
|
264
|
+
return self._storage.get(thread_id, TodoList())
|
|
265
|
+
|
|
266
|
+
def clear_todos(self, thread_id: str = "default") -> None:
|
|
267
|
+
"""Clear the todo list for a specific thread.
|
|
268
|
+
|
|
269
|
+
Useful for cleanup between test runs or conversation resets.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
thread_id: Thread identifier. Defaults to "default".
|
|
273
|
+
"""
|
|
274
|
+
with self._storage_lock:
|
|
275
|
+
if thread_id in self._storage:
|
|
276
|
+
del self._storage[thread_id]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Filesystem tools for agent operations.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aip_agents.middleware.tools.edit_file import EditFileTool
|
|
8
|
+
from aip_agents.middleware.tools.grep_file import GrepTool
|
|
9
|
+
from aip_agents.middleware.tools.ls import LsTool
|
|
10
|
+
from aip_agents.middleware.tools.read_file import ReadFileTool
|
|
11
|
+
from aip_agents.middleware.tools.skill_load import SkillLoadTool
|
|
12
|
+
from aip_agents.middleware.tools.skill_resource import SkillResourceTool
|
|
13
|
+
from aip_agents.middleware.tools.write_file import WriteFileTool
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"EditFileTool",
|
|
17
|
+
"GrepTool",
|
|
18
|
+
"LsTool",
|
|
19
|
+
"ReadFileTool",
|
|
20
|
+
"SkillLoadTool",
|
|
21
|
+
"SkillResourceTool",
|
|
22
|
+
"WriteFileTool",
|
|
23
|
+
]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Edit file tool for agents.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Any
|
|
8
|
+
|
|
9
|
+
from langchain_core.tools import BaseTool
|
|
10
|
+
from pydantic import BaseModel, Field, SkipValidation
|
|
11
|
+
|
|
12
|
+
from aip_agents.middleware.schema import MiddlewareToolConfig
|
|
13
|
+
|
|
14
|
+
EDIT_FILE_TOOL_DESCRIPTION = """Performs exact string replacements in files.
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
- You must read the file before editing. This tool will error if you attempt an edit without reading the file first.
|
|
18
|
+
- When editing, preserve the exact indentation (tabs/spaces) from the read output. Never include line number prefixes in old_string or new_string.
|
|
19
|
+
- ALWAYS prefer editing existing files over creating new ones.
|
|
20
|
+
- Only use emojis if the user explicitly requests it."""
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EditFileInput(BaseModel):
|
|
24
|
+
"""Input schema for edit_file tool."""
|
|
25
|
+
|
|
26
|
+
file_path: str = Field(description="Absolute path to the file to edit. Must be absolute, not relative.")
|
|
27
|
+
old_string: str = Field(
|
|
28
|
+
description="The exact text to find and replace. Must be unique in the file unless replace_all is True."
|
|
29
|
+
)
|
|
30
|
+
new_string: str = Field(description="The text to replace old_string with. Must be different from old_string.")
|
|
31
|
+
replace_all: bool = Field(
|
|
32
|
+
default=False,
|
|
33
|
+
description="If True, replace all occurrences of old_string. If False (default), old_string must be unique.",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class EditFileTool(BaseTool):
|
|
38
|
+
"""Tool for performing exact string replacements in existing files."""
|
|
39
|
+
|
|
40
|
+
name: str = "edit_file"
|
|
41
|
+
description: str = EDIT_FILE_TOOL_DESCRIPTION
|
|
42
|
+
args_schema: type[BaseModel] = EditFileInput
|
|
43
|
+
tool_config_schema: type[BaseModel] = MiddlewareToolConfig
|
|
44
|
+
backend: Annotated[Any, SkipValidation()]
|
|
45
|
+
|
|
46
|
+
def _run(
|
|
47
|
+
self,
|
|
48
|
+
file_path: str,
|
|
49
|
+
old_string: str,
|
|
50
|
+
new_string: str,
|
|
51
|
+
replace_all: bool = False,
|
|
52
|
+
) -> str:
|
|
53
|
+
"""Execute the edit operation.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
file_path: Absolute path to the file to edit.
|
|
57
|
+
old_string: Exact text to find.
|
|
58
|
+
new_string: Replacement text.
|
|
59
|
+
replace_all: Whether to replace all occurrences. Defaults to False.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
Success message or error string.
|
|
63
|
+
"""
|
|
64
|
+
try:
|
|
65
|
+
res = self.backend.edit(file_path, old_string, new_string, replace_all=replace_all)
|
|
66
|
+
if not res.success or res.error:
|
|
67
|
+
return res.error or "Error: Edit operation failed"
|
|
68
|
+
return f"Successfully replaced {res.occurrences} instance(s) of the string in '{res.path}'"
|
|
69
|
+
except Exception as e:
|
|
70
|
+
return f"Error editing file '{file_path}': {str(e)}"
|