aip-agents-binary 0.4.8__cp312-cp312-win_amd64.whl → 0.5.4__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aip_agents/__init__.pyi +19 -0
- aip_agents/a2a/__init__.pyi +1 -1
- aip_agents/a2a/server/base_executor.pyi +6 -6
- aip_agents/a2a/server/google_adk_executor.pyi +11 -11
- aip_agents/a2a/server/langflow_executor.pyi +43 -0
- aip_agents/a2a/server/langgraph_executor.pyi +10 -11
- aip_agents/a2a/types.pyi +54 -47
- aip_agents/agent/__init__.pyi +3 -1
- aip_agents/agent/base_agent.pyi +24 -8
- aip_agents/agent/base_langgraph_agent.pyi +67 -25
- aip_agents/agent/google_adk_agent.pyi +34 -21
- aip_agents/agent/google_adk_constants.pyi +3 -0
- aip_agents/agent/hitl/__init__.pyi +6 -0
- aip_agents/agent/hitl/config.pyi +15 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
- aip_agents/agent/hitl/manager.pyi +199 -0
- aip_agents/agent/hitl/models.pyi +3 -0
- aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
- aip_agents/agent/hitl/prompt/base.pyi +24 -0
- aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
- aip_agents/agent/interface.pyi +5 -5
- aip_agents/agent/interfaces.pyi +44 -0
- aip_agents/agent/langflow_agent.pyi +133 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
- aip_agents/agent/langgraph_react_agent.pyi +50 -57
- aip_agents/agent/system_instruction_context.pyi +13 -0
- aip_agents/clients/__init__.pyi +4 -0
- aip_agents/clients/langflow/__init__.pyi +4 -0
- aip_agents/clients/langflow/client.pyi +140 -0
- aip_agents/clients/langflow/types.pyi +7 -0
- aip_agents/constants.pyi +1 -0
- aip_agents/examples/compare_streaming_client.pyi +48 -0
- aip_agents/examples/compare_streaming_server.pyi +18 -0
- aip_agents/examples/demo_memory_recall.pyi +58 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.pyi +2 -2
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +2 -2
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +2 -2
- aip_agents/examples/hello_world_a2a_google_adk_server.pyi +7 -2
- aip_agents/examples/hello_world_a2a_langchain_client.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +8 -3
- aip_agents/examples/hello_world_a2a_langchain_server.pyi +7 -2
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +7 -2
- aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
- aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +7 -2
- aip_agents/examples/hello_world_a2a_langgraph_client.pyi +2 -2
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +2 -2
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +3 -3
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +1 -1
- aip_agents/examples/hello_world_a2a_langgraph_server.pyi +7 -2
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +7 -2
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +7 -2
- aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +1 -1
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +31 -6
- aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +33 -5
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +1 -1
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +7 -2
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
- aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
- aip_agents/examples/hello_world_model_switch_cli.pyi +18 -3
- aip_agents/examples/hello_world_pii_logger.pyi +1 -1
- aip_agents/examples/hello_world_sentry.pyi +1 -1
- aip_agents/examples/hello_world_step_limits.pyi +17 -0
- aip_agents/examples/hello_world_stock_a2a_server.pyi +7 -2
- aip_agents/examples/hello_world_tool_output_client.pyi +1 -1
- aip_agents/examples/hello_world_tool_output_server.pyi +7 -2
- aip_agents/examples/hitl_demo.pyi +67 -0
- aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
- aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
- aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
- aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
- aip_agents/examples/tools/__init__.pyi +3 -1
- aip_agents/examples/tools/adk_weather_tool.pyi +1 -1
- aip_agents/examples/tools/data_visualization_tool.pyi +2 -0
- aip_agents/examples/tools/image_artifact_tool.pyi +2 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.pyi +7 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +0 -1
- aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +2 -0
- aip_agents/examples/tools/langchain_weather_tool.pyi +1 -1
- aip_agents/examples/tools/langgraph_streaming_tool.pyi +1 -1
- aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
- aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
- aip_agents/examples/tools/random_chart_tool.pyi +20 -0
- aip_agents/examples/tools/stock_tools.pyi +18 -3
- aip_agents/mcp/client/__init__.pyi +4 -3
- aip_agents/mcp/client/base_mcp_client.pyi +148 -0
- aip_agents/mcp/client/connection_manager.pyi +48 -0
- aip_agents/mcp/client/google_adk/__init__.pyi +1 -1
- aip_agents/mcp/client/google_adk/client.pyi +50 -13
- aip_agents/mcp/client/langchain/__init__.pyi +1 -1
- aip_agents/mcp/client/langchain/client.pyi +47 -2
- aip_agents/mcp/client/persistent_session.pyi +113 -0
- aip_agents/mcp/client/session_pool.pyi +101 -0
- aip_agents/mcp/client/transports.pyi +123 -0
- aip_agents/mcp/utils/__init__.pyi +0 -0
- aip_agents/mcp/utils/config_validator.pyi +82 -0
- aip_agents/memory/adapters/__init__.pyi +4 -0
- aip_agents/memory/adapters/base_adapter.pyi +150 -0
- aip_agents/memory/adapters/mem0.pyi +22 -0
- aip_agents/memory/base.pyi +3 -3
- aip_agents/memory/constants.pyi +9 -0
- aip_agents/memory/factory.pyi +1 -1
- aip_agents/memory/guidance.pyi +3 -0
- aip_agents/middleware/__init__.pyi +5 -0
- aip_agents/middleware/base.pyi +71 -0
- aip_agents/middleware/manager.pyi +80 -0
- aip_agents/middleware/todolist.pyi +125 -0
- aip_agents/schema/__init__.pyi +9 -0
- aip_agents/schema/a2a.pyi +40 -0
- aip_agents/schema/agent.pyi +65 -0
- aip_agents/schema/hitl.pyi +89 -0
- aip_agents/schema/langgraph.pyi +28 -0
- aip_agents/schema/model_id.pyi +54 -0
- aip_agents/schema/step_limit.pyi +63 -0
- aip_agents/schema/storage.pyi +21 -0
- aip_agents/sentry/__init__.pyi +1 -1
- aip_agents/sentry/sentry.pyi +2 -2
- aip_agents/storage/base.pyi +1 -2
- aip_agents/storage/config.pyi +9 -46
- aip_agents/storage/providers/base.pyi +2 -3
- aip_agents/storage/providers/object_storage.pyi +1 -1
- aip_agents/tools/__init__.pyi +1 -1
- aip_agents/tools/bosa_tools.pyi +2 -2
- aip_agents/tools/constants.pyi +105 -100
- aip_agents/tools/memory_search/__init__.pyi +5 -0
- aip_agents/tools/memory_search/base.pyi +69 -0
- aip_agents/tools/memory_search/mem0.pyi +19 -0
- aip_agents/tools/memory_search/schema.pyi +15 -0
- aip_agents/tools/memory_search_tool.pyi +3 -0
- aip_agents/types/__init__.pyi +19 -3
- aip_agents/types/a2a_events.pyi +2 -73
- aip_agents/utils/__init__.pyi +7 -2
- aip_agents/utils/a2a_connector.pyi +14 -4
- aip_agents/utils/artifact_helpers.pyi +26 -2
- aip_agents/utils/constants.pyi +10 -0
- aip_agents/utils/datetime/__init__.pyi +4 -0
- aip_agents/utils/datetime/normalization.pyi +95 -0
- aip_agents/utils/datetime/timezone.pyi +48 -0
- aip_agents/utils/env_loader.pyi +2 -2
- aip_agents/utils/event_handler_registry.pyi +23 -0
- aip_agents/utils/final_response_builder.pyi +34 -0
- aip_agents/utils/formatter_llm_client.pyi +71 -0
- aip_agents/utils/langgraph/converter.pyi +1 -1
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +2 -2
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +2 -3
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +14 -8
- aip_agents/utils/langgraph/tool_output_management.pyi +15 -2
- aip_agents/utils/logger.pyi +60 -0
- aip_agents/utils/metadata/__init__.pyi +5 -0
- aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
- aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
- aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
- aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
- aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
- aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
- aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
- aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
- aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
- aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
- aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
- aip_agents/utils/metadata_helper.pyi +50 -34
- aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +1 -2
- aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +1 -1
- aip_agents/utils/name_preprocessor/name_preprocessor.pyi +4 -4
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +1 -1
- aip_agents/utils/pii/__init__.pyi +5 -0
- aip_agents/utils/pii/pii_handler.pyi +86 -0
- aip_agents/utils/pii/pii_helper.pyi +69 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +62 -0
- aip_agents/utils/reference_helper.pyi +38 -6
- aip_agents/utils/sse_chunk_transformer.pyi +166 -0
- aip_agents/utils/step_limit_manager.pyi +112 -0
- aip_agents/utils/token_usage_helper.pyi +1 -1
- aip_agents.cp312-win_amd64.pyd +0 -0
- aip_agents.pyi +92 -34
- aip_agents_binary-0.5.4.dist-info/METADATA +649 -0
- aip_agents_binary-0.5.4.dist-info/RECORD +242 -0
- {aip_agents_binary-0.4.8.dist-info → aip_agents_binary-0.5.4.dist-info}/WHEEL +2 -1
- aip_agents_binary-0.5.4.dist-info/top_level.txt +1 -0
- aip_agents/agent/types.pyi +0 -109
- aip_agents/examples/hello_world_a2a_mem0_coordinator_client.pyi +0 -14
- aip_agents/examples/hello_world_a2a_mem0_coordinator_server.pyi +0 -10
- aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client.pyi +0 -19
- aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client_streaming.pyi +0 -9
- aip_agents/examples/hello_world_a2a_multi_agent_coordinator_server.pyi +0 -12
- aip_agents/examples/hello_world_langgraph_bosa.pyi +0 -5
- aip_agents/examples/hello_world_mem0_coordinator.pyi +0 -5
- aip_agents/examples/tools/pr_details_bosa_tool.pyi +0 -26
- aip_agents/memory/mem0_memory.pyi +0 -94
- aip_agents/tools/base.pyi +0 -44
- aip_agents/tools/base_bosa_tools.pyi +0 -12
- aip_agents/tools/bosa_connector.pyi +0 -30
- aip_agents/tools/bosa_tools_interface.pyi +0 -26
- aip_agents/utils/logger_manager.pyi +0 -151
- aip_agents.build/.gitignore +0 -1
- aip_agents_binary-0.4.8.dist-info/METADATA +0 -280
- aip_agents_binary-0.4.8.dist-info/RECORD +0 -166
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent import LangGraphAgent as LangGraphAgent
|
|
3
|
+
from aip_agents.examples.tools.pii_demo_tools import get_customer_info as get_customer_info, get_employee_data as get_employee_data, get_user_profile as get_user_profile
|
|
4
|
+
from aip_agents.utils.logger import LoggerManager as LoggerManager
|
|
5
|
+
from langchain_openai import ChatOpenAI
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
SERVER_AGENT_NAME: str
|
|
9
|
+
|
|
10
|
+
def create_specialist_agents(llm: ChatOpenAI) -> tuple[LangGraphAgent, LangGraphAgent, LangGraphAgent]:
|
|
11
|
+
"""Create Level 2 specialist agents with PII-returning tools.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
llm: The language model to use for the specialist agents.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
Tuple of (customer_service_agent, hr_agent, user_support_agent).
|
|
18
|
+
"""
|
|
19
|
+
def create_coordinator_agent(llm: ChatOpenAI, specialist_agents: tuple[LangGraphAgent, LangGraphAgent, LangGraphAgent]) -> LangGraphAgent:
|
|
20
|
+
"""Create Level 1 coordinator agent that orchestrates specialist agents.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
llm: The language model to use for the coordinator agent.
|
|
24
|
+
specialist_agents: Tuple of specialist agents.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
The configured coordinator agent.
|
|
28
|
+
"""
|
|
29
|
+
def main(host: str, port: int):
|
|
30
|
+
"""Runs the Multi-Agent PII Demo A2A server.
|
|
31
|
+
|
|
32
|
+
This server demonstrates PII handling across a multi-agent hierarchy:
|
|
33
|
+
- PII anonymization in tool outputs
|
|
34
|
+
- PII propagation from child agents to parent
|
|
35
|
+
- Multi-agent delegation with PII mapping merge
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
host: Host to bind the server to.
|
|
39
|
+
port: Port to bind the server to.
|
|
40
|
+
"""
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.agent import LangGraphReactAgent as LangGraphReactAgent
|
|
3
|
+
from aip_agents.examples.tools.serper_tool import MockGoogleSerperTool as MockGoogleSerperTool
|
|
4
|
+
from aip_agents.examples.tools.stock_tools import get_stock_price as get_stock_price
|
|
5
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
SERVER_AGENT_NAME: str
|
|
9
|
+
|
|
10
|
+
def main(host: str, port: int) -> None:
|
|
11
|
+
"""Run an A2A server with a planning-enabled LangGraphReactAgent.
|
|
12
|
+
|
|
13
|
+
The agent has TodoListMiddleware attached via planning=True and will
|
|
14
|
+
expose the write_todos_tool over A2A with token streaming enabled.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
host: The host to bind the server to.
|
|
18
|
+
port: The port to bind the server to.
|
|
19
|
+
"""
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
from aip_agents.examples.tools.adk_weather_tool import get_weather as weather_tool_adk
|
|
2
2
|
from aip_agents.examples.tools.langchain_weather_tool import weather_tool as weather_tool_langchain
|
|
3
3
|
from aip_agents.examples.tools.langgraph_streaming_tool import LangGraphStreamingTool as langgraph_streaming_tool
|
|
4
|
+
from aip_agents.examples.tools.mock_retrieval_tool import MockRetrievalTool as mock_retrieval_tool
|
|
5
|
+
from aip_agents.examples.tools.random_chart_tool import RandomChartTool as random_chart_tool
|
|
4
6
|
from aip_agents.examples.tools.serper_tool import MockGoogleSerperTool as google_serper_tool
|
|
5
7
|
from aip_agents.examples.tools.time_tool import TimeTool as time_tool
|
|
6
8
|
|
|
7
|
-
__all__ = ['weather_tool_langchain', 'weather_tool_adk', 'time_tool', 'google_serper_tool', 'langgraph_streaming_tool']
|
|
9
|
+
__all__ = ['weather_tool_langchain', 'weather_tool_adk', 'time_tool', 'google_serper_tool', 'langgraph_streaming_tool', 'mock_retrieval_tool', 'random_chart_tool']
|
|
@@ -3,6 +3,8 @@ from aip_agents.utils.artifact_helpers import create_artifact_response as create
|
|
|
3
3
|
from langchain_core.tools import BaseTool
|
|
4
4
|
from pydantic import BaseModel
|
|
5
5
|
|
|
6
|
+
PIL_AVAILABLE: bool
|
|
7
|
+
|
|
6
8
|
class ImageArtifactInput(BaseModel):
|
|
7
9
|
"""Input schema for image artifact tool."""
|
|
8
10
|
width: int
|
|
@@ -7,4 +7,11 @@ def add_numbers(a: int, b: int) -> str:
|
|
|
7
7
|
This is a self-contained LangChain tool.
|
|
8
8
|
For example:
|
|
9
9
|
add_numbers(a=5, b=3)
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
a (int): First number to add.
|
|
13
|
+
b (int): Second number to add.
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
str: Sum of the two numbers as a string.
|
|
10
17
|
"""
|
|
@@ -3,6 +3,8 @@ from aip_agents.utils.artifact_helpers import create_artifact_command as create_
|
|
|
3
3
|
from langchain_core.tools import BaseTool
|
|
4
4
|
from pydantic import BaseModel
|
|
5
5
|
|
|
6
|
+
PIL_AVAILABLE: bool
|
|
7
|
+
|
|
6
8
|
class GraphCommandInput(BaseModel):
|
|
7
9
|
"""Input schema for a tiny bar/line chart artifact tool.
|
|
8
10
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from aip_agents.agent.langgraph_react_agent import LangGraphReactAgent as LangGraphReactAgent
|
|
2
2
|
from aip_agents.examples.tools.langchain_weather_tool import weather_tool as weather_tool
|
|
3
3
|
from aip_agents.examples.tools.time_tool import TimeTool as TimeTool
|
|
4
|
-
from langchain_core.runnables import RunnableConfig
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
5
|
from langchain_core.tools import BaseTool
|
|
6
6
|
from pydantic import BaseModel
|
|
7
7
|
from typing import Any
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from langchain_core.tools import BaseTool
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
|
|
4
|
+
class MockRetrievalInput(BaseModel):
|
|
5
|
+
"""Input schema for the MockRetrievalTool."""
|
|
6
|
+
query: str
|
|
7
|
+
|
|
8
|
+
class MockRetrievalTool(BaseTool):
|
|
9
|
+
"""Mock tool that returns hardcoded references for testing."""
|
|
10
|
+
name: str
|
|
11
|
+
description: str
|
|
12
|
+
args_schema: type[BaseModel]
|
|
13
|
+
save_output_history: bool
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.utils.logger import LoggerManager as LoggerManager
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
logger: Incomplete
|
|
6
|
+
|
|
7
|
+
class CustomerIdSchema(BaseModel):
|
|
8
|
+
"""Schema for customer ID input."""
|
|
9
|
+
customer_id: str
|
|
10
|
+
|
|
11
|
+
class EmployeeIdSchema(BaseModel):
|
|
12
|
+
"""Schema for employee ID input."""
|
|
13
|
+
employee_id: str
|
|
14
|
+
|
|
15
|
+
class UserIdSchema(BaseModel):
|
|
16
|
+
"""Schema for user ID input."""
|
|
17
|
+
user_id: str
|
|
18
|
+
|
|
19
|
+
def get_customer_info(customer_id: str) -> str:
|
|
20
|
+
"""Gets customer information including email and phone number.
|
|
21
|
+
|
|
22
|
+
This tool demonstrates PII handling by returning sensitive customer data
|
|
23
|
+
that will be automatically anonymized by the PII handler.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
customer_id: The ID of the customer to retrieve information for.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
A string containing customer information with PII.
|
|
30
|
+
"""
|
|
31
|
+
def get_employee_data(employee_id: str) -> str:
|
|
32
|
+
"""Gets employee data including name, email, and salary information.
|
|
33
|
+
|
|
34
|
+
This tool demonstrates PII handling with employee-specific data that includes
|
|
35
|
+
sensitive information like salary and personal email addresses.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
employee_id: The ID of the employee to retrieve data for.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
A string containing employee information with PII.
|
|
42
|
+
"""
|
|
43
|
+
def get_user_profile(user_id: str) -> str:
|
|
44
|
+
"""Gets user profile information with personal details.
|
|
45
|
+
|
|
46
|
+
This tool demonstrates PII handling with user profile data that includes
|
|
47
|
+
personal information like email, phone, and date of birth.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
user_id: The ID of the user to retrieve profile for.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A string containing user profile information with PII.
|
|
54
|
+
"""
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from aip_agents.a2a.types import MimeType as MimeType
|
|
2
|
+
from aip_agents.utils.artifact_helpers import create_artifact_command as create_artifact_command
|
|
3
|
+
from langchain_core.tools import BaseTool
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
6
|
+
DEFAULT_RANDOM_CHART_TITLE: str
|
|
7
|
+
PIL_AVAILABLE: bool
|
|
8
|
+
|
|
9
|
+
class RandomChartInput(BaseModel):
|
|
10
|
+
"""Input schema for random chart generation."""
|
|
11
|
+
title: str
|
|
12
|
+
num_bars: int
|
|
13
|
+
min_value: int
|
|
14
|
+
max_value: int
|
|
15
|
+
|
|
16
|
+
class RandomChartTool(BaseTool):
|
|
17
|
+
"""Generate random bar chart images without relying on upstream data."""
|
|
18
|
+
name: str
|
|
19
|
+
description: str
|
|
20
|
+
args_schema: type[BaseModel]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from _typeshed import Incomplete
|
|
2
|
-
from aip_agents.utils.
|
|
2
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
3
3
|
from pydantic import BaseModel
|
|
4
4
|
from typing import Any
|
|
5
5
|
|
|
@@ -10,7 +10,14 @@ class StockPriceInput(BaseModel):
|
|
|
10
10
|
symbol: str
|
|
11
11
|
|
|
12
12
|
def get_stock_price(symbol: str) -> dict[str, Any]:
|
|
13
|
-
"""Get current stock price and performance data for a given symbol.
|
|
13
|
+
"""Get current stock price and performance data for a given symbol.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
symbol (str): The stock symbol (e.g., AAPL, MSFT) to get the price for.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
dict[str, Any]: Dictionary containing stock price and performance data.
|
|
20
|
+
"""
|
|
14
21
|
|
|
15
22
|
class StockNewsInput(BaseModel):
|
|
16
23
|
"""Input for the stock news tool."""
|
|
@@ -18,4 +25,12 @@ class StockNewsInput(BaseModel):
|
|
|
18
25
|
days: int
|
|
19
26
|
|
|
20
27
|
def get_stock_news(symbol: str, days: int = 7) -> dict[str, Any]:
|
|
21
|
-
"""Get recent news for a stock for a specified number of days.
|
|
28
|
+
"""Get recent news for a stock for a specified number of days.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
symbol (str): The stock symbol (e.g., AAPL, MSFT) to get news for.
|
|
32
|
+
days (int, optional): Number of days of news to retrieve. Defaults to 7.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
dict[str, Any]: Dictionary containing stock news data.
|
|
36
|
+
"""
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
from .
|
|
2
|
-
from .
|
|
1
|
+
from aip_agents.mcp.client.base_mcp_client import BaseMCPClient as BaseMCPClient
|
|
2
|
+
from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient as GoogleADKMCPClient
|
|
3
|
+
from aip_agents.mcp.client.langchain.client import LangchainMCPClient as LangchainMCPClient
|
|
3
4
|
|
|
4
|
-
__all__ = ['GoogleADKMCPClient', 'LangchainMCPClient']
|
|
5
|
+
__all__ = ['GoogleADKMCPClient', 'LangchainMCPClient', 'BaseMCPClient']
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from aip_agents.mcp.client.persistent_session import PersistentMCPSession as PersistentMCPSession
|
|
4
|
+
from aip_agents.mcp.client.session_pool import MCPSessionPool as MCPSessionPool
|
|
5
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
6
|
+
from gllm_tools.mcp.client.client import MCPClient
|
|
7
|
+
from gllm_tools.mcp.client.config import MCPConfiguration as MCPConfiguration
|
|
8
|
+
from mcp.types import CallToolResult, Tool as Tool
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
logger: Incomplete
|
|
12
|
+
|
|
13
|
+
class BaseMCPClient(MCPClient, ABC):
|
|
14
|
+
"""Base MCP Client with persistent session management for aip-agents.
|
|
15
|
+
|
|
16
|
+
This class provides:
|
|
17
|
+
- Persistent session management across tool calls
|
|
18
|
+
- One-time tool registration and caching
|
|
19
|
+
- Automatic connection health monitoring and reconnection
|
|
20
|
+
- Centralized cleanup of all MCP resources
|
|
21
|
+
- Generic tool discovery from all configured MCP servers
|
|
22
|
+
|
|
23
|
+
Subclasses should implement SDK-specific tool conversion in _process_tool() method.
|
|
24
|
+
"""
|
|
25
|
+
session_pool: Incomplete
|
|
26
|
+
def __init__(self, servers: dict[str, MCPConfiguration]) -> None:
|
|
27
|
+
"""Initialize the base MCP client with session pool.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
servers (dict[str, MCPConfiguration]): Dictionary of MCP server configurations by server name
|
|
31
|
+
"""
|
|
32
|
+
async def initialize(self) -> None:
|
|
33
|
+
"""Initialize all MCP sessions and cache tools once.
|
|
34
|
+
|
|
35
|
+
This method is idempotent and only performs initialization if not already done.
|
|
36
|
+
It establishes persistent connections to all configured MCP servers and caches
|
|
37
|
+
available tools for efficient access.
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
Exception: If any session initialization fails
|
|
41
|
+
"""
|
|
42
|
+
@abstractmethod
|
|
43
|
+
async def get_tools(self, server: str | None = None) -> list[Any]:
|
|
44
|
+
"""Get framework-specific tools from MCP servers.
|
|
45
|
+
|
|
46
|
+
This method must be implemented by subclasses to provide framework-specific
|
|
47
|
+
tool conversion (e.g., StructuredTool for LangChain, FunctionTool for Google ADK).
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
server (str | None): Optional server name to filter tools from a specific server.
|
|
51
|
+
If None, returns tools from all configured servers.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
list[Any]: List of framework-specific tool objects.
|
|
55
|
+
"""
|
|
56
|
+
async def get_raw_mcp_tools(self, server: str | None = None) -> list[Tool]:
|
|
57
|
+
"""Get raw MCP tools - for subclasses to perform framework-specific conversions.
|
|
58
|
+
|
|
59
|
+
This method provides access to the cached raw MCP Tool objects.
|
|
60
|
+
Subclasses use this to convert to framework-specific tools.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
server (str | None): Optional server name to filter tools from a specific server.
|
|
64
|
+
If None, returns tools from all configured servers.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
list[Tool]: List of raw MCP Tool objects. Empty list if not initialized or no tools available.
|
|
68
|
+
"""
|
|
69
|
+
def get_tools_count(self, server: str | None = None) -> int:
|
|
70
|
+
"""Get count of raw MCP tools without expensive copying.
|
|
71
|
+
|
|
72
|
+
This is an efficient way to get tool counts for logging/metrics
|
|
73
|
+
without the overhead of copying tool lists.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
server (str | None): Optional server name to filter tools from a specific server.
|
|
77
|
+
If None, returns count from all configured servers.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
int: Count of raw MCP tools available.
|
|
81
|
+
"""
|
|
82
|
+
async def get_session(self, server_name: str) -> PersistentMCPSession:
|
|
83
|
+
"""Get a persistent session for a specific server.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
server_name (str): The name of the MCP server
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
PersistentMCPSession: Persistent MCP session for the specified server
|
|
90
|
+
|
|
91
|
+
Raises:
|
|
92
|
+
KeyError: If the server is not configured or no active session exists
|
|
93
|
+
"""
|
|
94
|
+
async def call_tool(self, server_name: str, tool_name: str, arguments: dict[str, Any]) -> CallToolResult:
|
|
95
|
+
"""Execute a tool on a specific MCP server using persistent session.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
server_name (str): The MCP server to execute the tool on
|
|
99
|
+
tool_name (str): The name of the tool to execute
|
|
100
|
+
arguments (dict[str, Any]): Arguments for the tool execution
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
CallToolResult: The result of the tool execution
|
|
104
|
+
|
|
105
|
+
Raises:
|
|
106
|
+
KeyError: If the server doesn't exist
|
|
107
|
+
Exception: If tool execution fails
|
|
108
|
+
"""
|
|
109
|
+
async def read_resource(self, server_name: str, resource_uri: str):
|
|
110
|
+
"""Read an MCP resource from a specific server using persistent session.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
server_name (str): The MCP server to read the resource from
|
|
114
|
+
resource_uri (str): The URI of the resource to read
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
Any: The resource content
|
|
118
|
+
|
|
119
|
+
Raises:
|
|
120
|
+
KeyError: If the server doesn't exist
|
|
121
|
+
Exception: If resource reading fails
|
|
122
|
+
"""
|
|
123
|
+
async def cleanup(self) -> None:
|
|
124
|
+
"""Clean up all MCP resources and close sessions.
|
|
125
|
+
|
|
126
|
+
This method properly closes all persistent sessions and cleans up resources.
|
|
127
|
+
It can be called multiple times safely.
|
|
128
|
+
"""
|
|
129
|
+
@property
|
|
130
|
+
def is_initialized(self) -> bool:
|
|
131
|
+
"""Check if the client is fully initialized.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
bool: True if sessions are initialized and tools are cached, False otherwise
|
|
135
|
+
"""
|
|
136
|
+
@property
|
|
137
|
+
def active_sessions(self) -> dict[str, PersistentMCPSession]:
|
|
138
|
+
"""Get all active persistent sessions.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
dict[str, PersistentMCPSession]: Dictionary of active sessions by server name
|
|
142
|
+
"""
|
|
143
|
+
def get_session_count(self) -> int:
|
|
144
|
+
"""Get the number of active MCP sessions.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Number of active persistent sessions
|
|
148
|
+
"""
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from _typeshed import Incomplete
|
|
2
|
+
from aip_agents.mcp.client.transports import TransportType as TransportType, create_transport as create_transport
|
|
3
|
+
from aip_agents.utils.logger import get_logger as get_logger
|
|
4
|
+
from gllm_tools.mcp.client.config import MCPConfiguration
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
logger: Incomplete
|
|
8
|
+
|
|
9
|
+
class MCPConnectionManager:
|
|
10
|
+
"""Manages MCP connection lifecycle following mcp-use patterns.
|
|
11
|
+
|
|
12
|
+
This connection manager handles the transport connection lifecycle in a background
|
|
13
|
+
task to avoid cancel scope issues during cleanup. It supports automatic transport
|
|
14
|
+
negotiation (HTTP -> SSE fallback) and graceful shutdown. Invalid explicit transports
|
|
15
|
+
are normalized via aliases (e.g., 'streamable_http' -> 'http') or fall back to
|
|
16
|
+
auto-detection with a warning.
|
|
17
|
+
"""
|
|
18
|
+
TRANSPORT_ALIASES: Incomplete
|
|
19
|
+
server_name: Incomplete
|
|
20
|
+
config: Incomplete
|
|
21
|
+
transport_type: Incomplete
|
|
22
|
+
max_retries: Incomplete
|
|
23
|
+
initial_retry_delay: Incomplete
|
|
24
|
+
def __init__(self, server_name: str, config: MCPConfiguration) -> None:
|
|
25
|
+
"""Initialize connection manager.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
server_name (str): Name of the MCP server
|
|
29
|
+
config (MCPConfiguration): MCP server configuration
|
|
30
|
+
"""
|
|
31
|
+
async def start(self) -> tuple[Any, Any]:
|
|
32
|
+
"""Start connection in background task.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
tuple[Any, Any]: Tuple of (read_stream, write_stream) for ClientSession
|
|
36
|
+
|
|
37
|
+
Raises:
|
|
38
|
+
Exception: If connection establishment fails
|
|
39
|
+
"""
|
|
40
|
+
async def stop(self) -> None:
|
|
41
|
+
"""Stop connection gracefully."""
|
|
42
|
+
@property
|
|
43
|
+
def is_connected(self) -> bool:
|
|
44
|
+
"""Check if connection is active.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
bool: True if connected, False otherwise
|
|
48
|
+
"""
|
|
@@ -1,27 +1,29 @@
|
|
|
1
|
-
from
|
|
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
|
|
2
4
|
from gllm_tools.mcp.client.config import MCPConfiguration as MCPConfiguration
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from mcp.types import CallToolResult as CallToolResult, EmbeddedResource, ImageContent
|
|
5
|
+
from google.adk.tools import FunctionTool
|
|
6
|
+
from mcp.types import EmbeddedResource, ImageContent
|
|
6
7
|
|
|
7
8
|
NonTextContent = ImageContent | EmbeddedResource
|
|
9
|
+
logger: Incomplete
|
|
8
10
|
|
|
9
|
-
class GoogleADKMCPClient(
|
|
10
|
-
'''Google ADK MCP Client.
|
|
11
|
+
class GoogleADKMCPClient(BaseMCPClient):
|
|
12
|
+
'''Google ADK MCP Client with Persistent Sessions.
|
|
11
13
|
|
|
12
|
-
This client
|
|
13
|
-
|
|
14
|
-
|
|
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.
|
|
15
17
|
|
|
16
18
|
The client handles:
|
|
17
|
-
- Converting MCP tools to ADK FunctionTool instances
|
|
18
|
-
- Managing MCP server
|
|
19
|
+
- Converting MCP tools to ADK FunctionTool instances using persistent sessions
|
|
20
|
+
- Managing MCP server connections with automatic reconnection
|
|
19
21
|
- Converting MCP resources to ADK-compatible formats
|
|
20
|
-
- Handling tool execution
|
|
22
|
+
- Handling tool execution with proper error formatting for ADK agents
|
|
21
23
|
|
|
22
24
|
Example:
|
|
23
25
|
```python
|
|
24
|
-
from
|
|
26
|
+
from aip_agents.mcp.client.google_adk.client import GoogleADKMCPClient
|
|
25
27
|
from gllm_tools.mcp.client.config import MCPConfiguration
|
|
26
28
|
|
|
27
29
|
servers = {
|
|
@@ -32,7 +34,42 @@ class GoogleADKMCPClient(MCPClient):
|
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
client = GoogleADKMCPClient(servers)
|
|
37
|
+
await client.initialize() # Initialize persistent sessions
|
|
35
38
|
tools = await client.get_tools() # Returns list of ADK FunctionTool instances
|
|
36
39
|
```
|
|
37
40
|
'''
|
|
38
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
|
+
"""
|
|
@@ -1,3 +1,48 @@
|
|
|
1
|
-
from
|
|
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
|
|
2
7
|
|
|
3
|
-
|
|
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
|
+
"""
|