ommlds 0.0.0.dev499__py3-none-any.whl → 0.0.0.dev503__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. ommlds/.omlish-manifests.json +20 -9
  2. ommlds/__about__.py +1 -1
  3. ommlds/backends/anthropic/protocol/sse/events.py +2 -0
  4. ommlds/backends/groq/clients.py +9 -0
  5. ommlds/cli/_dataclasses.py +22 -72
  6. ommlds/cli/backends/inject.py +20 -0
  7. ommlds/cli/backends/meta.py +47 -0
  8. ommlds/cli/sessions/chat/drivers/ai/tools.py +3 -7
  9. ommlds/cli/sessions/chat/facades/commands/base.py +1 -1
  10. ommlds/cli/sessions/chat/interfaces/textual/app.py +1 -1
  11. ommlds/minichain/__init__.py +47 -6
  12. ommlds/minichain/_dataclasses.py +533 -132
  13. ommlds/minichain/backends/impls/anthropic/names.py +3 -3
  14. ommlds/minichain/backends/impls/anthropic/stream.py +1 -1
  15. ommlds/minichain/backends/impls/cerebras/names.py +15 -0
  16. ommlds/minichain/backends/impls/cerebras/stream.py +1 -1
  17. ommlds/minichain/backends/impls/google/names.py +6 -0
  18. ommlds/minichain/backends/impls/google/stream.py +1 -1
  19. ommlds/minichain/backends/impls/groq/chat.py +2 -0
  20. ommlds/minichain/backends/impls/groq/stream.py +3 -1
  21. ommlds/minichain/backends/impls/ollama/chat.py +1 -1
  22. ommlds/minichain/backends/impls/openai/format.py +2 -1
  23. ommlds/minichain/backends/impls/openai/stream.py +33 -1
  24. ommlds/minichain/chat/messages.py +1 -1
  25. ommlds/minichain/chat/stream/joining.py +36 -12
  26. ommlds/minichain/chat/transforms/metadata.py +3 -3
  27. ommlds/minichain/content/standard.py +1 -1
  28. ommlds/minichain/content/transform/json.py +1 -1
  29. ommlds/minichain/content/transform/metadata.py +1 -1
  30. ommlds/minichain/content/transform/standard.py +2 -2
  31. ommlds/minichain/content/transform/strings.py +1 -1
  32. ommlds/minichain/content/transform/templates.py +1 -1
  33. ommlds/minichain/metadata.py +13 -16
  34. ommlds/minichain/resources.py +22 -1
  35. ommlds/minichain/services/README.md +154 -0
  36. ommlds/minichain/services/__init__.py +6 -2
  37. ommlds/minichain/services/_marshal.py +46 -10
  38. ommlds/minichain/services/_origclasses.py +11 -0
  39. ommlds/minichain/services/_typedvalues.py +8 -3
  40. ommlds/minichain/services/requests.py +73 -3
  41. ommlds/minichain/services/responses.py +73 -3
  42. ommlds/minichain/services/services.py +9 -0
  43. ommlds/minichain/stream/services.py +24 -1
  44. ommlds/minichain/tools/reflect.py +3 -3
  45. ommlds/minichain/wrappers/firstinwins.py +29 -2
  46. ommlds/minichain/wrappers/instrument.py +146 -0
  47. ommlds/minichain/wrappers/retry.py +93 -3
  48. ommlds/minichain/wrappers/services.py +26 -0
  49. {ommlds-0.0.0.dev499.dist-info → ommlds-0.0.0.dev503.dist-info}/METADATA +6 -6
  50. {ommlds-0.0.0.dev499.dist-info → ommlds-0.0.0.dev503.dist-info}/RECORD +54 -52
  51. ommlds/minichain/stream/wrap.py +0 -62
  52. {ommlds-0.0.0.dev499.dist-info → ommlds-0.0.0.dev503.dist-info}/WHEEL +0 -0
  53. {ommlds-0.0.0.dev499.dist-info → ommlds-0.0.0.dev503.dist-info}/entry_points.txt +0 -0
  54. {ommlds-0.0.0.dev499.dist-info → ommlds-0.0.0.dev503.dist-info}/licenses/LICENSE +0 -0
  55. {ommlds-0.0.0.dev499.dist-info → ommlds-0.0.0.dev503.dist-info}/top_level.txt +0 -0
@@ -44,9 +44,9 @@
44
44
  "model_names": {
45
45
  "default": "claude",
46
46
  "aliases": {
47
- "claude-opus-4-1-20250805": null,
48
- "claude-opus-4-1": "claude-opus-4-1-20250805",
49
- "claude-opus": "claude-opus-4-1",
47
+ "claude-opus-4-5-20251101": null,
48
+ "claude-opus-4-5": "claude-opus-4-5-20251101",
49
+ "claude-opus": "claude-opus-4-5",
50
50
  "claude-sonnet-4-5-20250929": null,
51
51
  "claude-sonnet-4-5": "claude-sonnet-4-5-20250929",
52
52
  "claude-sonnet": "claude-sonnet-4-5",
@@ -93,7 +93,7 @@
93
93
  "module": ".minichain.backends.impls.cerebras.names",
94
94
  "attr": "_BACKEND_STRINGS_MANIFEST",
95
95
  "file": "ommlds/minichain/backends/impls/cerebras/names.py",
96
- "line": 22,
96
+ "line": 37,
97
97
  "value": {
98
98
  "!.minichain.backends.strings.manifests.BackendStringsManifest": {
99
99
  "service_cls_names": [
@@ -106,8 +106,15 @@
106
106
  "aliases": {
107
107
  "llama3.1-8b": null,
108
108
  "llama-3.3-70b": null,
109
+ "llama3": "llama-3.3-70b",
109
110
  "gpt-oss-120b": null,
110
- "qwen-3-32b": null
111
+ "gpt-oss": "gpt-oss-120b",
112
+ "qwen-3-32b": null,
113
+ "qwen3": "qwen-3-32b",
114
+ "qwen-3-235b-a22b-instruct-2507": null,
115
+ "qwen-3-235b": "qwen-3-235b-a22b-instruct-2507",
116
+ "zai-glm-4.7": null,
117
+ "glm": "zai-glm-4.7"
111
118
  }
112
119
  }
113
120
  }
@@ -210,7 +217,7 @@
210
217
  "module": ".minichain.backends.impls.google.names",
211
218
  "attr": "_BACKEND_STRINGS_MANIFEST",
212
219
  "file": "ommlds/minichain/backends/impls/google/names.py",
213
- "line": 32,
220
+ "line": 38,
214
221
  "value": {
215
222
  "!.minichain.backends.strings.manifests.BackendStringsManifest": {
216
223
  "service_cls_names": [
@@ -221,6 +228,10 @@
221
228
  "model_names": {
222
229
  "default": "gemini",
223
230
  "aliases": {
231
+ "gemini-3-pro-preview": null,
232
+ "gemini-3-pro": "gemini-3-pro-preview",
233
+ "gemini-3-flash-preview": null,
234
+ "gemini-3-flash": "gemini-3-flash-preview",
224
235
  "gemini-2.5-pro": null,
225
236
  "gemini-2.5-flash": null,
226
237
  "gemini-2.5-flash-lite": null,
@@ -252,7 +263,7 @@
252
263
  "module": ".minichain.backends.impls.groq.chat",
253
264
  "attr": null,
254
265
  "file": "ommlds/minichain/backends/impls/groq/chat.py",
255
- "line": 26,
266
+ "line": 27,
256
267
  "value": {
257
268
  "!.minichain.registries.manifests.RegistryManifest": {
258
269
  "module": "ommlds.minichain.backends.impls.groq.chat",
@@ -291,7 +302,7 @@
291
302
  "module": ".minichain.backends.impls.groq.stream",
292
303
  "attr": null,
293
304
  "file": "ommlds/minichain/backends/impls/groq/stream.py",
294
- "line": 33,
305
+ "line": 34,
295
306
  "value": {
296
307
  "!.minichain.registries.manifests.RegistryManifest": {
297
308
  "module": "ommlds.minichain.backends.impls.groq.stream",
@@ -636,7 +647,7 @@
636
647
  "module": ".minichain.backends.impls.openai.stream",
637
648
  "attr": null,
638
649
  "file": "ommlds/minichain/backends/impls/openai/stream.py",
639
- "line": 38,
650
+ "line": 45,
640
651
  "value": {
641
652
  "!.minichain.registries.manifests.RegistryManifest": {
642
653
  "module": "ommlds.minichain.backends.impls.openai.stream",
ommlds/__about__.py CHANGED
@@ -59,7 +59,7 @@ class Project(ProjectBase):
59
59
  ],
60
60
 
61
61
  'pillow': [
62
- 'pillow ~= 12.0',
62
+ 'pillow ~= 12.1',
63
63
  ],
64
64
 
65
65
  'search': [
@@ -56,6 +56,8 @@ class AnthropicSseDecoderEvents(lang.Namespace):
56
56
  delta: Delta
57
57
  usage: Usage
58
58
 
59
+ context_management: ta.Mapping[str, ta.Any] | None = None
60
+
59
61
  @dc.dataclass(frozen=True)
60
62
  class MessageStop(MessageEvent):
61
63
  pass
@@ -0,0 +1,9 @@
1
+ import typing as ta
2
+
3
+
4
+ ##
5
+
6
+
7
+ REQUIRED_HTTP_HEADERS: ta.Mapping[bytes, bytes] = {
8
+ b'User-Agent': b'python-httpx/0.28.1', # required or it 403's lol
9
+ }
@@ -3124,23 +3124,22 @@ def _process_dataclass__0f6d91dd6a878d827836d961e4683d55b1c9095a():
3124
3124
  @_register(
3125
3125
  plan_repr=(
3126
3126
  "Plans(tup=(CopyPlan(fields=('command', 'argv', 'help', 'arg_error')), EqPlan(fields=('command', 'argv', 'help'"
3127
- ", 'arg_error')), FrozenPlan(fields=('command', 'argv', 'help', 'arg_error'), allow_dynamic_dunder_attrs=False)"
3128
- ", HashPlan(action='add', fields=('command', 'argv', 'help', 'arg_error'), cache=False), InitPlan(fields=(InitP"
3129
- "lan.Field(name='command', annotation=OpRef(name='init.fields.0.annotation'), default=None, default_factory=Non"
3130
- "e, init=True, override=False, field_type=FieldType.INSTANCE, coerce=None, validate=None, check_type=None), Ini"
3131
- "tPlan.Field(name='argv', annotation=OpRef(name='init.fields.1.annotation'), default=None, default_factory=None"
3132
- ", init=True, override=False, field_type=FieldType.INSTANCE, coerce=None, validate=None, check_type=None), Init"
3133
- "Plan.Field(name='help', annotation=OpRef(name='init.fields.2.annotation'), default=None, default_factory=None,"
3134
- " init=True, override=False, field_type=FieldType.INSTANCE, coerce=None, validate=None, check_type=None), InitP"
3135
- "lan.Field(name='arg_error', annotation=OpRef(name='init.fields.3.annotation'), default=OpRef(name='init.fields"
3136
- ".3.default'), default_factory=None, init=True, override=False, field_type=FieldType.INSTANCE, coerce=None, val"
3137
- "idate=None, check_type=None)), self_param='self', std_params=('command', 'argv', 'help', 'arg_error'), kw_only"
3138
- "_params=(), frozen=True, slots=False, post_init_params=None, init_fns=(), validate_fns=()), ReprPlan(fields=(R"
3139
- "eprPlan.Field(name='command', kw_only=False, fn=None), ReprPlan.Field(name='argv', kw_only=False, fn=None), Re"
3140
- "prPlan.Field(name='help', kw_only=False, fn=None), ReprPlan.Field(name='arg_error', kw_only=False, fn=None)), "
3141
- "id=False, terse=False, default_fn=None)))"
3142
- ),
3143
- plan_repr_sha1='02a8469353c0212e2a85695c052b1bb12a809b51',
3127
+ ", 'arg_error')), HashPlan(action='set_none', fields=None, cache=None), InitPlan(fields=(InitPlan.Field(name='c"
3128
+ "ommand', annotation=OpRef(name='init.fields.0.annotation'), default=None, default_factory=None, init=True, ove"
3129
+ "rride=False, field_type=FieldType.INSTANCE, coerce=None, validate=None, check_type=None), InitPlan.Field(name="
3130
+ "'argv', annotation=OpRef(name='init.fields.1.annotation'), default=None, default_factory=None, init=True, over"
3131
+ "ride=False, field_type=FieldType.INSTANCE, coerce=None, validate=None, check_type=None), InitPlan.Field(name='"
3132
+ "help', annotation=OpRef(name='init.fields.2.annotation'), default=None, default_factory=None, init=True, overr"
3133
+ "ide=False, field_type=FieldType.INSTANCE, coerce=None, validate=None, check_type=None), InitPlan.Field(name='a"
3134
+ "rg_error', annotation=OpRef(name='init.fields.3.annotation'), default=OpRef(name='init.fields.3.default'), def"
3135
+ "ault_factory=None, init=True, override=False, field_type=FieldType.INSTANCE, coerce=None, validate=None, check"
3136
+ "_type=None)), self_param='self', std_params=('command', 'argv', 'help', 'arg_error'), kw_only_params=(), froze"
3137
+ "n=False, slots=False, post_init_params=None, init_fns=(), validate_fns=()), ReprPlan(fields=(ReprPlan.Field(na"
3138
+ "me='command', kw_only=False, fn=None), ReprPlan.Field(name='argv', kw_only=False, fn=None), ReprPlan.Field(nam"
3139
+ "e='help', kw_only=False, fn=None), ReprPlan.Field(name='arg_error', kw_only=False, fn=None)), id=False, terse="
3140
+ "False, default_fn=None)))"
3141
+ ),
3142
+ plan_repr_sha1='0843ef2470048b534567b0a1d3bd52e06d96c21b',
3144
3143
  op_ref_idents=(
3145
3144
  '__dataclass__init__fields__0__annotation',
3146
3145
  '__dataclass__init__fields__1__annotation',
@@ -3152,7 +3151,7 @@ def _process_dataclass__0f6d91dd6a878d827836d961e4683d55b1c9095a():
3152
3151
  ('ommlds.cli.sessions.chat.facades.facade', 'ArgsCommandError'),
3153
3152
  ),
3154
3153
  )
3155
- def _process_dataclass__02a8469353c0212e2a85695c052b1bb12a809b51():
3154
+ def _process_dataclass__0843ef2470048b534567b0a1d3bd52e06d96c21b():
3156
3155
  def _process_dataclass(
3157
3156
  *,
3158
3157
  __dataclass__cls,
@@ -3207,56 +3206,7 @@ def _process_dataclass__02a8469353c0212e2a85695c052b1bb12a809b51():
3207
3206
  raise __dataclass__TypeError(f"Cannot overwrite attribute __eq__ in class {__dataclass__cls.__name__}")
3208
3207
  setattr(__dataclass__cls, '__eq__', __eq__)
3209
3208
 
3210
- __dataclass___setattr_frozen_fields = {
3211
- 'command',
3212
- 'argv',
3213
- 'help',
3214
- 'arg_error',
3215
- }
3216
-
3217
- def __setattr__(self, name, value):
3218
- if (
3219
- type(self) is __dataclass__cls
3220
- or name in __dataclass___setattr_frozen_fields
3221
- ):
3222
- raise __dataclass__FrozenInstanceError(f"cannot assign to field {name!r}")
3223
- super(__dataclass__cls, self).__setattr__(name, value)
3224
-
3225
- __setattr__.__qualname__ = f"{__dataclass__cls.__qualname__}.__setattr__"
3226
- if '__setattr__' in __dataclass__cls.__dict__:
3227
- raise __dataclass__TypeError(f"Cannot overwrite attribute __setattr__ in class {__dataclass__cls.__name__}")
3228
- setattr(__dataclass__cls, '__setattr__', __setattr__)
3229
-
3230
- __dataclass___delattr_frozen_fields = {
3231
- 'command',
3232
- 'argv',
3233
- 'help',
3234
- 'arg_error',
3235
- }
3236
-
3237
- def __delattr__(self, name):
3238
- if (
3239
- type(self) is __dataclass__cls
3240
- or name in __dataclass___delattr_frozen_fields
3241
- ):
3242
- raise __dataclass__FrozenInstanceError(f"cannot delete field {name!r}")
3243
- super(__dataclass__cls, self).__delattr__(name)
3244
-
3245
- __delattr__.__qualname__ = f"{__dataclass__cls.__qualname__}.__delattr__"
3246
- if '__delattr__' in __dataclass__cls.__dict__:
3247
- raise __dataclass__TypeError(f"Cannot overwrite attribute __delattr__ in class {__dataclass__cls.__name__}")
3248
- setattr(__dataclass__cls, '__delattr__', __delattr__)
3249
-
3250
- def __hash__(self):
3251
- return hash((
3252
- self.command,
3253
- self.argv,
3254
- self.help,
3255
- self.arg_error,
3256
- ))
3257
-
3258
- __hash__.__qualname__ = f"{__dataclass__cls.__qualname__}.__hash__"
3259
- setattr(__dataclass__cls, '__hash__', __hash__)
3209
+ setattr(__dataclass__cls, '__hash__', None)
3260
3210
 
3261
3211
  def __init__(
3262
3212
  self,
@@ -3265,10 +3215,10 @@ def _process_dataclass__02a8469353c0212e2a85695c052b1bb12a809b51():
3265
3215
  help: __dataclass__init__fields__2__annotation,
3266
3216
  arg_error: __dataclass__init__fields__3__annotation = __dataclass__init__fields__3__default,
3267
3217
  ) -> __dataclass__None:
3268
- __dataclass__object_setattr(self, 'command', command)
3269
- __dataclass__object_setattr(self, 'argv', argv)
3270
- __dataclass__object_setattr(self, 'help', help)
3271
- __dataclass__object_setattr(self, 'arg_error', arg_error)
3218
+ self.command = command
3219
+ self.argv = argv
3220
+ self.help = help
3221
+ self.arg_error = arg_error
3272
3222
 
3273
3223
  __init__.__qualname__ = f"{__dataclass__cls.__qualname__}.__init__"
3274
3224
  if '__init__' in __dataclass__cls.__dict__:
@@ -91,6 +91,26 @@ def bind_backends(cfg: BackendConfig = BackendConfig()) -> inj.Elements:
91
91
  else:
92
92
  lst.append(bp_stack.push_bind(to_ctor=bp_impl, singleton=True))
93
93
 
94
+ if bp_iface is _types.ChatChoicesServiceBackendProvider:
95
+ rt_key: inj.Key = inj.Key(_meta.RetryBackendProvider, tag=bp_iface)
96
+ lst.extend([
97
+ inj.private(
98
+ inj.bind(_types.BackendProvider, to_key=bp_stack.top),
99
+ inj.bind(rt_key, to_ctor=_meta.RetryBackendProvider, singleton=True, expose=True),
100
+ ),
101
+ bp_stack.push_bind(to_key=rt_key),
102
+ ])
103
+
104
+ elif bp_iface is _types.ChatChoicesStreamServiceBackendProvider:
105
+ rts_key: inj.Key = inj.Key(_meta.RetryStreamBackendProvider, tag=bp_iface)
106
+ lst.extend([
107
+ inj.private(
108
+ inj.bind(_types.BackendProvider, to_key=bp_stack.top),
109
+ inj.bind(rts_key, to_ctor=_meta.RetryStreamBackendProvider, singleton=True, expose=True),
110
+ ),
111
+ bp_stack.push_bind(to_key=rts_key),
112
+ ])
113
+
94
114
  lst.append(inj.bind(bp_iface, to_key=bp_stack.top))
95
115
 
96
116
  #
@@ -6,6 +6,7 @@ from .types import BackendProvider
6
6
 
7
7
 
8
8
  ServiceT = ta.TypeVar('ServiceT', bound=mc.Service)
9
+ StreamServiceT = ta.TypeVar('StreamServiceT', bound=mc.Service)
9
10
 
10
11
 
11
12
  ##
@@ -33,3 +34,49 @@ class FirstInWinsBackendProvider(BackendProvider[ServiceT]):
33
34
  yield AsyncioFirstInWinsService(*svcs)
34
35
 
35
36
  return inner()
37
+
38
+
39
+ ##
40
+
41
+
42
+ class RetryBackendProvider(BackendProvider):
43
+ def __init__(
44
+ self,
45
+ backend_provider: BackendProvider,
46
+ ) -> None:
47
+ super().__init__()
48
+
49
+ self._backend_provider = backend_provider
50
+
51
+ def provide_backend(self) -> ta.AsyncContextManager:
52
+ @contextlib.asynccontextmanager
53
+ async def inner():
54
+ async with contextlib.AsyncExitStack() as aes:
55
+ yield mc.RetryService(
56
+ await aes.enter_async_context(self._backend_provider.provide_backend()),
57
+ )
58
+
59
+ return inner()
60
+
61
+
62
+ ##
63
+
64
+
65
+ class RetryStreamBackendProvider(BackendProvider):
66
+ def __init__(
67
+ self,
68
+ backend_provider: BackendProvider,
69
+ ) -> None:
70
+ super().__init__()
71
+
72
+ self._backend_provider = backend_provider
73
+
74
+ def provide_backend(self) -> ta.AsyncContextManager:
75
+ @contextlib.asynccontextmanager
76
+ async def inner():
77
+ async with contextlib.AsyncExitStack() as aes:
78
+ yield mc.RetryStreamService(
79
+ await aes.enter_async_context(self._backend_provider.provide_backend()),
80
+ )
81
+
82
+ return inner()
@@ -24,17 +24,13 @@ class ToolExecutingAiChatGenerator(AiChatGenerator):
24
24
  while True:
25
25
  new = await self._wrapped.get_next_ai_messages([*chat, *out])
26
26
 
27
- out.extend(new)
28
-
29
27
  cont = False
30
28
 
31
29
  for msg in new:
30
+ out.append(msg)
31
+
32
32
  if isinstance(msg, mc.ToolUseMessage):
33
- trm = await self._executor.execute_tool_use(
34
- msg.tu,
35
- # fs_tool_context,
36
- # todo_tool_context, # noqa
37
- )
33
+ trm = await self._executor.execute_tool_use(msg.tu)
38
34
 
39
35
  out.append(trm)
40
36
 
@@ -13,7 +13,7 @@ class CommandError(Exception):
13
13
  pass
14
14
 
15
15
 
16
- @dc.dataclass(frozen=True)
16
+ @dc.dataclass()
17
17
  class ArgsCommandError(CommandError):
18
18
  command: 'Command'
19
19
  argv: ta.Sequence[str]
@@ -40,7 +40,7 @@ ChatEventQueue = ta.NewType('ChatEventQueue', asyncio.Queue)
40
40
  ##
41
41
 
42
42
 
43
- class ChatAppGetter(lang.CachedFunc0[ta.Awaitable['ChatApp']]):
43
+ class ChatAppGetter(lang.AsyncCachedFunc0['ChatApp']):
44
44
  pass
45
45
 
46
46
 
@@ -427,11 +427,18 @@ with _lang.auto_proxy_init(
427
427
  ##
428
428
 
429
429
  from .services import ( # noqa
430
+ ServiceFacade,
431
+ facade,
432
+
433
+ RequestMetadata,
434
+ RequestMetadatas,
430
435
  Request,
436
+
437
+ ResponseMetadata,
438
+ ResponseMetadatas,
431
439
  Response,
440
+
432
441
  Service,
433
- ServiceFacade,
434
- facade,
435
442
  )
436
443
 
437
444
  ##
@@ -450,10 +457,6 @@ with _lang.auto_proxy_init(
450
457
  new_stream_response,
451
458
  )
452
459
 
453
- from .stream.wrap import ( # noqa
454
- WrappedStreamService,
455
- )
456
-
457
460
  ##
458
461
 
459
462
  from .tools.execution.catalog import ( # noqa
@@ -596,6 +599,44 @@ with _lang.auto_proxy_init(
596
599
 
597
600
  ##
598
601
 
602
+ from .wrappers.retry import ( # noqa
603
+ AnyRetryService,
604
+
605
+ RetryServiceMaxRetriesExceededError,
606
+ RetryServiceOutput,
607
+
608
+ RetryService,
609
+
610
+ RetryStreamService,
611
+ )
612
+
613
+ from .wrappers.services import ( # noqa
614
+ WrappedRequestV,
615
+ WrappedOptionT,
616
+ WrappedResponseV,
617
+ WrappedOutputT,
618
+ WrappedRequest,
619
+ WrappedResponse,
620
+ WrappedService,
621
+
622
+ WrapperService,
623
+ MultiWrapperService,
624
+
625
+ wrap_service,
626
+ )
627
+
628
+ from .wrappers.stream import ( # noqa
629
+ WrappedStreamOutputT,
630
+ WrappedStreamOptions,
631
+ WrappedStreamRequest,
632
+ WrappedStreamResponse,
633
+ WrappedStreamService,
634
+
635
+ WrapperStreamService,
636
+ )
637
+
638
+ ##
639
+
599
640
  from .completion import ( # noqa
600
641
  CompletionOption,
601
642
  CompletionOptions,