sequence-base 0.4.29__tar.gz → 0.4.30__tar.gz

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 (123) hide show
  1. {sequence_base-0.4.29 → sequence_base-0.4.30}/PKG-INFO +1 -1
  2. {sequence_base-0.4.29 → sequence_base-0.4.30}/pyproject.toml +1 -1
  3. sequence_base-0.4.30/sequence_base/by_name.py +90 -0
  4. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/constants/version.py +2 -1
  5. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/construct.py +26 -5
  6. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/policy.py +14 -7
  7. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ActRequest.json +1 -1
  8. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ActResponse.json +1 -1
  9. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ActionChunk.json +1 -1
  10. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ActionContract.json +1 -1
  11. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ActionStep.json +1 -1
  12. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Actions.json +1 -1
  13. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/AdapterPair.json +1 -1
  14. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/AddLocal.json +1 -1
  15. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Autoscaler.json +1 -1
  16. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
  17. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
  18. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/BenchmarkSpec.json +2 -2
  19. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  20. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/BootstrapResponse.json +1 -1
  21. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Camera.json +1 -1
  22. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/CodeBundle.json +1 -1
  23. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Concurrency.json +1 -1
  24. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Conditions.json +1 -1
  25. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ConnectRequest.json +1 -1
  26. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ConnectResponse.json +1 -1
  27. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  28. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/DeploymentPolicy.json +1 -1
  29. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/DeploymentRequest.json +1 -1
  30. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  31. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Embodiment.json +1 -1
  32. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ErrorBody.json +1 -1
  33. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ErrorCodes.json +1 -1
  34. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Estimate.json +1 -1
  35. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
  36. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/EvalReport.json +1 -1
  37. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/EvalRequest.json +1 -1
  38. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/EvalResponse.json +1 -1
  39. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageFrame.json +1 -1
  40. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageSpec.json +1 -1
  41. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  42. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageStepApt.json +1 -1
  43. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageStepEnv.json +1 -1
  44. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageStepProject.json +1 -1
  45. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageStepRun.json +1 -1
  46. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
  47. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  48. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/InferParam.json +1 -1
  49. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Lease.json +1 -1
  50. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/MetricAgg.json +1 -1
  51. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Observation.json +1 -1
  52. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ObservationContract.json +1 -1
  53. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Observations.json +1 -1
  54. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ObserveRequest.json +1 -1
  55. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ObserveResponse.json +1 -1
  56. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/PolicyRegistration.json +6 -5
  57. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/PolicySpec.json +1 -1
  58. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Project.json +1 -1
  59. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Proprioception.json +1 -1
  60. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/RenderSpec.json +1 -1
  61. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/ReplaySpec.json +1 -1
  62. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Resources.json +1 -1
  63. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/RolloutResult.json +1 -1
  64. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  65. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/SecretInfo.json +1 -1
  66. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/SecretRef.json +1 -1
  67. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/SeqFlags.json +1 -1
  68. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Step.json +1 -1
  69. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Stream.json +1 -1
  70. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/TaskAgg.json +1 -1
  71. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/TemplateFiles.json +1 -1
  72. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Tensors.json +1 -1
  73. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Timeouts.json +1 -1
  74. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/UploadTarget.json +1 -1
  75. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/Variant.json +1 -1
  76. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/VolumeFile.json +1 -1
  77. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/VolumeInfo.json +1 -1
  78. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/VolumeMount.json +1 -1
  79. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/VolumeRef.json +1 -1
  80. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  81. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  82. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schemas/WarmingError.json +1 -1
  83. {sequence_base-0.4.29 → sequence_base-0.4.30}/.gitignore +0 -0
  84. {sequence_base-0.4.29 → sequence_base-0.4.30}/README.md +0 -0
  85. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/__init__.py +0 -0
  86. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/auth.py +0 -0
  87. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/codec/__init__.py +0 -0
  88. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/codec/image.py +0 -0
  89. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/constants/__init__.py +0 -0
  90. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/constants/cards.py +0 -0
  91. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/constants/headers.py +0 -0
  92. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/constants/limits.py +0 -0
  93. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/__init__.py +0 -0
  94. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/accounts.py +0 -0
  95. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/act.py +0 -0
  96. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/adapters.py +0 -0
  97. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/benchmarks.py +0 -0
  98. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/connect.py +0 -0
  99. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/deployments.py +0 -0
  100. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/errors.py +0 -0
  101. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/eval.py +0 -0
  102. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/flags.py +0 -0
  103. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/io.py +0 -0
  104. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/obs_schedule.py +0 -0
  105. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/observe.py +0 -0
  106. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/own_io.py +0 -0
  107. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/templates.py +0 -0
  108. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/volumes.py +0 -0
  109. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/contract/wire.py +0 -0
  110. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/episode.py +0 -0
  111. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/errors/__init__.py +0 -0
  112. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/errors/transport.py +0 -0
  113. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/feedback.py +0 -0
  114. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/msgpack_io.py +0 -0
  115. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/obs/__init__.py +0 -0
  116. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/obs/log.py +0 -0
  117. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/obs/rid.py +0 -0
  118. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/presets/__init__.py +0 -0
  119. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/presets/frames.py +0 -0
  120. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/presets/robot_arm.py +0 -0
  121. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/schema_export.py +0 -0
  122. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/telemetry/__init__.py +0 -0
  123. {sequence_base-0.4.29 → sequence_base-0.4.30}/sequence_base/telemetry/events.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sequence-base
3
- Version: 0.4.29
3
+ Version: 0.4.30
4
4
  Summary: Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness.
5
5
  Project-URL: Changelog, https://generalsequences.com/docs/changelog/
6
6
  Requires-Python: >=3.10
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sequence-base"
3
- version = "0.4.29"
3
+ version = "0.4.30"
4
4
  description = "Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness."
5
5
  requires-python = ">=3.10"
6
6
  dependencies = ["pydantic>=2.0"]
@@ -0,0 +1,90 @@
1
+ """
2
+ Which arguments of a method a policy class names (infer=, observe=) an act's inputs fill: the inputs whole, its one
3
+ argument - or, when it takes two or more without a default, each key of the inputs to its argument of that name.
4
+
5
+ In one sentence: `takes_by_name(parameters, platform)` reads the method's arguments - less *args, **kwargs and the ones
6
+ the platform hands it itself (`platform`: INFER_PLATFORM, OBSERVE_PLATFORM) → two or more of them without a default:
7
+ it takes its inputs by name (ByName), each of its arguments a key - one without a default a key the inputs must hold,
8
+ one with a default a key they may → `ByName.call(inputs, what)` makes what it is called with, refusing inputs that are
9
+ no dict, lack a key it needs, or hold one it takes no argument for (unless it takes **kwargs), each named; fewer than
10
+ two: None, the inputs go to its first argument whole and its others with a default are inference parameters, as before.
11
+
12
+ WHY by the arguments without a default: a method that needs two or more could never be handed an act's inputs whole -
13
+ the platform refused to deploy one - so binding them by name changes nothing a class deployed today does, and a method
14
+ that takes one beside its inference parameters keeps taking its inputs whole. The SDK reads the rule when a class is
15
+ declared (seq/named.py, registry.infer_params), the worker when it calls the method (harness/handler/loader.py): one
16
+ rule on both sides.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import inspect
21
+ from collections.abc import Iterable, Mapping
22
+ from dataclasses import dataclass
23
+ from typing import Any
24
+
25
+ __all__ = ["INFER_PLATFORM", "OBSERVE_PLATFORM", "ByName", "takes_by_name"]
26
+
27
+
28
+
29
+ INFER_PLATFORM = frozenset({"seed", "episode_id", "episode", "feedback", "plan", "robot", "embodiment"})
30
+ OBSERVE_PLATFORM = frozenset({"step"})
31
+
32
+ _VARIADIC = (inspect.Parameter.VAR_POSITIONAL, inspect.Parameter.VAR_KEYWORD)
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class ByName:
37
+ """A method that takes an act's inputs by name: `names`, the arguments they fill, in order; `required`, those with
38
+ no default; `positional`, those it takes by position only (before a `/`); `rest`, whether it takes **kwargs - any
39
+ other key of the inputs going there; `platform`, the names the platform hands it itself."""
40
+
41
+ names: tuple[str, ...]
42
+ required: tuple[str, ...]
43
+ positional: tuple[str, ...]
44
+ rest: bool
45
+ platform: frozenset[str]
46
+
47
+ def call(self, inputs: Any, what: str) -> tuple[list, dict]:
48
+ """(args, kwargs) the method `what` ("Model.predict") is called with for an act's `inputs`; ValueError, in its
49
+ words, for inputs that are not a dict of its arguments."""
50
+ takes = ", ".join(n if n in self.required else f"{n} (optional)" for n in self.names)
51
+ if not isinstance(inputs, Mapping):
52
+ raise ValueError(f"{what} takes its inputs by name ({takes}): an act's inputs are a dict of them, and "
53
+ f"these are a {type(inputs).__name__}")
54
+ missing = [n for n in self.required if n not in inputs]
55
+ extra = [k for k in inputs if k not in self.names
56
+ and not (self.rest and isinstance(k, str) and k not in self.platform)]
57
+ if missing or extra:
58
+ held = f"lack {_keys(missing)}" if missing else ""
59
+ if extra:
60
+ held += (" and " if held else "") + f"hold {_keys(extra)}, which it takes no argument for"
61
+ ours = [k for k in extra if k in self.platform]
62
+ mine = f" ({_keys(ours)}: the platform's to hand it)" if ours else ""
63
+ raise ValueError(f"{what} takes its inputs by name ({takes}), and these {held}{mine}")
64
+ args: list = []
65
+ for i, name in enumerate(self.positional):
66
+ if name not in inputs:
67
+ later = next((n for n in self.positional[i + 1:] if n in inputs), None)
68
+ if later is not None:
69
+ raise ValueError(f"{what} takes {name} and {later} by position only, in that order: these hold "
70
+ f"{later!r} and no {name!r}")
71
+ break
72
+ args.append(inputs[name])
73
+ return args, {k: v for k, v in inputs.items() if k not in self.positional}
74
+
75
+
76
+ def takes_by_name(parameters: Iterable[inspect.Parameter], platform: frozenset[str] = frozenset()) -> ByName | None:
77
+ """How a method of these `parameters` (self left out) takes an act's inputs: by name (ByName) when two or more of
78
+ its arguments - *args, **kwargs and `platform`'s left out - have no default, else None: whole, as one argument."""
79
+ every = list(parameters)
80
+ params = [p for p in every if p.kind not in _VARIADIC and p.name not in platform]
81
+ required = tuple(p.name for p in params if p.default is inspect.Parameter.empty)
82
+ if len(required) < 2:
83
+ return None
84
+ return ByName(names=tuple(p.name for p in params), required=required,
85
+ positional=tuple(p.name for p in params if p.kind is inspect.Parameter.POSITIONAL_ONLY),
86
+ rest=any(p.kind is inspect.Parameter.VAR_KEYWORD for p in every), platform=frozenset(platform))
87
+
88
+
89
+ def _keys(names: list) -> str:
90
+ return ", ".join(repr(n) for n in names)
@@ -4,7 +4,8 @@
4
4
 
5
5
 
6
6
 
7
- CONTRACT_VERSION = "0.5.26"
7
+ CONTRACT_VERSION = "0.5.27"
8
+
8
9
 
9
10
 
10
11
 
@@ -1,10 +1,12 @@
1
1
  """
2
2
  How a policy class that names its own methods is built (PolicyRegistration.constructor): its constructor - or the
3
- factory it names - called with the arguments its decorator was given, once two forms in them are filled in.
3
+ factory it names, a classmethod of it or a module's function - called with the arguments its decorator was given, once
4
+ two forms in them are filled in.
4
5
 
5
6
  In one sentence: a value {"$config": path, "$set": {...}} becomes the YAML or JSON file at `path` - from the folder of
6
7
  the class's file - read where the policy runs, with `$set`'s keys laid over its top level → in every string,
7
8
  "{weights}" becomes the weights directory and "{weights.<part>}" a named part's → `cls.<make>(*args, **kwargs)`, or
9
+ `function(*args, **kwargs)` for make="package.module:function" - the module imported where the policy runs - or
8
10
  `cls(*args, **kwargs)` without a factory.
9
11
 
10
12
  WHY a config file is read where the policy runs: it is part of the project (XPolicyLab's deploy.yml beside its
@@ -14,12 +16,14 @@ worker's directory.
14
16
  """
15
17
  from __future__ import annotations
16
18
 
19
+ import importlib
17
20
  import json
18
21
  import os
19
22
  import re
20
23
  from typing import Any
21
24
 
22
- __all__ = ["CONFIG_KEY", "SET_KEY", "ConstructError", "build", "config", "expand", "is_config", "read_config"]
25
+ __all__ = ["CONFIG_KEY", "SET_KEY", "ConstructError", "build", "config", "expand", "is_config", "maker",
26
+ "read_config"]
23
27
 
24
28
  CONFIG_KEY, SET_KEY = "$config", "$set"
25
29
  _WEIGHTS = re.compile(r"\{weights(?:\.([A-Za-z_][A-Za-z0-9_-]*))?\}")
@@ -96,8 +100,25 @@ def _weights_of(part: str | None, weights: Any) -> str:
96
100
 
97
101
 
98
102
  def build(cls: type, constructor: Any, *, base_dir: str, weights: Any) -> Any:
99
- """The instance `constructor` (a PolicyConstructor) makes of `cls`: `cls.<make>(*args, **kwargs)` or `cls(...)`."""
103
+ """The instance `constructor` (a PolicyConstructor) makes of `cls`: `cls.<make>(*args, **kwargs)`, the function
104
+ make="package.module:function" names called so, or `cls(...)`."""
100
105
  args = expand(list(constructor.args), base_dir=base_dir, weights=weights)
101
106
  kwargs = expand(dict(constructor.kwargs), base_dir=base_dir, weights=weights)
102
- make = getattr(cls, constructor.make) if constructor.make else cls
103
- return make(*args, **kwargs)
107
+ return maker(cls, constructor.make)(*args, **kwargs)
108
+
109
+
110
+ def maker(cls: type, make: str | None) -> Any:
111
+ """What builds the instance: `cls` for no make=, its classmethod or staticmethod `make`, or - make written
112
+ "package.module:function" - that module's function, the module imported (as the policy's code imports it).
113
+ """
114
+ if not make:
115
+ return cls
116
+ module, colon, name = make.rpartition(":")
117
+ if not colon:
118
+ return getattr(cls, make)
119
+ found = getattr(importlib.import_module(module), name, None)
120
+ if found is None:
121
+ raise ConstructError(f"make={make!r}: {module} has no function {name!r}")
122
+ if not callable(found):
123
+ raise ConstructError(f"make={make!r}: {module}.{name} is not callable ({type(found).__name__})")
124
+ return found
@@ -482,19 +482,26 @@ def check_weights_parts(weights_name: str | None, extra: dict) -> None:
482
482
  raise ValueError(f"at most {MAX_WEIGHTS_PARTS} weights parts")
483
483
 
484
484
 
485
+
486
+ _MAKE = r"^(?:[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*:)?[A-Za-z_][A-Za-z0-9_]*$"
487
+
488
+
485
489
  class PolicyConstructor(BaseModel):
486
490
  """How the worker builds a policy class that names its own methods (`@seq.policy(infer="get_action", ...)`): its
487
- own constructor, or the factory it names (`make`, e.g. LeRobot's `from_pretrained`), called with `args` and
488
- `kwargs` where `@seq.load` would run - the replica's cold start, the weights on disk. The values are the user's own,
489
- as JSON carries them, but for two forms the worker fills in first (sequence_base.construct.expand): a config file's
490
- contents, `{"$config": <its path from the class's file>, "$set": {<keys laid over it>}}`, YAML or JSON, and in any
491
- string `"{weights}"` (the weights directory) or `"{weights.<part>}"` (a named part's).
491
+ own constructor, or the factory it names (`make`: a classmethod of it, e.g. LeRobot's `from_pretrained`, or a
492
+ module's function, "package.module:function", whose return is the instance its methods are called on), called
493
+ with `args` and `kwargs` where `@seq.load` would run - the replica's cold start, the weights on disk. The values are
494
+ the user's own, as JSON carries them, but for two forms the worker fills in first (sequence_base.construct.expand):
495
+ a config file's contents, `{"$config": <its path from the class's file>, "$set": {<keys laid over it>}}`, YAML or
496
+ JSON, and in any string `"{weights}"` (the weights directory) or `"{weights.<part>}"` (a named part's).
497
+
492
498
  """
493
499
 
494
500
  model_config = ConfigDict(extra="forbid")
495
501
 
496
- make: str | None = Field(default=None, pattern=r"^[A-Za-z_][A-Za-z0-9_]*$",
497
- description="a classmethod or staticmethod that returns the instance; None: the class")
502
+ make: str | None = Field(default=None, max_length=512, pattern=_MAKE,
503
+ description="a classmethod or staticmethod that returns the instance, or a module's "
504
+ "function, 'package.module:function' (contract 0.5.27); None: the class")
498
505
  args: list[Any] = Field(default_factory=list, description="positional arguments, in order")
499
506
  kwargs: dict[str, Any] = Field(default_factory=dict, description="keyword arguments")
500
507
 
@@ -107,5 +107,5 @@
107
107
  ],
108
108
  "title": "ActRequest",
109
109
  "type": "object",
110
- "x-contract-version": "0.5.26"
110
+ "x-contract-version": "0.5.27"
111
111
  }
@@ -89,5 +89,5 @@
89
89
  ],
90
90
  "title": "ActResponse",
91
91
  "type": "object",
92
- "x-contract-version": "0.5.26"
92
+ "x-contract-version": "0.5.27"
93
93
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "ActionChunk",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.26"
102
+ "x-contract-version": "0.5.27"
103
103
  }
@@ -96,5 +96,5 @@
96
96
  ],
97
97
  "title": "ActionContract",
98
98
  "type": "object",
99
- "x-contract-version": "0.5.26"
99
+ "x-contract-version": "0.5.27"
100
100
  }
@@ -19,5 +19,5 @@
19
19
  ],
20
20
  "title": "ActionStep",
21
21
  "type": "object",
22
- "x-contract-version": "0.5.26"
22
+ "x-contract-version": "0.5.27"
23
23
  }
@@ -59,5 +59,5 @@
59
59
  },
60
60
  "title": "Actions",
61
61
  "type": "object",
62
- "x-contract-version": "0.5.26"
62
+ "x-contract-version": "0.5.27"
63
63
  }
@@ -17,5 +17,5 @@
17
17
  ],
18
18
  "title": "AdapterPair",
19
19
  "type": "object",
20
- "x-contract-version": "0.5.26"
20
+ "x-contract-version": "0.5.27"
21
21
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "AddLocal",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.26"
26
+ "x-contract-version": "0.5.27"
27
27
  }
@@ -57,5 +57,5 @@
57
57
  },
58
58
  "title": "Autoscaler",
59
59
  "type": "object",
60
- "x-contract-version": "0.5.26"
60
+ "x-contract-version": "0.5.27"
61
61
  }
@@ -50,5 +50,5 @@
50
50
  ],
51
51
  "title": "BenchmarkConditionSpec",
52
52
  "type": "object",
53
- "x-contract-version": "0.5.26"
53
+ "x-contract-version": "0.5.27"
54
54
  }
@@ -1089,5 +1089,5 @@
1089
1089
  ],
1090
1090
  "title": "BenchmarkRegisterRequest",
1091
1091
  "type": "object",
1092
- "x-contract-version": "0.5.26"
1092
+ "x-contract-version": "0.5.27"
1093
1093
  }
@@ -471,7 +471,7 @@
471
471
  ],
472
472
  "title": "SeqFlags",
473
473
  "type": "integer",
474
- "x-contract-version": "0.5.26",
474
+ "x-contract-version": "0.5.27",
475
475
  "x-flag-names": {
476
476
  "CHECK": 65536,
477
477
  "INFER": 16,
@@ -722,5 +722,5 @@
722
722
  ],
723
723
  "title": "BenchmarkSpec",
724
724
  "type": "object",
725
- "x-contract-version": "0.5.26"
725
+ "x-contract-version": "0.5.27"
726
726
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "BenchmarkStatusResponse",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.26"
43
+ "x-contract-version": "0.5.27"
44
44
  }
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "BootstrapResponse",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.26"
82
+ "x-contract-version": "0.5.27"
83
83
  }
@@ -122,5 +122,5 @@
122
122
  ],
123
123
  "title": "Camera",
124
124
  "type": "object",
125
- "x-contract-version": "0.5.26"
125
+ "x-contract-version": "0.5.27"
126
126
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "CodeBundle",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.26"
26
+ "x-contract-version": "0.5.27"
27
27
  }
@@ -96,5 +96,5 @@
96
96
  },
97
97
  "title": "Concurrency",
98
98
  "type": "object",
99
- "x-contract-version": "0.5.26"
99
+ "x-contract-version": "0.5.27"
100
100
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "Conditions",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.26"
58
+ "x-contract-version": "0.5.27"
59
59
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "ConnectRequest",
27
27
  "type": "object",
28
- "x-contract-version": "0.5.26"
28
+ "x-contract-version": "0.5.27"
29
29
  }
@@ -604,5 +604,5 @@
604
604
  ],
605
605
  "title": "ConnectResponse",
606
606
  "type": "object",
607
- "x-contract-version": "0.5.26"
607
+ "x-contract-version": "0.5.27"
608
608
  }
@@ -18,5 +18,5 @@
18
18
  ],
19
19
  "title": "DeploymentAccepted",
20
20
  "type": "object",
21
- "x-contract-version": "0.5.26"
21
+ "x-contract-version": "0.5.27"
22
22
  }
@@ -833,5 +833,5 @@
833
833
  ],
834
834
  "title": "DeploymentPolicy",
835
835
  "type": "object",
836
- "x-contract-version": "0.5.26"
836
+ "x-contract-version": "0.5.27"
837
837
  }
@@ -1614,5 +1614,5 @@
1614
1614
  ],
1615
1615
  "title": "DeploymentRequest",
1616
1616
  "type": "object",
1617
- "x-contract-version": "0.5.26"
1617
+ "x-contract-version": "0.5.27"
1618
1618
  }
@@ -58,5 +58,5 @@
58
58
  ],
59
59
  "title": "DeploymentStatusResponse",
60
60
  "type": "object",
61
- "x-contract-version": "0.5.26"
61
+ "x-contract-version": "0.5.27"
62
62
  }
@@ -297,5 +297,5 @@
297
297
  ],
298
298
  "title": "Embodiment",
299
299
  "type": "object",
300
- "x-contract-version": "0.5.26"
300
+ "x-contract-version": "0.5.27"
301
301
  }
@@ -94,5 +94,5 @@
94
94
  ],
95
95
  "title": "ErrorBody",
96
96
  "type": "object",
97
- "x-contract-version": "0.5.26"
97
+ "x-contract-version": "0.5.27"
98
98
  }
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "title": "ErrorCode",
24
24
  "type": "string",
25
- "x-contract-version": "0.5.26",
25
+ "x-contract-version": "0.5.27",
26
26
  "x-errors": {
27
27
  "budget_exhausted": {
28
28
  "exit_code": 6,
@@ -60,5 +60,5 @@
60
60
  ],
61
61
  "title": "Estimate",
62
62
  "type": "object",
63
- "x-contract-version": "0.5.26"
63
+ "x-contract-version": "0.5.27"
64
64
  }
@@ -240,5 +240,5 @@
240
240
  ],
241
241
  "title": "EvalDryRunResponse",
242
242
  "type": "object",
243
- "x-contract-version": "0.5.26"
243
+ "x-contract-version": "0.5.27"
244
244
  }
@@ -432,5 +432,5 @@
432
432
  ],
433
433
  "title": "EvalReport",
434
434
  "type": "object",
435
- "x-contract-version": "0.5.26"
435
+ "x-contract-version": "0.5.27"
436
436
  }
@@ -318,5 +318,5 @@
318
318
  },
319
319
  "title": "EvalRequest",
320
320
  "type": "object",
321
- "x-contract-version": "0.5.26"
321
+ "x-contract-version": "0.5.27"
322
322
  }
@@ -153,5 +153,5 @@
153
153
  ],
154
154
  "title": "EvalResponse",
155
155
  "type": "object",
156
- "x-contract-version": "0.5.26"
156
+ "x-contract-version": "0.5.27"
157
157
  }
@@ -49,5 +49,5 @@
49
49
  ],
50
50
  "title": "ImageFrame",
51
51
  "type": "object",
52
- "x-contract-version": "0.5.26"
52
+ "x-contract-version": "0.5.27"
53
53
  }
@@ -348,5 +348,5 @@
348
348
  },
349
349
  "title": "ImageSpec",
350
350
  "type": "object",
351
- "x-contract-version": "0.5.26"
351
+ "x-contract-version": "0.5.27"
352
352
  }
@@ -38,5 +38,5 @@
38
38
  ],
39
39
  "title": "ImageStepAddLocal",
40
40
  "type": "object",
41
- "x-contract-version": "0.5.26"
41
+ "x-contract-version": "0.5.27"
42
42
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepApt",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.26"
17
+ "x-contract-version": "0.5.27"
18
18
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepEnv",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.26"
17
+ "x-contract-version": "0.5.27"
18
18
  }
@@ -87,5 +87,5 @@
87
87
  ],
88
88
  "title": "ImageStepProject",
89
89
  "type": "object",
90
- "x-contract-version": "0.5.26"
90
+ "x-contract-version": "0.5.27"
91
91
  }
@@ -46,5 +46,5 @@
46
46
  ],
47
47
  "title": "ImageStepRun",
48
48
  "type": "object",
49
- "x-contract-version": "0.5.26"
49
+ "x-contract-version": "0.5.27"
50
50
  }
@@ -37,5 +37,5 @@
37
37
  ],
38
38
  "title": "ImageStepTemplateFiles",
39
39
  "type": "object",
40
- "x-contract-version": "0.5.26"
40
+ "x-contract-version": "0.5.27"
41
41
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepUvPip",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.26"
17
+ "x-contract-version": "0.5.27"
18
18
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "InferParam",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.26"
102
+ "x-contract-version": "0.5.27"
103
103
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "Lease",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.26"
27
+ "x-contract-version": "0.5.27"
28
28
  }
@@ -51,5 +51,5 @@
51
51
  ],
52
52
  "title": "MetricAgg",
53
53
  "type": "object",
54
- "x-contract-version": "0.5.26"
54
+ "x-contract-version": "0.5.27"
55
55
  }
@@ -169,5 +169,5 @@
169
169
  ],
170
170
  "title": "Observation",
171
171
  "type": "object",
172
- "x-contract-version": "0.5.26"
172
+ "x-contract-version": "0.5.27"
173
173
  }
@@ -170,5 +170,5 @@
170
170
  },
171
171
  "title": "ObservationContract",
172
172
  "type": "object",
173
- "x-contract-version": "0.5.26"
173
+ "x-contract-version": "0.5.27"
174
174
  }
@@ -260,5 +260,5 @@
260
260
  },
261
261
  "title": "Observations",
262
262
  "type": "object",
263
- "x-contract-version": "0.5.26"
263
+ "x-contract-version": "0.5.27"
264
264
  }
@@ -53,5 +53,5 @@
53
53
  ],
54
54
  "title": "ObserveRequest",
55
55
  "type": "object",
56
- "x-contract-version": "0.5.26"
56
+ "x-contract-version": "0.5.27"
57
57
  }
@@ -13,5 +13,5 @@
13
13
  ],
14
14
  "title": "ObserveResponse",
15
15
  "type": "object",
16
- "x-contract-version": "0.5.26"
16
+ "x-contract-version": "0.5.27"
17
17
  }
@@ -766,7 +766,7 @@
766
766
  },
767
767
  "PolicyConstructor": {
768
768
  "additionalProperties": false,
769
- "description": "How the worker builds a policy class that names its own methods (`@seq.policy(infer=\"get_action\", ...)`): its\nown constructor, or the factory it names (`make`, e.g. LeRobot's `from_pretrained`), called with `args` and\n`kwargs` where `@seq.load` would run - the replica's cold start, the weights on disk. The values are the user's own,\nas JSON carries them, but for two forms the worker fills in first (sequence_base.construct.expand): a config file's\ncontents, `{\"$config\": <its path from the class's file>, \"$set\": {<keys laid over it>}}`, YAML or JSON, and in any\nstring `\"{weights}\"` (the weights directory) or `\"{weights.<part>}\"` (a named part's).",
769
+ "description": "How the worker builds a policy class that names its own methods (`@seq.policy(infer=\"get_action\", ...)`): its\nown constructor, or the factory it names (`make`: a classmethod of it, e.g. LeRobot's `from_pretrained`, or a\nmodule's function, \"package.module:function\", whose return is the instance its methods are called on), called\nwith `args` and `kwargs` where `@seq.load` would run - the replica's cold start, the weights on disk. The values are\nthe user's own, as JSON carries them, but for two forms the worker fills in first (sequence_base.construct.expand):\na config file's contents, `{\"$config\": <its path from the class's file>, \"$set\": {<keys laid over it>}}`, YAML or\nJSON, and in any string `\"{weights}\"` (the weights directory) or `\"{weights.<part>}\"` (a named part's).",
770
770
  "properties": {
771
771
  "args": {
772
772
  "description": "positional arguments, in order",
@@ -783,7 +783,8 @@
783
783
  "make": {
784
784
  "anyOf": [
785
785
  {
786
- "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
786
+ "maxLength": 512,
787
+ "pattern": "^(?:[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*:)?[A-Za-z_][A-Za-z0-9_]*$",
787
788
  "type": "string"
788
789
  },
789
790
  {
@@ -791,7 +792,7 @@
791
792
  }
792
793
  ],
793
794
  "default": null,
794
- "description": "a classmethod or staticmethod that returns the instance; None: the class",
795
+ "description": "a classmethod or staticmethod that returns the instance, or a module's function, 'package.module:function' (contract 0.5.27); None: the class",
795
796
  "title": "Make"
796
797
  }
797
798
  },
@@ -1172,7 +1173,7 @@
1172
1173
  ],
1173
1174
  "title": "SeqFlags",
1174
1175
  "type": "integer",
1175
- "x-contract-version": "0.5.26",
1176
+ "x-contract-version": "0.5.27",
1176
1177
  "x-flag-names": {
1177
1178
  "CHECK": 65536,
1178
1179
  "INFER": 16,
@@ -1363,5 +1364,5 @@
1363
1364
  ],
1364
1365
  "title": "PolicyRegistration",
1365
1366
  "type": "object",
1366
- "x-contract-version": "0.5.26"
1367
+ "x-contract-version": "0.5.27"
1367
1368
  }
@@ -1220,5 +1220,5 @@
1220
1220
  ],
1221
1221
  "title": "PolicySpec",
1222
1222
  "type": "object",
1223
- "x-contract-version": "0.5.26"
1223
+ "x-contract-version": "0.5.27"
1224
1224
  }
@@ -72,5 +72,5 @@
72
72
  },
73
73
  "title": "Project",
74
74
  "type": "object",
75
- "x-contract-version": "0.5.26"
75
+ "x-contract-version": "0.5.27"
76
76
  }
@@ -68,5 +68,5 @@
68
68
  },
69
69
  "title": "Proprioception",
70
70
  "type": "object",
71
- "x-contract-version": "0.5.26"
71
+ "x-contract-version": "0.5.27"
72
72
  }
@@ -36,5 +36,5 @@
36
36
  ],
37
37
  "title": "RenderSpec",
38
38
  "type": "object",
39
- "x-contract-version": "0.5.26"
39
+ "x-contract-version": "0.5.27"
40
40
  }
@@ -52,5 +52,5 @@
52
52
  },
53
53
  "title": "ReplaySpec",
54
54
  "type": "object",
55
- "x-contract-version": "0.5.26"
55
+ "x-contract-version": "0.5.27"
56
56
  }
@@ -86,5 +86,5 @@
86
86
  ],
87
87
  "title": "Resources",
88
88
  "type": "object",
89
- "x-contract-version": "0.5.26"
89
+ "x-contract-version": "0.5.27"
90
90
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "RolloutResult",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.26"
58
+ "x-contract-version": "0.5.27"
59
59
  }
@@ -21,5 +21,5 @@
21
21
  ],
22
22
  "title": "SecretCreateRequest",
23
23
  "type": "object",
24
- "x-contract-version": "0.5.26"
24
+ "x-contract-version": "0.5.27"
25
25
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "SecretInfo",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.26"
43
+ "x-contract-version": "0.5.27"
44
44
  }
@@ -12,5 +12,5 @@
12
12
  ],
13
13
  "title": "SecretRef",
14
14
  "type": "object",
15
- "x-contract-version": "0.5.26"
15
+ "x-contract-version": "0.5.27"
16
16
  }
@@ -18,7 +18,7 @@
18
18
  ],
19
19
  "title": "SeqFlags",
20
20
  "type": "integer",
21
- "x-contract-version": "0.5.26",
21
+ "x-contract-version": "0.5.27",
22
22
  "x-flag-names": {
23
23
  "CHECK": 65536,
24
24
  "INFER": 16,
@@ -82,5 +82,5 @@
82
82
  ],
83
83
  "title": "Step",
84
84
  "type": "object",
85
- "x-contract-version": "0.5.26"
85
+ "x-contract-version": "0.5.27"
86
86
  }
@@ -189,5 +189,5 @@
189
189
  },
190
190
  "title": "Stream",
191
191
  "type": "object",
192
- "x-contract-version": "0.5.26"
192
+ "x-contract-version": "0.5.27"
193
193
  }
@@ -22,5 +22,5 @@
22
22
  ],
23
23
  "title": "TaskAgg",
24
24
  "type": "object",
25
- "x-contract-version": "0.5.26"
25
+ "x-contract-version": "0.5.27"
26
26
  }
@@ -22,5 +22,5 @@
22
22
  ],
23
23
  "title": "TemplateFiles",
24
24
  "type": "object",
25
- "x-contract-version": "0.5.26"
25
+ "x-contract-version": "0.5.27"
26
26
  }
@@ -10,5 +10,5 @@
10
10
  },
11
11
  "title": "Tensors",
12
12
  "type": "object",
13
- "x-contract-version": "0.5.26"
13
+ "x-contract-version": "0.5.27"
14
14
  }
@@ -34,5 +34,5 @@
34
34
  ],
35
35
  "title": "Timeouts",
36
36
  "type": "object",
37
- "x-contract-version": "0.5.26"
37
+ "x-contract-version": "0.5.27"
38
38
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "UploadTarget",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.26"
27
+ "x-contract-version": "0.5.27"
28
28
  }
@@ -20,5 +20,5 @@
20
20
  ],
21
21
  "title": "Variant",
22
22
  "type": "object",
23
- "x-contract-version": "0.5.26"
23
+ "x-contract-version": "0.5.27"
24
24
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "VolumeFile",
27
27
  "type": "object",
28
- "x-contract-version": "0.5.26"
28
+ "x-contract-version": "0.5.27"
29
29
  }
@@ -68,5 +68,5 @@
68
68
  ],
69
69
  "title": "VolumeInfo",
70
70
  "type": "object",
71
- "x-contract-version": "0.5.26"
71
+ "x-contract-version": "0.5.27"
72
72
  }
@@ -17,5 +17,5 @@
17
17
  ],
18
18
  "title": "VolumeMount",
19
19
  "type": "object",
20
- "x-contract-version": "0.5.26"
20
+ "x-contract-version": "0.5.27"
21
21
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "VolumeRef",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.26"
27
+ "x-contract-version": "0.5.27"
28
28
  }
@@ -56,5 +56,5 @@
56
56
  ],
57
57
  "title": "VolumeUploadRequest",
58
58
  "type": "object",
59
- "x-contract-version": "0.5.26"
59
+ "x-contract-version": "0.5.27"
60
60
  }
@@ -65,5 +65,5 @@
65
65
  ],
66
66
  "title": "VolumeUploadResponse",
67
67
  "type": "object",
68
- "x-contract-version": "0.5.26"
68
+ "x-contract-version": "0.5.27"
69
69
  }
@@ -86,5 +86,5 @@
86
86
  ],
87
87
  "title": "WarmingError",
88
88
  "type": "object",
89
- "x-contract-version": "0.5.26"
89
+ "x-contract-version": "0.5.27"
90
90
  }
File without changes