aip-agents-binary 0.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. aip_agents/__init__.py +66 -0
  2. aip_agents/a2a/__init__.py +19 -0
  3. aip_agents/a2a/server/__init__.py +10 -0
  4. aip_agents/a2a/server/base_executor.py +1125 -0
  5. aip_agents/a2a/server/google_adk_executor.py +198 -0
  6. aip_agents/a2a/server/langflow_executor.py +180 -0
  7. aip_agents/a2a/server/langgraph_executor.py +270 -0
  8. aip_agents/a2a/types.py +232 -0
  9. aip_agents/a2ui/__init__.py +26 -0
  10. aip_agents/a2ui/catalog_provider.py +109 -0
  11. aip_agents/a2ui/examples/0.8/booking_form.json +1 -0
  12. aip_agents/a2ui/examples/0.8/confirmation.json +1 -0
  13. aip_agents/a2ui/examples/0.8/single_column_list.json +1 -0
  14. aip_agents/a2ui/examples/0.9/booking_form.json +1 -0
  15. aip_agents/a2ui/examples/0.9/confirmation.json +1 -0
  16. aip_agents/a2ui/examples/0.9/single_column_list.json +1 -0
  17. aip_agents/a2ui/middleware.py +754 -0
  18. aip_agents/a2ui/models.py +153 -0
  19. aip_agents/a2ui/public_url.py +138 -0
  20. aip_agents/a2ui/stream_filter.py +67 -0
  21. aip_agents/agent/__init__.py +72 -0
  22. aip_agents/agent/base_agent.py +1437 -0
  23. aip_agents/agent/base_langgraph_agent.py +4048 -0
  24. aip_agents/agent/google_adk_agent.py +932 -0
  25. aip_agents/agent/google_adk_constants.py +11 -0
  26. aip_agents/agent/graph_runtime.py +185 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/config.py +28 -0
  29. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  30. aip_agents/agent/hitl/manager.py +532 -0
  31. aip_agents/agent/hitl/models.py +18 -0
  32. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  33. aip_agents/agent/hitl/prompt/base.py +42 -0
  34. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  35. aip_agents/agent/hitl/registry.py +149 -0
  36. aip_agents/agent/interface.py +138 -0
  37. aip_agents/agent/interfaces.py +65 -0
  38. aip_agents/agent/langflow_agent.py +464 -0
  39. aip_agents/agent/langgraph_react_agent.py +3741 -0
  40. aip_agents/agent/model_invocation_adapter.py +346 -0
  41. aip_agents/agent/system_instruction_context.py +34 -0
  42. aip_agents/agent/tool_execution_engine.py +587 -0
  43. aip_agents/audio_interface/__init__.py +30 -0
  44. aip_agents/audio_interface/audio_agent_adapter.py +254 -0
  45. aip_agents/audio_interface/config.py +146 -0
  46. aip_agents/audio_interface/errors.py +15 -0
  47. aip_agents/audio_interface/livekit_audio_session.py +504 -0
  48. aip_agents/audio_interface/livekit_realtime_audio_session.py +142 -0
  49. aip_agents/audio_interface/session_factory.py +40 -0
  50. aip_agents/clients/__init__.py +10 -0
  51. aip_agents/clients/langflow/__init__.py +10 -0
  52. aip_agents/clients/langflow/client.py +477 -0
  53. aip_agents/clients/langflow/types.py +18 -0
  54. aip_agents/common/__init__.py +5 -0
  55. aip_agents/common/callable_introspection.py +17 -0
  56. aip_agents/constants.py +23 -0
  57. aip_agents/context/__init__.py +5 -0
  58. aip_agents/context/budget.py +237 -0
  59. aip_agents/context/compaction.py +339 -0
  60. aip_agents/context/metadata.py +169 -0
  61. aip_agents/context/offload.py +449 -0
  62. aip_agents/context/preparation.py +196 -0
  63. aip_agents/context/prompt.py +61 -0
  64. aip_agents/context/runtime.py +149 -0
  65. aip_agents/context/session_recall.py +69 -0
  66. aip_agents/context/state.py +48 -0
  67. aip_agents/context/utils.py +44 -0
  68. aip_agents/credentials/manager.py +132 -0
  69. aip_agents/examples/__init__.py +5 -0
  70. aip_agents/examples/audio_livekit_session.py +116 -0
  71. aip_agents/examples/compare_streaming_client.py +783 -0
  72. aip_agents/examples/compare_streaming_server.py +141 -0
  73. aip_agents/examples/gl_connectors_smoke.py +148 -0
  74. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_server.py +78 -0
  78. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  79. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  80. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  81. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  82. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  83. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +104 -0
  84. aip_agents/examples/hello_world_a2a_langchain_server.py +78 -0
  85. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +77 -0
  86. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  87. aip_agents/examples/hello_world_a2a_langflow_server.py +80 -0
  88. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  89. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  90. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +91 -0
  91. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  92. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  93. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  94. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  95. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  96. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  97. aip_agents/examples/hello_world_a2a_langgraph_server.py +83 -0
  98. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +78 -0
  99. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +131 -0
  100. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  101. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  102. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +250 -0
  103. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  104. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +79 -0
  105. aip_agents/examples/hello_world_filesystem.py +162 -0
  106. aip_agents/examples/hello_world_google_adk.py +41 -0
  107. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  108. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  109. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  110. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  111. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  112. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  113. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  114. aip_agents/examples/hello_world_langchain.py +28 -0
  115. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  116. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  117. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  118. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  119. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  120. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  121. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  122. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  123. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  124. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  125. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  126. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  127. aip_agents/examples/hello_world_langgraph.py +39 -0
  128. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  129. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  130. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  131. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  132. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  133. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  134. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  135. aip_agents/examples/hello_world_langgraph_skills.py +62 -0
  136. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  137. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  138. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  139. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  140. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  141. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  142. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  143. aip_agents/examples/hello_world_multi_agent_tool_output_client.py +57 -0
  144. aip_agents/examples/hello_world_multi_agent_tool_output_server.py +131 -0
  145. aip_agents/examples/hello_world_pii_logger.py +21 -0
  146. aip_agents/examples/hello_world_ptc.py +49 -0
  147. aip_agents/examples/hello_world_ptc_custom_tools.py +83 -0
  148. aip_agents/examples/hello_world_sentry.py +133 -0
  149. aip_agents/examples/hello_world_step_limits.py +273 -0
  150. aip_agents/examples/hello_world_stock_a2a_server.py +100 -0
  151. aip_agents/examples/hello_world_tool_output_client.py +55 -0
  152. aip_agents/examples/hello_world_tool_output_server.py +113 -0
  153. aip_agents/examples/hitl_demo.py +724 -0
  154. aip_agents/examples/mcp_configs/configs.py +63 -0
  155. aip_agents/examples/mcp_servers/common.py +76 -0
  156. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  157. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  158. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  159. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  160. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  161. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  162. aip_agents/examples/pii_demo_langgraph_server.py +125 -0
  163. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  164. aip_agents/examples/pii_demo_multi_agent_server.py +246 -0
  165. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  166. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +87 -0
  167. aip_agents/examples/tools/__init__.py +27 -0
  168. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  169. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  170. aip_agents/examples/tools/data_generator_tool.py +103 -0
  171. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  172. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  173. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  174. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  175. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  176. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  177. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  178. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  179. aip_agents/examples/tools/multiply_tool.py +43 -0
  180. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  181. aip_agents/examples/tools/random_chart_tool.py +142 -0
  182. aip_agents/examples/tools/serper_tool.py +202 -0
  183. aip_agents/examples/tools/stock_tools.py +82 -0
  184. aip_agents/examples/tools/table_generator_tool.py +167 -0
  185. aip_agents/examples/tools/time_tool.py +82 -0
  186. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  187. aip_agents/guardrails/__init__.py +83 -0
  188. aip_agents/guardrails/engines/__init__.py +69 -0
  189. aip_agents/guardrails/engines/base.py +90 -0
  190. aip_agents/guardrails/engines/nemo.py +101 -0
  191. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  192. aip_agents/guardrails/exceptions.py +39 -0
  193. aip_agents/guardrails/manager.py +163 -0
  194. aip_agents/guardrails/middleware.py +199 -0
  195. aip_agents/guardrails/schemas.py +63 -0
  196. aip_agents/guardrails/utils.py +45 -0
  197. aip_agents/integration/__init__.py +43 -0
  198. aip_agents/integration/agent.py +58 -0
  199. aip_agents/integration/guardrails.py +52 -0
  200. aip_agents/integration/hitl.py +71 -0
  201. aip_agents/integration/ptc.py +95 -0
  202. aip_agents/integration/skills.py +37 -0
  203. aip_agents/integration/storage.py +81 -0
  204. aip_agents/integration/version.py +103 -0
  205. aip_agents/mcp/__init__.py +1 -0
  206. aip_agents/mcp/client/__init__.py +60 -0
  207. aip_agents/mcp/client/base_mcp_client.py +377 -0
  208. aip_agents/mcp/client/connection_manager.py +231 -0
  209. aip_agents/mcp/client/errors.py +119 -0
  210. aip_agents/mcp/client/google_adk/__init__.py +45 -0
  211. aip_agents/mcp/client/google_adk/client.py +383 -0
  212. aip_agents/mcp/client/langchain/__init__.py +11 -0
  213. aip_agents/mcp/client/langchain/client.py +265 -0
  214. aip_agents/mcp/client/persistent_session.py +704 -0
  215. aip_agents/mcp/client/session_pool.py +358 -0
  216. aip_agents/mcp/client/transports.py +288 -0
  217. aip_agents/mcp/utils/__init__.py +7 -0
  218. aip_agents/mcp/utils/config_validator.py +139 -0
  219. aip_agents/memory/__init__.py +14 -0
  220. aip_agents/memory/adapters/__init__.py +10 -0
  221. aip_agents/memory/adapters/base_adapter.py +815 -0
  222. aip_agents/memory/adapters/mem0.py +286 -0
  223. aip_agents/memory/base.py +84 -0
  224. aip_agents/memory/constants.py +49 -0
  225. aip_agents/memory/factory.py +86 -0
  226. aip_agents/memory/guidance.py +20 -0
  227. aip_agents/memory/simple_memory.py +47 -0
  228. aip_agents/middleware/__init__.py +65 -0
  229. aip_agents/middleware/backends/__init__.py +72 -0
  230. aip_agents/middleware/backends/in_memory.py +578 -0
  231. aip_agents/middleware/backends/local_disk.py +1203 -0
  232. aip_agents/middleware/backends/protocol.py +353 -0
  233. aip_agents/middleware/backends/sandbox.py +1431 -0
  234. aip_agents/middleware/backends/sandbox_files.py +113 -0
  235. aip_agents/middleware/backends/utils.py +293 -0
  236. aip_agents/middleware/base.py +239 -0
  237. aip_agents/middleware/filesystem.py +690 -0
  238. aip_agents/middleware/manager.py +291 -0
  239. aip_agents/middleware/memory.py +532 -0
  240. aip_agents/middleware/pii_middleware.py +192 -0
  241. aip_agents/middleware/schema.py +19 -0
  242. aip_agents/middleware/skills.py +872 -0
  243. aip_agents/middleware/task_delegation.py +1656 -0
  244. aip_agents/middleware/todolist.py +276 -0
  245. aip_agents/middleware/tools/__init__.py +23 -0
  246. aip_agents/middleware/tools/edit_file.py +70 -0
  247. aip_agents/middleware/tools/execute.py +428 -0
  248. aip_agents/middleware/tools/grep_file.py +79 -0
  249. aip_agents/middleware/tools/ls.py +71 -0
  250. aip_agents/middleware/tools/read_file.py +239 -0
  251. aip_agents/middleware/tools/skill_load.py +193 -0
  252. aip_agents/middleware/tools/skill_resource.py +338 -0
  253. aip_agents/middleware/tools/write_file.py +114 -0
  254. aip_agents/middleware/vision.py +322 -0
  255. aip_agents/ptc/__init__.py +87 -0
  256. aip_agents/ptc/custom_tools.py +511 -0
  257. aip_agents/ptc/custom_tools_payload.py +499 -0
  258. aip_agents/ptc/custom_tools_templates/__init__.py +1 -0
  259. aip_agents/ptc/custom_tools_templates/custom_build_function.py.template +24 -0
  260. aip_agents/ptc/custom_tools_templates/custom_init.py.template +26 -0
  261. aip_agents/ptc/custom_tools_templates/custom_invoke.py.template +149 -0
  262. aip_agents/ptc/custom_tools_templates/custom_registry.py.template +112 -0
  263. aip_agents/ptc/custom_tools_templates/custom_sources_init.py.template +7 -0
  264. aip_agents/ptc/custom_tools_templates/custom_wrapper.py.template +87 -0
  265. aip_agents/ptc/doc_gen.py +122 -0
  266. aip_agents/ptc/exceptions.py +57 -0
  267. aip_agents/ptc/executor.py +627 -0
  268. aip_agents/ptc/mcp/__init__.py +45 -0
  269. aip_agents/ptc/mcp/sandbox_bridge.py +679 -0
  270. aip_agents/ptc/mcp/templates/__init__.py +1 -0
  271. aip_agents/ptc/mcp/templates/mcp_client.py.template +240 -0
  272. aip_agents/ptc/naming.py +430 -0
  273. aip_agents/ptc/payload.py +26 -0
  274. aip_agents/ptc/prompt_builder.py +674 -0
  275. aip_agents/ptc/ptc_helper.py +16 -0
  276. aip_agents/ptc/sandbox_bridge.py +297 -0
  277. aip_agents/ptc/template_utils.py +33 -0
  278. aip_agents/ptc/templates/__init__.py +1 -0
  279. aip_agents/ptc/templates/ptc_helper.py.template +134 -0
  280. aip_agents/ptc/tool_def_helpers.py +101 -0
  281. aip_agents/ptc/tool_enrichment.py +163 -0
  282. aip_agents/resilience/__init__.py +10 -0
  283. aip_agents/resilience/base.py +46 -0
  284. aip_agents/resilience/tool.py +1661 -0
  285. aip_agents/sandbox/__init__.py +62 -0
  286. aip_agents/sandbox/defaults.py +220 -0
  287. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1-datasaur.Dockerfile +120 -0
  288. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1.Dockerfile +100 -0
  289. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2-datasaur.Dockerfile +143 -0
  290. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2.Dockerfile +119 -0
  291. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3-datasaur.Dockerfile +173 -0
  292. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3.Dockerfile +130 -0
  293. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.Dockerfile +164 -0
  294. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.patch_js_context.py +41 -0
  295. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.requirements.txt +29 -0
  296. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2.Dockerfile +87 -0
  297. aip_agents/sandbox/e2b_runtime.py +27 -0
  298. aip_agents/sandbox/image_registry.py +98 -0
  299. aip_agents/sandbox/providers/__init__.py +76 -0
  300. aip_agents/sandbox/providers/base.py +392 -0
  301. aip_agents/sandbox/providers/bedrock.py +28 -0
  302. aip_agents/sandbox/providers/e2b.py +230 -0
  303. aip_agents/sandbox/providers/opensandbox.py +163 -0
  304. aip_agents/sandbox/sandbox_runtime.py +967 -0
  305. aip_agents/sandbox/template_builder.py +240 -0
  306. aip_agents/sandbox/types.py +141 -0
  307. aip_agents/sandbox/validation.py +50 -0
  308. aip_agents/schema/__init__.py +106 -0
  309. aip_agents/schema/a2a.py +58 -0
  310. aip_agents/schema/agent.py +117 -0
  311. aip_agents/schema/artifacts.py +75 -0
  312. aip_agents/schema/attachments.py +425 -0
  313. aip_agents/schema/hitl.py +157 -0
  314. aip_agents/schema/langgraph.py +47 -0
  315. aip_agents/schema/model_id.py +103 -0
  316. aip_agents/schema/model_usage.py +50 -0
  317. aip_agents/schema/runtime_metadata.py +78 -0
  318. aip_agents/schema/step_limit.py +108 -0
  319. aip_agents/schema/storage.py +40 -0
  320. aip_agents/schema/tool_payloads.py +68 -0
  321. aip_agents/sentry/__init__.py +11 -0
  322. aip_agents/sentry/sentry.py +267 -0
  323. aip_agents/skills/__init__.py +30 -0
  324. aip_agents/skills/errors.py +110 -0
  325. aip_agents/skills/installer.py +479 -0
  326. aip_agents/skills/models.py +769 -0
  327. aip_agents/skills/stager.py +224 -0
  328. aip_agents/skills/validation.py +53 -0
  329. aip_agents/storage/__init__.py +41 -0
  330. aip_agents/storage/base.py +85 -0
  331. aip_agents/storage/clients/__init__.py +12 -0
  332. aip_agents/storage/clients/minio_client.py +318 -0
  333. aip_agents/storage/config.py +62 -0
  334. aip_agents/storage/providers/__init__.py +15 -0
  335. aip_agents/storage/providers/base.py +106 -0
  336. aip_agents/storage/providers/memory.py +114 -0
  337. aip_agents/storage/providers/object_storage.py +214 -0
  338. aip_agents/tools/__init__.py +65 -0
  339. aip_agents/tools/agent_schedule_tool.py +392 -0
  340. aip_agents/tools/browser_use/__init__.py +83 -0
  341. aip_agents/tools/browser_use/action_parser.py +104 -0
  342. aip_agents/tools/browser_use/browser_use_tool.py +1118 -0
  343. aip_agents/tools/browser_use/llm_config.py +120 -0
  344. aip_agents/tools/browser_use/minio_storage.py +203 -0
  345. aip_agents/tools/browser_use/schemas.py +121 -0
  346. aip_agents/tools/browser_use/session.py +13 -0
  347. aip_agents/tools/browser_use/session_errors.py +132 -0
  348. aip_agents/tools/browser_use/steel_session_recording.py +321 -0
  349. aip_agents/tools/browser_use/streaming.py +263 -0
  350. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  351. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  352. aip_agents/tools/browser_use/types.py +37 -0
  353. aip_agents/tools/code_sandbox/__init__.py +48 -0
  354. aip_agents/tools/code_sandbox/code_sandbox_tool.py +350 -0
  355. aip_agents/tools/code_sandbox/constant.py +13 -0
  356. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +346 -0
  357. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +65 -0
  358. aip_agents/tools/computer_use/__init__.py +75 -0
  359. aip_agents/tools/computer_use/computer_use_tool.py +910 -0
  360. aip_agents/tools/computer_use/schemas.py +78 -0
  361. aip_agents/tools/computer_use/streaming.py +198 -0
  362. aip_agents/tools/computer_use/types.py +32 -0
  363. aip_agents/tools/constants.py +177 -0
  364. aip_agents/tools/date_range_tool.py +554 -0
  365. aip_agents/tools/document_loader/__init__.py +44 -0
  366. aip_agents/tools/document_loader/base_reader.py +302 -0
  367. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  368. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  369. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  370. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  371. aip_agents/tools/execute_ptc_code.py +582 -0
  372. aip_agents/tools/gl_connector/__init__.py +5 -0
  373. aip_agents/tools/gl_connector/tool.py +518 -0
  374. aip_agents/tools/gl_connector_tools.py +170 -0
  375. aip_agents/tools/memory_search/__init__.py +29 -0
  376. aip_agents/tools/memory_search/base.py +213 -0
  377. aip_agents/tools/memory_search/mem0.py +424 -0
  378. aip_agents/tools/memory_search/schema.py +81 -0
  379. aip_agents/tools/memory_search_tool.py +34 -0
  380. aip_agents/tools/streaming_common.py +577 -0
  381. aip_agents/tools/time_tool.py +117 -0
  382. aip_agents/tools/tool_config_injector.py +300 -0
  383. aip_agents/tools/web_search/__init__.py +15 -0
  384. aip_agents/tools/web_search/serper_tool.py +187 -0
  385. aip_agents/types/__init__.py +73 -0
  386. aip_agents/types/a2a_events.py +13 -0
  387. aip_agents/utils/__init__.py +91 -0
  388. aip_agents/utils/a2a_connector.py +1758 -0
  389. aip_agents/utils/artifact_helpers.py +542 -0
  390. aip_agents/utils/artifacts/__init__.py +20 -0
  391. aip_agents/utils/artifacts/tracker.py +367 -0
  392. aip_agents/utils/attachment_helpers.py +178 -0
  393. aip_agents/utils/constants.py +22 -0
  394. aip_agents/utils/datetime/__init__.py +34 -0
  395. aip_agents/utils/datetime/normalization.py +231 -0
  396. aip_agents/utils/datetime/timezone.py +206 -0
  397. aip_agents/utils/env_loader.py +27 -0
  398. aip_agents/utils/event_handler_registry.py +58 -0
  399. aip_agents/utils/file_prompt_utils.py +276 -0
  400. aip_agents/utils/file_watchers/__init__.py +33 -0
  401. aip_agents/utils/file_watchers/base.py +46 -0
  402. aip_agents/utils/file_watchers/e2b.py +128 -0
  403. aip_agents/utils/file_watchers/factory.py +39 -0
  404. aip_agents/utils/file_watchers/ls_diff.py +88 -0
  405. aip_agents/utils/file_watchers/sandbox.py +66 -0
  406. aip_agents/utils/file_watchers/watchdog.py +97 -0
  407. aip_agents/utils/final_response_builder.py +211 -0
  408. aip_agents/utils/formatter_llm_client.py +258 -0
  409. aip_agents/utils/langgraph/__init__.py +19 -0
  410. aip_agents/utils/langgraph/converter.py +399 -0
  411. aip_agents/utils/langgraph/delegation_context.py +22 -0
  412. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  413. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  414. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  415. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1329 -0
  416. aip_agents/utils/langgraph/tool_output_management.py +1047 -0
  417. aip_agents/utils/logger.py +195 -0
  418. aip_agents/utils/metadata/__init__.py +27 -0
  419. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  420. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  421. aip_agents/utils/metadata/activity_narrative/builder.py +822 -0
  422. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  423. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  424. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  425. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  426. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  427. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  428. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  429. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  430. aip_agents/utils/metadata_helper.py +363 -0
  431. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  432. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  433. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  434. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  435. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  436. aip_agents/utils/pii/__init__.py +29 -0
  437. aip_agents/utils/pii/pii_handler.py +555 -0
  438. aip_agents/utils/pii/pii_helper.py +225 -0
  439. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  440. aip_agents/utils/reference_helper.py +273 -0
  441. aip_agents/utils/sse_chunk_transformer.py +836 -0
  442. aip_agents/utils/step_limit_manager.py +265 -0
  443. aip_agents/utils/token_usage_helper.py +531 -0
  444. aip_agents_binary-0.0.0.dist-info/METADATA +825 -0
  445. aip_agents_binary-0.0.0.dist-info/RECORD +447 -0
  446. aip_agents_binary-0.0.0.dist-info/WHEEL +5 -0
  447. aip_agents_binary-0.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,119 @@
1
+ """Typed MCP startup errors.
2
+
3
+ This module defines structured startup failures so higher layers can distinguish
4
+ real startup/auth failures from outer timeout guards.
5
+ """
6
+
7
+
8
+ class MCPServerStartupError(Exception):
9
+ """Base structured error for MCP server startup failures."""
10
+
11
+ def __init__(
12
+ self,
13
+ server_name: str,
14
+ message: str,
15
+ *,
16
+ transport: str | None = None,
17
+ status_code: int | None = None,
18
+ cause: BaseException | None = None,
19
+ ) -> None:
20
+ """Initialize the startup error with server details and failure context."""
21
+ self.server_name = server_name
22
+ self.transport = transport
23
+ self.status_code = status_code
24
+ self.message = message
25
+ self.cause = cause
26
+ super().__init__(message)
27
+
28
+ def __str__(self) -> str:
29
+ """Return the error message."""
30
+ return self.message
31
+
32
+
33
+ class MCPServerAuthError(MCPServerStartupError):
34
+ """Structured startup error for definitive authentication failures."""
35
+
36
+
37
+ class MCPServerStartupTimeoutError(MCPServerStartupError):
38
+ """Structured startup error for inner MCP startup timeout failures."""
39
+
40
+
41
+ _AUTH_STATUS_CODES = {401, 403}
42
+ _TIMEOUT_SIGNAL = "timeout"
43
+ _TIMED_OUT_SIGNAL = "timed out"
44
+
45
+
46
+ def get_exception_status_code(exc: BaseException) -> int | None:
47
+ """Extract an HTTP status code from an exception or one of its common attributes."""
48
+ response = getattr(exc, "response", None)
49
+ status_code = getattr(response, "status_code", None)
50
+ if isinstance(status_code, int):
51
+ return status_code
52
+
53
+ direct_status_code = getattr(exc, "status_code", None)
54
+ if isinstance(direct_status_code, int):
55
+ return direct_status_code
56
+
57
+ return None
58
+
59
+
60
+ def is_auth_status_code(status_code: int | None) -> bool:
61
+ """Return True for definitive auth failures relevant to startup handling."""
62
+ return status_code in _AUTH_STATUS_CODES
63
+
64
+
65
+ def _has_timeout_signal(exc: BaseException) -> bool:
66
+ """Return True when the exception itself looks timeout-related."""
67
+ if isinstance(exc, TimeoutError):
68
+ return True
69
+
70
+ exception_name = type(exc).__name__.lower()
71
+ if _TIMEOUT_SIGNAL in exception_name:
72
+ return True
73
+
74
+ message = str(exc).lower()
75
+ return _TIMEOUT_SIGNAL in message or _TIMED_OUT_SIGNAL in message
76
+
77
+
78
+ def is_timeout_exception(exc: BaseException | None) -> bool:
79
+ """Return True when an exception (or its chained cause) is timeout-shaped."""
80
+ current = exc
81
+ visited: set[int] = set()
82
+
83
+ while current is not None and id(current) not in visited:
84
+ if _has_timeout_signal(current):
85
+ return True
86
+ visited.add(id(current))
87
+ current = current.__cause__ or current.__context__
88
+
89
+ return False
90
+
91
+
92
+ def build_startup_error(
93
+ *,
94
+ server_name: str,
95
+ message: str,
96
+ transport: str | None = None,
97
+ cause: BaseException | None = None,
98
+ status_code: int | None = None,
99
+ ) -> MCPServerStartupError:
100
+ """Create the most specific structured startup error for a startup failure."""
101
+ resolved_status = status_code
102
+ if resolved_status is None and cause is not None:
103
+ resolved_status = get_exception_status_code(cause)
104
+
105
+ error_cls: type[MCPServerStartupError]
106
+ if is_auth_status_code(resolved_status):
107
+ error_cls = MCPServerAuthError
108
+ elif is_timeout_exception(cause):
109
+ error_cls = MCPServerStartupTimeoutError
110
+ else:
111
+ error_cls = MCPServerStartupError
112
+
113
+ return error_cls(
114
+ server_name=server_name,
115
+ message=message,
116
+ transport=transport,
117
+ status_code=resolved_status,
118
+ cause=cause,
119
+ )
@@ -0,0 +1,45 @@
1
+ """Google ADK MCP Client.
2
+
3
+ This module provides a client for interacting with MCP servers using Google ADK.
4
+
5
+ Authors:
6
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from typing import TYPE_CHECKING, Any
12
+
13
+ from aip_agents.agent.google_adk_constants import GOOGLE_ADK_IMPORT_ERROR_MESSAGE
14
+
15
+ if TYPE_CHECKING:
16
+ from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient
17
+
18
+ __all__ = ["GoogleADKMCPClient"]
19
+
20
+
21
+ def __getattr__(name: str) -> Any:
22
+ """Lazy load Google ADK MCP client class.
23
+
24
+ Args:
25
+ name: Attribute name to resolve.
26
+
27
+ Returns:
28
+ Requested attribute.
29
+
30
+ Raises:
31
+ AttributeError: If attribute name is unknown.
32
+ """
33
+ if name != "GoogleADKMCPClient":
34
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
35
+
36
+ try:
37
+ from aip_agents.mcp.client.google_adk.client import (
38
+ GoogleADKMCPClient as _GoogleADKMCPClient,
39
+ )
40
+ except ModuleNotFoundError as e:
41
+ if e.name and e.name.startswith("google"):
42
+ raise ImportError(GOOGLE_ADK_IMPORT_ERROR_MESSAGE) from e
43
+ raise
44
+
45
+ return _GoogleADKMCPClient
@@ -0,0 +1,383 @@
1
+ """Google ADK MCP Adapter for MCP Client with Session Persistence.
2
+
3
+ This module contains the GoogleADKMCPClient class, which extends the BaseMCPClient
4
+ to integrate persistent MCP tools with Google's Agent Development Kit (ADK).
5
+
6
+ The GoogleADKMCPClient adapts MCP tools into ADK FunctionTool instances that can
7
+ be used seamlessly with ADK agents while maintaining session persistence across
8
+ multiple tool calls.
9
+
10
+ Authors:
11
+ Fachriza Dian Adhiatma (fachriza.d.adhiatma@gdplabs.id)
12
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
13
+ """
14
+
15
+ import base64
16
+ from typing import Any
17
+
18
+ from gllm_tools.mcp.client.config import MCPConfiguration
19
+ from gllm_tools.mcp.client.resource import MCPResource
20
+ from gllm_tools.mcp.client.tool import MCPTool
21
+ from mcp.types import (
22
+ BlobResourceContents,
23
+ CallToolResult,
24
+ EmbeddedResource,
25
+ ImageContent,
26
+ TextContent,
27
+ TextResourceContents,
28
+ )
29
+
30
+ from aip_agents.agent.google_adk_constants import GOOGLE_ADK_IMPORT_ERROR_MESSAGE
31
+ from aip_agents.mcp.client.base_mcp_client import BaseMCPClient
32
+ from aip_agents.utils.logger import get_logger
33
+
34
+ try:
35
+ from google.adk.tools import FunctionTool
36
+ from google.genai.types import Part
37
+ except ModuleNotFoundError as e:
38
+ if e.name and e.name.startswith("google"):
39
+ raise ImportError(GOOGLE_ADK_IMPORT_ERROR_MESSAGE) from e
40
+ raise
41
+
42
+ NonTextContent = ImageContent | EmbeddedResource
43
+
44
+ logger = get_logger(__name__)
45
+
46
+
47
+ class GoogleADKMCPClient(BaseMCPClient):
48
+ """Google ADK MCP Client with Persistent Sessions.
49
+
50
+ This client extends BaseMCPClient to provide Google ADK-specific tool conversion
51
+ while maintaining persistent MCP sessions and connection reuse across tool calls.
52
+ It converts MCP tools into ADK FunctionTool instances for seamless integration.
53
+
54
+ The client handles:
55
+ - Converting MCP tools to ADK FunctionTool instances using persistent sessions
56
+ - Managing MCP server connections with automatic reconnection
57
+ - Converting MCP resources to ADK-compatible formats
58
+ - Handling tool execution with proper error formatting for ADK agents
59
+
60
+ Example:
61
+ ```python
62
+ from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient
63
+ from gllm_tools.mcp.client.config import MCPConfiguration
64
+
65
+ servers = {
66
+ "filesystem": MCPConfiguration(
67
+ command="npx",
68
+ args=["-y", "@modelcontextprotocol/server-filesystem", "/path/to/folder"]
69
+ )
70
+ }
71
+
72
+ client = GoogleADKMCPClient(servers)
73
+ await client.initialize() # Initialize persistent sessions
74
+ tools = await client.get_tools() # Returns list of ADK FunctionTool instances
75
+ ```
76
+ """
77
+
78
+ RESOURCE_FETCH_TIMEOUT = 10
79
+
80
+ def __init__(self, servers: dict[str, MCPConfiguration]):
81
+ """Initialize Google ADK MCP client.
82
+
83
+ Args:
84
+ servers (dict[str, MCPConfiguration]): Dictionary of MCP server configurations
85
+ """
86
+ super().__init__(servers)
87
+ # Cache converted ADK tools for consistent pattern with LangChain client
88
+ self._adk_tools_cache: dict[str | None, list[FunctionTool]] = {}
89
+
90
+ async def initialize(self) -> None:
91
+ """Initialize persistent MCP sessions for Google ADK integration.
92
+
93
+ This method ensures all MCP servers are connected with persistent sessions
94
+ and prepares the client for ADK tool conversion.
95
+
96
+ Raises:
97
+ Exception: If session initialization fails
98
+ """
99
+ await super().initialize()
100
+ logger.info(f"GoogleADKMCPClient initialized with {self.get_tools_count()} MCP tools ready for ADK conversion")
101
+
102
+ async def get_tools(self, server: str | None = None) -> list[FunctionTool]:
103
+ """Get ADK-compatible FunctionTool instances with smart caching.
104
+
105
+ Converts MCP tools to ADK format and caches them for better performance
106
+ on repeated access. Cache is keyed by server parameter.
107
+
108
+ Args:
109
+ server (str | None): Optional server name to filter tools from a specific server.
110
+ If None, returns tools from all configured servers.
111
+
112
+ Returns:
113
+ list[FunctionTool]: List of cached ADK FunctionTool instances.
114
+ """
115
+ if not self.is_initialized:
116
+ await self.initialize()
117
+
118
+ if server:
119
+ # Get tools from specific server with caching
120
+ server_tools = await self._get_server_tools_cached(server)
121
+ return server_tools.copy()
122
+ else:
123
+ # Get tools from all servers with efficient caching
124
+ all_tools = []
125
+ for server_name in self.servers.keys():
126
+ try:
127
+ server_tools = await self._get_server_tools_cached(server_name)
128
+ all_tools.extend(server_tools)
129
+ except Exception as e:
130
+ logger.warning(f"Failed to get tools from server '{server_name}': {e}")
131
+
132
+ logger.debug(f"Retrieved {len(all_tools)} total ADK FunctionTools from {len(self.servers)} servers")
133
+ return all_tools
134
+
135
+ async def _get_server_tools_cached(self, server_name: str) -> list[FunctionTool]:
136
+ """Get tools for a specific server with caching.
137
+
138
+ This method centralizes caching logic and ensures tools are only converted once per server.
139
+
140
+ Args:
141
+ server_name (str): Name of the MCP server
142
+
143
+ Returns:
144
+ list[FunctionTool]: List of cached FunctionTool instances for the server
145
+ """
146
+ # Check cache first
147
+ if server_name in self._adk_tools_cache:
148
+ logger.debug(f"Using cached ADK tools for server '{server_name}'")
149
+ return self._adk_tools_cache[server_name]
150
+
151
+ # Convert and cache tools for this server
152
+ logger.info(f"Converting and caching tools for server '{server_name}'")
153
+ mcp_tools = await self.get_raw_mcp_tools(server_name)
154
+ adk_tools = []
155
+
156
+ for mcp_tool in mcp_tools:
157
+ adk_tool = self._process_tool(mcp_tool, server_name)
158
+ adk_tools.append(adk_tool)
159
+ logger.info(f"Converted MCP tool '{mcp_tool.name}' to ADK FunctionTool for server '{server_name}'")
160
+
161
+ # Cache the converted tools
162
+ self._adk_tools_cache[server_name] = adk_tools
163
+ logger.debug(f"Cached {len(adk_tools)} ADK FunctionTools for server '{server_name}'")
164
+
165
+ return adk_tools
166
+
167
+ def _process_tool(self, tool: MCPTool, server_name: str | None = None) -> FunctionTool:
168
+ """Converts an MCP tool into an ADK FunctionTool using persistent session.
169
+
170
+ This method creates a dynamic function that wraps the MCP tool execution
171
+ using the base class's persistent session management, and converts the
172
+ response format to be compatible with ADK's expectations.
173
+
174
+ Args:
175
+ tool (MCPTool): The MCP tool to convert.
176
+ server_name (str | None): The server name for routing tool calls.
177
+
178
+ Returns:
179
+ FunctionTool: An ADK FunctionTool instance that wraps the MCP tool
180
+ with persistent session support.
181
+ """
182
+ # Store the original MCP tool name for the actual server call
183
+ original_tool_name = tool.name
184
+
185
+ # Create the dynamic function that will be wrapped by FunctionTool
186
+ async def mcp_tool_function(**arguments: dict[str, Any]) -> dict[str, Any]:
187
+ """Dynamic function that executes the MCP tool with persistent session.
188
+
189
+ This function uses the base class's call_tool method which handles
190
+ server routing and persistent session management automatically.
191
+
192
+ Args:
193
+ **arguments (dict[str, Any]): Keyword arguments for the MCP tool execution.
194
+
195
+ Returns:
196
+ dict[str, Any]: The tool execution result.
197
+ """
198
+ try:
199
+ # Determine server to route the call to
200
+ resolved_server = server_name or next(iter(self.servers.keys()), None)
201
+ if not resolved_server:
202
+ raise RuntimeError("No MCP servers configured for executing tool")
203
+
204
+ # Use the original MCP tool name for the server call, not the sanitized name
205
+ call_tool_result = await self.call_tool(resolved_server, original_tool_name, arguments)
206
+ return self._convert_call_tool_result(call_tool_result)
207
+ except Exception as e:
208
+ logger.error(f"MCP tool '{original_tool_name}' execution failed: {e}")
209
+ return {"status": "error", "message": str(e)}
210
+
211
+ # Set function metadata for ADK introspection (will be sanitized later by agent)
212
+ mcp_tool_function.__name__ = tool.name
213
+ mcp_tool_function.__doc__ = tool.description or f"MCP tool: {tool.name} (from server: {server_name})"
214
+
215
+ # Create and return the ADK FunctionTool
216
+ return FunctionTool(func=mcp_tool_function)
217
+
218
+ async def _process_resource(self, resource: MCPResource) -> dict[str, Any]:
219
+ """Converts an MCP resource into an ADK-compatible format using persistent session.
220
+
221
+ Args:
222
+ resource (MCPResource): The MCP resource to convert.
223
+
224
+ Returns:
225
+ dict[str, Any]: A dictionary containing resource metadata and accessor function.
226
+ """
227
+ # Determine server name from resource URI or use first available server
228
+ server_name = self._determine_server_name_for_resource(resource)
229
+
230
+ async def read_resource_content() -> Part:
231
+ """Reads the actual content of the MCP resource using persistent session."""
232
+ try:
233
+ # Use base class method for persistent session resource access
234
+ resource_result = await self.read_resource(server_name, str(resource.uri))
235
+
236
+ contents = resource_result.contents[0]
237
+ if isinstance(contents, TextResourceContents):
238
+ return Part.from_text(contents.text)
239
+ elif isinstance(contents, BlobResourceContents):
240
+ data = base64.b64decode(contents.blob)
241
+ return Part.from_bytes(data=data, mime_type=resource.mime_type)
242
+ else:
243
+ raise ValueError(f"Unsupported content type for URI {resource.uri}")
244
+ except Exception as e:
245
+ # Do not break callers; return a safe textual Part describing the error
246
+ logger.error(f"Failed to read MCP resource {resource.uri}: {e}")
247
+ try:
248
+ return Part.from_text(f"Error reading resource {resource.uri}: {e}")
249
+ except Exception as part_error:
250
+ logger.error(f"Failed to create error Part for resource {resource.uri}: {part_error}")
251
+ raise ValueError(f"Cannot create ADK Part for error response: {part_error}") from part_error
252
+
253
+ return {
254
+ "uri": str(resource.uri),
255
+ "name": resource.name,
256
+ "description": resource.description,
257
+ "mime_type": resource.mime_type,
258
+ "read_content": read_resource_content,
259
+ "metadata": {
260
+ "uri": resource.uri,
261
+ "annotations": resource.annotations.model_dump() if resource.annotations else None,
262
+ },
263
+ }
264
+
265
+ async def cleanup(self) -> None:
266
+ """Clean up Google ADK MCP client resources.
267
+
268
+ This method ensures all persistent sessions are properly closed and
269
+ ADK-specific resources are cleaned up.
270
+ """
271
+ logger.info("Cleaning up GoogleADKMCPClient resources")
272
+ try:
273
+ await super().cleanup()
274
+ except Exception as e:
275
+ logger.error(f"Error during base GoogleADKMCPClient cleanup: {e}", exc_info=True)
276
+ finally:
277
+ # Always clear the ADK tools cache
278
+ self._adk_tools_cache.clear()
279
+ logger.info("GoogleADKMCPClient cleanup completed")
280
+
281
+ def _convert_call_tool_result(self, call_tool_result: CallToolResult) -> dict[str, Any]:
282
+ """Converts an MCP call tool result into an ADK-compatible format.
283
+
284
+ ADK tools should return dictionaries with meaningful keys. This method
285
+ extracts text content and formats it appropriately for ADK agents.
286
+
287
+ Args:
288
+ call_tool_result (CallToolResult): The MCP tool execution result.
289
+
290
+ Returns:
291
+ dict[str, Any]: ADK-compatible result dictionary.
292
+
293
+ Raises:
294
+ Exception: If the tool execution resulted in an error.
295
+ """
296
+ text_contents, non_text_contents = self._separate_contents(call_tool_result.content)
297
+
298
+ if call_tool_result.isError:
299
+ error_message = self._format_error_message(text_contents)
300
+ raise RuntimeError(f"MCP tool execution failed: {error_message}")
301
+
302
+ result = {"status": "success"}
303
+ if text_contents:
304
+ result["result"] = (
305
+ text_contents[0].text if len(text_contents) == 1 else [content.text for content in text_contents]
306
+ )
307
+ else:
308
+ result["result"] = "Tool executed successfully"
309
+
310
+ artifacts = [a for a in (self._format_artifact(c) for c in non_text_contents) if a]
311
+ if artifacts:
312
+ result["artifacts"] = artifacts
313
+
314
+ return result
315
+
316
+ @staticmethod
317
+ def _separate_contents(contents: list[Any]) -> tuple[list[TextContent], list[NonTextContent]]:
318
+ """Separates a list of content objects into text and non-text content.
319
+
320
+ This helper method processes a list of content objects and categorizes them
321
+ into text content (TextContent) and other content types for further processing.
322
+
323
+ Args:
324
+ contents (list[Any]): List of content objects to be separated.
325
+
326
+ Returns:
327
+ tuple[list[TextContent], list[NonTextContent]]: A tuple containing two lists:
328
+ - First: TextContent objects
329
+ - Second: All other content types.
330
+ """
331
+ text_contents = []
332
+ non_text_contents = []
333
+ for content in contents:
334
+ if isinstance(content, TextContent):
335
+ text_contents.append(content)
336
+ else:
337
+ non_text_contents.append(content)
338
+ return text_contents, non_text_contents
339
+
340
+ @staticmethod
341
+ def _format_artifact(content: NonTextContent) -> dict[str, Any] | None:
342
+ """Formats non-text content into ADK-compatible artifact dictionaries.
343
+
344
+ Converts different types of content objects (images, embedded resources) into
345
+ a standardized dictionary format expected by ADK agents.
346
+
347
+ Args:
348
+ content (NonTextContent): The content object to be formatted. Can be either ImageContent
349
+ or EmbeddedResource.
350
+
351
+ Returns:
352
+ dict[str, Any] | None: A dictionary containing the formatted content with appropriate type-specific
353
+ fields, or None if the content type is not supported.
354
+ """
355
+ if isinstance(content, ImageContent):
356
+ return {
357
+ "type": "image",
358
+ "data": content.data,
359
+ "mime_type": content.mimeType,
360
+ }
361
+ if isinstance(content, EmbeddedResource):
362
+ return {
363
+ "type": "resource",
364
+ "uri": str(content.resource.uri),
365
+ "text": getattr(content.resource, "text", None),
366
+ }
367
+ return None
368
+
369
+ @staticmethod
370
+ def _format_error_message(text_contents: list[TextContent]) -> str:
371
+ """Formats a list of text contents into a single error message string.
372
+
373
+ Combines multiple text content objects into a single string, typically
374
+ used for creating human-readable error messages from tool execution results.
375
+
376
+ Args:
377
+ text_contents (list[TextContent]): List of TextContent objects containing error message parts.
378
+
379
+ Returns:
380
+ str: A single string containing all text contents joined by spaces,
381
+ or an empty string if the input list is empty.
382
+ """
383
+ return " ".join(content.text for content in text_contents) if text_contents else ""
@@ -0,0 +1,11 @@
1
+ """Langchain MCP Client.
2
+
3
+ This module provides an alias for Langchain MCP Client from GLLM Tools.
4
+
5
+ Authors:
6
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
7
+ """
8
+
9
+ from aip_agents.mcp.client.langchain.client import LangchainMCPClient
10
+
11
+ __all__ = ["LangchainMCPClient"]