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
ommlds/cli/main.py CHANGED
@@ -1,182 +1,415 @@
1
1
  """
2
- See:
3
- - https://github.com/simonw/llm
4
- - https://github.com/TheR1D/shell_gpt
5
- - https://github.com/paul-gauthier/aider
2
+ TODO:
3
+ - bootstrap lol
6
4
  """
7
- import argparse
5
+ import abc
8
6
  import functools
9
- import os.path
10
7
  import sys
11
8
  import typing as ta
12
9
 
13
10
  import anyio
14
11
 
15
- from omdev.home.secrets import load_secrets
16
12
  from omlish import check
13
+ from omlish import dataclasses as dc
17
14
  from omlish import inject as inj
18
15
  from omlish import lang
19
- from omlish.diag import pycharm
16
+ from omlish.argparse import all as ap
20
17
  from omlish.logs import all as logs
21
- from omlish.subprocesses.editor import edit_text_with_user_editor
22
- from omlish.subprocesses.sync import subprocesses
23
18
 
24
- from .. import minichain as mc
25
19
  from .inject import bind_main
20
+ from .secrets import install_env_secrets
26
21
  from .sessions.base import Session
27
22
  from .sessions.chat.configs import ChatConfig
23
+ from .sessions.chat.interfaces.bare.configs import BareInterfaceConfig
24
+ from .sessions.chat.interfaces.configs import InterfaceConfig
25
+ from .sessions.chat.interfaces.textual.configs import TextualInterfaceConfig
28
26
  from .sessions.completion.configs import CompletionConfig
27
+ from .sessions.configs import SessionConfig
29
28
  from .sessions.embedding.configs import EmbeddingConfig
30
29
 
31
30
 
32
- if ta.TYPE_CHECKING:
33
- import PIL.Image as pimg # noqa
34
- else:
35
- pimg = lang.proxy_import('PIL.Image')
31
+ ##
32
+
33
+
34
+ MAIN_EXTRA_ARGS: ta.Sequence[ap.Arg] = [
35
+ ap.arg('-v', '--verbose', action='store_true'),
36
+ ]
37
+
38
+
39
+ def _process_main_extra_args(args: ap.Namespace) -> None:
40
+ if args.verbose:
41
+ logs.configure_standard_logging('DEBUG')
42
+ else:
43
+ logs.configure_standard_logging('INFO')
44
+
45
+ logs.silence_noisy_loggers()
36
46
 
37
47
 
38
48
  ##
39
49
 
40
50
 
41
- async def _a_main(args: ta.Any = None) -> None:
42
- logs.configure_standard_logging('INFO')
51
+ class Profile(lang.Abstract):
52
+ @abc.abstractmethod
53
+ def configure(self, argv: ta.Sequence[str]) -> SessionConfig:
54
+ raise NotImplementedError
43
55
 
44
- #
45
56
 
46
- parser = argparse.ArgumentParser()
47
- parser.add_argument('prompt', nargs='*')
57
+ ##
48
58
 
49
- parser.add_argument('-b', '--backend', default='openai')
50
59
 
51
- parser.add_argument('-m', '--model-name')
60
+ # class ChatAspect(lang.Abstract):
61
+ # def get_parser_args(self) -> ta.Sequence[ap.Arg]: ...
62
+ # def set_args(self, args: ap.Namespace) -> None: ...
63
+ # def configure(self, cfg: ChatConfig) -> ChatConfig: ...
52
64
 
53
- parser.add_argument('-C', '--completion', action='store_true')
54
65
 
55
- parser.add_argument('-n', '--new', action='store_true')
56
- parser.add_argument('--ephemeral', action='store_true')
66
+ class ChatProfile(Profile):
67
+ _args: ap.Namespace
57
68
 
58
- parser.add_argument('-e', '--editor', action='store_true')
59
- parser.add_argument('-i', '--interactive', action='store_true')
60
- parser.add_argument('-c', '--code', action='store_true')
61
- parser.add_argument('-s', '--stream', action='store_true')
62
- parser.add_argument('-M', '--markdown', action='store_true')
69
+ #
63
70
 
64
- parser.add_argument('-E', '--embed', action='store_true')
65
- parser.add_argument('-j', '--image', action='store_true')
71
+ BACKEND_ARGS: ta.ClassVar[ta.Sequence[ap.Arg]] = [
72
+ ap.arg('-b', '--backend', group='backend'),
73
+ ]
74
+
75
+ def configure_backend(self, cfg: ChatConfig) -> ChatConfig:
76
+ return dc.replace(
77
+ cfg,
78
+ driver=dc.replace(
79
+ cfg.driver,
80
+ backend=dc.replace(
81
+ cfg.driver.backend,
82
+ backend=self._args.backend,
83
+ ),
84
+ ),
85
+ )
66
86
 
67
- parser.add_argument('--enable-fs-tools', action='store_true')
68
- parser.add_argument('--enable-todo-tools', action='store_true')
69
- parser.add_argument('--enable-unsafe-tools-do-not-use-lol', action='store_true')
70
- parser.add_argument('--enable-test-weather-tool', action='store_true')
71
- parser.add_argument('--dangerous-no-tool-confirmation', action='store_true')
87
+ #
72
88
 
73
- args = parser.parse_args(args)
89
+ INTERFACE_ARGS: ta.ClassVar[ta.Sequence[ap.Arg]] = [
90
+ ap.arg('-i', '--interactive', action='store_true', group='interface'),
91
+ ap.arg('-T', '--textual', action='store_true', group='interface'),
92
+ ap.arg('-e', '--editor', action='store_true', group='interface'),
93
+ ]
94
+
95
+ def configure_interface(self, cfg: ChatConfig) -> ChatConfig:
96
+ if self._args.editor:
97
+ check.arg(not self._args.interactive)
98
+ check.arg(not self._args.message)
99
+ raise NotImplementedError
100
+
101
+ if self._args.textual:
102
+ check.isinstance(cfg.interface, BareInterfaceConfig)
103
+ cfg = dc.replace(
104
+ cfg,
105
+ interface=TextualInterfaceConfig(**{
106
+ f.name: getattr(cfg.interface, f.name)
107
+ for f in dc.fields(InterfaceConfig)
108
+ }),
109
+ )
110
+
111
+ else:
112
+ cfg = dc.replace(
113
+ cfg,
114
+ driver=dc.replace(
115
+ cfg.driver,
116
+ ai=dc.replace(
117
+ cfg.driver.ai,
118
+ verbose=True,
119
+ ),
120
+ ),
121
+ interface=dc.replace(
122
+ check.isinstance(cfg.interface, BareInterfaceConfig),
123
+ interactive=self._args.interactive,
124
+ ),
125
+ )
126
+
127
+ return cfg
74
128
 
75
129
  #
76
130
 
77
- content: mc.Content | None
131
+ INPUT_ARGS: ta.ClassVar[ta.Sequence[ap.Arg]] = [
132
+ ap.arg('message', nargs='*', group='input'),
133
+ ]
78
134
 
79
- if args.image:
80
- content = mc.ImageContent(pimg.open(check.non_empty_str(check.single(args.prompt))))
135
+ def configure_input(self, cfg: ChatConfig) -> ChatConfig:
136
+ if self._args.interactive or self._args.textual:
137
+ check.arg(not self._args.message)
81
138
 
82
- elif args.editor:
83
- check.arg(not args.prompt)
84
- if (ec := edit_text_with_user_editor('', subprocesses)) is None:
85
- return
86
- content = ec
139
+ elif self._args.message:
140
+ ps: list[str] = []
87
141
 
88
- elif args.interactive:
89
- if args.prompt:
90
- raise ValueError('Must not provide prompt')
91
- content = None
142
+ for a in self._args.message:
143
+ if a == '-':
144
+ ps.append(sys.stdin.read())
92
145
 
93
- elif args.code:
94
- if args.prompt:
95
- content = ' '.join(args.prompt)
96
- else:
97
- content = None
146
+ elif a.startswith('@'):
147
+ with open(a[1:]) as f:
148
+ ps.append(f.read())
98
149
 
99
- elif not args.prompt:
100
- raise ValueError('Must provide prompt')
150
+ else:
151
+ ps.append(a)
101
152
 
102
- else:
103
- prompt = ' '.join(args.prompt)
153
+ c = ' '.join(ps)
154
+
155
+ cfg = dc.replace(
156
+ cfg,
157
+ driver=dc.replace(
158
+ cfg.driver,
159
+ user=dc.replace(
160
+ cfg.driver.user,
161
+ initial_user_content=c,
162
+ ),
163
+ ),
164
+ )
104
165
 
105
- # FIXME: ptk / maysync
106
- if not sys.stdin.isatty() and not pycharm.is_pycharm_hosted():
107
- stdin_data = sys.stdin.read()
108
- prompt = '\n'.join([prompt, stdin_data])
166
+ else:
167
+ raise ValueError('Must specify input')
109
168
 
110
- content = prompt
169
+ return cfg
111
170
 
112
171
  #
113
172
 
114
- # FIXME: lol garbage
115
- for key in [
116
- 'OPENAI_API_KEY',
117
- 'HUGGINGFACE_TOKEN',
118
- 'TAVILY_API_KEY',
119
- 'ANTHROPIC_API_KEY',
120
- 'MISTRAL_API_KEY',
121
- 'GEMINI_API_KEY',
122
- ]:
123
- if (sec := load_secrets().try_get(key.lower())) is not None:
124
- os.environ[key] = sec.reveal()
173
+ STATE_ARGS: ta.ClassVar[ta.Sequence[ap.Arg]] = [
174
+ ap.arg('-n', '--new', action='store_true', group='state'),
175
+ ap.arg('--ephemeral', action='store_true', group='state'),
176
+ ]
177
+
178
+ def configure_state(self, cfg: ChatConfig) -> ChatConfig:
179
+ return dc.replace(
180
+ cfg,
181
+ driver=dc.replace(
182
+ cfg.driver,
183
+ state=dc.replace(
184
+ cfg.driver.state,
185
+ state='ephemeral' if self._args.ephemeral else 'new' if self._args.new else 'continue',
186
+ ),
187
+ ),
188
+ )
125
189
 
126
190
  #
127
191
 
128
- session_cfg: ta.Any
192
+ OUTPUT_ARGS: ta.ClassVar[ta.Sequence[ap.Arg]] = [
193
+ ap.arg('-s', '--stream', action='store_true', group='output'),
194
+ ap.arg('-M', '--markdown', action='store_true', group='output'),
195
+ ]
196
+
197
+ def configure_output(self, cfg: ChatConfig) -> ChatConfig:
198
+ return dc.replace(
199
+ cfg,
200
+ driver=dc.replace(
201
+ cfg.driver,
202
+ ai=dc.replace(
203
+ cfg.driver.ai,
204
+ stream=bool(self._args.stream),
205
+ ),
206
+ ),
207
+ rendering=dc.replace(
208
+ cfg.rendering,
209
+ markdown=bool(self._args.markdown),
210
+ ),
211
+ )
129
212
 
130
- if args.embed:
131
- session_cfg = EmbeddingConfig(
132
- check.not_none(content), # noqa
133
- backend=args.backend,
213
+ #
214
+
215
+ TOOLS_ARGS: ta.ClassVar[ta.Sequence[ap.Arg]] = [
216
+ ap.arg('--enable-fs-tools', action='store_true', group='tools'),
217
+ ap.arg('--enable-todo-tools', action='store_true', group='tools'),
218
+ # ap.arg('--enable-unsafe-tools-do-not-use-lol', action='store_true', group='tools'),
219
+ ap.arg('--enable-test-weather-tool', action='store_true', group='tools'),
220
+ ]
221
+
222
+ def configure_tools(self, cfg: ChatConfig) -> ChatConfig:
223
+ if not (
224
+ self._args.enable_fs_tools or
225
+ self._args.enable_todo_tools or
226
+ # self._args.enable_unsafe_tools_do_not_use_lol or
227
+ self._args.enable_test_weather_tool or
228
+ self._args.code
229
+ ):
230
+ return cfg
231
+
232
+ return dc.replace(
233
+ cfg,
234
+ driver=dc.replace(
235
+ cfg.driver,
236
+ ai=dc.replace(
237
+ cfg.driver.ai,
238
+ enable_tools=True,
239
+ ),
240
+ tools=dc.replace(
241
+ cfg.driver.tools,
242
+ enabled_tools={ # noqa
243
+ *(cfg.driver.tools.enabled_tools or []),
244
+ *(['fs'] if self._args.enable_fs_tools else []),
245
+ *(['todo'] if self._args.enable_todo_tools else []),
246
+ *(['weather'] if self._args.enable_test_weather_tool else []),
247
+ },
248
+ ),
249
+ ),
250
+ interface=dc.replace(
251
+ cfg.interface,
252
+ enable_tools=True,
253
+ ),
134
254
  )
135
255
 
136
- elif args.completion:
137
- session_cfg = CompletionConfig(
138
- check.not_none(content), # noqa
139
- backend=args.backend,
256
+ #
257
+
258
+ CODE_CONFIG: ta.ClassVar[ta.Sequence[ap.Arg]] = [
259
+ ap.arg('-c', '--code', action='store_true', group='code'),
260
+ ]
261
+
262
+ def configure_code(self, cfg: ChatConfig) -> ChatConfig:
263
+ if not self._args.code:
264
+ return cfg
265
+
266
+ cfg = dc.replace(
267
+ cfg,
268
+ driver=dc.replace(
269
+ cfg.driver,
270
+ ai=dc.replace(
271
+ cfg.driver.ai,
272
+ enable_tools=True,
273
+ ),
274
+ ),
140
275
  )
141
276
 
142
- else:
143
- system_content: mc.Content | None = None
144
- if (args.new or args.ephemeral) and args.code:
277
+ if self._args.new or self._args.ephemeral:
145
278
  from ..minichain.lib.code.prompts import CODE_AGENT_SYSTEM_PROMPT
146
279
  system_content = CODE_AGENT_SYSTEM_PROMPT
147
280
 
148
- session_cfg = ChatConfig(
281
+ cfg = dc.replace(
282
+ cfg,
283
+ driver=dc.replace(
284
+ cfg.driver,
285
+ user=dc.replace(
286
+ cfg.driver.user,
287
+ initial_system_content=system_content,
288
+ ),
289
+ ),
290
+ )
291
+
292
+ return cfg
293
+
294
+ #
295
+
296
+ def configure(self, argv: ta.Sequence[str]) -> SessionConfig:
297
+ parser = ap.ArgumentParser()
298
+
299
+ for grp_name, grp_args in [
300
+ ('backend', self.BACKEND_ARGS),
301
+ ('interface', self.INTERFACE_ARGS),
302
+ ('input', self.INPUT_ARGS),
303
+ ('state', self.STATE_ARGS),
304
+ ('output', self.OUTPUT_ARGS),
305
+ ('tools', self.TOOLS_ARGS),
306
+ ('code', self.CODE_CONFIG),
307
+ ]:
308
+ grp = parser.add_argument_group(grp_name)
309
+ for a in grp_args:
310
+ grp.add_argument(*a.args, **a.kwargs)
311
+
312
+ self._args = parser.parse_args(argv)
313
+
314
+ cfg = ChatConfig()
315
+ cfg = self.configure_backend(cfg)
316
+ cfg = self.configure_interface(cfg)
317
+ cfg = self.configure_input(cfg)
318
+ cfg = self.configure_state(cfg)
319
+ cfg = self.configure_output(cfg)
320
+ cfg = self.configure_tools(cfg)
321
+ cfg = self.configure_code(cfg)
322
+
323
+ return cfg
324
+
325
+
326
+ ##
327
+
328
+
329
+ class CompletionProfile(Profile):
330
+ def configure(self, argv: ta.Sequence[str]) -> SessionConfig:
331
+ parser = ap.ArgumentParser()
332
+ parser.add_argument('prompt', nargs='*')
333
+ parser.add_argument('-b', '--backend', default='openai')
334
+ args = parser.parse_args(argv)
335
+
336
+ content = ' '.join(args.prompt)
337
+
338
+ cfg = CompletionConfig(
339
+ content=check.non_empty_str(content),
149
340
  backend=args.backend,
150
- model_name=args.model_name,
151
- state='ephemeral' if args.ephemeral else 'new' if args.new else 'continue',
152
- initial_system_content=system_content,
153
- initial_user_content=content, # noqa
154
- interactive=bool(args.interactive),
155
- markdown=bool(args.markdown),
156
- stream=bool(args.stream),
157
- enable_tools=(
158
- args.enable_fs_tools or
159
- args.enable_todo_tools or
160
- args.enable_unsafe_tools_do_not_use_lol or
161
- args.enable_test_weather_tool or
162
- args.code
163
- ),
164
- enabled_tools={
165
- *(['fs'] if args.enable_fs_tools else []),
166
- *(['todo'] if args.enable_todo_tools else []),
167
- *(['weather'] if args.enable_test_weather_tool else []),
168
- # FIXME: enable_unsafe_tools_do_not_use_lol
169
- },
170
- dangerous_no_tool_confirmation=bool(args.dangerous_no_tool_confirmation),
171
341
  )
172
342
 
173
- #
343
+ return cfg
344
+
345
+
346
+ ##
347
+
348
+
349
+ class EmbedProfile(Profile):
350
+ def configure(self, argv: ta.Sequence[str]) -> SessionConfig:
351
+ parser = ap.ArgumentParser()
352
+ parser.add_argument('prompt', nargs='*')
353
+ parser.add_argument('-b', '--backend', default='openai')
354
+ args = parser.parse_args(argv)
355
+
356
+ content = ' '.join(args.prompt)
357
+
358
+ cfg = EmbeddingConfig(
359
+ content=check.non_empty_str(content),
360
+ backend=args.backend,
361
+ )
362
+
363
+ return cfg
364
+
365
+
366
+ ##
367
+
368
+
369
+ PROFILE_TYPES: ta.Mapping[str, type[Profile]] = {
370
+ 'chat': ChatProfile,
371
+ 'complete': CompletionProfile,
372
+ 'embed': EmbedProfile,
373
+ }
374
+
375
+
376
+ ##
174
377
 
175
- with inj.create_managed_injector(bind_main(
378
+
379
+ async def _run_session_cfg(session_cfg: SessionConfig) -> None:
380
+ async with inj.create_async_managed_injector(bind_main(
176
381
  session_cfg=session_cfg,
177
- enable_backend_strings=isinstance(session_cfg, ChatConfig),
178
382
  )) as injector:
179
- await injector[Session].run()
383
+ await (await injector[Session]).run()
384
+
385
+
386
+ ##
387
+
388
+
389
+ MAIN_PROFILE_ARGS: ta.Sequence[ap.Arg] = [
390
+ ap.arg('-p', '--profile', default='chat'),
391
+ ap.arg('args', nargs=ap.REMAINDER),
392
+ ]
393
+
394
+
395
+ async def _a_main(argv: ta.Any = None) -> None:
396
+ parser = ap.ArgumentParser()
397
+
398
+ for a in [*MAIN_PROFILE_ARGS, *MAIN_EXTRA_ARGS]:
399
+ parser.add_argument(*a.args, **a.kwargs)
400
+
401
+ args, unk_args = parser.parse_known_args(argv)
402
+
403
+ _process_main_extra_args(args)
404
+
405
+ install_env_secrets()
406
+
407
+ profile_cls = PROFILE_TYPES[args.profile]
408
+ profile = profile_cls()
409
+
410
+ session_cfg = profile.configure([*unk_args, *args.args])
411
+
412
+ await _run_session_cfg(session_cfg)
180
413
 
181
414
 
182
415
  def _main(args: ta.Any = None) -> None:
@@ -185,7 +418,6 @@ def _main(args: ta.Any = None) -> None:
185
418
  _a_main,
186
419
  args,
187
420
  ),
188
- backend='asyncio',
189
421
  ) # noqa
190
422
 
191
423
 
@@ -0,0 +1,9 @@
1
+ from omlish import dataclasses as dc
2
+
3
+
4
+ ##
5
+
6
+
7
+ @dc.dataclass(frozen=True, kw_only=True)
8
+ class RenderingConfig:
9
+ markdown: bool = False
@@ -1,6 +1,8 @@
1
1
  from omlish import inject as inj
2
2
  from omlish import lang
3
3
 
4
+ from .configs import RenderingConfig
5
+
4
6
 
5
7
  with lang.auto_proxy_import(globals()):
6
8
  from . import markdown as _markdown
@@ -11,13 +13,10 @@ with lang.auto_proxy_import(globals()):
11
13
  ##
12
14
 
13
15
 
14
- def bind_rendering(
15
- *,
16
- markdown: bool = False,
17
- ) -> inj.Elements:
16
+ def bind_rendering(cfg: RenderingConfig = RenderingConfig()) -> inj.Elements:
18
17
  els: list[inj.Elemental] = []
19
18
 
20
- if markdown:
19
+ if cfg.markdown:
21
20
  els.extend([
22
21
  inj.bind(_types.ContentRendering, to_ctor=_markdown.MarkdownContentRendering, singleton=True),
23
22
  inj.bind(_types.StreamContentRendering, to_ctor=_markdown.MarkdownStreamContentRendering, singleton=True),
@@ -3,7 +3,7 @@ import typing as ta
3
3
  from omdev.tui import rich
4
4
  from omlish import lang
5
5
 
6
- from ..... import minichain as mc
6
+ from ... import minichain as mc
7
7
  from ..content.strings import ContentStringifier
8
8
  from ..content.strings import HasContentStringifier
9
9
  from .types import ContentRendering
@@ -2,7 +2,7 @@ import typing as ta
2
2
 
3
3
  from omlish import lang
4
4
 
5
- from ..... import minichain as mc
5
+ from ... import minichain as mc
6
6
  from ..content.strings import ContentStringifier
7
7
  from ..content.strings import HasContentStringifier
8
8
  from .types import ContentRendering
@@ -1,9 +1,15 @@
1
+ """
2
+ TODO:
3
+ - html?
4
+ - terminal?
5
+ - rich? textual.Content?
6
+ """
1
7
  import abc
2
8
  import typing as ta
3
9
 
4
10
  from omlish import lang
5
11
 
6
- from ..... import minichain as mc
12
+ from ... import minichain as mc
7
13
 
8
14
 
9
15
  ##
ommlds/cli/secrets.py ADDED
@@ -0,0 +1,22 @@
1
+ import os
2
+
3
+ from omdev.home.secrets import load_secrets
4
+
5
+
6
+ ##
7
+
8
+
9
+ def install_env_secrets() -> None:
10
+ # FIXME: lol garbage
11
+ for key in [
12
+ 'ANTHROPIC_API_KEY',
13
+ 'CEREBRAS_API_KEY',
14
+ 'GEMINI_API_KEY',
15
+ 'GROQ_API_KEY',
16
+ 'HUGGINGFACE_TOKEN',
17
+ 'MISTRAL_API_KEY',
18
+ 'OPENAI_API_KEY',
19
+ 'TAVILY_API_KEY',
20
+ ]:
21
+ if (sec := load_secrets().try_get(key.lower())) is not None:
22
+ os.environ[key] = sec.reveal()
@@ -1,22 +1,13 @@
1
1
  import abc
2
- import dataclasses as dc
3
2
  import typing as ta
4
3
 
5
4
  from omlish import lang
6
- from omlish.configs import all as cfgs
7
-
8
-
9
- SessionConfigT = ta.TypeVar('SessionConfigT', bound='Session.Config')
10
5
 
11
6
 
12
7
  ##
13
8
 
14
9
 
15
- class Session(cfgs.Configurable[SessionConfigT], lang.Abstract):
16
- @dc.dataclass(frozen=True)
17
- class Config(cfgs.Configurable.Config):
18
- pass
19
-
10
+ class Session(lang.Abstract):
20
11
  @abc.abstractmethod
21
12
  def run(self) -> ta.Awaitable[None]:
22
13
  raise NotImplementedError