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.

Files changed (612) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/__init__.pyi +19 -0
  3. aip_agents/a2a/__init__.py +19 -0
  4. aip_agents/a2a/__init__.pyi +3 -0
  5. aip_agents/a2a/server/__init__.py +10 -0
  6. aip_agents/a2a/server/__init__.pyi +4 -0
  7. aip_agents/a2a/server/base_executor.py +1086 -0
  8. aip_agents/a2a/server/base_executor.pyi +73 -0
  9. aip_agents/a2a/server/google_adk_executor.py +198 -0
  10. aip_agents/a2a/server/google_adk_executor.pyi +51 -0
  11. aip_agents/a2a/server/langflow_executor.py +180 -0
  12. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  13. aip_agents/a2a/server/langgraph_executor.py +270 -0
  14. aip_agents/a2a/server/langgraph_executor.pyi +47 -0
  15. aip_agents/a2a/types.py +232 -0
  16. aip_agents/a2a/types.pyi +132 -0
  17. aip_agents/agent/__init__.py +27 -0
  18. aip_agents/agent/__init__.pyi +9 -0
  19. aip_agents/agent/base_agent.py +970 -0
  20. aip_agents/agent/base_agent.pyi +221 -0
  21. aip_agents/agent/base_langgraph_agent.py +3037 -0
  22. aip_agents/agent/base_langgraph_agent.pyi +233 -0
  23. aip_agents/agent/google_adk_agent.py +926 -0
  24. aip_agents/agent/google_adk_agent.pyi +141 -0
  25. aip_agents/agent/google_adk_constants.py +6 -0
  26. aip_agents/agent/google_adk_constants.pyi +3 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/__init__.pyi +6 -0
  29. aip_agents/agent/hitl/config.py +28 -0
  30. aip_agents/agent/hitl/config.pyi +15 -0
  31. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  32. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  33. aip_agents/agent/hitl/manager.py +532 -0
  34. aip_agents/agent/hitl/manager.pyi +200 -0
  35. aip_agents/agent/hitl/models.py +18 -0
  36. aip_agents/agent/hitl/models.pyi +3 -0
  37. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  38. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  39. aip_agents/agent/hitl/prompt/base.py +42 -0
  40. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  41. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  42. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  43. aip_agents/agent/hitl/registry.py +149 -0
  44. aip_agents/agent/hitl/registry.pyi +101 -0
  45. aip_agents/agent/interface.py +138 -0
  46. aip_agents/agent/interface.pyi +81 -0
  47. aip_agents/agent/interfaces.py +65 -0
  48. aip_agents/agent/interfaces.pyi +44 -0
  49. aip_agents/agent/langflow_agent.py +464 -0
  50. aip_agents/agent/langflow_agent.pyi +133 -0
  51. aip_agents/agent/langgraph_memory_enhancer_agent.py +767 -0
  52. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
  53. aip_agents/agent/langgraph_react_agent.py +2856 -0
  54. aip_agents/agent/langgraph_react_agent.pyi +170 -0
  55. aip_agents/agent/system_instruction_context.py +34 -0
  56. aip_agents/agent/system_instruction_context.pyi +13 -0
  57. aip_agents/clients/__init__.py +10 -0
  58. aip_agents/clients/__init__.pyi +4 -0
  59. aip_agents/clients/langflow/__init__.py +10 -0
  60. aip_agents/clients/langflow/__init__.pyi +4 -0
  61. aip_agents/clients/langflow/client.py +477 -0
  62. aip_agents/clients/langflow/client.pyi +140 -0
  63. aip_agents/clients/langflow/types.py +18 -0
  64. aip_agents/clients/langflow/types.pyi +7 -0
  65. aip_agents/constants.py +23 -0
  66. aip_agents/constants.pyi +7 -0
  67. aip_agents/credentials/manager.py +132 -0
  68. aip_agents/examples/__init__.py +5 -0
  69. aip_agents/examples/__init__.pyi +0 -0
  70. aip_agents/examples/compare_streaming_client.py +783 -0
  71. aip_agents/examples/compare_streaming_client.pyi +48 -0
  72. aip_agents/examples/compare_streaming_server.py +142 -0
  73. aip_agents/examples/compare_streaming_server.pyi +18 -0
  74. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
  78. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
  80. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  81. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
  82. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  83. aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
  84. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
  86. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
  88. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  89. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
  90. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  91. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
  92. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  93. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
  94. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  95. aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
  96. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  97. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
  98. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  99. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  100. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  101. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  102. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  103. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
  106. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
  108. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
  110. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
  112. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
  114. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
  118. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
  120. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
  122. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
  124. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  125. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
  126. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  127. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
  128. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  129. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
  130. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  131. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
  132. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  133. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
  134. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  135. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
  136. aip_agents/examples/hello_world_google_adk.py +41 -0
  137. aip_agents/examples/hello_world_google_adk.pyi +5 -0
  138. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  139. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  141. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
  142. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  143. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
  144. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  145. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
  146. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  147. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
  148. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  149. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
  150. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  151. aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
  152. aip_agents/examples/hello_world_langchain.py +28 -0
  153. aip_agents/examples/hello_world_langchain.pyi +5 -0
  154. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  155. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
  156. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  157. aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
  158. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  159. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  160. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  161. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
  162. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  163. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  164. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  165. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
  166. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  167. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
  168. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  169. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
  170. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  171. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
  172. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  173. aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
  174. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  175. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
  176. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  177. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  178. aip_agents/examples/hello_world_langgraph.py +39 -0
  179. aip_agents/examples/hello_world_langgraph.pyi +5 -0
  180. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  181. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
  182. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  183. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
  184. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  185. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
  186. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  187. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
  188. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  189. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
  190. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  191. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
  192. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  193. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
  194. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  195. aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
  196. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  197. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
  198. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  199. aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
  200. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  201. aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
  202. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  203. aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
  204. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  205. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
  206. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  207. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
  208. aip_agents/examples/hello_world_pii_logger.py +21 -0
  209. aip_agents/examples/hello_world_pii_logger.pyi +5 -0
  210. aip_agents/examples/hello_world_ptc.py +49 -0
  211. aip_agents/examples/hello_world_ptc.pyi +5 -0
  212. aip_agents/examples/hello_world_sentry.py +133 -0
  213. aip_agents/examples/hello_world_sentry.pyi +21 -0
  214. aip_agents/examples/hello_world_step_limits.py +273 -0
  215. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  216. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  217. aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
  218. aip_agents/examples/hello_world_tool_output_client.py +55 -0
  219. aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
  220. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  221. aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
  222. aip_agents/examples/hitl_demo.py +724 -0
  223. aip_agents/examples/hitl_demo.pyi +67 -0
  224. aip_agents/examples/mcp_configs/configs.py +63 -0
  225. aip_agents/examples/mcp_servers/common.py +76 -0
  226. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  227. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  228. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  229. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  230. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  231. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  232. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  233. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  234. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  235. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  236. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  237. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  238. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  239. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  240. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  241. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  242. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  243. aip_agents/examples/tools/__init__.py +27 -0
  244. aip_agents/examples/tools/__init__.pyi +9 -0
  245. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  246. aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
  247. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  248. aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
  249. aip_agents/examples/tools/data_generator_tool.py +103 -0
  250. aip_agents/examples/tools/data_generator_tool.pyi +15 -0
  251. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  252. aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
  253. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  254. aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
  255. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  256. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
  257. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  258. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
  259. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  260. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
  261. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  262. aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
  263. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  264. aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
  265. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  266. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  267. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  268. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  269. aip_agents/examples/tools/random_chart_tool.py +142 -0
  270. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  271. aip_agents/examples/tools/serper_tool.py +202 -0
  272. aip_agents/examples/tools/serper_tool.pyi +16 -0
  273. aip_agents/examples/tools/stock_tools.py +82 -0
  274. aip_agents/examples/tools/stock_tools.pyi +36 -0
  275. aip_agents/examples/tools/table_generator_tool.py +167 -0
  276. aip_agents/examples/tools/table_generator_tool.pyi +22 -0
  277. aip_agents/examples/tools/time_tool.py +82 -0
  278. aip_agents/examples/tools/time_tool.pyi +15 -0
  279. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  280. aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
  281. aip_agents/executor/agent_executor.py +473 -0
  282. aip_agents/executor/base.py +48 -0
  283. aip_agents/guardrails/__init__.py +83 -0
  284. aip_agents/guardrails/__init__.pyi +6 -0
  285. aip_agents/guardrails/engines/__init__.py +69 -0
  286. aip_agents/guardrails/engines/__init__.pyi +4 -0
  287. aip_agents/guardrails/engines/base.py +90 -0
  288. aip_agents/guardrails/engines/base.pyi +61 -0
  289. aip_agents/guardrails/engines/nemo.py +101 -0
  290. aip_agents/guardrails/engines/nemo.pyi +46 -0
  291. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  292. aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
  293. aip_agents/guardrails/exceptions.py +39 -0
  294. aip_agents/guardrails/exceptions.pyi +23 -0
  295. aip_agents/guardrails/manager.py +163 -0
  296. aip_agents/guardrails/manager.pyi +42 -0
  297. aip_agents/guardrails/middleware.py +199 -0
  298. aip_agents/guardrails/middleware.pyi +87 -0
  299. aip_agents/guardrails/schemas.py +63 -0
  300. aip_agents/guardrails/schemas.pyi +43 -0
  301. aip_agents/guardrails/utils.py +45 -0
  302. aip_agents/guardrails/utils.pyi +19 -0
  303. aip_agents/mcp/__init__.py +1 -0
  304. aip_agents/mcp/__init__.pyi +0 -0
  305. aip_agents/mcp/client/__init__.py +14 -0
  306. aip_agents/mcp/client/__init__.pyi +5 -0
  307. aip_agents/mcp/client/base_mcp_client.py +369 -0
  308. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  309. aip_agents/mcp/client/connection_manager.py +228 -0
  310. aip_agents/mcp/client/connection_manager.pyi +51 -0
  311. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  312. aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
  313. aip_agents/mcp/client/google_adk/client.py +381 -0
  314. aip_agents/mcp/client/google_adk/client.pyi +75 -0
  315. aip_agents/mcp/client/langchain/__init__.py +11 -0
  316. aip_agents/mcp/client/langchain/__init__.pyi +3 -0
  317. aip_agents/mcp/client/langchain/client.py +265 -0
  318. aip_agents/mcp/client/langchain/client.pyi +48 -0
  319. aip_agents/mcp/client/persistent_session.py +612 -0
  320. aip_agents/mcp/client/persistent_session.pyi +122 -0
  321. aip_agents/mcp/client/session_pool.py +351 -0
  322. aip_agents/mcp/client/session_pool.pyi +101 -0
  323. aip_agents/mcp/client/transports.py +263 -0
  324. aip_agents/mcp/client/transports.pyi +132 -0
  325. aip_agents/mcp/utils/__init__.py +7 -0
  326. aip_agents/mcp/utils/__init__.pyi +0 -0
  327. aip_agents/mcp/utils/config_validator.py +139 -0
  328. aip_agents/mcp/utils/config_validator.pyi +82 -0
  329. aip_agents/memory/__init__.py +14 -0
  330. aip_agents/memory/__init__.pyi +5 -0
  331. aip_agents/memory/adapters/__init__.py +10 -0
  332. aip_agents/memory/adapters/__init__.pyi +4 -0
  333. aip_agents/memory/adapters/base_adapter.py +811 -0
  334. aip_agents/memory/adapters/base_adapter.pyi +176 -0
  335. aip_agents/memory/adapters/mem0.py +84 -0
  336. aip_agents/memory/adapters/mem0.pyi +22 -0
  337. aip_agents/memory/base.py +84 -0
  338. aip_agents/memory/base.pyi +60 -0
  339. aip_agents/memory/constants.py +49 -0
  340. aip_agents/memory/constants.pyi +25 -0
  341. aip_agents/memory/factory.py +86 -0
  342. aip_agents/memory/factory.pyi +24 -0
  343. aip_agents/memory/guidance.py +20 -0
  344. aip_agents/memory/guidance.pyi +3 -0
  345. aip_agents/memory/simple_memory.py +47 -0
  346. aip_agents/memory/simple_memory.pyi +23 -0
  347. aip_agents/middleware/__init__.py +17 -0
  348. aip_agents/middleware/__init__.pyi +5 -0
  349. aip_agents/middleware/base.py +96 -0
  350. aip_agents/middleware/base.pyi +75 -0
  351. aip_agents/middleware/manager.py +150 -0
  352. aip_agents/middleware/manager.pyi +84 -0
  353. aip_agents/middleware/todolist.py +274 -0
  354. aip_agents/middleware/todolist.pyi +125 -0
  355. aip_agents/ptc/__init__.py +48 -0
  356. aip_agents/ptc/__init__.pyi +10 -0
  357. aip_agents/ptc/doc_gen.py +122 -0
  358. aip_agents/ptc/doc_gen.pyi +40 -0
  359. aip_agents/ptc/exceptions.py +39 -0
  360. aip_agents/ptc/exceptions.pyi +22 -0
  361. aip_agents/ptc/executor.py +143 -0
  362. aip_agents/ptc/executor.pyi +73 -0
  363. aip_agents/ptc/mcp/__init__.py +45 -0
  364. aip_agents/ptc/mcp/__init__.pyi +7 -0
  365. aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
  366. aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
  367. aip_agents/ptc/mcp/templates/__init__.py +1 -0
  368. aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
  369. aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
  370. aip_agents/ptc/naming.py +184 -0
  371. aip_agents/ptc/naming.pyi +76 -0
  372. aip_agents/ptc/payload.py +26 -0
  373. aip_agents/ptc/payload.pyi +15 -0
  374. aip_agents/ptc/prompt_builder.py +571 -0
  375. aip_agents/ptc/prompt_builder.pyi +55 -0
  376. aip_agents/ptc/ptc_helper.py +16 -0
  377. aip_agents/ptc/ptc_helper.pyi +1 -0
  378. aip_agents/ptc/sandbox_bridge.py +58 -0
  379. aip_agents/ptc/sandbox_bridge.pyi +25 -0
  380. aip_agents/ptc/template_utils.py +33 -0
  381. aip_agents/ptc/template_utils.pyi +13 -0
  382. aip_agents/ptc/templates/__init__.py +1 -0
  383. aip_agents/ptc/templates/__init__.pyi +0 -0
  384. aip_agents/ptc/templates/ptc_helper.py.template +134 -0
  385. aip_agents/sandbox/__init__.py +43 -0
  386. aip_agents/sandbox/__init__.pyi +5 -0
  387. aip_agents/sandbox/defaults.py +9 -0
  388. aip_agents/sandbox/defaults.pyi +2 -0
  389. aip_agents/sandbox/e2b_runtime.py +267 -0
  390. aip_agents/sandbox/e2b_runtime.pyi +51 -0
  391. aip_agents/sandbox/template_builder.py +131 -0
  392. aip_agents/sandbox/template_builder.pyi +36 -0
  393. aip_agents/sandbox/types.py +24 -0
  394. aip_agents/sandbox/types.pyi +14 -0
  395. aip_agents/sandbox/validation.py +50 -0
  396. aip_agents/sandbox/validation.pyi +20 -0
  397. aip_agents/schema/__init__.py +69 -0
  398. aip_agents/schema/__init__.pyi +9 -0
  399. aip_agents/schema/a2a.py +56 -0
  400. aip_agents/schema/a2a.pyi +40 -0
  401. aip_agents/schema/agent.py +111 -0
  402. aip_agents/schema/agent.pyi +65 -0
  403. aip_agents/schema/hitl.py +157 -0
  404. aip_agents/schema/hitl.pyi +89 -0
  405. aip_agents/schema/langgraph.py +37 -0
  406. aip_agents/schema/langgraph.pyi +28 -0
  407. aip_agents/schema/model_id.py +97 -0
  408. aip_agents/schema/model_id.pyi +54 -0
  409. aip_agents/schema/step_limit.py +108 -0
  410. aip_agents/schema/step_limit.pyi +63 -0
  411. aip_agents/schema/storage.py +40 -0
  412. aip_agents/schema/storage.pyi +21 -0
  413. aip_agents/sentry/__init__.py +11 -0
  414. aip_agents/sentry/__init__.pyi +3 -0
  415. aip_agents/sentry/sentry.py +151 -0
  416. aip_agents/sentry/sentry.pyi +48 -0
  417. aip_agents/storage/__init__.py +41 -0
  418. aip_agents/storage/__init__.pyi +8 -0
  419. aip_agents/storage/base.py +85 -0
  420. aip_agents/storage/base.pyi +58 -0
  421. aip_agents/storage/clients/__init__.py +12 -0
  422. aip_agents/storage/clients/__init__.pyi +3 -0
  423. aip_agents/storage/clients/minio_client.py +318 -0
  424. aip_agents/storage/clients/minio_client.pyi +137 -0
  425. aip_agents/storage/config.py +62 -0
  426. aip_agents/storage/config.pyi +29 -0
  427. aip_agents/storage/providers/__init__.py +15 -0
  428. aip_agents/storage/providers/__init__.pyi +5 -0
  429. aip_agents/storage/providers/base.py +106 -0
  430. aip_agents/storage/providers/base.pyi +88 -0
  431. aip_agents/storage/providers/memory.py +114 -0
  432. aip_agents/storage/providers/memory.pyi +79 -0
  433. aip_agents/storage/providers/object_storage.py +214 -0
  434. aip_agents/storage/providers/object_storage.pyi +98 -0
  435. aip_agents/tools/__init__.py +64 -0
  436. aip_agents/tools/__init__.pyi +11 -0
  437. aip_agents/tools/browser_use/__init__.py +82 -0
  438. aip_agents/tools/browser_use/__init__.pyi +14 -0
  439. aip_agents/tools/browser_use/action_parser.py +103 -0
  440. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  441. aip_agents/tools/browser_use/browser_use_tool.py +1120 -0
  442. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  443. aip_agents/tools/browser_use/llm_config.py +120 -0
  444. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  445. aip_agents/tools/browser_use/minio_storage.py +198 -0
  446. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  447. aip_agents/tools/browser_use/schemas.py +119 -0
  448. aip_agents/tools/browser_use/schemas.pyi +32 -0
  449. aip_agents/tools/browser_use/session.py +76 -0
  450. aip_agents/tools/browser_use/session.pyi +4 -0
  451. aip_agents/tools/browser_use/session_errors.py +132 -0
  452. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  453. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  454. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  455. aip_agents/tools/browser_use/streaming.py +815 -0
  456. aip_agents/tools/browser_use/streaming.pyi +81 -0
  457. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  458. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  459. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  460. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  461. aip_agents/tools/browser_use/types.py +78 -0
  462. aip_agents/tools/browser_use/types.pyi +45 -0
  463. aip_agents/tools/code_sandbox/__init__.py +26 -0
  464. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  465. aip_agents/tools/code_sandbox/constant.py +13 -0
  466. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  467. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
  468. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
  469. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  470. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  471. aip_agents/tools/constants.py +177 -0
  472. aip_agents/tools/constants.pyi +138 -0
  473. aip_agents/tools/date_range_tool.py +554 -0
  474. aip_agents/tools/date_range_tool.pyi +21 -0
  475. aip_agents/tools/document_loader/__init__.py +44 -0
  476. aip_agents/tools/document_loader/__init__.pyi +7 -0
  477. aip_agents/tools/document_loader/base_reader.py +302 -0
  478. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  479. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  480. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  481. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  482. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  483. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  484. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  485. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  486. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  487. aip_agents/tools/execute_ptc_code.py +308 -0
  488. aip_agents/tools/execute_ptc_code.pyi +90 -0
  489. aip_agents/tools/gl_connector/__init__.py +5 -0
  490. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  491. aip_agents/tools/gl_connector/tool.py +383 -0
  492. aip_agents/tools/gl_connector/tool.pyi +74 -0
  493. aip_agents/tools/gl_connector_tools.py +119 -0
  494. aip_agents/tools/gl_connector_tools.pyi +39 -0
  495. aip_agents/tools/memory_search/__init__.py +29 -0
  496. aip_agents/tools/memory_search/__init__.pyi +5 -0
  497. aip_agents/tools/memory_search/base.py +200 -0
  498. aip_agents/tools/memory_search/base.pyi +69 -0
  499. aip_agents/tools/memory_search/mem0.py +365 -0
  500. aip_agents/tools/memory_search/mem0.pyi +29 -0
  501. aip_agents/tools/memory_search/schema.py +81 -0
  502. aip_agents/tools/memory_search/schema.pyi +25 -0
  503. aip_agents/tools/memory_search_tool.py +34 -0
  504. aip_agents/tools/memory_search_tool.pyi +3 -0
  505. aip_agents/tools/time_tool.py +117 -0
  506. aip_agents/tools/time_tool.pyi +16 -0
  507. aip_agents/tools/tool_config_injector.py +300 -0
  508. aip_agents/tools/tool_config_injector.pyi +26 -0
  509. aip_agents/tools/web_search/__init__.py +15 -0
  510. aip_agents/tools/web_search/__init__.pyi +3 -0
  511. aip_agents/tools/web_search/serper_tool.py +187 -0
  512. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  513. aip_agents/types/__init__.py +70 -0
  514. aip_agents/types/__init__.pyi +36 -0
  515. aip_agents/types/a2a_events.py +13 -0
  516. aip_agents/types/a2a_events.pyi +3 -0
  517. aip_agents/utils/__init__.py +79 -0
  518. aip_agents/utils/__init__.pyi +11 -0
  519. aip_agents/utils/a2a_connector.py +1757 -0
  520. aip_agents/utils/a2a_connector.pyi +146 -0
  521. aip_agents/utils/artifact_helpers.py +502 -0
  522. aip_agents/utils/artifact_helpers.pyi +203 -0
  523. aip_agents/utils/constants.py +22 -0
  524. aip_agents/utils/constants.pyi +10 -0
  525. aip_agents/utils/datetime/__init__.py +34 -0
  526. aip_agents/utils/datetime/__init__.pyi +4 -0
  527. aip_agents/utils/datetime/normalization.py +231 -0
  528. aip_agents/utils/datetime/normalization.pyi +95 -0
  529. aip_agents/utils/datetime/timezone.py +206 -0
  530. aip_agents/utils/datetime/timezone.pyi +48 -0
  531. aip_agents/utils/env_loader.py +27 -0
  532. aip_agents/utils/env_loader.pyi +10 -0
  533. aip_agents/utils/event_handler_registry.py +58 -0
  534. aip_agents/utils/event_handler_registry.pyi +23 -0
  535. aip_agents/utils/file_prompt_utils.py +176 -0
  536. aip_agents/utils/file_prompt_utils.pyi +21 -0
  537. aip_agents/utils/final_response_builder.py +211 -0
  538. aip_agents/utils/final_response_builder.pyi +34 -0
  539. aip_agents/utils/formatter_llm_client.py +231 -0
  540. aip_agents/utils/formatter_llm_client.pyi +71 -0
  541. aip_agents/utils/langgraph/__init__.py +19 -0
  542. aip_agents/utils/langgraph/__init__.pyi +3 -0
  543. aip_agents/utils/langgraph/converter.py +128 -0
  544. aip_agents/utils/langgraph/converter.pyi +49 -0
  545. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  546. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  547. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  548. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  549. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  550. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  551. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1096 -0
  552. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  553. aip_agents/utils/langgraph/tool_output_management.py +1047 -0
  554. aip_agents/utils/langgraph/tool_output_management.pyi +329 -0
  555. aip_agents/utils/logger.py +195 -0
  556. aip_agents/utils/logger.pyi +60 -0
  557. aip_agents/utils/metadata/__init__.py +27 -0
  558. aip_agents/utils/metadata/__init__.pyi +5 -0
  559. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  560. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  561. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  562. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  563. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  564. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  565. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  566. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  567. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  568. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  569. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  570. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  571. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  572. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  573. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  574. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  575. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  576. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  577. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  578. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  579. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  580. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  581. aip_agents/utils/metadata_helper.py +358 -0
  582. aip_agents/utils/metadata_helper.pyi +117 -0
  583. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  584. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  585. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  586. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  587. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  588. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  589. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  590. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  591. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  592. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  593. aip_agents/utils/pii/__init__.py +25 -0
  594. aip_agents/utils/pii/__init__.pyi +5 -0
  595. aip_agents/utils/pii/pii_handler.py +397 -0
  596. aip_agents/utils/pii/pii_handler.pyi +96 -0
  597. aip_agents/utils/pii/pii_helper.py +207 -0
  598. aip_agents/utils/pii/pii_helper.pyi +78 -0
  599. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  600. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  601. aip_agents/utils/reference_helper.py +273 -0
  602. aip_agents/utils/reference_helper.pyi +81 -0
  603. aip_agents/utils/sse_chunk_transformer.py +831 -0
  604. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  605. aip_agents/utils/step_limit_manager.py +265 -0
  606. aip_agents/utils/step_limit_manager.pyi +112 -0
  607. aip_agents/utils/token_usage_helper.py +156 -0
  608. aip_agents/utils/token_usage_helper.pyi +60 -0
  609. aip_agents_binary-0.6.4.dist-info/METADATA +673 -0
  610. aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
  611. aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
  612. 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