aip-agents-binary 0.6.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of aip-agents-binary might be problematic. Click here for more details.

Files changed (612) hide show
  1. aip_agents/__init__.py +65 -0
  2. aip_agents/__init__.pyi +19 -0
  3. aip_agents/a2a/__init__.py +19 -0
  4. aip_agents/a2a/__init__.pyi +3 -0
  5. aip_agents/a2a/server/__init__.py +10 -0
  6. aip_agents/a2a/server/__init__.pyi +4 -0
  7. aip_agents/a2a/server/base_executor.py +1086 -0
  8. aip_agents/a2a/server/base_executor.pyi +73 -0
  9. aip_agents/a2a/server/google_adk_executor.py +198 -0
  10. aip_agents/a2a/server/google_adk_executor.pyi +51 -0
  11. aip_agents/a2a/server/langflow_executor.py +180 -0
  12. aip_agents/a2a/server/langflow_executor.pyi +43 -0
  13. aip_agents/a2a/server/langgraph_executor.py +270 -0
  14. aip_agents/a2a/server/langgraph_executor.pyi +47 -0
  15. aip_agents/a2a/types.py +232 -0
  16. aip_agents/a2a/types.pyi +132 -0
  17. aip_agents/agent/__init__.py +27 -0
  18. aip_agents/agent/__init__.pyi +9 -0
  19. aip_agents/agent/base_agent.py +970 -0
  20. aip_agents/agent/base_agent.pyi +221 -0
  21. aip_agents/agent/base_langgraph_agent.py +3037 -0
  22. aip_agents/agent/base_langgraph_agent.pyi +233 -0
  23. aip_agents/agent/google_adk_agent.py +926 -0
  24. aip_agents/agent/google_adk_agent.pyi +141 -0
  25. aip_agents/agent/google_adk_constants.py +6 -0
  26. aip_agents/agent/google_adk_constants.pyi +3 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/__init__.pyi +6 -0
  29. aip_agents/agent/hitl/config.py +28 -0
  30. aip_agents/agent/hitl/config.pyi +15 -0
  31. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  32. aip_agents/agent/hitl/langgraph_hitl_mixin.pyi +42 -0
  33. aip_agents/agent/hitl/manager.py +532 -0
  34. aip_agents/agent/hitl/manager.pyi +200 -0
  35. aip_agents/agent/hitl/models.py +18 -0
  36. aip_agents/agent/hitl/models.pyi +3 -0
  37. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  38. aip_agents/agent/hitl/prompt/__init__.pyi +4 -0
  39. aip_agents/agent/hitl/prompt/base.py +42 -0
  40. aip_agents/agent/hitl/prompt/base.pyi +24 -0
  41. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  42. aip_agents/agent/hitl/prompt/deferred.pyi +30 -0
  43. aip_agents/agent/hitl/registry.py +149 -0
  44. aip_agents/agent/hitl/registry.pyi +101 -0
  45. aip_agents/agent/interface.py +138 -0
  46. aip_agents/agent/interface.pyi +81 -0
  47. aip_agents/agent/interfaces.py +65 -0
  48. aip_agents/agent/interfaces.pyi +44 -0
  49. aip_agents/agent/langflow_agent.py +464 -0
  50. aip_agents/agent/langflow_agent.pyi +133 -0
  51. aip_agents/agent/langgraph_memory_enhancer_agent.py +767 -0
  52. aip_agents/agent/langgraph_memory_enhancer_agent.pyi +50 -0
  53. aip_agents/agent/langgraph_react_agent.py +2856 -0
  54. aip_agents/agent/langgraph_react_agent.pyi +170 -0
  55. aip_agents/agent/system_instruction_context.py +34 -0
  56. aip_agents/agent/system_instruction_context.pyi +13 -0
  57. aip_agents/clients/__init__.py +10 -0
  58. aip_agents/clients/__init__.pyi +4 -0
  59. aip_agents/clients/langflow/__init__.py +10 -0
  60. aip_agents/clients/langflow/__init__.pyi +4 -0
  61. aip_agents/clients/langflow/client.py +477 -0
  62. aip_agents/clients/langflow/client.pyi +140 -0
  63. aip_agents/clients/langflow/types.py +18 -0
  64. aip_agents/clients/langflow/types.pyi +7 -0
  65. aip_agents/constants.py +23 -0
  66. aip_agents/constants.pyi +7 -0
  67. aip_agents/credentials/manager.py +132 -0
  68. aip_agents/examples/__init__.py +5 -0
  69. aip_agents/examples/__init__.pyi +0 -0
  70. aip_agents/examples/compare_streaming_client.py +783 -0
  71. aip_agents/examples/compare_streaming_client.pyi +48 -0
  72. aip_agents/examples/compare_streaming_server.py +142 -0
  73. aip_agents/examples/compare_streaming_server.pyi +18 -0
  74. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client.pyi +9 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_client_agent.pyi +9 -0
  78. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  79. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.pyi +9 -0
  80. aip_agents/examples/hello_world_a2a_google_adk_server.py +79 -0
  81. aip_agents/examples/hello_world_a2a_google_adk_server.pyi +15 -0
  82. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  83. aip_agents/examples/hello_world_a2a_langchain_client.pyi +5 -0
  84. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  85. aip_agents/examples/hello_world_a2a_langchain_client_agent.pyi +5 -0
  86. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  87. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.pyi +5 -0
  88. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  89. aip_agents/examples/hello_world_a2a_langchain_client_streaming.pyi +5 -0
  90. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  91. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.pyi +5 -0
  92. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +105 -0
  93. aip_agents/examples/hello_world_a2a_langchain_reference_server.pyi +15 -0
  94. aip_agents/examples/hello_world_a2a_langchain_server.py +79 -0
  95. aip_agents/examples/hello_world_a2a_langchain_server.pyi +15 -0
  96. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +78 -0
  97. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.pyi +15 -0
  98. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  99. aip_agents/examples/hello_world_a2a_langflow_client.pyi +9 -0
  100. aip_agents/examples/hello_world_a2a_langflow_server.py +82 -0
  101. aip_agents/examples/hello_world_a2a_langflow_server.pyi +14 -0
  102. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  103. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.pyi +5 -0
  104. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  105. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.pyi +5 -0
  106. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +92 -0
  107. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.pyi +16 -0
  108. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  109. aip_agents/examples/hello_world_a2a_langgraph_client.pyi +9 -0
  110. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  111. aip_agents/examples/hello_world_a2a_langgraph_client_agent.pyi +9 -0
  112. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  113. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.pyi +2 -0
  114. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  115. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.pyi +9 -0
  116. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  117. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.pyi +5 -0
  118. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  119. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.pyi +5 -0
  120. aip_agents/examples/hello_world_a2a_langgraph_server.py +84 -0
  121. aip_agents/examples/hello_world_a2a_langgraph_server.pyi +14 -0
  122. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +79 -0
  123. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.pyi +15 -0
  124. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +132 -0
  125. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.pyi +15 -0
  126. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  127. aip_agents/examples/hello_world_a2a_mcp_langgraph.pyi +48 -0
  128. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  129. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.pyi +48 -0
  130. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +251 -0
  131. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.pyi +45 -0
  132. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  133. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.pyi +5 -0
  134. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +80 -0
  135. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.pyi +15 -0
  136. aip_agents/examples/hello_world_google_adk.py +41 -0
  137. aip_agents/examples/hello_world_google_adk.pyi +5 -0
  138. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  139. aip_agents/examples/hello_world_google_adk_mcp_http.pyi +5 -0
  140. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  141. aip_agents/examples/hello_world_google_adk_mcp_http_stream.pyi +5 -0
  142. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  143. aip_agents/examples/hello_world_google_adk_mcp_sse.pyi +5 -0
  144. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  145. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.pyi +5 -0
  146. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  147. aip_agents/examples/hello_world_google_adk_mcp_stdio.pyi +5 -0
  148. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  149. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.pyi +5 -0
  150. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  151. aip_agents/examples/hello_world_google_adk_stream.pyi +5 -0
  152. aip_agents/examples/hello_world_langchain.py +28 -0
  153. aip_agents/examples/hello_world_langchain.pyi +5 -0
  154. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  155. aip_agents/examples/hello_world_langchain_lm_invoker.pyi +2 -0
  156. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  157. aip_agents/examples/hello_world_langchain_mcp_http.pyi +5 -0
  158. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  159. aip_agents/examples/hello_world_langchain_mcp_http_interactive.pyi +16 -0
  160. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  161. aip_agents/examples/hello_world_langchain_mcp_http_stream.pyi +5 -0
  162. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  163. aip_agents/examples/hello_world_langchain_mcp_multi_server.pyi +18 -0
  164. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  165. aip_agents/examples/hello_world_langchain_mcp_sse.pyi +5 -0
  166. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  167. aip_agents/examples/hello_world_langchain_mcp_sse_stream.pyi +5 -0
  168. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  169. aip_agents/examples/hello_world_langchain_mcp_stdio.pyi +5 -0
  170. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  171. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.pyi +5 -0
  172. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  173. aip_agents/examples/hello_world_langchain_stream.pyi +5 -0
  174. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  175. aip_agents/examples/hello_world_langchain_stream_lm_invoker.pyi +5 -0
  176. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  177. aip_agents/examples/hello_world_langflow_agent.pyi +35 -0
  178. aip_agents/examples/hello_world_langgraph.py +39 -0
  179. aip_agents/examples/hello_world_langgraph.pyi +5 -0
  180. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  181. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.pyi +5 -0
  182. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  183. aip_agents/examples/hello_world_langgraph_mcp_http.pyi +5 -0
  184. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  185. aip_agents/examples/hello_world_langgraph_mcp_http_stream.pyi +5 -0
  186. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  187. aip_agents/examples/hello_world_langgraph_mcp_sse.pyi +5 -0
  188. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  189. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.pyi +5 -0
  190. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  191. aip_agents/examples/hello_world_langgraph_mcp_stdio.pyi +5 -0
  192. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  193. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.pyi +5 -0
  194. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  195. aip_agents/examples/hello_world_langgraph_stream.pyi +5 -0
  196. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  197. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.pyi +5 -0
  198. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  199. aip_agents/examples/hello_world_model_switch_cli.pyi +30 -0
  200. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  201. aip_agents/examples/hello_world_multi_agent_adk.pyi +6 -0
  202. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  203. aip_agents/examples/hello_world_multi_agent_langchain.pyi +5 -0
  204. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  205. aip_agents/examples/hello_world_multi_agent_langgraph.pyi +5 -0
  206. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  207. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.pyi +5 -0
  208. aip_agents/examples/hello_world_pii_logger.py +21 -0
  209. aip_agents/examples/hello_world_pii_logger.pyi +5 -0
  210. aip_agents/examples/hello_world_ptc.py +49 -0
  211. aip_agents/examples/hello_world_ptc.pyi +5 -0
  212. aip_agents/examples/hello_world_sentry.py +133 -0
  213. aip_agents/examples/hello_world_sentry.pyi +21 -0
  214. aip_agents/examples/hello_world_step_limits.py +273 -0
  215. aip_agents/examples/hello_world_step_limits.pyi +17 -0
  216. aip_agents/examples/hello_world_stock_a2a_server.py +103 -0
  217. aip_agents/examples/hello_world_stock_a2a_server.pyi +17 -0
  218. aip_agents/examples/hello_world_tool_output_client.py +55 -0
  219. aip_agents/examples/hello_world_tool_output_client.pyi +5 -0
  220. aip_agents/examples/hello_world_tool_output_server.py +114 -0
  221. aip_agents/examples/hello_world_tool_output_server.pyi +19 -0
  222. aip_agents/examples/hitl_demo.py +724 -0
  223. aip_agents/examples/hitl_demo.pyi +67 -0
  224. aip_agents/examples/mcp_configs/configs.py +63 -0
  225. aip_agents/examples/mcp_servers/common.py +76 -0
  226. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  227. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  228. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  229. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  230. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  231. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  232. aip_agents/examples/pii_demo_langgraph_client.pyi +5 -0
  233. aip_agents/examples/pii_demo_langgraph_server.py +126 -0
  234. aip_agents/examples/pii_demo_langgraph_server.pyi +20 -0
  235. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  236. aip_agents/examples/pii_demo_multi_agent_client.pyi +5 -0
  237. aip_agents/examples/pii_demo_multi_agent_server.py +247 -0
  238. aip_agents/examples/pii_demo_multi_agent_server.pyi +40 -0
  239. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  240. aip_agents/examples/todolist_planning_a2a_langchain_client.pyi +5 -0
  241. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +88 -0
  242. aip_agents/examples/todolist_planning_a2a_langgraph_server.pyi +19 -0
  243. aip_agents/examples/tools/__init__.py +27 -0
  244. aip_agents/examples/tools/__init__.pyi +9 -0
  245. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  246. aip_agents/examples/tools/adk_arithmetic_tools.pyi +24 -0
  247. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  248. aip_agents/examples/tools/adk_weather_tool.pyi +18 -0
  249. aip_agents/examples/tools/data_generator_tool.py +103 -0
  250. aip_agents/examples/tools/data_generator_tool.pyi +15 -0
  251. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  252. aip_agents/examples/tools/data_visualization_tool.pyi +19 -0
  253. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  254. aip_agents/examples/tools/image_artifact_tool.pyi +26 -0
  255. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  256. aip_agents/examples/tools/langchain_arithmetic_tools.pyi +17 -0
  257. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  258. aip_agents/examples/tools/langchain_currency_exchange_tool.pyi +20 -0
  259. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  260. aip_agents/examples/tools/langchain_graph_artifact_tool.pyi +25 -0
  261. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  262. aip_agents/examples/tools/langchain_weather_tool.pyi +19 -0
  263. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  264. aip_agents/examples/tools/langgraph_streaming_tool.pyi +43 -0
  265. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  266. aip_agents/examples/tools/mock_retrieval_tool.pyi +13 -0
  267. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  268. aip_agents/examples/tools/pii_demo_tools.pyi +54 -0
  269. aip_agents/examples/tools/random_chart_tool.py +142 -0
  270. aip_agents/examples/tools/random_chart_tool.pyi +20 -0
  271. aip_agents/examples/tools/serper_tool.py +202 -0
  272. aip_agents/examples/tools/serper_tool.pyi +16 -0
  273. aip_agents/examples/tools/stock_tools.py +82 -0
  274. aip_agents/examples/tools/stock_tools.pyi +36 -0
  275. aip_agents/examples/tools/table_generator_tool.py +167 -0
  276. aip_agents/examples/tools/table_generator_tool.pyi +22 -0
  277. aip_agents/examples/tools/time_tool.py +82 -0
  278. aip_agents/examples/tools/time_tool.pyi +15 -0
  279. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  280. aip_agents/examples/tools/weather_forecast_tool.pyi +14 -0
  281. aip_agents/executor/agent_executor.py +473 -0
  282. aip_agents/executor/base.py +48 -0
  283. aip_agents/guardrails/__init__.py +83 -0
  284. aip_agents/guardrails/__init__.pyi +6 -0
  285. aip_agents/guardrails/engines/__init__.py +69 -0
  286. aip_agents/guardrails/engines/__init__.pyi +4 -0
  287. aip_agents/guardrails/engines/base.py +90 -0
  288. aip_agents/guardrails/engines/base.pyi +61 -0
  289. aip_agents/guardrails/engines/nemo.py +101 -0
  290. aip_agents/guardrails/engines/nemo.pyi +46 -0
  291. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  292. aip_agents/guardrails/engines/phrase_matcher.pyi +48 -0
  293. aip_agents/guardrails/exceptions.py +39 -0
  294. aip_agents/guardrails/exceptions.pyi +23 -0
  295. aip_agents/guardrails/manager.py +163 -0
  296. aip_agents/guardrails/manager.pyi +42 -0
  297. aip_agents/guardrails/middleware.py +199 -0
  298. aip_agents/guardrails/middleware.pyi +87 -0
  299. aip_agents/guardrails/schemas.py +63 -0
  300. aip_agents/guardrails/schemas.pyi +43 -0
  301. aip_agents/guardrails/utils.py +45 -0
  302. aip_agents/guardrails/utils.pyi +19 -0
  303. aip_agents/mcp/__init__.py +1 -0
  304. aip_agents/mcp/__init__.pyi +0 -0
  305. aip_agents/mcp/client/__init__.py +14 -0
  306. aip_agents/mcp/client/__init__.pyi +5 -0
  307. aip_agents/mcp/client/base_mcp_client.py +369 -0
  308. aip_agents/mcp/client/base_mcp_client.pyi +148 -0
  309. aip_agents/mcp/client/connection_manager.py +228 -0
  310. aip_agents/mcp/client/connection_manager.pyi +51 -0
  311. aip_agents/mcp/client/google_adk/__init__.py +11 -0
  312. aip_agents/mcp/client/google_adk/__init__.pyi +3 -0
  313. aip_agents/mcp/client/google_adk/client.py +381 -0
  314. aip_agents/mcp/client/google_adk/client.pyi +75 -0
  315. aip_agents/mcp/client/langchain/__init__.py +11 -0
  316. aip_agents/mcp/client/langchain/__init__.pyi +3 -0
  317. aip_agents/mcp/client/langchain/client.py +265 -0
  318. aip_agents/mcp/client/langchain/client.pyi +48 -0
  319. aip_agents/mcp/client/persistent_session.py +612 -0
  320. aip_agents/mcp/client/persistent_session.pyi +122 -0
  321. aip_agents/mcp/client/session_pool.py +351 -0
  322. aip_agents/mcp/client/session_pool.pyi +101 -0
  323. aip_agents/mcp/client/transports.py +263 -0
  324. aip_agents/mcp/client/transports.pyi +132 -0
  325. aip_agents/mcp/utils/__init__.py +7 -0
  326. aip_agents/mcp/utils/__init__.pyi +0 -0
  327. aip_agents/mcp/utils/config_validator.py +139 -0
  328. aip_agents/mcp/utils/config_validator.pyi +82 -0
  329. aip_agents/memory/__init__.py +14 -0
  330. aip_agents/memory/__init__.pyi +5 -0
  331. aip_agents/memory/adapters/__init__.py +10 -0
  332. aip_agents/memory/adapters/__init__.pyi +4 -0
  333. aip_agents/memory/adapters/base_adapter.py +811 -0
  334. aip_agents/memory/adapters/base_adapter.pyi +176 -0
  335. aip_agents/memory/adapters/mem0.py +84 -0
  336. aip_agents/memory/adapters/mem0.pyi +22 -0
  337. aip_agents/memory/base.py +84 -0
  338. aip_agents/memory/base.pyi +60 -0
  339. aip_agents/memory/constants.py +49 -0
  340. aip_agents/memory/constants.pyi +25 -0
  341. aip_agents/memory/factory.py +86 -0
  342. aip_agents/memory/factory.pyi +24 -0
  343. aip_agents/memory/guidance.py +20 -0
  344. aip_agents/memory/guidance.pyi +3 -0
  345. aip_agents/memory/simple_memory.py +47 -0
  346. aip_agents/memory/simple_memory.pyi +23 -0
  347. aip_agents/middleware/__init__.py +17 -0
  348. aip_agents/middleware/__init__.pyi +5 -0
  349. aip_agents/middleware/base.py +96 -0
  350. aip_agents/middleware/base.pyi +75 -0
  351. aip_agents/middleware/manager.py +150 -0
  352. aip_agents/middleware/manager.pyi +84 -0
  353. aip_agents/middleware/todolist.py +274 -0
  354. aip_agents/middleware/todolist.pyi +125 -0
  355. aip_agents/ptc/__init__.py +48 -0
  356. aip_agents/ptc/__init__.pyi +10 -0
  357. aip_agents/ptc/doc_gen.py +122 -0
  358. aip_agents/ptc/doc_gen.pyi +40 -0
  359. aip_agents/ptc/exceptions.py +39 -0
  360. aip_agents/ptc/exceptions.pyi +22 -0
  361. aip_agents/ptc/executor.py +143 -0
  362. aip_agents/ptc/executor.pyi +73 -0
  363. aip_agents/ptc/mcp/__init__.py +45 -0
  364. aip_agents/ptc/mcp/__init__.pyi +7 -0
  365. aip_agents/ptc/mcp/sandbox_bridge.py +668 -0
  366. aip_agents/ptc/mcp/sandbox_bridge.pyi +47 -0
  367. aip_agents/ptc/mcp/templates/__init__.py +1 -0
  368. aip_agents/ptc/mcp/templates/__init__.pyi +0 -0
  369. aip_agents/ptc/mcp/templates/mcp_client.py.template +239 -0
  370. aip_agents/ptc/naming.py +184 -0
  371. aip_agents/ptc/naming.pyi +76 -0
  372. aip_agents/ptc/payload.py +26 -0
  373. aip_agents/ptc/payload.pyi +15 -0
  374. aip_agents/ptc/prompt_builder.py +571 -0
  375. aip_agents/ptc/prompt_builder.pyi +55 -0
  376. aip_agents/ptc/ptc_helper.py +16 -0
  377. aip_agents/ptc/ptc_helper.pyi +1 -0
  378. aip_agents/ptc/sandbox_bridge.py +58 -0
  379. aip_agents/ptc/sandbox_bridge.pyi +25 -0
  380. aip_agents/ptc/template_utils.py +33 -0
  381. aip_agents/ptc/template_utils.pyi +13 -0
  382. aip_agents/ptc/templates/__init__.py +1 -0
  383. aip_agents/ptc/templates/__init__.pyi +0 -0
  384. aip_agents/ptc/templates/ptc_helper.py.template +134 -0
  385. aip_agents/sandbox/__init__.py +43 -0
  386. aip_agents/sandbox/__init__.pyi +5 -0
  387. aip_agents/sandbox/defaults.py +9 -0
  388. aip_agents/sandbox/defaults.pyi +2 -0
  389. aip_agents/sandbox/e2b_runtime.py +267 -0
  390. aip_agents/sandbox/e2b_runtime.pyi +51 -0
  391. aip_agents/sandbox/template_builder.py +131 -0
  392. aip_agents/sandbox/template_builder.pyi +36 -0
  393. aip_agents/sandbox/types.py +24 -0
  394. aip_agents/sandbox/types.pyi +14 -0
  395. aip_agents/sandbox/validation.py +50 -0
  396. aip_agents/sandbox/validation.pyi +20 -0
  397. aip_agents/schema/__init__.py +69 -0
  398. aip_agents/schema/__init__.pyi +9 -0
  399. aip_agents/schema/a2a.py +56 -0
  400. aip_agents/schema/a2a.pyi +40 -0
  401. aip_agents/schema/agent.py +111 -0
  402. aip_agents/schema/agent.pyi +65 -0
  403. aip_agents/schema/hitl.py +157 -0
  404. aip_agents/schema/hitl.pyi +89 -0
  405. aip_agents/schema/langgraph.py +37 -0
  406. aip_agents/schema/langgraph.pyi +28 -0
  407. aip_agents/schema/model_id.py +97 -0
  408. aip_agents/schema/model_id.pyi +54 -0
  409. aip_agents/schema/step_limit.py +108 -0
  410. aip_agents/schema/step_limit.pyi +63 -0
  411. aip_agents/schema/storage.py +40 -0
  412. aip_agents/schema/storage.pyi +21 -0
  413. aip_agents/sentry/__init__.py +11 -0
  414. aip_agents/sentry/__init__.pyi +3 -0
  415. aip_agents/sentry/sentry.py +151 -0
  416. aip_agents/sentry/sentry.pyi +48 -0
  417. aip_agents/storage/__init__.py +41 -0
  418. aip_agents/storage/__init__.pyi +8 -0
  419. aip_agents/storage/base.py +85 -0
  420. aip_agents/storage/base.pyi +58 -0
  421. aip_agents/storage/clients/__init__.py +12 -0
  422. aip_agents/storage/clients/__init__.pyi +3 -0
  423. aip_agents/storage/clients/minio_client.py +318 -0
  424. aip_agents/storage/clients/minio_client.pyi +137 -0
  425. aip_agents/storage/config.py +62 -0
  426. aip_agents/storage/config.pyi +29 -0
  427. aip_agents/storage/providers/__init__.py +15 -0
  428. aip_agents/storage/providers/__init__.pyi +5 -0
  429. aip_agents/storage/providers/base.py +106 -0
  430. aip_agents/storage/providers/base.pyi +88 -0
  431. aip_agents/storage/providers/memory.py +114 -0
  432. aip_agents/storage/providers/memory.pyi +79 -0
  433. aip_agents/storage/providers/object_storage.py +214 -0
  434. aip_agents/storage/providers/object_storage.pyi +98 -0
  435. aip_agents/tools/__init__.py +64 -0
  436. aip_agents/tools/__init__.pyi +11 -0
  437. aip_agents/tools/browser_use/__init__.py +82 -0
  438. aip_agents/tools/browser_use/__init__.pyi +14 -0
  439. aip_agents/tools/browser_use/action_parser.py +103 -0
  440. aip_agents/tools/browser_use/action_parser.pyi +18 -0
  441. aip_agents/tools/browser_use/browser_use_tool.py +1120 -0
  442. aip_agents/tools/browser_use/browser_use_tool.pyi +50 -0
  443. aip_agents/tools/browser_use/llm_config.py +120 -0
  444. aip_agents/tools/browser_use/llm_config.pyi +52 -0
  445. aip_agents/tools/browser_use/minio_storage.py +198 -0
  446. aip_agents/tools/browser_use/minio_storage.pyi +109 -0
  447. aip_agents/tools/browser_use/schemas.py +119 -0
  448. aip_agents/tools/browser_use/schemas.pyi +32 -0
  449. aip_agents/tools/browser_use/session.py +76 -0
  450. aip_agents/tools/browser_use/session.pyi +4 -0
  451. aip_agents/tools/browser_use/session_errors.py +132 -0
  452. aip_agents/tools/browser_use/session_errors.pyi +53 -0
  453. aip_agents/tools/browser_use/steel_session_recording.py +317 -0
  454. aip_agents/tools/browser_use/steel_session_recording.pyi +63 -0
  455. aip_agents/tools/browser_use/streaming.py +815 -0
  456. aip_agents/tools/browser_use/streaming.pyi +81 -0
  457. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  458. aip_agents/tools/browser_use/structured_data_parser.pyi +86 -0
  459. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  460. aip_agents/tools/browser_use/structured_data_recovery.pyi +43 -0
  461. aip_agents/tools/browser_use/types.py +78 -0
  462. aip_agents/tools/browser_use/types.pyi +45 -0
  463. aip_agents/tools/code_sandbox/__init__.py +26 -0
  464. aip_agents/tools/code_sandbox/__init__.pyi +3 -0
  465. aip_agents/tools/code_sandbox/constant.py +13 -0
  466. aip_agents/tools/code_sandbox/constant.pyi +4 -0
  467. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +306 -0
  468. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.pyi +102 -0
  469. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +411 -0
  470. aip_agents/tools/code_sandbox/e2b_sandbox_tool.pyi +29 -0
  471. aip_agents/tools/constants.py +177 -0
  472. aip_agents/tools/constants.pyi +138 -0
  473. aip_agents/tools/date_range_tool.py +554 -0
  474. aip_agents/tools/date_range_tool.pyi +21 -0
  475. aip_agents/tools/document_loader/__init__.py +44 -0
  476. aip_agents/tools/document_loader/__init__.pyi +7 -0
  477. aip_agents/tools/document_loader/base_reader.py +302 -0
  478. aip_agents/tools/document_loader/base_reader.pyi +75 -0
  479. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  480. aip_agents/tools/document_loader/docx_reader_tool.pyi +10 -0
  481. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  482. aip_agents/tools/document_loader/excel_reader_tool.pyi +26 -0
  483. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  484. aip_agents/tools/document_loader/pdf_reader_tool.pyi +11 -0
  485. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  486. aip_agents/tools/document_loader/pdf_splitter.pyi +18 -0
  487. aip_agents/tools/execute_ptc_code.py +308 -0
  488. aip_agents/tools/execute_ptc_code.pyi +90 -0
  489. aip_agents/tools/gl_connector/__init__.py +5 -0
  490. aip_agents/tools/gl_connector/__init__.pyi +3 -0
  491. aip_agents/tools/gl_connector/tool.py +383 -0
  492. aip_agents/tools/gl_connector/tool.pyi +74 -0
  493. aip_agents/tools/gl_connector_tools.py +119 -0
  494. aip_agents/tools/gl_connector_tools.pyi +39 -0
  495. aip_agents/tools/memory_search/__init__.py +29 -0
  496. aip_agents/tools/memory_search/__init__.pyi +5 -0
  497. aip_agents/tools/memory_search/base.py +200 -0
  498. aip_agents/tools/memory_search/base.pyi +69 -0
  499. aip_agents/tools/memory_search/mem0.py +365 -0
  500. aip_agents/tools/memory_search/mem0.pyi +29 -0
  501. aip_agents/tools/memory_search/schema.py +81 -0
  502. aip_agents/tools/memory_search/schema.pyi +25 -0
  503. aip_agents/tools/memory_search_tool.py +34 -0
  504. aip_agents/tools/memory_search_tool.pyi +3 -0
  505. aip_agents/tools/time_tool.py +117 -0
  506. aip_agents/tools/time_tool.pyi +16 -0
  507. aip_agents/tools/tool_config_injector.py +300 -0
  508. aip_agents/tools/tool_config_injector.pyi +26 -0
  509. aip_agents/tools/web_search/__init__.py +15 -0
  510. aip_agents/tools/web_search/__init__.pyi +3 -0
  511. aip_agents/tools/web_search/serper_tool.py +187 -0
  512. aip_agents/tools/web_search/serper_tool.pyi +19 -0
  513. aip_agents/types/__init__.py +70 -0
  514. aip_agents/types/__init__.pyi +36 -0
  515. aip_agents/types/a2a_events.py +13 -0
  516. aip_agents/types/a2a_events.pyi +3 -0
  517. aip_agents/utils/__init__.py +79 -0
  518. aip_agents/utils/__init__.pyi +11 -0
  519. aip_agents/utils/a2a_connector.py +1757 -0
  520. aip_agents/utils/a2a_connector.pyi +146 -0
  521. aip_agents/utils/artifact_helpers.py +502 -0
  522. aip_agents/utils/artifact_helpers.pyi +203 -0
  523. aip_agents/utils/constants.py +22 -0
  524. aip_agents/utils/constants.pyi +10 -0
  525. aip_agents/utils/datetime/__init__.py +34 -0
  526. aip_agents/utils/datetime/__init__.pyi +4 -0
  527. aip_agents/utils/datetime/normalization.py +231 -0
  528. aip_agents/utils/datetime/normalization.pyi +95 -0
  529. aip_agents/utils/datetime/timezone.py +206 -0
  530. aip_agents/utils/datetime/timezone.pyi +48 -0
  531. aip_agents/utils/env_loader.py +27 -0
  532. aip_agents/utils/env_loader.pyi +10 -0
  533. aip_agents/utils/event_handler_registry.py +58 -0
  534. aip_agents/utils/event_handler_registry.pyi +23 -0
  535. aip_agents/utils/file_prompt_utils.py +176 -0
  536. aip_agents/utils/file_prompt_utils.pyi +21 -0
  537. aip_agents/utils/final_response_builder.py +211 -0
  538. aip_agents/utils/final_response_builder.pyi +34 -0
  539. aip_agents/utils/formatter_llm_client.py +231 -0
  540. aip_agents/utils/formatter_llm_client.pyi +71 -0
  541. aip_agents/utils/langgraph/__init__.py +19 -0
  542. aip_agents/utils/langgraph/__init__.pyi +3 -0
  543. aip_agents/utils/langgraph/converter.py +128 -0
  544. aip_agents/utils/langgraph/converter.pyi +49 -0
  545. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  546. aip_agents/utils/langgraph/tool_managers/__init__.pyi +5 -0
  547. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  548. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.pyi +35 -0
  549. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  550. aip_agents/utils/langgraph/tool_managers/base_tool_manager.pyi +48 -0
  551. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1096 -0
  552. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.pyi +56 -0
  553. aip_agents/utils/langgraph/tool_output_management.py +1047 -0
  554. aip_agents/utils/langgraph/tool_output_management.pyi +329 -0
  555. aip_agents/utils/logger.py +195 -0
  556. aip_agents/utils/logger.pyi +60 -0
  557. aip_agents/utils/metadata/__init__.py +27 -0
  558. aip_agents/utils/metadata/__init__.pyi +5 -0
  559. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  560. aip_agents/utils/metadata/activity_metadata_helper.pyi +25 -0
  561. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  562. aip_agents/utils/metadata/activity_narrative/__init__.pyi +7 -0
  563. aip_agents/utils/metadata/activity_narrative/builder.py +817 -0
  564. aip_agents/utils/metadata/activity_narrative/builder.pyi +35 -0
  565. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  566. aip_agents/utils/metadata/activity_narrative/constants.pyi +10 -0
  567. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  568. aip_agents/utils/metadata/activity_narrative/context.pyi +32 -0
  569. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  570. aip_agents/utils/metadata/activity_narrative/formatters.pyi +48 -0
  571. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  572. aip_agents/utils/metadata/activity_narrative/utils.pyi +12 -0
  573. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  574. aip_agents/utils/metadata/schemas/__init__.pyi +4 -0
  575. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  576. aip_agents/utils/metadata/schemas/activity_schema.pyi +18 -0
  577. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  578. aip_agents/utils/metadata/schemas/thinking_schema.pyi +20 -0
  579. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  580. aip_agents/utils/metadata/thinking_metadata_helper.pyi +4 -0
  581. aip_agents/utils/metadata_helper.py +358 -0
  582. aip_agents/utils/metadata_helper.pyi +117 -0
  583. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  584. aip_agents/utils/name_preprocessor/__init__.pyi +6 -0
  585. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  586. aip_agents/utils/name_preprocessor/base_name_preprocessor.pyi +52 -0
  587. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  588. aip_agents/utils/name_preprocessor/google_name_preprocessor.pyi +38 -0
  589. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  590. aip_agents/utils/name_preprocessor/name_preprocessor.pyi +41 -0
  591. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  592. aip_agents/utils/name_preprocessor/openai_name_preprocessor.pyi +34 -0
  593. aip_agents/utils/pii/__init__.py +25 -0
  594. aip_agents/utils/pii/__init__.pyi +5 -0
  595. aip_agents/utils/pii/pii_handler.py +397 -0
  596. aip_agents/utils/pii/pii_handler.pyi +96 -0
  597. aip_agents/utils/pii/pii_helper.py +207 -0
  598. aip_agents/utils/pii/pii_helper.pyi +78 -0
  599. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  600. aip_agents/utils/pii/uuid_deanonymizer_mapping.pyi +73 -0
  601. aip_agents/utils/reference_helper.py +273 -0
  602. aip_agents/utils/reference_helper.pyi +81 -0
  603. aip_agents/utils/sse_chunk_transformer.py +831 -0
  604. aip_agents/utils/sse_chunk_transformer.pyi +166 -0
  605. aip_agents/utils/step_limit_manager.py +265 -0
  606. aip_agents/utils/step_limit_manager.pyi +112 -0
  607. aip_agents/utils/token_usage_helper.py +156 -0
  608. aip_agents/utils/token_usage_helper.pyi +60 -0
  609. aip_agents_binary-0.6.4.dist-info/METADATA +673 -0
  610. aip_agents_binary-0.6.4.dist-info/RECORD +612 -0
  611. aip_agents_binary-0.6.4.dist-info/WHEEL +5 -0
  612. aip_agents_binary-0.6.4.dist-info/top_level.txt +1 -0
@@ -0,0 +1,138 @@
1
+ from _typeshed import Incomplete
2
+ from enum import Enum, StrEnum
3
+
4
+ GL_CONNECTORS_BASE_URL: Incomplete
5
+ GL_CONNECTORS_API_KEY: Incomplete
6
+ GL_CONNECTORS_FETCH_MAX_RETRIES: Incomplete
7
+ BOSA_API_BASE_URL = GL_CONNECTORS_BASE_URL
8
+ BOSA_API_KEY = GL_CONNECTORS_API_KEY
9
+ BOSA_FETCH_MAX_RETRIES = GL_CONNECTORS_FETCH_MAX_RETRIES
10
+
11
+ class ToolType(StrEnum):
12
+ """Tool types for GL Connectors."""
13
+ GLLM: str
14
+ LANGCHAIN: str
15
+
16
+ class Action(Enum):
17
+ """Actions for GL Connectors."""
18
+ GITHUB: str
19
+ GOOGLE: str
20
+ GOOGLE_DRIVE: str
21
+ GOOGLE_MAIL: str
22
+ TWITTER: str
23
+
24
+ class GitHubEndpoint(Enum):
25
+ """GitHub endpoints for GL Connectors."""
26
+ INTEGRATIONS: str
27
+ USER_HAS_INTEGRATION: str
28
+ SUCCESS_AUTHORIZE_CALLBACK: str
29
+ CREATE_ISSUE_HANDLER: str
30
+ GET_ISSUE_HANDLER: str
31
+ LIST_ISSUES: str
32
+ LIST_ISSUES_COMMENTS: str
33
+ SEARCH_ALL_ISSUES: str
34
+ GET_COMMITS: str
35
+ SEARCH_COMMITS: str
36
+ GET_COLLABORATORS: str
37
+ GET_RELEASES: str
38
+ GET_CONTRIBUTORS: str
39
+ GET_LANGUAGES: str
40
+ SEARCH_CONTRIBUTIONS: str
41
+ LIST_PULL_REQUESTS: str
42
+ SEARCH_PR: str
43
+ GET_PULL: str
44
+ GET_ALL_CONTRIBUTOR_COMMIT_ACTIVITIES: str
45
+ GET_COMMIT_ACTIVITY: str
46
+ GET_WEEKLY_COMMIT_COUNTS: str
47
+ GET_USER_CONTRIBUTION_STATISTICS: str
48
+ LIST_PROJECT_ITEMS: str
49
+ LIST_PROJECTS: str
50
+
51
+ class GoogleDriveEndpoint(Enum):
52
+ """Google Drive endpoints for GL Connectors."""
53
+ INTEGRATIONS: str
54
+ USER_HAS_INTEGRATION: str
55
+ SUCCESS_AUTHORIZE_CALLBACK: str
56
+ SEARCH_FILES: str
57
+ GET_FILE: str
58
+ CREATE_FILE: str
59
+ CREATE_FOLDER: str
60
+ UPDATE_FILE: str
61
+ UPDATE_FOLDER: str
62
+ COPY_FILE: str
63
+ DELETE_FILE: str
64
+ SUMMARIZE_FOLDER_FILES_BY_TYPE: str
65
+ SUMMARIZE_TOTAL_FILES_BY_TYPE: str
66
+ RECENT_FILES: str
67
+ CREATE_PERMISSION: str
68
+ LIST_PERMISSIONS: str
69
+ GET_PERMISSION: str
70
+ UPDATE_PERMISSION: str
71
+ DELETE_PERMISSION: str
72
+ DOWNLOAD_FILE: str
73
+
74
+ class GoogleDocsEndpoint(Enum):
75
+ """Google Docs endpoints for GL Connectors."""
76
+ INTEGRATIONS: str
77
+ USER_HAS_INTEGRATION: str
78
+ SUCCESS_AUTHORIZE_CALLBACK: str
79
+ GET_DOCUMENT: str
80
+ LIST_DOCUMENTS: str
81
+ CREATE_DOCUMENT: str
82
+ UPDATE_DOCUMENT: str
83
+ COPY_CONTENT: str
84
+ UPDATE_DOCUMENT_MARKDOWN: str
85
+ LIST_COMMENTS: str
86
+ SUMMARIZE_COMMENTS: str
87
+
88
+ class GoogleEndpoint(Enum):
89
+ """Google endpoints for GL Connectors."""
90
+ INTEGRATIONS: str
91
+ USER_HAS_INTEGRATION: str
92
+ SUCCESS_AUTHORIZE_CALLBACK: str
93
+ USERINFO: str
94
+
95
+ class TwitterEndpoint(Enum):
96
+ """Twitter endpoints for GL Connectors."""
97
+ INTEGRATIONS: str
98
+ USER_HAS_INTEGRATION: str
99
+ SUCCESS_AUTHORIZE_CALLBACK: str
100
+ SEARCH: str
101
+ GET_TWEETS: str
102
+ GET_THREAD: str
103
+ GET_USERS: str
104
+
105
+ class GoogleMailEndpoint(Enum):
106
+ """Google Mail endpoints for GL Connectors."""
107
+ INTEGRATIONS: str
108
+ USER_HAS_INTEGRATION: str
109
+ SUCCESS_AUTHORIZE_CALLBACK: str
110
+ CREATE_DRAFT: str
111
+ LIST_DRAFTS: str
112
+ SEND_DRAFT: str
113
+ GET_DRAFT: str
114
+ MODIFY_DRAFT: str
115
+ LIST_LABELS: str
116
+ LABEL_STATS: str
117
+ GET_LABEL_DETAILS: str
118
+ CREATE_LABELS: str
119
+ MODIFY_LABELS: str
120
+ DELETE_LABELS: str
121
+ SEND_EMAIL: str
122
+ LIST_EMAILS: str
123
+ GET_EMAIL_DETAILS: str
124
+ MODIFY_EMAIL: str
125
+ DELETE_EMAIL: str
126
+ TRASH_EMAIL: str
127
+ UNTRASH_EMAIL: str
128
+ LIST_THREADS: str
129
+ THREAD_DETAILS: str
130
+ MODIFY_THREAD: str
131
+ GET_AUTO_REPLY: str
132
+ SET_AUTO_REPLY: str
133
+ GET_ATTACHMENT: str
134
+ USERINFO: str
135
+
136
+ class ActionEndpointMap:
137
+ """Maps Action enums to their corresponding Endpoint enums."""
138
+ MAP: dict[Action, type[Enum]]
@@ -0,0 +1,554 @@
1
+ """Tool to get date ranges for common time periods.
2
+
3
+ Authors:
4
+ Christian Trisno Sen Long Chen (christian.t.s.l.chen@gdplabs.id)
5
+ Fachriza Dian Adhiatma (fachriza.d.adhiatma@gdplabs.id)
6
+ """
7
+
8
+ import json
9
+ import re
10
+ from collections.abc import Callable
11
+ from datetime import datetime, timedelta
12
+
13
+ from dateutil.relativedelta import relativedelta
14
+ from langchain_core.tools import BaseTool
15
+ from pydantic import BaseModel, Field
16
+
17
+ FORMAT_STRING = "%m/%d/%y %H:%M:%S"
18
+
19
+ MIN_DAYS_FOR_WEEK_SPLIT = 6 # Minimum days difference for week split (7 days inclusive = 6 days difference)
20
+ MONTH_NAME_ABBR_THRESHOLD = 3 # len > 3 implies full month name, else try abbreviated form
21
+ SUPPORTED_DATE_RANGES = [
22
+ "last_week",
23
+ "this_week",
24
+ "last_month",
25
+ "this_month",
26
+ "yesterday",
27
+ "today",
28
+ "last_7_days",
29
+ "last_30_days",
30
+ "this_quarter",
31
+ "last_quarter",
32
+ "this_year",
33
+ "last_year",
34
+ "[N]_days_ago",
35
+ "[N]_weeks_ago",
36
+ "[N]_months_ago",
37
+ "YYYY-MM-DD to YYYY-MM-DD",
38
+ ]
39
+
40
+
41
+ class DateRangeToolInput(BaseModel):
42
+ """Input schema for the DateRangeTool."""
43
+
44
+ date_range: str = Field(
45
+ ...,
46
+ description="""
47
+ Date range identifier. Supported values:
48
+ - Relative periods: 'last_week', 'this_week', 'last_month', 'this_month'
49
+ - Relative days: 'yesterday', 'today', 'last_7_days', 'last_30_days'
50
+ - Custom range: 'N_days_ago', 'N_weeks_ago', 'N_months_ago' (replace N with number)
51
+ - Quarter: 'this_quarter', 'last_quarter'
52
+ - Year: 'this_year', 'last_year'
53
+ - Natural forms: 'January 2025', 'January-March 2025', 'Q1 2025'
54
+ - Explicit date range: 'YYYY-MM-DD to YYYY-MM-DD' (e.g., '2025-08-01 to 2025-08-07')
55
+
56
+ Note: For queries like 'first week of August 2025', convert to explicit format: '2025-08-01 to 2025-08-07'
57
+ """,
58
+ )
59
+ format: str = Field(
60
+ default=FORMAT_STRING,
61
+ description="Optional datetime format string. Default: '%m/%d/%y'",
62
+ )
63
+ split_weeks: bool = Field(
64
+ default=False,
65
+ description=(
66
+ "If True and the resulting period spans more than one week, include a 'weeks' array of Sunday–Saturday"
67
+ " splits that fit within the requested period (not recent fixed weeks)."
68
+ ),
69
+ )
70
+
71
+
72
+ class DateRangeTool(BaseTool):
73
+ """Tool to get date ranges for common time periods."""
74
+
75
+ name: str = "date_range_tool"
76
+ description: str = """
77
+ Useful for getting date ranges for various time periods.
78
+ Supports relative dates, custom ranges, and standard periods.
79
+ Returns start and end dates for the specified period.
80
+ """
81
+ args_schema: type[BaseModel] = DateRangeToolInput
82
+
83
+ def _parse_custom_range(self, date_range: str) -> tuple[datetime, datetime]:
84
+ """Parse custom range patterns like '3_days_ago', '2_weeks_ago', etc.
85
+
86
+ Args:
87
+ date_range (str): A string representing the custom date range in the format '{number}_{unit}_ago',
88
+ where {number} is an integer and {unit} is one of 'days', 'weeks', or 'months'.
89
+
90
+ Returns:
91
+ tuple[datetime, datetime]: A tuple containing the start date and end date corresponding to the custom range.
92
+ """
93
+ pattern = r"(\d+)_(days|weeks|months)_ago"
94
+ match = re.match(pattern, date_range)
95
+ start_date = None
96
+ end_date = None
97
+ if not match:
98
+ raise ValueError(f"Invalid custom range format: {date_range}")
99
+
100
+ number, unit = int(match.group(1)), match.group(2)
101
+ today = datetime.now()
102
+
103
+ if unit == "days":
104
+ start_date = today - timedelta(days=number)
105
+ end_date = today
106
+ elif unit == "weeks":
107
+ start_date = today - timedelta(weeks=number)
108
+ end_date = today
109
+ elif unit == "months":
110
+ start_date = today - relativedelta(months=number)
111
+ end_date = today
112
+
113
+ return start_date, end_date
114
+
115
+ def _parse_month(self, month_str: str) -> int:
116
+ """Parse month name (full or abbreviated) to month number (1-12).
117
+
118
+ Args:
119
+ month_str (int): The month name string to parse.
120
+
121
+ Returns:
122
+ int: The month number (1-12).
123
+ """
124
+ fmt = "%B" if len(month_str) > MONTH_NAME_ABBR_THRESHOLD else "%b"
125
+ try:
126
+ return datetime.strptime(month_str, fmt).month
127
+ except ValueError:
128
+ # Fallback to abbreviated format
129
+ return datetime.strptime(month_str, "%b").month
130
+
131
+ def _parse_explicit_range(self, dr: str) -> tuple[datetime, datetime] | None:
132
+ """Parse explicit date range: YYYY-MM-DD to YYYY-MM-DD.
133
+
134
+ Args:
135
+ dr (str): The date range string to parse.
136
+
137
+ Returns:
138
+ tuple[datetime, datetime] | None: A tuple of (start_date, end_date) if matched, otherwise None.
139
+ """
140
+ m_explicit = re.match(r"^(\d{4}-\d{2}-\d{2})\s+to\s+(\d{4}-\d{2}-\d{2})$", dr, flags=re.IGNORECASE)
141
+ if m_explicit:
142
+ try:
143
+ start = datetime.strptime(m_explicit.group(1), "%Y-%m-%d")
144
+ end = datetime.strptime(m_explicit.group(2), "%Y-%m-%d")
145
+ if start > end:
146
+ raise ValueError("Start date must be before or equal to end date")
147
+ return start, end
148
+ except ValueError:
149
+ return None
150
+ return None
151
+
152
+ def _parse_quarter_with_year(self, dr: str) -> tuple[datetime, datetime] | None:
153
+ """Parse quarter with year: Q1 2025.
154
+
155
+ Args:
156
+ dr (str): The date range string to parse.
157
+
158
+ Returns:
159
+ tuple[datetime, datetime] | None: A tuple of (start_date, end_date) if matched, otherwise None.
160
+ """
161
+ m_q = re.match(r"^Q([1-4])\s+(\d{4})$", dr, flags=re.IGNORECASE)
162
+ if m_q:
163
+ q = int(m_q.group(1))
164
+ year = int(m_q.group(2))
165
+ start_month = (q - 1) * 3 + 1
166
+ start = datetime(year, start_month, 1)
167
+ end = start + relativedelta(months=3, days=-1)
168
+ return start, end
169
+ return None
170
+
171
+ def _parse_month_range_with_year(self, dr: str) -> tuple[datetime, datetime] | None:
172
+ """Parse month range within a year: January-March 2025.
173
+
174
+ Args:
175
+ dr (str): The date range string to parse.
176
+
177
+ Returns:
178
+ tuple[datetime, datetime] | None: A tuple of (start_date, end_date) if matched, otherwise None.
179
+ """
180
+ m_range = re.match(r"^([A-Za-z]{3,9})\s*-\s*([A-Za-z]{3,9})\s+(\d{4})$", dr)
181
+ if m_range:
182
+ m1, m2, year_s = m_range.groups()
183
+ year = int(year_s)
184
+ try:
185
+ start_month = self._parse_month(m1)
186
+ end_month = self._parse_month(m2)
187
+ start = datetime(year, start_month, 1)
188
+ end = datetime(year, end_month, 1) + relativedelta(months=1, days=-1)
189
+ return start, end
190
+ except ValueError:
191
+ return None
192
+ return None
193
+
194
+ def _parse_single_month_with_year(self, dr: str) -> tuple[datetime, datetime] | None:
195
+ """Parse single month with year: January 2025.
196
+
197
+ Args:
198
+ dr (str): The date range string to parse.
199
+
200
+ Returns:
201
+ tuple[datetime, datetime] | None: A tuple of (start_date, end_date) if matched, otherwise None.
202
+ """
203
+ m_single = re.match(r"^([A-Za-z]{3,9})\s+(\d{4})$", dr)
204
+ if m_single:
205
+ mname, year_s = m_single.groups()
206
+ year = int(year_s)
207
+ try:
208
+ month = self._parse_month(mname)
209
+ start = datetime(year, month, 1)
210
+ end = start + relativedelta(months=1, days=-1)
211
+ return start, end
212
+ except ValueError:
213
+ return None
214
+ return None
215
+
216
+ def _parse_month_or_range(self, date_range: str) -> tuple[datetime, datetime] | None:
217
+ """Parse inputs like 'January 2025', 'Jan 2025', 'January-March 2025', 'Jan-Mar 2025', 'Q1 2025'.
218
+
219
+ Also parses explicit date ranges like '2025-08-01 to 2025-08-07'.
220
+
221
+ Args:
222
+ date_range (str): The date range string to parse.
223
+ Can be natural month/quarter forms or explicit YYYY-MM-DD format.
224
+
225
+ Returns:
226
+ tuple[datetime, datetime] | None: A tuple of (start_date, end_date) if matched, otherwise None.
227
+
228
+ Raises:
229
+ ValueError: If start date is after end date (caught internally and returns None).
230
+
231
+ Examples:
232
+ >>> self._parse_month_or_range("January 2025")
233
+ (datetime(2025, 1, 1), datetime(2025, 1, 31))
234
+ >>> self._parse_month_or_range("2025-08-01 to 2025-08-07")
235
+ (datetime(2025, 8, 1), datetime(2025, 8, 7))
236
+ """
237
+ dr = date_range.strip()
238
+
239
+ # Try each parser in order
240
+ parsers = [
241
+ self._parse_explicit_range,
242
+ self._parse_quarter_with_year,
243
+ self._parse_month_range_with_year,
244
+ self._parse_single_month_with_year,
245
+ ]
246
+
247
+ for parser in parsers:
248
+ result = parser(dr)
249
+ if result:
250
+ return result
251
+
252
+ return None
253
+
254
+ def _get_quarter_dates(self, today: datetime, last_quarter: bool = False) -> tuple[datetime, datetime]:
255
+ """Calculate the start and end dates of the current or last quarter based on the given date.
256
+
257
+ Args:
258
+ today (datetime): The reference date to determine the quarter.
259
+ last_quarter (bool, optional): If True, calculate the dates for the last quarter.
260
+ If False, calculate the dates for the current quarter.
261
+ Defaults to False.
262
+
263
+ Returns:
264
+ tuple[datetime, datetime]: A tuple containing the start and end dates of the quarter.
265
+ """
266
+ current_quarter = (today.month - 1) // 3
267
+ if last_quarter:
268
+ if current_quarter == 0:
269
+ start_date = datetime(today.year - 1, 10, 1)
270
+ end_date = datetime(today.year - 1, 12, 31)
271
+ else:
272
+ start_date = datetime(today.year, 3 * (current_quarter - 1) + 1, 1)
273
+ end_date = datetime(today.year, 3 * current_quarter, 1) + relativedelta(months=1, days=-1)
274
+ else:
275
+ start_date = datetime(today.year, 3 * current_quarter + 1, 1)
276
+ end_date = datetime(today.year, 3 * (current_quarter + 1), 1) + relativedelta(months=1, days=-1)
277
+ return start_date, end_date
278
+
279
+ def _days_since_most_recent_sunday(self, date: datetime) -> int:
280
+ """Return days since most recent Sunday (0 if today is Sunday).
281
+
282
+ Args:
283
+ date (datetime): The reference date.
284
+
285
+ Returns:
286
+ int: Days since most recent Sunday (0-6).
287
+ """
288
+ # weekday(): Mon=0, Tue=1, ..., Sun=6
289
+ # We want Sun=0, Mon=1, ..., Sat=6
290
+ return (date.weekday() + 1) % 7
291
+
292
+ def _get_standard_period_dates(self, date_range: str, today: datetime) -> tuple[datetime, datetime]:
293
+ """Calculate the start and end dates for a given standard period relative to a specified date.
294
+
295
+ Args:
296
+ date_range (str): The standard period to calculate dates for.
297
+ Supported values are "last_week", "this_week", "last_month", and "this_month".
298
+ today (datetime): The reference date to calculate the period from.
299
+
300
+ Returns:
301
+ tuple[datetime, datetime]: A tuple containing the start and end dates of the specified period.
302
+ """
303
+ if date_range == "last_week":
304
+ # Calculate the previous Saturday (end of last week)
305
+ days_since_sunday = self._days_since_most_recent_sunday(today)
306
+ last_saturday = today - timedelta(days=days_since_sunday + 1)
307
+
308
+ # Calculate the previous Sunday (start of last week)
309
+ last_sunday = last_saturday - timedelta(days=6)
310
+
311
+ return last_sunday, last_saturday
312
+
313
+ if date_range == "this_week":
314
+ # Calculate the most recent Sunday (start of this week)
315
+ days_since_sunday = self._days_since_most_recent_sunday(today)
316
+ sunday = today - timedelta(days=days_since_sunday)
317
+
318
+ # Calculate the upcoming Saturday (end of this week)
319
+ saturday = sunday + timedelta(days=6)
320
+
321
+ return sunday, saturday
322
+
323
+ if date_range == "last_month":
324
+ first_day = today.replace(day=1)
325
+ last_month = first_day - timedelta(days=1)
326
+ return last_month.replace(day=1), last_month
327
+
328
+ if date_range == "this_month":
329
+ start = today.replace(day=1)
330
+ return start, start + relativedelta(months=1, days=-1)
331
+
332
+ raise ValueError(f"Unknown standard period: {date_range}")
333
+
334
+ def _week_bounds_for(self, date: datetime) -> tuple[datetime, datetime]:
335
+ """Return the Sunday-to-Saturday week containing the given date.
336
+
337
+ - Sunday is the start of week.
338
+ - Saturday is the end of week.
339
+
340
+ Args:
341
+ date (datetime): The date to find the week bounds for.
342
+
343
+ Returns:
344
+ tuple[datetime, datetime]: A tuple containing the start and end dates of the week.
345
+ """
346
+ days_since_sunday = self._days_since_most_recent_sunday(date)
347
+ sunday = datetime(date.year, date.month, date.day) - timedelta(days=days_since_sunday)
348
+ saturday = sunday + timedelta(days=6)
349
+ return sunday, saturday
350
+
351
+ def _build_week_splits(self, start_date: datetime, end_date: datetime, fmt: str) -> list[dict[str, str]]:
352
+ """Build Sunday–Saturday week splits that intersect [start_date, end_date].
353
+
354
+ - Includes partial edge weeks if any day of the Sun–Sat week falls within the requested range.
355
+ - Week entries still use full Sunday–Saturday bounds for consistency.
356
+ - Labels weeks consecutively as week_1, week_2, ...
357
+
358
+ Args:
359
+ start_date (datetime): Start of requested period.
360
+ end_date (datetime): End of requested period.
361
+ fmt (str): Format string for dates.
362
+
363
+ Returns:
364
+ list[dict]: Weekly split entries with start_date, end_date, and human description.
365
+ """
366
+ weeks: list[dict] = []
367
+ # Anchor on the Sunday of the week that contains start_date
368
+ first_week_sunday, _ = self._week_bounds_for(start_date)
369
+ cursor = first_week_sunday
370
+ idx = 1
371
+ while cursor <= end_date:
372
+ full_week_start = cursor
373
+ full_week_end = cursor + timedelta(days=6)
374
+ # Include any week that intersects the requested range
375
+ if not (full_week_end < start_date or full_week_start > end_date):
376
+ desc = f"From {full_week_start.strftime('%B %d, %Y')} to {full_week_end.strftime('%B %d, %Y')}"
377
+ weeks.append(
378
+ {
379
+ "period": f"week_{idx}",
380
+ "start_date": full_week_start.strftime(fmt),
381
+ "end_date": full_week_end.strftime(fmt),
382
+ "description": desc,
383
+ }
384
+ )
385
+ idx += 1
386
+ cursor += timedelta(days=7)
387
+ return weeks
388
+
389
+ def _get_relative_day_dates(self, date_range: str, today: datetime) -> tuple[datetime, datetime]:
390
+ """Calculate the start and end dates for a given relative date range.
391
+
392
+ Args:
393
+ date_range (str): The relative date range. Supported values are "yesterday", "today",
394
+ "last_7_days", and "last_30_days".
395
+ today (datetime): The reference date from which the relative date range is calculated.
396
+
397
+ Returns:
398
+ tuple[datetime, datetime]: A tuple containing the start and end dates for the specified
399
+ relative date range.
400
+ """
401
+ if date_range == "yesterday":
402
+ yesterday = today - timedelta(days=1)
403
+ return yesterday, yesterday
404
+
405
+ if date_range == "today":
406
+ return today, today
407
+
408
+ if date_range == "last_7_days":
409
+ return today - timedelta(days=7), today
410
+
411
+ if date_range == "last_30_days":
412
+ return today - timedelta(days=30), today
413
+
414
+ raise ValueError(f"Unknown relative day range: {date_range}")
415
+
416
+ def _get_year_dates(self, date_range: str, today: datetime) -> tuple[datetime, datetime]:
417
+ """Returns the start and end dates for the specified year range.
418
+
419
+ Args:
420
+ date_range (str): The year range to calculate dates for.
421
+ Accepted values are "this_year" and "last_year".
422
+ today (datetime): The current date to base the year calculation on.
423
+
424
+ Returns:
425
+ Tuple[datetime, datetime]: A tuple containing the start and end dates for the specified year range.
426
+ """
427
+ if date_range == "this_year":
428
+ return datetime(today.year, 1, 1), datetime(today.year, 12, 31)
429
+
430
+ if date_range == "last_year":
431
+ return datetime(today.year - 1, 1, 1), datetime(today.year - 1, 12, 31)
432
+
433
+ raise ValueError(f"Unknown year range: {date_range}")
434
+
435
+ def _format_response(
436
+ self,
437
+ start_date: datetime,
438
+ end_date: datetime,
439
+ date_range: str,
440
+ format: str,
441
+ weeks: list[dict] | None = None,
442
+ ) -> str:
443
+ """Format the response as a JSON string with the given date range information.
444
+
445
+ Args:
446
+ start_date (datetime): The start date of the range.
447
+ end_date (datetime): The end date of the range.
448
+ date_range (str): A string representation of the date range.
449
+ format (str): The format string to use for formatting the dates.
450
+ weeks (list[dict] | None): Optional weekly splits (Sunday–Saturday) for the period. This
451
+ is included when `split_weeks` is True and the overall period spans more than one week.
452
+
453
+ Returns:
454
+ str: A JSON string containing the formatted start date, end date, period, and description.
455
+ """
456
+ if weeks:
457
+ payload: dict = {
458
+ "weeks": weeks,
459
+ "period": date_range,
460
+ "description": f"Split into {len(weeks)} weeks with Sunday-to-Saturday bounds",
461
+ }
462
+ return json.dumps(payload)
463
+ payload: dict = {
464
+ "start_date": start_date.strftime(format),
465
+ "end_date": end_date.strftime(format),
466
+ "period": date_range,
467
+ "description": f"From {start_date.strftime('%B %d, %Y')} to {end_date.strftime('%B %d, %Y')}",
468
+ }
469
+ return json.dumps(payload)
470
+
471
+ def _get_result_and_format(
472
+ self,
473
+ date_range: str,
474
+ format: str,
475
+ split_weeks: bool,
476
+ result: tuple[datetime, datetime],
477
+ ) -> str:
478
+ """Helper to format response with optional week splits.
479
+
480
+ Args:
481
+ date_range (str): The date range string to process.
482
+ format (str): The format string to use for the output.
483
+ split_weeks (bool): If True and the resulting period spans more than one week,
484
+ also include a 'weeks' array with Sunday-to-Saturday splits for the recent weeks.
485
+ result (tuple[datetime, datetime]): A tuple containing the start and end dates of the date range.
486
+
487
+ Returns:
488
+ str: A formatted date range string or an error message if the date range is unsupported or an error occurs.
489
+ """
490
+ start_date, end_date = result
491
+ weeks = None
492
+ # Only build week splits when requested and range spans more than one week
493
+ if split_weeks and (end_date - start_date).days >= MIN_DAYS_FOR_WEEK_SPLIT:
494
+ weeks = self._build_week_splits(start_date, end_date, format)
495
+ return self._format_response(start_date, end_date, date_range, format, weeks=weeks)
496
+
497
+ def _run(self, date_range: str, format: str = FORMAT_STRING, split_weeks: bool = False) -> str:
498
+ """Process a given date range string and return a formatted date range string.
499
+
500
+ Args:
501
+ date_range (str): The date range string to process. Supported formats include:
502
+ - "standard_periods"
503
+ - "relative_days"
504
+ - "quarters"
505
+ - "years"
506
+ - "custom" (e.g., "10_days_ago", "2_weeks_ago", "3_months_ago")
507
+ format (str, optional): The format string to use for the output. Defaults to FORMAT_STRING.
508
+ split_weeks (bool, optional): If True and the resulting period spans more than one week,
509
+ also include a 'weeks' array with Sunday-to-Saturday splits for the recent weeks.
510
+
511
+ Returns:
512
+ str: A formatted date range string or an error message if the date range is unsupported or an error occurs.
513
+ """
514
+ today = datetime.now()
515
+
516
+ try:
517
+ handlers: dict[str, Callable] = {
518
+ "standard_periods": lambda: self._get_standard_period_dates(date_range, today),
519
+ "relative_days": lambda: self._get_relative_day_dates(date_range, today),
520
+ # Only handle special tokens 'this_quarter' and 'last_quarter' here. Natural forms like 'Q1 2025'
521
+ # are parsed later by _parse_month_or_range(). For non-matching inputs, return None so we keep trying.
522
+ "quarters": lambda: (
523
+ self._get_quarter_dates(today, last_quarter=(date_range == "last_quarter"))
524
+ if date_range in {"this_quarter", "last_quarter"}
525
+ else None
526
+ ),
527
+ "years": lambda: self._get_year_dates(date_range, today),
528
+ "custom": lambda: (
529
+ self._parse_custom_range(date_range)
530
+ if re.match(r"\d+_(days|weeks|months)_ago", date_range)
531
+ else None
532
+ ),
533
+ }
534
+
535
+ for handler in handlers.values():
536
+ try:
537
+ result = handler()
538
+ if result:
539
+ return self._get_result_and_format(date_range, format, split_weeks, result)
540
+ except ValueError:
541
+ continue
542
+
543
+ # Try parsing natural month/quarter expressions
544
+ mr = self._parse_month_or_range(date_range)
545
+ if mr:
546
+ return self._get_result_and_format(date_range, format, split_weeks, mr)
547
+
548
+ return (
549
+ f"Unsupported date range: {date_range}, supported date ranges are: {SUPPORTED_DATE_RANGES} "
550
+ f"or natural month/quarter forms like 'January 2025', 'January-March 2025', 'Q1 2025'."
551
+ )
552
+
553
+ except Exception as e:
554
+ return f"Error processing date range: {str(e)}"