ommlds 0.0.0.dev466__py3-none-any.whl → 0.0.0.dev512__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 (367) hide show
  1. ommlds/.omlish-manifests.json +404 -31
  2. ommlds/README.md +11 -0
  3. ommlds/__about__.py +21 -12
  4. ommlds/_hacks/__init__.py +4 -0
  5. ommlds/_hacks/funcs.py +110 -0
  6. ommlds/_hacks/names.py +158 -0
  7. ommlds/_hacks/params.py +73 -0
  8. ommlds/_hacks/patches.py +0 -3
  9. ommlds/backends/anthropic/protocol/__init__.py +13 -1
  10. ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
  11. ommlds/backends/anthropic/protocol/sse/events.py +2 -0
  12. ommlds/backends/anthropic/protocol/types.py +5 -7
  13. ommlds/backends/cerebras/__init__.py +7 -0
  14. ommlds/backends/cerebras/_dataclasses.py +4254 -0
  15. ommlds/backends/cerebras/_marshal.py +24 -0
  16. ommlds/backends/cerebras/clients.py +9 -0
  17. ommlds/backends/cerebras/protocol.py +310 -0
  18. ommlds/backends/google/protocol/__init__.py +13 -0
  19. ommlds/backends/google/protocol/_dataclasses.py +5997 -0
  20. ommlds/backends/google/protocol/types.py +6 -8
  21. ommlds/backends/groq/__init__.py +7 -0
  22. ommlds/backends/groq/_dataclasses.py +3901 -0
  23. ommlds/backends/groq/_marshal.py +23 -0
  24. ommlds/backends/groq/clients.py +9 -0
  25. ommlds/backends/groq/protocol.py +247 -0
  26. ommlds/{huggingface.py → backends/huggingface/cache.py} +1 -6
  27. ommlds/backends/huggingface/cli.py +208 -0
  28. ommlds/backends/llamacpp/logging.py +4 -1
  29. ommlds/backends/mlx/caching.py +7 -3
  30. ommlds/backends/mlx/cli.py +10 -7
  31. ommlds/backends/mlx/generation.py +18 -16
  32. ommlds/backends/mlx/limits.py +10 -6
  33. ommlds/backends/mlx/loading.py +7 -4
  34. ommlds/backends/ollama/__init__.py +7 -0
  35. ommlds/backends/ollama/_dataclasses.py +3940 -0
  36. ommlds/backends/ollama/cli.py +36 -0
  37. ommlds/backends/ollama/protocol.py +201 -0
  38. ommlds/backends/openai/protocol/__init__.py +15 -1
  39. ommlds/backends/openai/protocol/_common.py +3 -5
  40. ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
  41. ommlds/backends/tavily/__init__.py +7 -0
  42. ommlds/backends/tavily/_dataclasses.py +1734 -0
  43. ommlds/backends/tavily/protocol.py +299 -0
  44. ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
  45. ommlds/backends/torch/backends.py +1 -1
  46. ommlds/backends/transformers/__init__.py +14 -0
  47. ommlds/backends/transformers/filecache.py +109 -0
  48. ommlds/backends/transformers/streamers.py +73 -0
  49. ommlds/cli/__init__.py +7 -0
  50. ommlds/cli/_dataclasses.py +3835 -0
  51. ommlds/cli/asyncs.py +30 -0
  52. ommlds/cli/backends/catalog.py +88 -0
  53. ommlds/cli/backends/configs.py +9 -0
  54. ommlds/cli/backends/inject.py +100 -42
  55. ommlds/cli/{sessions/chat/backends → backends}/injection.py +1 -1
  56. ommlds/cli/backends/meta.py +82 -0
  57. ommlds/cli/{sessions/chat/backends → backends}/types.py +11 -1
  58. ommlds/cli/{sessions/chat/content → content}/messages.py +2 -2
  59. ommlds/cli/{sessions/chat/content → content}/strings.py +1 -1
  60. ommlds/cli/inject.py +17 -8
  61. ommlds/cli/inputs/asyncs.py +32 -0
  62. ommlds/cli/inputs/sync.py +75 -0
  63. ommlds/cli/main.py +346 -114
  64. ommlds/cli/rendering/configs.py +9 -0
  65. ommlds/cli/{sessions/chat/rendering → rendering}/inject.py +4 -5
  66. ommlds/cli/{sessions/chat/rendering → rendering}/markdown.py +1 -1
  67. ommlds/cli/{sessions/chat/rendering → rendering}/raw.py +1 -1
  68. ommlds/cli/{sessions/chat/rendering → rendering}/types.py +7 -1
  69. ommlds/cli/secrets.py +22 -0
  70. ommlds/cli/sessions/base.py +1 -10
  71. ommlds/cli/sessions/chat/configs.py +13 -30
  72. ommlds/cli/sessions/chat/drivers/ai/configs.py +13 -0
  73. ommlds/cli/sessions/chat/drivers/ai/events.py +57 -0
  74. ommlds/cli/sessions/chat/{chat → drivers}/ai/inject.py +15 -12
  75. ommlds/cli/sessions/chat/{chat → drivers}/ai/rendering.py +8 -8
  76. ommlds/cli/sessions/chat/{chat → drivers}/ai/services.py +5 -5
  77. ommlds/cli/sessions/chat/{chat → drivers}/ai/tools.py +4 -8
  78. ommlds/cli/sessions/chat/{chat → drivers}/ai/types.py +10 -1
  79. ommlds/cli/sessions/chat/drivers/configs.py +25 -0
  80. ommlds/cli/sessions/chat/drivers/events/inject.py +27 -0
  81. ommlds/cli/sessions/chat/drivers/events/injection.py +14 -0
  82. ommlds/cli/sessions/chat/drivers/events/manager.py +16 -0
  83. ommlds/cli/sessions/chat/drivers/events/types.py +44 -0
  84. ommlds/cli/sessions/chat/drivers/impl.py +50 -0
  85. ommlds/cli/sessions/chat/drivers/inject.py +70 -0
  86. ommlds/cli/sessions/chat/drivers/state/configs.py +13 -0
  87. ommlds/cli/sessions/chat/drivers/state/ids.py +25 -0
  88. ommlds/cli/sessions/chat/drivers/state/inject.py +83 -0
  89. ommlds/cli/sessions/chat/{chat → drivers}/state/inmemory.py +1 -6
  90. ommlds/cli/sessions/chat/{chat → drivers}/state/storage.py +18 -12
  91. ommlds/cli/sessions/chat/{chat → drivers}/state/types.py +11 -6
  92. ommlds/cli/sessions/chat/drivers/tools/configs.py +22 -0
  93. ommlds/cli/sessions/chat/drivers/tools/confirmation.py +44 -0
  94. ommlds/cli/sessions/chat/drivers/tools/errorhandling.py +39 -0
  95. ommlds/cli/sessions/chat/{tools → drivers/tools}/execution.py +3 -4
  96. ommlds/cli/sessions/chat/drivers/tools/fs/__init__.py +0 -0
  97. ommlds/cli/sessions/chat/drivers/tools/fs/configs.py +12 -0
  98. ommlds/cli/sessions/chat/drivers/tools/fs/inject.py +35 -0
  99. ommlds/cli/sessions/chat/drivers/tools/inject.py +83 -0
  100. ommlds/cli/sessions/chat/{tools → drivers/tools}/injection.py +20 -5
  101. ommlds/cli/sessions/chat/{tools → drivers/tools}/rendering.py +3 -3
  102. ommlds/cli/sessions/chat/drivers/tools/todo/__init__.py +0 -0
  103. ommlds/cli/sessions/chat/drivers/tools/todo/configs.py +12 -0
  104. ommlds/cli/sessions/chat/drivers/tools/todo/inject.py +31 -0
  105. ommlds/cli/sessions/chat/drivers/tools/weather/__init__.py +0 -0
  106. ommlds/cli/sessions/chat/drivers/tools/weather/configs.py +12 -0
  107. ommlds/cli/sessions/chat/drivers/tools/weather/inject.py +22 -0
  108. ommlds/cli/sessions/chat/{tools/weather.py → drivers/tools/weather/tools.py} +1 -1
  109. ommlds/cli/sessions/chat/drivers/types.py +31 -0
  110. ommlds/cli/sessions/chat/drivers/user/__init__.py +0 -0
  111. ommlds/cli/sessions/chat/drivers/user/configs.py +14 -0
  112. ommlds/cli/sessions/chat/drivers/user/inject.py +41 -0
  113. ommlds/cli/sessions/chat/facades/__init__.py +0 -0
  114. ommlds/cli/sessions/chat/facades/commands/__init__.py +0 -0
  115. ommlds/cli/sessions/chat/facades/commands/base.py +83 -0
  116. ommlds/cli/sessions/chat/facades/commands/configs.py +9 -0
  117. ommlds/cli/sessions/chat/facades/commands/inject.py +41 -0
  118. ommlds/cli/sessions/chat/facades/commands/injection.py +15 -0
  119. ommlds/cli/sessions/chat/facades/commands/manager.py +59 -0
  120. ommlds/cli/sessions/chat/facades/commands/simple.py +34 -0
  121. ommlds/cli/sessions/chat/facades/commands/types.py +13 -0
  122. ommlds/cli/sessions/chat/facades/configs.py +11 -0
  123. ommlds/cli/sessions/chat/facades/facade.py +26 -0
  124. ommlds/cli/sessions/chat/facades/inject.py +35 -0
  125. ommlds/cli/sessions/chat/facades/ui.py +34 -0
  126. ommlds/cli/sessions/chat/inject.py +10 -49
  127. ommlds/cli/sessions/chat/interfaces/__init__.py +0 -0
  128. ommlds/cli/sessions/chat/interfaces/bare/__init__.py +0 -0
  129. ommlds/cli/sessions/chat/interfaces/bare/configs.py +15 -0
  130. ommlds/cli/sessions/chat/interfaces/bare/inject.py +69 -0
  131. ommlds/cli/sessions/chat/interfaces/bare/interactive.py +49 -0
  132. ommlds/cli/sessions/chat/interfaces/bare/oneshot.py +21 -0
  133. ommlds/cli/sessions/chat/{tools/confirmation.py → interfaces/bare/tools.py} +3 -22
  134. ommlds/cli/sessions/chat/interfaces/base.py +13 -0
  135. ommlds/cli/sessions/chat/interfaces/configs.py +11 -0
  136. ommlds/cli/sessions/chat/interfaces/inject.py +29 -0
  137. ommlds/cli/sessions/chat/interfaces/textual/__init__.py +0 -0
  138. ommlds/cli/sessions/chat/interfaces/textual/app.py +429 -0
  139. ommlds/cli/sessions/chat/interfaces/textual/configs.py +11 -0
  140. ommlds/cli/sessions/chat/interfaces/textual/facades.py +19 -0
  141. ommlds/cli/sessions/chat/interfaces/textual/inject.py +111 -0
  142. ommlds/cli/sessions/chat/interfaces/textual/inputhistory.py +174 -0
  143. ommlds/cli/sessions/chat/interfaces/textual/interface.py +24 -0
  144. ommlds/cli/sessions/chat/interfaces/textual/styles/__init__.py +29 -0
  145. ommlds/cli/sessions/chat/interfaces/textual/styles/input.tcss +53 -0
  146. ommlds/cli/sessions/chat/interfaces/textual/styles/markdown.tcss +7 -0
  147. ommlds/cli/sessions/chat/interfaces/textual/styles/messages.tcss +167 -0
  148. ommlds/cli/sessions/chat/interfaces/textual/tools.py +38 -0
  149. ommlds/cli/sessions/chat/interfaces/textual/widgets/__init__.py +0 -0
  150. ommlds/cli/sessions/chat/interfaces/textual/widgets/input.py +70 -0
  151. ommlds/cli/sessions/chat/interfaces/textual/widgets/messages.py +207 -0
  152. ommlds/cli/sessions/chat/session.py +8 -13
  153. ommlds/cli/sessions/completion/configs.py +5 -6
  154. ommlds/cli/sessions/completion/inject.py +15 -2
  155. ommlds/cli/sessions/completion/session.py +10 -18
  156. ommlds/cli/sessions/configs.py +10 -0
  157. ommlds/cli/sessions/embedding/configs.py +5 -6
  158. ommlds/cli/sessions/embedding/inject.py +15 -2
  159. ommlds/cli/sessions/embedding/session.py +10 -18
  160. ommlds/cli/sessions/inject.py +15 -15
  161. ommlds/cli/state/storage.py +8 -2
  162. ommlds/minichain/__init__.py +217 -60
  163. ommlds/minichain/_dataclasses.py +20640 -0
  164. ommlds/minichain/_typedvalues.py +15 -8
  165. ommlds/minichain/backends/catalogs/base.py +20 -1
  166. ommlds/minichain/backends/catalogs/simple.py +2 -2
  167. ommlds/minichain/backends/catalogs/strings.py +13 -10
  168. ommlds/minichain/backends/impls/anthropic/chat.py +28 -5
  169. ommlds/minichain/backends/impls/anthropic/names.py +3 -3
  170. ommlds/minichain/backends/impls/anthropic/protocol.py +2 -2
  171. ommlds/minichain/backends/impls/anthropic/stream.py +23 -18
  172. ommlds/minichain/backends/impls/cerebras/__init__.py +0 -0
  173. ommlds/minichain/backends/impls/cerebras/chat.py +82 -0
  174. ommlds/minichain/backends/impls/cerebras/names.py +45 -0
  175. ommlds/minichain/backends/impls/cerebras/protocol.py +143 -0
  176. ommlds/minichain/backends/impls/cerebras/stream.py +114 -0
  177. ommlds/minichain/backends/impls/duckduckgo/search.py +5 -1
  178. ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
  179. ommlds/minichain/backends/impls/dummy/chat.py +69 -0
  180. ommlds/minichain/backends/impls/google/chat.py +20 -84
  181. ommlds/minichain/backends/impls/google/names.py +6 -0
  182. ommlds/minichain/backends/impls/google/protocol.py +105 -0
  183. ommlds/minichain/backends/impls/google/search.py +10 -5
  184. ommlds/minichain/backends/impls/google/stream.py +64 -142
  185. ommlds/minichain/backends/impls/google/tools.py +2 -2
  186. ommlds/minichain/backends/impls/groq/__init__.py +0 -0
  187. ommlds/minichain/backends/impls/groq/chat.py +77 -0
  188. ommlds/minichain/backends/impls/groq/names.py +48 -0
  189. ommlds/minichain/backends/impls/groq/protocol.py +143 -0
  190. ommlds/minichain/backends/impls/groq/stream.py +114 -0
  191. ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
  192. ommlds/minichain/backends/impls/llamacpp/chat.py +15 -3
  193. ommlds/minichain/backends/impls/llamacpp/completion.py +7 -3
  194. ommlds/minichain/backends/impls/llamacpp/stream.py +38 -19
  195. ommlds/minichain/backends/impls/mistral.py +9 -2
  196. ommlds/minichain/backends/impls/mlx/chat.py +100 -23
  197. ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
  198. ommlds/minichain/backends/impls/ollama/chat.py +193 -0
  199. ommlds/minichain/backends/impls/ollama/protocol.py +144 -0
  200. ommlds/minichain/backends/impls/openai/chat.py +14 -7
  201. ommlds/minichain/backends/impls/openai/completion.py +9 -2
  202. ommlds/minichain/backends/impls/openai/embedding.py +9 -2
  203. ommlds/minichain/backends/impls/openai/format.py +117 -115
  204. ommlds/minichain/backends/impls/openai/names.py +33 -5
  205. ommlds/minichain/backends/impls/openai/stream.py +61 -70
  206. ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
  207. ommlds/minichain/backends/impls/tavily.py +66 -0
  208. ommlds/minichain/backends/impls/tinygrad/chat.py +17 -14
  209. ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
  210. ommlds/minichain/backends/impls/transformers/sentence.py +5 -2
  211. ommlds/minichain/backends/impls/transformers/tokens.py +9 -6
  212. ommlds/minichain/backends/impls/transformers/transformers.py +139 -20
  213. ommlds/minichain/backends/strings/parsing.py +2 -2
  214. ommlds/minichain/backends/strings/resolving.py +7 -2
  215. ommlds/minichain/chat/choices/stream/__init__.py +0 -0
  216. ommlds/minichain/chat/{stream → choices/stream}/adapters.py +7 -7
  217. ommlds/minichain/chat/choices/stream/joining.py +31 -0
  218. ommlds/minichain/chat/choices/stream/services.py +45 -0
  219. ommlds/minichain/chat/choices/stream/types.py +43 -0
  220. ommlds/minichain/chat/content.py +42 -0
  221. ommlds/minichain/chat/messages.py +46 -42
  222. ommlds/minichain/chat/stream/_marshal.py +4 -4
  223. ommlds/minichain/chat/stream/joining.py +56 -43
  224. ommlds/minichain/chat/stream/services.py +15 -15
  225. ommlds/minichain/chat/stream/types.py +17 -24
  226. ommlds/minichain/chat/templating.py +3 -3
  227. ommlds/minichain/content/__init__.py +20 -3
  228. ommlds/minichain/content/_marshal.py +181 -55
  229. ommlds/minichain/content/code.py +26 -0
  230. ommlds/minichain/content/composite.py +28 -0
  231. ommlds/minichain/content/content.py +27 -0
  232. ommlds/minichain/content/dynamic.py +12 -0
  233. ommlds/minichain/content/emphasis.py +27 -0
  234. ommlds/minichain/content/images.py +2 -2
  235. ommlds/minichain/content/json.py +2 -2
  236. ommlds/minichain/content/link.py +13 -0
  237. ommlds/minichain/content/markdown.py +12 -0
  238. ommlds/minichain/content/metadata.py +10 -0
  239. ommlds/minichain/content/namespaces.py +8 -0
  240. ommlds/minichain/content/placeholders.py +10 -9
  241. ommlds/minichain/content/quote.py +26 -0
  242. ommlds/minichain/content/raw.py +49 -0
  243. ommlds/minichain/content/recursive.py +12 -0
  244. ommlds/minichain/content/resources.py +22 -0
  245. ommlds/minichain/content/section.py +26 -0
  246. ommlds/minichain/content/sequence.py +17 -3
  247. ommlds/minichain/content/standard.py +32 -0
  248. ommlds/minichain/content/tag.py +28 -0
  249. ommlds/minichain/content/templates.py +13 -0
  250. ommlds/minichain/content/text.py +2 -2
  251. ommlds/minichain/content/transform/__init__.py +0 -0
  252. ommlds/minichain/content/transform/json.py +55 -0
  253. ommlds/minichain/content/transform/markdown.py +8 -0
  254. ommlds/minichain/content/transform/materialize.py +59 -0
  255. ommlds/minichain/content/transform/metadata.py +16 -0
  256. ommlds/minichain/content/transform/namespaces.py +20 -0
  257. ommlds/minichain/content/transform/placeholders.py +60 -0
  258. ommlds/minichain/content/{prepare.py → transform/prepare.py} +10 -15
  259. ommlds/minichain/content/transform/recursive.py +54 -0
  260. ommlds/minichain/content/transform/resources.py +58 -0
  261. ommlds/minichain/content/transform/standard.py +43 -0
  262. ommlds/minichain/content/{transforms → transform}/stringify.py +1 -7
  263. ommlds/minichain/content/transform/strings.py +33 -0
  264. ommlds/minichain/content/transform/templates.py +25 -0
  265. ommlds/minichain/content/transform/types.py +18 -0
  266. ommlds/minichain/content/transform/visitors.py +38 -0
  267. ommlds/minichain/content/visitors.py +218 -0
  268. ommlds/minichain/http/__init__.py +0 -0
  269. ommlds/minichain/http/stream.py +195 -0
  270. ommlds/minichain/lib/fs/tools/read.py +1 -1
  271. ommlds/minichain/lib/fs/tools/recursivels/rendering.py +1 -1
  272. ommlds/minichain/lib/fs/tools/recursivels/running.py +1 -1
  273. ommlds/minichain/lib/todo/tools/write.py +2 -1
  274. ommlds/minichain/lib/todo/types.py +1 -1
  275. ommlds/minichain/llms/types.py +4 -0
  276. ommlds/minichain/metadata.py +56 -2
  277. ommlds/minichain/models/configs.py +2 -2
  278. ommlds/minichain/models/names.py +2 -0
  279. ommlds/minichain/registries/globals.py +18 -4
  280. ommlds/minichain/resources.py +49 -3
  281. ommlds/minichain/search.py +1 -1
  282. ommlds/minichain/services/README.md +154 -0
  283. ommlds/minichain/services/__init__.py +6 -2
  284. ommlds/minichain/services/_marshal.py +46 -10
  285. ommlds/minichain/services/_origclasses.py +11 -0
  286. ommlds/minichain/services/_typedvalues.py +8 -3
  287. ommlds/minichain/services/requests.py +73 -3
  288. ommlds/minichain/services/responses.py +73 -3
  289. ommlds/minichain/services/services.py +9 -0
  290. ommlds/minichain/standard.py +8 -0
  291. ommlds/minichain/stream/services.py +43 -17
  292. ommlds/minichain/text/applypatch.py +2 -1
  293. ommlds/minichain/text/toolparsing/llamacpp/types.py +1 -1
  294. ommlds/minichain/tokens/specials.py +1 -1
  295. ommlds/minichain/tools/execution/catalog.py +2 -2
  296. ommlds/minichain/tools/execution/errorhandling.py +36 -0
  297. ommlds/minichain/tools/execution/errors.py +2 -2
  298. ommlds/minichain/tools/execution/executors.py +1 -1
  299. ommlds/minichain/tools/fns.py +1 -1
  300. ommlds/minichain/tools/jsonschema.py +2 -2
  301. ommlds/minichain/tools/reflect.py +11 -7
  302. ommlds/minichain/tools/types.py +16 -19
  303. ommlds/minichain/vectors/_marshal.py +1 -1
  304. ommlds/minichain/vectors/embeddings.py +1 -1
  305. ommlds/minichain/wrappers/__init__.py +7 -0
  306. ommlds/minichain/wrappers/firstinwins.py +144 -0
  307. ommlds/minichain/wrappers/instrument.py +146 -0
  308. ommlds/minichain/wrappers/retry.py +168 -0
  309. ommlds/minichain/wrappers/services.py +98 -0
  310. ommlds/minichain/wrappers/stream.py +57 -0
  311. ommlds/nanochat/LICENSE +21 -0
  312. ommlds/nanochat/__init__.py +0 -0
  313. ommlds/nanochat/rustbpe/LICENSE +21 -0
  314. ommlds/nanochat/rustbpe/README.md +10 -0
  315. ommlds/nanochat/tokenizers.py +440 -0
  316. ommlds/specs/__init__.py +0 -0
  317. ommlds/specs/mcp/__init__.py +0 -0
  318. ommlds/specs/mcp/_marshal.py +23 -0
  319. ommlds/specs/mcp/clients.py +146 -0
  320. ommlds/specs/mcp/protocol.py +369 -0
  321. ommlds/tools/git.py +84 -64
  322. ommlds/tools/ocr.py +1 -1
  323. ommlds/wiki/analyze.py +2 -2
  324. ommlds/wiki/models.py +4 -4
  325. ommlds/wiki/text/mfh.py +9 -9
  326. ommlds/wiki/utils/xml.py +5 -5
  327. {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/METADATA +28 -21
  328. ommlds-0.0.0.dev512.dist-info/RECORD +534 -0
  329. {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/WHEEL +1 -1
  330. ommlds/cli/backends/standard.py +0 -20
  331. ommlds/cli/sessions/chat/backends/catalog.py +0 -56
  332. ommlds/cli/sessions/chat/backends/inject.py +0 -37
  333. ommlds/cli/sessions/chat/chat/state/inject.py +0 -40
  334. ommlds/cli/sessions/chat/chat/user/inject.py +0 -61
  335. ommlds/cli/sessions/chat/chat/user/interactive.py +0 -29
  336. ommlds/cli/sessions/chat/chat/user/oneshot.py +0 -25
  337. ommlds/cli/sessions/chat/chat/user/types.py +0 -15
  338. ommlds/cli/sessions/chat/driver.py +0 -43
  339. ommlds/cli/sessions/chat/tools/inject.py +0 -145
  340. ommlds/minichain/backends/impls/openai/format2.py +0 -210
  341. ommlds/minichain/content/materialize.py +0 -196
  342. ommlds/minichain/content/simple.py +0 -47
  343. ommlds/minichain/content/transforms/base.py +0 -46
  344. ommlds/minichain/content/transforms/interleave.py +0 -70
  345. ommlds/minichain/content/transforms/squeeze.py +0 -72
  346. ommlds/minichain/content/transforms/strings.py +0 -24
  347. ommlds/minichain/content/types.py +0 -43
  348. ommlds/minichain/stream/wrap.py +0 -62
  349. ommlds-0.0.0.dev466.dist-info/RECORD +0 -376
  350. /ommlds/{cli/sessions/chat/backends → backends/huggingface}/__init__.py +0 -0
  351. /ommlds/cli/{sessions/chat/chat → content}/__init__.py +0 -0
  352. /ommlds/cli/{sessions/chat/chat/ai → inputs}/__init__.py +0 -0
  353. /ommlds/cli/{sessions/chat/chat/state → rendering}/__init__.py +0 -0
  354. /ommlds/cli/sessions/chat/{chat/user → drivers}/__init__.py +0 -0
  355. /ommlds/cli/sessions/chat/{content → drivers/ai}/__init__.py +0 -0
  356. /ommlds/cli/sessions/chat/{chat → drivers}/ai/injection.py +0 -0
  357. /ommlds/cli/sessions/chat/{phases → drivers/events}/__init__.py +0 -0
  358. /ommlds/cli/sessions/chat/{rendering → drivers/phases}/__init__.py +0 -0
  359. /ommlds/cli/sessions/chat/{phases → drivers/phases}/inject.py +0 -0
  360. /ommlds/cli/sessions/chat/{phases → drivers/phases}/injection.py +0 -0
  361. /ommlds/cli/sessions/chat/{phases → drivers/phases}/manager.py +0 -0
  362. /ommlds/cli/sessions/chat/{phases → drivers/phases}/types.py +0 -0
  363. /ommlds/cli/sessions/chat/{tools → drivers/state}/__init__.py +0 -0
  364. /ommlds/{minichain/content/transforms → cli/sessions/chat/drivers/tools}/__init__.py +0 -0
  365. {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/entry_points.txt +0 -0
  366. {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/licenses/LICENSE +0 -0
  367. {ommlds-0.0.0.dev466.dist-info → ommlds-0.0.0.dev512.dist-info}/top_level.txt +0 -0
@@ -9,26 +9,24 @@ from omlish import typedvalues as tv
9
9
  from omlish.formats import json
10
10
  from omlish.http import all as http
11
11
  from omlish.http import sse
12
- from omlish.io.buffers import DelimitingBuffer
13
-
14
- from .....backends.openai.protocol.chatcompletion.chunk import ChatCompletionChunk
15
- from ....chat.choices.services import ChatChoicesOutputs
16
- from ....chat.stream.services import ChatChoicesStreamRequest
17
- from ....chat.stream.services import ChatChoicesStreamResponse
18
- from ....chat.stream.services import static_check_is_chat_choices_stream_service
19
- from ....chat.stream.types import AiChoiceDeltas
20
- from ....chat.stream.types import AiChoicesDeltas
21
- from ....chat.stream.types import ChatChoicesStreamOption
12
+
13
+ from .....backends.openai import protocol as pt
14
+ from ....chat.choices.stream.services import ChatChoicesStreamRequest
15
+ from ....chat.choices.stream.services import ChatChoicesStreamResponse
16
+ from ....chat.choices.stream.services import static_check_is_chat_choices_stream_service
17
+ from ....chat.choices.stream.types import AiChoiceDeltas
18
+ from ....chat.choices.stream.types import AiChoicesDeltas
19
+ from ....chat.choices.stream.types import ChatChoicesStreamOption
22
20
  from ....configs import Config
21
+ from ....http.stream import BytesHttpStreamResponseBuilder
22
+ from ....http.stream import SimpleSseLinesHttpStreamResponseHandler
23
23
  from ....resources import ResourcesOption
24
- from ....resources import UseResources
25
24
  from ....standard import ApiKey
26
25
  from ....stream.services import StreamOption
27
- from ....stream.services import StreamResponseSink
28
- from ....stream.services import new_stream_response
29
26
  from .chat import OpenaiChatChoicesService
30
27
  from .format import OpenaiChatRequestHandler
31
- from .names import MODEL_NAMES
28
+ from .format import build_mc_ai_delta
29
+ from .names import CHAT_MODEL_NAMES
32
30
 
33
31
 
34
32
  ##
@@ -40,18 +38,51 @@ from .names import MODEL_NAMES
40
38
  # )
41
39
  @static_check_is_chat_choices_stream_service
42
40
  class OpenaiChatChoicesStreamService:
43
- def __init__(self, *configs: Config) -> None:
41
+ def __init__(
42
+ self,
43
+ *configs: Config,
44
+ http_client: http.AsyncHttpClient | None = None,
45
+ ) -> None:
44
46
  super().__init__()
45
47
 
48
+ self._http_client = http_client
49
+
46
50
  with tv.consume(*configs) as cc:
47
51
  self._model_name = cc.pop(OpenaiChatChoicesService.DEFAULT_MODEL_NAME)
48
52
  self._api_key = ApiKey.pop_secret(cc, env='OPENAI_API_KEY')
49
53
 
50
- READ_CHUNK_SIZE = 64 * 1024
54
+ URL: ta.ClassVar[str] = 'https://api.openai.com/v1/chat/completions'
51
55
 
52
- async def invoke(self, request: ChatChoicesStreamRequest) -> ChatChoicesStreamResponse:
53
- # check.isinstance(request, ChatRequest)
56
+ def _process_sse(self, so: sse.SseDecoderOutput) -> ta.Sequence[AiChoicesDeltas | None]:
57
+ if not (isinstance(so, sse.SseEvent) and so.type == b'message'):
58
+ return []
59
+
60
+ ss = so.data.decode('utf-8')
61
+ if ss == '[DONE]':
62
+ return [None]
63
+
64
+ sj = json.loads(ss) # ChatCompletionChunk
65
+
66
+ check.state(sj['object'] == 'chat.completion.chunk')
67
+
68
+ ccc = msh.unmarshal(sj, pt.ChatCompletionChunk)
54
69
 
70
+ # FIXME: stop reason
71
+ if not ccc.choices:
72
+ return []
73
+
74
+ if any(choice.finish_reason for choice in ccc.choices):
75
+ check.state(all(choice.finish_reason for choice in ccc.choices))
76
+ return [None]
77
+
78
+ return [AiChoicesDeltas([
79
+ AiChoiceDeltas([build_mc_ai_delta(choice.delta)])
80
+ for choice in ccc.choices
81
+ ])]
82
+
83
+ READ_CHUNK_SIZE: ta.ClassVar[int] = -1
84
+
85
+ async def invoke(self, request: ChatChoicesStreamRequest) -> ChatChoicesStreamResponse:
55
86
  rh = OpenaiChatRequestHandler(
56
87
  request.v,
57
88
  *[
@@ -59,19 +90,19 @@ class OpenaiChatChoicesStreamService:
59
90
  for o in request.options
60
91
  if not isinstance(o, (ChatChoicesStreamOption, StreamOption, ResourcesOption))
61
92
  ],
62
- model=MODEL_NAMES.resolve(self._model_name.v),
93
+ model=CHAT_MODEL_NAMES.resolve(self._model_name.v),
63
94
  mandatory_kwargs=dict(
64
95
  stream=True,
65
- stream_options=dict(
96
+ stream_options=pt.ChatCompletionRequest.StreamOptions(
66
97
  include_usage=True,
67
98
  ),
68
99
  ),
69
100
  )
70
101
 
71
- raw_request = rh.raw_request()
102
+ raw_request = msh.marshal(rh.oai_request())
72
103
 
73
104
  http_request = http.HttpRequest(
74
- 'https://api.openai.com/v1/chat/completions',
105
+ self.URL,
75
106
  headers={
76
107
  http.consts.HEADER_CONTENT_TYPE: http.consts.CONTENT_TYPE_JSON,
77
108
  http.consts.HEADER_AUTH: http.consts.format_bearer_auth_header(check.not_none(self._api_key).reveal()),
@@ -79,51 +110,11 @@ class OpenaiChatChoicesStreamService:
79
110
  data=json.dumps(raw_request).encode('utf-8'),
80
111
  )
81
112
 
82
- async with UseResources.or_new(request.options) as rs:
83
- http_client = rs.enter_context(http.client())
84
- http_response = rs.enter_context(http_client.stream_request(http_request))
85
-
86
- async def inner(sink: StreamResponseSink[AiChoicesDeltas]) -> ta.Sequence[ChatChoicesOutputs]:
87
- db = DelimitingBuffer([b'\r', b'\n', b'\r\n'])
88
- sd = sse.SseDecoder()
89
- while True:
90
- # FIXME: read1 not on response stream protocol
91
- b = http_response.stream.read1(self.READ_CHUNK_SIZE) # type: ignore[attr-defined]
92
- for l in db.feed(b):
93
- if isinstance(l, DelimitingBuffer.Incomplete):
94
- # FIXME: handle
95
- return []
96
-
97
- # FIXME: https://platform.openai.com/docs/guides/function-calling?api-mode=responses#streaming
98
- for so in sd.process_line(l):
99
- if isinstance(so, sse.SseEvent) and so.type == b'message':
100
- ss = so.data.decode('utf-8')
101
- if ss == '[DONE]':
102
- return []
103
-
104
- sj = json.loads(ss) # ChatCompletionChunk
105
-
106
- check.state(sj['object'] == 'chat.completion.chunk')
107
-
108
- ccc = msh.unmarshal(sj, ChatCompletionChunk) # noqa
109
- # print(ccc)
110
-
111
- # FIXME: stop reason
112
- if not sj['choices']:
113
- continue
114
-
115
- if any(choice['delta'] for choice in sj['choices']):
116
- await sink.emit(AiChoicesDeltas([
117
- AiChoiceDeltas(
118
- [rh.build_ai_choice_delta(choice['delta'])] if choice['delta'] else [],
119
- )
120
- for choice in sj['choices']
121
- ]))
122
-
123
- if not b:
124
- return []
125
-
126
- # raw_response = json.loads(check.not_none(http_response.data).decode('utf-8'))
127
- # return rh.build_response(raw_response)
128
-
129
- return await new_stream_response(rs, inner)
113
+ return await BytesHttpStreamResponseBuilder(
114
+ self._http_client,
115
+ lambda http_response: SimpleSseLinesHttpStreamResponseHandler(self._process_sse).as_lines().as_bytes(),
116
+ read_chunk_size=self.READ_CHUNK_SIZE,
117
+ ).new_stream_response(
118
+ http_request,
119
+ request.options,
120
+ )
@@ -1,23 +1,26 @@
1
1
  import typing as ta
2
2
 
3
- import sentencepiece as spm
4
-
5
3
  from omlish import check
4
+ from omlish import lang
6
5
 
7
6
  from .... import tokens as tks
8
7
 
9
8
 
9
+ with lang.auto_proxy_import(globals()):
10
+ import sentencepiece as spm
11
+
12
+
10
13
  ##
11
14
 
12
15
 
13
- def build_vocab(spm_tokenizer: spm.SentencePieceProcessor) -> tks.Vocab:
16
+ def build_vocab(spm_tokenizer: 'spm.SentencePieceProcessor') -> tks.Vocab:
14
17
  return tks.Vocab([
15
18
  (ta.cast(tks.Token, i), tks.TokenStr(spm_tokenizer.id_to_piece(i))) # noqa
16
19
  for i in range(spm_tokenizer.get_piece_size()) # noqa
17
20
  ])
18
21
 
19
22
 
20
- def build_specials(spm_tokenizer: spm.SentencePieceProcessor) -> tks.SpecialTokens:
23
+ def build_specials(spm_tokenizer: 'spm.SentencePieceProcessor') -> tks.SpecialTokens:
21
24
  # FIXME
22
25
  return tks.SpecialTokens([])
23
26
 
@@ -28,7 +31,7 @@ def build_specials(spm_tokenizer: spm.SentencePieceProcessor) -> tks.SpecialToke
28
31
  class SentencepieceTokenizer(tks.BaseTokenizer):
29
32
  def __init__(
30
33
  self,
31
- spm_tokenizer: spm.SentencePieceProcessor,
34
+ spm_tokenizer: 'spm.SentencePieceProcessor',
32
35
  ) -> None:
33
36
  self._spm_tokenizer = check.isinstance(spm_tokenizer, spm.SentencePieceProcessor)
34
37
 
@@ -38,7 +41,7 @@ class SentencepieceTokenizer(tks.BaseTokenizer):
38
41
  )
39
42
 
40
43
  @property
41
- def spm_tokenizer(self) -> spm.SentencePieceProcessor:
44
+ def spm_tokenizer(self) -> 'spm.SentencePieceProcessor':
42
45
  return self._spm_tokenizer
43
46
 
44
47
  #
@@ -0,0 +1,66 @@
1
+ from omlish import check
2
+ from omlish import marshal as msh
3
+ from omlish import typedvalues as tv
4
+ from omlish.formats import json
5
+ from omlish.http import all as http
6
+
7
+ from ....backends.tavily import protocol as pt
8
+ from ...search import SearchHit
9
+ from ...search import SearchHits
10
+ from ...search import SearchRequest
11
+ from ...search import SearchResponse
12
+ from ...search import static_check_is_search_service
13
+ from ...standard import ApiKey
14
+
15
+
16
+ ##
17
+
18
+
19
+ # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
20
+ # name='tavily',
21
+ # type='SearchService',
22
+ # )
23
+ @static_check_is_search_service
24
+ class TavilySearchService:
25
+ def __init__(
26
+ self,
27
+ *configs: ApiKey,
28
+ http_client: http.AsyncHttpClient | None = None,
29
+ ) -> None:
30
+ super().__init__()
31
+
32
+ self._http_client = http_client
33
+
34
+ with tv.consume(*configs) as cc:
35
+ self._api_key = ApiKey.pop_secret(cc, env='TAVILY_API_KEY')
36
+
37
+ async def invoke(self, request: SearchRequest) -> SearchResponse:
38
+ pt_request = pt.SearchRequest(
39
+ query=request.v,
40
+ )
41
+
42
+ raw_request = msh.marshal(pt_request)
43
+
44
+ http_response = await http.async_request(
45
+ 'https://api.tavily.com/search',
46
+ headers={
47
+ http.consts.HEADER_CONTENT_TYPE: http.consts.CONTENT_TYPE_JSON,
48
+ http.consts.HEADER_AUTH: http.consts.format_bearer_auth_header(check.not_none(self._api_key).reveal()),
49
+ },
50
+ data=json.dumps(raw_request).encode('utf-8'),
51
+ client=self._http_client,
52
+ )
53
+
54
+ raw_response = json.loads(check.not_none(http_response.data).decode('utf-8'))
55
+
56
+ pt_response = msh.unmarshal(raw_response, pt.SearchResponse)
57
+
58
+ return SearchResponse(SearchHits(
59
+ l=[
60
+ SearchHit(
61
+ title=r.title,
62
+ url=r.url,
63
+ )
64
+ for r in pt_response.results or []
65
+ ],
66
+ ))
@@ -4,23 +4,22 @@ import typing as ta
4
4
  from omlish import check
5
5
  from omlish import lang
6
6
 
7
- from .....backends.tinygrad.models import llama3 as tgl3
8
7
  from ....chat.choices.services import ChatChoicesOptions
9
8
  from ....chat.choices.services import ChatChoicesRequest
10
9
  from ....chat.choices.services import ChatChoicesResponse
11
10
  from ....chat.choices.services import static_check_is_chat_choices_service
11
+ from ....chat.choices.stream.services import ChatChoicesStreamRequest
12
+ from ....chat.choices.stream.services import ChatChoicesStreamResponse
13
+ from ....chat.choices.stream.services import static_check_is_chat_choices_stream_service
14
+ from ....chat.choices.stream.types import AiChoiceDeltas
15
+ from ....chat.choices.stream.types import AiChoicesDeltas
12
16
  from ....chat.choices.types import AiChoice
13
17
  from ....chat.choices.types import ChatChoicesOutputs
14
18
  from ....chat.messages import AiMessage
15
19
  from ....chat.messages import Chat
16
20
  from ....chat.messages import SystemMessage
17
21
  from ....chat.messages import UserMessage
18
- from ....chat.stream.services import ChatChoicesStreamRequest
19
- from ....chat.stream.services import ChatChoicesStreamResponse
20
- from ....chat.stream.services import static_check_is_chat_choices_stream_service
21
- from ....chat.stream.types import AiChoiceDeltas
22
- from ....chat.stream.types import AiChoicesDeltas
23
- from ....chat.stream.types import ContentAiChoiceDelta
22
+ from ....chat.stream.types import ContentAiDelta
24
23
  from ....chat.types import ChatOption
25
24
  from ....llms.types import LlmOption
26
25
  from ....resources import UseResources
@@ -28,6 +27,10 @@ from ....stream.services import StreamResponseSink
28
27
  from ....stream.services import new_stream_response
29
28
 
30
29
 
30
+ with lang.auto_proxy_import(globals()):
31
+ from .....backends.tinygrad.models import llama3 as tgl3
32
+
33
+
31
34
  ##
32
35
 
33
36
 
@@ -39,7 +42,7 @@ def _load_model(
39
42
  *,
40
43
  size: str | None = None,
41
44
  temperature: float | None = None,
42
- ) -> tgl3.Llama3Llm:
45
+ ) -> 'tgl3.Llama3Llm':
43
46
  if size is None:
44
47
  size = DEFAULT_SIZE
45
48
  if temperature is None:
@@ -58,7 +61,7 @@ def _load_model(
58
61
 
59
62
 
60
63
  def _prepare_toks(
61
- llm: tgl3.Llama3Llm,
64
+ llm: 'tgl3.Llama3Llm',
62
65
  chat: Chat,
63
66
  options: ta.Sequence[ChatChoicesOptions],
64
67
  ) -> list[int]:
@@ -100,7 +103,7 @@ class BaseTinygradLlama3ChatService(lang.ExitStacked, lang.Abstract):
100
103
  self._temperature = temperature
101
104
 
102
105
  @lang.cached_function(transient=True)
103
- def _load_model(self) -> tgl3.Llama3Llm:
106
+ def _load_model(self) -> 'tgl3.Llama3Llm':
104
107
  check.not_none(self._exit_stack)
105
108
 
106
109
  return _load_model(
@@ -113,7 +116,7 @@ class BaseTinygradLlama3ChatService(lang.ExitStacked, lang.Abstract):
113
116
 
114
117
 
115
118
  # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
116
- # name='tinygrad_llama3',
119
+ # name='tinygrad-llama3',
117
120
  # type='ChatChoicesService',
118
121
  # )
119
122
  @static_check_is_chat_choices_service
@@ -133,7 +136,7 @@ class TinygradLlama3ChatChoicesService(BaseTinygradLlama3ChatService):
133
136
 
134
137
 
135
138
  # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
136
- # name='tinygrad_llama3',
139
+ # name='tinygrad-llama3',
137
140
  # type='ChatChoicesStreamService',
138
141
  # )
139
142
  @static_check_is_chat_choices_stream_service
@@ -151,7 +154,7 @@ class TinygradLlama3ChatChoicesStreamService(BaseTinygradLlama3ChatService):
151
154
  for s in tgl3.run_llm(llm, toks):
152
155
  await sink.emit(AiChoicesDeltas([
153
156
  AiChoiceDeltas([
154
- ContentAiChoiceDelta(s),
157
+ ContentAiDelta(s),
155
158
  ]),
156
159
  ]))
157
160
 
@@ -168,5 +171,5 @@ class TinygradLlama3ChatChoicesStreamService(BaseTinygradLlama3ChatService):
168
171
  # 'ChatChoicesService',
169
172
  # 'ChatChoicesStreamService',
170
173
  # ],
171
- # 'tinygrad_llama3',
174
+ # 'tinygrad-llama3',
172
175
  # )
@@ -1,23 +1,26 @@
1
1
  import typing as ta
2
2
 
3
- import tokenizers as tos
4
-
5
3
  from omlish import check
4
+ from omlish import lang
6
5
 
7
6
  from .... import tokens as tks
8
7
 
9
8
 
9
+ with lang.auto_proxy_import(globals()):
10
+ import tokenizers as tos
11
+
12
+
10
13
  ##
11
14
 
12
15
 
13
- def build_vocab(tos_tokenizer: tos.Tokenizer) -> tks.Vocab:
16
+ def build_vocab(tos_tokenizer: 'tos.Tokenizer') -> tks.Vocab:
14
17
  return tks.Vocab([
15
18
  (ta.cast(tks.Token, i), tks.TokenStr(s))
16
19
  for s, i in tos_tokenizer.get_vocab().items()
17
20
  ])
18
21
 
19
22
 
20
- def build_specials(tos_tokenizer: tos.Tokenizer) -> tks.SpecialTokens:
23
+ def build_specials(tos_tokenizer: 'tos.Tokenizer') -> tks.SpecialTokens:
21
24
  # FIXME
22
25
  return tks.SpecialTokens([])
23
26
 
@@ -28,7 +31,7 @@ def build_specials(tos_tokenizer: tos.Tokenizer) -> tks.SpecialTokens:
28
31
  class TokenizersTokenizer(tks.BaseTokenizer):
29
32
  def __init__(
30
33
  self,
31
- tos_tokenizer: tos.Tokenizer,
34
+ tos_tokenizer: 'tos.Tokenizer',
32
35
  ) -> None:
33
36
  self._tos_tokenizer = check.isinstance(tos_tokenizer, tos.Tokenizer)
34
37
 
@@ -38,7 +41,7 @@ class TokenizersTokenizer(tks.BaseTokenizer):
38
41
  )
39
42
 
40
43
  @property
41
- def tos_tokenizer(self) -> tos.Tokenizer:
44
+ def tos_tokenizer(self) -> 'tos.Tokenizer':
42
45
  return self._tos_tokenizer
43
46
 
44
47
  #
@@ -1,7 +1,6 @@
1
1
  import typing as ta
2
2
 
3
- import sentence_transformers as stfm
4
-
3
+ from omlish import lang
5
4
  from omlish import typedvalues as tv
6
5
 
7
6
  from ....configs import Config
@@ -13,6 +12,10 @@ from ....vectors.embeddings import static_check_is_embedding_service
13
12
  from ....vectors.types import Vector
14
13
 
15
14
 
15
+ with lang.auto_proxy_import(globals()):
16
+ import sentence_transformers as stfm
17
+
18
+
16
19
  ##
17
20
 
18
21
 
@@ -1,17 +1,20 @@
1
1
  import typing as ta
2
2
 
3
- import transformers as tfm
4
-
5
3
  from omlish import check
6
4
  from omlish import collections as col
5
+ from omlish import lang
7
6
 
8
7
  from .... import tokens as tks
9
8
 
10
9
 
10
+ with lang.auto_proxy_import(globals()):
11
+ import transformers as tfm
12
+
13
+
11
14
  ##
12
15
 
13
16
 
14
- def build_vocab(tfm_tokenizer: tfm.PreTrainedTokenizerBase) -> tks.Vocab:
17
+ def build_vocab(tfm_tokenizer: 'tfm.PreTrainedTokenizerBase') -> tks.Vocab:
15
18
  return tks.Vocab([
16
19
  (ta.cast(tks.Token, i), tks.TokenStr(s))
17
20
  for s, i in tfm_tokenizer.get_vocab().items()
@@ -32,7 +35,7 @@ SPECIAL_TOKEN_ATTR_MAP: col.BiMap[type[tks.SpecialToken], str] = col.make_bi_map
32
35
  })
33
36
 
34
37
 
35
- def build_specials(tfm_tokenizer: tfm.PreTrainedTokenizerBase) -> tks.SpecialTokens:
38
+ def build_specials(tfm_tokenizer: 'tfm.PreTrainedTokenizerBase') -> tks.SpecialTokens:
36
39
  return tks.SpecialTokens.from_dict({
37
40
  st: getattr(tfm_tokenizer, a)
38
41
  for st, a in SPECIAL_TOKEN_ATTR_MAP.items()
@@ -45,7 +48,7 @@ def build_specials(tfm_tokenizer: tfm.PreTrainedTokenizerBase) -> tks.SpecialTok
45
48
  class TransformersTokenizer(tks.BaseTokenizer):
46
49
  def __init__(
47
50
  self,
48
- tfm_tokenizer: tfm.PreTrainedTokenizerBase,
51
+ tfm_tokenizer: 'tfm.PreTrainedTokenizerBase',
49
52
  ) -> None:
50
53
  self._tfm_tokenizer = check.isinstance(tfm_tokenizer, tfm.PreTrainedTokenizerBase)
51
54
 
@@ -55,7 +58,7 @@ class TransformersTokenizer(tks.BaseTokenizer):
55
58
  )
56
59
 
57
60
  @property
58
- def tfm_tokenizer(self) -> tfm.PreTrainedTokenizerBase:
61
+ def tfm_tokenizer(self) -> 'tfm.PreTrainedTokenizerBase':
59
62
  return self._tfm_tokenizer
60
63
 
61
64
  #