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
@@ -0,0 +1,207 @@
1
+ import abc
2
+ import asyncio
3
+ import typing as ta
4
+
5
+ from omdev.tui import textual as tx
6
+ from omlish import lang
7
+
8
+
9
+ ##
10
+
11
+
12
+ class MessagesContainer(tx.VerticalScroll):
13
+ pass
14
+
15
+
16
+ ##
17
+
18
+
19
+ class MessageDivider(tx.Static):
20
+ def __init__(self) -> None:
21
+ super().__init__()
22
+
23
+ self.add_class('message-divider')
24
+
25
+
26
+ ##
27
+
28
+
29
+ class Message(tx.Static, lang.Abstract):
30
+ def __init__(self, *args: ta.Any, **kwargs: ta.Any) -> None:
31
+ super().__init__(*args, **kwargs)
32
+
33
+ self.add_class('message')
34
+
35
+
36
+ #
37
+
38
+
39
+ class WelcomeMessage(Message):
40
+ def __init__(self, content: str) -> None:
41
+ super().__init__()
42
+
43
+ self.add_class('welcome-message')
44
+
45
+ self._content = content
46
+
47
+ def compose(self) -> tx.ComposeResult:
48
+ with tx.Vertical(classes='welcome-message-outer message-outer'):
49
+ yield tx.Static(self._content, classes='welcome-message-content')
50
+
51
+
52
+ #
53
+
54
+
55
+ class UserMessage(Message):
56
+ def __init__(self, content: str) -> None:
57
+ super().__init__()
58
+
59
+ self.add_class('user-message')
60
+
61
+ self._content = content
62
+
63
+ def compose(self) -> tx.ComposeResult:
64
+ with tx.Horizontal(classes='user-message-outer message-outer'):
65
+ yield tx.Static('> ', classes='user-message-glyph message-glyph')
66
+ with tx.Vertical(classes='user-message-inner message-inner'):
67
+ yield tx.Static(self._content)
68
+
69
+
70
+ #
71
+
72
+
73
+ class AiMessage(Message, lang.Abstract):
74
+ def __init__(self) -> None:
75
+ super().__init__()
76
+
77
+ self.add_class('ai-message')
78
+
79
+ def compose(self) -> tx.ComposeResult:
80
+ with tx.Horizontal(classes='ai-message-outer message-outer'):
81
+ yield tx.Static('< ', classes='ai-message-glyph message-glyph')
82
+ with tx.Vertical(classes='ai-message-inner message-inner'):
83
+ yield from self._compose_content()
84
+
85
+ @abc.abstractmethod
86
+ def _compose_content(self) -> ta.Generator:
87
+ raise NotImplementedError
88
+
89
+
90
+ class StaticAiMessage(AiMessage):
91
+ def __init__(
92
+ self,
93
+ content: str,
94
+ *,
95
+ markdown: bool = False,
96
+ ) -> None:
97
+ super().__init__()
98
+
99
+ self._content = content
100
+ self._markdown = markdown
101
+
102
+ def _compose_content(self) -> ta.Generator:
103
+ if self._markdown:
104
+ yield tx.Markdown(self._content)
105
+ else:
106
+ yield tx.Static(self._content)
107
+
108
+
109
+ class StreamAiMessage(AiMessage):
110
+ def __init__(self, content: str) -> None:
111
+ super().__init__()
112
+
113
+ self._content = content
114
+
115
+ def _compose_content(self) -> ta.Generator:
116
+ yield tx.Markdown('')
117
+
118
+ _stream_: tx.MarkdownStream | None = None
119
+
120
+ def _stream(self) -> tx.MarkdownStream:
121
+ if self._stream_ is None:
122
+ self._stream_ = tx.Markdown.get_stream(self.query_one(tx.Markdown))
123
+ return self._stream_
124
+
125
+ async def write_initial_content(self) -> None:
126
+ if self._content:
127
+ await self._stream().write(self._content)
128
+
129
+ async def append_content(self, content: str) -> None:
130
+ if not content:
131
+ return
132
+
133
+ self._content += content
134
+ await self._stream().write(content)
135
+
136
+ async def stop_stream(self) -> None:
137
+ if (stream := self._stream_) is None:
138
+ return
139
+
140
+ await stream.stop()
141
+ self._stream_ = None
142
+
143
+
144
+ #
145
+
146
+
147
+ class ToolConfirmationControls(tx.Static):
148
+ class Allowed(tx.Message):
149
+ pass
150
+
151
+ def compose(self) -> tx.ComposeResult:
152
+ yield tx.Button('Allow', action='allow')
153
+
154
+ def action_allow(self) -> None:
155
+ self.post_message(self.Allowed())
156
+
157
+
158
+ class ToolConfirmationMessage(Message):
159
+ def __init__(
160
+ self,
161
+ outer_content: str,
162
+ inner_content: str,
163
+ fut: asyncio.Future[bool],
164
+ ) -> None:
165
+ super().__init__()
166
+
167
+ self.add_class('tool-confirmation-message')
168
+
169
+ self._outer_content = outer_content
170
+ self._inner_content = inner_content
171
+ self._fut = fut
172
+
173
+ def compose(self) -> tx.ComposeResult:
174
+ with tx.Horizontal(classes='tool-confirmation-message-outer message-outer'):
175
+ yield tx.Static('? ', classes='tool-confirmation-message-glyph message-glyph')
176
+ with tx.Vertical(classes='tool-confirmation-message-inner tool-confirmation-message-inner-open message-inner'): # noqa
177
+ yield tx.Static(self._outer_content, classes='tool-confirmation-message-outer-content')
178
+ yield tx.Static(self._inner_content, classes='tool-confirmation-message-inner-content')
179
+ yield ToolConfirmationControls(classes='tool-confirmation-message-controls')
180
+
181
+ @tx.on(ToolConfirmationControls.Allowed)
182
+ async def on_allowed(self, event: ToolConfirmationControls.Allowed) -> None:
183
+ inner = self.query_one(tx.Vertical)
184
+ await inner.query_one(ToolConfirmationControls).remove()
185
+ inner.remove_class('tool-confirmation-message-inner-open')
186
+ inner.add_class('tool-confirmation-message-inner-closed')
187
+ inner.query_one('.tool-confirmation-message-outer-content', tx.Static).update('Tool use confirmed.')
188
+
189
+ self._fut.set_result(True)
190
+
191
+
192
+ #
193
+
194
+
195
+ class UiMessage(Message):
196
+ def __init__(self, content: str) -> None:
197
+ super().__init__()
198
+
199
+ self.add_class('ui-message')
200
+
201
+ self._content = content
202
+
203
+ def compose(self) -> tx.ComposeResult:
204
+ with tx.Horizontal(classes='ui-message-outer message-outer'):
205
+ yield tx.Static('~ ', classes='ui-message-glyph message-glyph')
206
+ with tx.Vertical(classes='ui-message-inner message-inner'):
207
+ yield tx.Static(self._content)
@@ -1,27 +1,22 @@
1
- import dataclasses as dc
1
+ import typing as ta
2
2
 
3
3
  from ..base import Session
4
- from .configs import ChatConfig
5
- from .driver import ChatDriver
4
+ from .interfaces.base import ChatInterface
6
5
 
7
6
 
8
7
  ##
9
8
 
10
9
 
11
- class ChatSession(Session['ChatSession.Config']):
12
- @dc.dataclass(frozen=True)
13
- class Config(Session.Config, ChatConfig):
14
- pass
15
-
10
+ @ta.final
11
+ class ChatSession(Session):
16
12
  def __init__(
17
13
  self,
18
- config: Config,
19
14
  *,
20
- driver: ChatDriver,
15
+ interface: ChatInterface,
21
16
  ) -> None:
22
- super().__init__(config)
17
+ super().__init__()
23
18
 
24
- self._driver = driver
19
+ self._interface = interface
25
20
 
26
21
  async def run(self) -> None:
27
- await self._driver.run()
22
+ await self._interface.run()
@@ -1,21 +1,20 @@
1
- import dataclasses as dc
1
+ from omlish import dataclasses as dc
2
2
 
3
3
  from .... import minichain as mc
4
+ from ..configs import SessionConfig
4
5
 
5
6
 
6
7
  ##
7
8
 
8
9
 
9
- DEFAULT_COMPLETION_MODEL_BACKEND = 'openai'
10
+ DEFAULT_BACKEND = 'openai'
10
11
 
11
12
 
12
13
  ##
13
14
 
14
15
 
15
- @dc.dataclass(frozen=True)
16
- class CompletionConfig:
16
+ @dc.dataclass(frozen=True, kw_only=True)
17
+ class CompletionConfig(SessionConfig):
17
18
  content: 'mc.Content'
18
19
 
19
- _: dc.KW_ONLY
20
-
21
20
  backend: str | None = None
@@ -1,12 +1,15 @@
1
- from omlish import dataclasses as dc
2
1
  from omlish import inject as inj
3
2
  from omlish import lang
4
3
 
4
+ from ...backends.configs import BackendConfig
5
+ from ...backends.types import DefaultBackendName
5
6
  from ..base import Session
7
+ from .configs import DEFAULT_BACKEND
6
8
  from .configs import CompletionConfig
7
9
 
8
10
 
9
11
  with lang.auto_proxy_import(globals()):
12
+ from ...backends import inject as _backends
10
13
  from . import session as _session
11
14
 
12
15
 
@@ -19,10 +22,20 @@ def bind_completion(cfg: CompletionConfig) -> inj.Elements:
19
22
  #
20
23
 
21
24
  els.extend([
22
- inj.bind(_session.CompletionSession.Config(**dc.asdict(cfg))),
25
+ inj.bind(cfg),
23
26
  inj.bind(Session, to_ctor=_session.CompletionSession, singleton=True),
24
27
  ])
25
28
 
26
29
  #
27
30
 
31
+ els.extend([
32
+ _backends.bind_backends(BackendConfig(
33
+ backend=cfg.backend,
34
+ )),
35
+
36
+ inj.bind(DefaultBackendName, to_const=DEFAULT_BACKEND),
37
+ ])
38
+
39
+ #
40
+
28
41
  return inj.as_elements(*els)
@@ -1,39 +1,31 @@
1
- import dataclasses as dc
2
-
3
1
  from omlish import check
4
- from omlish import lang
5
2
 
6
3
  from .... import minichain as mc
4
+ from ...backends.types import CompletionServiceBackendProvider
7
5
  from ..base import Session
8
- from .configs import DEFAULT_COMPLETION_MODEL_BACKEND
9
6
  from .configs import CompletionConfig
10
7
 
11
8
 
12
9
  ##
13
10
 
14
11
 
15
- class CompletionSession(Session['CompletionSession.Config']):
16
- @dc.dataclass(frozen=True)
17
- class Config(Session.Config, CompletionConfig):
18
- pass
19
-
12
+ class CompletionSession(Session):
20
13
  def __init__(
21
14
  self,
22
- config: Config,
15
+ config: CompletionConfig,
23
16
  *,
24
- backend_catalog: mc.BackendCatalog,
17
+ service_provider: CompletionServiceBackendProvider,
25
18
  ) -> None:
26
- super().__init__(config)
19
+ super().__init__()
27
20
 
28
- self._backend_catalog = backend_catalog
21
+ self._config = config
22
+ self._service_provider = service_provider
29
23
 
30
24
  async def run(self) -> None:
31
25
  prompt = check.isinstance(self._config.content, str)
32
26
 
33
27
  mdl: mc.CompletionService
34
- async with lang.async_maybe_managing(self._backend_catalog.get_backend(
35
- mc.CompletionService,
36
- self._config.backend or DEFAULT_COMPLETION_MODEL_BACKEND,
37
- )) as mdl:
28
+ async with self._service_provider.provide_backend() as mdl:
38
29
  response = await mdl.invoke(mc.CompletionRequest(prompt))
39
- print(response.v.strip())
30
+
31
+ print(response.v.strip())
@@ -0,0 +1,10 @@
1
+ from omlish import dataclasses as dc
2
+ from omlish import lang
3
+
4
+
5
+ ##
6
+
7
+
8
+ @dc.dataclass(frozen=True, kw_only=True)
9
+ class SessionConfig(lang.Abstract):
10
+ pass
@@ -1,21 +1,20 @@
1
- import dataclasses as dc
1
+ from omlish import dataclasses as dc
2
2
 
3
3
  from .... import minichain as mc
4
+ from ..configs import SessionConfig
4
5
 
5
6
 
6
7
  ##
7
8
 
8
9
 
9
- DEFAULT_EMBEDDING_MODEL_BACKEND = 'openai'
10
+ DEFAULT_BACKEND = 'openai'
10
11
 
11
12
 
12
13
  ##
13
14
 
14
15
 
15
- @dc.dataclass(frozen=True)
16
- class EmbeddingConfig:
16
+ @dc.dataclass(frozen=True, kw_only=True)
17
+ class EmbeddingConfig(SessionConfig):
17
18
  content: 'mc.Content'
18
19
 
19
- _: dc.KW_ONLY
20
-
21
20
  backend: str | None = None
@@ -1,12 +1,15 @@
1
- from omlish import dataclasses as dc
2
1
  from omlish import inject as inj
3
2
  from omlish import lang
4
3
 
4
+ from ...backends.configs import BackendConfig
5
+ from ...backends.types import DefaultBackendName
5
6
  from ..base import Session
7
+ from .configs import DEFAULT_BACKEND
6
8
  from .configs import EmbeddingConfig
7
9
 
8
10
 
9
11
  with lang.auto_proxy_import(globals()):
12
+ from ...backends import inject as _backends
10
13
  from . import session as _session
11
14
 
12
15
 
@@ -19,10 +22,20 @@ def bind_embedding(cfg: EmbeddingConfig) -> inj.Elements:
19
22
  #
20
23
 
21
24
  els.extend([
22
- inj.bind(_session.EmbeddingSession.Config(**dc.asdict(cfg))),
25
+ inj.bind(cfg),
23
26
  inj.bind(Session, to_ctor=_session.EmbeddingSession, singleton=True),
24
27
  ])
25
28
 
26
29
  #
27
30
 
31
+ els.extend([
32
+ _backends.bind_backends(BackendConfig(
33
+ backend=cfg.backend,
34
+ )),
35
+
36
+ inj.bind(DefaultBackendName, to_const=DEFAULT_BACKEND),
37
+ ])
38
+
39
+ #
40
+
28
41
  return inj.as_elements(*els)
@@ -1,37 +1,29 @@
1
- import dataclasses as dc
2
-
3
- from omlish import lang
4
1
  from omlish.formats import json
5
2
 
6
3
  from .... import minichain as mc
4
+ from ...backends.types import EmbeddingServiceBackendProvider
7
5
  from ..base import Session
8
- from .configs import DEFAULT_EMBEDDING_MODEL_BACKEND
9
6
  from .configs import EmbeddingConfig
10
7
 
11
8
 
12
9
  ##
13
10
 
14
11
 
15
- class EmbeddingSession(Session['EmbeddingSession.Config']):
16
- @dc.dataclass(frozen=True)
17
- class Config(Session.Config, EmbeddingConfig):
18
- pass
19
-
12
+ class EmbeddingSession(Session):
20
13
  def __init__(
21
14
  self,
22
- config: Config,
15
+ config: EmbeddingConfig,
23
16
  *,
24
- backend_catalog: mc.BackendCatalog,
17
+ service_provider: EmbeddingServiceBackendProvider,
25
18
  ) -> None:
26
- super().__init__(config)
19
+ super().__init__()
27
20
 
28
- self._backend_catalog = backend_catalog
21
+ self._config = config
22
+ self._service_provider = service_provider
29
23
 
30
24
  async def run(self) -> None:
31
25
  mdl: mc.EmbeddingService
32
- async with lang.async_maybe_managing(self._backend_catalog.get_backend(
33
- mc.EmbeddingService,
34
- self._config.backend or DEFAULT_EMBEDDING_MODEL_BACKEND,
35
- )) as mdl:
26
+ async with self._service_provider.provide_backend() as mdl:
36
27
  response = await mdl.invoke(mc.EmbeddingRequest(self._config.content))
37
- print(json.dumps_compact(list(map(float, response.v))))
28
+
29
+ print(json.dumps_compact(list(map(float, response.v))))
@@ -1,34 +1,34 @@
1
- import typing as ta
2
-
3
1
  from omlish import inject as inj
4
2
  from omlish import lang
5
3
 
4
+ from .chat.configs import ChatConfig
5
+ from .completion.configs import CompletionConfig
6
+ from .configs import SessionConfig
7
+ from .embedding.configs import EmbeddingConfig
8
+
6
9
 
7
10
  with lang.auto_proxy_import(globals()):
8
- from .chat import configs as _chat_cfgs
9
- from .chat import inject as _chat_inj
10
- from .completion import configs as _completion_cfgs
11
- from .completion import inject as _completion_inj
12
- from .embedding import configs as _embedding_cfgs
13
- from .embedding import inject as _embedding_inj
11
+ from .chat import inject as _chat
12
+ from .completion import inject as _completion
13
+ from .embedding import inject as _embedding
14
14
 
15
15
 
16
16
  ##
17
17
 
18
18
 
19
- def bind_sessions(cfg: ta.Any) -> inj.Elements:
19
+ def bind_sessions(cfg: SessionConfig) -> inj.Elements:
20
20
  els: list[inj.Elemental] = []
21
21
 
22
22
  #
23
23
 
24
- if isinstance(cfg, _chat_cfgs.ChatConfig):
25
- els.append(_chat_inj.bind_chat(cfg))
24
+ if isinstance(cfg, ChatConfig):
25
+ els.append(_chat.bind_chat(cfg))
26
26
 
27
- elif isinstance(cfg, _completion_cfgs.CompletionConfig):
28
- els.append(_completion_inj.bind_completion(cfg))
27
+ elif isinstance(cfg, CompletionConfig):
28
+ els.append(_completion.bind_completion(cfg))
29
29
 
30
- elif isinstance(cfg, _embedding_cfgs.EmbeddingConfig):
31
- els.append(_embedding_inj.bind_embedding(cfg))
30
+ elif isinstance(cfg, EmbeddingConfig):
31
+ els.append(_embedding.bind_embedding(cfg))
32
32
 
33
33
  else:
34
34
  raise TypeError(cfg)
@@ -1,8 +1,9 @@
1
1
  import abc
2
- import dataclasses as dc
2
+ import datetime
3
3
  import os.path
4
4
  import typing as ta
5
5
 
6
+ from omlish import dataclasses as dc
6
7
  from omlish import lang
7
8
  from omlish import marshal as msh
8
9
  from omlish.formats import json
@@ -52,8 +53,12 @@ STATE_VERSION = 0
52
53
  @dc.dataclass(frozen=True)
53
54
  class MarshaledState:
54
55
  version: int
56
+
55
57
  payload: ta.Any
56
58
 
59
+ created_at: datetime.datetime | None = dc.field(default_factory=lang.utcnow)
60
+ updated_at: datetime.datetime | None = dc.field(default_factory=lang.utcnow)
61
+
57
62
 
58
63
  class MarshalStateStorage(StateStorage, lang.Abstract):
59
64
  def __init__(
@@ -75,6 +80,7 @@ class MarshalStateStorage(StateStorage, lang.Abstract):
75
80
  ms = MarshaledState(
76
81
  version=self._version,
77
82
  payload=msh.marshal(obj, ty),
83
+ updated_at=lang.utcnow(),
78
84
  )
79
85
  return msh.marshal(ms)
80
86
 
@@ -102,7 +108,7 @@ class JsonFileStateStorage(MarshalStateStorage):
102
108
  return json.loads(data)
103
109
 
104
110
  def _save_file_data(self, data: ta.Any) -> None:
105
- data = json.dumps_pretty(data)
111
+ data = json.dumps_compact(data)
106
112
  with open(self._file, 'w') as f:
107
113
  f.write(data)
108
114