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.
Files changed (208) hide show
  1. aip_agents/__init__.pyi +19 -0
  2. aip_agents/a2a/__init__.pyi +1 -1
  3. aip_agents/a2a/server/base_executor.pyi +6 -6
  4. aip_agents/a2a/server/google_adk_executor.pyi +11 -11
  5. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  6. aip_agents/a2a/server/langgraph_executor.pyi +10 -11
  7. aip_agents/a2a/types.pyi +54 -47
  8. aip_agents/agent/__init__.pyi +3 -1
  9. aip_agents/agent/base_agent.pyi +24 -8
  10. aip_agents/agent/base_langgraph_agent.pyi +67 -25
  11. aip_agents/agent/google_adk_agent.pyi +34 -21
  12. aip_agents/agent/google_adk_constants.pyi +3 -0
  13. aip_agents/agent/hitl/__init__.pyi +6 -0
  14. aip_agents/agent/hitl/config.pyi +15 -0
  15. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  16. aip_agents/agent/hitl/manager.pyi +199 -0
  17. aip_agents/agent/hitl/models.pyi +3 -0
  18. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  19. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  20. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  21. aip_agents/agent/interface.pyi +5 -5
  22. aip_agents/agent/interfaces.pyi +44 -0
  23. aip_agents/agent/langflow_agent.pyi +133 -0
  24. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +49 -0
  25. aip_agents/agent/langgraph_react_agent.pyi +50 -57
  26. aip_agents/agent/system_instruction_context.pyi +13 -0
  27. aip_agents/clients/__init__.pyi +4 -0
  28. aip_agents/clients/langflow/__init__.pyi +4 -0
  29. aip_agents/clients/langflow/client.pyi +140 -0
  30. aip_agents/clients/langflow/types.pyi +7 -0
  31. aip_agents/constants.pyi +1 -0
  32. aip_agents/examples/compare_streaming_client.pyi +48 -0
  33. aip_agents/examples/compare_streaming_server.pyi +18 -0
  34. aip_agents/examples/demo_memory_recall.pyi +58 -0
  35. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +2 -2
  36. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +2 -2
  37. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +2 -2
  38. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +7 -2
  39. aip_agents/examples/hello_world_a2a_langchain_client.pyi +1 -1
  40. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +1 -1
  41. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +1 -1
  42. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +1 -1
  43. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +1 -1
  44. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +8 -3
  45. aip_agents/examples/hello_world_a2a_langchain_server.pyi +7 -2
  46. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +7 -2
  47. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  48. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  49. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +1 -1
  50. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +1 -1
  51. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +7 -2
  52. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +2 -2
  53. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +2 -2
  54. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +1 -1
  55. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +3 -3
  56. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +1 -1
  57. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +1 -1
  58. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +7 -2
  59. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +7 -2
  60. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +7 -2
  61. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +1 -1
  62. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +31 -6
  63. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +33 -5
  64. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +1 -1
  65. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +7 -2
  66. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  67. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  68. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  69. aip_agents/examples/hello_world_model_switch_cli.pyi +18 -3
  70. aip_agents/examples/hello_world_pii_logger.pyi +1 -1
  71. aip_agents/examples/hello_world_sentry.pyi +1 -1
  72. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  73. aip_agents/examples/hello_world_stock_a2a_server.pyi +7 -2
  74. aip_agents/examples/hello_world_tool_output_client.pyi +1 -1
  75. aip_agents/examples/hello_world_tool_output_server.pyi +7 -2
  76. aip_agents/examples/hitl_demo.pyi +67 -0
  77. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  78. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  79. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  80. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  81. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  82. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  83. aip_agents/examples/tools/__init__.pyi +3 -1
  84. aip_agents/examples/tools/adk_weather_tool.pyi +1 -1
  85. aip_agents/examples/tools/data_visualization_tool.pyi +2 -0
  86. aip_agents/examples/tools/image_artifact_tool.pyi +2 -0
  87. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +7 -0
  88. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +0 -1
  89. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +2 -0
  90. aip_agents/examples/tools/langchain_weather_tool.pyi +1 -1
  91. aip_agents/examples/tools/langgraph_streaming_tool.pyi +1 -1
  92. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  93. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  94. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  95. aip_agents/examples/tools/stock_tools.pyi +18 -3
  96. aip_agents/mcp/client/__init__.pyi +4 -3
  97. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  98. aip_agents/mcp/client/connection_manager.pyi +48 -0
  99. aip_agents/mcp/client/google_adk/__init__.pyi +1 -1
  100. aip_agents/mcp/client/google_adk/client.pyi +50 -13
  101. aip_agents/mcp/client/langchain/__init__.pyi +1 -1
  102. aip_agents/mcp/client/langchain/client.pyi +47 -2
  103. aip_agents/mcp/client/persistent_session.pyi +113 -0
  104. aip_agents/mcp/client/session_pool.pyi +101 -0
  105. aip_agents/mcp/client/transports.pyi +123 -0
  106. aip_agents/mcp/utils/__init__.pyi +0 -0
  107. aip_agents/mcp/utils/config_validator.pyi +82 -0
  108. aip_agents/memory/adapters/__init__.pyi +4 -0
  109. aip_agents/memory/adapters/base_adapter.pyi +150 -0
  110. aip_agents/memory/adapters/mem0.pyi +22 -0
  111. aip_agents/memory/base.pyi +3 -3
  112. aip_agents/memory/constants.pyi +9 -0
  113. aip_agents/memory/factory.pyi +1 -1
  114. aip_agents/memory/guidance.pyi +3 -0
  115. aip_agents/middleware/__init__.pyi +5 -0
  116. aip_agents/middleware/base.pyi +71 -0
  117. aip_agents/middleware/manager.pyi +80 -0
  118. aip_agents/middleware/todolist.pyi +125 -0
  119. aip_agents/schema/__init__.pyi +9 -0
  120. aip_agents/schema/a2a.pyi +40 -0
  121. aip_agents/schema/agent.pyi +65 -0
  122. aip_agents/schema/hitl.pyi +89 -0
  123. aip_agents/schema/langgraph.pyi +28 -0
  124. aip_agents/schema/model_id.pyi +54 -0
  125. aip_agents/schema/step_limit.pyi +63 -0
  126. aip_agents/schema/storage.pyi +21 -0
  127. aip_agents/sentry/__init__.pyi +1 -1
  128. aip_agents/sentry/sentry.pyi +2 -2
  129. aip_agents/storage/base.pyi +1 -2
  130. aip_agents/storage/config.pyi +9 -46
  131. aip_agents/storage/providers/base.pyi +2 -3
  132. aip_agents/storage/providers/object_storage.pyi +1 -1
  133. aip_agents/tools/__init__.pyi +1 -1
  134. aip_agents/tools/bosa_tools.pyi +2 -2
  135. aip_agents/tools/constants.pyi +105 -100
  136. aip_agents/tools/memory_search/__init__.pyi +5 -0
  137. aip_agents/tools/memory_search/base.pyi +69 -0
  138. aip_agents/tools/memory_search/mem0.pyi +19 -0
  139. aip_agents/tools/memory_search/schema.pyi +15 -0
  140. aip_agents/tools/memory_search_tool.pyi +3 -0
  141. aip_agents/types/__init__.pyi +19 -3
  142. aip_agents/types/a2a_events.pyi +2 -73
  143. aip_agents/utils/__init__.pyi +7 -2
  144. aip_agents/utils/a2a_connector.pyi +14 -4
  145. aip_agents/utils/artifact_helpers.pyi +26 -2
  146. aip_agents/utils/constants.pyi +10 -0
  147. aip_agents/utils/datetime/__init__.pyi +4 -0
  148. aip_agents/utils/datetime/normalization.pyi +95 -0
  149. aip_agents/utils/datetime/timezone.pyi +48 -0
  150. aip_agents/utils/env_loader.pyi +2 -2
  151. aip_agents/utils/event_handler_registry.pyi +23 -0
  152. aip_agents/utils/final_response_builder.pyi +34 -0
  153. aip_agents/utils/formatter_llm_client.pyi +71 -0
  154. aip_agents/utils/langgraph/converter.pyi +1 -1
  155. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +2 -2
  156. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +2 -3
  157. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +14 -8
  158. aip_agents/utils/langgraph/tool_output_management.pyi +15 -2
  159. aip_agents/utils/logger.pyi +60 -0
  160. aip_agents/utils/metadata/__init__.pyi +5 -0
  161. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  162. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  163. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  164. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  165. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  166. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  167. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  168. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  169. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  170. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  171. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  172. aip_agents/utils/metadata_helper.pyi +50 -34
  173. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +1 -2
  174. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +1 -1
  175. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +4 -4
  176. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +1 -1
  177. aip_agents/utils/pii/__init__.pyi +5 -0
  178. aip_agents/utils/pii/pii_handler.pyi +86 -0
  179. aip_agents/utils/pii/pii_helper.pyi +69 -0
  180. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +62 -0
  181. aip_agents/utils/reference_helper.pyi +38 -6
  182. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  183. aip_agents/utils/step_limit_manager.pyi +112 -0
  184. aip_agents/utils/token_usage_helper.pyi +1 -1
  185. aip_agents.cp312-win_amd64.pyd +0 -0
  186. aip_agents.pyi +92 -34
  187. aip_agents_binary-0.5.4.dist-info/METADATA +649 -0
  188. aip_agents_binary-0.5.4.dist-info/RECORD +242 -0
  189. {aip_agents_binary-0.4.8.dist-info → aip_agents_binary-0.5.4.dist-info}/WHEEL +2 -1
  190. aip_agents_binary-0.5.4.dist-info/top_level.txt +1 -0
  191. aip_agents/agent/types.pyi +0 -109
  192. aip_agents/examples/hello_world_a2a_mem0_coordinator_client.pyi +0 -14
  193. aip_agents/examples/hello_world_a2a_mem0_coordinator_server.pyi +0 -10
  194. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client.pyi +0 -19
  195. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_client_streaming.pyi +0 -9
  196. aip_agents/examples/hello_world_a2a_multi_agent_coordinator_server.pyi +0 -12
  197. aip_agents/examples/hello_world_langgraph_bosa.pyi +0 -5
  198. aip_agents/examples/hello_world_mem0_coordinator.pyi +0 -5
  199. aip_agents/examples/tools/pr_details_bosa_tool.pyi +0 -26
  200. aip_agents/memory/mem0_memory.pyi +0 -94
  201. aip_agents/tools/base.pyi +0 -44
  202. aip_agents/tools/base_bosa_tools.pyi +0 -12
  203. aip_agents/tools/bosa_connector.pyi +0 -30
  204. aip_agents/tools/bosa_tools_interface.pyi +0 -26
  205. aip_agents/utils/logger_manager.pyi +0 -151
  206. aip_agents.build/.gitignore +0 -1
  207. aip_agents_binary-0.4.8.dist-info/METADATA +0 -280
  208. aip_agents_binary-0.4.8.dist-info/RECORD +0 -166
@@ -0,0 +1,649 @@
1
+ Metadata-Version: 2.4
2
+ Name: aip-agents-binary
3
+ Version: 0.5.4
4
+ Summary: A library for managing agents in Gen AI applications.
5
+ Author-email: Raymond Christopher <raymond.christopher@gdplabs.id>
6
+ Requires-Python: <3.13,>=3.11
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: a2a-sdk<0.3.0,>=0.2.4
9
+ Requires-Dist: aiostream<0.7.0,>=0.6.0
10
+ Requires-Dist: authlib<2.0.0,>=1.6.4
11
+ Requires-Dist: bosa-connectors-binary<0.4.0,>=0.3.1
12
+ Requires-Dist: bosa-core-binary[logger,telemetry]<0.10.0,>=0.9.6
13
+ Requires-Dist: colorama<0.5.0,>=0.4.6
14
+ Requires-Dist: deprecated<2.0.0,>=1.2.18
15
+ Requires-Dist: fastapi<0.121.0,>=0.120.0
16
+ Requires-Dist: gllm-core-binary<0.4.0,>=0.3.18
17
+ Requires-Dist: gllm-inference-binary[anthropic,bedrock,google-genai,google-vertexai,openai]<0.6.0,>=0.5.90
18
+ Requires-Dist: gllm-tools-binary<0.2.0,>=0.1.3
19
+ Requires-Dist: google-adk<0.6.0,>=0.5.0
20
+ Requires-Dist: langchain<0.4.0,>=0.3.0
21
+ Requires-Dist: langchain-openai<0.4.0,>=0.3.17
22
+ Requires-Dist: langchain-mcp-adapters<0.1.0,>=0.0.10
23
+ Requires-Dist: langchain-experimental<0.4.0,>=0.3.4
24
+ Requires-Dist: langgraph<0.3.0,>=0.2.16
25
+ Requires-Dist: minio<8.0.0,>=7.2.20
26
+ Requires-Dist: pydantic<3.0.0,>=2.11.7
27
+ Requires-Dist: python-dotenv<2.0.0,>=1.1.0
28
+ Requires-Dist: requests<3.0.0,>=2.32.4
29
+ Requires-Dist: uvicorn<0.35.0,>=0.34.3
30
+ Provides-Extra: memory
31
+ Requires-Dist: gllm-memory-binary[mem0ai]<0.2.0,>=0.1.1; extra == "memory"
32
+ Provides-Extra: privacy
33
+ Requires-Dist: gllm-privacy-binary<0.5.0,>=0.4.7; extra == "privacy"
34
+ Provides-Extra: dev
35
+ Requires-Dist: coverage<8.0.0,>=7.4.4; extra == "dev"
36
+ Requires-Dist: mypy<2.0.0,>=1.15.0; extra == "dev"
37
+ Requires-Dist: pre-commit<4.0.0,>=3.7.0; extra == "dev"
38
+ Requires-Dist: pytest<9.0.0,>=8.1.1; extra == "dev"
39
+ Requires-Dist: pytest-asyncio<0.24.0,>=0.23.6; extra == "dev"
40
+ Requires-Dist: pytest-cov<6.0.0,>=5.0.0; extra == "dev"
41
+ Requires-Dist: ruff<0.7.0,>=0.6.7; extra == "dev"
42
+ Requires-Dist: pillow<12.0.0,>=11.3.0; extra == "dev"
43
+
44
+ # GLLM Agents
45
+
46
+ ## Description
47
+
48
+ A library for managing agents in Generative AI applications.
49
+
50
+ ## Installation
51
+
52
+ ### Prerequisites
53
+ - Python 3.13+ - [Install here](https://www.python.org/downloads/)
54
+ - Pip (if using Pip) - [Install here](https://pip.pypa.io/en/stable/installation/)
55
+ - Poetry 1.8.1+ (if using Poetry) - [Install here](https://python-poetry.org/docs/#installation)
56
+ - Git (if using Git) - [Install here](https://git-scm.com/downloads)
57
+ - For git installation:
58
+ - Access to the [GDP Labs SDK github repository](https://github.com/GDP-ADMIN/gen-ai-internal)
59
+
60
+ ### 1. Installation from Artifact Registry
61
+ Choose one of the following methods to install the package:
62
+
63
+ #### Using pip
64
+ ```bash
65
+ pip install aip-agents-binary
66
+ ```
67
+
68
+ #### Using Poetry
69
+ ```bash
70
+ poetry add aip-agents-binary
71
+ ```
72
+
73
+ ### 2. Development Installation (Git)
74
+ For development purposes, you can install directly from the Git repository:
75
+ ```bash
76
+ poetry add "git+ssh://git@github.com/GDP-ADMIN/gen-ai-internal.git#subdirectory=libs/aip-agents"
77
+ ```
78
+
79
+ ## Managing Dependencies
80
+ 1. Go to root folder of `aip-agents` module, e.g. `cd libs/aip-agents`.
81
+ 2. Run `poetry shell` to create a virtual environment.
82
+ 3. Run `poetry install` to install the `aip-agents` requirements (Poetry will generate a local lock file for you if needed; the repository ignores it).
83
+ 4. Run `poetry update` if you change any dependency versions in `pyproject.toml`.
84
+
85
+ ## Contributing
86
+ Please refer to this [Python Style Guide](https://docs.google.com/document/d/1uRggCrHnVfDPBnG641FyQBwUwLoFw0kTzNqRm92vUwM/edit?usp=sharing)
87
+ to get information about code style, documentation standard, and SCA that you need to use when contributing to this project
88
+
89
+ 1. Activate `pre-commit` hooks using `pre-commit install`
90
+ 2. Run `poetry shell` to create a virtual environment.
91
+ 3. Run `poetry install` to install the `aip-agents` requirements (this will also create a local lock file that stays local).
92
+ 4. Run `which python` to get the path to be referenced at Visual Studio Code interpreter path (`Ctrl`+`Shift`+`P` or `Cmd`+`Shift`+`P`)
93
+ 5. Try running the unit test to see if it's working:
94
+ ```bash
95
+ poetry run pytest -s tests/unit_tests/
96
+ ```
97
+
98
+ ## Hello World Examples
99
+
100
+ ### Prerequisites
101
+ - Python 3.13+
102
+ - Install the binary package:
103
+
104
+ ```bash
105
+ pip install aip-agents-binary
106
+ ```
107
+
108
+ - For OpenAI: Set your API key in the environment:
109
+ ```bash
110
+ export OPENAI_API_KEY=your-openai-key
111
+ ```
112
+ - For Google ADK: Set your API key in the environment:
113
+ ```bash
114
+ export GOOGLE_API_KEY=your-google-api-key
115
+ ```
116
+
117
+ ### Run the Hello World Examples
118
+
119
+ The example scripts are located in the `aip_agents/examples` directory within the library. You can run them individually or use the `run_all_examples.py` script.
120
+
121
+ **1. Running Individual Examples:**
122
+
123
+ Navigate to the library's root directory (e.g., `libs/aip-agents` if you cloned the repository).
124
+
125
+ **LangGraph (OpenAI):**
126
+ ```bash
127
+ python aip_agents/examples/hello_world_langgraph.py
128
+ ```
129
+
130
+ **LangGraph with BOSA Connector (OpenAI):**
131
+ ```bash
132
+ python aip_agents/examples/hello_world_langgraph_bosa_twitter.py
133
+ ```
134
+
135
+ **LangGraph Streaming (OpenAI):**
136
+ ```bash
137
+ python aip_agents/examples/hello_world_langgraph_stream.py
138
+ ```
139
+
140
+ **LangGraph Multi-Agent Coordinator (OpenAI):**
141
+ ```bash
142
+ python aip_agents/examples/hello_world_a2a_multi_agent_coordinator_server.py
143
+ ```
144
+
145
+ **Google ADK:**
146
+ ```bash
147
+ python aip_agents/examples/hello_world_google_adk.py
148
+ ```
149
+
150
+ **Google ADK Streaming:**
151
+ ```bash
152
+ python aip_agents/examples/hello_world_google_adk_stream.py
153
+ ```
154
+
155
+ **LangChain (OpenAI):**
156
+ ```bash
157
+ python aip_agents/examples/hello_world_langchain.py
158
+ ```
159
+
160
+ **LangChain Streaming (OpenAI):**
161
+ ```bash
162
+ python aip_agents/examples/hello_world_langchain_stream.py
163
+ ```
164
+
165
+ **HITL (Human-in-the-Loop) Approval Demo:**
166
+ ```bash
167
+ python aip_agents/examples/hitl_demo.py
168
+ ```
169
+
170
+ **2. Running MCP Examples**
171
+
172
+ ### Prerequisites
173
+
174
+ Ensure you have set the environment variables for API keys:
175
+
176
+ ```bash
177
+ export OPENAI_API_KEY="your-openai-key"
178
+ export GOOGLE_API_KEY="your-google-api-key"
179
+ ```
180
+
181
+ For examples that use stateful MCP tools like browser automation, start the Playwright MCP server in a separate terminal:
182
+
183
+ ```bash
184
+ npx @playwright/mcp@latest --headless --port 8931
185
+ ```
186
+
187
+ **Note:** Use the `--headless` flag to run the server without a visible browser window, which is recommended if the browser is not installed yet to avoid failures. For using an actual (non-headless) browser, refer to the [Playwright MCP documentation](https://github.com/microsoft/playwright-mcp).
188
+
189
+ ### Local MCP Servers
190
+
191
+ For STDIO, SSE, and HTTP transports using local servers, open a terminal in the library root (`libs/aip-agents`) and run:
192
+
193
+ - For STDIO:
194
+
195
+ ```bash
196
+ poetry run python aip_agents/examples/mcp_servers/mcp_server_stdio.py
197
+ ```
198
+
199
+ - For SSE:
200
+
201
+ ```bash
202
+ poetry run python aip_agents/examples/mcp_servers/mcp_server_sse.py
203
+ ```
204
+
205
+ - For HTTP:
206
+
207
+ ```bash
208
+ poetry run python aip_agents/examples/mcp_servers/mcp_server_http.py
209
+ ```
210
+
211
+ Note: Start the appropriate server before running the client examples for that transport.
212
+
213
+ ### Running Examples
214
+
215
+ All examples are run from the library root using `poetry run python aip_agents/examples/<file>.py`. Examples support OpenAI for LangGraph/LangChain and Google ADK where specified.
216
+
217
+ #### LangChain Examples
218
+
219
+ ##### STDIO Transport
220
+ - Non-Streaming:
221
+ ```bash
222
+ poetry run python aip_agents/examples/hello_world_langchain_mcp_stdio.py
223
+ ```
224
+ - Streaming:
225
+ ```bash
226
+ poetry run python aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py
227
+ ```
228
+
229
+ ##### SSE Transport
230
+ - Non-Streaming:
231
+ ```bash
232
+ poetry run python aip_agents/examples/hello_world_langchain_mcp_sse.py
233
+ ```
234
+ - Streaming:
235
+ ```bash
236
+ poetry run python aip_agents/examples/hello_world_langchain_mcp_sse_stream.py
237
+ ```
238
+
239
+ ##### HTTP Transport
240
+ - Non-Streaming:
241
+ ```bash
242
+ poetry run python aip_agents/examples/hello_world_langchain_mcp_http.py
243
+ ```
244
+ - Streaming:
245
+ ```bash
246
+ poetry run python aip_agents/examples/hello_world_langchain_mcp_http_stream.py
247
+ ```
248
+
249
+ #### Google ADK Examples
250
+
251
+ ##### STDIO Transport
252
+ - Non-Streaming:
253
+ ```bash
254
+ poetry run python aip_agents/examples/hello_world_google_adk_mcp_stdio.py
255
+ ```
256
+ - Streaming:
257
+ ```bash
258
+ poetry run python aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py
259
+ ```
260
+
261
+ ##### SSE Transport
262
+ - Non-Streaming:
263
+ ```bash
264
+ poetry run python aip_agents/examples/hello_world_google_adk_mcp_sse.py
265
+ ```
266
+ - Streaming:
267
+ ```bash
268
+ poetry run python aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py
269
+ ```
270
+
271
+ ##### HTTP Transport
272
+ - Non-Streaming:
273
+ ```bash
274
+ poetry run python aip_agents/examples/hello_world_google_adk_mcp_http.py
275
+ ```
276
+ - Streaming:
277
+ ```bash
278
+ poetry run python aip_agents/examples/hello_world_google_adk_mcp_http_stream.py
279
+ ```
280
+
281
+ #### LangGraph Examples (OpenAI)
282
+
283
+ ##### STDIO Transport
284
+ - Non-Streaming:
285
+ ```bash
286
+ poetry run python aip_agents/examples/hello_world_langgraph_mcp_stdio.py
287
+ ```
288
+ - Streaming:
289
+ ```bash
290
+ poetry run python aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py
291
+ ```
292
+
293
+ ##### SSE Transport
294
+ - Non-Streaming:
295
+ ```bash
296
+ poetry run python aip_agents/examples/hello_world_langgraph_mcp_sse.py
297
+ ```
298
+ - Streaming:
299
+ ```bash
300
+ poetry run python aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py
301
+ ```
302
+
303
+ ##### HTTP Transport
304
+ - Non-Streaming:
305
+ ```bash
306
+ poetry run python aip_agents/examples/hello_world_langgraph_mcp_http.py
307
+ ```
308
+ - Streaming:
309
+ ```bash
310
+ poetry run python aip_agents/examples/hello_world_langgraph_mcp_http_stream.py
311
+ ```
312
+
313
+ ### Multi-Server Example
314
+
315
+ This LangChain example uses multiple MCP servers: Playwright (for browser actions) and a random name generator (SSE transport) with persistent sessions across multiple `arun` calls.
316
+
317
+ 1. Start the Playwright server:
318
+
319
+ ```bash
320
+ npx @playwright/mcp@latest --headless --port 8931
321
+ ```
322
+
323
+ 2. In another terminal, start the Name Generator SSE server:
324
+
325
+ ```bash
326
+ poetry run python aip_agents/examples/mcp_servers/mcp_name.py
327
+ ```
328
+
329
+ 3. Run the multi-server client example:
330
+
331
+ ```bash
332
+ poetry run python aip_agents/examples/hello_world_langchain_mcp_multi_server.py
333
+ ```
334
+ **3. Running Individual A2A Examples:**
335
+
336
+ * Navigate to the library's root directory (e.g., `libs/aip-agents` if you cloned the repository).
337
+ * Open a new terminal and navigate to the `aip_agents/examples` directory to run the A2A server.
338
+
339
+ **LangChain Server:**
340
+ ```bash
341
+ python hello_world_a2a_langchain_server.py
342
+ ```
343
+
344
+ * Open a new terminal and navigate to the `aip_agents/examples` directory to run the A2A client.
345
+
346
+ **LangChain Client:**
347
+ ```bash
348
+ python hello_world_a2a_langchain_client.py
349
+ ```
350
+
351
+ **LangChain Client Integrated with Agent Workflow:**
352
+ ```bash
353
+ python hello_world_a2a_langchain_client_agent.py
354
+ ```
355
+
356
+ **LangChain Client Streaming:**
357
+ ```bash
358
+ python hello_world_a2a_langchain_client_stream.py
359
+ ```
360
+
361
+
362
+ ## Human-in-the-Loop (HITL) Approval
363
+
364
+ GLLM Agents supports Human-in-the-Loop approval for tool execution, allowing human operators to review and approve high-risk tool calls before they execute.
365
+
366
+ ### Features
367
+
368
+ - **Configurable Approval Policies**: Set approval requirements per tool with customizable timeouts and behaviors
369
+ - **Interactive CLI Prompts**: Clear, structured prompts showing tool details and context
370
+ - **Structured Logging**: All approval decisions are logged with full metadata
371
+ - **Timeout Handling**: Configurable behavior when approval requests time out
372
+ - **Non-blocking**: Tools without HITL configuration execute normally
373
+
374
+ ### Quick Start
375
+
376
+ Configure HITL for specific tools in your agent:
377
+
378
+ ```python
379
+ from aip_agents.agent import LangGraphReactAgent
380
+ from aip_agents.agent.hitl.config import ToolApprovalConfig
381
+
382
+ # Create agent with tools
383
+ agent = LangGraphReactAgent(
384
+ name="My Agent",
385
+ tools=[send_email_tool, search_tool],
386
+ )
387
+
388
+ # Configure HITL via tool_configs
389
+ agent.tool_configs = {
390
+ "tool_configs": {
391
+ "send_email": {"hitl": {"timeout_seconds": 300}}
392
+ }
393
+ }
394
+ ```
395
+
396
+ When the agent attempts to use the `send_email` tool, it will:
397
+
398
+ 1. Emit a pending approval event via `DeferredPromptHandler`
399
+ 2. Wait for `ApprovalManager.resolve_pending_request()` to be called
400
+ 3. Execute the tool only if approved
401
+ 4. Log the decision for audit purposes
402
+
403
+ ### Configuration Options
404
+
405
+ | Option | Type | Default | Description |
406
+ |--------|------|---------|-------------|
407
+ | `timeout_seconds` | int | 300 | Seconds to wait for operator input |
408
+
409
+ ### Logging
410
+
411
+ All HITL decisions are logged with structured data:
412
+
413
+ ```json
414
+ {
415
+ "event": "hitl_decision",
416
+ "tool": "send_email",
417
+ "decision": "approved",
418
+ "operator_input": "A",
419
+ "latency_ms": 2500,
420
+ "timestamp": "2025-09-25T10:15:00Z"
421
+ }
422
+ ```
423
+
424
+ ### Demo
425
+
426
+ Run the interactive demo to see HITL in action:
427
+
428
+ ```bash
429
+ python aip_agents/examples/hitl_demo.py
430
+ ```
431
+
432
+ ## Architectural Notes
433
+
434
+ ### Memory Features
435
+
436
+ The library supports Mem0 as a memory backend for long-term conversation recall. Key features:
437
+ - Automatic persistence of user-agent interactions via `memory_backend="mem0"`.
438
+ - Semantic search for relevant past conversations.
439
+ - New `built_in_mem0_search` tool for explicit recall by time period (e.g., "yesterday", "last week", "July 2025").
440
+ - Date range parsing for natural language time filters using `dateparser`.
441
+ - Conditional auto-augmentation (disabled by default to reduce noise; enable with `memory_auto_augment=True`).
442
+
443
+ #### Mem0 Date Recall Example
444
+
445
+ Use the coordinator example with memory enabled:
446
+
447
+ ```bash
448
+ poetry run python aip_agents/examples/hello_world_a2a_mem0_coordinator_server.py
449
+ ```
450
+
451
+ In client:
452
+ ```python
453
+ agent = LangGraphAgent(
454
+ name="client",
455
+ instruction="...",
456
+ model="gpt-4o-mini",
457
+ memory_backend="mem0",
458
+ )
459
+ ```
460
+
461
+ Test recall: After some interactions, query "What did we discuss yesterday?" – agent uses tool to filter by created_at.
462
+
463
+ ## Deep Agents Middleware
464
+
465
+ The Deep Agents Middleware system provides composable components for enhancing agent capabilities with planning, context management, and custom lifecycle hooks.
466
+
467
+ ### Quick Start
468
+
469
+ Enable deep agent capabilities with a single parameter:
470
+
471
+ ```python
472
+ from aip_agents.agent.langgraph_react_agent import LangGraphReactAgent
473
+
474
+ # Enable planning + filesystem for complex multi-step tasks
475
+ agent = LangGraphReactAgent(
476
+ name="research_agent",
477
+ model="gpt-4",
478
+ planning=True, # Enables TodoListMiddleware for task decomposition
479
+ tools=[search_tool, calculator_tool],
480
+ )
481
+ ```
482
+
483
+ ### Understanding Planning vs Filesystem
484
+
485
+ **Important**: `planning` and `filesystem` are **completely independent** features:
486
+
487
+ - **`planning=True`**
488
+ - Adds `write_todos` tool for task decomposition
489
+ - Stores todos in **in-memory dictionary** (per thread_id)
490
+ - Does NOT use or require filesystem
491
+ - Perfect for breaking down complex tasks into steps
492
+ - Example: "Research quantum computing" → agent creates 5 subtasks
493
+
494
+ - **`filesystem=True`**
495
+ - Adds file operation tools: `ls`, `read_file`, `write_file`, `edit_file`, `grep`
496
+ - Stores data in **pluggable backend** (default: InMemoryBackend)
497
+ - Does NOT interact with planning/todos
498
+ - Perfect for offloading large tool results to prevent context overflow
499
+ - Example: Web search returns 50KB → agent writes to `/research/results.txt`
500
+
501
+ - **Both together** (`planning=True, filesystem=True`)
502
+ - Agent can plan tasks AND manage large data
503
+ - Todos stored separately in memory, files in backend
504
+ - Most powerful combination for complex research/analysis tasks
505
+
506
+ ### Planning Only
507
+
508
+ For task decomposition without filesystem:
509
+
510
+ ```python
511
+ agent = LangGraphReactAgent(
512
+ name="planner_agent",
513
+ model="gpt-4",
514
+ planning=True,
515
+ tools=[...],
516
+ )
517
+ ```
518
+
519
+ ### Filesystem Only
520
+
521
+ For context offloading without planning:
522
+
523
+ ```python
524
+ agent = LangGraphReactAgent(
525
+ name="data_processor",
526
+ model="gpt-4",
527
+ filesystem=True, # Enables FilesystemMiddleware
528
+ tools=[...],
529
+ )
530
+ ```
531
+
532
+ ### Custom Middleware
533
+
534
+ Create domain-specific middleware by implementing the `AgentMiddleware` protocol:
535
+
536
+ ```python
537
+ from aip_agents.middleware.base import AgentMiddleware, ModelRequest
538
+
539
+ class CustomMiddleware:
540
+ def __init__(self):
541
+ self.tools = [] # Add custom tools here
542
+ self.system_prompt_additions = "Custom instructions..."
543
+
544
+ def before_model(self, state: dict) -> dict:
545
+ # Hook executed before model invocation
546
+ return {}
547
+
548
+ def modify_model_request(self, request: ModelRequest, state: dict) -> ModelRequest:
549
+ # Modify the model request (add tools, adjust params, etc.)
550
+ return request
551
+
552
+ def after_model(self, state: dict) -> dict:
553
+ # Hook executed after model invocation
554
+ return {}
555
+
556
+ # COMPOSITION (not override): Custom middlewares EXTEND built-in middleware
557
+ agent = LangGraphReactAgent(
558
+ name="custom_agent",
559
+ model="gpt-4",
560
+ planning=True, # Adds TodoListMiddleware
561
+ filesystem=True, # Adds FilesystemMiddleware
562
+ middlewares=[CustomMiddleware()], # EXTENDS (doesn't replace) the above
563
+ tools=[...],
564
+ )
565
+ # Result: Agent has ALL THREE middleware active:
566
+ # 1. TodoListMiddleware (from planning=True)
567
+ # 2. FilesystemMiddleware (from filesystem=True)
568
+ # 3. CustomMiddleware (from middlewares parameter)
569
+ ```
570
+
571
+ **Key Points:**
572
+ - ✅ `middlewares` parameter **extends** (never replaces) auto-configured middleware
573
+ - ✅ `planning` and `filesystem` are **independent** - use either, both, or neither
574
+ - ✅ `planning=True` stores todos in **memory** (does NOT require filesystem)
575
+ - ✅ Execution order: built-in middleware (planning, filesystem) → custom middlewares
576
+ - ✅ All hooks from all middleware execute in sequence
577
+
578
+ **Common Combinations:**
579
+ ```python
580
+ # Planning only (no filesystem)
581
+ # → Todos stored in memory, no file operations available
582
+ agent = LangGraphReactAgent(planning=True)
583
+ # → [TodoListMiddleware]
584
+
585
+ # Filesystem only (no planning)
586
+ # → File operations available, no todo planning
587
+ agent = LangGraphReactAgent(filesystem=True)
588
+ # → [FilesystemMiddleware]
589
+
590
+ # Both planning and filesystem
591
+ # → Todos in memory + file operations (most powerful combination)
592
+ agent = LangGraphReactAgent(planning=True, filesystem=True)
593
+ # → [TodoListMiddleware, FilesystemMiddleware]
594
+
595
+ # Custom only (no auto-configuration)
596
+ agent = LangGraphReactAgent(middlewares=[CustomMiddleware()])
597
+ # → [CustomMiddleware]
598
+
599
+ # All together (composition)
600
+ agent = LangGraphReactAgent(
601
+ planning=True,
602
+ filesystem=True,
603
+ middlewares=[CustomMiddleware()]
604
+ )
605
+ # → [TodoListMiddleware, FilesystemMiddleware, CustomMiddleware]
606
+ ```
607
+
608
+ ### Advanced: Custom Storage Backend
609
+
610
+ Provide your own storage backend for filesystem operations:
611
+
612
+ ```python
613
+ from aip_agents.middleware.backends.protocol import BackendProtocol
614
+ from aip_agents.middleware.backends.memory import InMemoryBackend
615
+
616
+ # Use custom backend (e.g., PostgreSQL, S3, Redis)
617
+ custom_backend = MyCustomBackend()
618
+
619
+ agent = LangGraphReactAgent(
620
+ name="agent",
621
+ model="gpt-4",
622
+ filesystem=custom_backend, # Pass BackendProtocol instance
623
+ tools=[...],
624
+ )
625
+ ```
626
+
627
+ ### Benefits
628
+
629
+ - **Context Window Management**: Automatically offload large tool results to files
630
+ - **Task Decomposition**: Break down complex multi-step tasks into trackable todos
631
+ - **Incremental Development**: Add capabilities gradually (filesystem first, then planning)
632
+ - **Zero Breaking Changes**: Existing agents work unchanged (backward compatible)
633
+ - **Extensible**: Compose custom middleware with built-in components
634
+
635
+ For detailed documentation, see `docs/deep_agents_guide.md` (coming soon).
636
+
637
+ ### Agent Interface (`AgentInterface`)
638
+
639
+ The `aip_agents.agent.interface.AgentInterface` class defines a standardized contract for all agent implementations within the GLLM Agents ecosystem. It ensures that different agent types (e.g., LangGraph-based, Google ADK-based) expose a consistent set of methods for core operations.
640
+
641
+ Key methods defined by `AgentInterface` typically include:
642
+ - `arun()`: For asynchronous execution of the agent that returns a final consolidated response.
643
+ - `arun_stream()`: For asynchronous execution that streams back partial responses or events from the agent.
644
+
645
+ By adhering to this interface, users can interact with various agents in a uniform way, making it easier to switch between or combine different agent technologies.
646
+
647
+ ### Inversion of Control (IoC) / Dependency Injection (DI)
648
+
649
+ The agent implementations (e.g., `LangGraphAgent`, `GoogleADKAgent`) utilize Dependency Injection. For instance, `LangGraphAgent` accepts an `agent_executor` (like one created by LangGraph's `create_react_agent`) in its constructor. Similarly, `GoogleADKAgent` accepts a native `adk_native_agent`. This allows the core execution logic to be provided externally, promoting flexibility and decoupling the agent wrapper from the specific instantiation details of its underlying engine.