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.
Files changed (280) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/a2a/__init__.py +19 -0
  3. aip_agents/a2a/server/__init__.py +10 -0
  4. aip_agents/a2a/server/base_executor.py +1086 -0
  5. aip_agents/a2a/server/google_adk_executor.py +198 -0
  6. aip_agents/a2a/server/langflow_executor.py +180 -0
  7. aip_agents/a2a/server/langgraph_executor.py +270 -0
  8. aip_agents/a2a/types.py +232 -0
  9. aip_agents/agent/__init__.py +27 -0
  10. aip_agents/agent/base_agent.py +970 -0
  11. aip_agents/agent/base_langgraph_agent.py +2942 -0
  12. aip_agents/agent/google_adk_agent.py +926 -0
  13. aip_agents/agent/google_adk_constants.py +6 -0
  14. aip_agents/agent/hitl/__init__.py +24 -0
  15. aip_agents/agent/hitl/config.py +28 -0
  16. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  17. aip_agents/agent/hitl/manager.py +532 -0
  18. aip_agents/agent/hitl/models.py +18 -0
  19. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  20. aip_agents/agent/hitl/prompt/base.py +42 -0
  21. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  22. aip_agents/agent/hitl/registry.py +149 -0
  23. aip_agents/agent/interface.py +138 -0
  24. aip_agents/agent/interfaces.py +65 -0
  25. aip_agents/agent/langflow_agent.py +464 -0
  26. aip_agents/agent/langgraph_memory_enhancer_agent.py +433 -0
  27. aip_agents/agent/langgraph_react_agent.py +2514 -0
  28. aip_agents/agent/system_instruction_context.py +34 -0
  29. aip_agents/clients/__init__.py +10 -0
  30. aip_agents/clients/langflow/__init__.py +10 -0
  31. aip_agents/clients/langflow/client.py +477 -0
  32. aip_agents/clients/langflow/types.py +18 -0
  33. aip_agents/constants.py +23 -0
  34. aip_agents/credentials/manager.py +132 -0
  35. aip_agents/examples/__init__.py +5 -0
  36. aip_agents/examples/compare_streaming_client.py +783 -0
  37. aip_agents/examples/compare_streaming_server.py +142 -0
  38. aip_agents/examples/demo_memory_recall.py +401 -0
  39. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  40. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  41. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  42. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  43. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  44. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  45. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  46. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  47. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  48. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  49. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  50. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  51. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  52. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  53. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  54. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  55. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  56. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  57. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  58. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  59. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  60. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  61. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  62. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  63. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  64. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  65. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  66. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  67. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  68. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  69. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  70. aip_agents/examples/hello_world_google_adk.py +41 -0
  71. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  72. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  73. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  74. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  75. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  76. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  77. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  78. aip_agents/examples/hello_world_langchain.py +28 -0
  79. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  80. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  81. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  82. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  83. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  84. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  85. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  86. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  87. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  88. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  89. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  90. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  91. aip_agents/examples/hello_world_langgraph.py +39 -0
  92. aip_agents/examples/hello_world_langgraph_bosa_twitter.py +41 -0
  93. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  94. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  95. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  96. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  97. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  98. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  99. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  100. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  101. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  102. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  103. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  104. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  105. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  106. aip_agents/examples/hello_world_pii_logger.py +21 -0
  107. aip_agents/examples/hello_world_sentry.py +133 -0
  108. aip_agents/examples/hello_world_step_limits.py +273 -0
  109. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  110. aip_agents/examples/hello_world_tool_output_client.py +46 -0
  111. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  112. aip_agents/examples/hitl_demo.py +724 -0
  113. aip_agents/examples/mcp_configs/configs.py +63 -0
  114. aip_agents/examples/mcp_servers/common.py +76 -0
  115. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  116. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  117. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  118. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  119. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  120. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  121. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  122. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  123. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  124. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  125. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  126. aip_agents/examples/tools/__init__.py +27 -0
  127. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  128. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  129. aip_agents/examples/tools/data_generator_tool.py +103 -0
  130. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  131. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  132. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  133. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  134. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  135. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  136. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  137. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  138. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  139. aip_agents/examples/tools/random_chart_tool.py +142 -0
  140. aip_agents/examples/tools/serper_tool.py +202 -0
  141. aip_agents/examples/tools/stock_tools.py +82 -0
  142. aip_agents/examples/tools/table_generator_tool.py +167 -0
  143. aip_agents/examples/tools/time_tool.py +82 -0
  144. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  145. aip_agents/executor/agent_executor.py +473 -0
  146. aip_agents/executor/base.py +48 -0
  147. aip_agents/mcp/__init__.py +1 -0
  148. aip_agents/mcp/client/__init__.py +14 -0
  149. aip_agents/mcp/client/base_mcp_client.py +369 -0
  150. aip_agents/mcp/client/connection_manager.py +193 -0
  151. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  152. aip_agents/mcp/client/google_adk/client.py +381 -0
  153. aip_agents/mcp/client/langchain/__init__.py +11 -0
  154. aip_agents/mcp/client/langchain/client.py +265 -0
  155. aip_agents/mcp/client/persistent_session.py +359 -0
  156. aip_agents/mcp/client/session_pool.py +351 -0
  157. aip_agents/mcp/client/transports.py +215 -0
  158. aip_agents/mcp/utils/__init__.py +7 -0
  159. aip_agents/mcp/utils/config_validator.py +139 -0
  160. aip_agents/memory/__init__.py +14 -0
  161. aip_agents/memory/adapters/__init__.py +10 -0
  162. aip_agents/memory/adapters/base_adapter.py +717 -0
  163. aip_agents/memory/adapters/mem0.py +84 -0
  164. aip_agents/memory/base.py +84 -0
  165. aip_agents/memory/constants.py +49 -0
  166. aip_agents/memory/factory.py +86 -0
  167. aip_agents/memory/guidance.py +20 -0
  168. aip_agents/memory/simple_memory.py +47 -0
  169. aip_agents/middleware/__init__.py +17 -0
  170. aip_agents/middleware/base.py +88 -0
  171. aip_agents/middleware/manager.py +128 -0
  172. aip_agents/middleware/todolist.py +274 -0
  173. aip_agents/schema/__init__.py +69 -0
  174. aip_agents/schema/a2a.py +56 -0
  175. aip_agents/schema/agent.py +111 -0
  176. aip_agents/schema/hitl.py +157 -0
  177. aip_agents/schema/langgraph.py +37 -0
  178. aip_agents/schema/model_id.py +97 -0
  179. aip_agents/schema/step_limit.py +108 -0
  180. aip_agents/schema/storage.py +40 -0
  181. aip_agents/sentry/__init__.py +11 -0
  182. aip_agents/sentry/sentry.py +151 -0
  183. aip_agents/storage/__init__.py +41 -0
  184. aip_agents/storage/base.py +85 -0
  185. aip_agents/storage/clients/__init__.py +12 -0
  186. aip_agents/storage/clients/minio_client.py +318 -0
  187. aip_agents/storage/config.py +62 -0
  188. aip_agents/storage/providers/__init__.py +15 -0
  189. aip_agents/storage/providers/base.py +106 -0
  190. aip_agents/storage/providers/memory.py +114 -0
  191. aip_agents/storage/providers/object_storage.py +214 -0
  192. aip_agents/tools/__init__.py +33 -0
  193. aip_agents/tools/bosa_tools.py +105 -0
  194. aip_agents/tools/browser_use/__init__.py +82 -0
  195. aip_agents/tools/browser_use/action_parser.py +103 -0
  196. aip_agents/tools/browser_use/browser_use_tool.py +1112 -0
  197. aip_agents/tools/browser_use/llm_config.py +120 -0
  198. aip_agents/tools/browser_use/minio_storage.py +198 -0
  199. aip_agents/tools/browser_use/schemas.py +119 -0
  200. aip_agents/tools/browser_use/session.py +76 -0
  201. aip_agents/tools/browser_use/session_errors.py +132 -0
  202. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  203. aip_agents/tools/browser_use/streaming.py +813 -0
  204. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  205. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  206. aip_agents/tools/browser_use/types.py +78 -0
  207. aip_agents/tools/code_sandbox/__init__.py +26 -0
  208. aip_agents/tools/code_sandbox/constant.py +13 -0
  209. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +257 -0
  210. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  211. aip_agents/tools/constants.py +165 -0
  212. aip_agents/tools/document_loader/__init__.py +44 -0
  213. aip_agents/tools/document_loader/base_reader.py +302 -0
  214. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  215. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  216. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  217. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  218. aip_agents/tools/gl_connector/__init__.py +5 -0
  219. aip_agents/tools/gl_connector/tool.py +351 -0
  220. aip_agents/tools/memory_search/__init__.py +22 -0
  221. aip_agents/tools/memory_search/base.py +200 -0
  222. aip_agents/tools/memory_search/mem0.py +258 -0
  223. aip_agents/tools/memory_search/schema.py +48 -0
  224. aip_agents/tools/memory_search_tool.py +26 -0
  225. aip_agents/tools/time_tool.py +117 -0
  226. aip_agents/tools/tool_config_injector.py +300 -0
  227. aip_agents/tools/web_search/__init__.py +15 -0
  228. aip_agents/tools/web_search/serper_tool.py +187 -0
  229. aip_agents/types/__init__.py +70 -0
  230. aip_agents/types/a2a_events.py +13 -0
  231. aip_agents/utils/__init__.py +79 -0
  232. aip_agents/utils/a2a_connector.py +1757 -0
  233. aip_agents/utils/artifact_helpers.py +502 -0
  234. aip_agents/utils/constants.py +22 -0
  235. aip_agents/utils/datetime/__init__.py +34 -0
  236. aip_agents/utils/datetime/normalization.py +231 -0
  237. aip_agents/utils/datetime/timezone.py +206 -0
  238. aip_agents/utils/env_loader.py +27 -0
  239. aip_agents/utils/event_handler_registry.py +58 -0
  240. aip_agents/utils/file_prompt_utils.py +176 -0
  241. aip_agents/utils/final_response_builder.py +211 -0
  242. aip_agents/utils/formatter_llm_client.py +231 -0
  243. aip_agents/utils/langgraph/__init__.py +19 -0
  244. aip_agents/utils/langgraph/converter.py +128 -0
  245. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  246. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  247. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  248. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1071 -0
  249. aip_agents/utils/langgraph/tool_output_management.py +967 -0
  250. aip_agents/utils/logger.py +195 -0
  251. aip_agents/utils/metadata/__init__.py +27 -0
  252. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  253. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  254. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  255. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  256. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  257. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  258. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  259. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  260. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  261. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  262. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  263. aip_agents/utils/metadata_helper.py +358 -0
  264. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  265. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  266. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  267. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  268. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  269. aip_agents/utils/pii/__init__.py +25 -0
  270. aip_agents/utils/pii/pii_handler.py +397 -0
  271. aip_agents/utils/pii/pii_helper.py +207 -0
  272. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  273. aip_agents/utils/reference_helper.py +273 -0
  274. aip_agents/utils/sse_chunk_transformer.py +831 -0
  275. aip_agents/utils/step_limit_manager.py +265 -0
  276. aip_agents/utils/token_usage_helper.py +156 -0
  277. aip_agents_binary-0.5.20.dist-info/METADATA +681 -0
  278. aip_agents_binary-0.5.20.dist-info/RECORD +280 -0
  279. aip_agents_binary-0.5.20.dist-info/WHEEL +5 -0
  280. 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())