ommlds 0.0.0.dev465__tar.gz → 0.0.0.dev467__tar.gz

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 (383) hide show
  1. {ommlds-0.0.0.dev465/ommlds.egg-info → ommlds-0.0.0.dev467}/PKG-INFO +3 -3
  2. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/.omlish-manifests.json +22 -6
  3. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/google/protocol/types.py +4 -1
  4. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/backends/catalog.py +1 -1
  5. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/ai/services.py +5 -7
  6. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/__init__.py +6 -0
  7. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/anthropic/stream.py +17 -0
  8. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/google/stream.py +105 -20
  9. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/mlx/chat.py +95 -21
  10. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/openai/chat.py +2 -2
  11. ommlds-0.0.0.dev465/ommlds/minichain/backends/impls/openai/format2.py → ommlds-0.0.0.dev467/ommlds/minichain/backends/impls/openai/format.py +22 -0
  12. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/openai/stream.py +14 -13
  13. ommlds-0.0.0.dev467/ommlds/minichain/chat/stream/adapters.py +35 -0
  14. ommlds-0.0.0.dev467/ommlds/minichain/chat/stream/joining.py +96 -0
  15. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/stream/types.py +20 -4
  16. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467/ommlds.egg-info}/PKG-INFO +3 -3
  17. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds.egg-info/SOURCES.txt +1 -1
  18. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds.egg-info/requires.txt +2 -2
  19. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/pyproject.toml +3 -3
  20. ommlds-0.0.0.dev465/ommlds/minichain/backends/impls/openai/format.py +0 -228
  21. ommlds-0.0.0.dev465/ommlds/minichain/chat/stream/adapters.py +0 -80
  22. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/LICENSE +0 -0
  23. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/MANIFEST.in +0 -0
  24. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/README.md +0 -0
  25. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/__about__.py +0 -0
  26. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/__init__.py +0 -0
  27. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/_hacks/__init__.py +0 -0
  28. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/_hacks/patches.py +0 -0
  29. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/__init__.py +0 -0
  30. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/__init__.py +0 -0
  31. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/protocol/__init__.py +0 -0
  32. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/protocol/_marshal.py +0 -0
  33. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/protocol/sse/__init__.py +0 -0
  34. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/protocol/sse/_marshal.py +0 -0
  35. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/protocol/sse/assemble.py +0 -0
  36. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/protocol/sse/events.py +0 -0
  37. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/anthropic/protocol/types.py +0 -0
  38. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/google/__init__.py +0 -0
  39. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/google/protocol/__init__.py +0 -0
  40. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/google/protocol/_marshal.py +0 -0
  41. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/llamacpp/__init__.py +0 -0
  42. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/llamacpp/buildwheel.py +0 -0
  43. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/llamacpp/logging.py +0 -0
  44. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/__init__.py +0 -0
  45. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/__main__.py +0 -0
  46. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/caching.py +0 -0
  47. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/cli.py +0 -0
  48. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/generation.py +0 -0
  49. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/limits.py +0 -0
  50. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/loading.py +0 -0
  51. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/LICENSE +0 -0
  52. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/__init__.py +0 -0
  53. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/detokenization/__init__.py +0 -0
  54. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/detokenization/base.py +0 -0
  55. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/detokenization/bpe.py +0 -0
  56. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/detokenization/naive.py +0 -0
  57. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/detokenization/spm.py +0 -0
  58. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/loading.py +0 -0
  59. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/tokenization.py +0 -0
  60. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/mlx/tokenization/types.py +0 -0
  61. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/__init__.py +0 -0
  62. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/__init__.py +0 -0
  63. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/_common.py +0 -0
  64. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/_marshal.py +0 -0
  65. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/__init__.py +0 -0
  66. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/chunk.py +0 -0
  67. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/contentpart.py +0 -0
  68. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/message.py +0 -0
  69. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/request.py +0 -0
  70. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/response.py +0 -0
  71. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/responseformat.py +0 -0
  72. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/chatcompletion/tokenlogprob.py +0 -0
  73. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/openai/protocol/completionusage.py +0 -0
  74. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/__init__.py +0 -0
  75. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/LICENSE +0 -0
  76. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/__init__.py +0 -0
  77. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/__init__.py +0 -0
  78. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/__main__.py +0 -0
  79. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/attention.py +0 -0
  80. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/cli.py +0 -0
  81. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/fetch.py +0 -0
  82. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/llm.py +0 -0
  83. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/loading.py +0 -0
  84. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/quantization.py +0 -0
  85. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/sampling.py +0 -0
  86. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/tokenization.py +0 -0
  87. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/llama3/transformer.py +0 -0
  88. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/sdxl/__init__.py +0 -0
  89. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/sdxl/__main__.py +0 -0
  90. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/sdxl/cli.py +0 -0
  91. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/sdxl/clip.py +0 -0
  92. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/sdxl/sdxl.py +0 -0
  93. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/models/sdxl/unet.py +0 -0
  94. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/tinygrad/tinygrad.py +0 -0
  95. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/torch/__init__.py +0 -0
  96. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/torch/backends.py +0 -0
  97. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/torch/devices.py +0 -0
  98. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/backends/torch/purge.py +0 -0
  99. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/__init__.py +0 -0
  100. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/__main__.py +0 -0
  101. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/backends/__init__.py +0 -0
  102. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/backends/inject.py +0 -0
  103. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/backends/standard.py +0 -0
  104. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/inject.py +0 -0
  105. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/main.py +0 -0
  106. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/__init__.py +0 -0
  107. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/base.py +0 -0
  108. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/__init__.py +0 -0
  109. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/backends/__init__.py +0 -0
  110. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/backends/inject.py +0 -0
  111. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/backends/injection.py +0 -0
  112. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/backends/types.py +0 -0
  113. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/__init__.py +0 -0
  114. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/ai/__init__.py +0 -0
  115. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/ai/inject.py +0 -0
  116. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/ai/injection.py +0 -0
  117. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/ai/rendering.py +0 -0
  118. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/ai/tools.py +0 -0
  119. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/ai/types.py +0 -0
  120. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/state/__init__.py +0 -0
  121. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/state/inject.py +0 -0
  122. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/state/inmemory.py +0 -0
  123. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/state/storage.py +0 -0
  124. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/state/types.py +0 -0
  125. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/user/__init__.py +0 -0
  126. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/user/inject.py +0 -0
  127. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/user/interactive.py +0 -0
  128. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/user/oneshot.py +0 -0
  129. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/chat/user/types.py +0 -0
  130. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/configs.py +0 -0
  131. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/content/__init__.py +0 -0
  132. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/content/messages.py +0 -0
  133. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/content/strings.py +0 -0
  134. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/driver.py +0 -0
  135. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/inject.py +0 -0
  136. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/phases/__init__.py +0 -0
  137. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/phases/inject.py +0 -0
  138. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/phases/injection.py +0 -0
  139. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/phases/manager.py +0 -0
  140. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/phases/types.py +0 -0
  141. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/rendering/__init__.py +0 -0
  142. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/rendering/inject.py +0 -0
  143. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/rendering/markdown.py +0 -0
  144. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/rendering/raw.py +0 -0
  145. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/rendering/types.py +0 -0
  146. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/session.py +0 -0
  147. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/tools/__init__.py +0 -0
  148. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/tools/confirmation.py +0 -0
  149. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/tools/execution.py +0 -0
  150. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/tools/inject.py +0 -0
  151. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/tools/injection.py +0 -0
  152. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/tools/rendering.py +0 -0
  153. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/chat/tools/weather.py +0 -0
  154. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/completion/__init__.py +0 -0
  155. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/completion/configs.py +0 -0
  156. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/completion/inject.py +0 -0
  157. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/completion/session.py +0 -0
  158. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/embedding/__init__.py +0 -0
  159. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/embedding/configs.py +0 -0
  160. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/embedding/inject.py +0 -0
  161. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/embedding/session.py +0 -0
  162. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/sessions/inject.py +0 -0
  163. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/state/__init__.py +0 -0
  164. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/state/inject.py +0 -0
  165. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/cli/state/storage.py +0 -0
  166. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/datasets/__init__.py +0 -0
  167. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/datasets/lib/__init__.py +0 -0
  168. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/datasets/lib/movies.py +0 -0
  169. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/huggingface.py +0 -0
  170. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/_marshal.py +0 -0
  171. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/_typedvalues.py +0 -0
  172. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/__init__.py +0 -0
  173. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/catalogs/__init__.py +0 -0
  174. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/catalogs/base.py +0 -0
  175. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/catalogs/simple.py +0 -0
  176. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/catalogs/strings.py +0 -0
  177. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/__init__.py +0 -0
  178. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/anthropic/__init__.py +0 -0
  179. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/anthropic/chat.py +0 -0
  180. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/anthropic/names.py +0 -0
  181. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/anthropic/protocol.py +0 -0
  182. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/duckduckgo/__init__.py +0 -0
  183. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/duckduckgo/search.py +0 -0
  184. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/google/__init__.py +0 -0
  185. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/google/chat.py +0 -0
  186. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/google/names.py +0 -0
  187. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/google/search.py +0 -0
  188. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/google/tools.py +0 -0
  189. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/huggingface/__init__.py +0 -0
  190. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/huggingface/configs.py +0 -0
  191. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/huggingface/repos.py +0 -0
  192. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/llamacpp/__init__.py +0 -0
  193. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/llamacpp/chat.py +0 -0
  194. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/llamacpp/completion.py +0 -0
  195. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/llamacpp/format.py +0 -0
  196. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/llamacpp/stream.py +0 -0
  197. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/mistral.py +0 -0
  198. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/mlx/__init__.py +0 -0
  199. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/openai/__init__.py +0 -0
  200. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/openai/completion.py +0 -0
  201. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/openai/embedding.py +0 -0
  202. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/openai/names.py +0 -0
  203. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/sentencepiece/__init__.py +0 -0
  204. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/sentencepiece/tokens.py +0 -0
  205. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/sqlite.py +0 -0
  206. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/tinygrad/__init__.py +0 -0
  207. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/tinygrad/chat.py +0 -0
  208. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/tokenizers/__init__.py +0 -0
  209. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/tokenizers/tokens.py +0 -0
  210. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/transformers/__init__.py +0 -0
  211. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/transformers/sentence.py +0 -0
  212. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/transformers/tokens.py +0 -0
  213. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/impls/transformers/transformers.py +0 -0
  214. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/strings/__init__.py +0 -0
  215. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/strings/manifests.py +0 -0
  216. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/strings/parsing.py +0 -0
  217. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/backends/strings/resolving.py +0 -0
  218. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/__init__.py +0 -0
  219. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/_marshal.py +0 -0
  220. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/choices/__init__.py +0 -0
  221. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/choices/adapters.py +0 -0
  222. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/choices/services.py +0 -0
  223. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/choices/types.py +0 -0
  224. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/formats.py +0 -0
  225. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/history.py +0 -0
  226. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/messages.py +0 -0
  227. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/metadata.py +0 -0
  228. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/services.py +0 -0
  229. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/stream/__init__.py +0 -0
  230. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/stream/_marshal.py +0 -0
  231. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/stream/services.py +0 -0
  232. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/templating.py +0 -0
  233. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/tools/__init__.py +0 -0
  234. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/tools/execution.py +0 -0
  235. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/tools/ids.py +0 -0
  236. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/tools/parsing.py +0 -0
  237. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/tools/types.py +0 -0
  238. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/transforms/__init__.py +0 -0
  239. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/transforms/base.py +0 -0
  240. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/transforms/metadata.py +0 -0
  241. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/transforms/services.py +0 -0
  242. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/chat/types.py +0 -0
  243. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/completion.py +0 -0
  244. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/configs.py +0 -0
  245. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/__init__.py +0 -0
  246. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/_marshal.py +0 -0
  247. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/images.py +0 -0
  248. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/json.py +0 -0
  249. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/materialize.py +0 -0
  250. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/metadata.py +0 -0
  251. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/namespaces.py +0 -0
  252. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/placeholders.py +0 -0
  253. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/prepare.py +0 -0
  254. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/sequence.py +0 -0
  255. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/simple.py +0 -0
  256. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/text.py +0 -0
  257. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/transforms/__init__.py +0 -0
  258. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/transforms/base.py +0 -0
  259. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/transforms/interleave.py +0 -0
  260. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/transforms/squeeze.py +0 -0
  261. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/transforms/stringify.py +0 -0
  262. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/transforms/strings.py +0 -0
  263. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/content/types.py +0 -0
  264. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/docs/__init__.py +0 -0
  265. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/docs/docs.py +0 -0
  266. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/docs/dtypes.py +0 -0
  267. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/docs/filters.py +0 -0
  268. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/envs.py +0 -0
  269. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/json.py +0 -0
  270. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/__init__.py +0 -0
  271. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/bash.py +0 -0
  272. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/code/__init__.py +0 -0
  273. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/code/prompts.py +0 -0
  274. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/__init__.py +0 -0
  275. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/binfiles.py +0 -0
  276. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/context.py +0 -0
  277. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/errors.py +0 -0
  278. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/suggestions.py +0 -0
  279. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/__init__.py +0 -0
  280. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/edit.py +0 -0
  281. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/ls.py +0 -0
  282. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/read.py +0 -0
  283. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/recursivels/__init__.py +0 -0
  284. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/recursivels/execution.py +0 -0
  285. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/recursivels/rendering.py +0 -0
  286. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/fs/tools/recursivels/running.py +0 -0
  287. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/todo/__init__.py +0 -0
  288. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/todo/context.py +0 -0
  289. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/todo/tools/__init__.py +0 -0
  290. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/todo/tools/read.py +0 -0
  291. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/todo/tools/write.py +0 -0
  292. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/lib/todo/types.py +0 -0
  293. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/llms/__init__.py +0 -0
  294. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/llms/_marshal.py +0 -0
  295. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/llms/tokens.py +0 -0
  296. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/llms/types.py +0 -0
  297. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/metadata.py +0 -0
  298. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/models/__init__.py +0 -0
  299. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/models/configs.py +0 -0
  300. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/models/names.py +0 -0
  301. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/models/repos/__init__.py +0 -0
  302. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/models/repos/resolving.py +0 -0
  303. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/registries/__init__.py +0 -0
  304. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/registries/globals.py +0 -0
  305. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/registries/manifests.py +0 -0
  306. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/registries/registry.py +0 -0
  307. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/resources.py +0 -0
  308. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/search.py +0 -0
  309. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/__init__.py +0 -0
  310. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/_marshal.py +0 -0
  311. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/_origclasses.py +0 -0
  312. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/_typedvalues.py +0 -0
  313. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/facades.py +0 -0
  314. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/requests.py +0 -0
  315. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/responses.py +0 -0
  316. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/services/services.py +0 -0
  317. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/standard.py +0 -0
  318. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/stream/__init__.py +0 -0
  319. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/stream/services.py +0 -0
  320. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/stream/wrap.py +0 -0
  321. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/__init__.py +0 -0
  322. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/applypatch.py +0 -0
  323. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/__init__.py +0 -0
  324. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/base.py +0 -0
  325. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/dumb.py +0 -0
  326. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/llamacpp/LICENSE +0 -0
  327. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/llamacpp/__init__.py +0 -0
  328. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/llamacpp/hermes2.py +0 -0
  329. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/llamacpp/llama31.py +0 -0
  330. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/llamacpp/types.py +0 -0
  331. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/text/toolparsing/llamacpp/utils.py +0 -0
  332. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tokens/__init__.py +0 -0
  333. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tokens/specials.py +0 -0
  334. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tokens/tokenizers.py +0 -0
  335. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tokens/types.py +0 -0
  336. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tokens/vocabs.py +0 -0
  337. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/__init__.py +0 -0
  338. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/_marshal.py +0 -0
  339. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/execution/__init__.py +0 -0
  340. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/execution/catalog.py +0 -0
  341. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/execution/context.py +0 -0
  342. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/execution/errors.py +0 -0
  343. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/execution/executors.py +0 -0
  344. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/execution/reflect.py +0 -0
  345. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/fns.py +0 -0
  346. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/jsonschema.py +0 -0
  347. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/reflect.py +0 -0
  348. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/tools/types.py +0 -0
  349. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/types.py +0 -0
  350. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/utils.py +0 -0
  351. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/__init__.py +0 -0
  352. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/_marshal.py +0 -0
  353. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/embeddings.py +0 -0
  354. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/index.py +0 -0
  355. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/search.py +0 -0
  356. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/similarity.py +0 -0
  357. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/stores.py +0 -0
  358. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/minichain/vectors/types.py +0 -0
  359. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/server/__init__.py +0 -0
  360. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/server/__main__.py +0 -0
  361. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/server/cli.py +0 -0
  362. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/server/client.py +0 -0
  363. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/server/server.py +0 -0
  364. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/server/service.py +0 -0
  365. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/tools/__init__.py +0 -0
  366. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/tools/git.py +0 -0
  367. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/tools/ocr.py +0 -0
  368. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/__init__.py +0 -0
  369. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/analyze.py +0 -0
  370. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/convert.py +0 -0
  371. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/models.py +0 -0
  372. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/text/__init__.py +0 -0
  373. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/text/mfh.py +0 -0
  374. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/text/wtp.py +0 -0
  375. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/utils/__init__.py +0 -0
  376. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/utils/io.py +0 -0
  377. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/utils/progress.py +0 -0
  378. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/utils/xml.py +0 -0
  379. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds/wiki/xml.py +0 -0
  380. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds.egg-info/dependency_links.txt +0 -0
  381. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds.egg-info/entry_points.txt +0 -0
  382. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/ommlds.egg-info/top_level.txt +0 -0
  383. {ommlds-0.0.0.dev465 → ommlds-0.0.0.dev467}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ommlds
3
- Version: 0.0.0.dev465
3
+ Version: 0.0.0.dev467
4
4
  Summary: ommlds
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,8 +14,8 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omdev==0.0.0.dev465
18
- Requires-Dist: omlish==0.0.0.dev465
17
+ Requires-Dist: omdev==0.0.0.dev467
18
+ Requires-Dist: omlish==0.0.0.dev467
19
19
  Provides-Extra: all
20
20
  Requires-Dist: llama-cpp-python~=0.3; extra == "all"
21
21
  Requires-Dist: mlx~=0.29; extra == "all"
@@ -63,7 +63,7 @@
63
63
  "module": ".minichain.backends.impls.anthropic.stream",
64
64
  "attr": null,
65
65
  "file": "ommlds/minichain/backends/impls/anthropic/stream.py",
66
- "line": 35,
66
+ "line": 36,
67
67
  "value": {
68
68
  "!.minichain.registries.manifests.RegistryManifest": {
69
69
  "module": "ommlds.minichain.backends.impls.anthropic.stream",
@@ -137,7 +137,7 @@
137
137
  "module": ".minichain.backends.impls.google.stream",
138
138
  "attr": null,
139
139
  "file": "ommlds/minichain/backends/impls/google/stream.py",
140
- "line": 36,
140
+ "line": 41,
141
141
  "value": {
142
142
  "!.minichain.registries.manifests.RegistryManifest": {
143
143
  "module": "ommlds.minichain.backends.impls.google.stream",
@@ -229,11 +229,12 @@
229
229
  "module": ".minichain.backends.impls.mlx.chat",
230
230
  "attr": null,
231
231
  "file": "ommlds/minichain/backends/impls/mlx/chat.py",
232
- "line": 28,
232
+ "line": 39,
233
233
  "value": {
234
234
  "!.minichain.backends.strings.manifests.BackendStringsManifest": {
235
235
  "service_cls_names": [
236
- "ChatChoicesService"
236
+ "ChatChoicesService",
237
+ "ChatChoicesStreamService"
237
238
  ],
238
239
  "backend_name": "mlx",
239
240
  "model_names": null
@@ -244,7 +245,7 @@
244
245
  "module": ".minichain.backends.impls.mlx.chat",
245
246
  "attr": null,
246
247
  "file": "ommlds/minichain/backends/impls/mlx/chat.py",
247
- "line": 37,
248
+ "line": 133,
248
249
  "value": {
249
250
  "!.minichain.registries.manifests.RegistryManifest": {
250
251
  "module": "ommlds.minichain.backends.impls.mlx.chat",
@@ -255,6 +256,21 @@
255
256
  }
256
257
  }
257
258
  },
259
+ {
260
+ "module": ".minichain.backends.impls.mlx.chat",
261
+ "attr": null,
262
+ "file": "ommlds/minichain/backends/impls/mlx/chat.py",
263
+ "line": 164,
264
+ "value": {
265
+ "!.minichain.registries.manifests.RegistryManifest": {
266
+ "module": "ommlds.minichain.backends.impls.mlx.chat",
267
+ "attr": "MlxChatChoicesStreamService",
268
+ "name": "mlx",
269
+ "aliases": null,
270
+ "type": "ChatChoicesStreamService"
271
+ }
272
+ }
273
+ },
258
274
  {
259
275
  "module": ".minichain.backends.impls.openai.chat",
260
276
  "attr": null,
@@ -356,7 +372,7 @@
356
372
  "module": ".minichain.backends.impls.openai.stream",
357
373
  "attr": null,
358
374
  "file": "ommlds/minichain/backends/impls/openai/stream.py",
359
- "line": 37,
375
+ "line": 38,
360
376
  "value": {
361
377
  "!.minichain.registries.manifests.RegistryManifest": {
362
378
  "module": "ommlds.minichain.backends.impls.openai.stream",
@@ -148,11 +148,14 @@ class Part(lang.Final):
148
148
  video_metadata: VideoMetadata | None = None
149
149
 
150
150
 
151
+ ContentRole: ta.TypeAlias = ta.Literal['user', 'model']
152
+
153
+
151
154
  @dc.dataclass(frozen=True, kw_only=True)
152
155
  @_set_class_marshal_options
153
156
  class Content(lang.Final):
154
157
  parts: ta.Sequence[Part] | None = None
155
- role: ta.Literal['user', 'model'] | None = None
158
+ role: ContentRole | None = None
156
159
 
157
160
 
158
161
  ##
@@ -32,7 +32,7 @@ class _CatalogBackendProvider(BackendProvider[ServiceT], lang.Abstract):
32
32
  @contextlib.asynccontextmanager
33
33
  async def _provide_backend(self, cls: type[ServiceT]) -> ta.AsyncIterator[ServiceT]:
34
34
  service: ServiceT
35
- async with lang.async_maybe_managing(self._catalog.get_backend(
35
+ async with lang.async_or_sync_maybe_managing(self._catalog.get_backend(
36
36
  cls,
37
37
  self._name,
38
38
  *(self._configs or []),
@@ -63,19 +63,17 @@ class ChatChoicesStreamServiceStreamAiChatGenerator(StreamAiChatGenerator):
63
63
  ) -> mc.AiChat:
64
64
  opts = self._options() if self._options is not None else []
65
65
 
66
- lst: list[str] = []
67
-
68
66
  async with self._service_provider.provide_backend() as service:
67
+ joiner = mc.AiChoiceDeltaJoiner()
68
+
69
69
  async with (await service.invoke(mc.ChatChoicesStreamRequest(chat, opts))).v as st_resp:
70
70
  async for o in st_resp:
71
+ joiner.add(o.choices)
72
+
71
73
  choice = check.single(o.choices)
72
74
 
73
75
  for delta in choice.deltas:
74
76
  if delta_callback is not None:
75
77
  await delta_callback(delta)
76
78
 
77
- c = check.isinstance(delta, mc.ContentAiChoiceDelta).c # noqa
78
- if c is not None:
79
- lst.append(check.isinstance(c, str))
80
-
81
- return [mc.AiMessage(''.join(lst))]
79
+ return check.single(joiner.build())
@@ -92,6 +92,10 @@ with _lang.auto_proxy_init(
92
92
  ChatChoicesStreamServiceChatChoicesService,
93
93
  )
94
94
 
95
+ from .chat.stream.joining import ( # noqa
96
+ AiChoiceDeltaJoiner,
97
+ )
98
+
95
99
  from .chat.stream.services import ( # noqa
96
100
  ChatChoicesStreamRequest,
97
101
  ChatChoicesStreamResponse,
@@ -109,7 +113,9 @@ with _lang.auto_proxy_init(
109
113
 
110
114
  AiChoiceDelta,
111
115
  ContentAiChoiceDelta,
116
+ AnyToolUseAiChoiceDelta,
112
117
  ToolUseAiChoiceDelta,
118
+ PartialToolUseAiChoiceDelta,
113
119
 
114
120
  AiChoiceDeltas,
115
121
  AiChoicesDeltas,
@@ -17,6 +17,7 @@ from ....chat.stream.services import static_check_is_chat_choices_stream_service
17
17
  from ....chat.stream.types import AiChoiceDeltas
18
18
  from ....chat.stream.types import AiChoicesDeltas
19
19
  from ....chat.stream.types import ContentAiChoiceDelta
20
+ from ....chat.stream.types import PartialToolUseAiChoiceDelta
20
21
  from ....chat.tools.types import Tool
21
22
  from ....configs import Config
22
23
  from ....resources import UseResources
@@ -123,19 +124,35 @@ class AnthropicChatChoicesStreamService:
123
124
  check.not_none(msg_start)
124
125
  check.none(cbk_start)
125
126
  cbk_start = ae
127
+
126
128
  if isinstance(ae.content_block, AnthropicSseDecoderEvents.ContentBlockStart.Text): # noqa
127
129
  await sink.emit(AiChoicesDeltas([AiChoiceDeltas([ContentAiChoiceDelta(
128
130
  ae.content_block.text,
129
131
  )])]))
132
+
133
+ elif isinstance(ae.content_block, AnthropicSseDecoderEvents.ContentBlockStart.ToolUse): # noqa
134
+ await sink.emit(AiChoicesDeltas([AiChoiceDeltas([PartialToolUseAiChoiceDelta( # noqa
135
+ id=ae.content_block.id,
136
+ name=ae.content_block.name,
137
+ raw_args=ae.content_block.input,
138
+ )])]))
139
+
130
140
  else:
131
141
  raise TypeError(ae.content_block)
132
142
 
133
143
  case AnthropicSseDecoderEvents.ContentBlockDelta():
134
144
  check.not_none(cbk_start)
145
+
135
146
  if isinstance(ae.delta, AnthropicSseDecoderEvents.ContentBlockDelta.TextDelta):
136
147
  await sink.emit(AiChoicesDeltas([AiChoiceDeltas([ContentAiChoiceDelta(
137
148
  ae.delta.text,
138
149
  )])]))
150
+
151
+ elif isinstance(ae.delta, AnthropicSseDecoderEvents.ContentBlockDelta.InputJsonDelta): # noqa
152
+ await sink.emit(AiChoicesDeltas([AiChoiceDeltas([PartialToolUseAiChoiceDelta( # noqa
153
+ raw_args=ae.delta.partial_json,
154
+ )])]))
155
+
139
156
  else:
140
157
  raise TypeError(ae.delta)
141
158
 
@@ -15,6 +15,8 @@ from ....chat.choices.types import ChatChoicesOutputs
15
15
  from ....chat.messages import AiMessage
16
16
  from ....chat.messages import Message
17
17
  from ....chat.messages import SystemMessage
18
+ from ....chat.messages import ToolUseMessage
19
+ from ....chat.messages import ToolUseResultMessage
18
20
  from ....chat.messages import UserMessage
19
21
  from ....chat.stream.services import ChatChoicesStreamRequest
20
22
  from ....chat.stream.services import ChatChoicesStreamResponse
@@ -22,12 +24,15 @@ from ....chat.stream.services import static_check_is_chat_choices_stream_service
22
24
  from ....chat.stream.types import AiChoiceDeltas
23
25
  from ....chat.stream.types import AiChoicesDeltas
24
26
  from ....chat.stream.types import ContentAiChoiceDelta
27
+ from ....chat.stream.types import ToolUseAiChoiceDelta
28
+ from ....chat.tools.types import Tool
25
29
  from ....models.configs import ModelName
26
30
  from ....resources import UseResources
27
31
  from ....standard import ApiKey
28
32
  from ....stream.services import StreamResponseSink
29
33
  from ....stream.services import new_stream_response
30
34
  from .names import MODEL_NAMES
35
+ from .tools import build_tool_spec_schema
31
36
 
32
37
 
33
38
  ##
@@ -48,22 +53,70 @@ class GoogleChatChoicesStreamService:
48
53
  self._model_name = cc.pop(self.DEFAULT_MODEL_NAME)
49
54
  self._api_key = ApiKey.pop_secret(cc, env='GEMINI_API_KEY')
50
55
 
51
- def _get_msg_content(self, m: Message) -> str | None:
52
- if isinstance(m, AiMessage):
53
- return check.isinstance(m.c, str)
56
+ def _make_str_content(
57
+ self,
58
+ s: str | None,
59
+ *,
60
+ role: pt.ContentRole | None = None,
61
+ ) -> pt.Content | None:
62
+ if s is None:
63
+ return None
64
+
65
+ return pt.Content(
66
+ parts=[pt.Part(
67
+ text=check.not_none(s),
68
+ )],
69
+ role=role,
70
+ )
54
71
 
55
- elif isinstance(m, (SystemMessage, UserMessage)):
56
- return check.isinstance(m.c, str)
72
+ def _make_msg_content(self, m: Message) -> pt.Content:
73
+ if isinstance(m, (AiMessage, SystemMessage, UserMessage)):
74
+ return check.not_none(self._make_str_content(
75
+ check.isinstance(m.c, str),
76
+ role=self.ROLES_MAP[type(m)],
77
+ ))
78
+
79
+ elif isinstance(m, ToolUseResultMessage):
80
+ tr_resp_val: pt.Value
81
+ if m.tur.c is None:
82
+ tr_resp_val = pt.NullValue() # type: ignore[unreachable]
83
+ elif isinstance(m.tur.c, str):
84
+ tr_resp_val = pt.StringValue(m.tur.c)
85
+ else:
86
+ raise TypeError(m.tur.c)
87
+ return pt.Content(
88
+ parts=[pt.Part(
89
+ function_response=pt.FunctionResponse(
90
+ id=m.tur.id,
91
+ name=m.tur.name,
92
+ response={
93
+ 'value': tr_resp_val,
94
+ },
95
+ ),
96
+ )],
97
+ )
98
+
99
+ elif isinstance(m, ToolUseMessage):
100
+ return pt.Content(
101
+ parts=[pt.Part(
102
+ function_call=pt.FunctionCall(
103
+ id=m.tu.id,
104
+ name=m.tu.name,
105
+ args=m.tu.args,
106
+ ),
107
+ )],
108
+ role='model',
109
+ )
57
110
 
58
111
  else:
59
112
  raise TypeError(m)
60
113
 
61
114
  BASE_URL: ta.ClassVar[str] = 'https://generativelanguage.googleapis.com/v1beta/models'
62
115
 
63
- ROLES_MAP: ta.ClassVar[ta.Mapping[type[Message], str]] = {
64
- SystemMessage: 'system',
116
+ ROLES_MAP: ta.ClassVar[ta.Mapping[type[Message], pt.ContentRole | None]] = { # noqa
117
+ SystemMessage: None,
65
118
  UserMessage: 'user',
66
- AiMessage: 'assistant',
119
+ AiMessage: 'model',
67
120
  }
68
121
 
69
122
  READ_CHUNK_SIZE = 64 * 1024
@@ -74,16 +127,28 @@ class GoogleChatChoicesStreamService:
74
127
  ) -> ChatChoicesStreamResponse:
75
128
  key = check.not_none(self._api_key).reveal()
76
129
 
130
+ msgs = list(request.v)
131
+
132
+ system_inst: pt.Content | None = None
133
+ if msgs and isinstance(m0 := msgs[0], SystemMessage):
134
+ system_inst = self._make_msg_content(m0)
135
+ msgs.pop(0)
136
+
137
+ g_tools: list[pt.Tool] = []
138
+ with tv.TypedValues(*request.options).consume() as oc:
139
+ t: Tool
140
+ for t in oc.pop(Tool, []):
141
+ g_tools.append(pt.Tool(
142
+ function_declarations=[build_tool_spec_schema(t.spec)],
143
+ ))
144
+
77
145
  g_req = pt.GenerateContentRequest(
78
146
  contents=[
79
- pt.Content(
80
- parts=[pt.Part(
81
- text=check.not_none(self._get_msg_content(m)),
82
- )],
83
- role=self.ROLES_MAP[type(m)], # type: ignore[arg-type]
84
- )
85
- for m in request.v
147
+ self._make_msg_content(m)
148
+ for m in msgs
86
149
  ],
150
+ tools=g_tools or None,
151
+ system_instruction=system_inst,
87
152
  )
88
153
 
89
154
  req_dct = msh.marshal(g_req)
@@ -110,18 +175,38 @@ class GoogleChatChoicesStreamService:
110
175
  if isinstance(bl, DelimitingBuffer.Incomplete):
111
176
  # FIXME: handle
112
177
  return []
178
+
113
179
  l = bl.decode('utf-8')
114
180
  if not l:
115
181
  continue
182
+
116
183
  if l.startswith('data: '):
117
184
  gcr = msh.unmarshal(json.loads(l[6:]), pt.GenerateContentResponse) # noqa
118
185
  cnd = check.single(check.not_none(gcr.candidates))
186
+
119
187
  for p in check.not_none(cnd.content).parts or []:
120
- await sink.emit(AiChoicesDeltas([
121
- AiChoiceDeltas([
122
- ContentAiChoiceDelta(check.not_none(p.text)),
123
- ]),
124
- ]))
188
+ if (txt := p.text) is not None:
189
+ check.none(p.function_call)
190
+ await sink.emit(AiChoicesDeltas([
191
+ AiChoiceDeltas([
192
+ ContentAiChoiceDelta(check.not_none(txt)),
193
+ ]),
194
+ ]))
195
+
196
+ elif (fc := p.function_call) is not None:
197
+ check.none(p.text)
198
+ await sink.emit(AiChoicesDeltas([
199
+ AiChoiceDeltas([
200
+ ToolUseAiChoiceDelta(
201
+ id=fc.id,
202
+ name=fc.name,
203
+ args=fc.args,
204
+ ),
205
+ ]),
206
+ ]))
207
+
208
+ else:
209
+ raise ValueError(p)
125
210
 
126
211
  if not b:
127
212
  return []
@@ -1,3 +1,4 @@
1
+ import contextlib
1
2
  import typing as ta
2
3
 
3
4
  from omlish import check
@@ -5,6 +6,7 @@ from omlish import lang
5
6
  from omlish import typedvalues as tv
6
7
 
7
8
  from .....backends import mlx as mlxu
9
+ from ....chat.choices.services import ChatChoicesOutputs
8
10
  from ....chat.choices.services import ChatChoicesRequest
9
11
  from ....chat.choices.services import ChatChoicesResponse
10
12
  from ....chat.choices.services import static_check_is_chat_choices_service
@@ -14,19 +16,28 @@ from ....chat.messages import AiMessage
14
16
  from ....chat.messages import Message
15
17
  from ....chat.messages import SystemMessage
16
18
  from ....chat.messages import UserMessage
19
+ from ....chat.stream.services import ChatChoicesStreamRequest
20
+ from ....chat.stream.services import ChatChoicesStreamResponse
21
+ from ....chat.stream.services import static_check_is_chat_choices_stream_service
22
+ from ....chat.stream.types import AiChoiceDeltas
23
+ from ....chat.stream.types import AiChoicesDeltas
24
+ from ....chat.stream.types import ContentAiChoiceDelta
17
25
  from ....configs import Config
18
26
  from ....llms.types import MaxTokens
19
27
  from ....models.configs import ModelPath
20
28
  from ....models.configs import ModelRepo
21
29
  from ....models.configs import ModelSpecifier
30
+ from ....resources import UseResources
22
31
  from ....standard import DefaultOptions
32
+ from ....stream.services import StreamResponseSink
33
+ from ....stream.services import new_stream_response
23
34
 
24
35
 
25
36
  ##
26
37
 
27
38
 
28
39
  # @omlish-manifest $.minichain.backends.strings.manifests.BackendStringsManifest(
29
- # ['ChatChoicesService'],
40
+ # ['ChatChoicesService', 'ChatChoicesStreamService'],
30
41
  # 'mlx',
31
42
  # )
32
43
 
@@ -34,12 +45,7 @@ from ....standard import DefaultOptions
34
45
  ##
35
46
 
36
47
 
37
- # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
38
- # name='mlx',
39
- # type='ChatChoicesService',
40
- # )
41
- @static_check_is_chat_choices_service
42
- class MlxChatChoicesService(lang.ExitStacked):
48
+ class BaseMlxChatChoicesService(lang.ExitStacked):
43
49
  DEFAULT_MODEL: ta.ClassVar[ModelSpecifier] = (
44
50
  # 'mlx-community/DeepSeek-Coder-V2-Lite-Instruct-8bit'
45
51
  # 'mlx-community/Llama-3.3-70B-Instruct-4bit'
@@ -52,8 +58,8 @@ class MlxChatChoicesService(lang.ExitStacked):
52
58
  # 'mlx-community/Qwen2.5-0.5B-4bit'
53
59
  # 'mlx-community/Qwen2.5-32B-Instruct-8bit'
54
60
  # 'mlx-community/Qwen2.5-Coder-32B-Instruct-8bit'
55
- # 'mlx-community/mamba-2.8b-hf-f16'
56
61
  # 'mlx-community/Qwen3-30B-A3B-6bit'
62
+ # 'mlx-community/mamba-2.8b-hf-f16'
57
63
  )
58
64
 
59
65
  def __init__(self, *configs: Config) -> None:
@@ -70,10 +76,7 @@ class MlxChatChoicesService(lang.ExitStacked):
70
76
  }
71
77
 
72
78
  def _get_msg_content(self, m: Message) -> str | None:
73
- if isinstance(m, AiMessage):
74
- return check.isinstance(m.c, str)
75
-
76
- elif isinstance(m, (SystemMessage, UserMessage)):
79
+ if isinstance(m, (AiMessage, SystemMessage, UserMessage)):
77
80
  return check.isinstance(m.c, str)
78
81
 
79
82
  else:
@@ -96,10 +99,9 @@ class MlxChatChoicesService(lang.ExitStacked):
96
99
  max_tokens=MaxTokens,
97
100
  )
98
101
 
99
- async def invoke(self, request: ChatChoicesRequest) -> ChatChoicesResponse:
100
- loaded_model = self._load_model()
101
-
102
- tokenizer = loaded_model.tokenization.tokenizer
102
+ @lang.cached_function(transient=True)
103
+ def _get_tokenizer(self) -> mlxu.tokenization.Tokenizer:
104
+ tokenizer = self._load_model().tokenization.tokenizer
103
105
 
104
106
  if not (
105
107
  hasattr(tokenizer, 'apply_chat_template') and
@@ -107,26 +109,44 @@ class MlxChatChoicesService(lang.ExitStacked):
107
109
  ):
108
110
  raise RuntimeError(tokenizer)
109
111
 
110
- prompt = tokenizer.apply_chat_template(
112
+ return tokenizer
113
+
114
+ def _build_prompt(self, messages: ta.Sequence[Message]) -> str:
115
+ return check.isinstance(self._get_tokenizer().apply_chat_template(
111
116
  [ # type: ignore[arg-type]
112
117
  dict(
113
118
  role=self.ROLES_MAP[type(m)],
114
119
  content=self._get_msg_content(m),
115
120
  )
116
- for m in request.v
121
+ for m in messages
117
122
  ],
118
123
  tokenize=False,
119
124
  add_generation_prompt=True,
120
- )
125
+ ), str)
121
126
 
122
- kwargs = dict()
127
+ def _build_kwargs(self, oc: tv.TypedValuesConsumer) -> dict[str, ta.Any]:
128
+ kwargs: dict[str, ta.Any] = {}
129
+ kwargs.update(oc.pop_scalar_kwargs(**self._OPTION_KWARG_NAMES_MAP))
130
+ return kwargs
131
+
132
+
133
+ # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
134
+ # name='mlx',
135
+ # type='ChatChoicesService',
136
+ # )
137
+ @static_check_is_chat_choices_service
138
+ class MlxChatChoicesService(BaseMlxChatChoicesService):
139
+ async def invoke(self, request: ChatChoicesRequest) -> ChatChoicesResponse:
140
+ loaded_model = self._load_model()
141
+
142
+ prompt = self._build_prompt(request.v)
123
143
 
124
144
  with tv.consume(
125
145
  *self._default_options,
126
146
  *request.options,
127
147
  override=True,
128
148
  ) as oc:
129
- kwargs.update(oc.pop_scalar_kwargs(**self._OPTION_KWARG_NAMES_MAP))
149
+ kwargs = self._build_kwargs(oc)
130
150
 
131
151
  response = mlxu.generate(
132
152
  loaded_model.model,
@@ -139,3 +159,57 @@ class MlxChatChoicesService(lang.ExitStacked):
139
159
  return ChatChoicesResponse([
140
160
  AiChoice([AiMessage(response)]) # noqa
141
161
  ])
162
+
163
+
164
+ # @omlish-manifest $.minichain.registries.manifests.RegistryManifest(
165
+ # name='mlx',
166
+ # type='ChatChoicesStreamService',
167
+ # )
168
+ @static_check_is_chat_choices_stream_service
169
+ class MlxChatChoicesStreamService(BaseMlxChatChoicesService):
170
+ def __init__(self, *configs: Config) -> None:
171
+ super().__init__()
172
+
173
+ with tv.consume(*configs) as cc:
174
+ self._model = cc.pop(MlxChatChoicesService.DEFAULT_MODEL)
175
+ self._default_options: tv.TypedValues = DefaultOptions.pop(cc)
176
+
177
+ READ_CHUNK_SIZE = 64 * 1024
178
+
179
+ async def invoke(
180
+ self,
181
+ request: ChatChoicesStreamRequest,
182
+ *,
183
+ max_tokens: int = 4096, # FIXME: ChatOption
184
+ ) -> ChatChoicesStreamResponse:
185
+ loaded_model = self._load_model()
186
+
187
+ prompt = self._build_prompt(request.v)
188
+
189
+ with tv.consume(
190
+ *self._default_options,
191
+ *request.options,
192
+ override=True,
193
+ ) as oc:
194
+ oc.pop(UseResources, None)
195
+ kwargs = self._build_kwargs(oc)
196
+
197
+ async with UseResources.or_new(request.options) as rs:
198
+ gen: ta.Iterator[mlxu.GenerationOutput] = rs.enter_context(contextlib.closing(mlxu.stream_generate(
199
+ loaded_model.model,
200
+ loaded_model.tokenization,
201
+ check.isinstance(prompt, str),
202
+ mlxu.GenerationParams(**kwargs),
203
+ # verbose=True,
204
+ )))
205
+
206
+ async def inner(sink: StreamResponseSink[AiChoicesDeltas]) -> ta.Sequence[ChatChoicesOutputs]:
207
+ for go in gen:
208
+ if go.text:
209
+ await sink.emit(AiChoicesDeltas([AiChoiceDeltas([
210
+ ContentAiChoiceDelta(go.text),
211
+ ])]))
212
+
213
+ return []
214
+
215
+ return await new_stream_response(rs, inner)
@@ -26,8 +26,8 @@ from ....chat.choices.services import static_check_is_chat_choices_service
26
26
  from ....models.configs import ModelName
27
27
  from ....standard import ApiKey
28
28
  from ....standard import DefaultOptions
29
- from .format2 import OpenaiChatRequestHandler
30
- from .format2 import build_mc_choices_response
29
+ from .format import OpenaiChatRequestHandler
30
+ from .format import build_mc_choices_response
31
31
  from .names import MODEL_NAMES
32
32
 
33
33
 
@@ -17,6 +17,9 @@ from ....chat.messages import SystemMessage
17
17
  from ....chat.messages import ToolUseMessage
18
18
  from ....chat.messages import ToolUseResultMessage
19
19
  from ....chat.messages import UserMessage
20
+ from ....chat.stream.types import AiChoiceDelta
21
+ from ....chat.stream.types import ContentAiChoiceDelta
22
+ from ....chat.stream.types import PartialToolUseAiChoiceDelta
20
23
  from ....chat.tools.types import Tool
21
24
  from ....content.json import JsonContent
22
25
  from ....content.prepare import prepare_content_str
@@ -125,6 +128,25 @@ def build_mc_choices_response(oai_resp: pt.ChatCompletionResponse) -> ChatChoice
125
128
  )
126
129
 
127
130
 
131
+ def build_mc_ai_choice_delta(delta: pt.ChatCompletionChunkChoiceDelta) -> AiChoiceDelta:
132
+ if delta.content is not None:
133
+ check.state(not delta.tool_calls)
134
+ return ContentAiChoiceDelta(delta.content)
135
+
136
+ elif delta.tool_calls is not None:
137
+ check.state(delta.content is None)
138
+ tc = check.single(delta.tool_calls)
139
+ tc_fn = check.not_none(tc.function)
140
+ return PartialToolUseAiChoiceDelta(
141
+ id=tc.id,
142
+ name=tc_fn.name,
143
+ raw_args=tc_fn.arguments,
144
+ )
145
+
146
+ else:
147
+ raise ValueError(delta)
148
+
149
+
128
150
  ##
129
151
 
130
152