ommlds 0.0.0.dev500__py3-none-any.whl → 0.0.0.dev501__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 (30) hide show
  1. ommlds/cli/sessions/chat/interfaces/textual/app.py +1 -1
  2. ommlds/minichain/__init__.py +9 -2
  3. ommlds/minichain/_dataclasses.py +337 -81
  4. ommlds/minichain/backends/impls/openai/format.py +1 -1
  5. ommlds/minichain/chat/messages.py +1 -1
  6. ommlds/minichain/chat/stream/joining.py +36 -12
  7. ommlds/minichain/chat/transforms/metadata.py +3 -3
  8. ommlds/minichain/content/standard.py +1 -1
  9. ommlds/minichain/content/transform/json.py +1 -1
  10. ommlds/minichain/content/transform/metadata.py +1 -1
  11. ommlds/minichain/content/transform/standard.py +2 -2
  12. ommlds/minichain/content/transform/strings.py +1 -1
  13. ommlds/minichain/content/transform/templates.py +1 -1
  14. ommlds/minichain/metadata.py +13 -16
  15. ommlds/minichain/services/__init__.py +155 -0
  16. ommlds/minichain/services/_marshal.py +46 -10
  17. ommlds/minichain/services/_origclasses.py +11 -0
  18. ommlds/minichain/services/_typedvalues.py +8 -3
  19. ommlds/minichain/services/requests.py +73 -3
  20. ommlds/minichain/services/responses.py +73 -3
  21. ommlds/minichain/services/services.py +9 -0
  22. ommlds/minichain/tools/reflect.py +3 -3
  23. ommlds/minichain/wrappers/instrument.py +146 -0
  24. ommlds/minichain/wrappers/services.py +26 -0
  25. {ommlds-0.0.0.dev500.dist-info → ommlds-0.0.0.dev501.dist-info}/METADATA +4 -4
  26. {ommlds-0.0.0.dev500.dist-info → ommlds-0.0.0.dev501.dist-info}/RECORD +30 -29
  27. {ommlds-0.0.0.dev500.dist-info → ommlds-0.0.0.dev501.dist-info}/WHEEL +0 -0
  28. {ommlds-0.0.0.dev500.dist-info → ommlds-0.0.0.dev501.dist-info}/entry_points.txt +0 -0
  29. {ommlds-0.0.0.dev500.dist-info → ommlds-0.0.0.dev501.dist-info}/licenses/LICENSE +0 -0
  30. {ommlds-0.0.0.dev500.dist-info → ommlds-0.0.0.dev501.dist-info}/top_level.txt +0 -0
@@ -6,8 +6,12 @@ from omlish import lang
6
6
  from omlish import typedvalues as tv
7
7
 
8
8
  from .._typedvalues import _tv_field_metadata
9
+ from ..metadata import CommonMetadata
10
+ from ..metadata import Metadata
11
+ from ..metadata import MetadataContainerDataclass
9
12
  from ..types import Option
10
13
  from ..types import OptionT_co
14
+ from ._origclasses import confer_orig_class
11
15
  from ._typedvalues import _TypedValues
12
16
 
13
17
 
@@ -19,6 +23,17 @@ OptionU = ta.TypeVar('OptionU', bound=Option)
19
23
  ##
20
24
 
21
25
 
26
+ class RequestMetadata(Metadata, lang.Abstract):
27
+ pass
28
+
29
+
30
+ RequestMetadatas: ta.TypeAlias = RequestMetadata | CommonMetadata
31
+
32
+
33
+ ##
34
+
35
+
36
+ @ta.final
22
37
  @dc.dataclass(frozen=True)
23
38
  @dc.extra_class_params(
24
39
  allow_dynamic_dunder_attrs=True,
@@ -26,11 +41,32 @@ OptionU = ta.TypeVar('OptionU', bound=Option)
26
41
  )
27
42
  class Request( # type: ignore[type-var] # FIXME: _TypedValues param is invariant
28
43
  _TypedValues[OptionT_co],
44
+ MetadataContainerDataclass[RequestMetadatas],
29
45
  lang.Final,
30
46
  ta.Generic[V_co, OptionT_co],
31
47
  ):
48
+ """
49
+ Universal service request, comprised of:
50
+ - a value of type `V_co`
51
+ - a sequence of options of type `OptionT_co`
52
+ - metadata of type `RequestMetadatas`
53
+
54
+ Refer to the package docstring for an explanation of its type var variance.
55
+
56
+ This class is final, but each instance's `__orig_class__` (if present) is significant. It is encouraged to construct
57
+ these through a pre-parameterized type alias, and the provided `with_` methods should be used rather than
58
+ `dc.replace` (as they will propagate `__orig_class__`).
59
+ """
60
+
61
+ #
62
+
32
63
  v: V_co # type: ignore[misc] # FIXME: Cannot use a covariant type variable as a parameter
33
64
 
65
+ def with_v(self, v: V_co) -> ta.Self: # type: ignore[misc]
66
+ return confer_orig_class(self, dc.replace(self, v=v))
67
+
68
+ #
69
+
34
70
  _options: ta.Sequence[OptionT_co] = dc.field(
35
71
  default=(),
36
72
  metadata=_tv_field_metadata(
@@ -43,13 +79,47 @@ class Request( # type: ignore[type-var] # FIXME: _TypedValues param is invaria
43
79
  def options(self) -> tv.TypedValues[OptionT_co]:
44
80
  return check.isinstance(self._options, tv.TypedValues)
45
81
 
46
- def with_options(self, *options: OptionU, override: bool = False) -> 'Request[V_co, OptionT_co | OptionU]':
47
- return dc.replace(self, _options=self.options.update(*options, override=override))
48
-
49
82
  @property
50
83
  def _typed_values(self) -> tv.TypedValues[OptionT_co]:
51
84
  return check.isinstance(self._options, tv.TypedValues)
52
85
 
86
+ def with_options(
87
+ self,
88
+ *add: OptionU,
89
+ discard: ta.Iterable[type] | None = None,
90
+ override: bool = False,
91
+ ) -> 'Request[V_co, OptionT_co | OptionU]':
92
+ new = (old := self.options).update(
93
+ *add,
94
+ discard=discard,
95
+ override=override,
96
+ )
97
+
98
+ if new is old:
99
+ return self
100
+
101
+ return confer_orig_class(self, dc.replace(self, _options=new))
102
+
103
+ #
104
+
105
+ _metadata: ta.Sequence[RequestMetadatas] = dc.field(
106
+ default=(),
107
+ kw_only=True,
108
+ repr=False,
109
+ )
110
+
111
+ MetadataContainerDataclass._configure_metadata_field(_metadata, RequestMetadatas) # noqa
112
+
113
+ def with_metadata(
114
+ self,
115
+ *add: RequestMetadatas,
116
+ discard: ta.Iterable[type] | None = None,
117
+ override: bool = False,
118
+ ) -> ta.Self:
119
+ return confer_orig_class(self, super().with_metadata(*add, discard=discard, override=override))
120
+
121
+ #
122
+
53
123
  def validate(self) -> ta.Self:
54
124
  self._check_typed_values()
55
125
  return self
@@ -6,8 +6,12 @@ from omlish import lang
6
6
  from omlish import typedvalues as tv
7
7
 
8
8
  from .._typedvalues import _tv_field_metadata
9
+ from ..metadata import CommonMetadata
10
+ from ..metadata import Metadata
11
+ from ..metadata import MetadataContainerDataclass
9
12
  from ..types import Output
10
13
  from ..types import OutputT_contra
14
+ from ._origclasses import confer_orig_class
11
15
  from ._typedvalues import _TypedValues
12
16
 
13
17
 
@@ -17,6 +21,17 @@ V_co = ta.TypeVar('V_co', covariant=True)
17
21
  ##
18
22
 
19
23
 
24
+ class ResponseMetadata(Metadata, lang.Abstract):
25
+ pass
26
+
27
+
28
+ ResponseMetadatas: ta.TypeAlias = ResponseMetadata | CommonMetadata
29
+
30
+
31
+ ##
32
+
33
+
34
+ @ta.final
20
35
  @dc.dataclass(frozen=True)
21
36
  @dc.extra_class_params(
22
37
  allow_dynamic_dunder_attrs=True,
@@ -24,11 +39,32 @@ V_co = ta.TypeVar('V_co', covariant=True)
24
39
  )
25
40
  class Response( # type: ignore[type-var] # FIXME: _TypedValues param is invariant
26
41
  _TypedValues[OutputT_contra],
42
+ MetadataContainerDataclass[ResponseMetadatas],
27
43
  lang.Final,
28
44
  ta.Generic[V_co, OutputT_contra],
29
45
  ):
46
+ """
47
+ Universal service response, comprised of:
48
+ - a value of type `V_co`
49
+ - a sequence of outputs of type `OutputT_contra`
50
+ - metadata of type `ResponseMetadatas`
51
+
52
+ Refer to the package docstring for an explanation of its type var variance.
53
+
54
+ This class is final, but each instance's `__orig_class__` (if present) is significant. It is encouraged to construct
55
+ these through a pre-parameterized type alias, and the provided `with_` methods should be used rather than
56
+ `dc.replace` (as they will propagate `__orig_class__`).
57
+ """
58
+
59
+ #
60
+
30
61
  v: V_co # type: ignore[misc] # FIXME: Cannot use a covariant type variable as a parameter
31
62
 
63
+ def with_v(self, v: V_co) -> ta.Self: # type: ignore[misc]
64
+ return confer_orig_class(self, dc.replace(self, v=v))
65
+
66
+ #
67
+
32
68
  _outputs: ta.Sequence[OutputT_contra] = dc.field(
33
69
  default=(),
34
70
  metadata=_tv_field_metadata(
@@ -41,13 +77,47 @@ class Response( # type: ignore[type-var] # FIXME: _TypedValues param is invari
41
77
  def outputs(self) -> tv.TypedValues[OutputT_contra]:
42
78
  return check.isinstance(self._outputs, tv.TypedValues)
43
79
 
44
- def with_outputs(self, *outputs: OutputT_contra, override: bool = False) -> ta.Self:
45
- return dc.replace(self, _outputs=self.outputs.update(*outputs, override=override))
46
-
47
80
  @property
48
81
  def _typed_values(self) -> tv.TypedValues[OutputT_contra]:
49
82
  return check.isinstance(self._outputs, tv.TypedValues)
50
83
 
84
+ def with_outputs(
85
+ self,
86
+ *add: OutputT_contra,
87
+ discard: ta.Iterable[type] | None = None,
88
+ override: bool = False,
89
+ ) -> ta.Self:
90
+ new = (old := self.outputs).update(
91
+ *add,
92
+ discard=discard,
93
+ override=override,
94
+ )
95
+
96
+ if new is old:
97
+ return self
98
+
99
+ return confer_orig_class(self, dc.replace(self, _outputs=new))
100
+
101
+ #
102
+
103
+ _metadata: ta.Sequence[ResponseMetadatas] = dc.field(
104
+ default=(),
105
+ kw_only=True,
106
+ repr=False,
107
+ )
108
+
109
+ MetadataContainerDataclass._configure_metadata_field(_metadata, ResponseMetadatas) # noqa
110
+
111
+ def with_metadata(
112
+ self,
113
+ *add: ResponseMetadatas,
114
+ discard: ta.Iterable[type] | None = None,
115
+ override: bool = False,
116
+ ) -> ta.Self:
117
+ return confer_orig_class(self, super().with_metadata(*add, discard=discard, override=override))
118
+
119
+ #
120
+
51
121
  def validate(self) -> ta.Self:
52
122
  self._check_typed_values()
53
123
  return self
@@ -11,4 +11,13 @@ from .responses import ResponseT_co
11
11
 
12
12
  @ta.runtime_checkable
13
13
  class Service(lang.ProtocolForbiddenAsBaseClass, ta.Protocol[RequestT_contra, ResponseT_co]):
14
+ """
15
+ Universal service protocol, comprised of a single method `invoke`, accepting a request of type `RequestT_contra` and
16
+ returning a response of type `ResponseT_co`.
17
+
18
+ Refer to the package docstring for an explanation of its type var variance.
19
+
20
+ This class is final, but each instance's `__orig_class__` (if present) is significant.
21
+ """
22
+
14
23
  def invoke(self, request: RequestT_contra) -> ta.Awaitable[ResponseT_co]: ...
@@ -178,14 +178,14 @@ class ToolReflector:
178
178
  for o in md.get_object_metadata(fn, type=_ToolSpecOverride):
179
179
  ts_ovr.update({
180
180
  k: v
181
- for k, v in dc.asdict(o).items()
181
+ for k, v in dc.shallow_asdict(o).items()
182
182
  if k != 'params'
183
183
  and v is not None
184
184
  })
185
185
  for op in (o.params or []):
186
186
  p_ovr_dct.setdefault(check.non_empty_str(op.name), {}).update({
187
187
  k: v
188
- for k, v in dc.asdict(op).items()
188
+ for k, v in dc.shallow_asdict(op).items()
189
189
  if v is not None
190
190
  })
191
191
 
@@ -286,7 +286,7 @@ class ToolReflector:
286
286
  if md_tp is not None:
287
287
  tp_kw.update({
288
288
  k: v
289
- for k, v in dc.asdict(md_tp).items()
289
+ for k, v in dc.shallow_asdict(md_tp).items()
290
290
  if v is not None
291
291
  })
292
292
 
@@ -0,0 +1,146 @@
1
+ """
2
+ TODO:
3
+ - final sream outputs
4
+ """
5
+ import datetime
6
+ import typing as ta
7
+
8
+ from omlish import dataclasses as dc
9
+ from omlish import lang
10
+
11
+ from ..services.requests import Request
12
+ from ..services.responses import Response
13
+ from .services import WrappedOptionT
14
+ from .services import WrappedOutputT
15
+ from .services import WrappedRequest
16
+ from .services import WrappedRequestV
17
+ from .services import WrappedResponse
18
+ from .services import WrappedResponseV
19
+ from .services import WrappedService
20
+ from .services import WrapperService
21
+ from .stream import WrappedStreamOutputT
22
+ from .stream import WrappedStreamResponse
23
+ from .stream import WrappedStreamService
24
+ from .stream import WrapperStreamService
25
+
26
+
27
+ ##
28
+
29
+
30
+ @dc.dataclass(frozen=True, kw_only=True)
31
+ @dc.extra_class_params(default_repr_fn=lang.opt_or_just_repr)
32
+ class InstrumentedServiceEvent:
33
+ dt: datetime.datetime = dc.field(default_factory=lang.utcnow)
34
+
35
+ req: Request | None = None
36
+
37
+ resp: Response | None = None
38
+ exc: BaseException | None = None
39
+
40
+ stream_v: lang.Maybe[ta.Any] = lang.empty()
41
+
42
+
43
+ class InstrumentedServiceEventSink(ta.Protocol):
44
+ def __call__(self, ev: InstrumentedServiceEvent) -> ta.Awaitable[None]: ...
45
+
46
+
47
+ class ListInstrumentedServiceEventSink:
48
+ def __init__(self, lst: list[InstrumentedServiceEvent] | None = None) -> None:
49
+ super().__init__()
50
+
51
+ if lst is None:
52
+ lst = []
53
+ self._lst = lst
54
+
55
+ @property
56
+ def events(self) -> ta.Sequence[InstrumentedServiceEvent]:
57
+ return self._lst
58
+
59
+ async def __call__(self, ev: InstrumentedServiceEvent) -> None:
60
+ self._lst.append(ev)
61
+
62
+
63
+ ##
64
+
65
+
66
+ class InstrumentedService(
67
+ WrapperService[
68
+ WrappedRequestV,
69
+ WrappedOptionT,
70
+ WrappedResponseV,
71
+ WrappedOutputT,
72
+ ],
73
+ ):
74
+ def __init__(
75
+ self,
76
+ service: WrappedService,
77
+ sink: InstrumentedServiceEventSink | None = None,
78
+ ) -> None:
79
+ super().__init__(service)
80
+
81
+ if sink is None:
82
+ sink = ListInstrumentedServiceEventSink()
83
+ self._sink = sink
84
+
85
+ async def invoke(self, request: WrappedRequest) -> WrappedResponse:
86
+ await self._sink(InstrumentedServiceEvent(req=request))
87
+
88
+ try:
89
+ resp = await self._service.invoke(request)
90
+
91
+ except Exception as e: # noqa
92
+ await self._sink(InstrumentedServiceEvent(req=request, exc=e))
93
+
94
+ raise
95
+
96
+ await self._sink(InstrumentedServiceEvent(req=request, resp=resp))
97
+
98
+ return resp
99
+
100
+
101
+ ##
102
+
103
+
104
+ class InstrumentedStreamService(
105
+ WrapperStreamService[
106
+ WrappedRequestV,
107
+ WrappedOptionT,
108
+ WrappedResponseV,
109
+ WrappedOutputT,
110
+ WrappedStreamOutputT,
111
+ ],
112
+ ):
113
+ def __init__(
114
+ self,
115
+ service: WrappedStreamService,
116
+ sink: InstrumentedServiceEventSink | None = None,
117
+ ) -> None:
118
+ super().__init__(service)
119
+
120
+ if sink is None:
121
+ sink = ListInstrumentedServiceEventSink()
122
+ self._sink = sink
123
+
124
+ async def invoke(self, request: WrappedRequest) -> WrappedStreamResponse:
125
+ await self._sink(InstrumentedServiceEvent(req=request))
126
+
127
+ try:
128
+ resp = await self._service.invoke(request)
129
+
130
+ except Exception as e: # noqa
131
+ await self._sink(InstrumentedServiceEvent(req=request, exc=e))
132
+
133
+ raise
134
+
135
+ await self._sink(InstrumentedServiceEvent(req=request, resp=resp))
136
+
137
+ async def inner(sink): # noqa
138
+ async with resp.v as st:
139
+ async for v in st:
140
+ await self._sink(InstrumentedServiceEvent(req=request, resp=resp, stream_v=v))
141
+
142
+ await sink(v)
143
+
144
+ # return resp.with_v(inner())
145
+
146
+ raise NotImplementedError
@@ -10,6 +10,9 @@ from ..types import Option
10
10
  from ..types import Output
11
11
 
12
12
 
13
+ P = ta.ParamSpec('P')
14
+
15
+
13
16
  WrappedRequestV = ta.TypeVar('WrappedRequestV')
14
17
  WrappedOptionT = ta.TypeVar('WrappedOptionT', bound=Option)
15
18
 
@@ -70,3 +73,26 @@ class MultiWrapperService(
70
73
  super().__init__()
71
74
 
72
75
  self._services = check.not_empty(services)
76
+
77
+
78
+ ##
79
+
80
+
81
+ def wrap_service(
82
+ wrapped: WrappedService,
83
+ wrapper: ta.Callable[
84
+ ta.Concatenate[
85
+ WrappedService,
86
+ P,
87
+ ],
88
+ WrapperService[
89
+ WrappedRequestV,
90
+ WrappedOptionT,
91
+ WrappedResponseV,
92
+ WrappedOutputT,
93
+ ],
94
+ ],
95
+ *args: P.args,
96
+ **kwargs: P.kwargs,
97
+ ) -> WrappedService:
98
+ return ta.cast(ta.Any, wrapper(wrapped, *args, **kwargs))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ommlds
3
- Version: 0.0.0.dev500
3
+ Version: 0.0.0.dev501
4
4
  Summary: ommlds
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,9 +14,9 @@ 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: omlish==0.0.0.dev500
17
+ Requires-Dist: omlish==0.0.0.dev501
18
18
  Provides-Extra: all
19
- Requires-Dist: omdev==0.0.0.dev500; extra == "all"
19
+ Requires-Dist: omdev==0.0.0.dev501; extra == "all"
20
20
  Requires-Dist: llama-cpp-python~=0.3; extra == "all"
21
21
  Requires-Dist: mlx~=0.30; sys_platform == "darwin" and extra == "all"
22
22
  Requires-Dist: mlx-lm~=0.29; sys_platform == "darwin" and extra == "all"
@@ -38,7 +38,7 @@ Requires-Dist: mwparserfromhell~=0.7; extra == "all"
38
38
  Requires-Dist: wikitextparser~=0.56; extra == "all"
39
39
  Requires-Dist: lxml>=5.3; python_version < "3.13" and extra == "all"
40
40
  Provides-Extra: omdev
41
- Requires-Dist: omdev==0.0.0.dev500; extra == "omdev"
41
+ Requires-Dist: omdev==0.0.0.dev501; extra == "omdev"
42
42
  Provides-Extra: backends
43
43
  Requires-Dist: llama-cpp-python~=0.3; extra == "backends"
44
44
  Requires-Dist: mlx~=0.30; sys_platform == "darwin" and extra == "backends"
@@ -210,7 +210,7 @@ ommlds/cli/sessions/chat/interfaces/bare/interactive.py,sha256=ZnYoePvXtUbhkDQ0j
210
210
  ommlds/cli/sessions/chat/interfaces/bare/oneshot.py,sha256=b758OIa0gf9I_0UdxYJ6re-g8-8xndgr3R0OotUOsmc,387
211
211
  ommlds/cli/sessions/chat/interfaces/bare/tools.py,sha256=_UsuoXLIvfpFP_We5DBBlhm6rwB3_cFA3lmFvpG9b-A,824
212
212
  ommlds/cli/sessions/chat/interfaces/textual/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
- ommlds/cli/sessions/chat/interfaces/textual/app.py,sha256=Ecn4qawdUId-fGhHUXrhEEDDkIUwzOnyKtlBnCrwf2o,9133
213
+ ommlds/cli/sessions/chat/interfaces/textual/app.py,sha256=wEkibpKaT00J5awBHCtEwAdM00jO5yWjkul_2I6b6y0,9124
214
214
  ommlds/cli/sessions/chat/interfaces/textual/configs.py,sha256=HD8DlWXYJ1M94gr5TIT6oqsFCmOf5Gd6KkSBZUtySew,180
215
215
  ommlds/cli/sessions/chat/interfaces/textual/facades.py,sha256=zXVG7DKVl-Xtdc893O_yktHCMvM0do6hLesMd8hbqeo,411
216
216
  ommlds/cli/sessions/chat/interfaces/textual/inject.py,sha256=ZVG-q3w1xuaIIxm35Zs9R3NyyAdbQUpQD9QXQ-1PypE,2516
@@ -237,15 +237,15 @@ ommlds/cli/state/storage.py,sha256=Wr8DVuEGUxfFJn0tMWNTVdint6NBDdLKstNWSjx8sKw,3
237
237
  ommlds/datasets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
238
  ommlds/datasets/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
239
239
  ommlds/datasets/lib/movies.py,sha256=LmdfoXsZU9XMM_r-sxCLv_s06BFzwWO4xUj6sc9XVcI,1961
240
- ommlds/minichain/__init__.py,sha256=QrVg3CYm-g2zkMYWfS-v5XqiLQLAxhNLi-Fok0RgcT8,13022
241
- ommlds/minichain/_dataclasses.py,sha256=bwUWt87unXQEtmtuB4u-QWTCrU6NWpM3sVwdXky2fY4,927389
240
+ ommlds/minichain/__init__.py,sha256=vJkLRL9sbR1fH5pPNUdKNWkZCtX5JbFHw98-5501zbc,13129
241
+ ommlds/minichain/_dataclasses.py,sha256=OIBmfIHAmXID0BO8WAxlPleWp3Lnm0-s5rse85VjZMM,940770
242
242
  ommlds/minichain/_marshal.py,sha256=n9PGWrHhvAmGIc7KDOYt3IF9Z6G0ncXskyICTp3Ji6k,1923
243
243
  ommlds/minichain/_typedvalues.py,sha256=NEQ7YCD7YtYJoEKHRwBksHFv-CULvyXniju_IeVfD5s,2349
244
244
  ommlds/minichain/completion.py,sha256=lQ0LfCIYZsvDqteHhhDIv16D2_gn_xMfEL0ouywE5Yo,1033
245
245
  ommlds/minichain/configs.py,sha256=WwrHxfkDAfo_RtuCqUgySthj-2W26lZbpuQoghUyGNw,167
246
246
  ommlds/minichain/envs.py,sha256=vE2CSeT6KYxOpPY72VbFLzGUnBERYdhfiEUlvSRHkXE,225
247
247
  ommlds/minichain/json.py,sha256=0_5rV5Zi2qPOvXi2CLAc5DF7FN3jK3ABbjoKdjtTuVo,360
248
- ommlds/minichain/metadata.py,sha256=-YqKhleNrAXp1M9b6EHZuCYC8oX57ohy_3RaZJ6mgSk,2378
248
+ ommlds/minichain/metadata.py,sha256=NRrcfN2l4XArHXje3vA9AmkDceXsN-ymT8fbmbW0Ka8,2228
249
249
  ommlds/minichain/resources.py,sha256=CcFIUrxPGuxUabG74zL0yByZsyGJISxLVK1nULSZPyo,5488
250
250
  ommlds/minichain/search.py,sha256=YOMJKkTLLSfGKaxltk9bf5OdPq7MpCtLOC3NZ_4iq-E,1269
251
251
  ommlds/minichain/standard.py,sha256=l7C6EXE4FgfJOphl0vHMwCq4FvMNViloz7pPfMsRnGU,2637
@@ -302,7 +302,7 @@ ommlds/minichain/backends/impls/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
302
302
  ommlds/minichain/backends/impls/openai/chat.py,sha256=G1IK94PwB16rYCkRos9JEuiAu1GgCK4CnZFOIShhpig,2856
303
303
  ommlds/minichain/backends/impls/openai/completion.py,sha256=4Mi4Zvrq5fCqUd0asL3WiCbCdmxOdo0NFkoZMfdsYXY,1939
304
304
  ommlds/minichain/backends/impls/openai/embedding.py,sha256=BNtvKYLTsnQwQR9Tv3Fr8zCYN1kr1UNdJ15lcsjz6X0,1765
305
- ommlds/minichain/backends/impls/openai/format.py,sha256=wIAwgvCkzEP2HdTUMeaZqJhEV2UJddS462WpvK0oduU,7457
305
+ ommlds/minichain/backends/impls/openai/format.py,sha256=yhQNvDWN9xWhb8e6M25JLiln-C5wYmaULH4Aib-DcbM,7459
306
306
  ommlds/minichain/backends/impls/openai/names.py,sha256=M1spn4Yio6LEnKWEzPqXSrzJg3wsf2M1iZIYFAvxb80,1550
307
307
  ommlds/minichain/backends/impls/openai/stream.py,sha256=bsZeGUepqOl9AcN44kWk03V6q-v1ewBCfZqb_MJEfxg,5454
308
308
  ommlds/minichain/backends/impls/sentencepiece/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -324,7 +324,7 @@ ommlds/minichain/chat/_marshal.py,sha256=M3p093nxzxITbznc--P-tyCXuWDHrq4JFKTZAx6
324
324
  ommlds/minichain/chat/content.py,sha256=NpxeYxP7WOWq94UR9AY0THVRIzWAcgP1w7r_srgntOk,1098
325
325
  ommlds/minichain/chat/formats.py,sha256=LmlU7iu8PMJuroFTmyWfP4tXvLjj5VNxdAp1Us9MSAA,562
326
326
  ommlds/minichain/chat/history.py,sha256=GI10mTCr8yv0mxJRK-YVtYqOuUjBvX5Su5FYYmLpPxU,1566
327
- ommlds/minichain/chat/messages.py,sha256=xoFJXHl8SjoxzOw9AHxMgUK-UR6OlH3HKNCKb1Wg5hw,3492
327
+ ommlds/minichain/chat/messages.py,sha256=WZN-kffu0BmoZgjXfRE4AAIS4J4xR9EpuAcWodnQhpg,3490
328
328
  ommlds/minichain/chat/metadata.py,sha256=V8EUqUsiAITtIae8SC_4YyyBBvciG34jRuSylql4AvU,248
329
329
  ommlds/minichain/chat/services.py,sha256=HzP35CLOz-vCptUUpuehI5yNJorTtY64gwrb6ZWNfwI,919
330
330
  ommlds/minichain/chat/templating.py,sha256=0JwWOL6gsZmtmQddAIBOP2J_Rz47DAYSg_1f_C_roC0,3152
@@ -340,7 +340,7 @@ ommlds/minichain/chat/choices/stream/services.py,sha256=9Jc6Hf9Iphepzksll29Skv7I
340
340
  ommlds/minichain/chat/choices/stream/types.py,sha256=V1QTk1XDcPyfpOpYuDH-cj6swhr4-urpUH9eFGZNfjY,808
341
341
  ommlds/minichain/chat/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
342
342
  ommlds/minichain/chat/stream/_marshal.py,sha256=eUdDrjPKYKwgaNrntZsuquB121pcDcW9lyNRy8bqVsw,382
343
- ommlds/minichain/chat/stream/joining.py,sha256=U-z1MJTIuw0LIJCUQ80RcGROpPgbqG6FHVjuTe7j57s,2416
343
+ ommlds/minichain/chat/stream/joining.py,sha256=T_PXTJcCnkzD-HGvlmO-turkj_MWEzJMd7ni4W6cYsc,2992
344
344
  ommlds/minichain/chat/stream/services.py,sha256=Ikaf8fofoPW6UM3MajAGgdc0U6VU8jhn0F6r-FX5XFc,1102
345
345
  ommlds/minichain/chat/stream/types.py,sha256=AG5yMSRBo2ynoJTF0zBgYVjJbrafsptIo7Ex1QtBbdQ,1310
346
346
  ommlds/minichain/chat/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -350,7 +350,7 @@ ommlds/minichain/chat/tools/parsing.py,sha256=p0WRBpFahTiv_3v5lxoO1qTmpAlv_BiaGg
350
350
  ommlds/minichain/chat/tools/types.py,sha256=kjXK3Dwe-YpWmJCpgNAeoOw3ZjLKy3JhmbNxeoF6PRA,218
351
351
  ommlds/minichain/chat/transforms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
352
352
  ommlds/minichain/chat/transforms/base.py,sha256=V22SasLdnzvmSO7C19gigi8LKeWVtBHmhaSJbkj6b4Y,2923
353
- ommlds/minichain/chat/transforms/metadata.py,sha256=DC-2Ff1u8WBfBn2O-okJ_avqww8SEql5KKZDIUF9dJ4,1569
353
+ ommlds/minichain/chat/transforms/metadata.py,sha256=Gw1cUIk2cVzHMyFPwboY_HWEuV_Ts3R4AVmOuyH120A,1563
354
354
  ommlds/minichain/chat/transforms/services.py,sha256=wJw2eu-TU1sVXUYvg7rc7QNn93cCXhtEI_q-KZ5Dz0I,1016
355
355
  ommlds/minichain/content/__init__.py,sha256=3ONXFV3bDiZDko9SI3Hij60bFiYLuR-Emfoh1K6AgXc,748
356
356
  ommlds/minichain/content/_marshal.py,sha256=BUhSC3nAXtXJlRK1Btbx1iqoWxBi5fKiIHLuJ0tcfOY,9547
@@ -371,22 +371,22 @@ ommlds/minichain/content/raw.py,sha256=evB4Vv7Tk42tQrVf5-f78wdjeXEqwcdWEz0pt7z58
371
371
  ommlds/minichain/content/recursive.py,sha256=httCiaHWyAitsHgneHhkTd1yuDT22x465c6Hk-7g9-E,196
372
372
  ommlds/minichain/content/section.py,sha256=C1CWGgAtZf4p38fD5OJ0aFLt2ZLGQEp_oz-NHB14cx4,562
373
373
  ommlds/minichain/content/sequence.py,sha256=xYcz7WK3wsfa431dgMPhp7z5z643W_-n0-Uv9HnMwr0,1004
374
- ommlds/minichain/content/standard.py,sha256=sh4l2zIPCAH4KYRx1ySzY5EuMNBjlIV7bx0tI5fej7E,853
374
+ ommlds/minichain/content/standard.py,sha256=x52rI7lfz9MBtW-kmFepbVrv6G96vdX-CbQlb5wV3IM,851
375
375
  ommlds/minichain/content/tag.py,sha256=CTRpoFosCo9swfaqlRxhT0Vzak6rZccdmyHHGj_5Krg,647
376
376
  ommlds/minichain/content/templates.py,sha256=a94NUJD_s1C1byovWNNLpqlN_is2pmOE0TkSjT1HzH4,246
377
377
  ommlds/minichain/content/text.py,sha256=GVdyc3ZWH2xvhtDlVeJK_vl9aqYKxb5BOil5J5KegqI,193
378
378
  ommlds/minichain/content/visitors.py,sha256=EL7fFf5MG27NPswOybL0VoYOIk7wGVatuem_5Frk2ns,6844
379
379
  ommlds/minichain/content/transform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
380
- ommlds/minichain/content/transform/json.py,sha256=G4d_Uwrlvh9PM-kiXIUB5N7QS0waW-paLlRLoAhqalg,1599
380
+ ommlds/minichain/content/transform/json.py,sha256=nYo9eiVHbEZEWoZXoiwlAZISZio86P2DIcJ3vAomoLw,1597
381
381
  ommlds/minichain/content/transform/markdown.py,sha256=GG67VqYTgo5wcY11GSDq9ecHjXSubWbmwR2kXNW_z4o,127
382
382
  ommlds/minichain/content/transform/materialize.py,sha256=IpI4fL5-RblKsbslxhs225pvBUBb4Rov4FzAj0TMrtA,1386
383
- ommlds/minichain/content/transform/metadata.py,sha256=WeXCde8yFo2nzmaVZUDIWfHg0SVsB4eGyAu1j2l4LUY,499
383
+ ommlds/minichain/content/transform/metadata.py,sha256=868JCRjpZqLgEcy5OF5kO9N2fFRDGUqWD52l9gL0AVE,506
384
384
  ommlds/minichain/content/transform/prepare.py,sha256=DzLdjn7c38ICDX1YP2Qdc6a87nCNDKgtLb2e11tlRfE,1603
385
385
  ommlds/minichain/content/transform/recursive.py,sha256=0fPoX2iu-hF99pnB_GglpsbDiy86d-YppVHZAqNASY8,2737
386
- ommlds/minichain/content/transform/standard.py,sha256=0DKc_yJvuwcwLNBihJaq7qWEJhsH6pM1ijZTQ7f7HeM,1208
386
+ ommlds/minichain/content/transform/standard.py,sha256=5xMEzsK3GXLpF-EPKEn6sdi3ZjlY2Lj0ZEqpJEsgQMw,1204
387
387
  ommlds/minichain/content/transform/stringify.py,sha256=8MhrcfAmPwZyTf7Nubhe5luRXilI2xHN8JveVHJgHbM,1065
388
- ommlds/minichain/content/transform/strings.py,sha256=sA_K_mUZQTXg8tJvxkC5YmiNdSt0T6KXXrINFh7FbXU,905
389
- ommlds/minichain/content/transform/templates.py,sha256=-Vk_sZsVSQFTDZelo2bLUGsYb5Pu-Mtsr7RzF9DlU3k,724
388
+ ommlds/minichain/content/transform/strings.py,sha256=n5FWHEoBIUy60fLJWiXYyHhoW_0BkfWZvSbZV39VPoY,903
389
+ ommlds/minichain/content/transform/templates.py,sha256=hNP75MlFPPuGDFa_LjJ8aMyqRyHLCHM-ZoBlyvn9Rto,722
390
390
  ommlds/minichain/docs/__init__.py,sha256=vNpT6sA5YDalFqsCFn0DjUvarxRtRl3w2V9liEU0CQk,364
391
391
  ommlds/minichain/docs/docs.py,sha256=Ex7hiqaiYDB9hQhUjuzot8MFktl3LIGG41YBFaNoC80,1340
392
392
  ommlds/minichain/docs/dtypes.py,sha256=BRZmLK9NfQwITBYmDOmRPDlFg1RP5BYWT0Xw04AinF8,499
@@ -427,14 +427,14 @@ ommlds/minichain/registries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
427
427
  ommlds/minichain/registries/globals.py,sha256=M4-RTsjHfm7FRXqV-4ecWywEF1Di2lnTn3a7OJhtzkU,3224
428
428
  ommlds/minichain/registries/manifests.py,sha256=GTWk4lssAk8mmG3ilGK2NvIU-rGS3otOZNuGQUDStMI,362
429
429
  ommlds/minichain/registries/registry.py,sha256=wmk88NsM20Kl4PduX3Oy5roHPfNKtXENCITTc7M8gAY,4626
430
- ommlds/minichain/services/__init__.py,sha256=gjhYyT7-MY1PISdHMKmfk2o_QrdU7UV7I9ZNh2Yjpu4,336
431
- ommlds/minichain/services/_marshal.py,sha256=hiO147wK7LcsC0WmqdwltKTOKZdq51J-ESY0JCtqo8s,4374
432
- ommlds/minichain/services/_origclasses.py,sha256=E9DBfnodZ5_5DlEfzQfRDyzzy_OqE48kWka070GUdgI,1405
433
- ommlds/minichain/services/_typedvalues.py,sha256=pptoba24KreotiXtRtxmWtcjRM5o7nObLfkOl6q8dmA,2842
430
+ ommlds/minichain/services/__init__.py,sha256=E31Ly3v-N-cTRNougDBF9BSZyYQvdm-W87ZW4LL5e3Y,9308
431
+ ommlds/minichain/services/_marshal.py,sha256=zIp4WnbGh-e2DS2lN2qi_Y3XO-MJN8sVYGB4HAPOOIU,5321
432
+ ommlds/minichain/services/_origclasses.py,sha256=cUao3vxNzArsHH3RAC3PKHLBWN66oQDvYyGT_agYZ-g,1625
433
+ ommlds/minichain/services/_typedvalues.py,sha256=j3Rw6cZ-xfhzSTOPDe4OLsvzsADuy9r0lVmW9_egvjM,3040
434
434
  ommlds/minichain/services/facades.py,sha256=zoTY5GT7yIrFUY3fX7a-sSOvkk1_4GK5FlJJmRL_ems,1734
435
- ommlds/minichain/services/requests.py,sha256=VAfKbYu4T0CZTWVQmZ2LUmYU7DNm6IerYMNEkiV_E5M,1588
436
- ommlds/minichain/services/responses.py,sha256=4W6Z4Fx4_GFqKgle27OeLr0zzjVTA0pkZrlsZiFQNdo,1534
437
- ommlds/minichain/services/services.py,sha256=WjkQNYIp87SflLSReOHMkG2qIVAOem6vsrs_2NxWN_M,325
435
+ ommlds/minichain/services/requests.py,sha256=BZgn91yM2U43S4ihVKMYGBxFEGLOqRfuH8rt6IwyRIk,3422
436
+ ommlds/minichain/services/responses.py,sha256=qJ3d8FM4hB1UuAsMPg9j8guVZJvhc10L0hbMWxQnrGU,3381
437
+ ommlds/minichain/services/services.py,sha256=8axlOnQvI83icwRK0XLha0svSQrLXC1_B6MZXN_mzUc,685
438
438
  ommlds/minichain/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
439
439
  ommlds/minichain/stream/services.py,sha256=YXfEj3ZXKZ3Svkig6f3hOReHgZnLY2tDn2bgB0RIoRI,5566
440
440
  ommlds/minichain/stream/wrap.py,sha256=nQC0aCi49I18nF0Yx8qiiLkhIAECV6s6o4pvOy5Kx98,2041
@@ -458,7 +458,7 @@ ommlds/minichain/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
458
458
  ommlds/minichain/tools/_marshal.py,sha256=9np2tuzGfRwL5BMCd6QYChzimtTBUfHxT4IoEA6v3Eg,410
459
459
  ommlds/minichain/tools/fns.py,sha256=zNDLV2ZlMk9no0YJpTXlZ6sgYCpD6oGcUpsgc65tQhQ,3932
460
460
  ommlds/minichain/tools/jsonschema.py,sha256=gipEyit6OmVAa02Azhk8xbFHlolWXd0Jp5x_fvAzdHg,4253
461
- ommlds/minichain/tools/reflect.py,sha256=yfTW_6qMwEP2RYoN514cmfbvOpGlAJktWXNeKiObsg8,8699
461
+ ommlds/minichain/tools/reflect.py,sha256=jy9xxcewxeWJ9aRdPg9qhVmgZ7K3a2j2p3xCBewCKfA,8723
462
462
  ommlds/minichain/tools/types.py,sha256=77O0ufX6YSdijYXSSxHhamBC9MEIdcL2Cq3ihLJOPzI,4769
463
463
  ommlds/minichain/tools/execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
464
464
  ommlds/minichain/tools/execution/catalog.py,sha256=4BjQFdDnpO7pJ74VTl0Pv7qDjFuz2maZvPUi5KmHfFg,2004
@@ -477,8 +477,9 @@ ommlds/minichain/vectors/stores.py,sha256=etbLCS0RXAEmqcCdqiys8twa8R7Y_DcjQ_VqnE
477
477
  ommlds/minichain/vectors/types.py,sha256=xSAK1Xfkubqf95QgJhSHrwBu_C5quuye3wZAASmxJkM,3473
478
478
  ommlds/minichain/wrappers/__init__.py,sha256=kXyc5BHVI35GXGmIf0zkKfCVIqD8q9PFENblye5qCqc,110
479
479
  ommlds/minichain/wrappers/firstinwins.py,sha256=fqTq7siw28IsjGar8tXlxBsMJuCbogiv7nBCPcxhHe4,3464
480
+ ommlds/minichain/wrappers/instrument.py,sha256=I51u7k6oYG5PX2r3jGRHDl_IqbAEFUCZ_oWwlIiNbLY,3730
480
481
  ommlds/minichain/wrappers/retry.py,sha256=1A4TTD8RXUpCDjo7a0T1qeB5n8i7bsw473bmPCOS00c,3444
481
- ommlds/minichain/wrappers/services.py,sha256=cALV1wTh5RiIjkU23_KbuCtuNWlv4xDAiE5SpMgOk7Y,1387
482
+ ommlds/minichain/wrappers/services.py,sha256=6AAwgCtzHzmJZWteKJJgdfSQtYuDBxuRFoT6NttV5RY,1912
482
483
  ommlds/minichain/wrappers/stream.py,sha256=-H0O_Eyzsabk--mtIzobWdMdj3WnqonEZ9-k9_XdWiI,1223
483
484
  ommlds/nanochat/LICENSE,sha256=QrsJ8zmor4uQ07SWm29uS6Sv87XGFBA7Ax_M33HI93I,1072
484
485
  ommlds/nanochat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -511,9 +512,9 @@ ommlds/wiki/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
511
512
  ommlds/wiki/utils/io.py,sha256=UKgDJGtmpnWvIqVd2mJc2QNPOqlToEY1GEveNp6_pMo,7088
512
513
  ommlds/wiki/utils/progress.py,sha256=EhvKcMFYtsarCQhIahlO6f0SboyAKP3UwUyrnVnP-Vk,3222
513
514
  ommlds/wiki/utils/xml.py,sha256=sNJNkZ9rT8B-kJMO6bRz8J1USy4fyPx0m2PwTX7vxYY,3846
514
- ommlds-0.0.0.dev500.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
515
- ommlds-0.0.0.dev500.dist-info/METADATA,sha256=5JjoGJXAdwa8XdFscqAxcIGgWi-lsZo3KQ_tb_l8fI4,3495
516
- ommlds-0.0.0.dev500.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
517
- ommlds-0.0.0.dev500.dist-info/entry_points.txt,sha256=Z5YWtX7ClfiCKdW-dd_CSVvM0h4yQpJPi-2G3q6gNFo,35
518
- ommlds-0.0.0.dev500.dist-info/top_level.txt,sha256=Rbnk5d5wi58vnAXx13WFZqdQ4VX8hBCS2hEL3WeXOhY,7
519
- ommlds-0.0.0.dev500.dist-info/RECORD,,
515
+ ommlds-0.0.0.dev501.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
516
+ ommlds-0.0.0.dev501.dist-info/METADATA,sha256=5bTbYGDC1rBgqoIHEZ88BxuMkXbxNQXxU4MzM3UjvLg,3495
517
+ ommlds-0.0.0.dev501.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
518
+ ommlds-0.0.0.dev501.dist-info/entry_points.txt,sha256=Z5YWtX7ClfiCKdW-dd_CSVvM0h4yQpJPi-2G3q6gNFo,35
519
+ ommlds-0.0.0.dev501.dist-info/top_level.txt,sha256=Rbnk5d5wi58vnAXx13WFZqdQ4VX8hBCS2hEL3WeXOhY,7
520
+ ommlds-0.0.0.dev501.dist-info/RECORD,,