aip-agents-binary 0.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of aip-agents-binary might be problematic. Click here for more details.
- aip_agents/__init__.py +65 -0
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/__init__.pyi +3 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/__init__.pyi +4 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/base_executor.pyi +73 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/google_adk_executor.pyi +51 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/server/langgraph_executor.pyi +47 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/a2a/types.pyi +132 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/__init__.pyi +9 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_agent.pyi +221 -0
- aip_agents/agent/base_langgraph_agent.py +3037 -0
- aip_agents/agent/base_langgraph_agent.pyi +233 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_agent.pyi +141 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/manager.pyi +200 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/hitl/registry.pyi +101 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interface.pyi +81 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +767 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
- aip_agents/agent/langgraph_react_agent.py +2856 -0
- aip_agents/agent/langgraph_react_agent.pyi +170 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.py +23 -0
- aip_agents/constants.pyi +7 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/__init__.pyi +0 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain.pyi +5 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
- aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_pii_logger.pyi +5 -0
- aip_agents/examples/hello_world_ptc.py +49 -0
- aip_agents/examples/hello_world_ptc.pyi +5 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_sentry.pyi +21 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
- aip_agents/examples/hello_world_tool_output_client.py +55 -0
- aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
- aip_agents/examples/hitl_demo.py +724 -0
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/mcp_configs/configs.py +63 -0
- aip_agents/examples/mcp_servers/common.py +76 -0
- aip_agents/examples/mcp_servers/mcp_name.py +29 -0
- aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
- aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
- aip_agents/examples/mcp_servers/mcp_time.py +10 -0
- aip_agents/examples/pii_demo_langgraph_client.py +69 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.py +126 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/__init__.pyi +9 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_generator_tool.pyi +15 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/serper_tool.pyi +16 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/stock_tools.pyi +36 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/table_generator_tool.pyi +22 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/time_tool.pyi +15 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/guardrails/__init__.py +83 -0
- aip_agents/guardrails/__init__.pyi +6 -0
- aip_agents/guardrails/engines/__init__.py +69 -0
- aip_agents/guardrails/engines/__init__.pyi +4 -0
- aip_agents/guardrails/engines/base.py +90 -0
- aip_agents/guardrails/engines/base.pyi +61 -0
- aip_agents/guardrails/engines/nemo.py +101 -0
- aip_agents/guardrails/engines/nemo.pyi +46 -0
- aip_agents/guardrails/engines/phrase_matcher.py +113 -0
- aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
- aip_agents/guardrails/exceptions.py +39 -0
- aip_agents/guardrails/exceptions.pyi +23 -0
- aip_agents/guardrails/manager.py +163 -0
- aip_agents/guardrails/manager.pyi +42 -0
- aip_agents/guardrails/middleware.py +199 -0
- aip_agents/guardrails/middleware.pyi +87 -0
- aip_agents/guardrails/schemas.py +63 -0
- aip_agents/guardrails/schemas.pyi +43 -0
- aip_agents/guardrails/utils.py +45 -0
- aip_agents/guardrails/utils.pyi +19 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/__init__.pyi +0 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/__init__.pyi +5 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.py +228 -0
- aip_agents/mcp/client/connection_manager.pyi +51 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/google_adk/client.pyi +75 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/__init__.pyi +3 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/langchain/client.pyi +48 -0
- aip_agents/mcp/client/persistent_session.py +612 -0
- aip_agents/mcp/client/persistent_session.pyi +122 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.py +263 -0
- aip_agents/mcp/client/transports.pyi +132 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/__init__.pyi +5 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.py +811 -0
- aip_agents/memory/adapters/base_adapter.pyi +176 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/base.pyi +60 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/constants.pyi +25 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/factory.pyi +24 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/memory/simple_memory.pyi +23 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.py +96 -0
- aip_agents/middleware/base.pyi +75 -0
- aip_agents/middleware/manager.py +150 -0
- aip_agents/middleware/manager.pyi +84 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/ptc/__init__.py +48 -0
- aip_agents/ptc/__init__.pyi +10 -0
- aip_agents/ptc/doc_gen.py +122 -0
- aip_agents/ptc/doc_gen.pyi +40 -0
- aip_agents/ptc/exceptions.py +39 -0
- aip_agents/ptc/exceptions.pyi +22 -0
- aip_agents/ptc/executor.py +143 -0
- aip_agents/ptc/executor.pyi +73 -0
- aip_agents/ptc/mcp/__init__.py +45 -0
- aip_agents/ptc/mcp/__init__.pyi +7 -0
- aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
- aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
- aip_agents/ptc/mcp/templates/__init__.py +1 -0
- aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
- aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
- aip_agents/ptc/naming.py +184 -0
- aip_agents/ptc/naming.pyi +76 -0
- aip_agents/ptc/payload.py +26 -0
- aip_agents/ptc/payload.pyi +15 -0
- aip_agents/ptc/prompt_builder.py +571 -0
- aip_agents/ptc/prompt_builder.pyi +55 -0
- aip_agents/ptc/ptc_helper.py +16 -0
- aip_agents/ptc/ptc_helper.pyi +1 -0
- aip_agents/ptc/sandbox_bridge.py +58 -0
- aip_agents/ptc/sandbox_bridge.pyi +25 -0
- aip_agents/ptc/template_utils.py +33 -0
- aip_agents/ptc/template_utils.pyi +13 -0
- aip_agents/ptc/templates/__init__.py +1 -0
- aip_agents/ptc/templates/__init__.pyi +0 -0
- aip_agents/ptc/templates/ptc_helper.py.template +134 -0
- aip_agents/sandbox/__init__.py +43 -0
- aip_agents/sandbox/__init__.pyi +5 -0
- aip_agents/sandbox/defaults.py +9 -0
- aip_agents/sandbox/defaults.pyi +2 -0
- aip_agents/sandbox/e2b_runtime.py +267 -0
- aip_agents/sandbox/e2b_runtime.pyi +51 -0
- aip_agents/sandbox/template_builder.py +131 -0
- aip_agents/sandbox/template_builder.pyi +36 -0
- aip_agents/sandbox/types.py +24 -0
- aip_agents/sandbox/types.pyi +14 -0
- aip_agents/sandbox/validation.py +50 -0
- aip_agents/sandbox/validation.pyi +20 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/__init__.pyi +3 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/sentry/sentry.pyi +48 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/__init__.pyi +8 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/base.pyi +58 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/__init__.pyi +3 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/clients/minio_client.pyi +137 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/config.pyi +29 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/__init__.pyi +5 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/base.pyi +88 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/memory.pyi +79 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/storage/providers/object_storage.pyi +98 -0
- aip_agents/tools/__init__.py +64 -0
- aip_agents/tools/__init__.pyi +11 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/__init__.pyi +14 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/action_parser.pyi +18 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1120 -0
- aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/llm_config.pyi +52 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/minio_storage.pyi +109 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/schemas.pyi +32 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session.pyi +4 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/session_errors.pyi +53 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
- aip_agents/tools/browser_use/streaming.py +815 -0
- aip_agents/tools/browser_use/streaming.pyi +81 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/browser_use/types.pyi +45 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/__init__.pyi +3 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/constant.pyi +4 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
- aip_agents/tools/constants.py +177 -0
- aip_agents/tools/constants.pyi +138 -0
- aip_agents/tools/date_range_tool.py +554 -0
- aip_agents/tools/date_range_tool.pyi +21 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/__init__.pyi +7 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/base_reader.pyi +75 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
- aip_agents/tools/execute_ptc_code.py +308 -0
- aip_agents/tools/execute_ptc_code.pyi +90 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/__init__.pyi +3 -0
- aip_agents/tools/gl_connector/tool.py +383 -0
- aip_agents/tools/gl_connector/tool.pyi +74 -0
- aip_agents/tools/gl_connector_tools.py +119 -0
- aip_agents/tools/gl_connector_tools.pyi +39 -0
- aip_agents/tools/memory_search/__init__.py +29 -0
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.py +365 -0
- aip_agents/tools/memory_search/mem0.pyi +29 -0
- aip_agents/tools/memory_search/schema.py +81 -0
- aip_agents/tools/memory_search/schema.pyi +25 -0
- aip_agents/tools/memory_search_tool.py +34 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/time_tool.pyi +16 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/tool_config_injector.pyi +26 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/__init__.pyi +3 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/tools/web_search/serper_tool.pyi +19 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/__init__.pyi +36 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/types/a2a_events.pyi +3 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/__init__.pyi +11 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/a2a_connector.pyi +146 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/artifact_helpers.pyi +203 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/env_loader.pyi +10 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/file_prompt_utils.pyi +21 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/__init__.pyi +3 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/converter.pyi +49 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1096 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
- aip_agents/utils/langgraph/tool_output_management.py +1047 -0
- aip_agents/utils/langgraph/tool_output_management.pyi +329 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/metadata_helper.pyi +117 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_handler.pyi +96 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/pii_helper.pyi +78 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/reference_helper.pyi +81 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents/utils/token_usage_helper.pyi +60 -0
- aip_agents_binary-0.6.4.dist-info/METADATA +673 -0
- aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
- aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
- aip_agents_binary-0.6.4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient as BaseMCPClient
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from gllm_tools.mcp.client.config import MCPConfiguration as MCPConfiguration
|
|
5
|
+
from google.adk.tools import FunctionTool
|
|
6
|
+
from mcp.types import EmbeddedResource, ImageContent
|
|
7
|
+
|
|
8
|
+
NonTextContent = ImageContent | EmbeddedResource
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
|
|
11
|
+
class GoogleADKMCPClient(BaseMCPClient):
|
|
12
|
+
'''Google ADK MCP Client with Persistent Sessions.
|
|
13
|
+
|
|
14
|
+
This client extends BaseMCPClient to provide Google ADK-specific tool conversion
|
|
15
|
+
while maintaining persistent MCP sessions and connection reuse across tool calls.
|
|
16
|
+
It converts MCP tools into ADK FunctionTool instances for seamless integration.
|
|
17
|
+
|
|
18
|
+
The client handles:
|
|
19
|
+
- Converting MCP tools to ADK FunctionTool instances using persistent sessions
|
|
20
|
+
- Managing MCP server connections with automatic reconnection
|
|
21
|
+
- Converting MCP resources to ADK-compatible formats
|
|
22
|
+
- Handling tool execution with proper error formatting for ADK agents
|
|
23
|
+
|
|
24
|
+
Example:
|
|
25
|
+
```python
|
|
26
|
+
from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient
|
|
27
|
+
from gllm_tools.mcp.client.config import MCPConfiguration
|
|
28
|
+
|
|
29
|
+
servers = {
|
|
30
|
+
"filesystem": MCPConfiguration(
|
|
31
|
+
command="npx",
|
|
32
|
+
args=["-y", "@modelcontextprotocol/server-filesystem", "/path/to/folder"]
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
client = GoogleADKMCPClient(servers)
|
|
37
|
+
await client.initialize() # Initialize persistent sessions
|
|
38
|
+
tools = await client.get_tools() # Returns list of ADK FunctionTool instances
|
|
39
|
+
```
|
|
40
|
+
'''
|
|
41
|
+
RESOURCE_FETCH_TIMEOUT: int
|
|
42
|
+
def __init__(self, servers: dict[str, MCPConfiguration]) -> None:
|
|
43
|
+
"""Initialize Google ADK MCP client.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
servers (dict[str, MCPConfiguration]): Dictionary of MCP server configurations
|
|
47
|
+
"""
|
|
48
|
+
async def initialize(self) -> None:
|
|
49
|
+
"""Initialize persistent MCP sessions for Google ADK integration.
|
|
50
|
+
|
|
51
|
+
This method ensures all MCP servers are connected with persistent sessions
|
|
52
|
+
and prepares the client for ADK tool conversion.
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
Exception: If session initialization fails
|
|
56
|
+
"""
|
|
57
|
+
async def get_tools(self, server: str | None = None) -> list[FunctionTool]:
|
|
58
|
+
"""Get ADK-compatible FunctionTool instances with smart caching.
|
|
59
|
+
|
|
60
|
+
Converts MCP tools to ADK format and caches them for better performance
|
|
61
|
+
on repeated access. Cache is keyed by server parameter.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
server (str | None): Optional server name to filter tools from a specific server.
|
|
65
|
+
If None, returns tools from all configured servers.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
list[FunctionTool]: List of cached ADK FunctionTool instances.
|
|
69
|
+
"""
|
|
70
|
+
async def cleanup(self) -> None:
|
|
71
|
+
"""Clean up Google ADK MCP client resources.
|
|
72
|
+
|
|
73
|
+
This method ensures all persistent sessions are properly closed and
|
|
74
|
+
ADK-specific resources are cleaned up.
|
|
75
|
+
"""
|
|
@@ -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"]
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"""Langchain MCP Adapter for MCP Client with Session Persistence.
|
|
2
|
+
|
|
3
|
+
Authors:
|
|
4
|
+
Samuel Lusandi (samuel.lusandi@gdplabs.id)
|
|
5
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import base64
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from gllm_tools.mcp.client.config import MCPConfiguration
|
|
13
|
+
from gllm_tools.mcp.client.resource import MCPResource
|
|
14
|
+
from gllm_tools.mcp.client.tool import MCPTool
|
|
15
|
+
from langchain_core.documents.base import Blob
|
|
16
|
+
from langchain_core.tools import StructuredTool, ToolException
|
|
17
|
+
from mcp.types import (
|
|
18
|
+
BlobResourceContents,
|
|
19
|
+
CallToolResult,
|
|
20
|
+
EmbeddedResource,
|
|
21
|
+
ImageContent,
|
|
22
|
+
TextContent,
|
|
23
|
+
TextResourceContents,
|
|
24
|
+
)
|
|
25
|
+
from pydantic import AnyUrl
|
|
26
|
+
|
|
27
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient
|
|
28
|
+
from aip_agents.utils.logger import get_logger
|
|
29
|
+
|
|
30
|
+
NonTextContent = ImageContent | EmbeddedResource
|
|
31
|
+
|
|
32
|
+
logger = get_logger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class LangchainMCPClient(BaseMCPClient):
|
|
36
|
+
"""Langchain MCP Client with Session Persistence.
|
|
37
|
+
|
|
38
|
+
This client extends BaseMCPClient to provide LangChain-specific tool conversion
|
|
39
|
+
while maintaining persistent MCP sessions and connection reuse across tool calls.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
RESOURCE_FETCH_TIMEOUT = 10
|
|
43
|
+
|
|
44
|
+
def __init__(self, servers: dict[str, MCPConfiguration]):
|
|
45
|
+
"""Initialize LangChain MCP client.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
servers (dict[str, MCPConfiguration]): Dictionary of MCP server configurations
|
|
49
|
+
"""
|
|
50
|
+
super().__init__(servers)
|
|
51
|
+
# Cache converted LangChain tools for better performance on repeated access
|
|
52
|
+
self._langchain_tools_cache: dict[str | None, list[StructuredTool]] = {}
|
|
53
|
+
|
|
54
|
+
async def initialize(self) -> None:
|
|
55
|
+
"""Initialize all sessions for LangChain client.
|
|
56
|
+
|
|
57
|
+
This method initializes the base MCP sessions and prepares for tool caching.
|
|
58
|
+
|
|
59
|
+
Raises:
|
|
60
|
+
Exception: If base initialization fails
|
|
61
|
+
"""
|
|
62
|
+
# Call base class initialization - this caches raw MCP tools
|
|
63
|
+
await super().initialize()
|
|
64
|
+
|
|
65
|
+
logger.info(f"LangchainMCPClient initialized with {self.get_tools_count()} MCP tools available for conversion")
|
|
66
|
+
|
|
67
|
+
def _process_tool(self, tool: MCPTool, server_name: str) -> StructuredTool:
|
|
68
|
+
"""Converts an MCP tool into a Langchain StructuredTool.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
tool (MCPTool): The tool to convert.
|
|
72
|
+
server_name (str): The name of the MCP server.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
StructuredTool: The converted tool.
|
|
76
|
+
"""
|
|
77
|
+
# Store the original MCP tool name for the actual server call
|
|
78
|
+
original_tool_name = tool.name
|
|
79
|
+
|
|
80
|
+
async def call_mcp_tool(
|
|
81
|
+
**arguments: dict[str, Any],
|
|
82
|
+
) -> tuple[str | list[str], list[NonTextContent] | None]:
|
|
83
|
+
"""Invoke the underlying MCP tool and normalize its response.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
**arguments: Structured arguments expected by the MCP tool.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
tuple: Textual response (string or list of strings) and optional non-text artifacts.
|
|
90
|
+
"""
|
|
91
|
+
# Use the original MCP tool name for the server call, not the sanitized name
|
|
92
|
+
call_tool_result = await self.call_tool(server_name, original_tool_name, arguments)
|
|
93
|
+
return self._convert_call_tool_result(call_tool_result)
|
|
94
|
+
|
|
95
|
+
return StructuredTool(
|
|
96
|
+
name=tool.name,
|
|
97
|
+
description=tool.description or "",
|
|
98
|
+
args_schema=tool.inputSchema,
|
|
99
|
+
coroutine=call_mcp_tool,
|
|
100
|
+
response_format="content_and_artifact",
|
|
101
|
+
metadata=tool.annotations.model_dump() if tool.annotations else None,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
async def get_tools(self, server: str | None = None) -> list[StructuredTool]:
|
|
105
|
+
"""Get LangChain StructuredTools with smart caching.
|
|
106
|
+
|
|
107
|
+
Converts MCP tools to LangChain format and caches them for better performance
|
|
108
|
+
on repeated access. Cache is keyed by server parameter.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
server (str | None): Optional server name to filter tools. If None, returns all tools.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
list[StructuredTool]: List of cached LangChain StructuredTool instances
|
|
115
|
+
"""
|
|
116
|
+
if not self.is_initialized:
|
|
117
|
+
await self.initialize()
|
|
118
|
+
|
|
119
|
+
if server:
|
|
120
|
+
# Get tools from specific server with caching
|
|
121
|
+
server_tools = await self._get_server_tools_cached(server)
|
|
122
|
+
return server_tools.copy()
|
|
123
|
+
else:
|
|
124
|
+
# Get tools from all servers with efficient caching
|
|
125
|
+
all_tools = []
|
|
126
|
+
for server_name in self.servers.keys():
|
|
127
|
+
try:
|
|
128
|
+
server_tools = await self._get_server_tools_cached(server_name)
|
|
129
|
+
all_tools.extend(server_tools)
|
|
130
|
+
except Exception as e:
|
|
131
|
+
logger.warning(f"Failed to get tools from server '{server_name}': {e}")
|
|
132
|
+
|
|
133
|
+
logger.debug(f"Retrieved {len(all_tools)} total LangChain tools from {len(self.servers)} servers")
|
|
134
|
+
return all_tools
|
|
135
|
+
|
|
136
|
+
async def _get_server_tools_cached(self, server_name: str) -> list[StructuredTool]:
|
|
137
|
+
"""Get tools for a specific server with caching.
|
|
138
|
+
|
|
139
|
+
This method centralizes caching logic and ensures tools are only converted once per server.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
server_name (str): Name of the MCP server
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
list[StructuredTool]: List of cached StructuredTool instances for the server
|
|
146
|
+
"""
|
|
147
|
+
# Check cache first
|
|
148
|
+
if server_name in self._langchain_tools_cache:
|
|
149
|
+
logger.debug(f"Using cached LangChain tools for server '{server_name}'")
|
|
150
|
+
return self._langchain_tools_cache[server_name]
|
|
151
|
+
|
|
152
|
+
# Convert and cache tools for this server
|
|
153
|
+
logger.info(f"Converting and caching tools for server '{server_name}'")
|
|
154
|
+
mcp_tools = await self.get_raw_mcp_tools(server_name)
|
|
155
|
+
langchain_tools = []
|
|
156
|
+
|
|
157
|
+
for mcp_tool in mcp_tools:
|
|
158
|
+
langchain_tool = self._process_tool(mcp_tool, server_name)
|
|
159
|
+
langchain_tools.append(langchain_tool)
|
|
160
|
+
logger.info(
|
|
161
|
+
f"Converted MCP tool '{mcp_tool.name}' "
|
|
162
|
+
f"to LangChain tool '{langchain_tool.name}' "
|
|
163
|
+
f"for server '{server_name}'"
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
# Cache the converted tools
|
|
167
|
+
self._langchain_tools_cache[server_name] = langchain_tools
|
|
168
|
+
logger.debug(f"Cached {len(langchain_tools)} LangChain tools for server '{server_name}'")
|
|
169
|
+
|
|
170
|
+
return langchain_tools
|
|
171
|
+
|
|
172
|
+
async def _process_resource(self, resource: MCPResource) -> Any:
|
|
173
|
+
"""Converts an MCP resource into a Langchain Resource using persistent session.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
resource (MCPResource): The resource to convert.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Blob: The converted resource.
|
|
180
|
+
"""
|
|
181
|
+
# Determine server name from resource URI or use first available server
|
|
182
|
+
server_name = self._determine_server_name_for_resource(resource)
|
|
183
|
+
|
|
184
|
+
async def read_resource(uri: AnyUrl) -> str:
|
|
185
|
+
"""Read the actual content of the MCP resource using persistent session.
|
|
186
|
+
|
|
187
|
+
Note: This function is async for consistency with MCP operations, even though
|
|
188
|
+
the uri parameter is a synchronous AnyUrl object.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
uri (AnyUrl): The URI of the resource to read.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
str: The content of the resource as a string.
|
|
195
|
+
"""
|
|
196
|
+
try:
|
|
197
|
+
# Use base class method for persistent session resource access
|
|
198
|
+
resource_result = await self.read_resource(server_name, str(uri))
|
|
199
|
+
|
|
200
|
+
if not resource_result.contents:
|
|
201
|
+
raise ValueError(f"No contents found for resource {uri}")
|
|
202
|
+
|
|
203
|
+
contents = resource_result.contents[0]
|
|
204
|
+
if isinstance(contents, TextResourceContents):
|
|
205
|
+
return contents.text
|
|
206
|
+
elif isinstance(contents, BlobResourceContents):
|
|
207
|
+
return base64.b64decode(contents.blob)
|
|
208
|
+
else:
|
|
209
|
+
raise ValueError(f"Unsupported content type for URI {uri}")
|
|
210
|
+
except Exception as e:
|
|
211
|
+
logger.error(f"Failed to read MCP resource {uri}: {e}")
|
|
212
|
+
raise
|
|
213
|
+
|
|
214
|
+
return Blob.from_data(
|
|
215
|
+
await asyncio.wait_for(read_resource(resource.uri), timeout=self.RESOURCE_FETCH_TIMEOUT),
|
|
216
|
+
mime_type=resource.mime_type,
|
|
217
|
+
path=str(resource.uri),
|
|
218
|
+
metadata={"uri": resource.uri},
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
async def cleanup(self) -> None:
|
|
222
|
+
"""Cleanup LangChain MCP resources.
|
|
223
|
+
|
|
224
|
+
This method extends base class cleanup and clears the LangChain tool cache.
|
|
225
|
+
"""
|
|
226
|
+
logger.info("Cleaning up LangchainMCPClient resources")
|
|
227
|
+
try:
|
|
228
|
+
await super().cleanup()
|
|
229
|
+
except Exception as e:
|
|
230
|
+
logger.error(f"Error during base LangchainMCPClient cleanup: {e}", exc_info=True)
|
|
231
|
+
finally:
|
|
232
|
+
# Always clear the LangChain tools cache
|
|
233
|
+
self._langchain_tools_cache.clear()
|
|
234
|
+
logger.info("LangchainMCPClient cleanup complete")
|
|
235
|
+
|
|
236
|
+
def _convert_call_tool_result(
|
|
237
|
+
self,
|
|
238
|
+
call_tool_result: CallToolResult,
|
|
239
|
+
) -> tuple[str | list[str], list[NonTextContent] | None]:
|
|
240
|
+
"""Converts an MCP call tool result into a tuple of text and non-text contents.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
call_tool_result (CallToolResult): The call tool result to convert.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
tuple[str | list[str], list[NonTextContent] | None]: The converted call tool result.
|
|
247
|
+
"""
|
|
248
|
+
text_contents: list[TextContent] = []
|
|
249
|
+
non_text_contents = []
|
|
250
|
+
for content in call_tool_result.content:
|
|
251
|
+
if isinstance(content, TextContent):
|
|
252
|
+
text_contents.append(content)
|
|
253
|
+
else:
|
|
254
|
+
non_text_contents.append(content)
|
|
255
|
+
|
|
256
|
+
tool_content: str | list[str] = [content.text for content in text_contents]
|
|
257
|
+
if not text_contents:
|
|
258
|
+
tool_content = ""
|
|
259
|
+
elif len(text_contents) == 1:
|
|
260
|
+
tool_content = tool_content[0]
|
|
261
|
+
|
|
262
|
+
if call_tool_result.isError:
|
|
263
|
+
raise ToolException(tool_content)
|
|
264
|
+
|
|
265
|
+
return tool_content, non_text_contents if non_text_contents else None
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient as BaseMCPClient
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from gllm_tools.mcp.client.config import MCPConfiguration as MCPConfiguration
|
|
5
|
+
from langchain_core.tools import StructuredTool
|
|
6
|
+
from mcp.types import EmbeddedResource, ImageContent
|
|
7
|
+
|
|
8
|
+
NonTextContent = ImageContent | EmbeddedResource
|
|
9
|
+
logger: Incomplete
|
|
10
|
+
|
|
11
|
+
class LangchainMCPClient(BaseMCPClient):
|
|
12
|
+
"""Langchain MCP Client with Session Persistence.
|
|
13
|
+
|
|
14
|
+
This client extends BaseMCPClient to provide LangChain-specific tool conversion
|
|
15
|
+
while maintaining persistent MCP sessions and connection reuse across tool calls.
|
|
16
|
+
"""
|
|
17
|
+
RESOURCE_FETCH_TIMEOUT: int
|
|
18
|
+
def __init__(self, servers: dict[str, MCPConfiguration]) -> None:
|
|
19
|
+
"""Initialize LangChain MCP client.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
servers (dict[str, MCPConfiguration]): Dictionary of MCP server configurations
|
|
23
|
+
"""
|
|
24
|
+
async def initialize(self) -> None:
|
|
25
|
+
"""Initialize all sessions for LangChain client.
|
|
26
|
+
|
|
27
|
+
This method initializes the base MCP sessions and prepares for tool caching.
|
|
28
|
+
|
|
29
|
+
Raises:
|
|
30
|
+
Exception: If base initialization fails
|
|
31
|
+
"""
|
|
32
|
+
async def get_tools(self, server: str | None = None) -> list[StructuredTool]:
|
|
33
|
+
"""Get LangChain StructuredTools with smart caching.
|
|
34
|
+
|
|
35
|
+
Converts MCP tools to LangChain format and caches them for better performance
|
|
36
|
+
on repeated access. Cache is keyed by server parameter.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
server (str | None): Optional server name to filter tools. If None, returns all tools.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
list[StructuredTool]: List of cached LangChain StructuredTool instances
|
|
43
|
+
"""
|
|
44
|
+
async def cleanup(self) -> None:
|
|
45
|
+
"""Cleanup LangChain MCP resources.
|
|
46
|
+
|
|
47
|
+
This method extends base class cleanup and clears the LangChain tool cache.
|
|
48
|
+
"""
|