aip-agents-binary 0.6.4__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.
Potentially problematic release.
This version of aip-agents-binary might be problematic. Click here for more details.
- aip_agents/__init__.py +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +3037 -0
- aip_agents/agent/base_langgraph_agent.pyi +233 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +767 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
- aip_agents/agent/langgraph_react_agent.py +2856 -0
- aip_agents/agent/langgraph_react_agent.pyi +170 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -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_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -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_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +228 -0
- aip_agents/mcp/client/connection_manager.pyi +51 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +612 -0
- aip_agents/mcp/client/persistent_session.pyi +122 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +263 -0
- aip_agents/mcp/client/transports.pyi +132 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +811 -0
- aip_agents/memory/adapters/base_adapter.pyi +176 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/ptc/__init__.py +48 -0
- aip_agents/ptc/__init__.pyi +10 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/doc_gen.pyi +40 -0
- aip_agents/ptc/exceptions.py +39 -0
- aip_agents/ptc/exceptions.pyi +22 -0
- aip_agents/ptc/executor.py +143 -0
- aip_agents/ptc/executor.pyi +73 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/__init__.pyi +7 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
- aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
- aip_agents/ptc/naming.py +184 -0
- aip_agents/ptc/naming.pyi +76 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/payload.pyi +15 -0
- aip_agents/ptc/prompt_builder.py +571 -0
- aip_agents/ptc/prompt_builder.pyi +55 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/ptc_helper.pyi +1 -0
- aip_agents/ptc/sandbox_bridge.py +58 -0
- aip_agents/ptc/sandbox_bridge.pyi +25 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/template_utils.pyi +13 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/__init__.pyi +0 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/sandbox/__init__.py +43 -0
- aip_agents/sandbox/__init__.pyi +5 -0
- aip_agents/sandbox/defaults.py +9 -0
- aip_agents/sandbox/defaults.pyi +2 -0
- aip_agents/sandbox/e2b_runtime.py +267 -0
- aip_agents/sandbox/e2b_runtime.pyi +51 -0
- aip_agents/sandbox/template_builder.py +131 -0
- aip_agents/sandbox/template_builder.pyi +36 -0
- aip_agents/sandbox/types.py +24 -0
- aip_agents/sandbox/types.pyi +14 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/sandbox/validation.pyi +20 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +64 -0
- aip_agents/tools/__init__.pyi +11 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1120 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +815 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/date_range_tool.pyi +21 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/execute_ptc_code.py +308 -0
- aip_agents/tools/execute_ptc_code.pyi +90 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +365 -0
- aip_agents/tools/memory_search/mem0.pyi +29 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search/schema.pyi +25 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1096 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +329 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.6.4.dist-info/METADATA +673 -0
- aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
- aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
- aip_agents_binary-0.6.4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
"""PTC Prompt Builder.
|
|
2
|
+
|
|
3
|
+
Generates usage guidance prompts for PTC that help the LLM correctly use
|
|
4
|
+
the execute_ptc_code tool with proper import patterns and parameter naming.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
14
|
+
|
|
15
|
+
from aip_agents.ptc.naming import (
|
|
16
|
+
example_value_from_schema,
|
|
17
|
+
sanitize_function_name,
|
|
18
|
+
sanitize_module_name_with_reserved,
|
|
19
|
+
sanitize_param_name,
|
|
20
|
+
schema_to_params,
|
|
21
|
+
)
|
|
22
|
+
from aip_agents.utils.logger import get_logger
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient
|
|
26
|
+
|
|
27
|
+
logger = get_logger(__name__)
|
|
28
|
+
|
|
29
|
+
# Prompt mode type alias
|
|
30
|
+
PromptMode = Literal["minimal", "index", "full", "auto"]
|
|
31
|
+
|
|
32
|
+
# Markdown constants
|
|
33
|
+
PYTHON_BLOCK_START = "```python"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
class PromptConfig:
|
|
38
|
+
"""Configuration for PTC prompt generation.
|
|
39
|
+
|
|
40
|
+
Attributes:
|
|
41
|
+
mode: Prompt mode - minimal, index, full, or auto.
|
|
42
|
+
auto_threshold: Total tool count threshold for auto mode (default 10).
|
|
43
|
+
include_example: Whether to include example code in prompt.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
mode: PromptMode = "auto"
|
|
47
|
+
auto_threshold: int = 10
|
|
48
|
+
include_example: bool = True
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# Shared PTC usage rules block (DRY: used in both placeholder and full prompts)
|
|
52
|
+
PTC_USAGE_RULES = """## PTC (Programmatic Tool Calling) Usage
|
|
53
|
+
|
|
54
|
+
When using `execute_ptc_code`, follow these rules:
|
|
55
|
+
|
|
56
|
+
1. **Import pattern**: `from tools.<server> import <tool_name>`
|
|
57
|
+
2. **Output**: Only `print()` output is returned to you. Always print results.
|
|
58
|
+
3. **Parameter names**: All parameters are lowercase with underscores.
|
|
59
|
+
- Example: `userId` becomes `userid`, `user-id` becomes `user_id`
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def build_ptc_prompt(
|
|
64
|
+
mcp_client: BaseMCPClient | None = None,
|
|
65
|
+
config: PromptConfig | None = None,
|
|
66
|
+
) -> str:
|
|
67
|
+
"""Build PTC usage guidance prompt from MCP configuration.
|
|
68
|
+
|
|
69
|
+
Generates a short usage block that includes:
|
|
70
|
+
- The import pattern: MCP (`from tools.<server> import <tool>`)
|
|
71
|
+
- Rule: use `print()`; only printed output returns
|
|
72
|
+
- Rule: parameter names are sanitized to lowercase/underscored
|
|
73
|
+
- Prompt mode content (minimal/index/full)
|
|
74
|
+
- Examples based on the resolved prompt mode
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
mcp_client: The MCP client with configured servers.
|
|
78
|
+
config: Prompt configuration. If None, uses default PromptConfig.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
PTC usage guidance prompt string.
|
|
82
|
+
"""
|
|
83
|
+
if config is None:
|
|
84
|
+
config = PromptConfig()
|
|
85
|
+
|
|
86
|
+
# Collect MCP server info (sorted for deterministic output)
|
|
87
|
+
server_infos: list[dict[str, Any]] = []
|
|
88
|
+
if mcp_client and mcp_client.servers:
|
|
89
|
+
for server_name in sorted(mcp_client.servers.keys()):
|
|
90
|
+
tools = _get_server_tools(mcp_client, server_name)
|
|
91
|
+
server_infos.append({"name": server_name, "tools": tools})
|
|
92
|
+
|
|
93
|
+
# Check if we have any tools
|
|
94
|
+
if not server_infos:
|
|
95
|
+
return _build_placeholder_prompt()
|
|
96
|
+
|
|
97
|
+
# Resolve mode and build appropriate prompt
|
|
98
|
+
resolved_mode = _resolve_mode(config, server_infos)
|
|
99
|
+
|
|
100
|
+
if resolved_mode == "minimal":
|
|
101
|
+
return _build_minimal_prompt(server_infos, config.include_example)
|
|
102
|
+
elif resolved_mode == "index":
|
|
103
|
+
return _build_index_prompt(server_infos, config.include_example)
|
|
104
|
+
else: # full
|
|
105
|
+
return _build_full_prompt(server_infos, config.include_example)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _get_server_tools(
|
|
109
|
+
mcp_client: BaseMCPClient,
|
|
110
|
+
server_name: str,
|
|
111
|
+
) -> list[dict[str, Any]]:
|
|
112
|
+
"""Get tool definitions for a server.
|
|
113
|
+
|
|
114
|
+
When tools are not loaded but allowed_tools exists, returns stub tool entries.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
mcp_client: MCP client instance.
|
|
118
|
+
server_name: Name of the server.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
List of tool definitions with name, description, and input_schema.
|
|
122
|
+
Stubs have empty description and minimal schema when tools not loaded.
|
|
123
|
+
"""
|
|
124
|
+
tools: list[dict[str, Any]] = []
|
|
125
|
+
allowed_tools: list[str] | None = None
|
|
126
|
+
raw_tools: list[Any] = []
|
|
127
|
+
try:
|
|
128
|
+
# Try to get cached tools from session pool
|
|
129
|
+
session = mcp_client.session_pool.get_session(server_name)
|
|
130
|
+
allowed_tools = session.allowed_tools if session.allowed_tools else None
|
|
131
|
+
|
|
132
|
+
# Get tools from session (public attribute on PersistentMCPSession)
|
|
133
|
+
raw_tools = list(getattr(session, "tools", []))
|
|
134
|
+
except (KeyError, AttributeError) as e:
|
|
135
|
+
logger.debug(f"Could not get tools for server '{server_name}': {e}")
|
|
136
|
+
|
|
137
|
+
if allowed_tools is None:
|
|
138
|
+
allowed_tools = _get_allowed_tools_from_config(mcp_client, server_name)
|
|
139
|
+
|
|
140
|
+
if not raw_tools and allowed_tools:
|
|
141
|
+
# Tools not loaded but allowlist exists - return stub entries
|
|
142
|
+
for tool_name in sorted(allowed_tools):
|
|
143
|
+
tools.append(
|
|
144
|
+
{
|
|
145
|
+
"name": tool_name,
|
|
146
|
+
"description": "",
|
|
147
|
+
"input_schema": {"type": "object", "properties": {}},
|
|
148
|
+
"stub": True,
|
|
149
|
+
}
|
|
150
|
+
)
|
|
151
|
+
elif raw_tools:
|
|
152
|
+
# Tools loaded - return actual tool definitions
|
|
153
|
+
for tool in raw_tools:
|
|
154
|
+
if allowed_tools and tool.name not in allowed_tools:
|
|
155
|
+
continue
|
|
156
|
+
tools.append(
|
|
157
|
+
{
|
|
158
|
+
"name": tool.name,
|
|
159
|
+
"description": tool.description or "",
|
|
160
|
+
"input_schema": tool.inputSchema,
|
|
161
|
+
"stub": False,
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
return tools
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _get_allowed_tools_from_config(mcp_client: BaseMCPClient, server_name: str) -> list[str] | None:
|
|
168
|
+
"""Extract allowed_tools from MCP client server config.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
mcp_client: MCP client instance.
|
|
172
|
+
server_name: Server name to look up.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
List of allowed tools or None.
|
|
176
|
+
"""
|
|
177
|
+
if not mcp_client or not mcp_client.servers:
|
|
178
|
+
return None
|
|
179
|
+
|
|
180
|
+
config = mcp_client.servers.get(server_name)
|
|
181
|
+
if not config:
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
raw_allowed = config.get("allowed_tools") if isinstance(config, dict) else getattr(config, "allowed_tools", None)
|
|
185
|
+
if raw_allowed and isinstance(raw_allowed, list):
|
|
186
|
+
return list(raw_allowed)
|
|
187
|
+
return None
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _count_total_tools(
|
|
191
|
+
server_infos: list[dict[str, Any]],
|
|
192
|
+
) -> int:
|
|
193
|
+
"""Count total tools across all servers.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
server_infos: List of server info dicts with name and tools.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Total tool count.
|
|
200
|
+
"""
|
|
201
|
+
return sum(len(info.get("tools", [])) for info in server_infos)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _resolve_mode(
|
|
205
|
+
config: PromptConfig,
|
|
206
|
+
server_infos: list[dict[str, Any]],
|
|
207
|
+
) -> PromptMode:
|
|
208
|
+
"""Resolve auto mode to concrete mode based on tool count.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
config: Prompt configuration.
|
|
212
|
+
server_infos: List of server info dicts.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Resolved mode (minimal, index, or full).
|
|
216
|
+
"""
|
|
217
|
+
if config.mode != "auto":
|
|
218
|
+
return config.mode
|
|
219
|
+
|
|
220
|
+
total_tools = _count_total_tools(server_infos)
|
|
221
|
+
if total_tools == 0 or total_tools > config.auto_threshold:
|
|
222
|
+
return "minimal"
|
|
223
|
+
return "full"
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def _build_discovery_example() -> str:
|
|
227
|
+
"""Build discovery example using ptc_helper module.
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
Discovery example code string.
|
|
231
|
+
"""
|
|
232
|
+
return """from tools.ptc_helper import list_tools, describe_tool
|
|
233
|
+
|
|
234
|
+
# List available tools in a package
|
|
235
|
+
tools = list_tools("package_name")
|
|
236
|
+
print([tool["name"] for tool in tools])
|
|
237
|
+
|
|
238
|
+
# Get details for a specific tool
|
|
239
|
+
doc = describe_tool("package_name", tools[0]["name"])
|
|
240
|
+
print(doc["doc"])"""
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def _build_minimal_prompt(
|
|
244
|
+
server_infos: list[dict[str, Any]],
|
|
245
|
+
include_example: bool,
|
|
246
|
+
) -> str:
|
|
247
|
+
"""Build minimal prompt with rules and package list only.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
server_infos: List of server info dicts with name and tools.
|
|
251
|
+
include_example: Whether to include discovery example.
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
Minimal PTC usage prompt.
|
|
255
|
+
"""
|
|
256
|
+
lines = [
|
|
257
|
+
PTC_USAGE_RULES.rstrip(),
|
|
258
|
+
"",
|
|
259
|
+
"### Available Packages",
|
|
260
|
+
"",
|
|
261
|
+
]
|
|
262
|
+
|
|
263
|
+
# List MCP packages (sorted reserved-safe sanitized names)
|
|
264
|
+
package_names = sorted(sanitize_module_name_with_reserved(info["name"]) for info in server_infos)
|
|
265
|
+
for pkg in package_names:
|
|
266
|
+
lines.append(f"- `tools.{pkg}`")
|
|
267
|
+
|
|
268
|
+
lines.append("")
|
|
269
|
+
lines.append("Use `tools.ptc_helper` to discover available tools and their signatures.")
|
|
270
|
+
|
|
271
|
+
if include_example:
|
|
272
|
+
lines.extend(
|
|
273
|
+
[
|
|
274
|
+
"",
|
|
275
|
+
"### Discovery Example",
|
|
276
|
+
"",
|
|
277
|
+
PYTHON_BLOCK_START,
|
|
278
|
+
_build_discovery_example(),
|
|
279
|
+
"```",
|
|
280
|
+
]
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
return "\n".join(lines)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def _build_index_prompt(
|
|
287
|
+
server_infos: list[dict[str, Any]],
|
|
288
|
+
include_example: bool,
|
|
289
|
+
) -> str:
|
|
290
|
+
"""Build index prompt with rules, package list, and tool names.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
server_infos: List of server info dicts with name and tools.
|
|
294
|
+
include_example: Whether to include discovery example.
|
|
295
|
+
|
|
296
|
+
Returns:
|
|
297
|
+
Index PTC usage prompt.
|
|
298
|
+
"""
|
|
299
|
+
lines = [
|
|
300
|
+
PTC_USAGE_RULES.rstrip(),
|
|
301
|
+
"",
|
|
302
|
+
"### Available Tools",
|
|
303
|
+
"",
|
|
304
|
+
]
|
|
305
|
+
|
|
306
|
+
# Sort server infos by reserved-safe sanitized name for deterministic output
|
|
307
|
+
sorted_infos = sorted(server_infos, key=lambda x: sanitize_module_name_with_reserved(x["name"]))
|
|
308
|
+
|
|
309
|
+
for server_info in sorted_infos:
|
|
310
|
+
safe_server = sanitize_module_name_with_reserved(server_info["name"])
|
|
311
|
+
lines.append(f"**`tools.{safe_server}`**")
|
|
312
|
+
|
|
313
|
+
# Sort tools by sanitized name
|
|
314
|
+
sorted_tools = sorted(server_info["tools"], key=lambda t: sanitize_function_name(t["name"]))
|
|
315
|
+
tool_names = [sanitize_function_name(t["name"]) for t in sorted_tools]
|
|
316
|
+
lines.append(f" Tools: {', '.join(tool_names)}")
|
|
317
|
+
lines.append("")
|
|
318
|
+
|
|
319
|
+
lines.append("Use `tools.ptc_helper` to get tool signatures and descriptions.")
|
|
320
|
+
|
|
321
|
+
if include_example:
|
|
322
|
+
lines.extend(
|
|
323
|
+
[
|
|
324
|
+
"",
|
|
325
|
+
"### Discovery Example",
|
|
326
|
+
"",
|
|
327
|
+
PYTHON_BLOCK_START,
|
|
328
|
+
_build_discovery_example(),
|
|
329
|
+
"```",
|
|
330
|
+
]
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
return "\n".join(lines)
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def _build_full_prompt(
|
|
337
|
+
server_infos: list[dict[str, Any]],
|
|
338
|
+
include_example: bool,
|
|
339
|
+
) -> str:
|
|
340
|
+
"""Build full prompt with rules, signatures, and descriptions.
|
|
341
|
+
|
|
342
|
+
Args:
|
|
343
|
+
server_infos: List of server info dicts with name and tools.
|
|
344
|
+
include_example: Whether to include real tool example.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
Full PTC usage prompt.
|
|
348
|
+
"""
|
|
349
|
+
lines = [
|
|
350
|
+
PTC_USAGE_RULES.rstrip(),
|
|
351
|
+
"",
|
|
352
|
+
"### Available Tools",
|
|
353
|
+
"",
|
|
354
|
+
]
|
|
355
|
+
|
|
356
|
+
# Sort server infos by reserved-safe sanitized name for deterministic output
|
|
357
|
+
sorted_infos = sorted(server_infos, key=lambda x: sanitize_module_name_with_reserved(x["name"]))
|
|
358
|
+
|
|
359
|
+
for server_info in sorted_infos:
|
|
360
|
+
safe_server = sanitize_module_name_with_reserved(server_info["name"])
|
|
361
|
+
lines.append(f"**Server: `{safe_server}`** (from `tools.{safe_server}`)")
|
|
362
|
+
lines.append("")
|
|
363
|
+
|
|
364
|
+
# Sort tools by sanitized name
|
|
365
|
+
sorted_tools = sorted(server_info["tools"], key=lambda t: sanitize_function_name(t["name"]))
|
|
366
|
+
|
|
367
|
+
for tool in sorted_tools:
|
|
368
|
+
func_name = sanitize_function_name(tool["name"])
|
|
369
|
+
schema = tool.get("input_schema", {})
|
|
370
|
+
params = schema_to_params(schema)
|
|
371
|
+
raw_desc = tool.get("description", "")
|
|
372
|
+
desc = raw_desc[:120]
|
|
373
|
+
if raw_desc and len(raw_desc) > 120:
|
|
374
|
+
desc += "..."
|
|
375
|
+
|
|
376
|
+
lines.append(f"- `{func_name}({params})`: {desc}")
|
|
377
|
+
|
|
378
|
+
lines.append("")
|
|
379
|
+
|
|
380
|
+
if include_example:
|
|
381
|
+
example = _build_example(server_infos)
|
|
382
|
+
lines.extend(
|
|
383
|
+
[
|
|
384
|
+
"### Example",
|
|
385
|
+
"",
|
|
386
|
+
PYTHON_BLOCK_START,
|
|
387
|
+
example,
|
|
388
|
+
"```",
|
|
389
|
+
]
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
return "\n".join(lines)
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def _build_prompt_from_servers(server_infos: list[dict[str, Any]]) -> str:
|
|
396
|
+
"""Build prompt from collected server information (legacy, uses full mode).
|
|
397
|
+
|
|
398
|
+
Args:
|
|
399
|
+
server_infos: List of server info dicts with name and tools.
|
|
400
|
+
|
|
401
|
+
Returns:
|
|
402
|
+
Formatted PTC usage prompt.
|
|
403
|
+
"""
|
|
404
|
+
return _build_full_prompt(server_infos, include_example=True)
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
def _build_example(
|
|
408
|
+
server_infos: list[dict[str, Any]],
|
|
409
|
+
) -> str:
|
|
410
|
+
"""Build an example code snippet using the first available tool.
|
|
411
|
+
|
|
412
|
+
Args:
|
|
413
|
+
server_infos: List of server info dicts.
|
|
414
|
+
|
|
415
|
+
Returns:
|
|
416
|
+
Example code string.
|
|
417
|
+
"""
|
|
418
|
+
if server_infos:
|
|
419
|
+
sorted_servers = sorted(server_infos, key=lambda info: sanitize_module_name_with_reserved(info["name"]))
|
|
420
|
+
for server in sorted_servers:
|
|
421
|
+
tools = server.get("tools", [])
|
|
422
|
+
if tools:
|
|
423
|
+
sorted_tools = sorted(tools, key=lambda t: sanitize_function_name(t["name"]))
|
|
424
|
+
tool = sorted_tools[0]
|
|
425
|
+
safe_server = sanitize_module_name_with_reserved(server["name"])
|
|
426
|
+
func_name = sanitize_function_name(tool["name"])
|
|
427
|
+
args_str = _build_example_args_from_schema(tool.get("input_schema", {}))
|
|
428
|
+
return f"""from tools.{safe_server} import {func_name}
|
|
429
|
+
|
|
430
|
+
result = {func_name}({args_str})
|
|
431
|
+
print(result)"""
|
|
432
|
+
|
|
433
|
+
return _build_generic_example()
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def _build_example_args_from_schema(schema: dict[str, Any]) -> str:
|
|
437
|
+
"""Build example arguments string from a JSON schema.
|
|
438
|
+
|
|
439
|
+
Args:
|
|
440
|
+
schema: JSON schema for tool input.
|
|
441
|
+
|
|
442
|
+
Returns:
|
|
443
|
+
Example arguments string.
|
|
444
|
+
"""
|
|
445
|
+
properties = schema.get("properties", {})
|
|
446
|
+
required = set(schema.get("required", []))
|
|
447
|
+
|
|
448
|
+
args: list[str] = []
|
|
449
|
+
for prop_name in sorted(required):
|
|
450
|
+
if prop_name not in properties:
|
|
451
|
+
continue
|
|
452
|
+
safe_name = sanitize_param_name(prop_name)
|
|
453
|
+
prop_schema = properties[prop_name]
|
|
454
|
+
example_value = _get_example_value(prop_schema, prop_name)
|
|
455
|
+
args.append(f"{safe_name}={example_value}")
|
|
456
|
+
|
|
457
|
+
for prop_name in sorted(properties.keys()):
|
|
458
|
+
if prop_name in required:
|
|
459
|
+
continue
|
|
460
|
+
if len(args) >= 2:
|
|
461
|
+
break
|
|
462
|
+
safe_name = sanitize_param_name(prop_name)
|
|
463
|
+
prop_schema = properties[prop_name]
|
|
464
|
+
example_value = _get_example_value(prop_schema, prop_name)
|
|
465
|
+
args.append(f"{safe_name}={example_value}")
|
|
466
|
+
|
|
467
|
+
return ", ".join(args) if args else ""
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def _get_example_value(prop_schema: dict[str, Any], prop_name: str) -> str:
|
|
471
|
+
"""Generate an example value for a parameter.
|
|
472
|
+
|
|
473
|
+
Prefers schema-provided examples, defaults, or enums.
|
|
474
|
+
Falls back to type-based placeholders.
|
|
475
|
+
|
|
476
|
+
Args:
|
|
477
|
+
prop_schema: Property schema from JSON schema.
|
|
478
|
+
prop_name: Original property name.
|
|
479
|
+
|
|
480
|
+
Returns:
|
|
481
|
+
Example value as a Python literal string.
|
|
482
|
+
"""
|
|
483
|
+
return example_value_from_schema(prop_schema)
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def _build_generic_example() -> str:
|
|
487
|
+
"""Build a generic example when no tools are available.
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
Generic example code string.
|
|
491
|
+
"""
|
|
492
|
+
return """from tools.server_name import tool_name
|
|
493
|
+
|
|
494
|
+
result = tool_name(param="value")
|
|
495
|
+
print(result)"""
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def _build_placeholder_prompt() -> str:
|
|
499
|
+
"""Build a placeholder prompt when no MCP servers are configured.
|
|
500
|
+
|
|
501
|
+
Returns:
|
|
502
|
+
Placeholder PTC usage prompt.
|
|
503
|
+
"""
|
|
504
|
+
return PTC_USAGE_RULES + "\n*No MCP servers configured yet. Tools will be available after MCP setup.*\n"
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
def _build_server_hash_part(mcp_client: BaseMCPClient, server_name: str) -> str:
|
|
508
|
+
"""Build hash part for a single MCP server.
|
|
509
|
+
|
|
510
|
+
Args:
|
|
511
|
+
mcp_client: MCP client instance.
|
|
512
|
+
server_name: Name of the server.
|
|
513
|
+
|
|
514
|
+
Returns:
|
|
515
|
+
Hash part string for the server.
|
|
516
|
+
"""
|
|
517
|
+
try:
|
|
518
|
+
session = mcp_client.session_pool.get_session(server_name)
|
|
519
|
+
tools = list(getattr(session, "tools", []))
|
|
520
|
+
tool_names = sorted(t.name for t in tools)
|
|
521
|
+
|
|
522
|
+
allowed = session.allowed_tools if hasattr(session, "allowed_tools") else None
|
|
523
|
+
if not allowed:
|
|
524
|
+
allowed = _get_allowed_tools_from_config(mcp_client, server_name)
|
|
525
|
+
allowed_str = ",".join(sorted(allowed)) if allowed else "*"
|
|
526
|
+
|
|
527
|
+
return f"{server_name}:{','.join(tool_names)}|allowed={allowed_str}"
|
|
528
|
+
except (KeyError, AttributeError):
|
|
529
|
+
allowed = _get_allowed_tools_from_config(mcp_client, server_name)
|
|
530
|
+
allowed_str = ",".join(sorted(allowed)) if allowed else "*"
|
|
531
|
+
return f"{server_name}:|allowed={allowed_str}"
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def compute_ptc_prompt_hash(
|
|
535
|
+
mcp_client: BaseMCPClient | None = None,
|
|
536
|
+
config: PromptConfig | None = None,
|
|
537
|
+
) -> str:
|
|
538
|
+
"""Compute a hash of the MCP configuration for change detection.
|
|
539
|
+
|
|
540
|
+
Includes PromptConfig fields and allowed_tools in hash computation
|
|
541
|
+
so prompt updates re-sync correctly when configuration changes.
|
|
542
|
+
|
|
543
|
+
Args:
|
|
544
|
+
mcp_client: MCP client instance.
|
|
545
|
+
config: Prompt configuration. If None, uses default PromptConfig.
|
|
546
|
+
|
|
547
|
+
Returns:
|
|
548
|
+
Hash string representing current configuration.
|
|
549
|
+
"""
|
|
550
|
+
import hashlib
|
|
551
|
+
|
|
552
|
+
if config is None:
|
|
553
|
+
config = PromptConfig()
|
|
554
|
+
|
|
555
|
+
# Include config fields in hash
|
|
556
|
+
config_part = f"mode={config.mode}|threshold={config.auto_threshold}|example={config.include_example}"
|
|
557
|
+
|
|
558
|
+
# Create hash from server names, tool names, and allowed_tools
|
|
559
|
+
parts: list[str] = [config_part]
|
|
560
|
+
|
|
561
|
+
# Add MCP server parts
|
|
562
|
+
if mcp_client and mcp_client.servers:
|
|
563
|
+
for server_name in sorted(mcp_client.servers.keys()):
|
|
564
|
+
parts.append(_build_server_hash_part(mcp_client, server_name))
|
|
565
|
+
|
|
566
|
+
# Return empty hash if no tools configured
|
|
567
|
+
if len(parts) == 1:
|
|
568
|
+
return ""
|
|
569
|
+
|
|
570
|
+
content = "|".join(parts)
|
|
571
|
+
return hashlib.sha256(content.encode()).hexdigest()[:16]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient as BaseMCPClient
|
|
3
|
+
from aip_agents.ptc.naming import example_value_from_schema as example_value_from_schema, sanitize_function_name as sanitize_function_name, sanitize_module_name_with_reserved as sanitize_module_name_with_reserved, sanitize_param_name as sanitize_param_name, schema_to_params as schema_to_params
|
|
4
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
PromptMode: Incomplete
|
|
9
|
+
PYTHON_BLOCK_START: str
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class PromptConfig:
|
|
13
|
+
"""Configuration for PTC prompt generation.
|
|
14
|
+
|
|
15
|
+
Attributes:
|
|
16
|
+
mode: Prompt mode - minimal, index, full, or auto.
|
|
17
|
+
auto_threshold: Total tool count threshold for auto mode (default 10).
|
|
18
|
+
include_example: Whether to include example code in prompt.
|
|
19
|
+
"""
|
|
20
|
+
mode: PromptMode = ...
|
|
21
|
+
auto_threshold: int = ...
|
|
22
|
+
include_example: bool = ...
|
|
23
|
+
|
|
24
|
+
PTC_USAGE_RULES: str
|
|
25
|
+
|
|
26
|
+
def build_ptc_prompt(mcp_client: BaseMCPClient | None = None, config: PromptConfig | None = None) -> str:
|
|
27
|
+
"""Build PTC usage guidance prompt from MCP configuration.
|
|
28
|
+
|
|
29
|
+
Generates a short usage block that includes:
|
|
30
|
+
- The import pattern: MCP (`from tools.<server> import <tool>`)
|
|
31
|
+
- Rule: use `print()`; only printed output returns
|
|
32
|
+
- Rule: parameter names are sanitized to lowercase/underscored
|
|
33
|
+
- Prompt mode content (minimal/index/full)
|
|
34
|
+
- Examples based on the resolved prompt mode
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
mcp_client: The MCP client with configured servers.
|
|
38
|
+
config: Prompt configuration. If None, uses default PromptConfig.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
PTC usage guidance prompt string.
|
|
42
|
+
"""
|
|
43
|
+
def compute_ptc_prompt_hash(mcp_client: BaseMCPClient | None = None, config: PromptConfig | None = None) -> str:
|
|
44
|
+
"""Compute a hash of the MCP configuration for change detection.
|
|
45
|
+
|
|
46
|
+
Includes PromptConfig fields and allowed_tools in hash computation
|
|
47
|
+
so prompt updates re-sync correctly when configuration changes.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
mcp_client: MCP client instance.
|
|
51
|
+
config: Prompt configuration. If None, uses default PromptConfig.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Hash string representing current configuration.
|
|
55
|
+
"""
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""PTC helper module generation utilities."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from aip_agents.ptc.template_utils import render_template
|
|
6
|
+
|
|
7
|
+
_TEMPLATE_PACKAGE = "aip_agents.ptc.templates"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _generate_ptc_helper_module() -> str:
|
|
11
|
+
"""Generate the tools/ptc_helper.py discovery module.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
Python source code for the PTC helper module.
|
|
15
|
+
"""
|
|
16
|
+
return render_template(_TEMPLATE_PACKAGE, "ptc_helper.py.template")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from aip_agents.ptc.template_utils import render_template as render_template
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Top-level PTC Sandbox Bridge (MCP-only).
|
|
2
|
+
|
|
3
|
+
This module provides the unified entry point for building sandbox payloads
|
|
4
|
+
for MCP tools.
|
|
5
|
+
|
|
6
|
+
Authors:
|
|
7
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient
|
|
13
|
+
from aip_agents.ptc.mcp.sandbox_bridge import build_mcp_payload
|
|
14
|
+
from aip_agents.ptc.payload import SandboxPayload
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def build_sandbox_payload(
|
|
18
|
+
mcp_client: BaseMCPClient | None = None,
|
|
19
|
+
default_tool_timeout: float = 60.0,
|
|
20
|
+
) -> SandboxPayload:
|
|
21
|
+
"""Build sandbox payload from MCP client configuration (MCP-only).
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
mcp_client: The MCP client with configured servers.
|
|
25
|
+
default_tool_timeout: Default timeout for tool calls in seconds.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
SandboxPayload containing files and env vars for the sandbox.
|
|
29
|
+
"""
|
|
30
|
+
# Build MCP payload
|
|
31
|
+
if mcp_client:
|
|
32
|
+
return await build_mcp_payload(mcp_client, default_tool_timeout)
|
|
33
|
+
return SandboxPayload()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def wrap_ptc_code(code: str) -> str:
|
|
37
|
+
"""Wrap user PTC code with necessary imports and setup (MCP-only).
|
|
38
|
+
|
|
39
|
+
This prepends sys.path setup to ensure the tools package is importable.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
code: User-provided Python code.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Wrapped code ready for sandbox execution.
|
|
46
|
+
"""
|
|
47
|
+
preamble = """# PTC Code Wrapper - Auto-generated
|
|
48
|
+
import sys
|
|
49
|
+
import os
|
|
50
|
+
|
|
51
|
+
# Add tools package to path
|
|
52
|
+
_tools_dir = os.path.dirname(os.path.abspath(__file__)) if "__file__" in dir() else os.getcwd()
|
|
53
|
+
if _tools_dir not in sys.path:
|
|
54
|
+
sys.path.insert(0, _tools_dir)
|
|
55
|
+
|
|
56
|
+
# User code below
|
|
57
|
+
"""
|
|
58
|
+
return preamble + code
|