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.
Files changed (106) hide show
  1. {sequence_base-0.3.28 → sequence_base-0.3.29}/PKG-INFO +1 -1
  2. {sequence_base-0.3.28 → sequence_base-0.3.29}/pyproject.toml +1 -1
  3. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/__init__.py +23 -0
  4. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/codec/image.py +16 -1
  5. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/version.py +26 -0
  6. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/__init__.py +20 -1
  7. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/accounts.py +10 -1
  8. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/benchmarks.py +32 -0
  9. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/connect.py +3 -0
  10. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/deployments.py +44 -2
  11. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/errors.py +9 -0
  12. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/eval.py +32 -1
  13. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/flags.py +17 -0
  14. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/policy.py +40 -1
  15. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/templates.py +2 -0
  16. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/volumes.py +5 -0
  17. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/wire.py +2 -0
  18. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/obs/rid.py +3 -0
  19. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/presets/robot_arm.py +28 -0
  20. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schema_export.py +13 -1
  21. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
  22. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkSpec.json +1 -1
  23. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentPolicy.json +1 -1
  24. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentRequest.json +2 -2
  25. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageSpec.json +1 -1
  26. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/PolicyRegistration.json +1 -1
  27. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/PolicySpec.json +1 -1
  28. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/RolloutResult.json +1 -1
  29. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/telemetry/events.py +7 -4
  30. {sequence_base-0.3.28 → sequence_base-0.3.29}/.gitignore +0 -0
  31. {sequence_base-0.3.28 → sequence_base-0.3.29}/README.md +0 -0
  32. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/auth.py +0 -0
  33. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/codec/__init__.py +0 -0
  34. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/__init__.py +0 -0
  35. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/env.py +0 -0
  36. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/constants/headers.py +0 -0
  37. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/act.py +0 -0
  38. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/contract/io.py +0 -0
  39. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/errors/__init__.py +0 -0
  40. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/errors/transport.py +0 -0
  41. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/obs/__init__.py +0 -0
  42. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/obs/log.py +0 -0
  43. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/presets/__init__.py +0 -0
  44. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActRequest.json +0 -0
  45. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActResponse.json +0 -0
  46. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActionChunk.json +0 -0
  47. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActionContract.json +0 -0
  48. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ActionStep.json +0 -0
  49. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/AdapterTransform.json +0 -0
  50. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/AddLocal.json +0 -0
  51. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Autoscaler.json +0 -0
  52. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkConditionSpec.json +0 -0
  53. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkStatusResponse.json +0 -0
  54. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/BootstrapResponse.json +0 -0
  55. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Camera.json +0 -0
  56. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ClampInfo.json +0 -0
  57. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/CodeBundle.json +0 -0
  58. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Concurrency.json +0 -0
  59. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Conditions.json +0 -0
  60. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ConnectRequest.json +0 -0
  61. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ConnectResponse.json +0 -0
  62. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentAccepted.json +0 -0
  63. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentStatusResponse.json +0 -0
  64. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Embodiment.json +0 -0
  65. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ErrorBody.json +0 -0
  66. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ErrorCodes.json +0 -0
  67. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Estimate.json +0 -0
  68. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalDryRunResponse.json +0 -0
  69. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalReport.json +0 -0
  70. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalRequest.json +0 -0
  71. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/EvalResponse.json +0 -0
  72. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageFrame.json +0 -0
  73. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepAddLocal.json +0 -0
  74. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepApt.json +0 -0
  75. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepEnv.json +0 -0
  76. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepRun.json +0 -0
  77. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepUvPip.json +0 -0
  78. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/InferParam.json +0 -0
  79. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Lease.json +0 -0
  80. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/LossyTransform.json +0 -0
  81. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/MetricAgg.json +0 -0
  82. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Observation.json +0 -0
  83. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/ObservationContract.json +0 -0
  84. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Proprioception.json +0 -0
  85. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/RenderSpec.json +0 -0
  86. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Resources.json +0 -0
  87. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SecretCreateRequest.json +0 -0
  88. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SecretInfo.json +0 -0
  89. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SecretRef.json +0 -0
  90. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SeqFlags.json +0 -0
  91. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Step.json +0 -0
  92. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/SuiteAgg.json +0 -0
  93. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/TaskAgg.json +0 -0
  94. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Timeouts.json +0 -0
  95. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/UploadTarget.json +0 -0
  96. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/UsageReport.json +0 -0
  97. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/Variant.json +0 -0
  98. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeAttach.json +0 -0
  99. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeFile.json +0 -0
  100. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeInfo.json +0 -0
  101. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeMount.json +0 -0
  102. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeRef.json +0 -0
  103. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeUploadRequest.json +0 -0
  104. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/VolumeUploadResponse.json +0 -0
  105. {sequence_base-0.3.28 → sequence_base-0.3.29}/sequence_base/schemas/WarmingError.json +0 -0
  106. {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.28
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.28"
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,3 +1,29 @@
1
1
  """The shared wire contract's version."""
2
2
 
3
+
4
+
5
+
6
+
3
7
  CONTRACT_VERSION = "0.4.25"
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
@@ -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 the contract number in docs/platform/contracts.md.
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 (full picture in docs/platform/accounts.md).
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 (accounts ⑦ / S3 goal 14), and the
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 (S3 goal 15). Defaults to `[]` so a policy with no secrets is
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: W0.1 delivers this wire shape only; the runtime that settles per-step `check.done` per-env and
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