aip-agents-binary 0.5.20__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.
- aip_agents/__init__.py +65 -0
- aip_agents/a2a/__init__.py +19 -0
- aip_agents/a2a/server/__init__.py +10 -0
- aip_agents/a2a/server/base_executor.py +1086 -0
- aip_agents/a2a/server/google_adk_executor.py +198 -0
- aip_agents/a2a/server/langflow_executor.py +180 -0
- aip_agents/a2a/server/langgraph_executor.py +270 -0
- aip_agents/a2a/types.py +232 -0
- aip_agents/agent/__init__.py +27 -0
- aip_agents/agent/base_agent.py +970 -0
- aip_agents/agent/base_langgraph_agent.py +2942 -0
- aip_agents/agent/google_adk_agent.py +926 -0
- aip_agents/agent/google_adk_constants.py +6 -0
- aip_agents/agent/hitl/__init__.py +24 -0
- aip_agents/agent/hitl/config.py +28 -0
- aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
- aip_agents/agent/hitl/manager.py +532 -0
- aip_agents/agent/hitl/models.py +18 -0
- aip_agents/agent/hitl/prompt/__init__.py +9 -0
- aip_agents/agent/hitl/prompt/base.py +42 -0
- aip_agents/agent/hitl/prompt/deferred.py +73 -0
- aip_agents/agent/hitl/registry.py +149 -0
- aip_agents/agent/interface.py +138 -0
- aip_agents/agent/interfaces.py +65 -0
- aip_agents/agent/langflow_agent.py +464 -0
- aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
- aip_agents/agent/langgraph_react_agent.py +2514 -0
- aip_agents/agent/system_instruction_context.py +34 -0
- aip_agents/clients/__init__.py +10 -0
- aip_agents/clients/langflow/__init__.py +10 -0
- aip_agents/clients/langflow/client.py +477 -0
- aip_agents/clients/langflow/types.py +18 -0
- aip_agents/constants.py +23 -0
- aip_agents/credentials/manager.py +132 -0
- aip_agents/examples/__init__.py +5 -0
- aip_agents/examples/compare_streaming_client.py +783 -0
- aip_agents/examples/compare_streaming_server.py +142 -0
- aip_agents/examples/demo_memory_recall.py +401 -0
- aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
- aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
- aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
- aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
- aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
- aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
- aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
- aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
- aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
- aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
- aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
- aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
- aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -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_server.py +251 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
- aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
- aip_agents/examples/hello_world_google_adk.py +41 -0
- aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
- aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
- aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
- aip_agents/examples/hello_world_google_adk_stream.py +44 -0
- aip_agents/examples/hello_world_langchain.py +28 -0
- aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
- aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
- aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
- aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
- aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
- aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
- aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
- aip_agents/examples/hello_world_langchain_stream.py +36 -0
- aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
- aip_agents/examples/hello_world_langflow_agent.py +163 -0
- aip_agents/examples/hello_world_langgraph.py +39 -0
- aip_agents/examples/hello_world_langgraph_bosa_twitter.py +41 -0
- aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
- aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
- aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
- aip_agents/examples/hello_world_langgraph_stream.py +43 -0
- aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
- aip_agents/examples/hello_world_model_switch_cli.py +210 -0
- aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
- aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
- aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
- aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
- aip_agents/examples/hello_world_pii_logger.py +21 -0
- aip_agents/examples/hello_world_sentry.py +133 -0
- aip_agents/examples/hello_world_step_limits.py +273 -0
- aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
- aip_agents/examples/hello_world_tool_output_client.py +46 -0
- aip_agents/examples/hello_world_tool_output_server.py +114 -0
- aip_agents/examples/hitl_demo.py +724 -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_server.py +126 -0
- aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
- aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
- aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
- aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
- aip_agents/examples/tools/__init__.py +27 -0
- aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
- aip_agents/examples/tools/adk_weather_tool.py +60 -0
- aip_agents/examples/tools/data_generator_tool.py +103 -0
- aip_agents/examples/tools/data_visualization_tool.py +312 -0
- aip_agents/examples/tools/image_artifact_tool.py +136 -0
- aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
- aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
- aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
- aip_agents/examples/tools/langchain_weather_tool.py +48 -0
- aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
- aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
- aip_agents/examples/tools/pii_demo_tools.py +189 -0
- aip_agents/examples/tools/random_chart_tool.py +142 -0
- aip_agents/examples/tools/serper_tool.py +202 -0
- aip_agents/examples/tools/stock_tools.py +82 -0
- aip_agents/examples/tools/table_generator_tool.py +167 -0
- aip_agents/examples/tools/time_tool.py +82 -0
- aip_agents/examples/tools/weather_forecast_tool.py +38 -0
- aip_agents/executor/agent_executor.py +473 -0
- aip_agents/executor/base.py +48 -0
- aip_agents/mcp/__init__.py +1 -0
- aip_agents/mcp/client/__init__.py +14 -0
- aip_agents/mcp/client/base_mcp_client.py +369 -0
- aip_agents/mcp/client/connection_manager.py +193 -0
- aip_agents/mcp/client/google_adk/__init__.py +11 -0
- aip_agents/mcp/client/google_adk/client.py +381 -0
- aip_agents/mcp/client/langchain/__init__.py +11 -0
- aip_agents/mcp/client/langchain/client.py +265 -0
- aip_agents/mcp/client/persistent_session.py +359 -0
- aip_agents/mcp/client/session_pool.py +351 -0
- aip_agents/mcp/client/transports.py +215 -0
- aip_agents/mcp/utils/__init__.py +7 -0
- aip_agents/mcp/utils/config_validator.py +139 -0
- aip_agents/memory/__init__.py +14 -0
- aip_agents/memory/adapters/__init__.py +10 -0
- aip_agents/memory/adapters/base_adapter.py +717 -0
- aip_agents/memory/adapters/mem0.py +84 -0
- aip_agents/memory/base.py +84 -0
- aip_agents/memory/constants.py +49 -0
- aip_agents/memory/factory.py +86 -0
- aip_agents/memory/guidance.py +20 -0
- aip_agents/memory/simple_memory.py +47 -0
- aip_agents/middleware/__init__.py +17 -0
- aip_agents/middleware/base.py +88 -0
- aip_agents/middleware/manager.py +128 -0
- aip_agents/middleware/todolist.py +274 -0
- aip_agents/schema/__init__.py +69 -0
- aip_agents/schema/a2a.py +56 -0
- aip_agents/schema/agent.py +111 -0
- aip_agents/schema/hitl.py +157 -0
- aip_agents/schema/langgraph.py +37 -0
- aip_agents/schema/model_id.py +97 -0
- aip_agents/schema/step_limit.py +108 -0
- aip_agents/schema/storage.py +40 -0
- aip_agents/sentry/__init__.py +11 -0
- aip_agents/sentry/sentry.py +151 -0
- aip_agents/storage/__init__.py +41 -0
- aip_agents/storage/base.py +85 -0
- aip_agents/storage/clients/__init__.py +12 -0
- aip_agents/storage/clients/minio_client.py +318 -0
- aip_agents/storage/config.py +62 -0
- aip_agents/storage/providers/__init__.py +15 -0
- aip_agents/storage/providers/base.py +106 -0
- aip_agents/storage/providers/memory.py +114 -0
- aip_agents/storage/providers/object_storage.py +214 -0
- aip_agents/tools/__init__.py +33 -0
- aip_agents/tools/bosa_tools.py +105 -0
- aip_agents/tools/browser_use/__init__.py +82 -0
- aip_agents/tools/browser_use/action_parser.py +103 -0
- aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
- aip_agents/tools/browser_use/llm_config.py +120 -0
- aip_agents/tools/browser_use/minio_storage.py +198 -0
- aip_agents/tools/browser_use/schemas.py +119 -0
- aip_agents/tools/browser_use/session.py +76 -0
- aip_agents/tools/browser_use/session_errors.py +132 -0
- aip_agents/tools/browser_use/steel_session_recording.py +317 -0
- aip_agents/tools/browser_use/streaming.py +813 -0
- aip_agents/tools/browser_use/structured_data_parser.py +257 -0
- aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
- aip_agents/tools/browser_use/types.py +78 -0
- aip_agents/tools/code_sandbox/__init__.py +26 -0
- aip_agents/tools/code_sandbox/constant.py +13 -0
- aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
- aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
- aip_agents/tools/constants.py +165 -0
- aip_agents/tools/document_loader/__init__.py +44 -0
- aip_agents/tools/document_loader/base_reader.py +302 -0
- aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
- aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
- aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
- aip_agents/tools/document_loader/pdf_splitter.py +169 -0
- aip_agents/tools/gl_connector/__init__.py +5 -0
- aip_agents/tools/gl_connector/tool.py +351 -0
- aip_agents/tools/memory_search/__init__.py +22 -0
- aip_agents/tools/memory_search/base.py +200 -0
- aip_agents/tools/memory_search/mem0.py +258 -0
- aip_agents/tools/memory_search/schema.py +48 -0
- aip_agents/tools/memory_search_tool.py +26 -0
- aip_agents/tools/time_tool.py +117 -0
- aip_agents/tools/tool_config_injector.py +300 -0
- aip_agents/tools/web_search/__init__.py +15 -0
- aip_agents/tools/web_search/serper_tool.py +187 -0
- aip_agents/types/__init__.py +70 -0
- aip_agents/types/a2a_events.py +13 -0
- aip_agents/utils/__init__.py +79 -0
- aip_agents/utils/a2a_connector.py +1757 -0
- aip_agents/utils/artifact_helpers.py +502 -0
- aip_agents/utils/constants.py +22 -0
- aip_agents/utils/datetime/__init__.py +34 -0
- aip_agents/utils/datetime/normalization.py +231 -0
- aip_agents/utils/datetime/timezone.py +206 -0
- aip_agents/utils/env_loader.py +27 -0
- aip_agents/utils/event_handler_registry.py +58 -0
- aip_agents/utils/file_prompt_utils.py +176 -0
- aip_agents/utils/final_response_builder.py +211 -0
- aip_agents/utils/formatter_llm_client.py +231 -0
- aip_agents/utils/langgraph/__init__.py +19 -0
- aip_agents/utils/langgraph/converter.py +128 -0
- aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
- aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
- aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
- aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
- aip_agents/utils/langgraph/tool_output_management.py +967 -0
- aip_agents/utils/logger.py +195 -0
- aip_agents/utils/metadata/__init__.py +27 -0
- aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
- aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
- aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
- aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
- aip_agents/utils/metadata/activity_narrative/context.py +49 -0
- aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
- aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
- aip_agents/utils/metadata/schemas/__init__.py +16 -0
- aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
- aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
- aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
- aip_agents/utils/metadata_helper.py +358 -0
- aip_agents/utils/name_preprocessor/__init__.py +17 -0
- aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
- aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
- aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
- aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
- aip_agents/utils/pii/__init__.py +25 -0
- aip_agents/utils/pii/pii_handler.py +397 -0
- aip_agents/utils/pii/pii_helper.py +207 -0
- aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
- aip_agents/utils/reference_helper.py +273 -0
- aip_agents/utils/sse_chunk_transformer.py +831 -0
- aip_agents/utils/step_limit_manager.py +265 -0
- aip_agents/utils/token_usage_helper.py +156 -0
- aip_agents_binary-0.5.20.dist-info/METADATA +681 -0
- aip_agents_binary-0.5.20.dist-info/RECORD +280 -0
- aip_agents_binary-0.5.20.dist-info/WHEEL +5 -0
- aip_agents_binary-0.5.20.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Example of a General Assistant LangChainAgent that delegates time and weather tasks to specialized agents.
|
|
2
|
+
|
|
3
|
+
This example demonstrates:
|
|
4
|
+
1. Configuring A2A settings for a client agent to connect to time/weather services.
|
|
5
|
+
2. Creating a general assistant agent that can help with time and weather queries.
|
|
6
|
+
3. Delegating specific time and weather tasks to specialized agents via A2A with streaming.
|
|
7
|
+
4. Handling streaming responses from time and weather tasks.
|
|
8
|
+
5. Real-time display of time and weather information and agent thinking process.
|
|
9
|
+
|
|
10
|
+
The client requests the time/weather agent to get current time and weather forecast,
|
|
11
|
+
demonstrating streaming capabilities of the LangGraph agent wrapper.
|
|
12
|
+
|
|
13
|
+
To run this example:
|
|
14
|
+
1. First start the time/weather agent server:
|
|
15
|
+
python examples/hello_world_a2a_langgraph_server_tool_streaming.py --port 8003
|
|
16
|
+
2. Then run this client:
|
|
17
|
+
python examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py
|
|
18
|
+
|
|
19
|
+
Environment Variables Required:
|
|
20
|
+
OPENAI_API_KEY: OpenAI API key for the LLM
|
|
21
|
+
|
|
22
|
+
Authors:
|
|
23
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
import asyncio
|
|
27
|
+
from pprint import pprint
|
|
28
|
+
|
|
29
|
+
from aip_agents.agent import LangChainAgent
|
|
30
|
+
from aip_agents.schema.agent import A2AClientConfig
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def main():
|
|
34
|
+
"""Main function demonstrating the General Assistant agent with streaming A2A time/weather capabilities."""
|
|
35
|
+
print("🚀 Starting Time & Weather Agent Client Demo")
|
|
36
|
+
print("=" * 60)
|
|
37
|
+
|
|
38
|
+
# Create a general assistant agent
|
|
39
|
+
agent = LangChainAgent(
|
|
40
|
+
name="TimeWeatherAssistantAgentLangChain",
|
|
41
|
+
instruction="""You are a helpful assistant that can help with various tasks
|
|
42
|
+
by delegating to specialized agents. You have access to time and weather
|
|
43
|
+
agents that can provide current time information and weather data
|
|
44
|
+
for specific cities.
|
|
45
|
+
|
|
46
|
+
When users ask for time or weather-related tasks, delegate them to the
|
|
47
|
+
time/weather agent. Provide clear summaries of the results and help
|
|
48
|
+
interpret the information that's provided.""",
|
|
49
|
+
model="openai/gpt-4o",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Configure A2A client to discover time/weather agents
|
|
53
|
+
client_a2a_config = A2AClientConfig(
|
|
54
|
+
discovery_urls=["http://localhost:8003"], # Time/weather agent server
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
print("🔍 Discovering available time & weather agents...")
|
|
58
|
+
try:
|
|
59
|
+
agent_cards = agent.discover_agents(client_a2a_config)
|
|
60
|
+
|
|
61
|
+
if not agent_cards:
|
|
62
|
+
print("❌ No time & weather agents found!")
|
|
63
|
+
print(" Make sure the agent server is running on http://localhost:8003")
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
print(f"✅ Found {len(agent_cards)} time & weather agent(s)")
|
|
67
|
+
|
|
68
|
+
for i, card in enumerate(agent_cards):
|
|
69
|
+
print(f" {i + 1}. {card.name}: {card.description}")
|
|
70
|
+
if card.skills:
|
|
71
|
+
print(f" Skills: {', '.join([skill.name for skill in card.skills])}")
|
|
72
|
+
|
|
73
|
+
task = "what time is it and what is the weather in jakarta?"
|
|
74
|
+
|
|
75
|
+
print(f"📝 Task: {task}")
|
|
76
|
+
|
|
77
|
+
async for chunk in agent.astream_to_agent(agent_card=agent_cards[0], message=task):
|
|
78
|
+
print("-" * 40)
|
|
79
|
+
pprint(chunk)
|
|
80
|
+
|
|
81
|
+
print("\n" + "=" * 60)
|
|
82
|
+
print("\n🎉 Time & Weather agent task finished!")
|
|
83
|
+
|
|
84
|
+
except Exception as e:
|
|
85
|
+
print(f"❌ Error during time & weather query: {str(e)}")
|
|
86
|
+
print(" Make sure:")
|
|
87
|
+
print(" 1. The time & weather server is running (python hello_world_a2a_langgraph_server_agent_wrapper.py)")
|
|
88
|
+
print(" 2. OPENAI_API_KEY is set in your environment")
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == "__main__":
|
|
92
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Example A2A server for a LangGraphAgent Weather Service.
|
|
2
|
+
|
|
3
|
+
This server instantiates a LangGraphAgent with weather lookup capabilities and serves it
|
|
4
|
+
via the A2A protocol using the proper A2A server setup with LangGraphA2AExecutor.
|
|
5
|
+
|
|
6
|
+
To run this server:
|
|
7
|
+
python examples/hello_world_a2a_langgraph_server.py
|
|
8
|
+
|
|
9
|
+
It will listen on http://localhost:8001 by default.
|
|
10
|
+
|
|
11
|
+
Authors:
|
|
12
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
13
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import click
|
|
17
|
+
import uvicorn
|
|
18
|
+
from a2a.types import AgentCapabilities, AgentCard, AgentSkill
|
|
19
|
+
from langchain_openai import ChatOpenAI
|
|
20
|
+
|
|
21
|
+
from aip_agents.agent import LangGraphAgent
|
|
22
|
+
from aip_agents.examples.tools import weather_tool_langchain as weather_tool
|
|
23
|
+
from aip_agents.utils.logger import get_logger
|
|
24
|
+
|
|
25
|
+
logger = get_logger(__name__)
|
|
26
|
+
|
|
27
|
+
SERVER_AGENT_NAME = "WeatherAgent"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@click.command()
|
|
31
|
+
@click.option("--host", "host", default="localhost", help="Host to bind the server to.")
|
|
32
|
+
@click.option("--port", "port", default=8001, help="Port to bind the server to.")
|
|
33
|
+
def main(host: str, port: int):
|
|
34
|
+
"""Runs the LangGraph Weather A2A server.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
host (str): Host to bind the server to.
|
|
38
|
+
port (int): Port to bind the server to.
|
|
39
|
+
"""
|
|
40
|
+
logger.info(f"Starting {SERVER_AGENT_NAME} on http://{host}:{port}")
|
|
41
|
+
|
|
42
|
+
agent_card = AgentCard(
|
|
43
|
+
name=SERVER_AGENT_NAME,
|
|
44
|
+
description="A weather agent that provides weather information for cities.",
|
|
45
|
+
url=f"http://{host}:{port}",
|
|
46
|
+
version="1.0.0",
|
|
47
|
+
defaultInputModes=["text"],
|
|
48
|
+
defaultOutputModes=["text"],
|
|
49
|
+
capabilities=AgentCapabilities(streaming=True),
|
|
50
|
+
skills=[
|
|
51
|
+
AgentSkill(
|
|
52
|
+
id="weather",
|
|
53
|
+
name="Weather Lookup",
|
|
54
|
+
description="Provides current weather information for cities.",
|
|
55
|
+
examples=["What's the weather in Tokyo?", "Get weather for London"],
|
|
56
|
+
tags=["weather"],
|
|
57
|
+
)
|
|
58
|
+
],
|
|
59
|
+
tags=["weather"],
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
llm = ChatOpenAI(model="gpt-4.1", temperature=0, streaming=True)
|
|
63
|
+
tools = [weather_tool]
|
|
64
|
+
|
|
65
|
+
langgraph_agent = LangGraphAgent(
|
|
66
|
+
name=SERVER_AGENT_NAME,
|
|
67
|
+
instruction=(
|
|
68
|
+
"You are a weather agent that provides weather information for cities. "
|
|
69
|
+
"Always use the weather_tool for looking up weather data. "
|
|
70
|
+
"Format your responses clearly and professionally."
|
|
71
|
+
),
|
|
72
|
+
model=llm,
|
|
73
|
+
tools=tools,
|
|
74
|
+
enable_a2a_token_streaming=True,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
app = langgraph_agent.to_a2a(agent_card=agent_card)
|
|
78
|
+
|
|
79
|
+
logger.info("A2A application configured. Starting Uvicorn server...")
|
|
80
|
+
uvicorn.run(app, host=host, port=port)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if __name__ == "__main__":
|
|
84
|
+
main()
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""Example A2A server for a LangChainAgent Weather Service.
|
|
2
|
+
|
|
3
|
+
This server instantiates a LangChainAgent with weather lookup capabilities and serves it
|
|
4
|
+
via the A2A protocol using the to_a2a convenience method.
|
|
5
|
+
|
|
6
|
+
To run this server:
|
|
7
|
+
python examples/a2a/langchain_server_example.py
|
|
8
|
+
|
|
9
|
+
It will listen on http://localhost:8001 by default.
|
|
10
|
+
|
|
11
|
+
Authors:
|
|
12
|
+
Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
|
|
13
|
+
Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import click
|
|
17
|
+
import uvicorn
|
|
18
|
+
from a2a.types import AgentCapabilities, AgentCard, AgentSkill
|
|
19
|
+
|
|
20
|
+
from aip_agents.agent import LangChainAgent
|
|
21
|
+
from aip_agents.examples.tools.langchain_weather_tool import weather_tool
|
|
22
|
+
from aip_agents.utils.logger import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
SERVER_AGENT_NAME = "WeatherAgentLangChain"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@click.command()
|
|
31
|
+
@click.option("--host", "host", default="localhost", help="Host to bind the server to.")
|
|
32
|
+
@click.option("--port", "port", default=8001, help="Port to bind the server to.")
|
|
33
|
+
def main(host: str, port: int):
|
|
34
|
+
"""Runs the LangChain Weather A2A server.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
host (str): Host to bind the server to.
|
|
38
|
+
port (int): Port to bind the server to.
|
|
39
|
+
"""
|
|
40
|
+
logger.info(f"Starting {SERVER_AGENT_NAME} on http://{host}:{port}")
|
|
41
|
+
|
|
42
|
+
agent_card = AgentCard(
|
|
43
|
+
name=SERVER_AGENT_NAME,
|
|
44
|
+
description="A weather agent that provides weather information for cities",
|
|
45
|
+
url=f"http://{host}:{port}",
|
|
46
|
+
version="1.0.0",
|
|
47
|
+
defaultInputModes=["text"],
|
|
48
|
+
defaultOutputModes=["text"],
|
|
49
|
+
capabilities=AgentCapabilities(streaming=True),
|
|
50
|
+
skills=[
|
|
51
|
+
AgentSkill(
|
|
52
|
+
id="weather",
|
|
53
|
+
name="Weather Lookup",
|
|
54
|
+
description="Provides current weather information for cities.",
|
|
55
|
+
examples=["What's the weather in Tokyo?", "Get weather for London"],
|
|
56
|
+
tags=["weather"],
|
|
57
|
+
)
|
|
58
|
+
],
|
|
59
|
+
tags=["weather"],
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
langchain_agent = LangChainAgent(
|
|
63
|
+
name=SERVER_AGENT_NAME,
|
|
64
|
+
instruction="""You are a weather agent that provides weather information for cities.
|
|
65
|
+
Always use the weather_tool for looking up weather data. Format your responses clearly and professionally.""",
|
|
66
|
+
model="openai/gpt-4o",
|
|
67
|
+
tools=[weather_tool],
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
app = langchain_agent.to_a2a(
|
|
71
|
+
agent_card=agent_card,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
uvicorn.run(app, host=host, port=port)
|
|
75
|
+
logger.info("A2A application configured. Starting Uvicorn server...")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
if __name__ == "__main__":
|
|
79
|
+
main()
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""Example A2A server for a LangGraph Agent Wrapper Service.
|
|
2
|
+
|
|
3
|
+
This server instantiates a LangChainAgent with the LangGraph agent wrapper tool that provides
|
|
4
|
+
time and weather forecast capabilities, and serves it via the A2A protocol with streaming support.
|
|
5
|
+
|
|
6
|
+
The agent can handle time queries and weather forecast requests for any day of the week.
|
|
7
|
+
|
|
8
|
+
To run this server:
|
|
9
|
+
python examples/hello_world_a2a_langgraph_server_tool_streaming.py
|
|
10
|
+
|
|
11
|
+
It will listen on http://localhost:8003 by default.
|
|
12
|
+
|
|
13
|
+
Environment Variables Required:
|
|
14
|
+
OPENAI_API_KEY: OpenAI API key for the LLM
|
|
15
|
+
|
|
16
|
+
Authors:
|
|
17
|
+
Fachriza Adhiatma (fachriza.d.adhiatma@gdplabs.id)
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import click
|
|
21
|
+
import uvicorn
|
|
22
|
+
from a2a.types import AgentCapabilities, AgentCard, AgentSkill
|
|
23
|
+
from dotenv import load_dotenv
|
|
24
|
+
|
|
25
|
+
from aip_agents.agent import LangChainAgent
|
|
26
|
+
from aip_agents.examples.tools.langgraph_streaming_tool import LangGraphStreamingTool
|
|
27
|
+
from aip_agents.utils.logger import get_logger
|
|
28
|
+
|
|
29
|
+
load_dotenv()
|
|
30
|
+
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
SERVER_AGENT_NAME = "TimeWeatherAgentLangGraph"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@click.command()
|
|
37
|
+
@click.option("--host", "host", default="localhost", help="Host to bind the server to.")
|
|
38
|
+
@click.option("--port", "port", default=8003, help="Port to bind the server to.")
|
|
39
|
+
def main(host: str, port: int):
|
|
40
|
+
"""Runs the LangGraph Agent Wrapper A2A server.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
host (str): Host to bind the server to.
|
|
44
|
+
port (int): Port to bind the server to.
|
|
45
|
+
"""
|
|
46
|
+
logger.info(f"Starting {SERVER_AGENT_NAME} on http://{host}:{port}")
|
|
47
|
+
|
|
48
|
+
# ruff: noqa: E501
|
|
49
|
+
agent_card = AgentCard(
|
|
50
|
+
name=SERVER_AGENT_NAME,
|
|
51
|
+
description="A time and weather agent that can provide current time information and weather data for specific cities",
|
|
52
|
+
url=f"http://{host}:{port}",
|
|
53
|
+
version="1.0.0",
|
|
54
|
+
defaultInputModes=["text"],
|
|
55
|
+
defaultOutputModes=["text"],
|
|
56
|
+
capabilities=AgentCapabilities(streaming=True),
|
|
57
|
+
skills=[
|
|
58
|
+
AgentSkill(
|
|
59
|
+
id="time_queries",
|
|
60
|
+
name="Time Information",
|
|
61
|
+
description="Provides current time and date information in various formats.",
|
|
62
|
+
examples=[
|
|
63
|
+
"What time is it now?",
|
|
64
|
+
"Get the current date and time",
|
|
65
|
+
"Show me the time in ISO format",
|
|
66
|
+
"What's the current timestamp?",
|
|
67
|
+
],
|
|
68
|
+
tags=["time", "date", "timestamp"],
|
|
69
|
+
),
|
|
70
|
+
AgentSkill(
|
|
71
|
+
id="weather_info",
|
|
72
|
+
name="Weather Information",
|
|
73
|
+
description="Provides weather information for specific cities.",
|
|
74
|
+
examples=[
|
|
75
|
+
"What's the weather in Jakarta?",
|
|
76
|
+
"Weather in Tokyo and Singapore",
|
|
77
|
+
"Check weather for New York",
|
|
78
|
+
"Get weather for London",
|
|
79
|
+
],
|
|
80
|
+
tags=["weather", "city", "location"],
|
|
81
|
+
),
|
|
82
|
+
AgentSkill(
|
|
83
|
+
id="combined_queries",
|
|
84
|
+
name="Time and Weather Combined",
|
|
85
|
+
description="Handles queries that combine both time and weather information.",
|
|
86
|
+
examples=[
|
|
87
|
+
"What time is it and what's the weather in Jakarta?",
|
|
88
|
+
"Current time and weather in Tokyo",
|
|
89
|
+
"Tell me the time and weather for Singapore",
|
|
90
|
+
],
|
|
91
|
+
tags=["time", "weather", "combined"],
|
|
92
|
+
),
|
|
93
|
+
],
|
|
94
|
+
tags=["time", "weather", "assistant"],
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Create the LangGraph streaming tool instance
|
|
98
|
+
streaming_tool = LangGraphStreamingTool()
|
|
99
|
+
|
|
100
|
+
langchain_agent = LangChainAgent(
|
|
101
|
+
name=SERVER_AGENT_NAME,
|
|
102
|
+
instruction="""You are a helpful time and weather assistant.
|
|
103
|
+
|
|
104
|
+
You can provide current time information and weather forecasts.
|
|
105
|
+
|
|
106
|
+
You have access to a specialized LangGraph agent that can:
|
|
107
|
+
- Get the current time and date in various formats
|
|
108
|
+
- Provide weather information for specific cities (Jakarta, Singapore, Tokyo, London, New York)
|
|
109
|
+
- Handle combined time and weather queries
|
|
110
|
+
|
|
111
|
+
When given a task:
|
|
112
|
+
1. Use the langgraph_streaming_tool to execute time and weather queries
|
|
113
|
+
2. Be specific about what information is requested
|
|
114
|
+
3. Provide clear, formatted responses about the time or weather information
|
|
115
|
+
4. For weather queries, specify the city name clearly
|
|
116
|
+
|
|
117
|
+
Always use the agent wrapper tool for time and weather requests. Format your responses clearly and professionally.""",
|
|
118
|
+
model="openai/gpt-4.1",
|
|
119
|
+
tools=[streaming_tool],
|
|
120
|
+
tool_configs={"langgraph_streaming_tool": {"time_format": "%d-%m-%Y %H:%M:%S"}},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
app = langchain_agent.to_a2a(
|
|
124
|
+
agent_card=agent_card,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
uvicorn.run(app, host=host, port=port)
|
|
128
|
+
logger.info("A2A application configured. Starting Uvicorn server...")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
if __name__ == "__main__":
|
|
132
|
+
main()
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""Example demonstrating integration of A2A and MCP servers with LangGraphAgent.
|
|
2
|
+
|
|
3
|
+
This script shows how to create a LangGraphAgent that connects to:
|
|
4
|
+
1. An MCP server with weather forecast tool (must be running on port 8000)
|
|
5
|
+
2. An A2A server with weather capabilities (must be running on port 8001)
|
|
6
|
+
|
|
7
|
+
To run this example:
|
|
8
|
+
1. Start the MCP server: python aip_agents/examples/mcp_servers/mcp_server_sse.py
|
|
9
|
+
2. Start the A2A server: python aip_agents/examples/hello_world_a2a_langgraph_server.py
|
|
10
|
+
3. Set your OPENAI_API_KEY environment variable
|
|
11
|
+
4. Run this script: python examples/hello_world_a2a_mcp_langgraph.py
|
|
12
|
+
|
|
13
|
+
Authors:
|
|
14
|
+
Raymond Christopher (raymond.christopher@gdplabs.id)
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import asyncio
|
|
18
|
+
import os
|
|
19
|
+
import sys
|
|
20
|
+
import traceback
|
|
21
|
+
|
|
22
|
+
from langchain_openai import ChatOpenAI
|
|
23
|
+
|
|
24
|
+
from aip_agents.agent import LangGraphAgent
|
|
25
|
+
from aip_agents.schema.agent import A2AClientConfig
|
|
26
|
+
|
|
27
|
+
# Configuration
|
|
28
|
+
A2A_SERVER_PORT = 8002 # Port for StockAgent A2A server
|
|
29
|
+
A2A_AGENT_NAME = "StockAgent" # Must match the agent name in A2A server
|
|
30
|
+
MCP_SERVER_PORT = 8000 # Port for MCP server (weather tools)
|
|
31
|
+
MCP_AGENT_NAME = "weather_tools" # Must match the agent name in MCP server
|
|
32
|
+
MODEL_NAME = "gpt-4.1"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
async def create_agent() -> tuple[LangGraphAgent, dict[str, bool]]:
|
|
36
|
+
"""Create and configure the LangGraphAgent with MCP and A2A connections.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
tuple: (agent, connected_servers) where connected_servers is a dict
|
|
40
|
+
showing which servers were successfully connected.
|
|
41
|
+
"""
|
|
42
|
+
if not os.getenv("OPENAI_API_KEY"):
|
|
43
|
+
raise ValueError("OPENAI_API_KEY environment variable not set")
|
|
44
|
+
|
|
45
|
+
print("\nCreating LangGraphAgent...")
|
|
46
|
+
llm = ChatOpenAI(model=MODEL_NAME, temperature=0, openai_api_key=os.getenv("OPENAI_API_KEY"))
|
|
47
|
+
|
|
48
|
+
agent = LangGraphAgent(
|
|
49
|
+
name="IntegrationAgent",
|
|
50
|
+
instruction="""You are a helpful assistant that can use various tools.
|
|
51
|
+
For stock-related queries (price, news, etc.), use the StockAgent tool.
|
|
52
|
+
For weather-related queries, use the get_weather_forecast tool.
|
|
53
|
+
Choose the appropriate tool based on the user's request.""",
|
|
54
|
+
model=llm,
|
|
55
|
+
tools=[], # We'll add tools dynamically
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
return agent, {"mcp": False, "a2a": False}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
async def connect_to_mcp_server(agent: LangGraphAgent) -> bool:
|
|
62
|
+
"""Connect to the MCP server and register tools.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
agent: The LangGraphAgent instance to configure.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
bool: True if connection was successful, False otherwise.
|
|
69
|
+
"""
|
|
70
|
+
try:
|
|
71
|
+
print(f"\nConnecting to MCP server on port {MCP_SERVER_PORT}...")
|
|
72
|
+
agent.add_mcp_server(
|
|
73
|
+
{
|
|
74
|
+
MCP_AGENT_NAME: {
|
|
75
|
+
"url": f"http://localhost:{MCP_SERVER_PORT}/sse",
|
|
76
|
+
"transport": "sse",
|
|
77
|
+
"api_key": "", # No auth for test server
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
print(f"✅ Successfully connected to MCP server: {MCP_AGENT_NAME}")
|
|
82
|
+
return True
|
|
83
|
+
except Exception as e:
|
|
84
|
+
print(f"⚠️ Failed to connect to MCP server: {e}")
|
|
85
|
+
print("Continuing without MCP tools...")
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
async def connect_to_a2a_server(agent: LangGraphAgent) -> bool:
|
|
90
|
+
"""Connect to the A2A server and register agents.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
agent: The LangGraphAgent instance to configure.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
bool: True if connection was successful, False otherwise.
|
|
97
|
+
"""
|
|
98
|
+
try:
|
|
99
|
+
print(f"\nConnecting to A2A server on port {A2A_SERVER_PORT}...")
|
|
100
|
+
client_a2a_config = A2AClientConfig(
|
|
101
|
+
discovery_urls=[f"http://localhost:{A2A_SERVER_PORT}"],
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
print("Discovering A2A agents...")
|
|
105
|
+
agent_cards = agent.discover_agents(client_a2a_config)
|
|
106
|
+
print(f"Discovered {len(agent_cards)} A2A agents")
|
|
107
|
+
|
|
108
|
+
if not agent_cards:
|
|
109
|
+
print("⚠️ No A2A agents discovered")
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
print(f"Registering A2A agent: {agent_cards[0].name}")
|
|
113
|
+
agent.register_a2a_agents(agent_cards)
|
|
114
|
+
print("✅ Successfully registered A2A agent")
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
except Exception as e:
|
|
118
|
+
print(f"⚠️ Failed to connect to A2A server: {e}")
|
|
119
|
+
print("Continuing without A2A tools...")
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
async def test_mcp_weather_tool(agent: LangGraphAgent) -> None:
|
|
124
|
+
"""Test the MCP weather tool if available.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
agent: The configured LangGraphAgent instance.
|
|
128
|
+
"""
|
|
129
|
+
print("\n=== Testing MCP Weather Tool ===")
|
|
130
|
+
weather_query = "What's the weather forecast for tomorrow in London?"
|
|
131
|
+
print(f"\nQuery: {weather_query}")
|
|
132
|
+
try:
|
|
133
|
+
response = await agent.arun(weather_query)
|
|
134
|
+
print(f"✅ Response: {response.get('output', 'No output')}")
|
|
135
|
+
except Exception as e:
|
|
136
|
+
print(f"❌ Error testing MCP weather tool: {e}")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
async def test_stock_agent(agent: LangGraphAgent) -> None:
|
|
140
|
+
"""Test the A2A Stock Agent if available.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
agent: The configured LangGraphAgent instance.
|
|
144
|
+
"""
|
|
145
|
+
print("\n=== Testing Stock Agent ===")
|
|
146
|
+
stock_agent_tool = next((t for t in agent._tools if t.name == "StockAgent"), None)
|
|
147
|
+
|
|
148
|
+
if not stock_agent_tool:
|
|
149
|
+
print("⚠️ StockAgent tool not found in agent's tools")
|
|
150
|
+
return
|
|
151
|
+
|
|
152
|
+
stock_query = "What is the current stock price of AAPL?"
|
|
153
|
+
print(f"\nQuery: {stock_query}")
|
|
154
|
+
|
|
155
|
+
try:
|
|
156
|
+
tool_input = {"query": "Get current stock price for AAPL"}
|
|
157
|
+
response = await stock_agent_tool.arun(tool_input)
|
|
158
|
+
print(f"✅ Response: {response}")
|
|
159
|
+
except Exception as e:
|
|
160
|
+
print(f"❌ Error testing Stock Agent: {e}")
|
|
161
|
+
traceback.print_exc()
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
async def main():
|
|
165
|
+
"""Main function to run the A2A and MCP integration example."""
|
|
166
|
+
try:
|
|
167
|
+
# Create and configure agent
|
|
168
|
+
agent, connected_servers = await create_agent()
|
|
169
|
+
|
|
170
|
+
# Connect to servers
|
|
171
|
+
connected_servers["mcp"] = await connect_to_mcp_server(agent)
|
|
172
|
+
connected_servers["a2a"] = await connect_to_a2a_server(agent)
|
|
173
|
+
|
|
174
|
+
# Verify at least one server is connected
|
|
175
|
+
if not any(connected_servers.values()):
|
|
176
|
+
print("❌ Error: Could not connect to any servers. Exiting...")
|
|
177
|
+
sys.exit(1)
|
|
178
|
+
|
|
179
|
+
# Run tests for connected services
|
|
180
|
+
if connected_servers["mcp"]:
|
|
181
|
+
await test_mcp_weather_tool(agent)
|
|
182
|
+
else:
|
|
183
|
+
print("\nSkipping MCP weather tool tests - MCP server not connected")
|
|
184
|
+
|
|
185
|
+
if connected_servers["a2a"]:
|
|
186
|
+
await test_stock_agent(agent)
|
|
187
|
+
else:
|
|
188
|
+
print("\nSkipping Stock Agent tests - A2A server not connected")
|
|
189
|
+
|
|
190
|
+
except Exception as e:
|
|
191
|
+
print(f"\nError: {str(e)}")
|
|
192
|
+
raise
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
if __name__ == "__main__":
|
|
196
|
+
asyncio.run(main())
|