ommlds 0.0.0.dev426__py3-none-any.whl → 0.0.0.dev485__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 (295) hide show
  1. ommlds/.omlish-manifests.json +336 -39
  2. ommlds/__about__.py +16 -10
  3. ommlds/_hacks/__init__.py +4 -0
  4. ommlds/_hacks/funcs.py +110 -0
  5. ommlds/_hacks/names.py +158 -0
  6. ommlds/_hacks/params.py +73 -0
  7. ommlds/_hacks/patches.py +0 -3
  8. ommlds/backends/anthropic/protocol/__init__.py +13 -1
  9. ommlds/backends/anthropic/protocol/_dataclasses.py +1625 -0
  10. ommlds/backends/anthropic/protocol/_marshal.py +2 -2
  11. ommlds/backends/anthropic/protocol/sse/_marshal.py +1 -1
  12. ommlds/backends/anthropic/protocol/sse/assemble.py +23 -7
  13. ommlds/backends/anthropic/protocol/sse/events.py +13 -0
  14. ommlds/backends/anthropic/protocol/types.py +40 -8
  15. ommlds/backends/google/protocol/__init__.py +16 -0
  16. ommlds/backends/google/protocol/_dataclasses.py +5997 -0
  17. ommlds/backends/google/protocol/_marshal.py +16 -0
  18. ommlds/backends/google/protocol/types.py +626 -0
  19. ommlds/backends/groq/__init__.py +7 -0
  20. ommlds/backends/groq/_dataclasses.py +3901 -0
  21. ommlds/backends/groq/_marshal.py +23 -0
  22. ommlds/backends/groq/protocol.py +249 -0
  23. ommlds/backends/llamacpp/logging.py +4 -1
  24. ommlds/backends/mlx/caching.py +7 -3
  25. ommlds/backends/mlx/cli.py +10 -7
  26. ommlds/backends/mlx/generation.py +19 -17
  27. ommlds/backends/mlx/limits.py +10 -6
  28. ommlds/backends/mlx/loading.py +65 -5
  29. ommlds/backends/ollama/__init__.py +7 -0
  30. ommlds/backends/ollama/_dataclasses.py +3458 -0
  31. ommlds/backends/ollama/protocol.py +170 -0
  32. ommlds/backends/openai/protocol/__init__.py +24 -29
  33. ommlds/backends/openai/protocol/_common.py +18 -0
  34. ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
  35. ommlds/backends/openai/protocol/_marshal.py +27 -0
  36. ommlds/backends/openai/protocol/chatcompletion/chunk.py +58 -31
  37. ommlds/backends/openai/protocol/chatcompletion/contentpart.py +49 -44
  38. ommlds/backends/openai/protocol/chatcompletion/message.py +55 -43
  39. ommlds/backends/openai/protocol/chatcompletion/request.py +114 -66
  40. ommlds/backends/openai/protocol/chatcompletion/response.py +71 -45
  41. ommlds/backends/openai/protocol/chatcompletion/responseformat.py +27 -20
  42. ommlds/backends/openai/protocol/chatcompletion/tokenlogprob.py +16 -7
  43. ommlds/backends/openai/protocol/completionusage.py +24 -15
  44. ommlds/backends/tavily/__init__.py +7 -0
  45. ommlds/backends/tavily/_dataclasses.py +1734 -0
  46. ommlds/backends/tavily/protocol.py +301 -0
  47. ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
  48. ommlds/backends/transformers/__init__.py +14 -0
  49. ommlds/backends/transformers/filecache.py +109 -0
  50. ommlds/backends/transformers/streamers.py +73 -0
  51. ommlds/cli/__init__.py +7 -0
  52. ommlds/cli/_dataclasses.py +2562 -0
  53. ommlds/cli/asyncs.py +30 -0
  54. ommlds/cli/backends/catalog.py +93 -0
  55. ommlds/cli/backends/configs.py +9 -0
  56. ommlds/cli/backends/inject.py +31 -36
  57. ommlds/cli/backends/injection.py +16 -0
  58. ommlds/cli/backends/types.py +46 -0
  59. ommlds/cli/content/messages.py +34 -0
  60. ommlds/cli/content/strings.py +42 -0
  61. ommlds/cli/inject.py +17 -32
  62. ommlds/cli/inputs/__init__.py +0 -0
  63. ommlds/cli/inputs/asyncs.py +32 -0
  64. ommlds/cli/inputs/sync.py +75 -0
  65. ommlds/cli/main.py +270 -110
  66. ommlds/cli/rendering/__init__.py +0 -0
  67. ommlds/cli/rendering/configs.py +9 -0
  68. ommlds/cli/rendering/inject.py +31 -0
  69. ommlds/cli/rendering/markdown.py +52 -0
  70. ommlds/cli/rendering/raw.py +73 -0
  71. ommlds/cli/rendering/types.py +21 -0
  72. ommlds/cli/secrets.py +21 -0
  73. ommlds/cli/sessions/base.py +1 -1
  74. ommlds/cli/sessions/chat/chat/__init__.py +0 -0
  75. ommlds/cli/sessions/chat/chat/ai/__init__.py +0 -0
  76. ommlds/cli/sessions/chat/chat/ai/configs.py +11 -0
  77. ommlds/cli/sessions/chat/chat/ai/inject.py +74 -0
  78. ommlds/cli/sessions/chat/chat/ai/injection.py +14 -0
  79. ommlds/cli/sessions/chat/chat/ai/rendering.py +70 -0
  80. ommlds/cli/sessions/chat/chat/ai/services.py +79 -0
  81. ommlds/cli/sessions/chat/chat/ai/tools.py +44 -0
  82. ommlds/cli/sessions/chat/chat/ai/types.py +28 -0
  83. ommlds/cli/sessions/chat/chat/state/__init__.py +0 -0
  84. ommlds/cli/sessions/chat/chat/state/configs.py +11 -0
  85. ommlds/cli/sessions/chat/chat/state/inject.py +36 -0
  86. ommlds/cli/sessions/chat/chat/state/inmemory.py +33 -0
  87. ommlds/cli/sessions/chat/chat/state/storage.py +52 -0
  88. ommlds/cli/sessions/chat/chat/state/types.py +38 -0
  89. ommlds/cli/sessions/chat/chat/user/__init__.py +0 -0
  90. ommlds/cli/sessions/chat/chat/user/configs.py +17 -0
  91. ommlds/cli/sessions/chat/chat/user/inject.py +62 -0
  92. ommlds/cli/sessions/chat/chat/user/interactive.py +31 -0
  93. ommlds/cli/sessions/chat/chat/user/oneshot.py +25 -0
  94. ommlds/cli/sessions/chat/chat/user/types.py +15 -0
  95. ommlds/cli/sessions/chat/configs.py +27 -0
  96. ommlds/cli/sessions/chat/driver.py +43 -0
  97. ommlds/cli/sessions/chat/inject.py +33 -65
  98. ommlds/cli/sessions/chat/phases/__init__.py +0 -0
  99. ommlds/cli/sessions/chat/phases/inject.py +27 -0
  100. ommlds/cli/sessions/chat/phases/injection.py +14 -0
  101. ommlds/cli/sessions/chat/phases/manager.py +29 -0
  102. ommlds/cli/sessions/chat/phases/types.py +29 -0
  103. ommlds/cli/sessions/chat/session.py +27 -0
  104. ommlds/cli/sessions/chat/tools/__init__.py +0 -0
  105. ommlds/cli/sessions/chat/tools/configs.py +22 -0
  106. ommlds/cli/sessions/chat/tools/confirmation.py +46 -0
  107. ommlds/cli/sessions/chat/tools/execution.py +66 -0
  108. ommlds/cli/sessions/chat/tools/fs/__init__.py +0 -0
  109. ommlds/cli/sessions/chat/tools/fs/configs.py +12 -0
  110. ommlds/cli/sessions/chat/tools/fs/inject.py +35 -0
  111. ommlds/cli/sessions/chat/tools/inject.py +88 -0
  112. ommlds/cli/sessions/chat/tools/injection.py +44 -0
  113. ommlds/cli/sessions/chat/tools/rendering.py +58 -0
  114. ommlds/cli/sessions/chat/tools/todo/__init__.py +0 -0
  115. ommlds/cli/sessions/chat/tools/todo/configs.py +12 -0
  116. ommlds/cli/sessions/chat/tools/todo/inject.py +31 -0
  117. ommlds/cli/sessions/chat/tools/weather/__init__.py +0 -0
  118. ommlds/cli/sessions/chat/tools/weather/configs.py +12 -0
  119. ommlds/cli/sessions/chat/tools/weather/inject.py +22 -0
  120. ommlds/cli/{tools/weather.py → sessions/chat/tools/weather/tools.py} +1 -1
  121. ommlds/cli/sessions/completion/configs.py +21 -0
  122. ommlds/cli/sessions/completion/inject.py +42 -0
  123. ommlds/cli/sessions/completion/session.py +35 -0
  124. ommlds/cli/sessions/embedding/configs.py +21 -0
  125. ommlds/cli/sessions/embedding/inject.py +42 -0
  126. ommlds/cli/sessions/embedding/session.py +33 -0
  127. ommlds/cli/sessions/inject.py +28 -11
  128. ommlds/cli/state/__init__.py +0 -0
  129. ommlds/cli/state/inject.py +28 -0
  130. ommlds/cli/{state.py → state/storage.py} +41 -24
  131. ommlds/minichain/__init__.py +84 -24
  132. ommlds/minichain/_dataclasses.py +15401 -0
  133. ommlds/minichain/_marshal.py +49 -9
  134. ommlds/minichain/_typedvalues.py +2 -4
  135. ommlds/minichain/backends/catalogs/base.py +20 -1
  136. ommlds/minichain/backends/catalogs/simple.py +2 -2
  137. ommlds/minichain/backends/catalogs/strings.py +10 -8
  138. ommlds/minichain/backends/impls/anthropic/chat.py +65 -27
  139. ommlds/minichain/backends/impls/anthropic/names.py +10 -8
  140. ommlds/minichain/backends/impls/anthropic/protocol.py +109 -0
  141. ommlds/minichain/backends/impls/anthropic/stream.py +111 -43
  142. ommlds/minichain/backends/impls/duckduckgo/search.py +6 -2
  143. ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
  144. ommlds/minichain/backends/impls/dummy/chat.py +69 -0
  145. ommlds/minichain/backends/impls/google/chat.py +114 -22
  146. ommlds/minichain/backends/impls/google/search.py +7 -2
  147. ommlds/minichain/backends/impls/google/stream.py +219 -0
  148. ommlds/minichain/backends/impls/google/tools.py +149 -0
  149. ommlds/minichain/backends/impls/groq/__init__.py +0 -0
  150. ommlds/minichain/backends/impls/groq/chat.py +75 -0
  151. ommlds/minichain/backends/impls/groq/names.py +48 -0
  152. ommlds/minichain/backends/impls/groq/protocol.py +143 -0
  153. ommlds/minichain/backends/impls/groq/stream.py +125 -0
  154. ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
  155. ommlds/minichain/backends/impls/llamacpp/chat.py +40 -22
  156. ommlds/minichain/backends/impls/llamacpp/completion.py +9 -5
  157. ommlds/minichain/backends/impls/llamacpp/format.py +4 -2
  158. ommlds/minichain/backends/impls/llamacpp/stream.py +43 -23
  159. ommlds/minichain/backends/impls/mistral.py +20 -5
  160. ommlds/minichain/backends/impls/mlx/chat.py +101 -24
  161. ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
  162. ommlds/minichain/backends/impls/ollama/chat.py +199 -0
  163. ommlds/minichain/backends/impls/openai/chat.py +18 -8
  164. ommlds/minichain/backends/impls/openai/completion.py +10 -3
  165. ommlds/minichain/backends/impls/openai/embedding.py +10 -3
  166. ommlds/minichain/backends/impls/openai/format.py +131 -106
  167. ommlds/minichain/backends/impls/openai/names.py +31 -5
  168. ommlds/minichain/backends/impls/openai/stream.py +43 -25
  169. ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
  170. ommlds/minichain/backends/impls/tavily.py +66 -0
  171. ommlds/minichain/backends/impls/tinygrad/chat.py +30 -20
  172. ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
  173. ommlds/minichain/backends/impls/transformers/sentence.py +6 -3
  174. ommlds/minichain/backends/impls/transformers/tokens.py +10 -7
  175. ommlds/minichain/backends/impls/transformers/transformers.py +160 -37
  176. ommlds/minichain/backends/strings/parsing.py +1 -1
  177. ommlds/minichain/backends/strings/resolving.py +4 -1
  178. ommlds/minichain/chat/_marshal.py +16 -9
  179. ommlds/minichain/chat/choices/adapters.py +4 -4
  180. ommlds/minichain/chat/choices/services.py +1 -1
  181. ommlds/minichain/chat/choices/stream/__init__.py +0 -0
  182. ommlds/minichain/chat/choices/stream/adapters.py +35 -0
  183. ommlds/minichain/chat/choices/stream/joining.py +31 -0
  184. ommlds/minichain/chat/choices/stream/services.py +45 -0
  185. ommlds/minichain/chat/choices/stream/types.py +43 -0
  186. ommlds/minichain/chat/choices/types.py +2 -2
  187. ommlds/minichain/chat/history.py +3 -3
  188. ommlds/minichain/chat/messages.py +55 -19
  189. ommlds/minichain/chat/services.py +3 -3
  190. ommlds/minichain/chat/stream/_marshal.py +16 -0
  191. ommlds/minichain/chat/stream/joining.py +85 -0
  192. ommlds/minichain/chat/stream/services.py +15 -21
  193. ommlds/minichain/chat/stream/types.py +32 -19
  194. ommlds/minichain/chat/tools/execution.py +8 -7
  195. ommlds/minichain/chat/tools/ids.py +9 -15
  196. ommlds/minichain/chat/tools/parsing.py +17 -26
  197. ommlds/minichain/chat/transforms/base.py +29 -38
  198. ommlds/minichain/chat/transforms/metadata.py +30 -4
  199. ommlds/minichain/chat/transforms/services.py +9 -11
  200. ommlds/minichain/content/_marshal.py +44 -20
  201. ommlds/minichain/content/json.py +13 -0
  202. ommlds/minichain/content/materialize.py +14 -21
  203. ommlds/minichain/content/prepare.py +4 -0
  204. ommlds/minichain/content/transforms/interleave.py +1 -1
  205. ommlds/minichain/content/transforms/squeeze.py +1 -1
  206. ommlds/minichain/content/transforms/stringify.py +1 -1
  207. ommlds/minichain/json.py +20 -0
  208. ommlds/minichain/lib/code/__init__.py +0 -0
  209. ommlds/minichain/lib/code/prompts.py +6 -0
  210. ommlds/minichain/lib/fs/binfiles.py +108 -0
  211. ommlds/minichain/lib/fs/context.py +126 -0
  212. ommlds/minichain/lib/fs/errors.py +101 -0
  213. ommlds/minichain/lib/fs/suggestions.py +36 -0
  214. ommlds/minichain/lib/fs/tools/__init__.py +0 -0
  215. ommlds/minichain/lib/fs/tools/edit.py +104 -0
  216. ommlds/minichain/lib/fs/tools/ls.py +38 -0
  217. ommlds/minichain/lib/fs/tools/read.py +115 -0
  218. ommlds/minichain/lib/fs/tools/recursivels/__init__.py +0 -0
  219. ommlds/minichain/lib/fs/tools/recursivels/execution.py +40 -0
  220. ommlds/minichain/lib/todo/__init__.py +0 -0
  221. ommlds/minichain/lib/todo/context.py +54 -0
  222. ommlds/minichain/lib/todo/tools/__init__.py +0 -0
  223. ommlds/minichain/lib/todo/tools/read.py +44 -0
  224. ommlds/minichain/lib/todo/tools/write.py +335 -0
  225. ommlds/minichain/lib/todo/types.py +60 -0
  226. ommlds/minichain/llms/_marshal.py +25 -17
  227. ommlds/minichain/llms/types.py +4 -0
  228. ommlds/minichain/registries/globals.py +18 -4
  229. ommlds/minichain/resources.py +68 -45
  230. ommlds/minichain/search.py +1 -1
  231. ommlds/minichain/services/_marshal.py +46 -39
  232. ommlds/minichain/services/facades.py +3 -3
  233. ommlds/minichain/services/services.py +1 -1
  234. ommlds/minichain/standard.py +8 -0
  235. ommlds/minichain/stream/services.py +152 -38
  236. ommlds/minichain/stream/wrap.py +22 -24
  237. ommlds/minichain/text/toolparsing/llamacpp/hermes2.py +3 -2
  238. ommlds/minichain/text/toolparsing/llamacpp/llama31.py +3 -2
  239. ommlds/minichain/text/toolparsing/llamacpp/utils.py +3 -2
  240. ommlds/minichain/tools/_marshal.py +1 -1
  241. ommlds/minichain/tools/execution/catalog.py +2 -1
  242. ommlds/minichain/tools/execution/context.py +34 -14
  243. ommlds/minichain/tools/execution/errors.py +15 -0
  244. ommlds/minichain/tools/execution/executors.py +8 -3
  245. ommlds/minichain/tools/execution/reflect.py +40 -5
  246. ommlds/minichain/tools/fns.py +46 -9
  247. ommlds/minichain/tools/jsonschema.py +14 -5
  248. ommlds/minichain/tools/reflect.py +54 -18
  249. ommlds/minichain/tools/types.py +33 -1
  250. ommlds/minichain/utils.py +27 -0
  251. ommlds/minichain/vectors/_marshal.py +11 -10
  252. ommlds/minichain/vectors/types.py +1 -1
  253. ommlds/nanochat/LICENSE +21 -0
  254. ommlds/nanochat/__init__.py +0 -0
  255. ommlds/nanochat/rustbpe/LICENSE +21 -0
  256. ommlds/nanochat/tokenizers.py +406 -0
  257. ommlds/server/cli.py +1 -2
  258. ommlds/server/server.py +5 -5
  259. ommlds/server/service.py +1 -1
  260. ommlds/specs/__init__.py +0 -0
  261. ommlds/specs/mcp/__init__.py +0 -0
  262. ommlds/specs/mcp/_marshal.py +23 -0
  263. ommlds/specs/mcp/clients.py +146 -0
  264. ommlds/specs/mcp/protocol.py +371 -0
  265. ommlds/tools/git.py +35 -12
  266. ommlds/tools/ocr.py +8 -9
  267. ommlds/wiki/analyze.py +6 -7
  268. ommlds/wiki/text/mfh.py +1 -5
  269. ommlds/wiki/text/wtp.py +1 -3
  270. ommlds/wiki/utils/xml.py +5 -5
  271. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/METADATA +24 -21
  272. ommlds-0.0.0.dev485.dist-info/RECORD +436 -0
  273. ommlds/cli/backends/standard.py +0 -20
  274. ommlds/cli/sessions/chat/base.py +0 -42
  275. ommlds/cli/sessions/chat/interactive.py +0 -73
  276. ommlds/cli/sessions/chat/printing.py +0 -96
  277. ommlds/cli/sessions/chat/prompt.py +0 -143
  278. ommlds/cli/sessions/chat/state.py +0 -109
  279. ommlds/cli/sessions/chat/tools.py +0 -91
  280. ommlds/cli/sessions/completion/completion.py +0 -44
  281. ommlds/cli/sessions/embedding/embedding.py +0 -42
  282. ommlds/cli/tools/config.py +0 -13
  283. ommlds/cli/tools/inject.py +0 -64
  284. ommlds/minichain/chat/stream/adapters.py +0 -69
  285. ommlds/minichain/lib/fs/ls/execution.py +0 -32
  286. ommlds-0.0.0.dev426.dist-info/RECORD +0 -303
  287. /ommlds/{cli/tools → backends/google}/__init__.py +0 -0
  288. /ommlds/{huggingface.py → backends/huggingface.py} +0 -0
  289. /ommlds/{minichain/lib/fs/ls → cli/content}/__init__.py +0 -0
  290. /ommlds/minichain/lib/fs/{ls → tools/recursivels}/rendering.py +0 -0
  291. /ommlds/minichain/lib/fs/{ls → tools/recursivels}/running.py +0 -0
  292. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/WHEEL +0 -0
  293. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/entry_points.txt +0 -0
  294. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/licenses/LICENSE +0 -0
  295. {ommlds-0.0.0.dev426.dist-info → ommlds-0.0.0.dev485.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,12 @@
1
+ from omlish import dataclasses as dc
2
+ from omlish import lang
3
+
4
+ from ..configs import ToolSetConfig
5
+
6
+
7
+ ##
8
+
9
+
10
+ @dc.dataclass(frozen=True, kw_only=True)
11
+ class TodoToolSetConfig(ToolSetConfig, lang.Final):
12
+ pass
@@ -0,0 +1,31 @@
1
+ from omlish import inject as inj
2
+
3
+ from ..injection import ToolSetBinder
4
+ from ..injection import bind_tool_context_provider_to_key
5
+ from ..injection import tool_catalog_entries
6
+ from .configs import TodoToolSetConfig
7
+
8
+
9
+ ##
10
+
11
+
12
+ def bind_todo_tools(cfg: TodoToolSetConfig) -> inj.Elements:
13
+ from ......minichain.lib.todo.context import TodoContext
14
+ from ......minichain.lib.todo.tools.read import todo_read_tool
15
+ from ......minichain.lib.todo.tools.write import todo_write_tool
16
+
17
+ return inj.as_elements(
18
+ tool_catalog_entries().bind_item_consts(
19
+ todo_read_tool(),
20
+ todo_write_tool(),
21
+ ),
22
+
23
+ inj.bind(TodoContext()),
24
+ bind_tool_context_provider_to_key(TodoContext),
25
+ )
26
+
27
+
28
+ ##
29
+
30
+
31
+ TODO_TOOL_SET_BINDER = ToolSetBinder(TodoToolSetConfig, bind_todo_tools)
File without changes
@@ -0,0 +1,12 @@
1
+ from omlish import dataclasses as dc
2
+ from omlish import lang
3
+
4
+ from ..configs import ToolSetConfig
5
+
6
+
7
+ ##
8
+
9
+
10
+ @dc.dataclass(frozen=True, kw_only=True)
11
+ class WeatherToolSetConfig(ToolSetConfig, lang.Final):
12
+ pass
@@ -0,0 +1,22 @@
1
+ from omlish import inject as inj
2
+
3
+ from ..injection import ToolSetBinder
4
+ from ..injection import tool_catalog_entries
5
+ from .configs import WeatherToolSetConfig
6
+
7
+
8
+ ##
9
+
10
+
11
+ def bind_weather_tools(cfg: WeatherToolSetConfig) -> inj.Elements:
12
+ from .tools import WEATHER_TOOL
13
+
14
+ return inj.as_elements(
15
+ tool_catalog_entries().bind_item_consts(WEATHER_TOOL),
16
+ )
17
+
18
+
19
+ ##
20
+
21
+
22
+ WEATHER_TOOL_SET_BINDER = ToolSetBinder(WeatherToolSetConfig, bind_weather_tools)
@@ -1,4 +1,4 @@
1
- from ... import minichain as mc
1
+ from ...... import minichain as mc
2
2
 
3
3
 
4
4
  ##
@@ -0,0 +1,21 @@
1
+ from omlish import dataclasses as dc
2
+
3
+ from .... import minichain as mc
4
+
5
+
6
+ ##
7
+
8
+
9
+ DEFAULT_BACKEND = 'openai'
10
+
11
+
12
+ ##
13
+
14
+
15
+ @dc.dataclass(frozen=True)
16
+ class CompletionConfig:
17
+ content: 'mc.Content'
18
+
19
+ _: dc.KW_ONLY
20
+
21
+ backend: str | None = None
@@ -0,0 +1,42 @@
1
+ from omlish import dataclasses as dc
2
+ from omlish import inject as inj
3
+ from omlish import lang
4
+
5
+ from ...backends.configs import BackendConfig
6
+ from ...backends.types import DefaultBackendName
7
+ from ..base import Session
8
+ from .configs import DEFAULT_BACKEND
9
+ from .configs import CompletionConfig
10
+
11
+
12
+ with lang.auto_proxy_import(globals()):
13
+ from ...backends import inject as _backends
14
+ from . import session as _session
15
+
16
+
17
+ ##
18
+
19
+
20
+ def bind_completion(cfg: CompletionConfig) -> inj.Elements:
21
+ els: list[inj.Elemental] = []
22
+
23
+ #
24
+
25
+ els.extend([
26
+ inj.bind(_session.CompletionSession.Config(**dc.asdict(cfg))),
27
+ inj.bind(Session, to_ctor=_session.CompletionSession, singleton=True),
28
+ ])
29
+
30
+ #
31
+
32
+ els.extend([
33
+ _backends.bind_backends(BackendConfig(
34
+ backend=cfg.backend,
35
+ )),
36
+
37
+ inj.bind(DefaultBackendName, to_const=DEFAULT_BACKEND),
38
+ ])
39
+
40
+ #
41
+
42
+ return inj.as_elements(*els)
@@ -0,0 +1,35 @@
1
+ from omlish import check
2
+ from omlish import dataclasses as dc
3
+
4
+ from .... import minichain as mc
5
+ from ...backends.types import CompletionServiceBackendProvider
6
+ from ..base import Session
7
+ from .configs import CompletionConfig
8
+
9
+
10
+ ##
11
+
12
+
13
+ class CompletionSession(Session['CompletionSession.Config']):
14
+ @dc.dataclass(frozen=True)
15
+ class Config(Session.Config, CompletionConfig):
16
+ pass
17
+
18
+ def __init__(
19
+ self,
20
+ config: Config,
21
+ *,
22
+ service_provider: CompletionServiceBackendProvider,
23
+ ) -> None:
24
+ super().__init__(config)
25
+
26
+ self._service_provider = service_provider
27
+
28
+ async def run(self) -> None:
29
+ prompt = check.isinstance(self._config.content, str)
30
+
31
+ mdl: mc.CompletionService
32
+ async with self._service_provider.provide_backend() as mdl:
33
+ response = await mdl.invoke(mc.CompletionRequest(prompt))
34
+
35
+ print(response.v.strip())
@@ -0,0 +1,21 @@
1
+ from omlish import dataclasses as dc
2
+
3
+ from .... import minichain as mc
4
+
5
+
6
+ ##
7
+
8
+
9
+ DEFAULT_BACKEND = 'openai'
10
+
11
+
12
+ ##
13
+
14
+
15
+ @dc.dataclass(frozen=True)
16
+ class EmbeddingConfig:
17
+ content: 'mc.Content'
18
+
19
+ _: dc.KW_ONLY
20
+
21
+ backend: str | None = None
@@ -0,0 +1,42 @@
1
+ from omlish import dataclasses as dc
2
+ from omlish import inject as inj
3
+ from omlish import lang
4
+
5
+ from ...backends.configs import BackendConfig
6
+ from ...backends.types import DefaultBackendName
7
+ from ..base import Session
8
+ from .configs import DEFAULT_BACKEND
9
+ from .configs import EmbeddingConfig
10
+
11
+
12
+ with lang.auto_proxy_import(globals()):
13
+ from ...backends import inject as _backends
14
+ from . import session as _session
15
+
16
+
17
+ ##
18
+
19
+
20
+ def bind_embedding(cfg: EmbeddingConfig) -> inj.Elements:
21
+ els: list[inj.Elemental] = []
22
+
23
+ #
24
+
25
+ els.extend([
26
+ inj.bind(_session.EmbeddingSession.Config(**dc.asdict(cfg))),
27
+ inj.bind(Session, to_ctor=_session.EmbeddingSession, singleton=True),
28
+ ])
29
+
30
+ #
31
+
32
+ els.extend([
33
+ _backends.bind_backends(BackendConfig(
34
+ backend=cfg.backend,
35
+ )),
36
+
37
+ inj.bind(DefaultBackendName, to_const=DEFAULT_BACKEND),
38
+ ])
39
+
40
+ #
41
+
42
+ return inj.as_elements(*els)
@@ -0,0 +1,33 @@
1
+ from omlish import dataclasses as dc
2
+ from omlish.formats import json
3
+
4
+ from .... import minichain as mc
5
+ from ...backends.types import EmbeddingServiceBackendProvider
6
+ from ..base import Session
7
+ from .configs import EmbeddingConfig
8
+
9
+
10
+ ##
11
+
12
+
13
+ class EmbeddingSession(Session['EmbeddingSession.Config']):
14
+ @dc.dataclass(frozen=True)
15
+ class Config(Session.Config, EmbeddingConfig):
16
+ pass
17
+
18
+ def __init__(
19
+ self,
20
+ config: Config,
21
+ *,
22
+ service_provider: EmbeddingServiceBackendProvider,
23
+ ) -> None:
24
+ super().__init__(config)
25
+
26
+ self._service_provider = service_provider
27
+
28
+ async def run(self) -> None:
29
+ mdl: mc.EmbeddingService
30
+ async with self._service_provider.provide_backend() as mdl:
31
+ response = await mdl.invoke(mc.EmbeddingRequest(self._config.content))
32
+
33
+ print(json.dumps_compact(list(map(float, response.v))))
@@ -1,21 +1,38 @@
1
+ import typing as ta
2
+
1
3
  from omlish import inject as inj
4
+ from omlish import lang
5
+
2
6
 
3
- from .base import Session
4
- from .chat.base import ChatSession
5
- from .chat.inject import bind_chat_session
7
+ with lang.auto_proxy_import(globals()):
8
+ from .chat import configs as _chat_cfgs
9
+ from .chat import inject as _chat_inj
10
+ from .completion import configs as _completion_cfgs
11
+ from .completion import inject as _completion_inj
12
+ from .embedding import configs as _embedding_cfgs
13
+ from .embedding import inject as _embedding_inj
6
14
 
7
15
 
8
16
  ##
9
17
 
10
18
 
11
- def bind_sessions(session_cfg: Session.Config) -> inj.Elements:
12
- els: list[inj.Elemental] = [
13
- inj.bind(session_cfg),
14
- inj.bind(session_cfg.configurable_cls, singleton=True),
15
- inj.bind(Session, to_key=session_cfg.configurable_cls),
16
- ]
19
+ def bind_sessions(cfg: ta.Any) -> inj.Elements:
20
+ els: list[inj.Elemental] = []
21
+
22
+ #
23
+
24
+ if isinstance(cfg, _chat_cfgs.ChatConfig):
25
+ els.append(_chat_inj.bind_chat(cfg))
26
+
27
+ elif isinstance(cfg, _completion_cfgs.CompletionConfig):
28
+ els.append(_completion_inj.bind_completion(cfg))
29
+
30
+ elif isinstance(cfg, _embedding_cfgs.EmbeddingConfig):
31
+ els.append(_embedding_inj.bind_embedding(cfg))
32
+
33
+ else:
34
+ raise TypeError(cfg)
17
35
 
18
- if isinstance(session_cfg, ChatSession.Config):
19
- els.append(bind_chat_session(session_cfg))
36
+ #
20
37
 
21
38
  return inj.as_elements(*els)
File without changes
@@ -0,0 +1,28 @@
1
+ import os.path
2
+
3
+ from omdev.home.paths import get_home_paths
4
+ from omlish import inject as inj
5
+ from omlish import lang
6
+
7
+
8
+ with lang.auto_proxy_import(globals()):
9
+ from . import storage as _storage
10
+
11
+
12
+ ##
13
+
14
+
15
+ def _provide_state_storage() -> '_storage.StateStorage':
16
+ state_dir = os.path.join(get_home_paths().state_dir, 'minichain', 'cli')
17
+ if not os.path.exists(state_dir):
18
+ os.makedirs(state_dir, exist_ok=True)
19
+ os.chmod(state_dir, 0o770) # noqa
20
+
21
+ state_file = os.path.join(state_dir, 'state.json')
22
+ return _storage.JsonFileStateStorage(state_file)
23
+
24
+
25
+ def bind_state() -> inj.Elements:
26
+ return inj.as_elements(
27
+ inj.bind(_provide_state_storage, singleton=True),
28
+ )
@@ -1,8 +1,8 @@
1
1
  import abc
2
- import dataclasses as dc
3
2
  import os.path
4
3
  import typing as ta
5
4
 
5
+ from omlish import dataclasses as dc
6
6
  from omlish import lang
7
7
  from omlish import marshal as msh
8
8
  from omlish.formats import json
@@ -14,6 +14,38 @@ T = ta.TypeVar('T')
14
14
  ##
15
15
 
16
16
 
17
+ class StateStorage(lang.Abstract):
18
+ @abc.abstractmethod
19
+ def load_state(self, key: str, ty: type[T] | None) -> ta.Awaitable[T | None]:
20
+ raise NotImplementedError
21
+
22
+ @abc.abstractmethod
23
+ def save_state(self, key: str, obj: ta.Any | None, ty: type[T] | None) -> ta.Awaitable[None]:
24
+ raise NotImplementedError
25
+
26
+
27
+ ##
28
+
29
+
30
+ class InMemoryStateStorage(StateStorage):
31
+ def __init__(self) -> None:
32
+ super().__init__()
33
+
34
+ self._dct: dict[str, ta.Any] = {}
35
+
36
+ async def load_state(self, key: str, ty: type[T] | None) -> T | None:
37
+ return self._dct.get(key)
38
+
39
+ async def save_state(self, key: str, obj: ta.Any | None, ty: type[T] | None) -> None:
40
+ if obj is None:
41
+ self._dct.pop(key, None)
42
+ else:
43
+ self._dct[key] = obj
44
+
45
+
46
+ ##
47
+
48
+
17
49
  STATE_VERSION = 0
18
50
 
19
51
 
@@ -23,10 +55,7 @@ class MarshaledState:
23
55
  payload: ta.Any
24
56
 
25
57
 
26
- #
27
-
28
-
29
- class StateStorage(lang.Abstract):
58
+ class MarshalStateStorage(StateStorage, lang.Abstract):
30
59
  def __init__(
31
60
  self,
32
61
  *,
@@ -36,36 +65,24 @@ class StateStorage(lang.Abstract):
36
65
 
37
66
  self._version = version
38
67
 
39
- #
40
-
41
- def unmarshal_state(self, obj: ta.Any, ty: type[T] | None = None) -> T | None:
68
+ def _unmarshal_state(self, obj: ta.Any, ty: type[T] | None = None) -> T | None:
42
69
  ms = msh.unmarshal(obj, MarshaledState)
43
70
  if ms.version < self._version:
44
71
  return None
45
72
  return msh.unmarshal(ms.payload, ty)
46
73
 
47
- def marshal_state(self, obj: ta.Any, ty: type | None = None) -> ta.Any:
74
+ def _marshal_state(self, obj: ta.Any, ty: type | None = None) -> ta.Any:
48
75
  ms = MarshaledState(
49
76
  version=self._version,
50
77
  payload=msh.marshal(obj, ty),
51
78
  )
52
79
  return msh.marshal(ms)
53
80
 
54
- #
55
-
56
- @abc.abstractmethod
57
- def load_state(self, key: str, ty: type[T] | None) -> T | None:
58
- raise NotImplementedError
59
-
60
- @abc.abstractmethod
61
- def save_state(self, key: str, obj: ta.Any | None, ty: type[T] | None) -> None:
62
- raise NotImplementedError
63
-
64
81
 
65
82
  #
66
83
 
67
84
 
68
- class JsonFileStateStorage(StateStorage):
85
+ class JsonFileStateStorage(MarshalStateStorage):
69
86
  def __init__(
70
87
  self,
71
88
  file: str,
@@ -91,19 +108,19 @@ class JsonFileStateStorage(StateStorage):
91
108
 
92
109
  #
93
110
 
94
- def load_state(self, key: str, ty: type[T] | None) -> T | None:
111
+ async def load_state(self, key: str, ty: type[T] | None) -> T | None:
95
112
  if not (data := self._load_file_data()):
96
113
  return None
97
114
  if (dct := data.get(key)) is None:
98
115
  return None
99
- return self.unmarshal_state(dct, ty)
116
+ return self._unmarshal_state(dct, ty)
100
117
 
101
- def save_state(self, key: str, obj: ta.Any | None, ty: type[T] | None) -> None:
118
+ async def save_state(self, key: str, obj: ta.Any | None, ty: type[T] | None) -> None:
102
119
  if (data := self._load_file_data()) is None:
103
120
  data = {}
104
121
  if obj is None:
105
122
  data.pop(key, None)
106
123
  else:
107
- dct = self.marshal_state(obj, ty)
124
+ dct = self._marshal_state(obj, ty)
108
125
  data[key] = dct
109
126
  self._save_file_data(data)
@@ -65,6 +65,33 @@ with _lang.auto_proxy_init(
65
65
 
66
66
  ##
67
67
 
68
+ from .chat.choices.stream.adapters import ( # noqa
69
+ ChatChoicesStreamServiceChatChoicesService,
70
+ )
71
+
72
+ from .chat.choices.stream.joining import ( # noqa
73
+ AiChoicesDeltaJoiner,
74
+ )
75
+
76
+ from .chat.choices.stream.services import ( # noqa
77
+ ChatChoicesStreamRequest,
78
+ ChatChoicesStreamResponse,
79
+ ChatChoicesStreamService,
80
+ AbstractChatChoicesStreamService,
81
+ static_check_is_chat_choices_stream_service,
82
+ )
83
+
84
+ from .chat.choices.stream.types import ( # noqa
85
+ ChatChoicesStreamOption,
86
+ ChatChoicesStreamOptions,
87
+
88
+ ChatChoicesStreamOutput,
89
+ ChatChoicesStreamOutputs,
90
+
91
+ AiChoiceDeltas,
92
+ AiChoicesDeltas,
93
+ )
94
+
68
95
  from .chat.choices.adapters import ( # noqa
69
96
  ChatChoicesServiceChatService,
70
97
  )
@@ -88,35 +115,31 @@ with _lang.auto_proxy_init(
88
115
  AiChoices,
89
116
  )
90
117
 
91
- from .chat.stream.adapters import ( # noqa
92
- ChatChoicesStreamServiceChatChoicesService,
118
+ from .chat.stream.joining import ( # noqa
119
+ AiDeltaJoiner,
93
120
  )
94
121
 
95
122
  from .chat.stream.services import ( # noqa
96
- ChatChoicesStreamRequest,
97
- ChatChoicesStreamResponse,
98
- ChatChoicesStreamService,
99
- AbstractChatChoicesStreamService,
100
- static_check_is_chat_choices_stream_service,
101
-
102
- ChatChoicesStreamGenerator,
123
+ ChatStreamRequest,
124
+ ChatStreamResponse,
125
+ ChatStreamService,
126
+ AbstractChatStreamService,
127
+ static_check_is_chat_stream_service,
103
128
  )
104
129
 
105
130
  from .chat.stream.types import ( # noqa
106
- ChatChoicesStreamOption,
107
- ChatChoicesStreamOptions,
131
+ AiDelta,
132
+ AiDeltas,
108
133
 
109
- ChatChoicesStreamOutput,
110
- ChatChoicesStreamOutputs,
134
+ ContentAiDelta,
111
135
 
112
- ToolExecRequestDelta,
113
- AiMessageDelta,
114
- AiChoiceDelta,
115
- AiChoiceDeltas,
136
+ AnyToolUseAiDelta,
137
+ ToolUseAiDelta,
138
+ PartialToolUseAiDelta,
116
139
  )
117
140
 
118
141
  from .chat.tools.execution import ( # noqa
119
- execute_tool_request,
142
+ execute_tool_use,
120
143
  )
121
144
 
122
145
  from .chat.transforms.base import ( # noqa
@@ -124,7 +147,6 @@ with _lang.auto_proxy_init(
124
147
  CompositeMessageTransform,
125
148
  FnMessageTransform,
126
149
  TypeFilteredMessageTransform,
127
- fn_message_transform,
128
150
 
129
151
  ChatTransform,
130
152
  CompositeChatTransform,
@@ -155,12 +177,22 @@ with _lang.auto_proxy_init(
155
177
  )
156
178
 
157
179
  from .chat.messages import ( # noqa
158
- AiMessage,
159
- Chat,
160
180
  Message,
181
+ Chat,
182
+
183
+ AnyUserMessage,
184
+ UserChat,
185
+ check_user_chat,
186
+
187
+ AnyAiMessage,
188
+ AiChat,
189
+ check_ai_chat,
190
+
161
191
  SystemMessage,
162
- ToolExecResultMessage,
163
192
  UserMessage,
193
+ AiMessage,
194
+ ToolUseMessage,
195
+ ToolUseResultMessage,
164
196
  )
165
197
 
166
198
  from .chat.services import ( # noqa
@@ -199,8 +231,14 @@ with _lang.auto_proxy_init(
199
231
  ImageContent,
200
232
  )
201
233
 
234
+ from .content.json import ( # noqa
235
+ JsonContent,
236
+ )
237
+
202
238
  from .content.materialize import ( # noqa
203
239
  CanContent,
240
+
241
+ materialize_content,
204
242
  )
205
243
 
206
244
  from .content.metadata import ( # noqa
@@ -270,6 +308,7 @@ with _lang.auto_proxy_init(
270
308
  TopK,
271
309
  Temperature,
272
310
  MaxTokens,
311
+ MaxCompletionTokens,
273
312
 
274
313
  LlmOutput,
275
314
 
@@ -301,6 +340,7 @@ with _lang.auto_proxy_init(
301
340
  ##
302
341
 
303
342
  from .registries.globals import ( # noqa
343
+ get_registry_cls,
304
344
  register_type,
305
345
  registry_new,
306
346
  registry_of,
@@ -322,7 +362,12 @@ with _lang.auto_proxy_init(
322
362
  StreamOption,
323
363
  StreamOptions,
324
364
 
325
- ResponseGenerator,
365
+ StreamResponseSink,
366
+ StreamResponseIterator,
367
+
368
+ StreamServiceCancelledError,
369
+ StreamServiceNotAwaitedError,
370
+
326
371
  StreamResponse,
327
372
  new_stream_response,
328
373
  )
@@ -358,6 +403,10 @@ with _lang.auto_proxy_init(
358
403
  reflect_tool_catalog_entry,
359
404
  )
360
405
 
406
+ from .tools.execution.errors import ( # noqa
407
+ ToolExecutionError,
408
+ )
409
+
361
410
  from .tools.fns import ( # noqa
362
411
  ToolFn,
363
412
 
@@ -394,7 +443,8 @@ with _lang.auto_proxy_init(
394
443
 
395
444
  ToolSpec,
396
445
 
397
- ToolExecRequest,
446
+ ToolUse,
447
+ ToolUseResult,
398
448
  )
399
449
 
400
450
  ##
@@ -486,6 +536,12 @@ with _lang.auto_proxy_init(
486
536
  EnvKey,
487
537
  )
488
538
 
539
+ from .json import ( # noqa
540
+ JsonSchema,
541
+
542
+ JsonValue,
543
+ )
544
+
489
545
  from .metadata import ( # noqa
490
546
  Metadata,
491
547
 
@@ -521,6 +577,10 @@ with _lang.auto_proxy_init(
521
577
  )
522
578
 
523
579
  from .standard import ( # noqa
580
+ Device,
581
+
582
+ ApiUrl,
583
+
524
584
  ApiKey,
525
585
 
526
586
  DefaultOptions,