ommlds 0.0.0.dev456__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 (212) hide show
  1. ommlds/.omlish-manifests.json +314 -33
  2. ommlds/__about__.py +15 -9
  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/sse/assemble.py +22 -6
  11. ommlds/backends/anthropic/protocol/sse/events.py +13 -0
  12. ommlds/backends/google/protocol/__init__.py +13 -0
  13. ommlds/backends/google/protocol/_dataclasses.py +5997 -0
  14. ommlds/backends/google/protocol/types.py +5 -1
  15. ommlds/backends/groq/__init__.py +7 -0
  16. ommlds/backends/groq/_dataclasses.py +3901 -0
  17. ommlds/backends/groq/_marshal.py +23 -0
  18. ommlds/backends/groq/protocol.py +249 -0
  19. ommlds/backends/llamacpp/logging.py +4 -1
  20. ommlds/backends/mlx/caching.py +7 -3
  21. ommlds/backends/mlx/cli.py +10 -7
  22. ommlds/backends/mlx/generation.py +18 -16
  23. ommlds/backends/mlx/limits.py +10 -6
  24. ommlds/backends/mlx/loading.py +65 -5
  25. ommlds/backends/ollama/__init__.py +7 -0
  26. ommlds/backends/ollama/_dataclasses.py +3458 -0
  27. ommlds/backends/ollama/protocol.py +170 -0
  28. ommlds/backends/openai/protocol/__init__.py +15 -1
  29. ommlds/backends/openai/protocol/_dataclasses.py +7708 -0
  30. ommlds/backends/tavily/__init__.py +7 -0
  31. ommlds/backends/tavily/_dataclasses.py +1734 -0
  32. ommlds/backends/tavily/protocol.py +301 -0
  33. ommlds/backends/tinygrad/models/llama3/__init__.py +22 -14
  34. ommlds/backends/transformers/__init__.py +14 -0
  35. ommlds/backends/transformers/filecache.py +109 -0
  36. ommlds/backends/transformers/streamers.py +73 -0
  37. ommlds/cli/__init__.py +7 -0
  38. ommlds/cli/_dataclasses.py +2562 -0
  39. ommlds/cli/asyncs.py +30 -0
  40. ommlds/cli/backends/catalog.py +93 -0
  41. ommlds/cli/backends/configs.py +9 -0
  42. ommlds/cli/backends/inject.py +31 -36
  43. ommlds/cli/backends/injection.py +16 -0
  44. ommlds/cli/backends/types.py +46 -0
  45. ommlds/cli/content/messages.py +34 -0
  46. ommlds/cli/content/strings.py +42 -0
  47. ommlds/cli/inject.py +15 -32
  48. ommlds/cli/inputs/__init__.py +0 -0
  49. ommlds/cli/inputs/asyncs.py +32 -0
  50. ommlds/cli/inputs/sync.py +75 -0
  51. ommlds/cli/main.py +267 -128
  52. ommlds/cli/rendering/__init__.py +0 -0
  53. ommlds/cli/rendering/configs.py +9 -0
  54. ommlds/cli/rendering/inject.py +31 -0
  55. ommlds/cli/rendering/markdown.py +52 -0
  56. ommlds/cli/rendering/raw.py +73 -0
  57. ommlds/cli/rendering/types.py +21 -0
  58. ommlds/cli/secrets.py +21 -0
  59. ommlds/cli/sessions/base.py +1 -1
  60. ommlds/cli/sessions/chat/chat/__init__.py +0 -0
  61. ommlds/cli/sessions/chat/chat/ai/__init__.py +0 -0
  62. ommlds/cli/sessions/chat/chat/ai/configs.py +11 -0
  63. ommlds/cli/sessions/chat/chat/ai/inject.py +74 -0
  64. ommlds/cli/sessions/chat/chat/ai/injection.py +14 -0
  65. ommlds/cli/sessions/chat/chat/ai/rendering.py +70 -0
  66. ommlds/cli/sessions/chat/chat/ai/services.py +79 -0
  67. ommlds/cli/sessions/chat/chat/ai/tools.py +44 -0
  68. ommlds/cli/sessions/chat/chat/ai/types.py +28 -0
  69. ommlds/cli/sessions/chat/chat/state/__init__.py +0 -0
  70. ommlds/cli/sessions/chat/chat/state/configs.py +11 -0
  71. ommlds/cli/sessions/chat/chat/state/inject.py +36 -0
  72. ommlds/cli/sessions/chat/chat/state/inmemory.py +33 -0
  73. ommlds/cli/sessions/chat/chat/state/storage.py +52 -0
  74. ommlds/cli/sessions/chat/chat/state/types.py +38 -0
  75. ommlds/cli/sessions/chat/chat/user/__init__.py +0 -0
  76. ommlds/cli/sessions/chat/chat/user/configs.py +17 -0
  77. ommlds/cli/sessions/chat/chat/user/inject.py +62 -0
  78. ommlds/cli/sessions/chat/chat/user/interactive.py +31 -0
  79. ommlds/cli/sessions/chat/chat/user/oneshot.py +25 -0
  80. ommlds/cli/sessions/chat/chat/user/types.py +15 -0
  81. ommlds/cli/sessions/chat/configs.py +27 -0
  82. ommlds/cli/sessions/chat/driver.py +43 -0
  83. ommlds/cli/sessions/chat/inject.py +33 -65
  84. ommlds/cli/sessions/chat/phases/__init__.py +0 -0
  85. ommlds/cli/sessions/chat/phases/inject.py +27 -0
  86. ommlds/cli/sessions/chat/phases/injection.py +14 -0
  87. ommlds/cli/sessions/chat/phases/manager.py +29 -0
  88. ommlds/cli/sessions/chat/phases/types.py +29 -0
  89. ommlds/cli/sessions/chat/session.py +27 -0
  90. ommlds/cli/sessions/chat/tools/__init__.py +0 -0
  91. ommlds/cli/sessions/chat/tools/configs.py +22 -0
  92. ommlds/cli/sessions/chat/tools/confirmation.py +46 -0
  93. ommlds/cli/sessions/chat/tools/execution.py +66 -0
  94. ommlds/cli/sessions/chat/tools/fs/__init__.py +0 -0
  95. ommlds/cli/sessions/chat/tools/fs/configs.py +12 -0
  96. ommlds/cli/sessions/chat/tools/fs/inject.py +35 -0
  97. ommlds/cli/sessions/chat/tools/inject.py +88 -0
  98. ommlds/cli/sessions/chat/tools/injection.py +44 -0
  99. ommlds/cli/sessions/chat/tools/rendering.py +58 -0
  100. ommlds/cli/sessions/chat/tools/todo/__init__.py +0 -0
  101. ommlds/cli/sessions/chat/tools/todo/configs.py +12 -0
  102. ommlds/cli/sessions/chat/tools/todo/inject.py +31 -0
  103. ommlds/cli/sessions/chat/tools/weather/__init__.py +0 -0
  104. ommlds/cli/sessions/chat/tools/weather/configs.py +12 -0
  105. ommlds/cli/sessions/chat/tools/weather/inject.py +22 -0
  106. ommlds/cli/{tools/weather.py → sessions/chat/tools/weather/tools.py} +1 -1
  107. ommlds/cli/sessions/completion/configs.py +21 -0
  108. ommlds/cli/sessions/completion/inject.py +42 -0
  109. ommlds/cli/sessions/completion/session.py +35 -0
  110. ommlds/cli/sessions/embedding/configs.py +21 -0
  111. ommlds/cli/sessions/embedding/inject.py +42 -0
  112. ommlds/cli/sessions/embedding/session.py +33 -0
  113. ommlds/cli/sessions/inject.py +28 -11
  114. ommlds/cli/state/__init__.py +0 -0
  115. ommlds/cli/state/inject.py +28 -0
  116. ommlds/cli/{state.py → state/storage.py} +41 -24
  117. ommlds/minichain/__init__.py +46 -17
  118. ommlds/minichain/_dataclasses.py +15401 -0
  119. ommlds/minichain/backends/catalogs/base.py +20 -1
  120. ommlds/minichain/backends/catalogs/simple.py +2 -2
  121. ommlds/minichain/backends/catalogs/strings.py +10 -8
  122. ommlds/minichain/backends/impls/anthropic/chat.py +31 -65
  123. ommlds/minichain/backends/impls/anthropic/names.py +3 -4
  124. ommlds/minichain/backends/impls/anthropic/protocol.py +109 -0
  125. ommlds/minichain/backends/impls/anthropic/stream.py +53 -31
  126. ommlds/minichain/backends/impls/duckduckgo/search.py +5 -1
  127. ommlds/minichain/backends/impls/dummy/__init__.py +0 -0
  128. ommlds/minichain/backends/impls/dummy/chat.py +69 -0
  129. ommlds/minichain/backends/impls/google/chat.py +9 -2
  130. ommlds/minichain/backends/impls/google/search.py +6 -1
  131. ommlds/minichain/backends/impls/google/stream.py +122 -32
  132. ommlds/minichain/backends/impls/groq/__init__.py +0 -0
  133. ommlds/minichain/backends/impls/groq/chat.py +75 -0
  134. ommlds/minichain/backends/impls/groq/names.py +48 -0
  135. ommlds/minichain/backends/impls/groq/protocol.py +143 -0
  136. ommlds/minichain/backends/impls/groq/stream.py +125 -0
  137. ommlds/minichain/backends/impls/huggingface/repos.py +1 -5
  138. ommlds/minichain/backends/impls/llamacpp/chat.py +15 -3
  139. ommlds/minichain/backends/impls/llamacpp/completion.py +7 -3
  140. ommlds/minichain/backends/impls/llamacpp/stream.py +38 -19
  141. ommlds/minichain/backends/impls/mistral.py +9 -2
  142. ommlds/minichain/backends/impls/mlx/chat.py +100 -23
  143. ommlds/minichain/backends/impls/ollama/__init__.py +0 -0
  144. ommlds/minichain/backends/impls/ollama/chat.py +199 -0
  145. ommlds/minichain/backends/impls/openai/chat.py +14 -7
  146. ommlds/minichain/backends/impls/openai/completion.py +9 -2
  147. ommlds/minichain/backends/impls/openai/embedding.py +9 -2
  148. ommlds/minichain/backends/impls/openai/format.py +115 -109
  149. ommlds/minichain/backends/impls/openai/names.py +31 -5
  150. ommlds/minichain/backends/impls/openai/stream.py +33 -27
  151. ommlds/minichain/backends/impls/sentencepiece/tokens.py +9 -6
  152. ommlds/minichain/backends/impls/tavily.py +66 -0
  153. ommlds/minichain/backends/impls/tinygrad/chat.py +17 -14
  154. ommlds/minichain/backends/impls/tokenizers/tokens.py +9 -6
  155. ommlds/minichain/backends/impls/transformers/sentence.py +5 -2
  156. ommlds/minichain/backends/impls/transformers/tokens.py +10 -7
  157. ommlds/minichain/backends/impls/transformers/transformers.py +139 -20
  158. ommlds/minichain/backends/strings/parsing.py +1 -1
  159. ommlds/minichain/backends/strings/resolving.py +4 -1
  160. ommlds/minichain/chat/choices/stream/__init__.py +0 -0
  161. ommlds/minichain/chat/choices/stream/adapters.py +35 -0
  162. ommlds/minichain/chat/choices/stream/joining.py +31 -0
  163. ommlds/minichain/chat/choices/stream/services.py +45 -0
  164. ommlds/minichain/chat/choices/stream/types.py +43 -0
  165. ommlds/minichain/chat/stream/_marshal.py +4 -4
  166. ommlds/minichain/chat/stream/joining.py +85 -0
  167. ommlds/minichain/chat/stream/services.py +15 -15
  168. ommlds/minichain/chat/stream/types.py +24 -18
  169. ommlds/minichain/llms/types.py +4 -0
  170. ommlds/minichain/registries/globals.py +18 -4
  171. ommlds/minichain/resources.py +28 -3
  172. ommlds/minichain/search.py +1 -1
  173. ommlds/minichain/standard.py +8 -0
  174. ommlds/minichain/stream/services.py +19 -16
  175. ommlds/minichain/tools/reflect.py +5 -1
  176. ommlds/nanochat/LICENSE +21 -0
  177. ommlds/nanochat/__init__.py +0 -0
  178. ommlds/nanochat/rustbpe/LICENSE +21 -0
  179. ommlds/nanochat/tokenizers.py +406 -0
  180. ommlds/specs/__init__.py +0 -0
  181. ommlds/specs/mcp/__init__.py +0 -0
  182. ommlds/specs/mcp/_marshal.py +23 -0
  183. ommlds/specs/mcp/clients.py +146 -0
  184. ommlds/specs/mcp/protocol.py +371 -0
  185. ommlds/tools/git.py +13 -6
  186. ommlds/tools/ocr.py +1 -8
  187. ommlds/wiki/analyze.py +2 -2
  188. ommlds/wiki/text/mfh.py +1 -5
  189. ommlds/wiki/text/wtp.py +1 -3
  190. ommlds/wiki/utils/xml.py +5 -5
  191. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/METADATA +22 -19
  192. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/RECORD +198 -95
  193. ommlds/cli/backends/standard.py +0 -20
  194. ommlds/cli/sessions/chat/base.py +0 -42
  195. ommlds/cli/sessions/chat/code.py +0 -129
  196. ommlds/cli/sessions/chat/interactive.py +0 -71
  197. ommlds/cli/sessions/chat/printing.py +0 -97
  198. ommlds/cli/sessions/chat/prompt.py +0 -151
  199. ommlds/cli/sessions/chat/state.py +0 -110
  200. ommlds/cli/sessions/chat/tools.py +0 -100
  201. ommlds/cli/sessions/completion/completion.py +0 -44
  202. ommlds/cli/sessions/embedding/embedding.py +0 -42
  203. ommlds/cli/tools/config.py +0 -14
  204. ommlds/cli/tools/inject.py +0 -75
  205. ommlds/minichain/backends/impls/openai/format2.py +0 -210
  206. ommlds/minichain/chat/stream/adapters.py +0 -80
  207. /ommlds/{huggingface.py → backends/huggingface.py} +0 -0
  208. /ommlds/cli/{tools → content}/__init__.py +0 -0
  209. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/WHEEL +0 -0
  210. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/entry_points.txt +0 -0
  211. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/licenses/LICENSE +0 -0
  212. {ommlds-0.0.0.dev456.dist-info → ommlds-0.0.0.dev485.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,371 @@
1
+ """
2
+ https://modelcontextprotocol.io/specification/2025-06-18
3
+ https://modelcontextprotocol.io/specification/2025-06-18/schema
4
+
5
+ TODO:
6
+ - https://modelcontextprotocol.io/specification/2025-06-18/basic/utilities/cancellation
7
+ - https://modelcontextprotocol.io/specification/2025-06-18/basic/utilities/progress
8
+ - https://modelcontextprotocol.io/specification/2025-06-18/client/sampling
9
+ - https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation
10
+ - https://modelcontextprotocol.io/specification/2025-06-18/server/prompts
11
+ - https://modelcontextprotocol.io/specification/2025-06-18/server/resources
12
+ - https://modelcontextprotocol.io/specification/2025-06-18/server/utilities/logging
13
+ """
14
+ import abc
15
+ import typing as ta
16
+
17
+ from omlish import collections as col
18
+ from omlish import dataclasses as dc
19
+ from omlish import lang
20
+ from omlish import marshal as msh
21
+
22
+
23
+ ClientRequestT = ta.TypeVar('ClientRequestT', bound='ClientRequest')
24
+ ClientResultT = ta.TypeVar('ClientResultT', bound='ClientResult')
25
+
26
+ ServerRequestT = ta.TypeVar('ServerRequestT', bound='ServerRequest')
27
+ ServerResultT = ta.TypeVar('ServerResultT', bound='ServerResult')
28
+
29
+ CursorClientRequestT = ta.TypeVar('CursorClientRequestT', bound='CursorClientRequest')
30
+ CursorClientResultT = ta.TypeVar('CursorClientResultT', bound='CursorClientResult')
31
+
32
+
33
+ msh.register_global_module_import('._marshal', __package__)
34
+
35
+
36
+ ##
37
+
38
+
39
+ def _set_class_marshal_options(cls):
40
+ msh.update_object_metadata(
41
+ cls,
42
+ field_naming=msh.Naming.LOW_CAMEL,
43
+ field_defaults=msh.FieldMetadata(
44
+ options=msh.FieldOptions(
45
+ omit_if=lang.is_none,
46
+ ),
47
+ ),
48
+ )
49
+ return cls
50
+
51
+
52
+ ##
53
+
54
+
55
+ @dc.dataclass(frozen=True, kw_only=True)
56
+ class Message(lang.Sealed, lang.Abstract):
57
+ @property
58
+ @abc.abstractmethod
59
+ def json_rpc_method_name(self) -> str:
60
+ raise NotImplementedError
61
+
62
+
63
+ #
64
+
65
+
66
+ class ClientRequest(Message, lang.Abstract, ta.Generic[ClientResultT]):
67
+ pass
68
+
69
+
70
+ class ClientResult(Message, lang.Abstract, ta.Generic[ClientRequestT]):
71
+ pass
72
+
73
+
74
+ #
75
+
76
+
77
+ class ServerRequest(Message, lang.Abstract, ta.Generic[ServerResultT]):
78
+ pass
79
+
80
+
81
+ class ServerResult(Message, lang.Abstract, ta.Generic[ServerRequestT]):
82
+ pass
83
+
84
+
85
+ #
86
+
87
+
88
+ class Notification(Message, lang.Abstract):
89
+ pass
90
+
91
+
92
+ ##
93
+
94
+
95
+ @dc.dataclass(frozen=True, kw_only=True)
96
+ class WithMeta(lang.Sealed, lang.Abstract):
97
+ meta_: ta.Mapping[str, ta.Any] | None = dc.field(default=None) | msh.with_field_metadata(name='_meta')
98
+
99
+
100
+ ##
101
+
102
+
103
+ @dc.dataclass(frozen=True, kw_only=True)
104
+ @_set_class_marshal_options
105
+ class Implementation(lang.Final):
106
+ name: str
107
+ version: str
108
+
109
+
110
+ DEFAULT_PROTOCOL_VERSION = '2025-06-18'
111
+
112
+
113
+ @dc.dataclass(frozen=True, kw_only=True)
114
+ @_set_class_marshal_options
115
+ class ClientCapabilities(lang.Final):
116
+ elicitation: ta.Any | None = None
117
+
118
+ experimental: ta.Mapping[str, ta.Any] | None = None
119
+
120
+ @dc.dataclass(frozen=True, kw_only=True)
121
+ @_set_class_marshal_options
122
+ class Roots:
123
+ list_changed: bool | None = None
124
+
125
+ roots: Roots | None = None
126
+
127
+ sampling: ta.Any | None = None
128
+
129
+
130
+ @dc.dataclass(frozen=True, kw_only=True)
131
+ @_set_class_marshal_options
132
+ class InitializeRequest(ClientRequest['InitializeResult']):
133
+ json_rpc_method_name: ta.ClassVar[str] = 'initialize'
134
+
135
+ client_info: Implementation
136
+ protocol_version: str = DEFAULT_PROTOCOL_VERSION
137
+ capabilities: ClientCapabilities = ClientCapabilities()
138
+
139
+
140
+ @dc.dataclass(frozen=True, kw_only=True)
141
+ @_set_class_marshal_options
142
+ class ServerCapabilities:
143
+ completions: ta.Any | None = None
144
+
145
+ experimental: ta.Mapping[str, ta.Any] | None = None
146
+
147
+ logging: ta.Any | None = None
148
+
149
+ @dc.dataclass(frozen=True, kw_only=True)
150
+ @_set_class_marshal_options
151
+ class Prompts:
152
+ list_changed: bool | None = None
153
+
154
+ prompts: Prompts | None = None
155
+
156
+ @dc.dataclass(frozen=True, kw_only=True)
157
+ @_set_class_marshal_options
158
+ class Resources:
159
+ list_changed: bool | None = None
160
+ subscribe: bool | None = None
161
+
162
+ resources: Resources | None = None
163
+
164
+ @dc.dataclass(frozen=True, kw_only=True)
165
+ @_set_class_marshal_options
166
+ class Tools:
167
+ list_changed: bool | None = None
168
+
169
+ tools: Tools | None = None
170
+
171
+
172
+ @dc.dataclass(frozen=True, kw_only=True)
173
+ @_set_class_marshal_options
174
+ class InitializeResult(ClientResult[InitializeRequest], WithMeta):
175
+ json_rpc_method_name: ta.ClassVar[str] = 'initialize'
176
+
177
+ server_info: Implementation
178
+ protocol_version: str
179
+ capabilities: ServerCapabilities
180
+ instructions: str | None = None
181
+
182
+
183
+ @dc.dataclass(frozen=True, kw_only=True)
184
+ @_set_class_marshal_options
185
+ class InitializedNotification(Notification):
186
+ json_rpc_method_name: ta.ClassVar[str] = 'initialized'
187
+
188
+
189
+ ##
190
+
191
+
192
+ @dc.dataclass(frozen=True, kw_only=True)
193
+ class CursorClientRequest(ClientRequest[CursorClientResultT], lang.Abstract):
194
+ cursor: str | None = None
195
+
196
+
197
+ @dc.dataclass(frozen=True, kw_only=True)
198
+ class CursorClientResult(ClientResult[CursorClientRequestT], lang.Abstract):
199
+ next_cursor: str | None = None
200
+
201
+
202
+ ##
203
+
204
+
205
+ @dc.dataclass(frozen=True, kw_only=True)
206
+ @_set_class_marshal_options
207
+ class ToolAnnotations(lang.Final):
208
+ destructive_hint: bool | None = None
209
+ idempotent_hint: bool | None = None
210
+ open_world_hint: bool | None = None
211
+ read_only_hint: bool | None = None
212
+ title: str | None = None
213
+
214
+
215
+ @dc.dataclass(frozen=True, kw_only=True)
216
+ @_set_class_marshal_options
217
+ class Tool(WithMeta, lang.Final):
218
+ name: str
219
+ title: str | None = None
220
+
221
+ description: str | None = None
222
+
223
+ annotations: ToolAnnotations | None = None
224
+
225
+ input_schema: ta.Any
226
+ output_schema: ta.Any | None = None
227
+
228
+
229
+ @dc.dataclass(frozen=True, kw_only=True)
230
+ @_set_class_marshal_options
231
+ class ListToolsRequest(CursorClientRequest['ListToolsResult']):
232
+ json_rpc_method_name: ta.ClassVar[str] = 'tools/list'
233
+
234
+
235
+ @dc.dataclass(frozen=True, kw_only=True)
236
+ @_set_class_marshal_options
237
+ class ListToolsResult(CursorClientResult[ListToolsRequest], WithMeta):
238
+ json_rpc_method_name: ta.ClassVar[str] = 'tools/list'
239
+
240
+ tools: ta.Sequence[Tool]
241
+
242
+
243
+ ##
244
+
245
+
246
+ class ContentBlock(lang.Abstract):
247
+ pass
248
+
249
+
250
+ @dc.dataclass(frozen=True, kw_only=True)
251
+ @_set_class_marshal_options
252
+ class TextContentBlock(ContentBlock, lang.Final):
253
+ text: str
254
+
255
+
256
+ ##
257
+
258
+
259
+ @dc.dataclass(frozen=True, kw_only=True)
260
+ @_set_class_marshal_options
261
+ class CallToolRequest(ClientRequest['CallToolResult']):
262
+ json_rpc_method_name: ta.ClassVar[str] = 'tools/call'
263
+
264
+ name: str
265
+ arguments: ta.Mapping[str, ta.Any] | None = None
266
+
267
+
268
+ @dc.dataclass(frozen=True, kw_only=True)
269
+ @_set_class_marshal_options
270
+ class CallToolResult(ClientResult[CallToolRequest], WithMeta):
271
+ json_rpc_method_name: ta.ClassVar[str] = 'tools/call'
272
+
273
+ content: ta.Sequence[ContentBlock]
274
+ is_error: bool | None = None
275
+ structured_content: ta.Mapping[str, ta.Any] | None = None
276
+
277
+
278
+ ##
279
+
280
+
281
+ @dc.dataclass(frozen=True, kw_only=True)
282
+ @_set_class_marshal_options
283
+ class PingClientRequest(ClientRequest['PingClientResult'], WithMeta):
284
+ json_rpc_method_name: ta.ClassVar[str] = 'ping'
285
+
286
+
287
+ @dc.dataclass(frozen=True, kw_only=True)
288
+ @_set_class_marshal_options
289
+ class PingClientResult(ClientResult[PingClientRequest]):
290
+ json_rpc_method_name: ta.ClassVar[str] = 'ping'
291
+
292
+
293
+ @dc.dataclass(frozen=True, kw_only=True)
294
+ @_set_class_marshal_options
295
+ class PingServerRequest(ServerRequest['PingServerResult'], WithMeta):
296
+ json_rpc_method_name: ta.ClassVar[str] = 'ping'
297
+
298
+
299
+ @dc.dataclass(frozen=True, kw_only=True)
300
+ @_set_class_marshal_options
301
+ class PingServerResult(ServerResult[PingServerRequest]):
302
+ json_rpc_method_name: ta.ClassVar[str] = 'ping'
303
+
304
+
305
+ ##
306
+
307
+
308
+ @dc.dataclass(frozen=True, kw_only=True)
309
+ @_set_class_marshal_options
310
+ class PromptArgument(lang.Final):
311
+ name: str
312
+ title: str | None = None
313
+
314
+ description: str | None = None
315
+
316
+ required: bool | None = None
317
+
318
+
319
+ @dc.dataclass(frozen=True, kw_only=True)
320
+ @_set_class_marshal_options
321
+ class Prompt(WithMeta, lang.Final):
322
+ name: str
323
+ title: str | None = None
324
+
325
+ description: str | None = None
326
+
327
+ arguments: ta.Sequence[PromptArgument] | None = None
328
+
329
+
330
+ @dc.dataclass(frozen=True, kw_only=True)
331
+ @_set_class_marshal_options
332
+ class ListPromptsRequest(CursorClientRequest['ListPromptsResult']):
333
+ json_rpc_method_name: ta.ClassVar[str] = 'prompts/list'
334
+
335
+
336
+ @dc.dataclass(frozen=True, kw_only=True)
337
+ @_set_class_marshal_options
338
+ class ListPromptsResult(CursorClientResult[ListPromptsRequest], WithMeta):
339
+ json_rpc_method_name: ta.ClassVar[str] = 'prompts/list'
340
+
341
+ prompts: ta.Sequence[Prompt]
342
+
343
+
344
+ ##
345
+
346
+
347
+ LoggingLevel: ta.TypeAlias = ta.Literal[
348
+ 'debug',
349
+ 'info',
350
+ 'notice',
351
+ 'warning',
352
+ 'error',
353
+ 'critical',
354
+ 'alert',
355
+ 'emergency',
356
+ ]
357
+
358
+
359
+ ##
360
+
361
+
362
+ MESSAGE_TYPES_BY_JSON_RPC_METHOD_NAME: ta.Mapping[type[Message], ta.Mapping[str, type[Message]]] = {
363
+ bty: col.make_map_by(lambda mty: mty.json_rpc_method_name, lang.deep_subclasses(bty, concrete_only=True)) # type: ignore # noqa
364
+ for bty in [
365
+ ClientRequest,
366
+ ClientResult,
367
+ ServerRequest,
368
+ ServerResult,
369
+ Notification,
370
+ ]
371
+ }
ommlds/tools/git.py CHANGED
@@ -12,10 +12,12 @@ import urllib.request
12
12
 
13
13
  from omdev.git.magic import GIT_DIFF_OMIT_MAGIC_COMMENT
14
14
  from omdev.home.secrets import load_secrets
15
+ from omdev.py.srcheaders import get_py_header_lines
15
16
  from omdev.tools.git.messages import GitMessageGenerator
16
17
  from omlish import check
17
18
  from omlish import lang
18
19
  from omlish.configs.classes import Configurable
20
+ from omlish.http import all as http
19
21
  from omlish.subprocesses.sync import subprocesses
20
22
 
21
23
  from .. import minichain as mc
@@ -23,10 +25,8 @@ from ..minichain.backends.impls.openai.chat import OpenaiChatChoicesService
23
25
  from ..server.client import McServerClient
24
26
 
25
27
 
26
- if ta.TYPE_CHECKING:
28
+ with lang.auto_proxy_import(globals()):
27
29
  from ..minichain.backends.impls.mlx import chat as mc_mlx_chat
28
- else:
29
- mc_mlx_chat = lang.proxy_import('..minichain.backends.impls.mlx.chat', __package__)
30
30
 
31
31
 
32
32
  GitAiBackendConfigT = ta.TypeVar('GitAiBackendConfigT', bound='GitAiBackend.Config')
@@ -78,7 +78,9 @@ class OpenaiGitAiBackend(GitAiBackend['OpenaiGitAiBackend.Config']):
78
78
  if (sec := load_secrets().try_get(key.lower())) is not None:
79
79
  os.environ[key] = sec.reveal()
80
80
 
81
- llm = OpenaiChatChoicesService()
81
+ llm = OpenaiChatChoicesService(
82
+ http_client=http.SyncAsyncHttpClient(http.client()),
83
+ )
82
84
 
83
85
  resp = lang.sync_await(llm.invoke(mc.ChatChoicesRequest(
84
86
  [mc.UserMessage(prompt)],
@@ -215,9 +217,14 @@ class AiGitMessageGenerator(GitMessageGenerator):
215
217
  except FileNotFoundError:
216
218
  return False
217
219
 
220
+ hls = get_py_header_lines(f_src)
221
+
218
222
  return any(
219
- l.startswith(GIT_DIFF_OMIT_MAGIC_COMMENT)
220
- for l in f_src.splitlines()
223
+ hl.src.strip() in (
224
+ '# @omlish-generated',
225
+ GIT_DIFF_OMIT_MAGIC_COMMENT,
226
+ )
227
+ for hl in hls
221
228
  )
222
229
 
223
230
  # TODO: configurable
ommlds/tools/ocr.py CHANGED
@@ -13,20 +13,13 @@ from omlish import check
13
13
  from omlish import lang
14
14
 
15
15
 
16
- if ta.TYPE_CHECKING:
16
+ with lang.auto_proxy_import(globals()):
17
17
  import pytesseract
18
18
  import rapidocr_onnxruntime as rapidocr
19
19
  from PIL import Image
20
20
 
21
21
  from omdev.clipboard import darwin_cf as darwin_clipboard
22
22
 
23
- else:
24
- pytesseract = lang.proxy_import('pytesseract')
25
- rapidocr = lang.proxy_import('rapidocr_onnxruntime')
26
- Image = lang.proxy_import('PIL.Image')
27
-
28
- darwin_clipboard = lang.proxy_import('omdev.clipboard.darwin_cf')
29
-
30
23
 
31
24
  ##
32
25
 
ommlds/wiki/analyze.py CHANGED
@@ -213,7 +213,7 @@ class FileAnalyzer:
213
213
  self.verbose and print()
214
214
  return True
215
215
 
216
- @logs.error_logging(log)
216
+ @logs.exception_logging(log)
217
217
  def run(self, file_name: str) -> None:
218
218
  log.info(f'{self._ctx.deathpact=} {file_name}') # noqa
219
219
 
@@ -268,7 +268,7 @@ class FileAnalyzer:
268
268
  self._flush_rows()
269
269
 
270
270
 
271
- @logs.error_logging(log)
271
+ @logs.exception_logging(log)
272
272
  def analyze_file(
273
273
  file_name: str,
274
274
  db_url: str,
ommlds/wiki/text/mfh.py CHANGED
@@ -13,14 +13,10 @@ from omlish import lang
13
13
  from omlish import marshal as msh
14
14
 
15
15
 
16
- if ta.TYPE_CHECKING:
16
+ with lang.auto_proxy_import(globals()):
17
17
  import mwparserfromhell as mfh
18
18
  import mwparserfromhell.nodes as mfn
19
19
 
20
- else:
21
- mfh = lang.proxy_import('mwparserfromhell')
22
- mfn = lang.proxy_import('mwparserfromhell.nodes')
23
-
24
20
 
25
21
  Wikicode: ta.TypeAlias = 'mfh.wikicode.Wikicode'
26
22
 
ommlds/wiki/text/wtp.py CHANGED
@@ -26,10 +26,8 @@ from omlish import cached
26
26
  from omlish import lang
27
27
 
28
28
 
29
- if ta.TYPE_CHECKING:
29
+ with lang.auto_proxy_import(globals()):
30
30
  import wikitextparser as wtp
31
- else:
32
- wtp = lang.proxy_import('wikitextparser')
33
31
 
34
32
 
35
33
  WikiText: ta.TypeAlias = 'wtp.WikiText'
ommlds/wiki/utils/xml.py CHANGED
@@ -24,7 +24,7 @@ else:
24
24
 
25
25
  T = ta.TypeVar('T')
26
26
 
27
- Element: ta.TypeAlias = ta.Union[ET.Element, 'lxml_etree.Element']
27
+ Element: ta.TypeAlias = ta.Union[ET.Element, 'lxml_etree.Element'] # type: ignore[valid-type]
28
28
 
29
29
 
30
30
  ##
@@ -83,8 +83,8 @@ class ElementToKwargs:
83
83
  raise KeyError(k)
84
84
  kw[k] = v
85
85
 
86
- if el.attrib:
87
- for k, v in el.attrib.items():
86
+ if el.attrib: # type: ignore
87
+ for k, v in el.attrib.items(): # type: ignore
88
88
  k = strip_ns(k)
89
89
 
90
90
  if k in self.attrs:
@@ -99,7 +99,7 @@ class ElementToKwargs:
99
99
  else:
100
100
  raise KeyError(k)
101
101
 
102
- for cel in el:
102
+ for cel in el: # type: ignore
103
103
  k = strip_ns(cel.tag)
104
104
 
105
105
  if k in self.scalars:
@@ -123,7 +123,7 @@ class ElementToKwargs:
123
123
  raise KeyError(k)
124
124
 
125
125
  if self.text is not None:
126
- set_kw(self.text, el.text)
126
+ set_kw(self.text, el.text) # type: ignore
127
127
 
128
128
  return kw
129
129
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ommlds
3
- Version: 0.0.0.dev456
3
+ Version: 0.0.0.dev485
4
4
  Summary: ommlds
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,50 +14,53 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omdev==0.0.0.dev456
18
- Requires-Dist: omlish==0.0.0.dev456
17
+ Requires-Dist: omdev==0.0.0.dev485
18
+ Requires-Dist: omlish==0.0.0.dev485
19
19
  Provides-Extra: all
20
20
  Requires-Dist: llama-cpp-python~=0.3; extra == "all"
21
- Requires-Dist: mlx~=0.29; extra == "all"
21
+ Requires-Dist: mlx~=0.30; sys_platform == "darwin" and extra == "all"
22
22
  Requires-Dist: mlx-lm~=0.28; sys_platform == "darwin" and extra == "all"
23
- Requires-Dist: tiktoken~=0.11; extra == "all"
23
+ Requires-Dist: tiktoken~=0.12; extra == "all"
24
24
  Requires-Dist: tinygrad~=0.11; extra == "all"
25
25
  Requires-Dist: tokenizers~=0.22; extra == "all"
26
- Requires-Dist: torch~=2.8; extra == "all"
27
- Requires-Dist: transformers~=4.56; extra == "all"
26
+ Requires-Dist: torch~=2.9; extra == "all"
27
+ Requires-Dist: transformers~=4.57; extra == "all"
28
28
  Requires-Dist: sentence-transformers~=5.1; extra == "all"
29
- Requires-Dist: huggingface-hub~=0.35; extra == "all"
30
- Requires-Dist: datasets~=4.1; extra == "all"
29
+ Requires-Dist: huggingface-hub~=0.36; extra == "all"
30
+ Requires-Dist: datasets~=4.4; extra == "all"
31
+ Requires-Dist: regex>=2025.0; extra == "all"
31
32
  Requires-Dist: numpy>=1.26; extra == "all"
32
33
  Requires-Dist: pytesseract~=0.3; extra == "all"
33
34
  Requires-Dist: rapidocr-onnxruntime~=1.4; extra == "all"
34
- Requires-Dist: pillow~=11.3; extra == "all"
35
- Requires-Dist: ddgs~=9.6; extra == "all"
35
+ Requires-Dist: pillow~=12.0; extra == "all"
36
+ Requires-Dist: ddgs~=9.9; extra == "all"
36
37
  Requires-Dist: mwparserfromhell~=0.7; extra == "all"
37
38
  Requires-Dist: wikitextparser~=0.56; extra == "all"
38
39
  Requires-Dist: lxml>=5.3; python_version < "3.13" and extra == "all"
39
40
  Provides-Extra: backends
40
41
  Requires-Dist: llama-cpp-python~=0.3; extra == "backends"
41
- Requires-Dist: mlx~=0.29; extra == "backends"
42
+ Requires-Dist: mlx~=0.30; sys_platform == "darwin" and extra == "backends"
42
43
  Requires-Dist: mlx-lm~=0.28; sys_platform == "darwin" and extra == "backends"
43
- Requires-Dist: tiktoken~=0.11; extra == "backends"
44
+ Requires-Dist: tiktoken~=0.12; extra == "backends"
44
45
  Requires-Dist: tinygrad~=0.11; extra == "backends"
45
46
  Requires-Dist: tokenizers~=0.22; extra == "backends"
46
- Requires-Dist: torch~=2.8; extra == "backends"
47
- Requires-Dist: transformers~=4.56; extra == "backends"
47
+ Requires-Dist: torch~=2.9; extra == "backends"
48
+ Requires-Dist: transformers~=4.57; extra == "backends"
48
49
  Requires-Dist: sentence-transformers~=5.1; extra == "backends"
49
50
  Provides-Extra: huggingface
50
- Requires-Dist: huggingface-hub~=0.35; extra == "huggingface"
51
- Requires-Dist: datasets~=4.1; extra == "huggingface"
51
+ Requires-Dist: huggingface-hub~=0.36; extra == "huggingface"
52
+ Requires-Dist: datasets~=4.4; extra == "huggingface"
53
+ Provides-Extra: nanochat
54
+ Requires-Dist: regex>=2025.0; extra == "nanochat"
52
55
  Provides-Extra: numpy
53
56
  Requires-Dist: numpy>=1.26; extra == "numpy"
54
57
  Provides-Extra: ocr
55
58
  Requires-Dist: pytesseract~=0.3; extra == "ocr"
56
59
  Requires-Dist: rapidocr-onnxruntime~=1.4; extra == "ocr"
57
60
  Provides-Extra: pillow
58
- Requires-Dist: pillow~=11.3; extra == "pillow"
61
+ Requires-Dist: pillow~=12.0; extra == "pillow"
59
62
  Provides-Extra: search
60
- Requires-Dist: ddgs~=9.6; extra == "search"
63
+ Requires-Dist: ddgs~=9.9; extra == "search"
61
64
  Provides-Extra: wiki
62
65
  Requires-Dist: mwparserfromhell~=0.7; extra == "wiki"
63
66
  Requires-Dist: wikitextparser~=0.56; extra == "wiki"