ommlds 0.0.0.dev480__py3-none-any.whl → 0.0.0.dev503__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 (277) hide show
  1. ommlds/.omlish-manifests.json +100 -33
  2. ommlds/README.md +11 -0
  3. ommlds/__about__.py +9 -6
  4. ommlds/backends/anthropic/protocol/__init__.py +13 -1
  5. ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
  6. ommlds/backends/anthropic/protocol/sse/events.py +2 -0
  7. ommlds/backends/cerebras/__init__.py +7 -0
  8. ommlds/backends/cerebras/_dataclasses.py +4254 -0
  9. ommlds/backends/cerebras/_marshal.py +24 -0
  10. ommlds/backends/cerebras/protocol.py +312 -0
  11. ommlds/backends/google/protocol/__init__.py +13 -0
  12. ommlds/backends/google/protocol/_dataclasses.py +5997 -0
  13. ommlds/backends/groq/__init__.py +7 -0
  14. ommlds/backends/groq/_dataclasses.py +3901 -0
  15. ommlds/backends/groq/clients.py +9 -0
  16. ommlds/backends/llamacpp/logging.py +4 -1
  17. ommlds/backends/mlx/caching.py +7 -3
  18. ommlds/backends/mlx/cli.py +10 -7
  19. ommlds/backends/mlx/generation.py +18 -16
  20. ommlds/backends/mlx/limits.py +10 -6
  21. ommlds/backends/mlx/loading.py +7 -4
  22. ommlds/backends/ollama/__init__.py +7 -0
  23. ommlds/backends/ollama/_dataclasses.py +3488 -0
  24. ommlds/backends/ollama/protocol.py +3 -0
  25. ommlds/backends/openai/protocol/__init__.py +15 -1
  26. ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
  27. ommlds/backends/tavily/__init__.py +7 -0
  28. ommlds/backends/tavily/_dataclasses.py +1734 -0
  29. ommlds/backends/transformers/__init__.py +14 -0
  30. ommlds/cli/__init__.py +7 -0
  31. ommlds/cli/_dataclasses.py +3515 -0
  32. ommlds/cli/backends/catalog.py +0 -5
  33. ommlds/cli/backends/inject.py +70 -7
  34. ommlds/cli/backends/meta.py +82 -0
  35. ommlds/cli/content/messages.py +1 -1
  36. ommlds/cli/inject.py +11 -3
  37. ommlds/cli/main.py +137 -68
  38. ommlds/cli/rendering/types.py +6 -0
  39. ommlds/cli/secrets.py +2 -1
  40. ommlds/cli/sessions/base.py +1 -10
  41. ommlds/cli/sessions/chat/configs.py +9 -17
  42. ommlds/cli/sessions/chat/{chat → drivers}/ai/configs.py +3 -1
  43. ommlds/cli/sessions/chat/drivers/ai/events.py +57 -0
  44. ommlds/cli/sessions/chat/{chat → drivers}/ai/inject.py +10 -3
  45. ommlds/cli/sessions/chat/{chat → drivers}/ai/rendering.py +1 -1
  46. ommlds/cli/sessions/chat/{chat → drivers}/ai/services.py +1 -1
  47. ommlds/cli/sessions/chat/{chat → drivers}/ai/tools.py +4 -8
  48. ommlds/cli/sessions/chat/{chat → drivers}/ai/types.py +9 -0
  49. ommlds/cli/sessions/chat/drivers/configs.py +25 -0
  50. ommlds/cli/sessions/chat/drivers/events/inject.py +27 -0
  51. ommlds/cli/sessions/chat/drivers/events/injection.py +14 -0
  52. ommlds/cli/sessions/chat/drivers/events/manager.py +16 -0
  53. ommlds/cli/sessions/chat/drivers/events/types.py +38 -0
  54. ommlds/cli/sessions/chat/drivers/impl.py +50 -0
  55. ommlds/cli/sessions/chat/drivers/inject.py +70 -0
  56. ommlds/cli/sessions/chat/{chat → drivers}/state/configs.py +2 -0
  57. ommlds/cli/sessions/chat/drivers/state/ids.py +25 -0
  58. ommlds/cli/sessions/chat/drivers/state/inject.py +83 -0
  59. ommlds/cli/sessions/chat/{chat → drivers}/state/inmemory.py +0 -4
  60. ommlds/cli/sessions/chat/{chat → drivers}/state/storage.py +17 -10
  61. ommlds/cli/sessions/chat/{chat → drivers}/state/types.py +10 -5
  62. ommlds/cli/sessions/chat/{tools → drivers/tools}/configs.py +2 -2
  63. ommlds/cli/sessions/chat/drivers/tools/confirmation.py +44 -0
  64. ommlds/cli/sessions/chat/drivers/tools/errorhandling.py +39 -0
  65. ommlds/cli/sessions/chat/{tools → drivers/tools}/execution.py +3 -4
  66. ommlds/cli/sessions/chat/{tools → drivers/tools}/fs/inject.py +3 -3
  67. ommlds/cli/sessions/chat/{tools → drivers/tools}/inject.py +7 -12
  68. ommlds/cli/sessions/chat/{tools → drivers/tools}/injection.py +5 -5
  69. ommlds/cli/sessions/chat/{tools → drivers/tools}/rendering.py +3 -3
  70. ommlds/cli/sessions/chat/{tools → drivers/tools}/todo/inject.py +3 -3
  71. ommlds/cli/sessions/chat/{tools → drivers/tools}/weather/tools.py +1 -1
  72. ommlds/cli/sessions/chat/drivers/types.py +31 -0
  73. ommlds/cli/sessions/chat/{chat → drivers}/user/configs.py +0 -3
  74. ommlds/cli/sessions/chat/drivers/user/inject.py +41 -0
  75. ommlds/cli/sessions/chat/facades/__init__.py +0 -0
  76. ommlds/cli/sessions/chat/facades/commands/__init__.py +0 -0
  77. ommlds/cli/sessions/chat/facades/commands/base.py +83 -0
  78. ommlds/cli/sessions/chat/facades/commands/configs.py +9 -0
  79. ommlds/cli/sessions/chat/facades/commands/inject.py +41 -0
  80. ommlds/cli/sessions/chat/facades/commands/injection.py +15 -0
  81. ommlds/cli/sessions/chat/facades/commands/manager.py +59 -0
  82. ommlds/cli/sessions/chat/facades/commands/simple.py +34 -0
  83. ommlds/cli/sessions/chat/facades/commands/types.py +13 -0
  84. ommlds/cli/sessions/chat/facades/configs.py +11 -0
  85. ommlds/cli/sessions/chat/facades/facade.py +26 -0
  86. ommlds/cli/sessions/chat/facades/inject.py +35 -0
  87. ommlds/cli/sessions/chat/facades/ui.py +34 -0
  88. ommlds/cli/sessions/chat/inject.py +8 -31
  89. ommlds/cli/sessions/chat/interfaces/__init__.py +0 -0
  90. ommlds/cli/sessions/chat/interfaces/bare/__init__.py +0 -0
  91. ommlds/cli/sessions/chat/interfaces/bare/configs.py +15 -0
  92. ommlds/cli/sessions/chat/interfaces/bare/inject.py +69 -0
  93. ommlds/cli/sessions/chat/interfaces/bare/interactive.py +49 -0
  94. ommlds/cli/sessions/chat/interfaces/bare/oneshot.py +21 -0
  95. ommlds/cli/sessions/chat/{tools/confirmation.py → interfaces/bare/tools.py} +3 -22
  96. ommlds/cli/sessions/chat/interfaces/base.py +13 -0
  97. ommlds/cli/sessions/chat/interfaces/configs.py +11 -0
  98. ommlds/cli/sessions/chat/interfaces/inject.py +29 -0
  99. ommlds/cli/sessions/chat/interfaces/textual/__init__.py +0 -0
  100. ommlds/cli/sessions/chat/interfaces/textual/app.py +310 -0
  101. ommlds/cli/sessions/chat/interfaces/textual/configs.py +11 -0
  102. ommlds/cli/sessions/chat/interfaces/textual/facades.py +19 -0
  103. ommlds/cli/sessions/chat/interfaces/textual/inject.py +97 -0
  104. ommlds/cli/sessions/chat/interfaces/textual/interface.py +24 -0
  105. ommlds/cli/sessions/chat/interfaces/textual/styles/__init__.py +29 -0
  106. ommlds/cli/sessions/chat/interfaces/textual/styles/input.tcss +53 -0
  107. ommlds/cli/sessions/chat/interfaces/textual/styles/markdown.tcss +7 -0
  108. ommlds/cli/sessions/chat/interfaces/textual/styles/messages.tcss +157 -0
  109. ommlds/cli/sessions/chat/interfaces/textual/tools.py +38 -0
  110. ommlds/cli/sessions/chat/interfaces/textual/widgets/__init__.py +0 -0
  111. ommlds/cli/sessions/chat/interfaces/textual/widgets/input.py +36 -0
  112. ommlds/cli/sessions/chat/interfaces/textual/widgets/messages.py +197 -0
  113. ommlds/cli/sessions/chat/session.py +8 -13
  114. ommlds/cli/sessions/completion/configs.py +3 -4
  115. ommlds/cli/sessions/completion/inject.py +1 -2
  116. ommlds/cli/sessions/completion/session.py +4 -8
  117. ommlds/cli/sessions/configs.py +10 -0
  118. ommlds/cli/sessions/embedding/configs.py +3 -4
  119. ommlds/cli/sessions/embedding/inject.py +1 -2
  120. ommlds/cli/sessions/embedding/session.py +4 -8
  121. ommlds/cli/sessions/inject.py +15 -15
  122. ommlds/cli/state/storage.py +7 -1
  123. ommlds/minichain/__init__.py +161 -38
  124. ommlds/minichain/_dataclasses.py +20452 -0
  125. ommlds/minichain/_typedvalues.py +11 -4
  126. ommlds/minichain/backends/impls/anthropic/names.py +3 -3
  127. ommlds/minichain/backends/impls/anthropic/protocol.py +2 -2
  128. ommlds/minichain/backends/impls/anthropic/stream.py +1 -1
  129. ommlds/minichain/backends/impls/cerebras/__init__.py +0 -0
  130. ommlds/minichain/backends/impls/cerebras/chat.py +80 -0
  131. ommlds/minichain/backends/impls/cerebras/names.py +45 -0
  132. ommlds/minichain/backends/impls/cerebras/protocol.py +143 -0
  133. ommlds/minichain/backends/impls/cerebras/stream.py +125 -0
  134. ommlds/minichain/backends/impls/duckduckgo/search.py +5 -1
  135. ommlds/minichain/backends/impls/google/names.py +6 -0
  136. ommlds/minichain/backends/impls/google/stream.py +1 -1
  137. ommlds/minichain/backends/impls/google/tools.py +2 -2
  138. ommlds/minichain/backends/impls/groq/chat.py +2 -0
  139. ommlds/minichain/backends/impls/groq/protocol.py +2 -2
  140. ommlds/minichain/backends/impls/groq/stream.py +3 -1
  141. ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
  142. ommlds/minichain/backends/impls/llamacpp/chat.py +6 -3
  143. ommlds/minichain/backends/impls/llamacpp/completion.py +7 -3
  144. ommlds/minichain/backends/impls/llamacpp/stream.py +6 -3
  145. ommlds/minichain/backends/impls/mlx/chat.py +6 -3
  146. ommlds/minichain/backends/impls/ollama/chat.py +51 -57
  147. ommlds/minichain/backends/impls/ollama/protocol.py +144 -0
  148. ommlds/minichain/backends/impls/openai/format.py +4 -3
  149. ommlds/minichain/backends/impls/openai/names.py +3 -1
  150. ommlds/minichain/backends/impls/openai/stream.py +33 -1
  151. ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
  152. ommlds/minichain/backends/impls/tinygrad/chat.py +7 -4
  153. ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
  154. ommlds/minichain/backends/impls/transformers/sentence.py +5 -2
  155. ommlds/minichain/backends/impls/transformers/tokens.py +9 -6
  156. ommlds/minichain/backends/impls/transformers/transformers.py +10 -8
  157. ommlds/minichain/backends/strings/resolving.py +1 -1
  158. ommlds/minichain/chat/content.py +42 -0
  159. ommlds/minichain/chat/messages.py +43 -39
  160. ommlds/minichain/chat/stream/joining.py +36 -12
  161. ommlds/minichain/chat/stream/types.py +1 -1
  162. ommlds/minichain/chat/templating.py +3 -3
  163. ommlds/minichain/content/__init__.py +19 -3
  164. ommlds/minichain/content/_marshal.py +181 -55
  165. ommlds/minichain/content/code.py +26 -0
  166. ommlds/minichain/content/composite.py +28 -0
  167. ommlds/minichain/content/content.py +27 -0
  168. ommlds/minichain/content/dynamic.py +12 -0
  169. ommlds/minichain/content/emphasis.py +27 -0
  170. ommlds/minichain/content/images.py +2 -2
  171. ommlds/minichain/content/json.py +2 -2
  172. ommlds/minichain/content/link.py +13 -0
  173. ommlds/minichain/content/markdown.py +12 -0
  174. ommlds/minichain/content/metadata.py +10 -0
  175. ommlds/minichain/content/namespaces.py +8 -0
  176. ommlds/minichain/content/placeholders.py +10 -9
  177. ommlds/minichain/content/quote.py +26 -0
  178. ommlds/minichain/content/raw.py +49 -0
  179. ommlds/minichain/content/recursive.py +12 -0
  180. ommlds/minichain/content/section.py +26 -0
  181. ommlds/minichain/content/sequence.py +17 -3
  182. ommlds/minichain/content/standard.py +32 -0
  183. ommlds/minichain/content/tag.py +28 -0
  184. ommlds/minichain/content/templates.py +13 -0
  185. ommlds/minichain/content/text.py +2 -2
  186. ommlds/minichain/content/transform/__init__.py +0 -0
  187. ommlds/minichain/content/transform/json.py +55 -0
  188. ommlds/minichain/content/transform/markdown.py +8 -0
  189. ommlds/minichain/content/transform/materialize.py +51 -0
  190. ommlds/minichain/content/transform/metadata.py +16 -0
  191. ommlds/minichain/content/{prepare.py → transform/prepare.py} +10 -15
  192. ommlds/minichain/content/transform/recursive.py +97 -0
  193. ommlds/minichain/content/transform/standard.py +43 -0
  194. ommlds/minichain/content/{transforms → transform}/stringify.py +1 -7
  195. ommlds/minichain/content/transform/strings.py +33 -0
  196. ommlds/minichain/content/transform/templates.py +25 -0
  197. ommlds/minichain/content/visitors.py +231 -0
  198. ommlds/minichain/lib/fs/tools/read.py +1 -1
  199. ommlds/minichain/lib/fs/tools/recursivels/rendering.py +1 -1
  200. ommlds/minichain/lib/fs/tools/recursivels/running.py +1 -1
  201. ommlds/minichain/lib/todo/tools/write.py +2 -1
  202. ommlds/minichain/lib/todo/types.py +1 -1
  203. ommlds/minichain/metadata.py +56 -2
  204. ommlds/minichain/resources.py +22 -1
  205. ommlds/minichain/services/README.md +154 -0
  206. ommlds/minichain/services/__init__.py +6 -2
  207. ommlds/minichain/services/_marshal.py +46 -10
  208. ommlds/minichain/services/_origclasses.py +11 -0
  209. ommlds/minichain/services/_typedvalues.py +8 -3
  210. ommlds/minichain/services/requests.py +73 -3
  211. ommlds/minichain/services/responses.py +73 -3
  212. ommlds/minichain/services/services.py +9 -0
  213. ommlds/minichain/stream/services.py +24 -1
  214. ommlds/minichain/text/applypatch.py +2 -1
  215. ommlds/minichain/text/toolparsing/llamacpp/types.py +1 -1
  216. ommlds/minichain/tokens/specials.py +1 -1
  217. ommlds/minichain/tools/execution/catalog.py +1 -1
  218. ommlds/minichain/tools/execution/errorhandling.py +36 -0
  219. ommlds/minichain/tools/execution/errors.py +2 -2
  220. ommlds/minichain/tools/execution/executors.py +1 -1
  221. ommlds/minichain/tools/fns.py +1 -1
  222. ommlds/minichain/tools/jsonschema.py +2 -2
  223. ommlds/minichain/tools/reflect.py +6 -6
  224. ommlds/minichain/tools/types.py +12 -15
  225. ommlds/minichain/vectors/_marshal.py +1 -1
  226. ommlds/minichain/vectors/embeddings.py +1 -1
  227. ommlds/minichain/wrappers/__init__.py +7 -0
  228. ommlds/minichain/wrappers/firstinwins.py +144 -0
  229. ommlds/minichain/wrappers/instrument.py +146 -0
  230. ommlds/minichain/wrappers/retry.py +168 -0
  231. ommlds/minichain/wrappers/services.py +98 -0
  232. ommlds/minichain/wrappers/stream.py +57 -0
  233. ommlds/nanochat/rustbpe/README.md +9 -0
  234. ommlds/nanochat/tokenizers.py +40 -6
  235. ommlds/specs/mcp/clients.py +146 -0
  236. ommlds/specs/mcp/protocol.py +123 -18
  237. ommlds/tools/git.py +82 -65
  238. {ommlds-0.0.0.dev480.dist-info → ommlds-0.0.0.dev503.dist-info}/METADATA +13 -11
  239. ommlds-0.0.0.dev503.dist-info/RECORD +520 -0
  240. ommlds/cli/sessions/chat/chat/state/inject.py +0 -36
  241. ommlds/cli/sessions/chat/chat/user/inject.py +0 -62
  242. ommlds/cli/sessions/chat/chat/user/interactive.py +0 -31
  243. ommlds/cli/sessions/chat/chat/user/oneshot.py +0 -25
  244. ommlds/cli/sessions/chat/chat/user/types.py +0 -15
  245. ommlds/cli/sessions/chat/driver.py +0 -43
  246. ommlds/minichain/content/materialize.py +0 -196
  247. ommlds/minichain/content/simple.py +0 -47
  248. ommlds/minichain/content/transforms/base.py +0 -46
  249. ommlds/minichain/content/transforms/interleave.py +0 -70
  250. ommlds/minichain/content/transforms/squeeze.py +0 -72
  251. ommlds/minichain/content/transforms/strings.py +0 -24
  252. ommlds/minichain/content/types.py +0 -43
  253. ommlds/minichain/stream/wrap.py +0 -62
  254. ommlds-0.0.0.dev480.dist-info/RECORD +0 -427
  255. /ommlds/cli/sessions/chat/{chat → drivers}/__init__.py +0 -0
  256. /ommlds/cli/sessions/chat/{chat → drivers}/ai/__init__.py +0 -0
  257. /ommlds/cli/sessions/chat/{chat → drivers}/ai/injection.py +0 -0
  258. /ommlds/cli/sessions/chat/{chat/state → drivers/events}/__init__.py +0 -0
  259. /ommlds/cli/sessions/chat/{chat/user → drivers/phases}/__init__.py +0 -0
  260. /ommlds/cli/sessions/chat/{phases → drivers/phases}/inject.py +0 -0
  261. /ommlds/cli/sessions/chat/{phases → drivers/phases}/injection.py +0 -0
  262. /ommlds/cli/sessions/chat/{phases → drivers/phases}/manager.py +0 -0
  263. /ommlds/cli/sessions/chat/{phases → drivers/phases}/types.py +0 -0
  264. /ommlds/cli/sessions/chat/{phases → drivers/state}/__init__.py +0 -0
  265. /ommlds/cli/sessions/chat/{tools → drivers/tools}/__init__.py +0 -0
  266. /ommlds/cli/sessions/chat/{tools → drivers/tools}/fs/__init__.py +0 -0
  267. /ommlds/cli/sessions/chat/{tools → drivers/tools}/fs/configs.py +0 -0
  268. /ommlds/cli/sessions/chat/{tools → drivers/tools}/todo/__init__.py +0 -0
  269. /ommlds/cli/sessions/chat/{tools → drivers/tools}/todo/configs.py +0 -0
  270. /ommlds/cli/sessions/chat/{tools → drivers/tools}/weather/__init__.py +0 -0
  271. /ommlds/cli/sessions/chat/{tools → drivers/tools}/weather/configs.py +0 -0
  272. /ommlds/cli/sessions/chat/{tools → drivers/tools}/weather/inject.py +0 -0
  273. /ommlds/{minichain/content/transforms → cli/sessions/chat/drivers/user}/__init__.py +0 -0
  274. {ommlds-0.0.0.dev480.dist-info → ommlds-0.0.0.dev503.dist-info}/WHEEL +0 -0
  275. {ommlds-0.0.0.dev480.dist-info → ommlds-0.0.0.dev503.dist-info}/entry_points.txt +0 -0
  276. {ommlds-0.0.0.dev480.dist-info → ommlds-0.0.0.dev503.dist-info}/licenses/LICENSE +0 -0
  277. {ommlds-0.0.0.dev480.dist-info → ommlds-0.0.0.dev503.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,35 @@
1
+ from omlish import inject as inj
2
+ from omlish import lang
3
+
4
+ from .configs import FacadeConfig
5
+
6
+
7
+ with lang.auto_proxy_import(globals()):
8
+ from . import facade as _facade
9
+ from . import ui as _ui
10
+ from .commands import inject as _commands
11
+
12
+
13
+ ##
14
+
15
+
16
+ def bind_facade(cfg: FacadeConfig = FacadeConfig()) -> inj.Elements:
17
+ els: list[inj.Elemental] = []
18
+
19
+ #
20
+
21
+ els.extend([
22
+ _commands.bind_commands(cfg.commands),
23
+ ])
24
+
25
+ #
26
+
27
+ els.append(inj.bind(_facade.ChatFacade, singleton=True))
28
+
29
+ #
30
+
31
+ els.append(inj.bind(_ui.UiQuitSignal(_ui.raise_system_exit_ui_quit_signal)))
32
+
33
+ #
34
+
35
+ return inj.as_elements(*els)
@@ -0,0 +1,34 @@
1
+ import abc
2
+ import typing as ta
3
+
4
+ from omlish import lang
5
+
6
+
7
+ ##
8
+
9
+
10
+ class UiMessageDisplayer(lang.Abstract):
11
+ @abc.abstractmethod
12
+ def display_ui_message(self, content: str) -> ta.Awaitable[None]:
13
+ pass
14
+
15
+
16
+ class NopUiMessageDisplayer(UiMessageDisplayer):
17
+ async def display_ui_message(self, content: str) -> None:
18
+ pass
19
+
20
+
21
+ class PrintMessageDisplayer(UiMessageDisplayer):
22
+ async def display_ui_message(self, content: str) -> None:
23
+ print(content)
24
+
25
+
26
+ ##
27
+
28
+
29
+ class UiQuitSignal(lang.Func0[ta.Awaitable[None]]):
30
+ pass
31
+
32
+
33
+ async def raise_system_exit_ui_quit_signal() -> None:
34
+ raise SystemExit
@@ -1,66 +1,43 @@
1
- from omlish import dataclasses as dc
2
1
  from omlish import inject as inj
3
2
  from omlish import lang
4
3
 
5
- from ...backends.types import DefaultBackendName
6
4
  from ..base import Session
7
- from .configs import DEFAULT_BACKEND
8
5
  from .configs import ChatConfig
9
6
 
10
7
 
11
8
  with lang.auto_proxy_import(globals()):
12
- from ...backends import inject as _backends
13
9
  from ...rendering import inject as _rendering
14
- from . import driver as _driver
15
10
  from . import session as _session
16
- from .chat.ai import inject as _chat_ai
17
- from .chat.state import inject as _chat_state
18
- from .chat.user import inject as _chat_user
19
- from .phases import inject as _phases
20
- from .tools import inject as _tools
11
+ from .drivers import inject as _drivers
12
+ from .facades import inject as _facades
13
+ from .interfaces import inject as _interfaces
21
14
 
22
15
 
23
16
  ##
24
17
 
25
18
 
26
- def bind_chat(cfg: ChatConfig) -> inj.Elements:
19
+ def bind_chat(cfg: ChatConfig = ChatConfig()) -> inj.Elements:
27
20
  els: list[inj.Elemental] = []
28
21
 
29
22
  #
30
23
 
31
24
  els.extend([
32
- _backends.bind_backends(cfg.backend),
25
+ _drivers.bind_driver(cfg.driver),
33
26
 
34
- _chat_ai.bind_ai(cfg.ai),
27
+ _facades.bind_facade(cfg.facade),
35
28
 
36
- _chat_user.bind_user(cfg.user),
37
-
38
- _chat_state.bind_state(cfg.state),
39
-
40
- _phases.bind_phases(),
29
+ _interfaces.bind_interface(cfg.interface),
41
30
 
42
31
  _rendering.bind_rendering(cfg.rendering),
43
-
44
- _tools.bind_tools(cfg.tools),
45
32
  ])
46
33
 
47
34
  #
48
35
 
49
36
  els.extend([
50
- inj.bind(_driver.ChatDriver, singleton=True),
51
- ])
52
-
53
- #
54
-
55
- els.extend([
56
- inj.bind(_session.ChatSession.Config(**dc.asdict(cfg))),
37
+ # inj.bind(cfg), # NOTE: *not* done - the code is properly structured around not needing it.
57
38
  inj.bind(Session, to_ctor=_session.ChatSession, singleton=True),
58
39
  ])
59
40
 
60
41
  #
61
42
 
62
- els.append(inj.bind(DefaultBackendName, to_const=DEFAULT_BACKEND))
63
-
64
- #
65
-
66
43
  return inj.as_elements(*els)
File without changes
File without changes
@@ -0,0 +1,15 @@
1
+ import typing as ta
2
+
3
+ from omlish import dataclasses as dc
4
+
5
+ from ..configs import InterfaceConfig
6
+
7
+
8
+ ##
9
+
10
+
11
+ @dc.dataclass(frozen=True, kw_only=True)
12
+ class BareInterfaceConfig(InterfaceConfig):
13
+ interactive: bool = False
14
+
15
+ use_readline: bool | ta.Literal['auto'] = 'auto'
@@ -0,0 +1,69 @@
1
+ from omlish import inject as inj
2
+ from omlish import lang
3
+
4
+ from ..base import ChatInterface
5
+ from .configs import BareInterfaceConfig
6
+
7
+
8
+ with lang.auto_proxy_import(globals()):
9
+ from .....inputs import asyncs as _inputs_asyncs
10
+ from .....inputs import sync as _inputs_sync
11
+ from ...drivers.tools import confirmation as _tools_confirmation
12
+ from ...facades import ui as _facades_ui
13
+ from . import interactive as _interactive
14
+ from . import oneshot as _oneshot
15
+ from . import tools as _tools
16
+
17
+
18
+ ##
19
+
20
+
21
+ def bind_bare(cfg: BareInterfaceConfig = BareInterfaceConfig()) -> inj.Elements:
22
+ els: list[inj.Elemental] = []
23
+
24
+ #
25
+
26
+ if cfg.interactive:
27
+ els.extend([
28
+ inj.bind(_interactive.InteractiveBareChatInterface, singleton=True),
29
+ inj.bind(ChatInterface, to_key=_interactive.InteractiveBareChatInterface),
30
+ ])
31
+
32
+ els.extend([
33
+ inj.bind(_inputs_sync.SyncStringInput, to_const=_inputs_sync.InputSyncStringInput(use_readline=cfg.use_readline)), # noqa
34
+ inj.bind(_inputs_asyncs.AsyncStringInput, to_ctor=_inputs_asyncs.ThreadAsyncStringInput, singleton=True),
35
+ ])
36
+
37
+ else:
38
+ els.extend([
39
+ inj.bind(_oneshot.OneshotBareChatInterface, singleton=True),
40
+ inj.bind(ChatInterface, to_key=_oneshot.OneshotBareChatInterface),
41
+ ])
42
+
43
+ #
44
+
45
+ if cfg.enable_tools:
46
+ if cfg.dangerous_no_tool_confirmation:
47
+ els.append(inj.bind(
48
+ _tools_confirmation.ToolExecutionConfirmation,
49
+ to_ctor=_tools_confirmation.UnsafeAlwaysAllowToolExecutionConfirmation,
50
+ singleton=True,
51
+ ))
52
+
53
+ else:
54
+ els.append(inj.bind(
55
+ _tools_confirmation.ToolExecutionConfirmation,
56
+ to_ctor=_tools.InteractiveToolExecutionConfirmation,
57
+ singleton=True,
58
+ ))
59
+
60
+ #
61
+
62
+ els.extend([
63
+ inj.bind(_facades_ui.PrintMessageDisplayer, singleton=True),
64
+ inj.bind(_facades_ui.UiMessageDisplayer, to_key=_facades_ui.PrintMessageDisplayer),
65
+ ])
66
+
67
+ #
68
+
69
+ return inj.as_elements(*els)
@@ -0,0 +1,49 @@
1
+ import typing as ta
2
+
3
+ from .....inputs.asyncs import AsyncStringInput
4
+ from .....inputs.asyncs import SyncAsyncStringInput
5
+ from .....inputs.sync import InputSyncStringInput
6
+ from ...drivers.types import ChatDriver
7
+ from ...facades.facade import ChatFacade
8
+ from ..base import ChatInterface
9
+
10
+
11
+ ##
12
+
13
+
14
+ class InteractiveBareChatInterface(ChatInterface):
15
+ DEFAULT_STRING_INPUT: ta.ClassVar[AsyncStringInput] = SyncAsyncStringInput(InputSyncStringInput())
16
+
17
+ def __init__(
18
+ self,
19
+ *,
20
+ driver: ChatDriver,
21
+ facade: ChatFacade,
22
+ string_input: AsyncStringInput | None = None,
23
+ ) -> None:
24
+ super().__init__()
25
+
26
+ self._driver = driver
27
+ self._facade = facade
28
+ if string_input is None:
29
+ string_input = self.DEFAULT_STRING_INPUT
30
+ self._string_input = string_input
31
+
32
+ async def run(self) -> None:
33
+ await self._driver.start()
34
+
35
+ while True:
36
+ try:
37
+ s = await self._string_input()
38
+ except EOFError:
39
+ break
40
+
41
+ print()
42
+ print('<')
43
+ print()
44
+
45
+ await self._facade.handle_user_input(s)
46
+
47
+ print()
48
+
49
+ await self._driver.stop()
@@ -0,0 +1,21 @@
1
+ from ...drivers.types import ChatDriver
2
+ from ..base import ChatInterface
3
+
4
+
5
+ ##
6
+
7
+
8
+ class OneshotBareChatInterface(ChatInterface):
9
+ def __init__(
10
+ self,
11
+ *,
12
+ driver: ChatDriver,
13
+ ) -> None:
14
+ super().__init__()
15
+
16
+ self._driver = driver
17
+
18
+ async def run(self) -> None:
19
+ await self._driver.start()
20
+
21
+ await self._driver.stop()
@@ -1,28 +1,9 @@
1
- import abc
2
- import typing as ta
3
-
4
- from omlish import lang
5
1
  from omlish.formats import json
6
2
  from omlish.term.confirm import confirm_action
7
3
 
8
- from ..... import minichain as mc
9
-
10
-
11
- ##
12
-
13
-
14
- class ToolExecutionRequestDeniedError(Exception):
15
- pass
16
-
17
-
18
- class ToolExecutionConfirmation(lang.Abstract):
19
- @abc.abstractmethod
20
- def confirm_tool_execution_or_raise(
21
- self,
22
- use: 'mc.ToolUse',
23
- entry: 'mc.ToolCatalogEntry',
24
- ) -> ta.Awaitable[None]:
25
- raise NotImplementedError
4
+ from ...... import minichain as mc
5
+ from ...drivers.tools.confirmation import ToolExecutionConfirmation
6
+ from ...drivers.tools.confirmation import ToolExecutionRequestDeniedError
26
7
 
27
8
 
28
9
  ##
@@ -0,0 +1,13 @@
1
+ import abc
2
+ import typing as ta
3
+
4
+ from omlish import lang
5
+
6
+
7
+ ##
8
+
9
+
10
+ class ChatInterface(lang.Abstract):
11
+ @abc.abstractmethod
12
+ def run(self) -> ta.Awaitable[None]:
13
+ raise NotImplementedError
@@ -0,0 +1,11 @@
1
+ from omlish import dataclasses as dc
2
+ from omlish import lang
3
+
4
+
5
+ ##
6
+
7
+
8
+ @dc.dataclass(frozen=True, kw_only=True)
9
+ class InterfaceConfig(lang.Abstract):
10
+ enable_tools: bool = False
11
+ dangerous_no_tool_confirmation: bool = False
@@ -0,0 +1,29 @@
1
+ from omlish import inject as inj
2
+ from omlish import lang
3
+
4
+ from .bare.configs import BareInterfaceConfig
5
+ from .configs import InterfaceConfig
6
+ from .textual.configs import TextualInterfaceConfig
7
+
8
+
9
+ with lang.auto_proxy_import(globals()):
10
+ from .bare import inject as _bare
11
+ from .textual import inject as _textual
12
+
13
+
14
+ ##
15
+
16
+
17
+ def bind_interface(cfg: InterfaceConfig = BareInterfaceConfig()) -> inj.Elements:
18
+ els: list[inj.Elemental] = []
19
+
20
+ if isinstance(cfg, TextualInterfaceConfig):
21
+ els.append(_textual.bind_textual(cfg))
22
+
23
+ elif isinstance(cfg, BareInterfaceConfig):
24
+ els.append(_bare.bind_bare(cfg))
25
+
26
+ else:
27
+ raise TypeError(cfg)
28
+
29
+ return inj.as_elements(*els)