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,114 @@
1
+ import typing as ta
2
+
3
+ from omlish import check
4
+ from omlish import marshal as msh
5
+ from omlish import typedvalues as tv
6
+ from omlish.formats import json
7
+ from omlish.http import all as http
8
+ from omlish.http import sse
9
+
10
+ from .....backends.cerebras import protocol as pt
11
+ from .....backends.cerebras.clients import REQUIRED_HTTP_HEADERS
12
+ from ....chat.choices.stream.services import ChatChoicesStreamRequest
13
+ from ....chat.choices.stream.services import ChatChoicesStreamResponse
14
+ from ....chat.choices.stream.services import static_check_is_chat_choices_stream_service
15
+ from ....chat.choices.stream.types import AiChoicesDeltas
16
+ from ....chat.tools.types import Tool
17
+ from ....configs import Config
18
+ from ....http.stream import BytesHttpStreamResponseBuilder
19
+ from ....http.stream import SimpleSseLinesHttpStreamResponseHandler
20
+ from ....standard import ApiKey
21
+ from .chat import CerebrasChatChoicesService
22
+ from .names import MODEL_NAMES
23
+ from .protocol import build_cer_request_messages
24
+ from .protocol import build_cer_request_tool
25
+ from .protocol import build_mc_ai_choice_deltas
26
+
27
+
28
+ ##
29
+
30
+
31
+ # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
32
+ # name='cerebras',
33
+ # type='ChatChoicesStreamService',
34
+ # )
35
+ @static_check_is_chat_choices_stream_service
36
+ class CerebrasChatChoicesStreamService:
37
+ def __init__(
38
+ self,
39
+ *configs: Config,
40
+ http_client: http.AsyncHttpClient | None = None,
41
+ ) -> None:
42
+ super().__init__()
43
+
44
+ self._http_client = http_client
45
+
46
+ with tv.consume(*configs) as cc:
47
+ self._model_name = cc.pop(CerebrasChatChoicesService.DEFAULT_MODEL_NAME)
48
+ self._api_key = ApiKey.pop_secret(cc, env='CEREBRAS_API_KEY')
49
+
50
+ URL: ta.ClassVar[str] = 'https://api.cerebras.ai/v1/chat/completions'
51
+
52
+ def _process_sse(self, so: sse.SseDecoderOutput) -> ta.Sequence[AiChoicesDeltas | None]:
53
+ if not (isinstance(so, sse.SseEvent) and so.type == b'message'):
54
+ return []
55
+
56
+ ss = so.data.decode('utf-8')
57
+ if ss == '[DONE]':
58
+ return [None]
59
+
60
+ sj = json.loads(ss) # ChatCompletionChunk
61
+
62
+ check.state(sj['object'] == 'chat.completion.chunk')
63
+
64
+ ccc = msh.unmarshal(sj, pt.ChatCompletionChunk)
65
+
66
+ # FIXME: stop reason
67
+ if not ccc.choices:
68
+ return []
69
+
70
+ if any(choice.finish_reason for choice in ccc.choices):
71
+ check.state(all(choice.finish_reason for choice in ccc.choices))
72
+ return [None]
73
+
74
+ return [AiChoicesDeltas([
75
+ build_mc_ai_choice_deltas(choice.delta)
76
+ for choice in ccc.choices
77
+ ])]
78
+
79
+ READ_CHUNK_SIZE: ta.ClassVar[int] = -1
80
+
81
+ async def invoke(self, request: ChatChoicesStreamRequest) -> ChatChoicesStreamResponse:
82
+ tools: list[pt.ChatCompletionRequest.Tool] = []
83
+ with tv.TypedValues(*request.options).consume() as oc:
84
+ t: Tool
85
+ for t in oc.pop(Tool, []):
86
+ tools.append(build_cer_request_tool(t))
87
+
88
+ cer_request = pt.ChatCompletionRequest(
89
+ messages=build_cer_request_messages(request.v),
90
+ model=MODEL_NAMES.resolve(self._model_name.v),
91
+ tools=tools or None,
92
+ stream=True,
93
+ )
94
+
95
+ raw_request = msh.marshal(cer_request)
96
+
97
+ http_request = http.HttpRequest(
98
+ 'https://api.cerebras.ai/v1/chat/completions',
99
+ headers={
100
+ http.consts.HEADER_CONTENT_TYPE: http.consts.CONTENT_TYPE_JSON,
101
+ http.consts.HEADER_AUTH: http.consts.format_bearer_auth_header(check.not_none(self._api_key).reveal()),
102
+ **REQUIRED_HTTP_HEADERS,
103
+ },
104
+ data=json.dumps(raw_request).encode('utf-8'),
105
+ )
106
+
107
+ return await BytesHttpStreamResponseBuilder(
108
+ self._http_client,
109
+ lambda http_response: SimpleSseLinesHttpStreamResponseHandler(self._process_sse).as_lines().as_bytes(),
110
+ read_chunk_size=self.READ_CHUNK_SIZE,
111
+ ).new_stream_response(
112
+ http_request,
113
+ request.options,
114
+ )
@@ -1,4 +1,4 @@
1
- import ddgs
1
+ from omlish import lang
2
2
 
3
3
  from ....search import SearchHit
4
4
  from ....search import SearchHits
@@ -7,6 +7,10 @@ from ....search import SearchResponse
7
7
  from ....search import static_check_is_search_service
8
8
 
9
9
 
10
+ with lang.auto_proxy_import(globals()):
11
+ import ddgs
12
+
13
+
10
14
  ##
11
15
 
12
16
 
File without changes
@@ -0,0 +1,69 @@
1
+ # ruff: noqa: PERF402
2
+ import typing as ta
3
+
4
+ from omlish.text.lorem import LOREM
5
+
6
+ from ....chat.choices.services import ChatChoicesRequest
7
+ from ....chat.choices.services import ChatChoicesResponse
8
+ from ....chat.choices.services import static_check_is_chat_choices_service
9
+ from ....chat.choices.stream.services import ChatChoicesStreamRequest
10
+ from ....chat.choices.stream.services import ChatChoicesStreamResponse
11
+ from ....chat.choices.stream.services import static_check_is_chat_choices_stream_service
12
+ from ....chat.choices.stream.types import AiChoiceDeltas
13
+ from ....chat.choices.stream.types import AiChoicesDeltas
14
+ from ....chat.choices.types import AiChoice
15
+ from ....chat.choices.types import ChatChoicesOutputs
16
+ from ....chat.messages import AiMessage
17
+ from ....chat.stream.types import ContentAiDelta
18
+ from ....resources import UseResources
19
+ from ....stream.services import StreamResponseSink
20
+ from ....stream.services import new_stream_response
21
+
22
+
23
+ ##
24
+
25
+
26
+ # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
27
+ # name='dummy',
28
+ # type='ChatChoicesService',
29
+ # )
30
+ @static_check_is_chat_choices_service
31
+ class DummyChatChoicesService:
32
+ async def invoke(self, request: ChatChoicesRequest) -> ChatChoicesResponse:
33
+ return ChatChoicesResponse([AiChoice([AiMessage(LOREM)])])
34
+
35
+
36
+ ##
37
+
38
+
39
+ # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
40
+ # name='dummy',
41
+ # type='ChatChoicesStreamService',
42
+ # )
43
+ @static_check_is_chat_choices_stream_service
44
+ class DummyChatChoicesStreamService:
45
+ async def invoke(self, request: ChatChoicesStreamRequest) -> ChatChoicesStreamResponse:
46
+ async with UseResources.or_new(request.options) as rs:
47
+ async def inner(sink: StreamResponseSink[AiChoicesDeltas]) -> ta.Sequence[ChatChoicesOutputs]:
48
+ for s in LOREM:
49
+ await sink.emit(AiChoicesDeltas([
50
+ AiChoiceDeltas([
51
+ ContentAiDelta(s),
52
+ ]),
53
+ ]))
54
+
55
+ return []
56
+
57
+ return await new_stream_response(rs, inner)
58
+
59
+
60
+ ##
61
+
62
+
63
+ # @omlish-manifest $.minichain.backends.strings.manifests.BackendStringsManifest(
64
+ # [
65
+ # 'ChatChoicesService',
66
+ # 'ChatChoicesStreamService',
67
+ # ],
68
+ # 'dummy',
69
+ # )
@@ -16,16 +16,14 @@ from ....chat.choices.services import static_check_is_chat_choices_service
16
16
  from ....chat.choices.types import AiChoice
17
17
  from ....chat.messages import AiMessage
18
18
  from ....chat.messages import AnyAiMessage
19
- from ....chat.messages import Message
20
- from ....chat.messages import SystemMessage
21
19
  from ....chat.messages import ToolUseMessage
22
- from ....chat.messages import ToolUseResultMessage
23
- from ....chat.messages import UserMessage
24
20
  from ....chat.tools.types import Tool
25
21
  from ....models.configs import ModelName
26
22
  from ....standard import ApiKey
27
23
  from ....tools.types import ToolUse
28
24
  from .names import MODEL_NAMES
25
+ from .protocol import make_msg_content
26
+ from .protocol import pop_system_instructions
29
27
  from .tools import build_tool_spec_schema
30
28
 
31
29
 
@@ -40,97 +38,27 @@ from .tools import build_tool_spec_schema
40
38
  class GoogleChatChoicesService:
41
39
  DEFAULT_MODEL_NAME: ta.ClassVar[ModelName] = ModelName(check.not_none(MODEL_NAMES.default))
42
40
 
43
- def __init__(self, *configs: ApiKey | ModelName) -> None:
41
+ def __init__(
42
+ self,
43
+ *configs: ApiKey | ModelName,
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(self.DEFAULT_MODEL_NAME)
48
52
  self._api_key = ApiKey.pop_secret(cc, env='GEMINI_API_KEY')
49
53
 
50
- def _get_msg_content(self, m: Message) -> str | None:
51
- if isinstance(m, AiMessage):
52
- return check.isinstance(m.c, str)
53
-
54
- elif isinstance(m, (SystemMessage, UserMessage)):
55
- return check.isinstance(m.c, str)
56
-
57
- else:
58
- raise TypeError(m)
59
-
60
54
  BASE_URL: ta.ClassVar[str] = 'https://generativelanguage.googleapis.com/v1beta/models'
61
55
 
62
- ROLES_MAP: ta.ClassVar[ta.Mapping[type[Message], str]] = {
63
- UserMessage: 'user',
64
- AiMessage: 'model',
65
- ToolUseMessage: 'model',
66
- }
67
-
68
56
  async def invoke(
69
57
  self,
70
58
  request: ChatChoicesRequest,
71
59
  ) -> ChatChoicesResponse:
72
60
  key = check.not_none(self._api_key).reveal()
73
61
 
74
- g_sys_content: pt.Content | None = None
75
- g_contents: list[pt.Content] = []
76
- for i, m in enumerate(request.v):
77
- if isinstance(m, SystemMessage):
78
- check.arg(i == 0)
79
- check.none(g_sys_content)
80
- g_sys_content = pt.Content(
81
- parts=[pt.Part(
82
- text=check.not_none(self._get_msg_content(m)),
83
- )],
84
- )
85
-
86
- elif isinstance(m, ToolUseResultMessage):
87
- tr_resp_val: pt.Value
88
- if m.tur.c is None:
89
- tr_resp_val = pt.NullValue() # type: ignore[unreachable]
90
- elif isinstance(m.tur.c, str):
91
- tr_resp_val = pt.StringValue(m.tur.c)
92
- else:
93
- raise TypeError(m.tur.c)
94
- g_contents.append(pt.Content(
95
- parts=[pt.Part(
96
- function_response=pt.FunctionResponse(
97
- id=m.tur.id,
98
- name=m.tur.name,
99
- response={
100
- 'value': tr_resp_val,
101
- },
102
- ),
103
- )],
104
- ))
105
-
106
- elif isinstance(m, AiMessage):
107
- g_contents.append(pt.Content(
108
- parts=[pt.Part(
109
- text=check.not_none(self._get_msg_content(m)),
110
- )],
111
- role='model',
112
- ))
113
-
114
- elif isinstance(m, ToolUseMessage):
115
- g_contents.append(pt.Content(
116
- parts=[pt.Part(
117
- function_call=pt.FunctionCall(
118
- id=m.tu.id,
119
- name=m.tu.name,
120
- args=m.tu.args,
121
- ),
122
- )],
123
- role='model',
124
- ))
125
-
126
- else:
127
- g_contents.append(pt.Content(
128
- parts=[pt.Part(
129
- text=check.not_none(self._get_msg_content(m)),
130
- )],
131
- role=self.ROLES_MAP[type(m)], # type: ignore[arg-type]
132
- ))
133
-
134
62
  g_tools: list[pt.Tool] = []
135
63
  with tv.TypedValues(*request.options).consume() as oc:
136
64
  t: Tool
@@ -139,21 +67,29 @@ class GoogleChatChoicesService:
139
67
  function_declarations=[build_tool_spec_schema(t.spec)],
140
68
  ))
141
69
 
70
+ msgs = list(request.v)
71
+
72
+ system_inst = pop_system_instructions(msgs)
73
+
142
74
  g_req = pt.GenerateContentRequest(
143
- contents=g_contents or None,
75
+ contents=[
76
+ make_msg_content(m)
77
+ for m in msgs
78
+ ] or None,
144
79
  tools=g_tools or None,
145
- system_instruction=g_sys_content,
80
+ system_instruction=system_inst,
146
81
  )
147
82
 
148
83
  req_dct = msh.marshal(g_req)
149
84
 
150
85
  model_name = MODEL_NAMES.resolve(self._model_name.v)
151
86
 
152
- resp = http.request(
87
+ resp = await http.async_request(
153
88
  f'{self.BASE_URL.rstrip("/")}/{model_name}:generateContent?key={key}',
154
89
  headers={'Content-Type': 'application/json'},
155
90
  data=json.dumps_compact(req_dct).encode('utf-8'),
156
91
  method='POST',
92
+ client=self._http_client,
157
93
  )
158
94
 
159
95
  resp_dct = json.loads(check.not_none(resp.data).decode('utf-8'))
@@ -16,6 +16,12 @@ from ...strings.manifests import BackendStringsManifest
16
16
  MODEL_NAMES = ModelNameCollection(
17
17
  default='gemini',
18
18
  aliases={
19
+ 'gemini-3-pro-preview': None,
20
+ 'gemini-3-pro': 'gemini-3-pro-preview',
21
+
22
+ 'gemini-3-flash-preview': None,
23
+ 'gemini-3-flash': 'gemini-3-flash-preview',
24
+
19
25
  'gemini-2.5-pro': None,
20
26
  'gemini-2.5-flash': None,
21
27
  'gemini-2.5-flash-lite': None,
@@ -0,0 +1,105 @@
1
+ import typing as ta
2
+
3
+ from omlish import check
4
+
5
+ from .....backends.google.protocol import types as pt
6
+ from ....chat.messages import AiMessage
7
+ from ....chat.messages import Message
8
+ from ....chat.messages import SystemMessage
9
+ from ....chat.messages import ToolUseMessage
10
+ from ....chat.messages import ToolUseResultMessage
11
+ from ....chat.messages import UserMessage
12
+
13
+
14
+ ##
15
+
16
+
17
+ ROLES_MAP: ta.Mapping[type[Message], pt.ContentRole | None] = { # noqa
18
+ SystemMessage: None,
19
+ UserMessage: 'user',
20
+ AiMessage: 'model',
21
+ ToolUseMessage: 'model',
22
+ }
23
+
24
+
25
+ def make_str_content(
26
+ s: str | None,
27
+ *,
28
+ role: pt.ContentRole | None = None,
29
+ ) -> pt.Content | None:
30
+ if s is None:
31
+ return None
32
+
33
+ return pt.Content(
34
+ parts=[pt.Part(
35
+ text=check.not_none(s),
36
+ )],
37
+ role=role,
38
+ )
39
+
40
+
41
+ def make_msg_content(m: Message) -> pt.Content:
42
+ if isinstance(m, (AiMessage, SystemMessage, UserMessage)):
43
+ return check.not_none(make_str_content(
44
+ check.isinstance(m.c, str),
45
+ role=ROLES_MAP[type(m)],
46
+ ))
47
+
48
+ elif isinstance(m, ToolUseResultMessage):
49
+ tr_resp_val: pt.Value
50
+ if m.tur.c is None:
51
+ tr_resp_val = pt.NullValue() # type: ignore[unreachable]
52
+ elif isinstance(m.tur.c, str):
53
+ tr_resp_val = pt.StringValue(m.tur.c)
54
+ else:
55
+ raise TypeError(m.tur.c)
56
+
57
+ return pt.Content(
58
+ parts=[pt.Part(
59
+ function_response=pt.FunctionResponse(
60
+ id=m.tur.id,
61
+ name=m.tur.name,
62
+ response={
63
+ 'value': tr_resp_val,
64
+ },
65
+ ),
66
+ )],
67
+ )
68
+
69
+ elif isinstance(m, ToolUseMessage):
70
+ return pt.Content(
71
+ parts=[pt.Part(
72
+ function_call=pt.FunctionCall(
73
+ id=m.tu.id,
74
+ name=m.tu.name,
75
+ args=m.tu.args,
76
+ ),
77
+ )],
78
+ role='model',
79
+ )
80
+
81
+ else:
82
+ raise TypeError(m)
83
+
84
+
85
+ def pop_system_instructions(msgs: list[Message]) -> pt.Content | None:
86
+ if not msgs:
87
+ return None
88
+
89
+ m0 = msgs[0]
90
+ if not isinstance(m0 := msgs[0], SystemMessage):
91
+ return None
92
+
93
+ msgs.pop(0)
94
+ return make_msg_content(m0)
95
+
96
+
97
+ def get_msg_content(m: Message) -> str | None:
98
+ if isinstance(m, AiMessage):
99
+ return check.isinstance(m.c, str)
100
+
101
+ elif isinstance(m, (SystemMessage, UserMessage)):
102
+ return check.isinstance(m.c, str)
103
+
104
+ else:
105
+ raise TypeError(m)
@@ -24,7 +24,7 @@ from ....search import static_check_is_search_service
24
24
 
25
25
 
26
26
  @dc.dataclass(frozen=True)
27
- @msh.update_object_metadata(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
27
+ @msh.update_object_options(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
28
28
  class CseSearchResult(lang.Final):
29
29
  kind: str | None = None
30
30
 
@@ -49,7 +49,7 @@ class CseSearchResult(lang.Final):
49
49
 
50
50
 
51
51
  @dc.dataclass(frozen=True)
52
- @msh.update_object_metadata(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
52
+ @msh.update_object_options(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
53
53
  class CseSearchInfo(lang.Final):
54
54
  search_time: float | None = None
55
55
  total_results: int | None = None
@@ -58,10 +58,10 @@ class CseSearchInfo(lang.Final):
58
58
 
59
59
 
60
60
  @dc.dataclass(frozen=True)
61
- @msh.update_object_metadata(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
61
+ @msh.update_object_options(field_naming=msh.Naming.LOW_CAMEL, unknown_field='x')
62
62
  class CseSearchResponse(lang.Final):
63
63
  kind: str | None = None
64
- info: CseSearchInfo | None = dc.xfield(None) | msh.with_field_metadata(name='searchInformation')
64
+ info: CseSearchInfo | None = dc.xfield(None) | msh.with_field_options(name='searchInformation')
65
65
  items: ta.Sequence[CseSearchResult] | None = None
66
66
 
67
67
  x: ta.Mapping[str, ta.Any] | None = dc.field(default=None, repr=False)
@@ -82,12 +82,16 @@ class CseSearchService:
82
82
  self,
83
83
  cse_id: str | None = None,
84
84
  cse_api_key: str | None = None,
85
+ *,
86
+ http_client: http.AsyncHttpClient | None = None,
85
87
  ) -> None:
86
88
  super().__init__()
87
89
 
88
90
  self._cse_id = cse_id
89
91
  self._cse_api_key = cse_api_key
90
92
 
93
+ self._http_client = http_client
94
+
91
95
  async def invoke(
92
96
  self,
93
97
  request: SearchRequest,
@@ -97,8 +101,9 @@ class CseSearchService:
97
101
  cx=check.non_empty_str(self._cse_id),
98
102
  q=request.v,
99
103
  ))
100
- resp = http.request(
104
+ resp = await http.async_request(
101
105
  f'https://www.googleapis.com/customsearch/v1?{qs}',
106
+ client=self._http_client,
102
107
  )
103
108
  out = check.not_none(resp.data)
104
109