ommlds 0.0.0.dev426__py3-none-any.whl → 0.0.0.dev485__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. ommlds/.omlish-manifests.json +336 -39
  2. ommlds/__about__.py +16 -10
  3. ommlds/_hacks/__init__.py +4 -0
  4. ommlds/_hacks/funcs.py +110 -0
  5. ommlds/_hacks/names.py +158 -0
  6. ommlds/_hacks/params.py +73 -0
  7. ommlds/_hacks/patches.py +0 -3
  8. ommlds/backends/anthropic/protocol/__init__.py +13 -1
  9. ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
  10. ommlds/backends/anthropic/protocol/_marshal.py +2 -2
  11. ommlds/backends/anthropic/protocol/sse/_marshal.py +1 -1
  12. ommlds/backends/anthropic/protocol/sse/assemble.py +23 -7
  13. ommlds/backends/anthropic/protocol/sse/events.py +13 -0
  14. ommlds/backends/anthropic/protocol/types.py +40 -8
  15. ommlds/backends/google/protocol/__init__.py +16 -0
  16. ommlds/backends/google/protocol/_dataclasses.py +5997 -0
  17. ommlds/backends/google/protocol/_marshal.py +16 -0
  18. ommlds/backends/google/protocol/types.py +626 -0
  19. ommlds/backends/groq/__init__.py +7 -0
  20. ommlds/backends/groq/_dataclasses.py +3901 -0
  21. ommlds/backends/groq/_marshal.py +23 -0
  22. ommlds/backends/groq/protocol.py +249 -0
  23. ommlds/backends/llamacpp/logging.py +4 -1
  24. ommlds/backends/mlx/caching.py +7 -3
  25. ommlds/backends/mlx/cli.py +10 -7
  26. ommlds/backends/mlx/generation.py +19 -17
  27. ommlds/backends/mlx/limits.py +10 -6
  28. ommlds/backends/mlx/loading.py +65 -5
  29. ommlds/backends/ollama/__init__.py +7 -0
  30. ommlds/backends/ollama/_dataclasses.py +3458 -0
  31. ommlds/backends/ollama/protocol.py +170 -0
  32. ommlds/backends/openai/protocol/__init__.py +24 -29
  33. ommlds/backends/openai/protocol/_common.py +18 -0
  34. ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
  35. ommlds/backends/openai/protocol/_marshal.py +27 -0
  36. ommlds/backends/openai/protocol/chatcompletion/chunk.py +58 -31
  37. ommlds/backends/openai/protocol/chatcompletion/contentpart.py +49 -44
  38. ommlds/backends/openai/protocol/chatcompletion/message.py +55 -43
  39. ommlds/backends/openai/protocol/chatcompletion/request.py +114 -66
  40. ommlds/backends/openai/protocol/chatcompletion/response.py +71 -45
  41. ommlds/backends/openai/protocol/chatcompletion/responseformat.py +27 -20
  42. ommlds/backends/openai/protocol/chatcompletion/tokenlogprob.py +16 -7
  43. ommlds/backends/openai/protocol/completionusage.py +24 -15
  44. ommlds/backends/tavily/__init__.py +7 -0
  45. ommlds/backends/tavily/_dataclasses.py +1734 -0
  46. ommlds/backends/tavily/protocol.py +301 -0
  47. ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
  48. ommlds/backends/transformers/__init__.py +14 -0
  49. ommlds/backends/transformers/filecache.py +109 -0
  50. ommlds/backends/transformers/streamers.py +73 -0
  51. ommlds/cli/__init__.py +7 -0
  52. ommlds/cli/_dataclasses.py +2562 -0
  53. ommlds/cli/asyncs.py +30 -0
  54. ommlds/cli/backends/catalog.py +93 -0
  55. ommlds/cli/backends/configs.py +9 -0
  56. ommlds/cli/backends/inject.py +31 -36
  57. ommlds/cli/backends/injection.py +16 -0
  58. ommlds/cli/backends/types.py +46 -0
  59. ommlds/cli/content/messages.py +34 -0
  60. ommlds/cli/content/strings.py +42 -0
  61. ommlds/cli/inject.py +17 -32
  62. ommlds/cli/inputs/__init__.py +0 -0
  63. ommlds/cli/inputs/asyncs.py +32 -0
  64. ommlds/cli/inputs/sync.py +75 -0
  65. ommlds/cli/main.py +270 -110
  66. ommlds/cli/rendering/__init__.py +0 -0
  67. ommlds/cli/rendering/configs.py +9 -0
  68. ommlds/cli/rendering/inject.py +31 -0
  69. ommlds/cli/rendering/markdown.py +52 -0
  70. ommlds/cli/rendering/raw.py +73 -0
  71. ommlds/cli/rendering/types.py +21 -0
  72. ommlds/cli/secrets.py +21 -0
  73. ommlds/cli/sessions/base.py +1 -1
  74. ommlds/cli/sessions/chat/chat/__init__.py +0 -0
  75. ommlds/cli/sessions/chat/chat/ai/__init__.py +0 -0
  76. ommlds/cli/sessions/chat/chat/ai/configs.py +11 -0
  77. ommlds/cli/sessions/chat/chat/ai/inject.py +74 -0
  78. ommlds/cli/sessions/chat/chat/ai/injection.py +14 -0
  79. ommlds/cli/sessions/chat/chat/ai/rendering.py +70 -0
  80. ommlds/cli/sessions/chat/chat/ai/services.py +79 -0
  81. ommlds/cli/sessions/chat/chat/ai/tools.py +44 -0
  82. ommlds/cli/sessions/chat/chat/ai/types.py +28 -0
  83. ommlds/cli/sessions/chat/chat/state/__init__.py +0 -0
  84. ommlds/cli/sessions/chat/chat/state/configs.py +11 -0
  85. ommlds/cli/sessions/chat/chat/state/inject.py +36 -0
  86. ommlds/cli/sessions/chat/chat/state/inmemory.py +33 -0
  87. ommlds/cli/sessions/chat/chat/state/storage.py +52 -0
  88. ommlds/cli/sessions/chat/chat/state/types.py +38 -0
  89. ommlds/cli/sessions/chat/chat/user/__init__.py +0 -0
  90. ommlds/cli/sessions/chat/chat/user/configs.py +17 -0
  91. ommlds/cli/sessions/chat/chat/user/inject.py +62 -0
  92. ommlds/cli/sessions/chat/chat/user/interactive.py +31 -0
  93. ommlds/cli/sessions/chat/chat/user/oneshot.py +25 -0
  94. ommlds/cli/sessions/chat/chat/user/types.py +15 -0
  95. ommlds/cli/sessions/chat/configs.py +27 -0
  96. ommlds/cli/sessions/chat/driver.py +43 -0
  97. ommlds/cli/sessions/chat/inject.py +33 -65
  98. ommlds/cli/sessions/chat/phases/__init__.py +0 -0
  99. ommlds/cli/sessions/chat/phases/inject.py +27 -0
  100. ommlds/cli/sessions/chat/phases/injection.py +14 -0
  101. ommlds/cli/sessions/chat/phases/manager.py +29 -0
  102. ommlds/cli/sessions/chat/phases/types.py +29 -0
  103. ommlds/cli/sessions/chat/session.py +27 -0
  104. ommlds/cli/sessions/chat/tools/__init__.py +0 -0
  105. ommlds/cli/sessions/chat/tools/configs.py +22 -0
  106. ommlds/cli/sessions/chat/tools/confirmation.py +46 -0
  107. ommlds/cli/sessions/chat/tools/execution.py +66 -0
  108. ommlds/cli/sessions/chat/tools/fs/__init__.py +0 -0
  109. ommlds/cli/sessions/chat/tools/fs/configs.py +12 -0
  110. ommlds/cli/sessions/chat/tools/fs/inject.py +35 -0
  111. ommlds/cli/sessions/chat/tools/inject.py +88 -0
  112. ommlds/cli/sessions/chat/tools/injection.py +44 -0
  113. ommlds/cli/sessions/chat/tools/rendering.py +58 -0
  114. ommlds/cli/sessions/chat/tools/todo/__init__.py +0 -0
  115. ommlds/cli/sessions/chat/tools/todo/configs.py +12 -0
  116. ommlds/cli/sessions/chat/tools/todo/inject.py +31 -0
  117. ommlds/cli/sessions/chat/tools/weather/__init__.py +0 -0
  118. ommlds/cli/sessions/chat/tools/weather/configs.py +12 -0
  119. ommlds/cli/sessions/chat/tools/weather/inject.py +22 -0
  120. ommlds/cli/{tools/weather.py → sessions/chat/tools/weather/tools.py} +1 -1
  121. ommlds/cli/sessions/completion/configs.py +21 -0
  122. ommlds/cli/sessions/completion/inject.py +42 -0
  123. ommlds/cli/sessions/completion/session.py +35 -0
  124. ommlds/cli/sessions/embedding/configs.py +21 -0
  125. ommlds/cli/sessions/embedding/inject.py +42 -0
  126. ommlds/cli/sessions/embedding/session.py +33 -0
  127. ommlds/cli/sessions/inject.py +28 -11
  128. ommlds/cli/state/__init__.py +0 -0
  129. ommlds/cli/state/inject.py +28 -0
  130. ommlds/cli/{state.py → state/storage.py} +41 -24
  131. ommlds/minichain/__init__.py +84 -24
  132. ommlds/minichain/_dataclasses.py +15401 -0
  133. ommlds/minichain/_marshal.py +49 -9
  134. ommlds/minichain/_typedvalues.py +2 -4
  135. ommlds/minichain/backends/catalogs/base.py +20 -1
  136. ommlds/minichain/backends/catalogs/simple.py +2 -2
  137. ommlds/minichain/backends/catalogs/strings.py +10 -8
  138. ommlds/minichain/backends/impls/anthropic/chat.py +65 -27
  139. ommlds/minichain/backends/impls/anthropic/names.py +10 -8
  140. ommlds/minichain/backends/impls/anthropic/protocol.py +109 -0
  141. ommlds/minichain/backends/impls/anthropic/stream.py +111 -43
  142. ommlds/minichain/backends/impls/duckduckgo/search.py +6 -2
  143. ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
  144. ommlds/minichain/backends/impls/dummy/chat.py +69 -0
  145. ommlds/minichain/backends/impls/google/chat.py +114 -22
  146. ommlds/minichain/backends/impls/google/search.py +7 -2
  147. ommlds/minichain/backends/impls/google/stream.py +219 -0
  148. ommlds/minichain/backends/impls/google/tools.py +149 -0
  149. ommlds/minichain/backends/impls/groq/__init__.py +0 -0
  150. ommlds/minichain/backends/impls/groq/chat.py +75 -0
  151. ommlds/minichain/backends/impls/groq/names.py +48 -0
  152. ommlds/minichain/backends/impls/groq/protocol.py +143 -0
  153. ommlds/minichain/backends/impls/groq/stream.py +125 -0
  154. ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
  155. ommlds/minichain/backends/impls/llamacpp/chat.py +40 -22
  156. ommlds/minichain/backends/impls/llamacpp/completion.py +9 -5
  157. ommlds/minichain/backends/impls/llamacpp/format.py +4 -2
  158. ommlds/minichain/backends/impls/llamacpp/stream.py +43 -23
  159. ommlds/minichain/backends/impls/mistral.py +20 -5
  160. ommlds/minichain/backends/impls/mlx/chat.py +101 -24
  161. ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
  162. ommlds/minichain/backends/impls/ollama/chat.py +199 -0
  163. ommlds/minichain/backends/impls/openai/chat.py +18 -8
  164. ommlds/minichain/backends/impls/openai/completion.py +10 -3
  165. ommlds/minichain/backends/impls/openai/embedding.py +10 -3
  166. ommlds/minichain/backends/impls/openai/format.py +131 -106
  167. ommlds/minichain/backends/impls/openai/names.py +31 -5
  168. ommlds/minichain/backends/impls/openai/stream.py +43 -25
  169. ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
  170. ommlds/minichain/backends/impls/tavily.py +66 -0
  171. ommlds/minichain/backends/impls/tinygrad/chat.py +30 -20
  172. ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
  173. ommlds/minichain/backends/impls/transformers/sentence.py +6 -3
  174. ommlds/minichain/backends/impls/transformers/tokens.py +10 -7
  175. ommlds/minichain/backends/impls/transformers/transformers.py +160 -37
  176. ommlds/minichain/backends/strings/parsing.py +1 -1
  177. ommlds/minichain/backends/strings/resolving.py +4 -1
  178. ommlds/minichain/chat/_marshal.py +16 -9
  179. ommlds/minichain/chat/choices/adapters.py +4 -4
  180. ommlds/minichain/chat/choices/services.py +1 -1
  181. ommlds/minichain/chat/choices/stream/__init__.py +0 -0
  182. ommlds/minichain/chat/choices/stream/adapters.py +35 -0
  183. ommlds/minichain/chat/choices/stream/joining.py +31 -0
  184. ommlds/minichain/chat/choices/stream/services.py +45 -0
  185. ommlds/minichain/chat/choices/stream/types.py +43 -0
  186. ommlds/minichain/chat/choices/types.py +2 -2
  187. ommlds/minichain/chat/history.py +3 -3
  188. ommlds/minichain/chat/messages.py +55 -19
  189. ommlds/minichain/chat/services.py +3 -3
  190. ommlds/minichain/chat/stream/_marshal.py +16 -0
  191. ommlds/minichain/chat/stream/joining.py +85 -0
  192. ommlds/minichain/chat/stream/services.py +15 -21
  193. ommlds/minichain/chat/stream/types.py +32 -19
  194. ommlds/minichain/chat/tools/execution.py +8 -7
  195. ommlds/minichain/chat/tools/ids.py +9 -15
  196. ommlds/minichain/chat/tools/parsing.py +17 -26
  197. ommlds/minichain/chat/transforms/base.py +29 -38
  198. ommlds/minichain/chat/transforms/metadata.py +30 -4
  199. ommlds/minichain/chat/transforms/services.py +9 -11
  200. ommlds/minichain/content/_marshal.py +44 -20
  201. ommlds/minichain/content/json.py +13 -0
  202. ommlds/minichain/content/materialize.py +14 -21
  203. ommlds/minichain/content/prepare.py +4 -0
  204. ommlds/minichain/content/transforms/interleave.py +1 -1
  205. ommlds/minichain/content/transforms/squeeze.py +1 -1
  206. ommlds/minichain/content/transforms/stringify.py +1 -1
  207. ommlds/minichain/json.py +20 -0
  208. ommlds/minichain/lib/code/__init__.py +0 -0
  209. ommlds/minichain/lib/code/prompts.py +6 -0
  210. ommlds/minichain/lib/fs/binfiles.py +108 -0
  211. ommlds/minichain/lib/fs/context.py +126 -0
  212. ommlds/minichain/lib/fs/errors.py +101 -0
  213. ommlds/minichain/lib/fs/suggestions.py +36 -0
  214. ommlds/minichain/lib/fs/tools/__init__.py +0 -0
  215. ommlds/minichain/lib/fs/tools/edit.py +104 -0
  216. ommlds/minichain/lib/fs/tools/ls.py +38 -0
  217. ommlds/minichain/lib/fs/tools/read.py +115 -0
  218. ommlds/minichain/lib/fs/tools/recursivels/__init__.py +0 -0
  219. ommlds/minichain/lib/fs/tools/recursivels/execution.py +40 -0
  220. ommlds/minichain/lib/todo/__init__.py +0 -0
  221. ommlds/minichain/lib/todo/context.py +54 -0
  222. ommlds/minichain/lib/todo/tools/__init__.py +0 -0
  223. ommlds/minichain/lib/todo/tools/read.py +44 -0
  224. ommlds/minichain/lib/todo/tools/write.py +335 -0
  225. ommlds/minichain/lib/todo/types.py +60 -0
  226. ommlds/minichain/llms/_marshal.py +25 -17
  227. ommlds/minichain/llms/types.py +4 -0
  228. ommlds/minichain/registries/globals.py +18 -4
  229. ommlds/minichain/resources.py +68 -45
  230. ommlds/minichain/search.py +1 -1
  231. ommlds/minichain/services/_marshal.py +46 -39
  232. ommlds/minichain/services/facades.py +3 -3
  233. ommlds/minichain/services/services.py +1 -1
  234. ommlds/minichain/standard.py +8 -0
  235. ommlds/minichain/stream/services.py +152 -38
  236. ommlds/minichain/stream/wrap.py +22 -24
  237. ommlds/minichain/text/toolparsing/llamacpp/hermes2.py +3 -2
  238. ommlds/minichain/text/toolparsing/llamacpp/llama31.py +3 -2
  239. ommlds/minichain/text/toolparsing/llamacpp/utils.py +3 -2
  240. ommlds/minichain/tools/_marshal.py +1 -1
  241. ommlds/minichain/tools/execution/catalog.py +2 -1
  242. ommlds/minichain/tools/execution/context.py +34 -14
  243. ommlds/minichain/tools/execution/errors.py +15 -0
  244. ommlds/minichain/tools/execution/executors.py +8 -3
  245. ommlds/minichain/tools/execution/reflect.py +40 -5
  246. ommlds/minichain/tools/fns.py +46 -9
  247. ommlds/minichain/tools/jsonschema.py +14 -5
  248. ommlds/minichain/tools/reflect.py +54 -18
  249. ommlds/minichain/tools/types.py +33 -1
  250. ommlds/minichain/utils.py +27 -0
  251. ommlds/minichain/vectors/_marshal.py +11 -10
  252. ommlds/minichain/vectors/types.py +1 -1
  253. ommlds/nanochat/LICENSE +21 -0
  254. ommlds/nanochat/__init__.py +0 -0
  255. ommlds/nanochat/rustbpe/LICENSE +21 -0
  256. ommlds/nanochat/tokenizers.py +406 -0
  257. ommlds/server/cli.py +1 -2
  258. ommlds/server/server.py +5 -5
  259. ommlds/server/service.py +1 -1
  260. ommlds/specs/__init__.py +0 -0
  261. ommlds/specs/mcp/__init__.py +0 -0
  262. ommlds/specs/mcp/_marshal.py +23 -0
  263. ommlds/specs/mcp/clients.py +146 -0
  264. ommlds/specs/mcp/protocol.py +371 -0
  265. ommlds/tools/git.py +35 -12
  266. ommlds/tools/ocr.py +8 -9
  267. ommlds/wiki/analyze.py +6 -7
  268. ommlds/wiki/text/mfh.py +1 -5
  269. ommlds/wiki/text/wtp.py +1 -3
  270. ommlds/wiki/utils/xml.py +5 -5
  271. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/METADATA +24 -21
  272. ommlds-0.0.0.dev485.dist-info/RECORD +436 -0
  273. ommlds/cli/backends/standard.py +0 -20
  274. ommlds/cli/sessions/chat/base.py +0 -42
  275. ommlds/cli/sessions/chat/interactive.py +0 -73
  276. ommlds/cli/sessions/chat/printing.py +0 -96
  277. ommlds/cli/sessions/chat/prompt.py +0 -143
  278. ommlds/cli/sessions/chat/state.py +0 -109
  279. ommlds/cli/sessions/chat/tools.py +0 -91
  280. ommlds/cli/sessions/completion/completion.py +0 -44
  281. ommlds/cli/sessions/embedding/embedding.py +0 -42
  282. ommlds/cli/tools/config.py +0 -13
  283. ommlds/cli/tools/inject.py +0 -64
  284. ommlds/minichain/chat/stream/adapters.py +0 -69
  285. ommlds/minichain/lib/fs/ls/execution.py +0 -32
  286. ommlds-0.0.0.dev426.dist-info/RECORD +0 -303
  287. /ommlds/{cli/tools → backends/google}/__init__.py +0 -0
  288. /ommlds/{huggingface.py → backends/huggingface.py} +0 -0
  289. /ommlds/{minichain/lib/fs/ls → cli/content}/__init__.py +0 -0
  290. /ommlds/minichain/lib/fs/{ls → tools/recursivels}/rendering.py +0 -0
  291. /ommlds/minichain/lib/fs/{ls → tools/recursivels}/running.py +0 -0
  292. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/WHEEL +0 -0
  293. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/entry_points.txt +0 -0
  294. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/licenses/LICENSE +0 -0
  295. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/top_level.txt +0 -0
@@ -18,7 +18,7 @@
18
18
  "module": ".minichain.backends.impls.anthropic.chat",
19
19
  "attr": null,
20
20
  "file": "ommlds/minichain/backends/impls/anthropic/chat.py",
21
- "line": 30,
21
+ "line": 42,
22
22
  "value": {
23
23
  "!.minichain.registries.manifests.RegistryManifest": {
24
24
  "module": "ommlds.minichain.backends.impls.anthropic.chat",
@@ -33,11 +33,12 @@
33
33
  "module": ".minichain.backends.impls.anthropic.names",
34
34
  "attr": "_BACKEND_STRINGS_MANIFEST",
35
35
  "file": "ommlds/minichain/backends/impls/anthropic/names.py",
36
- "line": 35,
36
+ "line": 34,
37
37
  "value": {
38
38
  "!.minichain.backends.strings.manifests.BackendStringsManifest": {
39
39
  "service_cls_names": [
40
- "ChatChoicesService"
40
+ "ChatChoicesService",
41
+ "ChatChoicesStreamService"
41
42
  ],
42
43
  "backend_name": "anthropic",
43
44
  "model_names": {
@@ -46,13 +47,12 @@
46
47
  "claude-opus-4-1-20250805": null,
47
48
  "claude-opus-4-1": "claude-opus-4-1-20250805",
48
49
  "claude-opus": "claude-opus-4-1",
49
- "claude-sonnet-4-20250514": null,
50
- "claude-sonnet-4": "claude-sonnet-4-20250514",
51
- "claude-sonnet": "claude-sonnet-4",
52
- "claude-3-5-haiku-latest": null,
53
- "claude-haiku-3-5-latest": "claude-3-5-haiku-latest",
54
- "claude-haiku-3-5": "claude-haiku-3-5-latest",
55
- "claude-haiku": "claude-haiku-3-5",
50
+ "claude-sonnet-4-5-20250929": null,
51
+ "claude-sonnet-4-5": "claude-sonnet-4-5-20250929",
52
+ "claude-sonnet": "claude-sonnet-4-5",
53
+ "claude-haiku-4-5-20251001": null,
54
+ "claude-haiku-4-5": "claude-haiku-4-5-20251001",
55
+ "claude-haiku": "claude-haiku-4-5",
56
56
  "claude": "claude-haiku"
57
57
  }
58
58
  }
@@ -63,7 +63,7 @@
63
63
  "module": ".minichain.backends.impls.anthropic.stream",
64
64
  "attr": null,
65
65
  "file": "ommlds/minichain/backends/impls/anthropic/stream.py",
66
- "line": 29,
66
+ "line": 36,
67
67
  "value": {
68
68
  "!.minichain.registries.manifests.RegistryManifest": {
69
69
  "module": "ommlds.minichain.backends.impls.anthropic.stream",
@@ -78,7 +78,7 @@
78
78
  "module": ".minichain.backends.impls.duckduckgo.search",
79
79
  "attr": null,
80
80
  "file": "ommlds/minichain/backends/impls/duckduckgo/search.py",
81
- "line": 13,
81
+ "line": 17,
82
82
  "value": {
83
83
  "!.minichain.registries.manifests.RegistryManifest": {
84
84
  "module": "ommlds.minichain.backends.impls.duckduckgo.search",
@@ -91,11 +91,57 @@
91
91
  }
92
92
  }
93
93
  },
94
+ {
95
+ "module": ".minichain.backends.impls.dummy.chat",
96
+ "attr": null,
97
+ "file": "ommlds/minichain/backends/impls/dummy/chat.py",
98
+ "line": 26,
99
+ "value": {
100
+ "!.minichain.registries.manifests.RegistryManifest": {
101
+ "module": "ommlds.minichain.backends.impls.dummy.chat",
102
+ "attr": "DummyChatChoicesService",
103
+ "name": "dummy",
104
+ "aliases": null,
105
+ "type": "ChatChoicesService"
106
+ }
107
+ }
108
+ },
109
+ {
110
+ "module": ".minichain.backends.impls.dummy.chat",
111
+ "attr": null,
112
+ "file": "ommlds/minichain/backends/impls/dummy/chat.py",
113
+ "line": 39,
114
+ "value": {
115
+ "!.minichain.registries.manifests.RegistryManifest": {
116
+ "module": "ommlds.minichain.backends.impls.dummy.chat",
117
+ "attr": "DummyChatChoicesStreamService",
118
+ "name": "dummy",
119
+ "aliases": null,
120
+ "type": "ChatChoicesStreamService"
121
+ }
122
+ }
123
+ },
124
+ {
125
+ "module": ".minichain.backends.impls.dummy.chat",
126
+ "attr": null,
127
+ "file": "ommlds/minichain/backends/impls/dummy/chat.py",
128
+ "line": 63,
129
+ "value": {
130
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
131
+ "service_cls_names": [
132
+ "ChatChoicesService",
133
+ "ChatChoicesStreamService"
134
+ ],
135
+ "backend_name": "dummy",
136
+ "model_names": null
137
+ }
138
+ }
139
+ },
94
140
  {
95
141
  "module": ".minichain.backends.impls.google.chat",
96
142
  "attr": null,
97
143
  "file": "ommlds/minichain/backends/impls/google/chat.py",
98
- "line": 27,
144
+ "line": 35,
99
145
  "value": {
100
146
  "!.minichain.registries.manifests.RegistryManifest": {
101
147
  "module": "ommlds.minichain.backends.impls.google.chat",
@@ -133,11 +179,80 @@
133
179
  }
134
180
  }
135
181
  },
182
+ {
183
+ "module": ".minichain.backends.impls.google.stream",
184
+ "attr": null,
185
+ "file": "ommlds/minichain/backends/impls/google/stream.py",
186
+ "line": 41,
187
+ "value": {
188
+ "!.minichain.registries.manifests.RegistryManifest": {
189
+ "module": "ommlds.minichain.backends.impls.google.stream",
190
+ "attr": "GoogleChatChoicesStreamService",
191
+ "name": "google",
192
+ "aliases": null,
193
+ "type": "ChatChoicesStreamService"
194
+ }
195
+ }
196
+ },
197
+ {
198
+ "module": ".minichain.backends.impls.groq.chat",
199
+ "attr": null,
200
+ "file": "ommlds/minichain/backends/impls/groq/chat.py",
201
+ "line": 26,
202
+ "value": {
203
+ "!.minichain.registries.manifests.RegistryManifest": {
204
+ "module": "ommlds.minichain.backends.impls.groq.chat",
205
+ "attr": "GroqChatChoicesService",
206
+ "name": "groq",
207
+ "aliases": null,
208
+ "type": "ChatChoicesService"
209
+ }
210
+ }
211
+ },
212
+ {
213
+ "module": ".minichain.backends.impls.groq.names",
214
+ "attr": "_BACKEND_STRINGS_MANIFEST",
215
+ "file": "ommlds/minichain/backends/impls/groq/names.py",
216
+ "line": 40,
217
+ "value": {
218
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
219
+ "service_cls_names": [
220
+ "ChatChoicesService",
221
+ "ChatChoicesStreamService"
222
+ ],
223
+ "backend_name": "groq",
224
+ "model_names": {
225
+ "default": "gpt-oss-120b",
226
+ "aliases": {
227
+ "gpt-oss-120b": "openai/gpt-oss-120b",
228
+ "openai/gpt-oss-120b": null,
229
+ "gpt-oss-20b": "openai/gpt-oss-20b",
230
+ "openai/gpt-oss-20b": null
231
+ }
232
+ }
233
+ }
234
+ }
235
+ },
236
+ {
237
+ "module": ".minichain.backends.impls.groq.stream",
238
+ "attr": null,
239
+ "file": "ommlds/minichain/backends/impls/groq/stream.py",
240
+ "line": 33,
241
+ "value": {
242
+ "!.minichain.registries.manifests.RegistryManifest": {
243
+ "module": "ommlds.minichain.backends.impls.groq.stream",
244
+ "attr": "GroqChatChoicesStreamService",
245
+ "name": "groq",
246
+ "aliases": null,
247
+ "type": "ChatChoicesStreamService"
248
+ }
249
+ }
250
+ },
136
251
  {
137
252
  "module": ".minichain.backends.impls.huggingface.repos",
138
253
  "attr": null,
139
254
  "file": "ommlds/minichain/backends/impls/huggingface/repos.py",
140
- "line": 24,
255
+ "line": 20,
141
256
  "value": {
142
257
  "!.minichain.registries.manifests.RegistryManifest": {
143
258
  "module": "ommlds.minichain.backends.impls.huggingface.repos",
@@ -154,7 +269,22 @@
154
269
  "module": ".minichain.backends.impls.llamacpp.chat",
155
270
  "attr": null,
156
271
  "file": "ommlds/minichain/backends/impls/llamacpp/chat.py",
157
- "line": 32,
272
+ "line": 36,
273
+ "value": {
274
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
275
+ "service_cls_names": [
276
+ "ChatChoicesService"
277
+ ],
278
+ "backend_name": "llamacpp",
279
+ "model_names": null
280
+ }
281
+ }
282
+ },
283
+ {
284
+ "module": ".minichain.backends.impls.llamacpp.chat",
285
+ "attr": null,
286
+ "file": "ommlds/minichain/backends/impls/llamacpp/chat.py",
287
+ "line": 45,
158
288
  "value": {
159
289
  "!.minichain.registries.manifests.RegistryManifest": {
160
290
  "module": "ommlds.minichain.backends.impls.llamacpp.chat",
@@ -169,7 +299,7 @@
169
299
  "module": ".minichain.backends.impls.llamacpp.completion",
170
300
  "attr": null,
171
301
  "file": "ommlds/minichain/backends/impls/llamacpp/completion.py",
172
- "line": 24,
302
+ "line": 28,
173
303
  "value": {
174
304
  "!.minichain.registries.manifests.RegistryManifest": {
175
305
  "module": "ommlds.minichain.backends.impls.llamacpp.completion",
@@ -184,7 +314,22 @@
184
314
  "module": ".minichain.backends.impls.llamacpp.stream",
185
315
  "attr": null,
186
316
  "file": "ommlds/minichain/backends/impls/llamacpp/stream.py",
187
- "line": 31,
317
+ "line": 35,
318
+ "value": {
319
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
320
+ "service_cls_names": [
321
+ "ChatChoicesStreamService"
322
+ ],
323
+ "backend_name": "llamacpp",
324
+ "model_names": null
325
+ }
326
+ }
327
+ },
328
+ {
329
+ "module": ".minichain.backends.impls.llamacpp.stream",
330
+ "attr": null,
331
+ "file": "ommlds/minichain/backends/impls/llamacpp/stream.py",
332
+ "line": 44,
188
333
  "value": {
189
334
  "!.minichain.registries.manifests.RegistryManifest": {
190
335
  "module": "ommlds.minichain.backends.impls.llamacpp.stream",
@@ -199,7 +344,7 @@
199
344
  "module": ".minichain.backends.impls.mistral",
200
345
  "attr": null,
201
346
  "file": "ommlds/minichain/backends/impls/mistral.py",
202
- "line": 24,
347
+ "line": 29,
203
348
  "value": {
204
349
  "!.minichain.registries.manifests.RegistryManifest": {
205
350
  "module": "ommlds.minichain.backends.impls.mistral",
@@ -214,11 +359,12 @@
214
359
  "module": ".minichain.backends.impls.mlx.chat",
215
360
  "attr": null,
216
361
  "file": "ommlds/minichain/backends/impls/mlx/chat.py",
217
- "line": 28,
362
+ "line": 42,
218
363
  "value": {
219
364
  "!.minichain.backends.strings.manifests.BackendStringsManifest": {
220
365
  "service_cls_names": [
221
- "ChatChoicesService"
366
+ "ChatChoicesService",
367
+ "ChatChoicesStreamService"
222
368
  ],
223
369
  "backend_name": "mlx",
224
370
  "model_names": null
@@ -229,7 +375,7 @@
229
375
  "module": ".minichain.backends.impls.mlx.chat",
230
376
  "attr": null,
231
377
  "file": "ommlds/minichain/backends/impls/mlx/chat.py",
232
- "line": 37,
378
+ "line": 136,
233
379
  "value": {
234
380
  "!.minichain.registries.manifests.RegistryManifest": {
235
381
  "module": "ommlds.minichain.backends.impls.mlx.chat",
@@ -240,11 +386,72 @@
240
386
  }
241
387
  }
242
388
  },
389
+ {
390
+ "module": ".minichain.backends.impls.mlx.chat",
391
+ "attr": null,
392
+ "file": "ommlds/minichain/backends/impls/mlx/chat.py",
393
+ "line": 167,
394
+ "value": {
395
+ "!.minichain.registries.manifests.RegistryManifest": {
396
+ "module": "ommlds.minichain.backends.impls.mlx.chat",
397
+ "attr": "MlxChatChoicesStreamService",
398
+ "name": "mlx",
399
+ "aliases": null,
400
+ "type": "ChatChoicesStreamService"
401
+ }
402
+ }
403
+ },
404
+ {
405
+ "module": ".minichain.backends.impls.ollama.chat",
406
+ "attr": null,
407
+ "file": "ommlds/minichain/backends/impls/ollama/chat.py",
408
+ "line": 38,
409
+ "value": {
410
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
411
+ "service_cls_names": [
412
+ "ChatChoicesService",
413
+ "ChatChoicesStreamService"
414
+ ],
415
+ "backend_name": "ollama",
416
+ "model_names": null
417
+ }
418
+ }
419
+ },
420
+ {
421
+ "module": ".minichain.backends.impls.ollama.chat",
422
+ "attr": null,
423
+ "file": "ommlds/minichain/backends/impls/ollama/chat.py",
424
+ "line": 96,
425
+ "value": {
426
+ "!.minichain.registries.manifests.RegistryManifest": {
427
+ "module": "ommlds.minichain.backends.impls.ollama.chat",
428
+ "attr": "OllamaChatChoicesService",
429
+ "name": "ollama",
430
+ "aliases": null,
431
+ "type": "ChatChoicesService"
432
+ }
433
+ }
434
+ },
435
+ {
436
+ "module": ".minichain.backends.impls.ollama.chat",
437
+ "attr": null,
438
+ "file": "ommlds/minichain/backends/impls/ollama/chat.py",
439
+ "line": 143,
440
+ "value": {
441
+ "!.minichain.registries.manifests.RegistryManifest": {
442
+ "module": "ommlds.minichain.backends.impls.ollama.chat",
443
+ "attr": "OllamaChatChoicesStreamService",
444
+ "name": "ollama",
445
+ "aliases": null,
446
+ "type": "ChatChoicesStreamService"
447
+ }
448
+ }
449
+ },
243
450
  {
244
451
  "module": ".minichain.backends.impls.openai.chat",
245
452
  "attr": null,
246
453
  "file": "ommlds/minichain/backends/impls/openai/chat.py",
247
- "line": 34,
454
+ "line": 37,
248
455
  "value": {
249
456
  "!.minichain.registries.manifests.RegistryManifest": {
250
457
  "module": "ommlds.minichain.backends.impls.openai.chat",
@@ -287,9 +494,9 @@
287
494
  },
288
495
  {
289
496
  "module": ".minichain.backends.impls.openai.names",
290
- "attr": "_BACKEND_STRINGS_MANIFEST",
497
+ "attr": "_CHAT_BACKEND_STRINGS_MANIFEST",
291
498
  "file": "ommlds/minichain/backends/impls/openai/names.py",
292
- "line": 63,
499
+ "line": 65,
293
500
  "value": {
294
501
  "!.minichain.backends.strings.manifests.BackendStringsManifest": {
295
502
  "service_cls_names": [
@@ -313,6 +520,7 @@
313
520
  "gpt-5-chat-latest": null,
314
521
  "gpt-5-mini": null,
315
522
  "gpt-5-nano": null,
523
+ "gpt-5.1": null,
316
524
  "gpt3.5-turbo": "gpt-3.5-turbo",
317
525
  "gpt3.5-turbo-instruct": "gpt-3.5-turbo-instruct",
318
526
  "gpt4": "gpt-4",
@@ -326,8 +534,9 @@
326
534
  "gpt5-chat-latest": "gpt-5-chat-latest",
327
535
  "gpt5-mini": "gpt-5-mini",
328
536
  "gpt5-nano": "gpt-5-nano",
329
- "gpt": "gpt-4o",
330
- "gpt-mini": "gpt-4o-mini",
537
+ "gpt5.1": "gpt-5.1",
538
+ "gpt": "gpt-5.1",
539
+ "gpt-mini": "gpt-5-mini",
331
540
  "o3": null,
332
541
  "o3-mini": null,
333
542
  "o4-mini": null,
@@ -337,11 +546,41 @@
337
546
  }
338
547
  }
339
548
  },
549
+ {
550
+ "module": ".minichain.backends.impls.openai.names",
551
+ "attr": "_COMPLETION_BACKEND_STRINGS_MANIFEST",
552
+ "file": "ommlds/minichain/backends/impls/openai/names.py",
553
+ "line": 79,
554
+ "value": {
555
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
556
+ "service_cls_names": [
557
+ "CompletionService"
558
+ ],
559
+ "backend_name": "openai",
560
+ "model_names": null
561
+ }
562
+ }
563
+ },
564
+ {
565
+ "module": ".minichain.backends.impls.openai.names",
566
+ "attr": "_EMBEDDING_BACKEND_STRINGS_MANIFEST",
567
+ "file": "ommlds/minichain/backends/impls/openai/names.py",
568
+ "line": 91,
569
+ "value": {
570
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
571
+ "service_cls_names": [
572
+ "EmbeddingService"
573
+ ],
574
+ "backend_name": "openai",
575
+ "model_names": null
576
+ }
577
+ }
578
+ },
340
579
  {
341
580
  "module": ".minichain.backends.impls.openai.stream",
342
581
  "attr": null,
343
582
  "file": "ommlds/minichain/backends/impls/openai/stream.py",
344
- "line": 31,
583
+ "line": 38,
345
584
  "value": {
346
585
  "!.minichain.registries.manifests.RegistryManifest": {
347
586
  "module": "ommlds.minichain.backends.impls.openai.stream",
@@ -352,16 +591,31 @@
352
591
  }
353
592
  }
354
593
  },
594
+ {
595
+ "module": ".minichain.backends.impls.tavily",
596
+ "attr": null,
597
+ "file": "ommlds/minichain/backends/impls/tavily.py",
598
+ "line": 19,
599
+ "value": {
600
+ "!.minichain.registries.manifests.RegistryManifest": {
601
+ "module": "ommlds.minichain.backends.impls.tavily",
602
+ "attr": "TavilySearchService",
603
+ "name": "tavily",
604
+ "aliases": null,
605
+ "type": "SearchService"
606
+ }
607
+ }
608
+ },
355
609
  {
356
610
  "module": ".minichain.backends.impls.tinygrad.chat",
357
611
  "attr": null,
358
612
  "file": "ommlds/minichain/backends/impls/tinygrad/chat.py",
359
- "line": 113,
613
+ "line": 118,
360
614
  "value": {
361
615
  "!.minichain.registries.manifests.RegistryManifest": {
362
616
  "module": "ommlds.minichain.backends.impls.tinygrad.chat",
363
617
  "attr": "TinygradLlama3ChatChoicesService",
364
- "name": "tinygrad_llama3",
618
+ "name": "tinygrad-llama3",
365
619
  "aliases": null,
366
620
  "type": "ChatChoicesService"
367
621
  }
@@ -371,12 +625,12 @@
371
625
  "module": ".minichain.backends.impls.tinygrad.chat",
372
626
  "attr": null,
373
627
  "file": "ommlds/minichain/backends/impls/tinygrad/chat.py",
374
- "line": 133,
628
+ "line": 138,
375
629
  "value": {
376
630
  "!.minichain.registries.manifests.RegistryManifest": {
377
631
  "module": "ommlds.minichain.backends.impls.tinygrad.chat",
378
632
  "attr": "TinygradLlama3ChatChoicesStreamService",
379
- "name": "tinygrad_llama3",
633
+ "name": "tinygrad-llama3",
380
634
  "aliases": null,
381
635
  "type": "ChatChoicesStreamService"
382
636
  }
@@ -386,14 +640,14 @@
386
640
  "module": ".minichain.backends.impls.tinygrad.chat",
387
641
  "attr": null,
388
642
  "file": "ommlds/minichain/backends/impls/tinygrad/chat.py",
389
- "line": 159,
643
+ "line": 169,
390
644
  "value": {
391
645
  "!.minichain.backends.strings.manifests.BackendStringsManifest": {
392
646
  "service_cls_names": [
393
647
  "ChatChoicesService",
394
648
  "ChatChoicesStreamService"
395
649
  ],
396
- "backend_name": "tinygrad_llama3",
650
+ "backend_name": "tinygrad-llama3",
397
651
  "model_names": null
398
652
  }
399
653
  }
@@ -402,7 +656,7 @@
402
656
  "module": ".minichain.backends.impls.transformers.sentence",
403
657
  "attr": null,
404
658
  "file": "ommlds/minichain/backends/impls/transformers/sentence.py",
405
- "line": 19,
659
+ "line": 22,
406
660
  "value": {
407
661
  "!.minichain.registries.manifests.RegistryManifest": {
408
662
  "module": "ommlds.minichain.backends.impls.transformers.sentence",
@@ -419,7 +673,23 @@
419
673
  "module": ".minichain.backends.impls.transformers.transformers",
420
674
  "attr": null,
421
675
  "file": "ommlds/minichain/backends/impls/transformers/transformers.py",
422
- "line": 41,
676
+ "line": 52,
677
+ "value": {
678
+ "!.minichain.backends.strings.manifests.BackendStringsManifest": {
679
+ "service_cls_names": [
680
+ "ChatChoicesService",
681
+ "ChatChoicesStreamService"
682
+ ],
683
+ "backend_name": "transformers",
684
+ "model_names": null
685
+ }
686
+ }
687
+ },
688
+ {
689
+ "module": ".minichain.backends.impls.transformers.transformers",
690
+ "attr": null,
691
+ "file": "ommlds/minichain/backends/impls/transformers/transformers.py",
692
+ "line": 68,
423
693
  "value": {
424
694
  "!.minichain.registries.manifests.RegistryManifest": {
425
695
  "module": "ommlds.minichain.backends.impls.transformers.transformers",
@@ -436,7 +706,7 @@
436
706
  "module": ".minichain.backends.impls.transformers.transformers",
437
707
  "attr": null,
438
708
  "file": "ommlds/minichain/backends/impls/transformers/transformers.py",
439
- "line": 127,
709
+ "line": 199,
440
710
  "value": {
441
711
  "!.minichain.registries.manifests.RegistryManifest": {
442
712
  "module": "ommlds.minichain.backends.impls.transformers.transformers",
@@ -449,6 +719,21 @@
449
719
  }
450
720
  }
451
721
  },
722
+ {
723
+ "module": ".minichain.backends.impls.transformers.transformers",
724
+ "attr": null,
725
+ "file": "ommlds/minichain/backends/impls/transformers/transformers.py",
726
+ "line": 229,
727
+ "value": {
728
+ "!.minichain.registries.manifests.RegistryManifest": {
729
+ "module": "ommlds.minichain.backends.impls.transformers.transformers",
730
+ "attr": "TransformersChatChoicesStreamService",
731
+ "name": "transformers",
732
+ "aliases": null,
733
+ "type": "ChatChoicesStreamService"
734
+ }
735
+ }
736
+ },
452
737
  {
453
738
  "module": ".minichain.chat.choices.services",
454
739
  "attr": null,
@@ -461,6 +746,18 @@
461
746
  }
462
747
  }
463
748
  },
749
+ {
750
+ "module": ".minichain.chat.choices.stream.services",
751
+ "attr": null,
752
+ "file": "ommlds/minichain/chat/choices/stream/services.py",
753
+ "line": 28,
754
+ "value": {
755
+ "!.minichain.registries.manifests.RegistryTypeManifest": {
756
+ "module": "ommlds.minichain.chat.choices.stream.services",
757
+ "attr": "ChatChoicesStreamService"
758
+ }
759
+ }
760
+ },
464
761
  {
465
762
  "module": ".minichain.chat.services",
466
763
  "attr": null,
@@ -481,7 +778,7 @@
481
778
  "value": {
482
779
  "!.minichain.registries.manifests.RegistryTypeManifest": {
483
780
  "module": "ommlds.minichain.chat.stream.services",
484
- "attr": "ChatChoicesStreamService"
781
+ "attr": "ChatStreamService"
485
782
  }
486
783
  }
487
784
  },
@@ -576,7 +873,7 @@
576
873
  "module": ".tools.git",
577
874
  "attr": null,
578
875
  "file": "ommlds/tools/git.py",
579
- "line": 172,
876
+ "line": 190,
580
877
  "value": {
581
878
  "!omdev.tools.git.messages.GitMessageGeneratorManifest": {
582
879
  "module": "ommlds.tools.git",
@@ -590,7 +887,7 @@
590
887
  "module": ".tools.ocr",
591
888
  "attr": "_CLI_MODULE",
592
889
  "file": "ommlds/tools/ocr.py",
593
- "line": 83,
890
+ "line": 82,
594
891
  "value": {
595
892
  "!omdev.cli.types.CliModule": {
596
893
  "name": "ocr",
ommlds/__about__.py CHANGED
@@ -14,31 +14,35 @@ class Project(ProjectBase):
14
14
 
15
15
  optional_dependencies = {
16
16
  'backends': [
17
- # 'diffusers ~= 0.35',
17
+ # 'diffusers ~= 0.36',
18
18
 
19
19
  'llama-cpp-python ~= 0.3',
20
20
 
21
- 'mlx ~= 0.28',
22
- 'mlx-lm ~= 0.26; sys_platform == "darwin"',
21
+ 'mlx ~= 0.30; sys_platform == "darwin"',
22
+ 'mlx-lm ~= 0.28; sys_platform == "darwin"',
23
23
 
24
24
  # 'sentencepiece ~= 0.2', # FIXME: https://github.com/google/sentencepiece/issues/1121
25
25
 
26
- 'tiktoken ~= 0.11',
26
+ 'tiktoken ~= 0.12',
27
27
 
28
28
  # 'tinygrad @ git+https://github.com/tinygrad/tinygrad',
29
29
  'tinygrad ~= 0.11',
30
30
 
31
31
  'tokenizers ~= 0.22',
32
32
 
33
- 'torch ~= 2.8',
33
+ 'torch ~= 2.9',
34
34
 
35
- 'transformers ~= 4.56',
35
+ 'transformers ~= 4.57',
36
36
  'sentence-transformers ~= 5.1',
37
37
  ],
38
38
 
39
39
  'huggingface': [
40
- 'huggingface-hub ~= 0.34',
41
- 'datasets ~= 4.0',
40
+ 'huggingface-hub ~= 0.36',
41
+ 'datasets ~= 4.4',
42
+ ],
43
+
44
+ 'nanochat': [
45
+ 'regex >= 2025.0',
42
46
  ],
43
47
 
44
48
  'numpy': [
@@ -52,11 +56,11 @@ class Project(ProjectBase):
52
56
  ],
53
57
 
54
58
  'pillow': [
55
- 'pillow ~= 11.3',
59
+ 'pillow ~= 12.0',
56
60
  ],
57
61
 
58
62
  'search': [
59
- 'ddgs ~= 9.5',
63
+ 'ddgs ~= 9.9',
60
64
  ],
61
65
 
62
66
  'wiki': [
@@ -76,6 +80,8 @@ class Project(ProjectBase):
76
80
 
77
81
 
78
82
  class Setuptools(SetuptoolsBase):
83
+ rs = True
84
+
79
85
  find_packages = {
80
86
  'include': [Project.name, f'{Project.name}.*'],
81
87
  'exclude': [*SetuptoolsBase.find_packages['exclude']],
ommlds/_hacks/__init__.py CHANGED
@@ -0,0 +1,4 @@
1
+ """
2
+ Currently, and ideally, the only thing this codebase will ever interact with requiring these kinds of awful hacks is ML
3
+ code - thus these 'helpers' are kept here, not in the core library.
4
+ """