mindroot 9.10.0__py3-none-any.whl → 9.12.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.

Potentially problematic release.


This version of mindroot might be problematic. Click here for more details.

Files changed (418) hide show
  1. mindroot/__init__.py +1 -0
  2. mindroot/coreplugins/__init__.py +2 -0
  3. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  4. mindroot/docs/Makefile +20 -0
  5. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  6. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  7. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  8. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  9. mindroot/docs/_build/doctrees/index.doctree +0 -0
  10. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  11. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  12. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  13. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  14. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  44. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  45. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  46. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  47. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  48. mindroot/docs/_build/html/.buildinfo +4 -0
  49. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  50. mindroot/docs/_build/html/_images/envvar.png +0 -0
  51. mindroot/docs/_build/html/_images/files.png +0 -0
  52. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  53. mindroot/docs/_build/html/_images/mood.png +0 -0
  54. mindroot/docs/_build/html/_images/moon.png +0 -0
  55. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  56. mindroot/docs/_build/html/_images/restart.png +0 -0
  57. mindroot/docs/_build/html/_modules/index.html +425 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  152. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  153. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  182. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  183. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  184. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  185. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  186. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  188. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  189. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  190. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  191. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  192. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  193. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  194. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  195. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  196. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  197. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  198. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  199. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  226. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  227. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  228. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  229. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  230. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  231. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  232. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  233. mindroot/docs/_build/html/_static/basic.css +906 -0
  234. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  250. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  251. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  252. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  253. mindroot/docs/_build/html/_static/custom.css +19 -0
  254. mindroot/docs/_build/html/_static/debug.css +69 -0
  255. mindroot/docs/_build/html/_static/doctools.js +149 -0
  256. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  257. mindroot/docs/_build/html/_static/file.png +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  272. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  273. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  280. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  281. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  282. mindroot/docs/_build/html/_static/jquery.js +2 -0
  283. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  284. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  285. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  286. mindroot/docs/_build/html/_static/language_data.js +192 -0
  287. mindroot/docs/_build/html/_static/minus.png +0 -0
  288. mindroot/docs/_build/html/_static/plus.png +0 -0
  289. mindroot/docs/_build/html/_static/pygments.css +232 -0
  290. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  292. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  293. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  294. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  295. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  296. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  297. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  298. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  299. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  300. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  301. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  302. mindroot/docs/_build/html/developer_documentation.html +338 -0
  303. mindroot/docs/_build/html/genindex.html +4690 -0
  304. mindroot/docs/_build/html/getting_started.html +423 -0
  305. mindroot/docs/_build/html/index.html +357 -0
  306. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  307. mindroot/docs/_build/html/installation.html +330 -0
  308. mindroot/docs/_build/html/llm_api_key.html +337 -0
  309. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  310. mindroot/docs/_build/html/objects.inv +0 -0
  311. mindroot/docs/_build/html/programming_task.html +326 -0
  312. mindroot/docs/_build/html/py-modindex.html +1307 -0
  313. mindroot/docs/_build/html/search.html +307 -0
  314. mindroot/docs/_build/html/searchindex.js +1 -0
  315. mindroot/docs/_build/html/source/ahp.html +302 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  334. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  335. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  336. mindroot/docs/_build/html/source/mindroot.html +811 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  341. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  342. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  343. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  344. mindroot/docs/_build/html/source/modules.html +377 -0
  345. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  346. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  347. mindroot/docs/_build/html/user_documentation.html +333 -0
  348. mindroot/docs/_static/custom.css +19 -0
  349. mindroot/docs/chat_with_assistant.rst +14 -0
  350. mindroot/docs/conf.py +54 -0
  351. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  352. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  353. mindroot/docs/data/equivalent_flags.json +1 -0
  354. mindroot/docs/data/mcp/servers.json +9 -0
  355. mindroot/docs/data/models.json +57 -0
  356. mindroot/docs/data/plugin_manifest.json +95 -0
  357. mindroot/docs/data/preferred_models.json +12 -0
  358. mindroot/docs/data/providers.json +62 -0
  359. mindroot/docs/developer_documentation.rst +26 -0
  360. mindroot/docs/envvar.png +0 -0
  361. mindroot/docs/files.png +0 -0
  362. mindroot/docs/getting_started.rst +139 -0
  363. mindroot/docs/index.rst +38 -0
  364. mindroot/docs/install_plugins_with_tools.rst +25 -0
  365. mindroot/docs/installation.rst +21 -0
  366. mindroot/docs/installopenrouter.png +0 -0
  367. mindroot/docs/llm_api_key.rst +22 -0
  368. mindroot/docs/llm_plugin_installation.rst +27 -0
  369. mindroot/docs/make.bat +35 -0
  370. mindroot/docs/mood.png +0 -0
  371. mindroot/docs/moon.png +0 -0
  372. mindroot/docs/openrouter.png +0 -0
  373. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  374. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  375. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  376. mindroot/docs/programming_task.rst +10 -0
  377. mindroot/docs/restart.png +0 -0
  378. mindroot/docs/source/ahp.rst +7 -0
  379. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  380. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  381. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  382. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  383. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  384. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  385. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  386. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  387. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  388. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  389. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  390. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  391. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  392. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  393. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  394. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  395. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  396. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  397. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  398. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  399. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  400. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  401. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  402. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  403. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  404. mindroot/docs/source/mindroot.lib.rst +152 -0
  405. mindroot/docs/source/mindroot.registry.rst +29 -0
  406. mindroot/docs/source/mindroot.rst +54 -0
  407. mindroot/docs/source/modules.rst +7 -0
  408. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  409. mindroot/docs/starting_mindroot.rst +12 -0
  410. mindroot/docs/user_documentation.rst +16 -0
  411. mindroot/lib/plugins/default_plugin_manifest.json +1 -1
  412. mindroot/server.py +10 -1
  413. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/METADATA +1 -1
  414. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/RECORD +418 -10
  415. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/WHEEL +0 -0
  416. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/entry_points.txt +0 -0
  417. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/licenses/LICENSE +0 -0
  418. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,655 @@
1
+
2
+
3
+ <!DOCTYPE html>
4
+ <html class="writer-html5" lang="en" data-content_root="../../../">
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>mindroot.lib.chatlog_optimized &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <!-- Local TOC -->
43
+ <div class="local-toc"></div>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
+ <a href="../../../index.html">MindRoot</a>
51
+ </nav>
52
+
53
+ <div class="wy-nav-content">
54
+ <div class="rst-content">
55
+ <div role="navigation" aria-label="Page navigation">
56
+ <ul class="wy-breadcrumbs">
57
+ <li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
+ <li class="breadcrumb-item"><a href="../../index.html">Module code</a></li>
59
+ <li class="breadcrumb-item active">mindroot.lib.chatlog_optimized</li>
60
+ <li class="wy-breadcrumbs-aside">
61
+ </li>
62
+ </ul>
63
+ <hr/>
64
+ </div>
65
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
+ <div itemprop="articleBody">
67
+
68
+ <h1>Source code for mindroot.lib.chatlog_optimized</h1><div class="highlight"><pre>
69
+ <span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
70
+ <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
71
+ <span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Set</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span>
72
+ <span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
73
+ <span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
74
+ <span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
75
+ <span class="kn">import</span><span class="w"> </span><span class="nn">time</span>
76
+ <span class="kn">from</span><span class="w"> </span><span class="nn">mindroot.lib.utils.debug</span><span class="w"> </span><span class="kn">import</span> <span class="n">debug_box</span>
77
+ <span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">defaultdict</span>
78
+ <span class="kn">import</span><span class="w"> </span><span class="nn">threading</span>
79
+
80
+ <span class="c1"># Global cache for directory structure and parent-child relationships</span>
81
+ <span class="n">_log_index_cache</span> <span class="o">=</span> <span class="p">{</span>
82
+ <span class="s1">&#39;log_paths&#39;</span><span class="p">:</span> <span class="p">{},</span> <span class="c1"># log_id -&gt; full_path</span>
83
+ <span class="s1">&#39;parent_children&#39;</span><span class="p">:</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">set</span><span class="p">),</span> <span class="c1"># parent_log_id -&gt; set of child_log_ids</span>
84
+ <span class="s1">&#39;log_metadata&#39;</span><span class="p">:</span> <span class="p">{},</span> <span class="c1"># log_id -&gt; {parent_log_id, agent, user, mtime}</span>
85
+ <span class="s1">&#39;last_scan&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
86
+ <span class="s1">&#39;scan_lock&#39;</span><span class="p">:</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
87
+ <span class="p">}</span>
88
+
89
+ <div class="viewcode-block" id="ChatLog">
90
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.ChatLog">[docs]</a>
91
+ <span class="k">class</span><span class="w"> </span><span class="nc">ChatLog</span><span class="p">:</span>
92
+ <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">log_id</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">agent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parent_log_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">context_length</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">4096</span><span class="p">,</span> <span class="n">user</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
93
+ <span class="bp">self</span><span class="o">.</span><span class="n">log_id</span> <span class="o">=</span> <span class="n">log_id</span>
94
+ <span class="bp">self</span><span class="o">.</span><span class="n">messages</span> <span class="o">=</span> <span class="p">[]</span>
95
+ <span class="bp">self</span><span class="o">.</span><span class="n">parent_log_id</span> <span class="o">=</span> <span class="n">parent_log_id</span>
96
+ <span class="bp">self</span><span class="o">.</span><span class="n">agent</span> <span class="o">=</span> <span class="n">agent</span>
97
+ <span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">user</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span> <span class="ow">or</span> <span class="n">user</span> <span class="o">==</span> <span class="s1">&#39;None&#39;</span><span class="p">:</span>
98
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;User must be provided&#39;</span><span class="p">)</span>
99
+ <span class="c1"># make sure user is string</span>
100
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
101
+ <span class="c1"># does it have a username?</span>
102
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="s1">&#39;username&#39;</span><span class="p">):</span>
103
+ <span class="n">user</span> <span class="o">=</span> <span class="n">user</span><span class="o">.</span><span class="n">username</span>
104
+ <span class="k">else</span><span class="p">:</span>
105
+ <span class="c1"># throw an error</span>
106
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ChatLog(): user must be a string or have username field&#39;</span><span class="p">)</span>
107
+ <span class="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user</span>
108
+ <span class="k">if</span> <span class="n">agent</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">agent</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
109
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Agent must be provided&#39;</span><span class="p">)</span>
110
+ <span class="bp">self</span><span class="o">.</span><span class="n">context_length</span> <span class="o">=</span> <span class="n">context_length</span>
111
+ <span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;CHATLOG_DIR&#39;</span><span class="p">,</span> <span class="s1">&#39;data/chat&#39;</span><span class="p">)</span>
112
+ <span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
113
+ <span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">agent</span><span class="p">)</span>
114
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span><span class="p">):</span>
115
+ <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span><span class="p">)</span>
116
+ <span class="bp">self</span><span class="o">.</span><span class="n">load_log</span><span class="p">()</span>
117
+
118
+ <span class="k">def</span><span class="w"> </span><span class="nf">_get_log_data</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">any</span><span class="p">]:</span>
119
+ <span class="k">return</span> <span class="p">{</span>
120
+ <span class="s1">&#39;agent&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">agent</span><span class="p">,</span>
121
+ <span class="s1">&#39;log_id&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">log_id</span><span class="p">,</span>
122
+ <span class="s1">&#39;messages&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">,</span>
123
+ <span class="s1">&#39;parent_log_id&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent_log_id</span>
124
+ <span class="p">}</span>
125
+
126
+ <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_message_length</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
127
+ <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">message</span><span class="p">))</span> <span class="o">//</span> <span class="mi">3</span>
128
+
129
+ <div class="viewcode-block" id="ChatLog.add_message">
130
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.ChatLog.add_message">[docs]</a>
131
+ <span class="k">def</span><span class="w"> </span><span class="nf">add_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
132
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">)</span><span class="o">&gt;</span><span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;role&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;role&#39;</span><span class="p">]:</span>
133
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;found repeat role&quot;</span><span class="p">)</span>
134
+ <span class="c1"># check if messasge is str</span>
135
+ <span class="c1"># if so, convert to dict with type &#39;text&#39;:</span>
136
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">])</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
137
+ <span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[{</span><span class="s1">&#39;type&#39;</span><span class="p">:</span><span class="s1">&#39;text&#39;</span><span class="p">,</span> <span class="s1">&#39;text&#39;</span><span class="p">:</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]}]</span>
138
+ <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">])</span> <span class="o">==</span> <span class="nb">list</span><span class="p">:</span>
139
+ <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]:</span>
140
+ <span class="k">if</span> <span class="n">part</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;image&#39;</span><span class="p">:</span>
141
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;found image&quot;</span><span class="p">)</span>
142
+ <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
143
+ <span class="bp">self</span><span class="o">.</span><span class="n">save_log</span><span class="p">()</span>
144
+ <span class="k">return</span>
145
+
146
+ <span class="k">try</span><span class="p">:</span>
147
+ <span class="n">cmd_list</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;content&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;text&#39;</span><span class="p">])</span>
148
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">cmd_list</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">list</span><span class="p">:</span>
149
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;1&quot;</span><span class="p">)</span>
150
+ <span class="n">cmd_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">cmd_list</span><span class="p">]</span>
151
+ <span class="n">new_json</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;text&#39;</span><span class="p">])</span>
152
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">new_json</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">list</span><span class="p">:</span>
153
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;2&quot;</span><span class="p">)</span>
154
+ <span class="n">new_json</span> <span class="o">=</span> <span class="p">[</span><span class="n">new_json</span><span class="p">]</span>
155
+ <span class="n">new_cmd_list</span> <span class="o">=</span> <span class="n">cmd_list</span> <span class="o">+</span> <span class="n">new_json</span>
156
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;3&quot;</span><span class="p">)</span>
157
+ <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;content&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[{</span> <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;text&#39;</span><span class="p">,</span> <span class="s1">&#39;text&#39;</span><span class="p">:</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">new_cmd_list</span><span class="p">)</span> <span class="p">}]</span>
158
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
159
+ <span class="c1"># assume previous mesage was not a command, was a string</span>
160
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;4&quot;</span><span class="p">)</span>
161
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Could not combine commands, probably normal if user message and previous system output, assuming string&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
162
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;content&#39;</span><span class="p">])</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
163
+ <span class="n">new_msg_text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;content&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;text&#39;</span><span class="p">]</span>
164
+ <span class="k">else</span><span class="p">:</span>
165
+ <span class="n">new_msg_text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;content&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;text&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;text&#39;</span><span class="p">]</span>
166
+ <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">&#39;role&#39;</span><span class="p">:</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;role&#39;</span><span class="p">],</span> <span class="s1">&#39;content&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;text&#39;</span><span class="p">,</span> <span class="s1">&#39;text&#39;</span><span class="p">:</span> <span class="n">new_msg_text</span><span class="p">}]})</span>
167
+ <span class="k">else</span><span class="p">:</span>
168
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">)</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">:</span>
169
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;roles do not repeat, last message role is &#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">&#39;role&#39;</span><span class="p">],</span> <span class="s1">&#39;new message role is &#39;</span><span class="p">,</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;role&#39;</span><span class="p">])</span>
170
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;5&quot;</span><span class="p">)</span>
171
+ <span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
172
+ <span class="bp">self</span><span class="o">.</span><span class="n">save_log</span><span class="p">()</span></div>
173
+
174
+
175
+ <div class="viewcode-block" id="ChatLog.get_history">
176
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.ChatLog.get_history">[docs]</a>
177
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_history</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]:</span>
178
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">messages</span></div>
179
+
180
+
181
+ <div class="viewcode-block" id="ChatLog.get_recent">
182
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.ChatLog.get_recent">[docs]</a>
183
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_recent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">max_tokens</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">4096</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]:</span>
184
+ <span class="n">recent_messages</span> <span class="o">=</span> <span class="p">[]</span>
185
+ <span class="n">total_length</span> <span class="o">=</span> <span class="mi">0</span>
186
+ <span class="n">json_messages</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">)</span>
187
+ <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">json_messages</span><span class="p">)</span></div>
188
+
189
+
190
+ <div class="viewcode-block" id="ChatLog.save_log">
191
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.ChatLog.save_log">[docs]</a>
192
+ <span class="k">def</span><span class="w"> </span><span class="nf">save_log</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
193
+ <span class="n">log_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;chatlog_</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">log_id</span><span class="si">}</span><span class="s1">.json&#39;</span><span class="p">)</span>
194
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">log_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
195
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_log_data</span><span class="p">(),</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
196
+ <span class="c1"># Invalidate cache when log is saved</span>
197
+ <span class="n">_invalidate_log_cache</span><span class="p">()</span></div>
198
+
199
+
200
+
201
+ <div class="viewcode-block" id="ChatLog.load_log">
202
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.ChatLog.load_log">[docs]</a>
203
+ <span class="k">def</span><span class="w"> </span><span class="nf">load_log</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">log_id</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
204
+ <span class="k">if</span> <span class="n">log_id</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
205
+ <span class="n">log_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">log_id</span>
206
+ <span class="bp">self</span><span class="o">.</span><span class="n">log_id</span> <span class="o">=</span> <span class="n">log_id</span>
207
+ <span class="n">log_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">log_dir</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;chatlog_</span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s1">.json&#39;</span><span class="p">)</span>
208
+ <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">log_file</span><span class="p">):</span>
209
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">log_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
210
+ <span class="n">log_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
211
+ <span class="bp">self</span><span class="o">.</span><span class="n">agent</span> <span class="o">=</span> <span class="n">log_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;agent&#39;</span><span class="p">)</span>
212
+ <span class="bp">self</span><span class="o">.</span><span class="n">messages</span> <span class="o">=</span> <span class="n">log_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;messages&#39;</span><span class="p">,</span> <span class="p">[])</span>
213
+ <span class="bp">self</span><span class="o">.</span><span class="n">parent_log_id</span> <span class="o">=</span> <span class="n">log_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;parent_log_id&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
214
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Loaded log file at &quot;</span><span class="p">,</span> <span class="n">log_file</span><span class="p">)</span>
215
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Message length: &quot;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">))</span>
216
+ <span class="k">else</span><span class="p">:</span>
217
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Could not find log file at &quot;</span><span class="p">,</span> <span class="n">log_file</span><span class="p">)</span>
218
+ <span class="bp">self</span><span class="o">.</span><span class="n">messages</span> <span class="o">=</span> <span class="p">[]</span></div>
219
+
220
+
221
+ <div class="viewcode-block" id="ChatLog.count_tokens">
222
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.ChatLog.count_tokens">[docs]</a>
223
+ <span class="k">def</span><span class="w"> </span><span class="nf">count_tokens</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span>
224
+ <span class="n">input_tokens_sequence</span> <span class="o">=</span> <span class="mi">0</span>
225
+ <span class="n">output_tokens_sequence</span> <span class="o">=</span> <span class="mi">0</span>
226
+ <span class="n">input_tokens_total</span> <span class="o">=</span> <span class="mi">0</span>
227
+
228
+ <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">message</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">):</span>
229
+ <span class="n">message_tokens</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">message</span><span class="p">))</span> <span class="o">//</span> <span class="mi">4</span>
230
+
231
+ <span class="k">if</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;role&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;assistant&#39;</span><span class="p">:</span>
232
+ <span class="n">output_tokens_sequence</span> <span class="o">+=</span> <span class="n">message_tokens</span>
233
+ <span class="k">else</span><span class="p">:</span>
234
+ <span class="n">input_tokens_sequence</span> <span class="o">+=</span> <span class="n">message_tokens</span>
235
+
236
+ <span class="k">if</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;role&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;assistant&#39;</span><span class="p">:</span>
237
+ <span class="n">request_input_tokens</span> <span class="o">=</span> <span class="mi">0</span>
238
+ <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">):</span>
239
+ <span class="n">request_input_tokens</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">messages</span><span class="p">[</span><span class="n">j</span><span class="p">]))</span> <span class="o">//</span> <span class="mi">4</span>
240
+ <span class="n">input_tokens_total</span> <span class="o">+=</span> <span class="n">request_input_tokens</span>
241
+
242
+ <span class="k">return</span> <span class="p">{</span>
243
+ <span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">input_tokens_sequence</span><span class="p">,</span>
244
+ <span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">output_tokens_sequence</span><span class="p">,</span>
245
+ <span class="s1">&#39;input_tokens_total&#39;</span><span class="p">:</span> <span class="n">input_tokens_total</span>
246
+ <span class="p">}</span></div>
247
+ </div>
248
+
249
+
250
+ <span class="k">def</span><span class="w"> </span><span class="nf">_invalidate_log_cache</span><span class="p">():</span>
251
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Invalidate the log index cache&quot;&quot;&quot;</span>
252
+ <span class="k">global</span> <span class="n">_log_index_cache</span>
253
+ <span class="k">with</span> <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;scan_lock&#39;</span><span class="p">]:</span>
254
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;last_scan&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
255
+
256
+ <span class="k">def</span><span class="w"> </span><span class="nf">_build_log_index</span><span class="p">(</span><span class="n">force_refresh</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
257
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
258
+ <span class="sd"> Build an index of all chat logs and their relationships.</span>
259
+ <span class="sd"> This replaces the inefficient os.walk() calls with a single scan.</span>
260
+ <span class="sd"> &quot;&quot;&quot;</span>
261
+ <span class="k">global</span> <span class="n">_log_index_cache</span>
262
+
263
+ <span class="k">with</span> <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;scan_lock&#39;</span><span class="p">]:</span>
264
+ <span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
265
+
266
+ <span class="c1"># Only rebuild if cache is older than 5 minutes or forced</span>
267
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">force_refresh</span> <span class="ow">and</span> <span class="p">(</span><span class="n">current_time</span> <span class="o">-</span> <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;last_scan&#39;</span><span class="p">])</span> <span class="o">&lt;</span> <span class="mi">300</span><span class="p">:</span>
268
+ <span class="k">return</span>
269
+
270
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Building log index cache...&quot;</span><span class="p">)</span>
271
+ <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
272
+
273
+ <span class="c1"># Clear existing cache</span>
274
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_paths&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
275
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;parent_children&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
276
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_metadata&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
277
+
278
+ <span class="n">chat_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;CHATLOG_DIR&#39;</span><span class="p">,</span> <span class="s1">&#39;data/chat&#39;</span><span class="p">)</span>
279
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">chat_dir</span><span class="p">):</span>
280
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;last_scan&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_time</span>
281
+ <span class="k">return</span>
282
+
283
+ <span class="c1"># Single directory walk to build complete index</span>
284
+ <span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">chat_dir</span><span class="p">):</span>
285
+ <span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">files</span><span class="p">:</span>
286
+ <span class="k">if</span> <span class="n">file</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;chatlog_&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">file</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;.json&quot;</span><span class="p">):</span>
287
+ <span class="c1"># Extract log_id from filename</span>
288
+ <span class="n">log_id</span> <span class="o">=</span> <span class="n">file</span><span class="p">[</span><span class="mi">8</span><span class="p">:</span><span class="o">-</span><span class="mi">5</span><span class="p">]</span> <span class="c1"># Remove &#39;chatlog_&#39; prefix and &#39;.json&#39; suffix</span>
289
+ <span class="n">full_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">file</span><span class="p">)</span>
290
+
291
+ <span class="k">try</span><span class="p">:</span>
292
+ <span class="c1"># Get file modification time</span>
293
+ <span class="n">mtime</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getmtime</span><span class="p">(</span><span class="n">full_path</span><span class="p">)</span>
294
+
295
+ <span class="c1"># Parse user and agent from path</span>
296
+ <span class="n">rel_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">full_path</span><span class="p">,</span> <span class="n">chat_dir</span><span class="p">)</span>
297
+ <span class="n">path_parts</span> <span class="o">=</span> <span class="n">rel_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">sep</span><span class="p">)</span>
298
+ <span class="n">user</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">path_parts</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="s1">&#39;unknown&#39;</span>
299
+ <span class="n">agent</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">path_parts</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="s1">&#39;unknown&#39;</span>
300
+
301
+ <span class="c1"># Store path mapping</span>
302
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_paths&#39;</span><span class="p">][</span><span class="n">log_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">full_path</span>
303
+
304
+ <span class="c1"># Read log data to get parent relationship</span>
305
+ <span class="k">try</span><span class="p">:</span>
306
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">full_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
307
+ <span class="n">log_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
308
+ <span class="n">parent_log_id</span> <span class="o">=</span> <span class="n">log_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;parent_log_id&#39;</span><span class="p">)</span>
309
+
310
+ <span class="c1"># Store metadata</span>
311
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_metadata&#39;</span><span class="p">][</span><span class="n">log_id</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
312
+ <span class="s1">&#39;parent_log_id&#39;</span><span class="p">:</span> <span class="n">parent_log_id</span><span class="p">,</span>
313
+ <span class="s1">&#39;agent&#39;</span><span class="p">:</span> <span class="n">agent</span><span class="p">,</span>
314
+ <span class="s1">&#39;user&#39;</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span>
315
+ <span class="s1">&#39;mtime&#39;</span><span class="p">:</span> <span class="n">mtime</span>
316
+ <span class="p">}</span>
317
+
318
+ <span class="c1"># Build parent-child relationships</span>
319
+ <span class="k">if</span> <span class="n">parent_log_id</span><span class="p">:</span>
320
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;parent_children&#39;</span><span class="p">][</span><span class="n">parent_log_id</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
321
+
322
+ <span class="k">except</span> <span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
323
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error reading log file </span><span class="si">{</span><span class="n">full_path</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
324
+ <span class="k">continue</span>
325
+
326
+ <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
327
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error accessing file </span><span class="si">{</span><span class="n">full_path</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
328
+ <span class="k">continue</span>
329
+
330
+ <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;last_scan&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_time</span>
331
+ <span class="n">elapsed</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span>
332
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Log index built in </span><span class="si">{</span><span class="n">elapsed</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">s. Found </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_paths&#39;</span><span class="p">])</span><span class="si">}</span><span class="s2"> logs.&quot;</span><span class="p">)</span>
333
+
334
+ <div class="viewcode-block" id="find_chatlog_file">
335
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.find_chatlog_file">[docs]</a>
336
+ <span class="k">def</span><span class="w"> </span><span class="nf">find_chatlog_file</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
337
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
338
+ <span class="sd"> Find a chatlog file by its log_id using the cached index.</span>
339
+ <span class="sd"> </span>
340
+ <span class="sd"> Args:</span>
341
+ <span class="sd"> log_id: The log ID to search for</span>
342
+ <span class="sd"> </span>
343
+ <span class="sd"> Returns:</span>
344
+ <span class="sd"> The full path to the chatlog file if found, None otherwise</span>
345
+ <span class="sd"> &quot;&quot;&quot;</span>
346
+ <span class="n">_build_log_index</span><span class="p">()</span>
347
+ <span class="k">return</span> <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_paths&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span></div>
348
+
349
+
350
+ <div class="viewcode-block" id="find_child_logs_by_parent_id">
351
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.find_child_logs_by_parent_id">[docs]</a>
352
+ <span class="k">def</span><span class="w"> </span><span class="nf">find_child_logs_by_parent_id</span><span class="p">(</span><span class="n">parent_log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
353
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
354
+ <span class="sd"> Find all chat logs that have the given parent_log_id using the cached index.</span>
355
+ <span class="sd"> </span>
356
+ <span class="sd"> Args:</span>
357
+ <span class="sd"> parent_log_id: The parent log ID to search for</span>
358
+ <span class="sd"> </span>
359
+ <span class="sd"> Returns:</span>
360
+ <span class="sd"> List of log IDs that have this parent_log_id</span>
361
+ <span class="sd"> &quot;&quot;&quot;</span>
362
+ <span class="n">_build_log_index</span><span class="p">()</span>
363
+ <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;parent_children&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">parent_log_id</span><span class="p">,</span> <span class="nb">set</span><span class="p">()))</span></div>
364
+
365
+
366
+ <div class="viewcode-block" id="extract_delegate_task_log_ids">
367
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.extract_delegate_task_log_ids">[docs]</a>
368
+ <span class="k">def</span><span class="w"> </span><span class="nf">extract_delegate_task_log_ids</span><span class="p">(</span><span class="n">messages</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
369
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
370
+ <span class="sd"> Extract log IDs from delegate_task commands in messages.</span>
371
+ <span class="sd"> </span>
372
+ <span class="sd"> Args:</span>
373
+ <span class="sd"> messages: List of chat messages</span>
374
+ <span class="sd"> </span>
375
+ <span class="sd"> Returns:</span>
376
+ <span class="sd"> List of log IDs found in delegate_task commands</span>
377
+ <span class="sd"> &quot;&quot;&quot;</span>
378
+ <span class="n">log_ids</span> <span class="o">=</span> <span class="p">[]</span>
379
+
380
+ <span class="k">for</span> <span class="n">message</span> <span class="ow">in</span> <span class="n">messages</span><span class="p">:</span>
381
+ <span class="k">if</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;role&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;assistant&#39;</span><span class="p">:</span>
382
+ <span class="n">content</span> <span class="o">=</span> <span class="n">message</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]</span>
383
+ <span class="c1"># Handle both string and list content formats</span>
384
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
385
+ <span class="n">text</span> <span class="o">=</span> <span class="n">content</span>
386
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="s1">&#39;text&#39;</span> <span class="ow">in</span> <span class="n">content</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
387
+ <span class="n">text</span> <span class="o">=</span> <span class="n">content</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;text&#39;</span><span class="p">]</span>
388
+ <span class="k">else</span><span class="p">:</span>
389
+ <span class="k">continue</span>
390
+
391
+ <span class="c1"># Try to parse as JSON</span>
392
+ <span class="k">try</span><span class="p">:</span>
393
+ <span class="n">commands</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
394
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">commands</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
395
+ <span class="n">commands</span> <span class="o">=</span> <span class="p">[</span><span class="n">commands</span><span class="p">]</span>
396
+
397
+ <span class="k">for</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="n">commands</span><span class="p">:</span>
398
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">cmd</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
399
+ <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">&#39;delegate_task&#39;</span> <span class="ow">and</span> <span class="s1">&#39;log_id&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
400
+ <span class="n">log_ids</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="s1">&#39;log_id&#39;</span><span class="p">])</span>
401
+ <span class="k">except</span> <span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span>
402
+ <span class="c1"># If not JSON, try regex to find log_ids in delegate_task commands</span>
403
+ <span class="n">matches</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;&quot;delegate_task&quot;\s*:\s*{\s*&quot;log_id&quot;\s*:\s*&quot;([^&quot;]+)&quot;&#39;</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
404
+ <span class="n">log_ids</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">matches</span><span class="p">)</span>
405
+
406
+ <span class="k">return</span> <span class="n">log_ids</span></div>
407
+
408
+
409
+ <div class="viewcode-block" id="get_cache_dir">
410
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.get_cache_dir">[docs]</a>
411
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_cache_dir</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
412
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
413
+ <span class="sd"> Get the directory for token count cache files.</span>
414
+ <span class="sd"> Creates the directory if it doesn&#39;t exist.</span>
415
+ <span class="sd"> &quot;&quot;&quot;</span>
416
+ <span class="n">cache_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;TOKEN_CACHE_DIR&#39;</span><span class="p">,</span> <span class="s1">&#39;data/token_cache&#39;</span><span class="p">)</span>
417
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">cache_dir</span><span class="p">):</span>
418
+ <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">cache_dir</span><span class="p">)</span>
419
+ <span class="k">return</span> <span class="n">cache_dir</span></div>
420
+
421
+
422
+ <div class="viewcode-block" id="get_cache_path">
423
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.get_cache_path">[docs]</a>
424
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_cache_path</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
425
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
426
+ <span class="sd"> Get the path to the cache file for a specific log_id.</span>
427
+ <span class="sd"> &quot;&quot;&quot;</span>
428
+ <span class="n">cache_dir</span> <span class="o">=</span> <span class="n">get_cache_dir</span><span class="p">()</span>
429
+ <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cache_dir</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;tokens_</span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">.json&quot;</span><span class="p">)</span></div>
430
+
431
+
432
+ <div class="viewcode-block" id="get_cached_token_counts">
433
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.get_cached_token_counts">[docs]</a>
434
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_cached_token_counts</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">log_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span>
435
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
436
+ <span class="sd"> Get cached token counts if available and valid.</span>
437
+ <span class="sd"> </span>
438
+ <span class="sd"> Args:</span>
439
+ <span class="sd"> log_id: The log ID</span>
440
+ <span class="sd"> log_path: Path to the actual log file</span>
441
+ <span class="sd"> </span>
442
+ <span class="sd"> Returns:</span>
443
+ <span class="sd"> Cached token counts if valid, None otherwise</span>
444
+ <span class="sd"> &quot;&quot;&quot;</span>
445
+ <span class="n">cache_path</span> <span class="o">=</span> <span class="n">get_cache_path</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
446
+
447
+ <span class="c1"># If cache doesn&#39;t exist, return None</span>
448
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">cache_path</span><span class="p">):</span>
449
+ <span class="k">return</span> <span class="kc">None</span>
450
+
451
+ <span class="k">try</span><span class="p">:</span>
452
+ <span class="c1"># Get modification times</span>
453
+ <span class="n">log_mtime</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getmtime</span><span class="p">(</span><span class="n">log_path</span><span class="p">)</span>
454
+ <span class="n">cache_mtime</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getmtime</span><span class="p">(</span><span class="n">cache_path</span><span class="p">)</span>
455
+ <span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
456
+
457
+ <span class="c1"># If log was modified after cache was created, cache is invalid</span>
458
+ <span class="k">if</span> <span class="n">log_mtime</span> <span class="o">&gt;</span> <span class="n">cache_mtime</span><span class="p">:</span>
459
+ <span class="k">return</span> <span class="kc">None</span>
460
+
461
+ <span class="c1"># Don&#39;t recalculate sooner than 3 minutes after last calculation</span>
462
+ <span class="k">if</span> <span class="n">current_time</span> <span class="o">-</span> <span class="n">cache_mtime</span> <span class="o">&lt;</span> <span class="mi">180</span><span class="p">:</span> <span class="c1"># 3 minutes in seconds</span>
463
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">cache_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
464
+ <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
465
+
466
+ <span class="c1"># For logs that haven&#39;t been modified in over an hour, consider them &quot;finished&quot;</span>
467
+ <span class="c1"># and use the cache regardless of when it was last calculated</span>
468
+ <span class="k">if</span> <span class="n">current_time</span> <span class="o">-</span> <span class="n">log_mtime</span> <span class="o">&gt;</span> <span class="mi">3600</span><span class="p">:</span> <span class="c1"># 1 hour in seconds</span>
469
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">cache_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
470
+ <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
471
+
472
+ <span class="k">except</span> <span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
473
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error reading token cache: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
474
+
475
+ <span class="k">return</span> <span class="kc">None</span></div>
476
+
477
+
478
+ <div class="viewcode-block" id="save_token_counts_to_cache">
479
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.save_token_counts_to_cache">[docs]</a>
480
+ <span class="k">def</span><span class="w"> </span><span class="nf">save_token_counts_to_cache</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">token_counts</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
481
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
482
+ <span class="sd"> Save token counts to cache.</span>
483
+ <span class="sd"> &quot;&quot;&quot;</span>
484
+ <span class="n">cache_path</span> <span class="o">=</span> <span class="n">get_cache_path</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
485
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">cache_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
486
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">token_counts</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span></div>
487
+
488
+
489
+ <div class="viewcode-block" id="count_tokens_for_log_id_optimized">
490
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.count_tokens_for_log_id_optimized">[docs]</a>
491
+ <span class="k">def</span><span class="w"> </span><span class="nf">count_tokens_for_log_id_optimized</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span>
492
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
493
+ <span class="sd"> Optimized version of count_tokens_for_log_id that uses caching and batch operations.</span>
494
+ <span class="sd"> </span>
495
+ <span class="sd"> Args:</span>
496
+ <span class="sd"> log_id: The log ID to count tokens for</span>
497
+ <span class="sd"> </span>
498
+ <span class="sd"> Returns:</span>
499
+ <span class="sd"> Dictionary with token counts or None if log not found</span>
500
+ <span class="sd"> &quot;&quot;&quot;</span>
501
+ <span class="c1"># Find the chatlog file using cached index</span>
502
+ <span class="n">chatlog_path</span> <span class="o">=</span> <span class="n">find_chatlog_file</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
503
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">chatlog_path</span><span class="p">:</span>
504
+ <span class="k">return</span> <span class="kc">None</span>
505
+
506
+ <span class="c1"># Check cache first</span>
507
+ <span class="n">cached_counts</span> <span class="o">=</span> <span class="n">get_cached_token_counts</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="n">chatlog_path</span><span class="p">)</span>
508
+ <span class="k">if</span> <span class="n">cached_counts</span><span class="p">:</span>
509
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Using cached token counts for </span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
510
+ <span class="k">return</span> <span class="n">cached_counts</span>
511
+
512
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Calculating token counts for </span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
513
+
514
+ <span class="c1"># Use batch processing to get all related logs at once</span>
515
+ <span class="n">all_related_logs</span> <span class="o">=</span> <span class="n">_get_all_related_logs_batch</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
516
+
517
+ <span class="c1"># Calculate tokens for all logs in batch</span>
518
+ <span class="n">token_results</span> <span class="o">=</span> <span class="p">{}</span>
519
+ <span class="k">for</span> <span class="n">related_log_id</span><span class="p">,</span> <span class="n">log_data</span> <span class="ow">in</span> <span class="n">all_related_logs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
520
+ <span class="c1"># Create a temporary ChatLog instance to count tokens</span>
521
+ <span class="n">temp_log</span> <span class="o">=</span> <span class="n">ChatLog</span><span class="p">(</span><span class="n">log_id</span><span class="o">=</span><span class="n">related_log_id</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="s2">&quot;system&quot;</span><span class="p">,</span> <span class="n">agent</span><span class="o">=</span><span class="n">log_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;agent&#39;</span><span class="p">,</span> <span class="s1">&#39;unknown&#39;</span><span class="p">))</span>
522
+ <span class="n">temp_log</span><span class="o">.</span><span class="n">messages</span> <span class="o">=</span> <span class="n">log_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;messages&#39;</span><span class="p">,</span> <span class="p">[])</span>
523
+
524
+ <span class="c1"># Count tokens for this log</span>
525
+ <span class="n">token_results</span><span class="p">[</span><span class="n">related_log_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">temp_log</span><span class="o">.</span><span class="n">count_tokens</span><span class="p">()</span>
526
+
527
+ <span class="c1"># Build the hierarchical token counts</span>
528
+ <span class="n">main_counts</span> <span class="o">=</span> <span class="n">token_results</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="p">{</span>
529
+ <span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
530
+ <span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
531
+ <span class="s1">&#39;input_tokens_total&#39;</span><span class="p">:</span> <span class="mi">0</span>
532
+ <span class="p">})</span>
533
+
534
+ <span class="c1"># Sum up all child tokens</span>
535
+ <span class="n">combined_counts</span> <span class="o">=</span> <span class="p">{</span>
536
+ <span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">main_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">],</span>
537
+ <span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">main_counts</span><span class="p">[</span><span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">],</span>
538
+ <span class="s1">&#39;input_tokens_total&#39;</span><span class="p">:</span> <span class="n">main_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_total&#39;</span><span class="p">]</span>
539
+ <span class="p">}</span>
540
+
541
+ <span class="c1"># Add child log tokens</span>
542
+ <span class="k">for</span> <span class="n">related_log_id</span><span class="p">,</span> <span class="n">counts</span> <span class="ow">in</span> <span class="n">token_results</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
543
+ <span class="k">if</span> <span class="n">related_log_id</span> <span class="o">!=</span> <span class="n">log_id</span><span class="p">:</span> <span class="c1"># Don&#39;t double-count the main log</span>
544
+ <span class="n">combined_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">]</span>
545
+ <span class="n">combined_counts</span><span class="p">[</span><span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">counts</span><span class="p">[</span><span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">]</span>
546
+ <span class="n">combined_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_total&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_total&#39;</span><span class="p">]</span>
547
+
548
+ <span class="c1"># Create final result</span>
549
+ <span class="n">final_token_counts</span> <span class="o">=</span> <span class="p">{</span>
550
+ <span class="c1"># Parent session only counts</span>
551
+ <span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">main_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">],</span>
552
+ <span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">main_counts</span><span class="p">[</span><span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">],</span>
553
+ <span class="s1">&#39;input_tokens_total&#39;</span><span class="p">:</span> <span class="n">main_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_total&#39;</span><span class="p">],</span>
554
+ <span class="c1"># Combined counts (parent + all subtasks)</span>
555
+ <span class="s1">&#39;combined_input_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">combined_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_sequence&#39;</span><span class="p">],</span>
556
+ <span class="s1">&#39;combined_output_tokens_sequence&#39;</span><span class="p">:</span> <span class="n">combined_counts</span><span class="p">[</span><span class="s1">&#39;output_tokens_sequence&#39;</span><span class="p">],</span>
557
+ <span class="s1">&#39;combined_input_tokens_total&#39;</span><span class="p">:</span> <span class="n">combined_counts</span><span class="p">[</span><span class="s1">&#39;input_tokens_total&#39;</span><span class="p">]</span>
558
+ <span class="p">}</span>
559
+
560
+ <span class="c1"># Save to cache</span>
561
+ <span class="n">save_token_counts_to_cache</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="n">final_token_counts</span><span class="p">)</span>
562
+
563
+ <span class="k">return</span> <span class="n">final_token_counts</span></div>
564
+
565
+
566
+ <span class="k">def</span><span class="w"> </span><span class="nf">_get_all_related_logs_batch</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Dict</span><span class="p">]:</span>
567
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
568
+ <span class="sd"> Get all related logs (parent and children) in a single batch operation.</span>
569
+ <span class="sd"> This avoids multiple directory traversals and file reads.</span>
570
+ <span class="sd"> &quot;&quot;&quot;</span>
571
+ <span class="c1"># Ensure index is built</span>
572
+ <span class="n">_build_log_index</span><span class="p">()</span>
573
+
574
+ <span class="c1"># Find all related log IDs</span>
575
+ <span class="n">related_log_ids</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">log_id</span><span class="p">])</span>
576
+ <span class="n">to_process</span> <span class="o">=</span> <span class="p">[</span><span class="n">log_id</span><span class="p">]</span>
577
+
578
+ <span class="k">while</span> <span class="n">to_process</span><span class="p">:</span>
579
+ <span class="n">current_id</span> <span class="o">=</span> <span class="n">to_process</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
580
+
581
+ <span class="c1"># Add children</span>
582
+ <span class="n">children</span> <span class="o">=</span> <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;parent_children&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">current_id</span><span class="p">,</span> <span class="nb">set</span><span class="p">())</span>
583
+ <span class="k">for</span> <span class="n">child_id</span> <span class="ow">in</span> <span class="n">children</span><span class="p">:</span>
584
+ <span class="k">if</span> <span class="n">child_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">related_log_ids</span><span class="p">:</span>
585
+ <span class="n">related_log_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">child_id</span><span class="p">)</span>
586
+ <span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_id</span><span class="p">)</span>
587
+
588
+ <span class="c1"># Also check for delegated tasks in the main log</span>
589
+ <span class="n">main_log_path</span> <span class="o">=</span> <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_paths&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
590
+ <span class="k">if</span> <span class="n">main_log_path</span><span class="p">:</span>
591
+ <span class="k">try</span><span class="p">:</span>
592
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">main_log_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
593
+ <span class="n">log_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
594
+ <span class="n">delegated_ids</span> <span class="o">=</span> <span class="n">extract_delegate_task_log_ids</span><span class="p">(</span><span class="n">log_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;messages&#39;</span><span class="p">,</span> <span class="p">[]))</span>
595
+ <span class="k">for</span> <span class="n">delegated_id</span> <span class="ow">in</span> <span class="n">delegated_ids</span><span class="p">:</span>
596
+ <span class="k">if</span> <span class="n">delegated_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">related_log_ids</span><span class="p">:</span>
597
+ <span class="n">related_log_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">delegated_id</span><span class="p">)</span>
598
+ <span class="n">to_process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delegated_id</span><span class="p">)</span>
599
+ <span class="k">except</span> <span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">):</span>
600
+ <span class="k">pass</span>
601
+
602
+ <span class="c1"># Batch read all related logs</span>
603
+ <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span>
604
+ <span class="k">for</span> <span class="n">related_id</span> <span class="ow">in</span> <span class="n">related_log_ids</span><span class="p">:</span>
605
+ <span class="n">log_path</span> <span class="o">=</span> <span class="n">_log_index_cache</span><span class="p">[</span><span class="s1">&#39;log_paths&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">related_id</span><span class="p">)</span>
606
+ <span class="k">if</span> <span class="n">log_path</span><span class="p">:</span>
607
+ <span class="k">try</span><span class="p">:</span>
608
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">log_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
609
+ <span class="n">result</span><span class="p">[</span><span class="n">related_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
610
+ <span class="k">except</span> <span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
611
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error reading log </span><span class="si">{</span><span class="n">related_id</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
612
+ <span class="k">continue</span>
613
+
614
+ <span class="k">return</span> <span class="n">result</span>
615
+
616
+ <span class="c1"># Backward compatibility - keep the original function name but use optimized version</span>
617
+ <div class="viewcode-block" id="count_tokens_for_log_id">
618
+ <a class="viewcode-back" href="../../../source/mindroot.lib.html#mindroot.lib.chatlog_optimized.count_tokens_for_log_id">[docs]</a>
619
+ <span class="k">def</span><span class="w"> </span><span class="nf">count_tokens_for_log_id</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]:</span>
620
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
621
+ <span class="sd"> Count tokens for a chat log identified by log_id, including any delegated tasks.</span>
622
+ <span class="sd"> This is the optimized version that uses caching and batch operations.</span>
623
+ <span class="sd"> &quot;&quot;&quot;</span>
624
+ <span class="k">return</span> <span class="n">count_tokens_for_log_id_optimized</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span></div>
625
+
626
+ </pre></div>
627
+
628
+ </div>
629
+ </div>
630
+ <footer>
631
+
632
+ <hr/>
633
+
634
+ <div role="contentinfo">
635
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
636
+ </div>
637
+
638
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
639
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
640
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
641
+
642
+
643
+ </footer>
644
+ </div>
645
+ </div>
646
+ </section>
647
+ </div>
648
+ <script>
649
+ jQuery(function () {
650
+ SphinxRtdTheme.Navigation.enable(true);
651
+ });
652
+ </script>
653
+
654
+ </body>
655
+ </html>