sequence-base 0.3.28__tar.gz → 0.3.29__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.
- {sequence_base-0.3.28 → sequence_base-0.3.29}/PKG-INFO +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/pyproject.toml +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/__init__.py +23 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/codec/image.py +16 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/version.py +26 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/__init__.py +20 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/accounts.py +10 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/benchmarks.py +32 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/connect.py +3 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/deployments.py +44 -2
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/errors.py +9 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/eval.py +32 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/flags.py +17 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/policy.py +40 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/templates.py +2 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/volumes.py +5 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/wire.py +2 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/obs/rid.py +3 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/presets/robot_arm.py +28 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schema_export.py +13 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkSpec.json +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentPolicy.json +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentRequest.json +2 -2
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageSpec.json +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/PolicyRegistration.json +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/PolicySpec.json +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/RolloutResult.json +1 -1
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/telemetry/events.py +7 -4
- {sequence_base-0.3.28 → sequence_base-0.3.29}/.gitignore +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/README.md +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/auth.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/codec/__init__.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/__init__.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/env.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/headers.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/act.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/io.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/errors/__init__.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/errors/transport.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/obs/__init__.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/obs/log.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/presets/__init__.py +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActRequest.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActionChunk.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActionContract.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActionStep.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/AdapterTransform.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/AddLocal.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Autoscaler.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkConditionSpec.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkStatusResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BootstrapResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Camera.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ClampInfo.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/CodeBundle.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Concurrency.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Conditions.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ConnectRequest.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ConnectResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentAccepted.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentStatusResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Embodiment.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ErrorBody.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ErrorCodes.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Estimate.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalDryRunResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalReport.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalRequest.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageFrame.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepAddLocal.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepApt.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepEnv.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepRun.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepUvPip.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/InferParam.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Lease.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/LossyTransform.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/MetricAgg.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Observation.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ObservationContract.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Proprioception.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/RenderSpec.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Resources.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SecretCreateRequest.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SecretInfo.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SecretRef.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SeqFlags.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Step.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SuiteAgg.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/TaskAgg.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Timeouts.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/UploadTarget.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/UsageReport.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Variant.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeAttach.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeFile.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeInfo.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeMount.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeRef.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeUploadRequest.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeUploadResponse.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/WarmingError.json +0 -0
- {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/telemetry/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sequence-base
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.29
|
|
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
|
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: pydantic>=2.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sequence-base"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.29"
|
|
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"]
|
|
@@ -11,6 +11,8 @@ defined once so they cannot drift. Import from here; never redefine.
|
|
|
11
11
|
Only shared-by-≥2-and-drifts-if-duplicated things live here. Model-specific, provider-specific, and
|
|
12
12
|
catalogue values stay in container / gateway / spec.py.
|
|
13
13
|
"""
|
|
14
|
+
|
|
15
|
+
|
|
14
16
|
from sequence_base.contract import (
|
|
15
17
|
ActRequest,
|
|
16
18
|
ActResponse,
|
|
@@ -96,11 +98,14 @@ from sequence_base.contract import (
|
|
|
96
98
|
code_for_status,
|
|
97
99
|
)
|
|
98
100
|
|
|
101
|
+
|
|
99
102
|
from sequence_base.constants.version import CONTRACT_VERSION
|
|
100
103
|
|
|
104
|
+
|
|
101
105
|
from sequence_base.obs.log import Timer, enabled, log
|
|
102
106
|
from sequence_base.obs.rid import HEADER, clean, new_rid
|
|
103
107
|
|
|
108
|
+
|
|
104
109
|
from sequence_base.errors.transport import (
|
|
105
110
|
TransportOverloaded,
|
|
106
111
|
TransportRejected,
|
|
@@ -108,35 +113,53 @@ from sequence_base.errors.transport import (
|
|
|
108
113
|
TransportWarming,
|
|
109
114
|
)
|
|
110
115
|
|
|
116
|
+
|
|
111
117
|
from sequence_base import auth
|
|
112
118
|
|
|
113
119
|
|
|
114
120
|
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
115
124
|
__all__ = [
|
|
125
|
+
|
|
116
126
|
"ImageFrame", "Proprioception", "Observation", "ActionSpace", "ActionStep", "ActionChunk",
|
|
117
127
|
"ActRequest", "ActResponse",
|
|
128
|
+
|
|
118
129
|
"SeqFlags", "ImageStepUvPip", "ImageStepApt", "ImageStepEnv", "ImageStepRun", "AddLocal", "ImageStepAddLocal",
|
|
119
130
|
"ImageStep", "ImageSpec",
|
|
120
131
|
"VolumeMount", "VolumeRef", "Concurrency", "ActionContract", "Camera", "ObservationContract", "Embodiment",
|
|
121
132
|
"PolicySpec", "PolicyRegistration",
|
|
133
|
+
|
|
122
134
|
"MAX_CODE_BUNDLE_BYTES", "CodeBundle",
|
|
123
135
|
"Resources", "Autoscaler", "Timeouts", "VolumeAttach", "DeploymentPolicy", "InferParam", "DeploymentRequest",
|
|
124
136
|
"DeploymentAccepted", "DeploymentState", "DeploymentStatusResponse",
|
|
137
|
+
|
|
125
138
|
"Lease", "ConnectRequest", "ConnectResponse",
|
|
139
|
+
|
|
126
140
|
"Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
|
|
127
141
|
"EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
|
|
128
142
|
"EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
|
|
129
143
|
"AdapterKind", "AdapterTransform",
|
|
144
|
+
|
|
130
145
|
"SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse", "UsageReport",
|
|
146
|
+
|
|
131
147
|
"VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse", "VolumeInfo", "parse_vol",
|
|
148
|
+
|
|
132
149
|
"TEMPLATE_SCHEME", "parse_template",
|
|
150
|
+
|
|
133
151
|
"ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status", "CONTRACT_VERSION",
|
|
152
|
+
|
|
134
153
|
"HEADER", "new_rid", "clean", "log", "Timer", "enabled",
|
|
154
|
+
|
|
135
155
|
"TransportUnavailable", "TransportWarming", "TransportRejected", "TransportOverloaded",
|
|
156
|
+
|
|
136
157
|
"auth",
|
|
137
158
|
]
|
|
138
159
|
|
|
139
160
|
try:
|
|
161
|
+
|
|
162
|
+
|
|
140
163
|
from importlib.metadata import PackageNotFoundError, version as _version
|
|
141
164
|
|
|
142
165
|
__version__ = _version("sequence-base")
|
|
@@ -16,8 +16,19 @@ import io
|
|
|
16
16
|
from typing import Any
|
|
17
17
|
|
|
18
18
|
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
19
25
|
DEFAULT_JPEG_QUALITY = 95
|
|
20
26
|
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
21
32
|
MAX_UPLOAD_EDGE = 640
|
|
22
33
|
|
|
23
34
|
|
|
@@ -48,6 +59,8 @@ def encode(frame: Any, *, quality: int = DEFAULT_JPEG_QUALITY) -> str:
|
|
|
48
59
|
img = img.convert("RGB")
|
|
49
60
|
if max(img.size) > MAX_UPLOAD_EDGE:
|
|
50
61
|
scale = MAX_UPLOAD_EDGE / max(img.size)
|
|
62
|
+
|
|
63
|
+
|
|
51
64
|
img = img.resize((max(1, round(img.width * scale)),
|
|
52
65
|
max(1, round(img.height * scale))), Image.LANCZOS)
|
|
53
66
|
|
|
@@ -72,6 +85,7 @@ def decode(data: str) -> "Any":
|
|
|
72
85
|
return np.asarray(Image.open(io.BytesIO(raw)).convert("RGB"), dtype=np.uint8)
|
|
73
86
|
|
|
74
87
|
|
|
88
|
+
|
|
75
89
|
_DEPTH_UNITS = {"m": 1000.0, "mm": 1.0}
|
|
76
90
|
|
|
77
91
|
|
|
@@ -79,7 +93,8 @@ def encode_depth(depth: Any, *, unit: str = "m") -> str:
|
|
|
79
93
|
"""A depth map -> the base64 16-bit PNG a depth frame (ImageFrame kind="depth") carries: millimetres as uint16, 0
|
|
80
94
|
where there is no reading (NaN, inf, <= 0), clipped at 65.535 m. `unit` is what the array holds: "m" (float metres,
|
|
81
95
|
the default) or "mm". Lossless, unlike the JPEG colour frames take — a depth error is a geometry error.
|
|
82
|
-
|
|
96
|
+
|
|
97
|
+
"""
|
|
83
98
|
import numpy as np
|
|
84
99
|
from PIL import Image
|
|
85
100
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""
|
|
2
2
|
The shared wire contract — one definition per shape, imported (never redeclared) by the SDK, gateway,
|
|
3
|
-
and container harness. Grouped by
|
|
3
|
+
and container harness. Grouped by contract number.
|
|
4
4
|
"""
|
|
5
|
+
|
|
5
6
|
from sequence_base.contract.act import (
|
|
6
7
|
ActionChunk,
|
|
7
8
|
ActionSpace,
|
|
@@ -11,8 +12,10 @@ from sequence_base.contract.act import (
|
|
|
11
12
|
Proprioception,
|
|
12
13
|
)
|
|
13
14
|
|
|
15
|
+
|
|
14
16
|
from sequence_base.contract.wire import ActRequest, ActResponse
|
|
15
17
|
|
|
18
|
+
|
|
16
19
|
from sequence_base.contract.flags import SeqFlags
|
|
17
20
|
from sequence_base.contract.policy import (
|
|
18
21
|
Camera,
|
|
@@ -34,6 +37,7 @@ from sequence_base.contract.policy import (
|
|
|
34
37
|
VolumeRef,
|
|
35
38
|
)
|
|
36
39
|
|
|
40
|
+
|
|
37
41
|
from sequence_base.contract.deployments import (
|
|
38
42
|
MAX_CODE_BUNDLE_BYTES,
|
|
39
43
|
Autoscaler,
|
|
@@ -49,8 +53,10 @@ from sequence_base.contract.deployments import (
|
|
|
49
53
|
VolumeAttach,
|
|
50
54
|
)
|
|
51
55
|
|
|
56
|
+
|
|
52
57
|
from sequence_base.contract.connect import ConnectRequest, ConnectResponse, Lease
|
|
53
58
|
|
|
59
|
+
|
|
54
60
|
from sequence_base.contract.benchmarks import (
|
|
55
61
|
BenchmarkConditionSpec,
|
|
56
62
|
BenchmarkRegisterRequest,
|
|
@@ -78,6 +84,7 @@ from sequence_base.contract.eval import (
|
|
|
78
84
|
TaskAgg,
|
|
79
85
|
)
|
|
80
86
|
|
|
87
|
+
|
|
81
88
|
from sequence_base.contract.accounts import (
|
|
82
89
|
BootstrapResponse,
|
|
83
90
|
SecretCreateRequest,
|
|
@@ -86,8 +93,10 @@ from sequence_base.contract.accounts import (
|
|
|
86
93
|
UsageReport,
|
|
87
94
|
)
|
|
88
95
|
|
|
96
|
+
|
|
89
97
|
from sequence_base.contract.templates import TEMPLATE_SCHEME, parse_template
|
|
90
98
|
|
|
99
|
+
|
|
91
100
|
from sequence_base.contract.volumes import (
|
|
92
101
|
MAX_FILES,
|
|
93
102
|
MAX_UPLOAD_BYTES,
|
|
@@ -100,27 +109,37 @@ from sequence_base.contract.volumes import (
|
|
|
100
109
|
parse_vol,
|
|
101
110
|
)
|
|
102
111
|
|
|
112
|
+
|
|
103
113
|
from sequence_base.contract.errors import ERRORS, ErrorBody, ErrorCode, ErrorSpec, WarmingError, code_for_status
|
|
104
114
|
|
|
105
115
|
__all__ = [
|
|
116
|
+
|
|
106
117
|
"ImageFrame", "Proprioception", "Observation", "ActionSpace", "ActionStep", "ActionChunk",
|
|
107
118
|
"ActRequest", "ActResponse",
|
|
119
|
+
|
|
108
120
|
"SeqFlags",
|
|
109
121
|
"ImageStepUvPip", "ImageStepApt", "ImageStepEnv", "ImageStepRun", "AddLocal", "ImageStepAddLocal", "ImageStep",
|
|
110
122
|
"ImageSpec",
|
|
111
123
|
"VolumeMount", "VolumeRef", "Concurrency", "ActionContract", "Camera", "ObservationContract", "Embodiment",
|
|
112
124
|
"PolicySpec", "PolicyRegistration",
|
|
125
|
+
|
|
113
126
|
"MAX_CODE_BUNDLE_BYTES", "CodeBundle",
|
|
114
127
|
"Resources", "Autoscaler", "Timeouts", "VolumeAttach", "DeploymentPolicy", "InferParam", "DeploymentRequest",
|
|
115
128
|
"DeploymentAccepted", "DeploymentState", "DeploymentStatusResponse",
|
|
129
|
+
|
|
116
130
|
"Lease", "ConnectRequest", "ConnectResponse",
|
|
131
|
+
|
|
117
132
|
"Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
|
|
118
133
|
"EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
|
|
119
134
|
"EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
|
|
120
135
|
"AdapterKind", "AdapterTransform",
|
|
136
|
+
|
|
121
137
|
"SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse", "UsageReport",
|
|
138
|
+
|
|
122
139
|
"MAX_FILES", "MAX_UPLOAD_BYTES", "VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse",
|
|
123
140
|
"VolumeInfo", "check_volume_name", "parse_vol",
|
|
141
|
+
|
|
124
142
|
"TEMPLATE_SCHEME", "parse_template",
|
|
143
|
+
|
|
125
144
|
"ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status",
|
|
126
145
|
]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Contract 6 — accounts / secret / billing wire types
|
|
2
|
+
Contract 6 — accounts / secret / billing wire types.
|
|
3
3
|
|
|
4
4
|
Secret-leak rule, mechanically checkable (goal 15). Two kinds of secret:
|
|
5
5
|
(a) platform-minted — `direct_secret`, TLS private key. May appear in the DOWN direction only:
|
|
@@ -40,6 +40,8 @@ class SecretCreateRequest(BaseModel):
|
|
|
40
40
|
"""POST /v1/secrets — one name = one group of env values (e.g. planner = {PLANNER_API_KEY}).
|
|
41
41
|
`env` carries plaintext values; this is the WRITE-direction allow-list field (goal 15)."""
|
|
42
42
|
|
|
43
|
+
|
|
44
|
+
|
|
43
45
|
model_config = ConfigDict(extra="forbid", hide_input_in_errors=True)
|
|
44
46
|
|
|
45
47
|
name: str
|
|
@@ -49,6 +51,10 @@ class SecretCreateRequest(BaseModel):
|
|
|
49
51
|
class SecretInfo(BaseModel):
|
|
50
52
|
"""GET /v1/secrets element — metadata only, NO values. Exposes `env_keys`, not `env`."""
|
|
51
53
|
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
52
58
|
model_config = ConfigDict(extra="forbid", hide_input_in_errors=True)
|
|
53
59
|
|
|
54
60
|
name: str
|
|
@@ -61,12 +67,15 @@ class BootstrapResponse(BaseModel):
|
|
|
61
67
|
"""What a worker receives when it starts — everything it needs to serve direct TLS `/act`. `direct_secret` + `tls_key` are DOWN-direction platform secrets; `env` is the
|
|
62
68
|
WRITE-direction injection of the policy's declared user secrets into its subprocess (goal 15)."""
|
|
63
69
|
|
|
70
|
+
|
|
71
|
+
|
|
64
72
|
model_config = ConfigDict(extra="forbid", hide_input_in_errors=True)
|
|
65
73
|
|
|
66
74
|
direct_secret: str = Field(..., description="Platform-minted bearer the worker's guard checks")
|
|
67
75
|
tls_key: str = Field(..., description="Self-signed TLS private key (down-direction platform secret)")
|
|
68
76
|
tls_cert: str = Field(..., description="Self-signed TLS certificate (public)")
|
|
69
77
|
env: dict[str, str] = Field(..., description="Policy's user secrets, expanded ENV_KEY → value")
|
|
78
|
+
|
|
70
79
|
weights_uri: str | None = None
|
|
71
80
|
lease: Lease
|
|
72
81
|
|
|
@@ -60,6 +60,10 @@ class RenderSpec(BaseModel):
|
|
|
60
60
|
|
|
61
61
|
camera: str = Field(..., description="Which camera to pull frames from, e.g. 'wrist' / 'agentview'")
|
|
62
62
|
fps: int = 30
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
63
67
|
flip: Literal["vertical", "horizontal", "both"] | None = Field(
|
|
64
68
|
None, description="'vertical': rows reversed (upside down); 'horizontal': mirrored; 'both': turned 180°; "
|
|
65
69
|
"None: as drawn")
|
|
@@ -99,16 +103,20 @@ class BenchmarkSpec(BaseModel):
|
|
|
99
103
|
handler_ref: str
|
|
100
104
|
bindings: dict[SeqFlags, str] = Field(..., description="SETUP / RESET / CHECK / SCORE (+ OBSERVE / STEP) → method name")
|
|
101
105
|
gpu: str | list[str] | None = None
|
|
106
|
+
|
|
102
107
|
envs: int | None = Field(default=None, ge=1, le=65536)
|
|
103
108
|
assets: list[VolumeRef] = Field(default_factory=list)
|
|
104
109
|
render: RenderSpec | None = None
|
|
105
110
|
cpu: int | None = None
|
|
106
111
|
memory_gb: int | None = None
|
|
107
112
|
secrets: list[SecretRef] = Field(default_factory=list)
|
|
113
|
+
|
|
108
114
|
engine: str | None = Field(default=None, pattern=KIND_NAME)
|
|
109
115
|
|
|
110
116
|
@model_validator(mode="after")
|
|
111
117
|
def _bindings_only_benchmark_hooks(self) -> "BenchmarkSpec":
|
|
118
|
+
|
|
119
|
+
|
|
112
120
|
bad = set(self.bindings) - set(BENCHMARK_BINDABLE)
|
|
113
121
|
if bad:
|
|
114
122
|
names = ", ".join(sorted(f.name or str(f.value) for f in bad))
|
|
@@ -152,19 +160,43 @@ class BenchmarkRegisterRequest(BaseModel):
|
|
|
152
160
|
render: RenderSpec | None = None
|
|
153
161
|
cpu: int | None = None
|
|
154
162
|
memory_gb: int | None = None
|
|
163
|
+
|
|
164
|
+
|
|
155
165
|
code: CodeBundle | None = None
|
|
166
|
+
|
|
167
|
+
|
|
156
168
|
suite_of: dict[str, str] = Field(default_factory=dict)
|
|
169
|
+
|
|
170
|
+
|
|
157
171
|
action_contract: ActionContract | None = None
|
|
172
|
+
|
|
173
|
+
|
|
158
174
|
secrets: list[SecretRef] = Field(default_factory=list)
|
|
175
|
+
|
|
176
|
+
|
|
159
177
|
score: bool = False
|
|
178
|
+
|
|
179
|
+
|
|
160
180
|
condition_list: list[BenchmarkConditionSpec] | None = Field(default=None, max_length=5000)
|
|
181
|
+
|
|
161
182
|
timeout_s: float | None = Field(default=None, gt=0)
|
|
183
|
+
|
|
162
184
|
default_adapter_ref: str | None = None
|
|
185
|
+
|
|
186
|
+
|
|
163
187
|
gpu: str | None = Field(default=None, max_length=32)
|
|
188
|
+
|
|
164
189
|
envs: int | None = Field(default=None, ge=1, le=65536)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
165
193
|
params: dict[str, InferParam] | None = Field(default=None, max_length=32)
|
|
194
|
+
|
|
166
195
|
batched: bool = False
|
|
196
|
+
|
|
167
197
|
image_context: CodeBundle | None = None
|
|
198
|
+
|
|
199
|
+
|
|
168
200
|
engine: str | None = Field(default=None, pattern=KIND_NAME)
|
|
169
201
|
|
|
170
202
|
@model_validator(mode="after")
|
|
@@ -13,6 +13,7 @@ from datetime import datetime
|
|
|
13
13
|
|
|
14
14
|
from pydantic import BaseModel, ConfigDict, Field
|
|
15
15
|
|
|
16
|
+
|
|
16
17
|
from sequence_base.contract.errors import WarmingError
|
|
17
18
|
from sequence_base.contract.io import ActionContract, ObservationContract
|
|
18
19
|
|
|
@@ -52,7 +53,9 @@ class ConnectResponse(BaseModel):
|
|
|
52
53
|
lease: Lease
|
|
53
54
|
warming: bool = Field(default=False, description="True → worker still warming; see warming_eta_s")
|
|
54
55
|
warming_eta_s: int | None = Field(default=None, description="Seconds until warm, when warming")
|
|
56
|
+
|
|
55
57
|
action: ActionContract | None = None
|
|
56
58
|
observation: ObservationContract | None = None
|
|
57
59
|
embodiment: str | None = None
|
|
60
|
+
|
|
58
61
|
io: str | None = None
|
|
@@ -53,10 +53,15 @@ class Resources(BaseModel):
|
|
|
53
53
|
model_config = ConfigDict(extra="forbid")
|
|
54
54
|
|
|
55
55
|
gpu: list[str]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
56
59
|
cpu: float | None = Field(default=None, ge=0.125, le=64)
|
|
57
60
|
cpu_limit: float | None = Field(default=None, ge=0.125, le=128)
|
|
58
61
|
memory_gb: float | None = Field(default=None, ge=0.125, le=1024)
|
|
59
62
|
memory_limit_gb: float | None = Field(default=None, ge=0.125, le=1024)
|
|
63
|
+
|
|
64
|
+
|
|
60
65
|
region: str | None = Field(default=None, max_length=32)
|
|
61
66
|
|
|
62
67
|
@model_validator(mode="after")
|
|
@@ -73,10 +78,16 @@ class Autoscaler(BaseModel):
|
|
|
73
78
|
model_config = ConfigDict(extra="forbid")
|
|
74
79
|
|
|
75
80
|
min_containers: int = 0
|
|
81
|
+
|
|
82
|
+
|
|
76
83
|
max_containers: int | None = None
|
|
84
|
+
|
|
85
|
+
|
|
77
86
|
max_gpus: int | None = Field(default=None, ge=1, le=256)
|
|
78
87
|
buffer_containers: int | None = None
|
|
79
88
|
scaledown_window: int = 600
|
|
89
|
+
|
|
90
|
+
|
|
80
91
|
on_full: Literal["queue", "reject"] = "queue"
|
|
81
92
|
queue_timeout_s: int = Field(default=120, ge=5, le=3600)
|
|
82
93
|
|
|
@@ -160,9 +171,9 @@ class DeploymentPolicy(BaseModel):
|
|
|
160
171
|
to nothing and its inputs / outputs pass through the worker untouched.
|
|
161
172
|
|
|
162
173
|
`secrets` carries the policy's declared secret BUNDLES BY NAME ONLY (list[SecretRef]) — the gateway
|
|
163
|
-
validates each name exists and belongs to the deployer at submit time
|
|
174
|
+
validates each name exists and belongs to the deployer at submit time, and the
|
|
164
175
|
worker bootstrap fetches the matching env group by name. A secret VALUE never travels here: SecretRef is
|
|
165
|
-
name-only, so this field cannot carry one
|
|
176
|
+
name-only, so this field cannot carry one. Defaults to `[]` so a policy with no secrets is
|
|
166
177
|
unaffected."""
|
|
167
178
|
|
|
168
179
|
model_config = ConfigDict(extra="forbid")
|
|
@@ -172,12 +183,28 @@ class DeploymentPolicy(BaseModel):
|
|
|
172
183
|
streaming: bool = False
|
|
173
184
|
frames_per_chunk: int | None = None
|
|
174
185
|
secrets: list[SecretRef] = Field(default_factory=list)
|
|
186
|
+
|
|
187
|
+
|
|
175
188
|
observation: ObservationContract | None = None
|
|
176
189
|
embodiments: dict[str, Embodiment] | None = None
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
177
194
|
action_declared: bool | None = None
|
|
195
|
+
|
|
196
|
+
|
|
178
197
|
io: str | None = Field(default=None, max_length=4000)
|
|
198
|
+
|
|
199
|
+
|
|
179
200
|
family: str | None = Field(default=None, pattern=KIND_NAME)
|
|
201
|
+
|
|
202
|
+
|
|
180
203
|
params: dict[str, InferParam] | None = Field(default=None, max_length=32)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
181
208
|
models: list[str] | None = Field(default=None, max_length=16)
|
|
182
209
|
|
|
183
210
|
@model_validator(mode="after")
|
|
@@ -185,6 +212,7 @@ class DeploymentPolicy(BaseModel):
|
|
|
185
212
|
for name in self.params or {}:
|
|
186
213
|
if not name.isidentifier() or name.startswith("_"):
|
|
187
214
|
raise ValueError(f"inference parameter {name!r} is not a public Python identifier")
|
|
215
|
+
|
|
188
216
|
for model in self.models or []:
|
|
189
217
|
if not model or model != model.strip() or "/" not in model:
|
|
190
218
|
raise ValueError(f"policy model {model!r} is not a catalogue id (accounts/sequences/models/<name>)")
|
|
@@ -240,15 +268,26 @@ class DeploymentRequest(BaseModel):
|
|
|
240
268
|
|
|
241
269
|
name: str
|
|
242
270
|
image: ImageSpec
|
|
271
|
+
|
|
243
272
|
weights: VolumeMount | None = None
|
|
244
273
|
resources: Resources
|
|
245
274
|
policy: DeploymentPolicy
|
|
275
|
+
|
|
276
|
+
|
|
246
277
|
code: CodeBundle | None = None
|
|
278
|
+
|
|
279
|
+
|
|
247
280
|
image_context: CodeBundle | None = None
|
|
281
|
+
|
|
282
|
+
|
|
248
283
|
volumes: list[VolumeAttach] = Field(default_factory=list)
|
|
249
284
|
autoscaler: Autoscaler = Field(default_factory=Autoscaler)
|
|
285
|
+
|
|
250
286
|
concurrency: Concurrency = Field(default_factory=Concurrency)
|
|
251
287
|
timeouts: Timeouts | None = None
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
252
291
|
weights_name: str | None = None
|
|
253
292
|
extra_weights: dict[str, VolumeMount] | None = None
|
|
254
293
|
|
|
@@ -290,7 +329,9 @@ class DeploymentRequest(BaseModel):
|
|
|
290
329
|
return self
|
|
291
330
|
|
|
292
331
|
|
|
332
|
+
|
|
293
333
|
_NAME = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]{0,63}")
|
|
334
|
+
|
|
294
335
|
_WEIGHTS_SCHEMES = ("gs://", "hf://", "s3://", "https://")
|
|
295
336
|
|
|
296
337
|
|
|
@@ -320,4 +361,5 @@ class DeploymentStatusResponse(BaseModel):
|
|
|
320
361
|
status: DeploymentState
|
|
321
362
|
model: str
|
|
322
363
|
error: str | None = Field(default=None, description="Build-failure reason; set only when FAILED")
|
|
364
|
+
|
|
323
365
|
reason: Literal["gpu_out_of_memory", "host_out_of_memory", "crashed"] | None = None
|
|
@@ -7,6 +7,7 @@ the `seq` CLI exit code. The gateway and the worker harness import it; the SDK,
|
|
|
7
7
|
this package on a robot, carries a generated copy that a test compares against `ErrorCodes.json`.
|
|
8
8
|
That is what makes the same situation surface the same way at every entry point.
|
|
9
9
|
|
|
10
|
+
|
|
10
11
|
Distinct from `sequence_base.errors.transport`, which is the internal exception taxonomy the gateway
|
|
11
12
|
and harness raise before a response is built.
|
|
12
13
|
"""
|
|
@@ -48,6 +49,8 @@ class ErrorSpec(NamedTuple):
|
|
|
48
49
|
exit_code: int
|
|
49
50
|
|
|
50
51
|
|
|
52
|
+
|
|
53
|
+
|
|
51
54
|
ERRORS: dict[ErrorCode, ErrorSpec] = {
|
|
52
55
|
ErrorCode.INVALID_REQUEST: ErrorSpec(400, False, "InvalidRequest", 2),
|
|
53
56
|
ErrorCode.PAYLOAD_TOO_LARGE: ErrorSpec(413, False, "InvalidRequest", 2),
|
|
@@ -68,6 +71,7 @@ ERRORS: dict[ErrorCode, ErrorSpec] = {
|
|
|
68
71
|
ErrorCode.DEPENDENCY_MISSING: ErrorSpec(424, False, "InternalError", 1),
|
|
69
72
|
}
|
|
70
73
|
|
|
74
|
+
|
|
71
75
|
_CODE_FOR_STATUS: dict[int, ErrorCode] = {
|
|
72
76
|
400: ErrorCode.INVALID_REQUEST, 401: ErrorCode.UNAUTHENTICATED, 402: ErrorCode.INSUFFICIENT_CREDIT,
|
|
73
77
|
403: ErrorCode.FORBIDDEN, 404: ErrorCode.NOT_FOUND, 405: ErrorCode.INVALID_REQUEST,
|
|
@@ -103,8 +107,13 @@ class ErrorBody(BaseModel):
|
|
|
103
107
|
@model_validator(mode="before")
|
|
104
108
|
@classmethod
|
|
105
109
|
def _retryable_from_table(cls, data: Any) -> Any:
|
|
110
|
+
|
|
111
|
+
|
|
106
112
|
if not isinstance(data, dict):
|
|
107
113
|
return data
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
|
108
117
|
if "message" in data and "detail" not in data:
|
|
109
118
|
data = {k: v for k, v in data.items() if k != "message"} | {"detail": data["message"]}
|
|
110
119
|
if "eta_s" in data:
|
|
@@ -49,6 +49,10 @@ class EvalRequest(BaseModel):
|
|
|
49
49
|
benchmark: str
|
|
50
50
|
suite: str | None = None
|
|
51
51
|
trials: int | None = None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
52
56
|
policy_instances: int = Field(default=1, ge=1, le=64)
|
|
53
57
|
policy_gpu: str | None = Field(default=None, max_length=32)
|
|
54
58
|
benchmark_instances: int = Field(default=1, ge=1, le=64)
|
|
@@ -56,14 +60,25 @@ class EvalRequest(BaseModel):
|
|
|
56
60
|
envs: int | None = Field(default=None, ge=1, le=100000)
|
|
57
61
|
vlm_max_concurrency: int | None = None
|
|
58
62
|
adapter: str | None = None
|
|
63
|
+
|
|
64
|
+
|
|
59
65
|
compare: str | list[str] | None = Field(default=None, description="Other model ids to compare against")
|
|
60
66
|
sweep: dict[str, list[int | float | bool | str]] | None = Field(default=None, max_length=8)
|
|
61
67
|
dry_run: bool = False
|
|
68
|
+
|
|
62
69
|
tasks: list[str] | None = Field(default=None, max_length=1000)
|
|
70
|
+
|
|
63
71
|
max_usd: float | None = Field(default=None, gt=0)
|
|
72
|
+
|
|
64
73
|
rerun_of: str | None = None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
65
77
|
params: dict[str, int | float | bool | str] | None = Field(default=None, max_length=32)
|
|
78
|
+
|
|
66
79
|
variants: dict[str, list[str]] | None = Field(default=None, max_length=32)
|
|
80
|
+
|
|
81
|
+
|
|
67
82
|
record: Literal["per-task", "all", "none"] | None = None
|
|
68
83
|
|
|
69
84
|
|
|
@@ -83,8 +98,13 @@ class Estimate(BaseModel):
|
|
|
83
98
|
wall_clock_s: float
|
|
84
99
|
cost_usd: float
|
|
85
100
|
vlm_calls: int
|
|
101
|
+
|
|
86
102
|
breakdown: dict[str, float] | None = None
|
|
103
|
+
|
|
87
104
|
default_timing: bool | None = None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
88
108
|
held_usd: float | None = None
|
|
89
109
|
|
|
90
110
|
|
|
@@ -97,7 +117,9 @@ class EvalResponse(BaseModel):
|
|
|
97
117
|
gpus_granted: int
|
|
98
118
|
estimate: Estimate
|
|
99
119
|
clamped_by: ClampInfo | None = None
|
|
120
|
+
|
|
100
121
|
queue: EvalQueue | None = None
|
|
122
|
+
|
|
101
123
|
arms: int | None = None
|
|
102
124
|
|
|
103
125
|
|
|
@@ -156,6 +178,8 @@ class EvalDryRunResponse(BaseModel):
|
|
|
156
178
|
|
|
157
179
|
estimate: Estimate
|
|
158
180
|
cards: EvalCards | None = None
|
|
181
|
+
|
|
182
|
+
|
|
159
183
|
layout: dict | None = None
|
|
160
184
|
notes: list[str] = Field(default_factory=list)
|
|
161
185
|
|
|
@@ -165,7 +189,7 @@ class RolloutResult(BaseModel):
|
|
|
165
189
|
never returns a success flag. `metrics` is the episode's closed-out user metrics (passthrough; the
|
|
166
190
|
platform does not know the field names). `video_uri` points at the mp4 the platform tool produced.
|
|
167
191
|
|
|
168
|
-
Scope:
|
|
192
|
+
Scope: this is the wire shape only; the runtime that settles per-step `check.done` per-env and
|
|
169
193
|
assembles it lives in the container / gateway, not in this pure-types unit."""
|
|
170
194
|
|
|
171
195
|
model_config = ConfigDict(extra="forbid")
|
|
@@ -243,8 +267,11 @@ class ArmReport(BaseModel):
|
|
|
243
267
|
|
|
244
268
|
arm: int
|
|
245
269
|
model: str
|
|
270
|
+
|
|
271
|
+
|
|
246
272
|
params: dict[str, int | float | bool | str] = Field(default_factory=dict)
|
|
247
273
|
metrics: dict[str, MetricAgg] = Field(default_factory=dict)
|
|
274
|
+
|
|
248
275
|
intervals: dict[str, list[float]] = Field(default_factory=dict)
|
|
249
276
|
episodes: int = 0
|
|
250
277
|
failed: int = 0
|
|
@@ -327,10 +354,14 @@ class EvalReport(BaseModel):
|
|
|
327
354
|
errors: list[str] = Field(
|
|
328
355
|
default_factory=list, description="Why episodes or the run failed, so an incomplete report says why"
|
|
329
356
|
)
|
|
357
|
+
|
|
358
|
+
|
|
330
359
|
arms: list[ArmReport] | None = None
|
|
331
360
|
paired: list[PairedDiff] | None = None
|
|
332
361
|
timing: EvalTiming | None = None
|
|
333
362
|
stop_reason: str | None = None
|
|
363
|
+
|
|
364
|
+
|
|
334
365
|
arm_params: list[ArmParams] | None = None
|
|
335
366
|
|
|
336
367
|
|