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,83 @@
1
+ import abc
2
+ import typing as ta
3
+
4
+ from omlish import dataclasses as dc
5
+ from omlish import lang
6
+ from omlish.argparse import all as argparse
7
+
8
+
9
+ ##
10
+
11
+
12
+ class CommandError(Exception):
13
+ pass
14
+
15
+
16
+ @dc.dataclass()
17
+ class ArgsCommandError(CommandError):
18
+ command: 'Command'
19
+ argv: ta.Sequence[str]
20
+ help: str
21
+
22
+ arg_error: argparse.ArgumentError | None = None
23
+
24
+
25
+ ##
26
+
27
+
28
+ class Command(lang.Abstract):
29
+ def __init__(self) -> None:
30
+ super().__init__()
31
+
32
+ self.__parser: argparse.ArgumentParser = argparse.NoExitArgumentParser(
33
+ prog=self.name,
34
+ description=self.description,
35
+ formatter_class=self._HelpFormatter,
36
+ )
37
+ self._configure_parser(self.__parser)
38
+
39
+ #
40
+
41
+ @property
42
+ def name(self) -> str:
43
+ return lang.camel_to_snake(type(self).__name__.removesuffix('Command'))
44
+
45
+ @property
46
+ def description(self) -> str | None:
47
+ return None
48
+
49
+ class _HelpFormatter(argparse.HelpFormatter):
50
+ def start_section(self, heading):
51
+ return super().start_section(heading.title())
52
+
53
+ def add_usage(self, usage, actions, groups, prefix=None):
54
+ if prefix is None:
55
+ prefix = 'Usage: '
56
+ return super().add_usage(usage, actions, groups, prefix)
57
+
58
+ def _configure_parser(self, parser: argparse.ArgumentParser) -> None:
59
+ pass
60
+
61
+ #
62
+
63
+ @dc.dataclass(frozen=True, kw_only=True)
64
+ class Context:
65
+ print: ta.Callable[[str], ta.Awaitable[None]]
66
+
67
+ @ta.final
68
+ async def run(self, ctx: Context, argv: list[str]) -> None:
69
+ try:
70
+ args = self.__parser.parse_args(argv)
71
+ except argparse.ArgumentError as ae:
72
+ raise ArgsCommandError(
73
+ self,
74
+ argv,
75
+ self.__parser.format_help(),
76
+ ae,
77
+ ) from ae
78
+
79
+ await self._run_args(ctx, args)
80
+
81
+ @abc.abstractmethod
82
+ def _run_args(self, ctx: Context, args: argparse.Namespace) -> ta.Awaitable[None]:
83
+ raise NotImplementedError
@@ -0,0 +1,9 @@
1
+ from omlish import dataclasses as dc
2
+
3
+
4
+ ##
5
+
6
+
7
+ @dc.dataclass(frozen=True, kw_only=True)
8
+ class CommandsConfig:
9
+ pass
@@ -0,0 +1,41 @@
1
+ from omlish import inject as inj
2
+ from omlish import lang
3
+
4
+ from .configs import CommandsConfig
5
+ from .injection import commands
6
+
7
+
8
+ with lang.auto_proxy_import(globals()):
9
+ from . import manager as _manager
10
+ from . import simple as _simple
11
+
12
+
13
+ ##
14
+
15
+
16
+ def bind_commands(cfg: CommandsConfig = CommandsConfig()) -> inj.Elements:
17
+ els: list[inj.Elemental] = []
18
+
19
+ #
20
+
21
+ els.append(commands().bind_items_provider(singleton=True))
22
+
23
+ #
24
+
25
+ els.extend([
26
+ inj.bind(_manager.CommandsManager, singleton=True),
27
+ ])
28
+
29
+ #
30
+
31
+ els.extend([
32
+ inj.bind(_simple.EchoCommand, singleton=True),
33
+ commands().bind_item(to_key=_simple.EchoCommand),
34
+
35
+ inj.bind(_simple.QuitCommand, singleton=True),
36
+ commands().bind_item(to_key=_simple.QuitCommand),
37
+ ])
38
+
39
+ #
40
+
41
+ return inj.as_elements(*els)
@@ -0,0 +1,15 @@
1
+ from omlish import inject as inj
2
+ from omlish import lang
3
+
4
+
5
+ with lang.auto_proxy_import(globals()):
6
+ from . import base as _base
7
+ from . import types as _types
8
+
9
+
10
+ ##
11
+
12
+
13
+ @lang.cached_function
14
+ def commands() -> 'inj.ItemsBinderHelper[_base.Command]':
15
+ return inj.items_binder_helper[_base.Command](_types.Commands)
@@ -0,0 +1,59 @@
1
+ import enum
2
+ import shlex
3
+
4
+ from omlish import collections as col
5
+
6
+ from ..ui import UiMessageDisplayer
7
+ from .base import Command
8
+ from .types import Commands
9
+
10
+
11
+ ##
12
+
13
+
14
+ class RunCommandResult(enum.StrEnum):
15
+ SUCCESS = 'success'
16
+ FAILURE = 'failure'
17
+
18
+
19
+ class CommandsManager:
20
+ def __init__(
21
+ self,
22
+ *,
23
+ commands: Commands,
24
+ ui_message_displayer: UiMessageDisplayer,
25
+ ) -> None:
26
+ super().__init__()
27
+
28
+ self._commands = commands
29
+ self._ui_message_displayer = ui_message_displayer
30
+
31
+ self._commands_by_name = col.make_map((
32
+ (c.name, c) for c in commands
33
+ ), strict=True)
34
+
35
+ async def run_command_text(self, text: str) -> RunCommandResult:
36
+ try:
37
+ parts = shlex.split(text)
38
+ except ValueError as e:
39
+ await self._ui_message_displayer.display_ui_message(f'Invalid command syntax: {e}')
40
+ return RunCommandResult.FAILURE
41
+
42
+ if not parts:
43
+ return RunCommandResult.FAILURE
44
+
45
+ cmd = parts[0].lstrip('/').lower()
46
+ argv = parts[1:]
47
+
48
+ command = self._commands_by_name.get(cmd)
49
+ if not command:
50
+ await self._ui_message_displayer.display_ui_message(f'Unknown command: {cmd}')
51
+ return RunCommandResult.FAILURE
52
+
53
+ ctx = Command.Context(
54
+ print=self._ui_message_displayer.display_ui_message,
55
+ )
56
+
57
+ await command.run(ctx, argv)
58
+
59
+ return RunCommandResult.SUCCESS
@@ -0,0 +1,34 @@
1
+ from omlish.argparse import all as argparse
2
+
3
+ from ..ui import UiQuitSignal
4
+ from .base import Command
5
+
6
+
7
+ ##
8
+
9
+
10
+ class EchoCommand(Command):
11
+ def _configure_parser(self, parser: argparse.ArgumentParser) -> None:
12
+ super()._configure_parser(parser)
13
+
14
+ parser.add_argument('message', help='Message to echo')
15
+
16
+ async def _run_args(self, ctx: Command.Context, args: argparse.Namespace) -> None:
17
+ await ctx.print(args.message)
18
+
19
+
20
+ ##
21
+
22
+
23
+ class QuitCommand(Command):
24
+ def __init__(
25
+ self,
26
+ *,
27
+ quit_signal: UiQuitSignal,
28
+ ) -> None:
29
+ super().__init__()
30
+
31
+ self._quit_signal = quit_signal
32
+
33
+ async def _run_args(self, ctx: Command.Context, args: argparse.Namespace) -> None:
34
+ await self._quit_signal()
@@ -0,0 +1,13 @@
1
+ import typing as ta
2
+
3
+ from omlish import lang
4
+
5
+
6
+ with lang.auto_proxy_import(globals()):
7
+ from . import base as _base
8
+
9
+
10
+ ##
11
+
12
+
13
+ Commands = ta.NewType('Commands', ta.Sequence['_base.Command'])
@@ -0,0 +1,11 @@
1
+ from omlish import dataclasses as dc
2
+
3
+ from .commands.configs import CommandsConfig
4
+
5
+
6
+ ##
7
+
8
+
9
+ @dc.dataclass(frozen=True, kw_only=True)
10
+ class FacadeConfig:
11
+ commands: CommandsConfig = CommandsConfig()
@@ -0,0 +1,26 @@
1
+ from ..... import minichain as mc
2
+ from ..drivers.types import ChatDriver
3
+ from .commands.manager import CommandsManager
4
+
5
+
6
+ ##
7
+
8
+
9
+ class ChatFacade:
10
+ def __init__(
11
+ self,
12
+ *,
13
+ driver: ChatDriver,
14
+ commands: CommandsManager,
15
+ ) -> None:
16
+ super().__init__()
17
+
18
+ self._driver = driver
19
+ self._commands = commands
20
+
21
+ async def handle_user_input(self, text: str) -> None:
22
+ if text.startswith('/'):
23
+ await self._commands.run_command_text(text[1:])
24
+
25
+ else:
26
+ await self._driver.send_user_messages([mc.UserMessage(text)])
@@ -0,0 +1,35 @@
1
+ from omlish import inject as inj
2
+ from omlish import lang
3
+
4
+ from .configs import FacadeConfig
5
+
6
+
7
+ with lang.auto_proxy_import(globals()):
8
+ from . import facade as _facade
9
+ from . import ui as _ui
10
+ from .commands import inject as _commands
11
+
12
+
13
+ ##
14
+
15
+
16
+ def bind_facade(cfg: FacadeConfig = FacadeConfig()) -> inj.Elements:
17
+ els: list[inj.Elemental] = []
18
+
19
+ #
20
+
21
+ els.extend([
22
+ _commands.bind_commands(cfg.commands),
23
+ ])
24
+
25
+ #
26
+
27
+ els.append(inj.bind(_facade.ChatFacade, singleton=True))
28
+
29
+ #
30
+
31
+ els.append(inj.bind(_ui.UiQuitSignal(_ui.raise_system_exit_ui_quit_signal)))
32
+
33
+ #
34
+
35
+ return inj.as_elements(*els)
@@ -0,0 +1,34 @@
1
+ import abc
2
+ import typing as ta
3
+
4
+ from omlish import lang
5
+
6
+
7
+ ##
8
+
9
+
10
+ class UiMessageDisplayer(lang.Abstract):
11
+ @abc.abstractmethod
12
+ def display_ui_message(self, content: str) -> ta.Awaitable[None]:
13
+ pass
14
+
15
+
16
+ class NopUiMessageDisplayer(UiMessageDisplayer):
17
+ async def display_ui_message(self, content: str) -> None:
18
+ pass
19
+
20
+
21
+ class PrintMessageDisplayer(UiMessageDisplayer):
22
+ async def display_ui_message(self, content: str) -> None:
23
+ print(content)
24
+
25
+
26
+ ##
27
+
28
+
29
+ class UiQuitSignal(lang.Func0[ta.Awaitable[None]]):
30
+ pass
31
+
32
+
33
+ async def raise_system_exit_ui_quit_signal() -> None:
34
+ raise SystemExit
@@ -1,79 +1,40 @@
1
- from omlish import dataclasses as dc
2
1
  from omlish import inject as inj
3
2
  from omlish import lang
4
3
 
5
4
  from ..base import Session
6
- from .configs import DEFAULT_CHAT_MODEL_BACKEND
7
5
  from .configs import ChatConfig
8
6
 
9
7
 
10
8
  with lang.auto_proxy_import(globals()):
11
- from . import driver as _driver
9
+ from ...rendering import inject as _rendering
12
10
  from . import session as _session
13
- from .backends import inject as _backends
14
- from .chat.ai import inject as _chat_ai
15
- from .chat.state import inject as _chat_state
16
- from .chat.user import inject as _chat_user
17
- from .phases import inject as _phases
18
- from .rendering import inject as _rendering
19
- from .tools import inject as _tools
11
+ from .drivers import inject as _drivers
12
+ from .facades import inject as _facades
13
+ from .interfaces import inject as _interfaces
20
14
 
21
15
 
22
16
  ##
23
17
 
24
18
 
25
- def bind_chat(cfg: ChatConfig) -> inj.Elements:
19
+ def bind_chat(cfg: ChatConfig = ChatConfig()) -> inj.Elements:
26
20
  els: list[inj.Elemental] = []
27
21
 
28
22
  #
29
23
 
30
24
  els.extend([
31
- _backends.bind_backends(
32
- backend=cfg.backend or DEFAULT_CHAT_MODEL_BACKEND,
33
- ),
34
-
35
- _chat_ai.bind_ai(
36
- stream=cfg.stream,
37
- silent=cfg.silent,
38
- enable_tools=cfg.enable_tools,
39
- ),
40
-
41
- _chat_user.bind_user(
42
- initial_system_content=cfg.initial_system_content,
43
- initial_user_content=cfg.initial_user_content,
44
- interactive=cfg.interactive,
45
- ),
46
-
47
- _chat_state.bind_state(
48
- state=cfg.state,
49
- ),
50
-
51
- _phases.bind_phases(),
52
-
53
- _rendering.bind_rendering(
54
- markdown=cfg.markdown,
55
- ),
56
- ])
25
+ _drivers.bind_driver(cfg.driver),
57
26
 
58
- #
27
+ _facades.bind_facade(cfg.facade),
59
28
 
60
- if cfg.enable_tools:
61
- els.append(_tools.bind_tools(
62
- silent=cfg.silent,
63
- dangerous_no_confirmation=cfg.dangerous_no_tool_confirmation,
64
- enabled_tools=cfg.enabled_tools,
65
- ))
29
+ _interfaces.bind_interface(cfg.interface),
66
30
 
67
- #
68
-
69
- els.extend([
70
- inj.bind(_driver.ChatDriver, singleton=True),
31
+ _rendering.bind_rendering(cfg.rendering),
71
32
  ])
72
33
 
73
34
  #
74
35
 
75
36
  els.extend([
76
- inj.bind(_session.ChatSession.Config(**dc.asdict(cfg))),
37
+ # inj.bind(cfg), # NOTE: *not* done - the code is properly structured around not needing it.
77
38
  inj.bind(Session, to_ctor=_session.ChatSession, singleton=True),
78
39
  ])
79
40
 
File without changes
File without changes
@@ -0,0 +1,15 @@
1
+ import typing as ta
2
+
3
+ from omlish import dataclasses as dc
4
+
5
+ from ..configs import InterfaceConfig
6
+
7
+
8
+ ##
9
+
10
+
11
+ @dc.dataclass(frozen=True, kw_only=True)
12
+ class BareInterfaceConfig(InterfaceConfig):
13
+ interactive: bool = False
14
+
15
+ use_readline: bool | ta.Literal['auto'] = 'auto'
@@ -0,0 +1,69 @@
1
+ from omlish import inject as inj
2
+ from omlish import lang
3
+
4
+ from ..base import ChatInterface
5
+ from .configs import BareInterfaceConfig
6
+
7
+
8
+ with lang.auto_proxy_import(globals()):
9
+ from .....inputs import asyncs as _inputs_asyncs
10
+ from .....inputs import sync as _inputs_sync
11
+ from ...drivers.tools import confirmation as _tools_confirmation
12
+ from ...facades import ui as _facades_ui
13
+ from . import interactive as _interactive
14
+ from . import oneshot as _oneshot
15
+ from . import tools as _tools
16
+
17
+
18
+ ##
19
+
20
+
21
+ def bind_bare(cfg: BareInterfaceConfig = BareInterfaceConfig()) -> inj.Elements:
22
+ els: list[inj.Elemental] = []
23
+
24
+ #
25
+
26
+ if cfg.interactive:
27
+ els.extend([
28
+ inj.bind(_interactive.InteractiveBareChatInterface, singleton=True),
29
+ inj.bind(ChatInterface, to_key=_interactive.InteractiveBareChatInterface),
30
+ ])
31
+
32
+ els.extend([
33
+ inj.bind(_inputs_sync.SyncStringInput, to_const=_inputs_sync.InputSyncStringInput(use_readline=cfg.use_readline)), # noqa
34
+ inj.bind(_inputs_asyncs.AsyncStringInput, to_ctor=_inputs_asyncs.ThreadAsyncStringInput, singleton=True),
35
+ ])
36
+
37
+ else:
38
+ els.extend([
39
+ inj.bind(_oneshot.OneshotBareChatInterface, singleton=True),
40
+ inj.bind(ChatInterface, to_key=_oneshot.OneshotBareChatInterface),
41
+ ])
42
+
43
+ #
44
+
45
+ if cfg.enable_tools:
46
+ if cfg.dangerous_no_tool_confirmation:
47
+ els.append(inj.bind(
48
+ _tools_confirmation.ToolExecutionConfirmation,
49
+ to_ctor=_tools_confirmation.UnsafeAlwaysAllowToolExecutionConfirmation,
50
+ singleton=True,
51
+ ))
52
+
53
+ else:
54
+ els.append(inj.bind(
55
+ _tools_confirmation.ToolExecutionConfirmation,
56
+ to_ctor=_tools.InteractiveToolExecutionConfirmation,
57
+ singleton=True,
58
+ ))
59
+
60
+ #
61
+
62
+ els.extend([
63
+ inj.bind(_facades_ui.PrintMessageDisplayer, singleton=True),
64
+ inj.bind(_facades_ui.UiMessageDisplayer, to_key=_facades_ui.PrintMessageDisplayer),
65
+ ])
66
+
67
+ #
68
+
69
+ return inj.as_elements(*els)
@@ -0,0 +1,49 @@
1
+ import typing as ta
2
+
3
+ from .....inputs.asyncs import AsyncStringInput
4
+ from .....inputs.asyncs import SyncAsyncStringInput
5
+ from .....inputs.sync import InputSyncStringInput
6
+ from ...drivers.types import ChatDriver
7
+ from ...facades.facade import ChatFacade
8
+ from ..base import ChatInterface
9
+
10
+
11
+ ##
12
+
13
+
14
+ class InteractiveBareChatInterface(ChatInterface):
15
+ DEFAULT_STRING_INPUT: ta.ClassVar[AsyncStringInput] = SyncAsyncStringInput(InputSyncStringInput())
16
+
17
+ def __init__(
18
+ self,
19
+ *,
20
+ driver: ChatDriver,
21
+ facade: ChatFacade,
22
+ string_input: AsyncStringInput | None = None,
23
+ ) -> None:
24
+ super().__init__()
25
+
26
+ self._driver = driver
27
+ self._facade = facade
28
+ if string_input is None:
29
+ string_input = self.DEFAULT_STRING_INPUT
30
+ self._string_input = string_input
31
+
32
+ async def run(self) -> None:
33
+ await self._driver.start()
34
+
35
+ while True:
36
+ try:
37
+ s = await self._string_input()
38
+ except EOFError:
39
+ break
40
+
41
+ print()
42
+ print('<')
43
+ print()
44
+
45
+ await self._facade.handle_user_input(s)
46
+
47
+ print()
48
+
49
+ await self._driver.stop()
@@ -0,0 +1,21 @@
1
+ from ...drivers.types import ChatDriver
2
+ from ..base import ChatInterface
3
+
4
+
5
+ ##
6
+
7
+
8
+ class OneshotBareChatInterface(ChatInterface):
9
+ def __init__(
10
+ self,
11
+ *,
12
+ driver: ChatDriver,
13
+ ) -> None:
14
+ super().__init__()
15
+
16
+ self._driver = driver
17
+
18
+ async def run(self) -> None:
19
+ await self._driver.start()
20
+
21
+ await self._driver.stop()
@@ -1,28 +1,9 @@
1
- import abc
2
- import typing as ta
3
-
4
- from omlish import lang
5
1
  from omlish.formats import json
6
2
  from omlish.term.confirm import confirm_action
7
3
 
8
- from ..... import minichain as mc
9
-
10
-
11
- ##
12
-
13
-
14
- class ToolExecutionRequestDeniedError(Exception):
15
- pass
16
-
17
-
18
- class ToolExecutionConfirmation(lang.Abstract):
19
- @abc.abstractmethod
20
- def confirm_tool_execution_or_raise(
21
- self,
22
- use: 'mc.ToolUse',
23
- entry: 'mc.ToolCatalogEntry',
24
- ) -> ta.Awaitable[None]:
25
- raise NotImplementedError
4
+ from ...... import minichain as mc
5
+ from ...drivers.tools.confirmation import ToolExecutionConfirmation
6
+ from ...drivers.tools.confirmation import ToolExecutionRequestDeniedError
26
7
 
27
8
 
28
9
  ##
@@ -0,0 +1,13 @@
1
+ import abc
2
+ import typing as ta
3
+
4
+ from omlish import lang
5
+
6
+
7
+ ##
8
+
9
+
10
+ class ChatInterface(lang.Abstract):
11
+ @abc.abstractmethod
12
+ def run(self) -> ta.Awaitable[None]:
13
+ raise NotImplementedError
@@ -0,0 +1,11 @@
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 InterfaceConfig(lang.Abstract):
10
+ enable_tools: bool = False
11
+ dangerous_no_tool_confirmation: bool = False