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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. aip_agents/__init__.py +66 -0
  2. aip_agents/a2a/__init__.py +19 -0
  3. aip_agents/a2a/server/__init__.py +10 -0
  4. aip_agents/a2a/server/base_executor.py +1125 -0
  5. aip_agents/a2a/server/google_adk_executor.py +198 -0
  6. aip_agents/a2a/server/langflow_executor.py +180 -0
  7. aip_agents/a2a/server/langgraph_executor.py +270 -0
  8. aip_agents/a2a/types.py +232 -0
  9. aip_agents/a2ui/__init__.py +26 -0
  10. aip_agents/a2ui/catalog_provider.py +109 -0
  11. aip_agents/a2ui/examples/0.8/booking_form.json +1 -0
  12. aip_agents/a2ui/examples/0.8/confirmation.json +1 -0
  13. aip_agents/a2ui/examples/0.8/single_column_list.json +1 -0
  14. aip_agents/a2ui/examples/0.9/booking_form.json +1 -0
  15. aip_agents/a2ui/examples/0.9/confirmation.json +1 -0
  16. aip_agents/a2ui/examples/0.9/single_column_list.json +1 -0
  17. aip_agents/a2ui/middleware.py +754 -0
  18. aip_agents/a2ui/models.py +153 -0
  19. aip_agents/a2ui/public_url.py +138 -0
  20. aip_agents/a2ui/stream_filter.py +67 -0
  21. aip_agents/agent/__init__.py +72 -0
  22. aip_agents/agent/base_agent.py +1437 -0
  23. aip_agents/agent/base_langgraph_agent.py +4048 -0
  24. aip_agents/agent/google_adk_agent.py +932 -0
  25. aip_agents/agent/google_adk_constants.py +11 -0
  26. aip_agents/agent/graph_runtime.py +185 -0
  27. aip_agents/agent/hitl/__init__.py +24 -0
  28. aip_agents/agent/hitl/config.py +28 -0
  29. aip_agents/agent/hitl/langgraph_hitl_mixin.py +515 -0
  30. aip_agents/agent/hitl/manager.py +532 -0
  31. aip_agents/agent/hitl/models.py +18 -0
  32. aip_agents/agent/hitl/prompt/__init__.py +9 -0
  33. aip_agents/agent/hitl/prompt/base.py +42 -0
  34. aip_agents/agent/hitl/prompt/deferred.py +73 -0
  35. aip_agents/agent/hitl/registry.py +149 -0
  36. aip_agents/agent/interface.py +138 -0
  37. aip_agents/agent/interfaces.py +65 -0
  38. aip_agents/agent/langflow_agent.py +464 -0
  39. aip_agents/agent/langgraph_react_agent.py +3741 -0
  40. aip_agents/agent/model_invocation_adapter.py +346 -0
  41. aip_agents/agent/system_instruction_context.py +34 -0
  42. aip_agents/agent/tool_execution_engine.py +587 -0
  43. aip_agents/audio_interface/__init__.py +30 -0
  44. aip_agents/audio_interface/audio_agent_adapter.py +254 -0
  45. aip_agents/audio_interface/config.py +146 -0
  46. aip_agents/audio_interface/errors.py +15 -0
  47. aip_agents/audio_interface/livekit_audio_session.py +504 -0
  48. aip_agents/audio_interface/livekit_realtime_audio_session.py +142 -0
  49. aip_agents/audio_interface/session_factory.py +40 -0
  50. aip_agents/clients/__init__.py +10 -0
  51. aip_agents/clients/langflow/__init__.py +10 -0
  52. aip_agents/clients/langflow/client.py +477 -0
  53. aip_agents/clients/langflow/types.py +18 -0
  54. aip_agents/common/__init__.py +5 -0
  55. aip_agents/common/callable_introspection.py +17 -0
  56. aip_agents/constants.py +23 -0
  57. aip_agents/context/__init__.py +5 -0
  58. aip_agents/context/budget.py +237 -0
  59. aip_agents/context/compaction.py +339 -0
  60. aip_agents/context/metadata.py +169 -0
  61. aip_agents/context/offload.py +449 -0
  62. aip_agents/context/preparation.py +196 -0
  63. aip_agents/context/prompt.py +61 -0
  64. aip_agents/context/runtime.py +149 -0
  65. aip_agents/context/session_recall.py +69 -0
  66. aip_agents/context/state.py +48 -0
  67. aip_agents/context/utils.py +44 -0
  68. aip_agents/credentials/manager.py +132 -0
  69. aip_agents/examples/__init__.py +5 -0
  70. aip_agents/examples/audio_livekit_session.py +116 -0
  71. aip_agents/examples/compare_streaming_client.py +783 -0
  72. aip_agents/examples/compare_streaming_server.py +141 -0
  73. aip_agents/examples/gl_connectors_smoke.py +148 -0
  74. aip_agents/examples/hello_world_a2a_google_adk_client.py +49 -0
  75. aip_agents/examples/hello_world_a2a_google_adk_client_agent.py +48 -0
  76. aip_agents/examples/hello_world_a2a_google_adk_client_streaming.py +60 -0
  77. aip_agents/examples/hello_world_a2a_google_adk_server.py +78 -0
  78. aip_agents/examples/hello_world_a2a_langchain_client.py +39 -0
  79. aip_agents/examples/hello_world_a2a_langchain_client_agent.py +39 -0
  80. aip_agents/examples/hello_world_a2a_langchain_client_lm_invoker.py +37 -0
  81. aip_agents/examples/hello_world_a2a_langchain_client_streaming.py +41 -0
  82. aip_agents/examples/hello_world_a2a_langchain_reference_client_streaming.py +60 -0
  83. aip_agents/examples/hello_world_a2a_langchain_reference_server.py +104 -0
  84. aip_agents/examples/hello_world_a2a_langchain_server.py +78 -0
  85. aip_agents/examples/hello_world_a2a_langchain_server_lm_invoker.py +77 -0
  86. aip_agents/examples/hello_world_a2a_langflow_client.py +83 -0
  87. aip_agents/examples/hello_world_a2a_langflow_server.py +80 -0
  88. aip_agents/examples/hello_world_a2a_langgraph_artifact_client.py +73 -0
  89. aip_agents/examples/hello_world_a2a_langgraph_artifact_client_streaming.py +76 -0
  90. aip_agents/examples/hello_world_a2a_langgraph_artifact_server.py +91 -0
  91. aip_agents/examples/hello_world_a2a_langgraph_client.py +54 -0
  92. aip_agents/examples/hello_world_a2a_langgraph_client_agent.py +54 -0
  93. aip_agents/examples/hello_world_a2a_langgraph_client_agent_lm_invoker.py +32 -0
  94. aip_agents/examples/hello_world_a2a_langgraph_client_streaming.py +50 -0
  95. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_lm_invoker.py +44 -0
  96. aip_agents/examples/hello_world_a2a_langgraph_client_streaming_tool_streaming.py +92 -0
  97. aip_agents/examples/hello_world_a2a_langgraph_server.py +83 -0
  98. aip_agents/examples/hello_world_a2a_langgraph_server_lm_invoker.py +78 -0
  99. aip_agents/examples/hello_world_a2a_langgraph_server_tool_streaming.py +131 -0
  100. aip_agents/examples/hello_world_a2a_mcp_langgraph.py +196 -0
  101. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_client.py +244 -0
  102. aip_agents/examples/hello_world_a2a_three_level_agent_hierarchy_server.py +250 -0
  103. aip_agents/examples/hello_world_a2a_with_metadata_langchain_client.py +57 -0
  104. aip_agents/examples/hello_world_a2a_with_metadata_langchain_server_lm_invoker.py +79 -0
  105. aip_agents/examples/hello_world_filesystem.py +162 -0
  106. aip_agents/examples/hello_world_google_adk.py +41 -0
  107. aip_agents/examples/hello_world_google_adk_mcp_http.py +34 -0
  108. aip_agents/examples/hello_world_google_adk_mcp_http_stream.py +40 -0
  109. aip_agents/examples/hello_world_google_adk_mcp_sse.py +44 -0
  110. aip_agents/examples/hello_world_google_adk_mcp_sse_stream.py +48 -0
  111. aip_agents/examples/hello_world_google_adk_mcp_stdio.py +44 -0
  112. aip_agents/examples/hello_world_google_adk_mcp_stdio_stream.py +48 -0
  113. aip_agents/examples/hello_world_google_adk_stream.py +44 -0
  114. aip_agents/examples/hello_world_langchain.py +28 -0
  115. aip_agents/examples/hello_world_langchain_lm_invoker.py +15 -0
  116. aip_agents/examples/hello_world_langchain_mcp_http.py +34 -0
  117. aip_agents/examples/hello_world_langchain_mcp_http_interactive.py +130 -0
  118. aip_agents/examples/hello_world_langchain_mcp_http_stream.py +42 -0
  119. aip_agents/examples/hello_world_langchain_mcp_multi_server.py +155 -0
  120. aip_agents/examples/hello_world_langchain_mcp_sse.py +34 -0
  121. aip_agents/examples/hello_world_langchain_mcp_sse_stream.py +40 -0
  122. aip_agents/examples/hello_world_langchain_mcp_stdio.py +30 -0
  123. aip_agents/examples/hello_world_langchain_mcp_stdio_stream.py +41 -0
  124. aip_agents/examples/hello_world_langchain_stream.py +36 -0
  125. aip_agents/examples/hello_world_langchain_stream_lm_invoker.py +39 -0
  126. aip_agents/examples/hello_world_langflow_agent.py +163 -0
  127. aip_agents/examples/hello_world_langgraph.py +39 -0
  128. aip_agents/examples/hello_world_langgraph_gl_connector_twitter.py +44 -0
  129. aip_agents/examples/hello_world_langgraph_mcp_http.py +31 -0
  130. aip_agents/examples/hello_world_langgraph_mcp_http_stream.py +34 -0
  131. aip_agents/examples/hello_world_langgraph_mcp_sse.py +35 -0
  132. aip_agents/examples/hello_world_langgraph_mcp_sse_stream.py +50 -0
  133. aip_agents/examples/hello_world_langgraph_mcp_stdio.py +35 -0
  134. aip_agents/examples/hello_world_langgraph_mcp_stdio_stream.py +50 -0
  135. aip_agents/examples/hello_world_langgraph_skills.py +62 -0
  136. aip_agents/examples/hello_world_langgraph_stream.py +43 -0
  137. aip_agents/examples/hello_world_langgraph_stream_lm_invoker.py +37 -0
  138. aip_agents/examples/hello_world_model_switch_cli.py +210 -0
  139. aip_agents/examples/hello_world_multi_agent_adk.py +75 -0
  140. aip_agents/examples/hello_world_multi_agent_langchain.py +54 -0
  141. aip_agents/examples/hello_world_multi_agent_langgraph.py +66 -0
  142. aip_agents/examples/hello_world_multi_agent_langgraph_lm_invoker.py +69 -0
  143. aip_agents/examples/hello_world_multi_agent_tool_output_client.py +57 -0
  144. aip_agents/examples/hello_world_multi_agent_tool_output_server.py +131 -0
  145. aip_agents/examples/hello_world_pii_logger.py +21 -0
  146. aip_agents/examples/hello_world_ptc.py +49 -0
  147. aip_agents/examples/hello_world_ptc_custom_tools.py +83 -0
  148. aip_agents/examples/hello_world_sentry.py +133 -0
  149. aip_agents/examples/hello_world_step_limits.py +273 -0
  150. aip_agents/examples/hello_world_stock_a2a_server.py +100 -0
  151. aip_agents/examples/hello_world_tool_output_client.py +55 -0
  152. aip_agents/examples/hello_world_tool_output_server.py +113 -0
  153. aip_agents/examples/hitl_demo.py +724 -0
  154. aip_agents/examples/mcp_configs/configs.py +63 -0
  155. aip_agents/examples/mcp_servers/common.py +76 -0
  156. aip_agents/examples/mcp_servers/mcp_name.py +29 -0
  157. aip_agents/examples/mcp_servers/mcp_server_http.py +19 -0
  158. aip_agents/examples/mcp_servers/mcp_server_sse.py +19 -0
  159. aip_agents/examples/mcp_servers/mcp_server_stdio.py +19 -0
  160. aip_agents/examples/mcp_servers/mcp_time.py +10 -0
  161. aip_agents/examples/pii_demo_langgraph_client.py +69 -0
  162. aip_agents/examples/pii_demo_langgraph_server.py +125 -0
  163. aip_agents/examples/pii_demo_multi_agent_client.py +80 -0
  164. aip_agents/examples/pii_demo_multi_agent_server.py +246 -0
  165. aip_agents/examples/todolist_planning_a2a_langchain_client.py +70 -0
  166. aip_agents/examples/todolist_planning_a2a_langgraph_server.py +87 -0
  167. aip_agents/examples/tools/__init__.py +27 -0
  168. aip_agents/examples/tools/adk_arithmetic_tools.py +36 -0
  169. aip_agents/examples/tools/adk_weather_tool.py +60 -0
  170. aip_agents/examples/tools/data_generator_tool.py +103 -0
  171. aip_agents/examples/tools/data_visualization_tool.py +312 -0
  172. aip_agents/examples/tools/image_artifact_tool.py +136 -0
  173. aip_agents/examples/tools/langchain_arithmetic_tools.py +26 -0
  174. aip_agents/examples/tools/langchain_currency_exchange_tool.py +88 -0
  175. aip_agents/examples/tools/langchain_graph_artifact_tool.py +172 -0
  176. aip_agents/examples/tools/langchain_weather_tool.py +48 -0
  177. aip_agents/examples/tools/langgraph_streaming_tool.py +130 -0
  178. aip_agents/examples/tools/mock_retrieval_tool.py +56 -0
  179. aip_agents/examples/tools/multiply_tool.py +43 -0
  180. aip_agents/examples/tools/pii_demo_tools.py +189 -0
  181. aip_agents/examples/tools/random_chart_tool.py +142 -0
  182. aip_agents/examples/tools/serper_tool.py +202 -0
  183. aip_agents/examples/tools/stock_tools.py +82 -0
  184. aip_agents/examples/tools/table_generator_tool.py +167 -0
  185. aip_agents/examples/tools/time_tool.py +82 -0
  186. aip_agents/examples/tools/weather_forecast_tool.py +38 -0
  187. aip_agents/guardrails/__init__.py +83 -0
  188. aip_agents/guardrails/engines/__init__.py +69 -0
  189. aip_agents/guardrails/engines/base.py +90 -0
  190. aip_agents/guardrails/engines/nemo.py +101 -0
  191. aip_agents/guardrails/engines/phrase_matcher.py +113 -0
  192. aip_agents/guardrails/exceptions.py +39 -0
  193. aip_agents/guardrails/manager.py +163 -0
  194. aip_agents/guardrails/middleware.py +199 -0
  195. aip_agents/guardrails/schemas.py +63 -0
  196. aip_agents/guardrails/utils.py +45 -0
  197. aip_agents/integration/__init__.py +43 -0
  198. aip_agents/integration/agent.py +58 -0
  199. aip_agents/integration/guardrails.py +52 -0
  200. aip_agents/integration/hitl.py +71 -0
  201. aip_agents/integration/ptc.py +95 -0
  202. aip_agents/integration/skills.py +37 -0
  203. aip_agents/integration/storage.py +81 -0
  204. aip_agents/integration/version.py +103 -0
  205. aip_agents/mcp/__init__.py +1 -0
  206. aip_agents/mcp/client/__init__.py +60 -0
  207. aip_agents/mcp/client/base_mcp_client.py +377 -0
  208. aip_agents/mcp/client/connection_manager.py +231 -0
  209. aip_agents/mcp/client/errors.py +119 -0
  210. aip_agents/mcp/client/google_adk/__init__.py +45 -0
  211. aip_agents/mcp/client/google_adk/client.py +383 -0
  212. aip_agents/mcp/client/langchain/__init__.py +11 -0
  213. aip_agents/mcp/client/langchain/client.py +265 -0
  214. aip_agents/mcp/client/persistent_session.py +704 -0
  215. aip_agents/mcp/client/session_pool.py +358 -0
  216. aip_agents/mcp/client/transports.py +288 -0
  217. aip_agents/mcp/utils/__init__.py +7 -0
  218. aip_agents/mcp/utils/config_validator.py +139 -0
  219. aip_agents/memory/__init__.py +14 -0
  220. aip_agents/memory/adapters/__init__.py +10 -0
  221. aip_agents/memory/adapters/base_adapter.py +815 -0
  222. aip_agents/memory/adapters/mem0.py +286 -0
  223. aip_agents/memory/base.py +84 -0
  224. aip_agents/memory/constants.py +49 -0
  225. aip_agents/memory/factory.py +86 -0
  226. aip_agents/memory/guidance.py +20 -0
  227. aip_agents/memory/simple_memory.py +47 -0
  228. aip_agents/middleware/__init__.py +65 -0
  229. aip_agents/middleware/backends/__init__.py +72 -0
  230. aip_agents/middleware/backends/in_memory.py +578 -0
  231. aip_agents/middleware/backends/local_disk.py +1203 -0
  232. aip_agents/middleware/backends/protocol.py +353 -0
  233. aip_agents/middleware/backends/sandbox.py +1431 -0
  234. aip_agents/middleware/backends/sandbox_files.py +113 -0
  235. aip_agents/middleware/backends/utils.py +293 -0
  236. aip_agents/middleware/base.py +239 -0
  237. aip_agents/middleware/filesystem.py +690 -0
  238. aip_agents/middleware/manager.py +291 -0
  239. aip_agents/middleware/memory.py +532 -0
  240. aip_agents/middleware/pii_middleware.py +192 -0
  241. aip_agents/middleware/schema.py +19 -0
  242. aip_agents/middleware/skills.py +872 -0
  243. aip_agents/middleware/task_delegation.py +1656 -0
  244. aip_agents/middleware/todolist.py +276 -0
  245. aip_agents/middleware/tools/__init__.py +23 -0
  246. aip_agents/middleware/tools/edit_file.py +70 -0
  247. aip_agents/middleware/tools/execute.py +428 -0
  248. aip_agents/middleware/tools/grep_file.py +79 -0
  249. aip_agents/middleware/tools/ls.py +71 -0
  250. aip_agents/middleware/tools/read_file.py +239 -0
  251. aip_agents/middleware/tools/skill_load.py +193 -0
  252. aip_agents/middleware/tools/skill_resource.py +338 -0
  253. aip_agents/middleware/tools/write_file.py +114 -0
  254. aip_agents/middleware/vision.py +322 -0
  255. aip_agents/ptc/__init__.py +87 -0
  256. aip_agents/ptc/custom_tools.py +511 -0
  257. aip_agents/ptc/custom_tools_payload.py +499 -0
  258. aip_agents/ptc/custom_tools_templates/__init__.py +1 -0
  259. aip_agents/ptc/custom_tools_templates/custom_build_function.py.template +24 -0
  260. aip_agents/ptc/custom_tools_templates/custom_init.py.template +26 -0
  261. aip_agents/ptc/custom_tools_templates/custom_invoke.py.template +149 -0
  262. aip_agents/ptc/custom_tools_templates/custom_registry.py.template +112 -0
  263. aip_agents/ptc/custom_tools_templates/custom_sources_init.py.template +7 -0
  264. aip_agents/ptc/custom_tools_templates/custom_wrapper.py.template +87 -0
  265. aip_agents/ptc/doc_gen.py +122 -0
  266. aip_agents/ptc/exceptions.py +57 -0
  267. aip_agents/ptc/executor.py +627 -0
  268. aip_agents/ptc/mcp/__init__.py +45 -0
  269. aip_agents/ptc/mcp/sandbox_bridge.py +679 -0
  270. aip_agents/ptc/mcp/templates/__init__.py +1 -0
  271. aip_agents/ptc/mcp/templates/mcp_client.py.template +240 -0
  272. aip_agents/ptc/naming.py +430 -0
  273. aip_agents/ptc/payload.py +26 -0
  274. aip_agents/ptc/prompt_builder.py +674 -0
  275. aip_agents/ptc/ptc_helper.py +16 -0
  276. aip_agents/ptc/sandbox_bridge.py +297 -0
  277. aip_agents/ptc/template_utils.py +33 -0
  278. aip_agents/ptc/templates/__init__.py +1 -0
  279. aip_agents/ptc/templates/ptc_helper.py.template +134 -0
  280. aip_agents/ptc/tool_def_helpers.py +101 -0
  281. aip_agents/ptc/tool_enrichment.py +163 -0
  282. aip_agents/resilience/__init__.py +10 -0
  283. aip_agents/resilience/base.py +46 -0
  284. aip_agents/resilience/tool.py +1661 -0
  285. aip_agents/sandbox/__init__.py +62 -0
  286. aip_agents/sandbox/defaults.py +220 -0
  287. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1-datasaur.Dockerfile +120 -0
  288. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-1.Dockerfile +100 -0
  289. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2-datasaur.Dockerfile +143 -0
  290. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-2.Dockerfile +119 -0
  291. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3-datasaur.Dockerfile +173 -0
  292. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-3.Dockerfile +130 -0
  293. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.Dockerfile +164 -0
  294. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.patch_js_context.py +41 -0
  295. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2-4-runner-managed.requirements.txt +29 -0
  296. aip_agents/sandbox/dockerfiles/aip-agents-sandbox-v2.Dockerfile +87 -0
  297. aip_agents/sandbox/e2b_runtime.py +27 -0
  298. aip_agents/sandbox/image_registry.py +98 -0
  299. aip_agents/sandbox/providers/__init__.py +76 -0
  300. aip_agents/sandbox/providers/base.py +392 -0
  301. aip_agents/sandbox/providers/bedrock.py +28 -0
  302. aip_agents/sandbox/providers/e2b.py +230 -0
  303. aip_agents/sandbox/providers/opensandbox.py +163 -0
  304. aip_agents/sandbox/sandbox_runtime.py +967 -0
  305. aip_agents/sandbox/template_builder.py +240 -0
  306. aip_agents/sandbox/types.py +141 -0
  307. aip_agents/sandbox/validation.py +50 -0
  308. aip_agents/schema/__init__.py +106 -0
  309. aip_agents/schema/a2a.py +58 -0
  310. aip_agents/schema/agent.py +117 -0
  311. aip_agents/schema/artifacts.py +75 -0
  312. aip_agents/schema/attachments.py +425 -0
  313. aip_agents/schema/hitl.py +157 -0
  314. aip_agents/schema/langgraph.py +47 -0
  315. aip_agents/schema/model_id.py +103 -0
  316. aip_agents/schema/model_usage.py +50 -0
  317. aip_agents/schema/runtime_metadata.py +78 -0
  318. aip_agents/schema/step_limit.py +108 -0
  319. aip_agents/schema/storage.py +40 -0
  320. aip_agents/schema/tool_payloads.py +68 -0
  321. aip_agents/sentry/__init__.py +11 -0
  322. aip_agents/sentry/sentry.py +267 -0
  323. aip_agents/skills/__init__.py +30 -0
  324. aip_agents/skills/errors.py +110 -0
  325. aip_agents/skills/installer.py +479 -0
  326. aip_agents/skills/models.py +769 -0
  327. aip_agents/skills/stager.py +224 -0
  328. aip_agents/skills/validation.py +53 -0
  329. aip_agents/storage/__init__.py +41 -0
  330. aip_agents/storage/base.py +85 -0
  331. aip_agents/storage/clients/__init__.py +12 -0
  332. aip_agents/storage/clients/minio_client.py +318 -0
  333. aip_agents/storage/config.py +62 -0
  334. aip_agents/storage/providers/__init__.py +15 -0
  335. aip_agents/storage/providers/base.py +106 -0
  336. aip_agents/storage/providers/memory.py +114 -0
  337. aip_agents/storage/providers/object_storage.py +214 -0
  338. aip_agents/tools/__init__.py +65 -0
  339. aip_agents/tools/agent_schedule_tool.py +392 -0
  340. aip_agents/tools/browser_use/__init__.py +83 -0
  341. aip_agents/tools/browser_use/action_parser.py +104 -0
  342. aip_agents/tools/browser_use/browser_use_tool.py +1118 -0
  343. aip_agents/tools/browser_use/llm_config.py +120 -0
  344. aip_agents/tools/browser_use/minio_storage.py +203 -0
  345. aip_agents/tools/browser_use/schemas.py +121 -0
  346. aip_agents/tools/browser_use/session.py +13 -0
  347. aip_agents/tools/browser_use/session_errors.py +132 -0
  348. aip_agents/tools/browser_use/steel_session_recording.py +321 -0
  349. aip_agents/tools/browser_use/streaming.py +263 -0
  350. aip_agents/tools/browser_use/structured_data_parser.py +257 -0
  351. aip_agents/tools/browser_use/structured_data_recovery.py +204 -0
  352. aip_agents/tools/browser_use/types.py +37 -0
  353. aip_agents/tools/code_sandbox/__init__.py +48 -0
  354. aip_agents/tools/code_sandbox/code_sandbox_tool.py +350 -0
  355. aip_agents/tools/code_sandbox/constant.py +13 -0
  356. aip_agents/tools/code_sandbox/e2b_cloud_sandbox_extended.py +346 -0
  357. aip_agents/tools/code_sandbox/e2b_sandbox_tool.py +65 -0
  358. aip_agents/tools/computer_use/__init__.py +75 -0
  359. aip_agents/tools/computer_use/computer_use_tool.py +910 -0
  360. aip_agents/tools/computer_use/schemas.py +78 -0
  361. aip_agents/tools/computer_use/streaming.py +198 -0
  362. aip_agents/tools/computer_use/types.py +32 -0
  363. aip_agents/tools/constants.py +177 -0
  364. aip_agents/tools/date_range_tool.py +554 -0
  365. aip_agents/tools/document_loader/__init__.py +44 -0
  366. aip_agents/tools/document_loader/base_reader.py +302 -0
  367. aip_agents/tools/document_loader/docx_reader_tool.py +68 -0
  368. aip_agents/tools/document_loader/excel_reader_tool.py +171 -0
  369. aip_agents/tools/document_loader/pdf_reader_tool.py +79 -0
  370. aip_agents/tools/document_loader/pdf_splitter.py +169 -0
  371. aip_agents/tools/execute_ptc_code.py +582 -0
  372. aip_agents/tools/gl_connector/__init__.py +5 -0
  373. aip_agents/tools/gl_connector/tool.py +518 -0
  374. aip_agents/tools/gl_connector_tools.py +170 -0
  375. aip_agents/tools/memory_search/__init__.py +29 -0
  376. aip_agents/tools/memory_search/base.py +213 -0
  377. aip_agents/tools/memory_search/mem0.py +424 -0
  378. aip_agents/tools/memory_search/schema.py +81 -0
  379. aip_agents/tools/memory_search_tool.py +34 -0
  380. aip_agents/tools/streaming_common.py +577 -0
  381. aip_agents/tools/time_tool.py +117 -0
  382. aip_agents/tools/tool_config_injector.py +300 -0
  383. aip_agents/tools/web_search/__init__.py +15 -0
  384. aip_agents/tools/web_search/serper_tool.py +187 -0
  385. aip_agents/types/__init__.py +73 -0
  386. aip_agents/types/a2a_events.py +13 -0
  387. aip_agents/utils/__init__.py +91 -0
  388. aip_agents/utils/a2a_connector.py +1758 -0
  389. aip_agents/utils/artifact_helpers.py +542 -0
  390. aip_agents/utils/artifacts/__init__.py +20 -0
  391. aip_agents/utils/artifacts/tracker.py +367 -0
  392. aip_agents/utils/attachment_helpers.py +178 -0
  393. aip_agents/utils/constants.py +22 -0
  394. aip_agents/utils/datetime/__init__.py +34 -0
  395. aip_agents/utils/datetime/normalization.py +231 -0
  396. aip_agents/utils/datetime/timezone.py +206 -0
  397. aip_agents/utils/env_loader.py +27 -0
  398. aip_agents/utils/event_handler_registry.py +58 -0
  399. aip_agents/utils/file_prompt_utils.py +276 -0
  400. aip_agents/utils/file_watchers/__init__.py +33 -0
  401. aip_agents/utils/file_watchers/base.py +46 -0
  402. aip_agents/utils/file_watchers/e2b.py +128 -0
  403. aip_agents/utils/file_watchers/factory.py +39 -0
  404. aip_agents/utils/file_watchers/ls_diff.py +88 -0
  405. aip_agents/utils/file_watchers/sandbox.py +66 -0
  406. aip_agents/utils/file_watchers/watchdog.py +97 -0
  407. aip_agents/utils/final_response_builder.py +211 -0
  408. aip_agents/utils/formatter_llm_client.py +258 -0
  409. aip_agents/utils/langgraph/__init__.py +19 -0
  410. aip_agents/utils/langgraph/converter.py +399 -0
  411. aip_agents/utils/langgraph/delegation_context.py +22 -0
  412. aip_agents/utils/langgraph/tool_managers/__init__.py +15 -0
  413. aip_agents/utils/langgraph/tool_managers/a2a_tool_manager.py +99 -0
  414. aip_agents/utils/langgraph/tool_managers/base_tool_manager.py +66 -0
  415. aip_agents/utils/langgraph/tool_managers/delegation_tool_manager.py +1329 -0
  416. aip_agents/utils/langgraph/tool_output_management.py +1047 -0
  417. aip_agents/utils/logger.py +195 -0
  418. aip_agents/utils/metadata/__init__.py +27 -0
  419. aip_agents/utils/metadata/activity_metadata_helper.py +407 -0
  420. aip_agents/utils/metadata/activity_narrative/__init__.py +35 -0
  421. aip_agents/utils/metadata/activity_narrative/builder.py +822 -0
  422. aip_agents/utils/metadata/activity_narrative/constants.py +51 -0
  423. aip_agents/utils/metadata/activity_narrative/context.py +49 -0
  424. aip_agents/utils/metadata/activity_narrative/formatters.py +230 -0
  425. aip_agents/utils/metadata/activity_narrative/utils.py +35 -0
  426. aip_agents/utils/metadata/schemas/__init__.py +16 -0
  427. aip_agents/utils/metadata/schemas/activity_schema.py +29 -0
  428. aip_agents/utils/metadata/schemas/thinking_schema.py +31 -0
  429. aip_agents/utils/metadata/thinking_metadata_helper.py +38 -0
  430. aip_agents/utils/metadata_helper.py +363 -0
  431. aip_agents/utils/name_preprocessor/__init__.py +17 -0
  432. aip_agents/utils/name_preprocessor/base_name_preprocessor.py +73 -0
  433. aip_agents/utils/name_preprocessor/google_name_preprocessor.py +100 -0
  434. aip_agents/utils/name_preprocessor/name_preprocessor.py +87 -0
  435. aip_agents/utils/name_preprocessor/openai_name_preprocessor.py +48 -0
  436. aip_agents/utils/pii/__init__.py +29 -0
  437. aip_agents/utils/pii/pii_handler.py +555 -0
  438. aip_agents/utils/pii/pii_helper.py +225 -0
  439. aip_agents/utils/pii/uuid_deanonymizer_mapping.py +195 -0
  440. aip_agents/utils/reference_helper.py +273 -0
  441. aip_agents/utils/sse_chunk_transformer.py +836 -0
  442. aip_agents/utils/step_limit_manager.py +265 -0
  443. aip_agents/utils/token_usage_helper.py +531 -0
  444. aip_agents_binary-0.0.0.dist-info/METADATA +825 -0
  445. aip_agents_binary-0.0.0.dist-info/RECORD +447 -0
  446. aip_agents_binary-0.0.0.dist-info/WHEEL +5 -0
  447. aip_agents_binary-0.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,346 @@
1
+ """Private model invocation adapters for LangGraph ReAct agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import time
6
+ from collections.abc import Awaitable, Callable, Sequence
7
+ from dataclasses import dataclass
8
+ from typing import Any, cast
9
+
10
+ from gllm_core.event import EventEmitter # type: ignore[import-untyped]
11
+ from langchain_core.language_models import BaseChatModel
12
+ from langchain_core.messages import AIMessage, BaseMessage, SystemMessage
13
+ from langchain_core.tools import BaseTool
14
+
15
+ from aip_agents.context.runtime import detect_context_overflow
16
+ from aip_agents.schema.model_id import ModelId, ModelProvider
17
+ from aip_agents.utils.logger import get_logger
18
+
19
+ logger = get_logger(__name__)
20
+
21
+
22
+ BaseMessageToDict = Callable[[BaseMessage], dict[str, Any]]
23
+ DictToBaseMessage = Callable[[dict[str, Any]], BaseMessage]
24
+ ModifyModelRequestHook = Callable[[list[Any], str, dict[str, Any]], tuple[list[Any], str]]
25
+ CompactConversation = Callable[[list[dict[str, Any]], str], Awaitable[tuple[list[dict[str, Any]], str]]]
26
+ ApplyCompaction = Callable[..., Awaitable[tuple[list[dict[str, Any]], Any]]]
27
+ ConvertLangchainMessages = Callable[[list[BaseMessage], str], Any]
28
+ ConvertLmOutput = Callable[[Any], AIMessage]
29
+ PrepareLmInvokerTools = Callable[[Sequence[BaseTool]], list[Any]]
30
+ SanitizeMessages = Callable[[list[BaseMessage]], list[BaseMessage]]
31
+ EnsureInstructionSync = Callable[[list[BaseMessage], str], list[BaseMessage]]
32
+ ProviderAndModelName = Callable[[str | ModelId], tuple[str | None, str]]
33
+ ProviderAndModelNameForInvoker = Callable[[Any], tuple[str | None, str]]
34
+ PatchInvoker = Callable[[Any], None]
35
+ IsOpenAIReasoningModel = Callable[[str], bool]
36
+
37
+
38
+ @dataclass(slots=True)
39
+ class ModelInvocationRequest:
40
+ """Inputs needed to invoke one ReAct model step."""
41
+
42
+ current_messages: Sequence[BaseMessage]
43
+ state: dict[str, Any]
44
+ state_with_config: dict[str, Any]
45
+ config: dict[str, Any] | None
46
+ enhanced_instruction: str
47
+
48
+
49
+ @dataclass(slots=True)
50
+ class ModelInvocationResult:
51
+ """Normalized output from a model invocation adapter."""
52
+
53
+ ai_message: AIMessage
54
+ model_provider: str | None
55
+ model_name: str | None
56
+ model_id: Any
57
+
58
+
59
+ @dataclass(slots=True)
60
+ class ModelInvocationContext:
61
+ """Narrow callback surface adapters need from the ReAct agent."""
62
+
63
+ agent_name: str
64
+ resolved_tools: Sequence[BaseTool]
65
+ compaction_config: dict[str, Any] | None
66
+ event_emitter: EventEmitter | None
67
+ model_provider: str | None
68
+ execute_modify_model_request_hook: ModifyModelRequestHook
69
+ compact_conversation_with_recall: CompactConversation
70
+ apply_compaction: ApplyCompaction
71
+ base_message_to_dict: BaseMessageToDict
72
+ dict_to_base_message: DictToBaseMessage
73
+ prepare_tools_for_lm_invoker: PrepareLmInvokerTools
74
+ sanitize_messages: SanitizeMessages
75
+ ensure_instruction_sync: EnsureInstructionSync
76
+ convert_langchain_messages_to_gllm_messages: ConvertLangchainMessages
77
+ convert_lm_output_to_langchain_message: ConvertLmOutput
78
+
79
+
80
+ @dataclass(slots=True)
81
+ class LMInvokerRuntimePolicy:
82
+ """Provider-specific runtime patch policy for LM invoker execution."""
83
+
84
+ provider_and_model_name: ProviderAndModelName
85
+ provider_and_model_name_for_invoker: ProviderAndModelNameForInvoker
86
+ is_openai_reasoning_model: IsOpenAIReasoningModel
87
+ patch_openai_reasoning_thinking_extraction: PatchInvoker
88
+ patch_anthropic_cache_usage: PatchInvoker
89
+
90
+ def apply_to_built_invoker(self, model: str | ModelId, lm_invoker: Any) -> None:
91
+ """Apply runtime patches to an invoker built from a model identifier."""
92
+ provider, model_name = self.provider_and_model_name(model)
93
+ self._apply(provider, model_name, lm_invoker)
94
+
95
+ def apply_to_provided_invoker(self, lm_invoker: Any) -> None:
96
+ """Apply runtime patches to a caller-provided invoker instance."""
97
+ provider, model_name = self.provider_and_model_name_for_invoker(lm_invoker)
98
+ self._apply(provider, model_name, lm_invoker)
99
+
100
+ def _apply(self, provider: str | None, model_name: str, lm_invoker: Any) -> None:
101
+ if provider == ModelProvider.OPENAI and self.is_openai_reasoning_model(model_name):
102
+ self.patch_openai_reasoning_thinking_extraction(lm_invoker)
103
+ if provider == ModelProvider.ANTHROPIC:
104
+ self.patch_anthropic_cache_usage(lm_invoker)
105
+
106
+
107
+ class LMInvokerModelInvocationAdapter:
108
+ """Invoke the existing gllm-inference LM invoker path."""
109
+
110
+ def __init__(self, context: ModelInvocationContext, lm_invoker: Any):
111
+ """Initialize the adapter with the shared context and invoker instance."""
112
+ self._context = context
113
+ self._lm_invoker = lm_invoker
114
+
115
+ async def invoke(self, request: ModelInvocationRequest) -> ModelInvocationResult:
116
+ """Invoke the LM invoker and return a normalized result."""
117
+ modified_messages, enhanced_instruction = self._context.execute_modify_model_request_hook(
118
+ list(request.current_messages),
119
+ request.enhanced_instruction,
120
+ request.state_with_config,
121
+ )
122
+ base_messages = cast("list[BaseMessage]", modified_messages)
123
+
124
+ if self._context.compaction_config is not None:
125
+ message_dicts = [self._context.base_message_to_dict(message) for message in base_messages]
126
+ compacted_conversation, enhanced_instruction = await self._context.compact_conversation_with_recall(
127
+ message_dicts,
128
+ enhanced_instruction,
129
+ )
130
+ if compacted_conversation != message_dicts:
131
+ base_messages = [self._context.dict_to_base_message(message) for message in compacted_conversation]
132
+
133
+ messages = self._context.convert_langchain_messages_to_gllm_messages(
134
+ self._context.sanitize_messages(list(base_messages)),
135
+ enhanced_instruction,
136
+ )
137
+ effective_event_emitter = request.state.get("event_emitter") or self._context.event_emitter
138
+
139
+ if self._context.resolved_tools:
140
+ self._lm_invoker.set_tools(self._context.prepare_tools_for_lm_invoker(self._context.resolved_tools))
141
+
142
+ lm_output = await self._invoke(messages, effective_event_emitter, base_messages, enhanced_instruction)
143
+ ai_message = self._context.convert_lm_output_to_langchain_message(lm_output)
144
+ return ModelInvocationResult(
145
+ ai_message=ai_message,
146
+ model_provider=_clean_string(getattr(self._lm_invoker, "model_provider", None)),
147
+ model_name=_clean_string(getattr(self._lm_invoker, "model_name", None)),
148
+ model_id=getattr(self._lm_invoker, "model_id", None),
149
+ )
150
+
151
+ async def _invoke(
152
+ self,
153
+ messages: Any,
154
+ event_emitter: EventEmitter | None,
155
+ modified_messages: list[BaseMessage],
156
+ enhanced_instruction: str,
157
+ ) -> Any:
158
+ start_time = time.perf_counter()
159
+ logger.info(
160
+ "Agent '%s': LLM invoke start (tools=%d)",
161
+ self._context.agent_name,
162
+ len(self._context.resolved_tools),
163
+ )
164
+ total_chars = sum(len(str(getattr(message, "content", ""))) for message in messages)
165
+ logger.info("Prompt size: %d messages, %d chars", len(messages), total_chars)
166
+
167
+ try:
168
+ lm_output = await self._lm_invoker.invoke(
169
+ messages=messages,
170
+ event_emitter=event_emitter,
171
+ )
172
+ except Exception as exc:
173
+ if not detect_context_overflow(exc) or self._context.compaction_config is None:
174
+ raise
175
+ logger.info(
176
+ "Agent '%s': context overflow detected, retrying with compacted messages.",
177
+ self._context.agent_name,
178
+ )
179
+ message_dicts = [self._context.base_message_to_dict(message) for message in modified_messages]
180
+ compacted_dicts, _retry_prep = await self._context.apply_compaction(
181
+ message_dicts,
182
+ provider_overflow=True,
183
+ )
184
+ retry_messages = self._context.convert_langchain_messages_to_gllm_messages(
185
+ self._context.sanitize_messages(
186
+ [self._context.dict_to_base_message(message) for message in compacted_dicts]
187
+ ),
188
+ enhanced_instruction,
189
+ )
190
+ lm_output = await self._lm_invoker.invoke(
191
+ messages=retry_messages,
192
+ event_emitter=event_emitter,
193
+ )
194
+
195
+ logger.info(
196
+ "Agent '%s': LLM invoke finished in %.3fs", self._context.agent_name, time.perf_counter() - start_time
197
+ )
198
+ return lm_output
199
+
200
+
201
+ class LangChainModelInvocationAdapter:
202
+ """Invoke the existing LangChain BaseChatModel path."""
203
+
204
+ def __init__(self, context: ModelInvocationContext, model: BaseChatModel):
205
+ """Initialize the adapter with the shared context and chat model."""
206
+ self._context = context
207
+ self._model = model
208
+
209
+ async def invoke(self, request: ModelInvocationRequest) -> ModelInvocationResult:
210
+ """Invoke the LangChain chat model and return a normalized result."""
211
+ langchain_prompt: list[BaseMessage] = [SystemMessage(content=request.enhanced_instruction)] + list(
212
+ request.current_messages
213
+ )
214
+ langchain_prompt, enhanced_instruction = self._context.execute_modify_model_request_hook(
215
+ langchain_prompt,
216
+ request.enhanced_instruction,
217
+ request.state_with_config,
218
+ )
219
+ langchain_prompt = self._context.ensure_instruction_sync(
220
+ cast("list[BaseMessage]", langchain_prompt),
221
+ enhanced_instruction,
222
+ )
223
+
224
+ if self._context.compaction_config is not None:
225
+ langchain_prompt = await self._compact_prompt(langchain_prompt, enhanced_instruction)
226
+
227
+ model_with_tools = (
228
+ self._model.bind_tools(self._context.resolved_tools) if self._context.resolved_tools else self._model
229
+ )
230
+ ai_message = await self._invoke(model_with_tools, langchain_prompt, request.config)
231
+ return ModelInvocationResult(
232
+ ai_message=ai_message,
233
+ model_provider=_langchain_model_provider(self._model) or self._context.model_provider,
234
+ model_name=_langchain_model_name(self._model),
235
+ model_id=_langchain_model_id(self._model),
236
+ )
237
+
238
+ async def _compact_prompt(
239
+ self, langchain_prompt: list[BaseMessage], enhanced_instruction: str
240
+ ) -> list[BaseMessage]:
241
+ conversation_messages = [message for message in langchain_prompt if not isinstance(message, SystemMessage)]
242
+ message_dicts = [self._context.base_message_to_dict(message) for message in conversation_messages]
243
+ system_content = langchain_prompt[0].content if langchain_prompt else enhanced_instruction
244
+
245
+ compacted_conversation, system_content = await self._context.compact_conversation_with_recall(
246
+ message_dicts,
247
+ str(system_content),
248
+ )
249
+ if compacted_conversation != message_dicts:
250
+ return [SystemMessage(content=system_content)] + [
251
+ self._context.dict_to_base_message(message) for message in compacted_conversation
252
+ ]
253
+
254
+ langchain_prompt[0] = SystemMessage(content=system_content)
255
+ return langchain_prompt
256
+
257
+ async def _invoke(
258
+ self,
259
+ model_with_tools: BaseChatModel,
260
+ langchain_prompt: list[BaseMessage],
261
+ config: dict[str, Any] | None,
262
+ ) -> AIMessage:
263
+ start_time = time.perf_counter()
264
+ logger.info(
265
+ "Agent '%s': LangChain model invoke start (tools=%d)",
266
+ self._context.agent_name,
267
+ len(self._context.resolved_tools),
268
+ )
269
+
270
+ try:
271
+ ai_message = await model_with_tools.ainvoke(langchain_prompt, config)
272
+ except Exception as exc:
273
+ if not detect_context_overflow(exc) or self._context.compaction_config is None:
274
+ raise
275
+ logger.info(
276
+ "Agent '%s': context overflow detected, retrying with compacted messages.",
277
+ self._context.agent_name,
278
+ )
279
+ conversation_messages = [message for message in langchain_prompt if not isinstance(message, SystemMessage)]
280
+ message_dicts = [self._context.base_message_to_dict(message) for message in conversation_messages]
281
+ compacted_dicts, _retry_prep = await self._context.apply_compaction(
282
+ message_dicts,
283
+ provider_overflow=True,
284
+ )
285
+ retry_prompt = [langchain_prompt[0]] + [
286
+ self._context.dict_to_base_message(message) for message in compacted_dicts
287
+ ]
288
+ ai_message = await model_with_tools.ainvoke(retry_prompt, config)
289
+
290
+ logger.info(
291
+ "Agent '%s': LangChain model invoke finished in %.3fs",
292
+ self._context.agent_name,
293
+ time.perf_counter() - start_time,
294
+ )
295
+ return ai_message
296
+
297
+
298
+ def _clean_string(value: Any) -> str | None:
299
+ return value.strip() or None if isinstance(value, str) else None
300
+
301
+
302
+ def _langchain_model_provider(model: BaseChatModel) -> str | None:
303
+ provider = _clean_string(getattr(model, "model_provider", None))
304
+ if provider:
305
+ return provider
306
+
307
+ model_id = getattr(model, "model_id", None)
308
+ if isinstance(model_id, ModelId):
309
+ return _clean_string(model_id.provider) # pragma: no cover
310
+ if isinstance(model_id, str) and "/" in model_id:
311
+ return _clean_string(model_id.split("/", 1)[0]) # pragma: no cover
312
+
313
+ module_and_name = f"{type(model).__module__}.{type(model).__name__}".lower()
314
+ if "azure" in module_and_name and "openai" in module_and_name:
315
+ return ModelProvider.AZURE_OPENAI # pragma: no cover
316
+ if "openai" in module_and_name:
317
+ return ModelProvider.OPENAI # pragma: no cover
318
+ if "anthropic" in module_and_name:
319
+ return ModelProvider.ANTHROPIC # pragma: no cover
320
+ if "google" in module_and_name or "gemini" in module_and_name:
321
+ return ModelProvider.GOOGLE_GENAI # pragma: no cover
322
+ return None
323
+
324
+
325
+ def _langchain_model_name(model: BaseChatModel) -> str | None:
326
+ model_name = _clean_string(getattr(model, "model_name", None) or getattr(model, "model", None))
327
+ if model_name:
328
+ return model_name
329
+
330
+ model_id = getattr(model, "model_id", None)
331
+ if isinstance(model_id, ModelId):
332
+ return _clean_string(model_id.name) # pragma: no cover
333
+ if isinstance(model_id, str):
334
+ if "/" in model_id: # pragma: no cover
335
+ return _clean_string(model_id.rsplit("/", 1)[-1]) # pragma: no cover
336
+ if ":" in model_id: # pragma: no cover
337
+ return _clean_string(model_id.rsplit(":", 1)[-1]) # pragma: no cover
338
+ return _clean_string(model_id) # pragma: no cover
339
+ return None
340
+
341
+
342
+ def _langchain_model_id(model: BaseChatModel) -> Any:
343
+ model_id = getattr(model, "model_id", None)
344
+ if isinstance(model_id, ModelId | str):
345
+ return model_id # pragma: no cover
346
+ return None
@@ -0,0 +1,34 @@
1
+ """Utilities for constructing agent system instructions.
2
+
3
+ Authors:
4
+ Putu Ravindra Wiguna (putu.r.wiguna@gdplabs.id)
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from aip_agents.utils.constants import DefaultTimezone
10
+ from aip_agents.utils.datetime import get_timezone_aware_now
11
+
12
+ __all__ = ["get_current_date_context", "DefaultTimezone"]
13
+
14
+
15
+ def get_current_date_context(timezone: str = DefaultTimezone.JAKARTA) -> str:
16
+ """Generate current date context for system prompts.
17
+
18
+ Args:
19
+ timezone: IANA timezone name for date formatting.
20
+
21
+ Returns:
22
+ Formatted date context string for inclusion in system prompts.
23
+ """
24
+ now, timezone_label, used_fallback = get_timezone_aware_now(timezone)
25
+ display_timezone = "UTC" if used_fallback else timezone_label
26
+ current_date = now.strftime("%Y-%m-%d")
27
+
28
+ return (
29
+ f"Very important: The user's timezone is {display_timezone}. "
30
+ f"The current date is {current_date}\n\n"
31
+ "Any dates before this are in the past, and any dates after this are in the future. "
32
+ "When the user asks for the 'latest', 'most recent', 'today's', etc. don't assume\n"
33
+ "your knowledge is up to date."
34
+ )