sequence-base 0.3.27__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 (111) hide show
  1. {sequence_base-0.3.27 → sequence_base-0.3.29}/PKG-INFO +1 -1
  2. sequence_base-0.3.29/pyproject.toml +20 -0
  3. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/__init__.py +25 -25
  4. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/codec/image.py +17 -17
  5. sequence_base-0.3.29/sequence_base/constants/env.py +7 -0
  6. sequence_base-0.3.29/sequence_base/constants/headers.py +4 -0
  7. sequence_base-0.3.29/sequence_base/constants/version.py +29 -0
  8. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/__init__.py +20 -20
  9. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/accounts.py +10 -10
  10. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/act.py +1 -1
  11. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/benchmarks.py +34 -34
  12. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/connect.py +6 -6
  13. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/deployments.py +48 -48
  14. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/errors.py +13 -13
  15. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/eval.py +36 -36
  16. sequence_base-0.3.29/sequence_base/contract/flags.py +82 -0
  17. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/io.py +2 -2
  18. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/policy.py +47 -42
  19. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/templates.py +2 -2
  20. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/volumes.py +5 -5
  21. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/contract/wire.py +3 -3
  22. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/obs/rid.py +3 -3
  23. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/presets/__init__.py +1 -1
  24. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/presets/robot_arm.py +31 -31
  25. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schema_export.py +13 -13
  26. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ActRequest.json +1 -1
  27. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ActResponse.json +1 -1
  28. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ActionChunk.json +2 -2
  29. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ActionContract.json +2 -2
  30. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ActionStep.json +1 -1
  31. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/AdapterTransform.json +1 -1
  32. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/AddLocal.json +2 -2
  33. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Autoscaler.json +1 -1
  34. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkConditionSpec.json +2 -2
  35. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkRegisterRequest.json +6 -6
  36. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkSpec.json +4 -4
  37. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  38. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/BootstrapResponse.json +1 -1
  39. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Camera.json +1 -1
  40. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ClampInfo.json +1 -1
  41. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/CodeBundle.json +1 -1
  42. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Concurrency.json +18 -2
  43. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Conditions.json +1 -1
  44. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ConnectRequest.json +1 -1
  45. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ConnectResponse.json +4 -4
  46. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  47. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentPolicy.json +5 -5
  48. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentRequest.json +24 -8
  49. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  50. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Embodiment.json +3 -3
  51. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ErrorBody.json +1 -1
  52. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ErrorCodes.json +1 -1
  53. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Estimate.json +1 -1
  54. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/EvalDryRunResponse.json +2 -2
  55. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/EvalReport.json +3 -3
  56. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/EvalRequest.json +1 -1
  57. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/EvalResponse.json +1 -1
  58. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ImageFrame.json +1 -1
  59. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ImageSpec.json +3 -3
  60. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepAddLocal.json +2 -2
  61. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepApt.json +1 -1
  62. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepEnv.json +1 -1
  63. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepRun.json +1 -1
  64. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  65. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/InferParam.json +2 -2
  66. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Lease.json +1 -1
  67. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/LossyTransform.json +1 -1
  68. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/MetricAgg.json +1 -1
  69. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Observation.json +1 -1
  70. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/ObservationContract.json +2 -2
  71. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/PolicyRegistration.json +24 -8
  72. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/PolicySpec.json +23 -7
  73. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Proprioception.json +1 -1
  74. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/RenderSpec.json +1 -1
  75. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Resources.json +1 -1
  76. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/RolloutResult.json +2 -2
  77. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  78. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/SecretInfo.json +1 -1
  79. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/SecretRef.json +1 -1
  80. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/SeqFlags.json +1 -1
  81. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Step.json +1 -1
  82. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/SuiteAgg.json +1 -1
  83. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/TaskAgg.json +1 -1
  84. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Timeouts.json +1 -1
  85. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/UploadTarget.json +1 -1
  86. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/UsageReport.json +1 -1
  87. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/Variant.json +1 -1
  88. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/VolumeAttach.json +1 -1
  89. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/VolumeFile.json +1 -1
  90. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/VolumeInfo.json +1 -1
  91. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/VolumeMount.json +1 -1
  92. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/VolumeRef.json +1 -1
  93. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  94. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  95. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/schemas/WarmingError.json +1 -1
  96. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/telemetry/events.py +8 -8
  97. sequence_base-0.3.27/pyproject.toml +0 -27
  98. sequence_base-0.3.27/sequence_base/constants/env.py +0 -7
  99. sequence_base-0.3.27/sequence_base/constants/headers.py +0 -4
  100. sequence_base-0.3.27/sequence_base/constants/version.py +0 -28
  101. sequence_base-0.3.27/sequence_base/contract/flags.py +0 -82
  102. {sequence_base-0.3.27 → sequence_base-0.3.29}/.gitignore +0 -0
  103. {sequence_base-0.3.27 → sequence_base-0.3.29}/README.md +0 -0
  104. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/auth.py +0 -0
  105. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/codec/__init__.py +0 -0
  106. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/constants/__init__.py +0 -0
  107. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/errors/__init__.py +0 -0
  108. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/errors/transport.py +0 -0
  109. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/obs/__init__.py +0 -0
  110. {sequence_base-0.3.27 → sequence_base-0.3.29}/sequence_base/obs/log.py +0 -0
  111. {sequence_base-0.3.27 → 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.27
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
@@ -0,0 +1,20 @@
1
+ [project]
2
+ name = "sequence-base"
3
+ version = "0.3.29"
4
+ description = "Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness."
5
+ requires-python = ">=3.10"
6
+ dependencies = ["pydantic>=2.0"]
7
+
8
+ [project.optional-dependencies]
9
+ codec = ["pillow>=10", "numpy>=1.26"]
10
+ test = ["pytest", "jsonschema>=4"]
11
+
12
+ [build-system]
13
+ requires = ["hatchling"]
14
+ build-backend = "hatchling.build"
15
+
16
+ [tool.hatch.build.targets.wheel]
17
+ packages = ["sequence_base"]
18
+
19
+ [tool.hatch.build.targets.sdist]
20
+ include = ["/sequence_base", "/README.md", "/pyproject.toml"]
@@ -11,9 +11,9 @@ 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
- # contract — the full shared wire contract (obs/action + registry + deployments + connect + eval +
15
- # accounts + error bodies). One definition per shape; see sequence_base/contract for the grouping.
16
- from sequence_base.contract import ( # noqa: F401 (re-export surface)
14
+
15
+
16
+ from sequence_base.contract import (
17
17
  ActRequest,
18
18
  ActResponse,
19
19
  AddLocal,
@@ -98,14 +98,14 @@ from sequence_base.contract import ( # noqa: F401 (re-export surface)
98
98
  code_for_status,
99
99
  )
100
100
 
101
- # the single schema-level version stamp (embedded in every exported JSON Schema)
101
+
102
102
  from sequence_base.constants.version import CONTRACT_VERSION
103
103
 
104
- # obs — correlation id + structured logging (all three sides)
104
+
105
105
  from sequence_base.obs.log import Timer, enabled, log
106
106
  from sequence_base.obs.rid import HEADER, clean, new_rid
107
107
 
108
- # errors — shared transport status taxonomy (gateway + container)
108
+
109
109
  from sequence_base.errors.transport import (
110
110
  TransportOverloaded,
111
111
  TransportRejected,
@@ -113,55 +113,55 @@ from sequence_base.errors.transport import (
113
113
  TransportWarming,
114
114
  )
115
115
 
116
- # auth — Bearer secret helpers (gateway direct-connect / internal; container guard; worker emit)
116
+
117
117
  from sequence_base import auth
118
118
 
119
119
 
120
- # NOTE: codec (image encode/decode) is intentionally NOT re-exported here — it needs PIL + numpy
121
- # (the [codec] extra), and the gateway installs the light core. Import it explicitly where needed:
122
- # from sequence_base.codec import encode, decode, ResizeSpec
120
+
121
+
122
+
123
123
 
124
124
  __all__ = [
125
- # contract 4 — /act data plane
125
+
126
126
  "ImageFrame", "Proprioception", "Observation", "ActionSpace", "ActionStep", "ActionChunk",
127
127
  "ActRequest", "ActResponse",
128
- # contract 1 — flags + policy registry
128
+
129
129
  "SeqFlags", "ImageStepUvPip", "ImageStepApt", "ImageStepEnv", "ImageStepRun", "AddLocal", "ImageStepAddLocal",
130
130
  "ImageStep", "ImageSpec",
131
131
  "VolumeMount", "VolumeRef", "Concurrency", "ActionContract", "Camera", "ObservationContract", "Embodiment",
132
132
  "PolicySpec", "PolicyRegistration",
133
- # contract 2 — deployments
133
+
134
134
  "MAX_CODE_BUNDLE_BYTES", "CodeBundle",
135
135
  "Resources", "Autoscaler", "Timeouts", "VolumeAttach", "DeploymentPolicy", "InferParam", "DeploymentRequest",
136
136
  "DeploymentAccepted", "DeploymentState", "DeploymentStatusResponse",
137
- # contract 3 — connect / lease
137
+
138
138
  "Lease", "ConnectRequest", "ConnectResponse",
139
- # contract 5 — benchmark + eval
139
+
140
140
  "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
141
141
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
142
142
  "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
143
143
  "AdapterKind", "AdapterTransform",
144
- # contract 6 — accounts / secret / billing
144
+
145
145
  "SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse", "UsageReport",
146
- # contract 7 — volumes (uploaded checkpoints and datasets)
146
+
147
147
  "VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse", "VolumeInfo", "parse_vol",
148
- # official template weights
148
+
149
149
  "TEMPLATE_SCHEME", "parse_template",
150
- # error bodies + version
150
+
151
151
  "ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status", "CONTRACT_VERSION",
152
- # obs
152
+
153
153
  "HEADER", "new_rid", "clean", "log", "Timer", "enabled",
154
- # errors (exception taxonomy)
154
+
155
155
  "TransportUnavailable", "TransportWarming", "TransportRejected", "TransportOverloaded",
156
- # auth + telemetry
156
+
157
157
  "auth",
158
158
  ]
159
159
 
160
160
  try:
161
- # The installed distribution's own number, so this can never drift from pyproject.toml again (it said 0.3.6
162
- # while the package was 0.3.12). A source tree that was never installed reports "dev".
161
+
162
+
163
163
  from importlib.metadata import PackageNotFoundError, version as _version
164
164
 
165
165
  __version__ = _version("sequence-base")
166
- except PackageNotFoundError: # pragma: no cover - running from an uninstalled checkout
166
+ except PackageNotFoundError:
167
167
  __version__ = "dev"
@@ -16,19 +16,19 @@ import io
16
16
  from typing import Any
17
17
 
18
18
 
19
- # Quality 95, and the number is measured rather than chosen for looking safe. On a real DROID frame
20
- # with the sampling noise pinned, the encoding moves the resulting action by: q95 0.51% of action
21
- # amplitude, q90 0.20%, q85 1.86%, q75 2.86% — 85 and below is where the error jumps by an order of
22
- # magnitude, that is the line. 95 rather than the empirically-best 90 because the effect is not
23
- # monotonic in quality on a single frame, and tuning to one frame is fitting noise.
24
- # {sequences-models models/pi05_droid/handler.py "Q95 MAX|DELTA| 0.0048 0.51% ... Q85 1.86%"}
19
+
20
+
21
+
22
+
23
+
24
+
25
25
  DEFAULT_JPEG_QUALITY = 95
26
26
 
27
- # The longest edge `encode` uploads. Every policy resizes a frame to its own input size anyway, so pixels above
28
- # that only cost transport — and past a point they do not cost, they fail: a body over ~2 MB was dropped by a
29
- # worker queue with no error and no job id, surfacing as a hang. 640 is above every input size in use (pi0.5's
30
- # 224), so it discards nothing a policy reads. [MEASURED 2026-09-12: capping the long edge at 640 took a
31
- # three-view observation from 1.98 MB to 0.12 MB]
27
+
28
+
29
+
30
+
31
+
32
32
  MAX_UPLOAD_EDGE = 640
33
33
 
34
34
 
@@ -48,7 +48,7 @@ def encode(frame: Any, *, quality: int = DEFAULT_JPEG_QUALITY) -> str:
48
48
 
49
49
  try:
50
50
  from PIL import Image
51
- except ImportError as e: # pragma: no cover - depends on the install
51
+ except ImportError as e:
52
52
  raise ImportError(
53
53
  "encoding an array or PIL image needs Pillow: pip install 'sequence-base[codec]'. "
54
54
  "Pass an already-encoded base64 str or bytes to avoid it."
@@ -59,8 +59,8 @@ def encode(frame: Any, *, quality: int = DEFAULT_JPEG_QUALITY) -> str:
59
59
  img = img.convert("RGB")
60
60
  if max(img.size) > MAX_UPLOAD_EDGE:
61
61
  scale = MAX_UPLOAD_EDGE / max(img.size)
62
- # round() not int(): int() truncates a 640.9 on one axis and 359.9 on the other, drifting the
63
- # aspect ratio by up to half a percent for no reason.
62
+
63
+
64
64
  img = img.resize((max(1, round(img.width * scale)),
65
65
  max(1, round(img.height * scale))), Image.LANCZOS)
66
66
 
@@ -85,7 +85,7 @@ def decode(data: str) -> "Any":
85
85
  return np.asarray(Image.open(io.BytesIO(raw)).convert("RGB"), dtype=np.uint8)
86
86
 
87
87
 
88
- # ── depth frames ─────────────────────────────────────────────────────────────────────────────────────────────────────
88
+
89
89
  _DEPTH_UNITS = {"m": 1000.0, "mm": 1.0}
90
90
 
91
91
 
@@ -93,8 +93,8 @@ def encode_depth(depth: Any, *, unit: str = "m") -> str:
93
93
  """A depth map -> the base64 16-bit PNG a depth frame (ImageFrame kind="depth") carries: millimetres as uint16, 0
94
94
  where there is no reading (NaN, inf, <= 0), clipped at 65.535 m. `unit` is what the array holds: "m" (float metres,
95
95
  the default) or "mm". Lossless, unlike the JPEG colour frames take — a depth error is a geometry error.
96
- {gs-plans/customization/io-contract.md "深度图"} [CONFIDENCE: CONFIRMED 90% — uint16 millimetres is the layout
97
- depth cameras and ROS depth images use]"""
96
+
97
+ """
98
98
  import numpy as np
99
99
  from PIL import Image
100
100
 
@@ -0,0 +1,7 @@
1
+ """SEQ_* environment variable NAMES — a single source. Values live in ~/.config/sequences/, never here."""
2
+
3
+ DIRECT_SECRET = "SEQ_DIRECT_SECRET"
4
+ INTERNAL_SECRET = "SEQ_INTERNAL_SECRET"
5
+ GATEWAY_URL = "SEQ_GATEWAY_URL"
6
+ VOLUME_ROOT = "SEQ_VOLUME_ROOT"
7
+ MANIFEST = "SEQ_MANIFEST"
@@ -0,0 +1,4 @@
1
+ """HTTP header names — one source, so sdk / gateway / container never spell them differently."""
2
+
3
+ REQUEST_ID = "X-Seq-Request-Id"
4
+ AUTH_SCHEME = "Bearer"
@@ -0,0 +1,29 @@
1
+ """The shared wire contract's version."""
2
+
3
+
4
+
5
+
6
+
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,8 +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
- # contract 4 — /act data plane (obs/action DATA types)
5
+
6
6
  from sequence_base.contract.act import (
7
7
  ActionChunk,
8
8
  ActionSpace,
@@ -12,10 +12,10 @@ from sequence_base.contract.act import (
12
12
  Proprioception,
13
13
  )
14
14
 
15
- # contract 4, version 2 — the opaque /act envelope (inputs in, outputs out)
15
+
16
16
  from sequence_base.contract.wire import ActRequest, ActResponse
17
17
 
18
- # contract 1 — lifecycle flags + policy registry
18
+
19
19
  from sequence_base.contract.flags import SeqFlags
20
20
  from sequence_base.contract.policy import (
21
21
  Camera,
@@ -37,7 +37,7 @@ from sequence_base.contract.policy import (
37
37
  VolumeRef,
38
38
  )
39
39
 
40
- # contract 2 — deployments
40
+
41
41
  from sequence_base.contract.deployments import (
42
42
  MAX_CODE_BUNDLE_BYTES,
43
43
  Autoscaler,
@@ -53,10 +53,10 @@ from sequence_base.contract.deployments import (
53
53
  VolumeAttach,
54
54
  )
55
55
 
56
- # contract 3 — connect / lease
56
+
57
57
  from sequence_base.contract.connect import ConnectRequest, ConnectResponse, Lease
58
58
 
59
- # contract 5 — benchmark registration + eval run / report / adapter
59
+
60
60
  from sequence_base.contract.benchmarks import (
61
61
  BenchmarkConditionSpec,
62
62
  BenchmarkRegisterRequest,
@@ -84,7 +84,7 @@ from sequence_base.contract.eval import (
84
84
  TaskAgg,
85
85
  )
86
86
 
87
- # contract 6 — accounts / secret / billing
87
+
88
88
  from sequence_base.contract.accounts import (
89
89
  BootstrapResponse,
90
90
  SecretCreateRequest,
@@ -93,10 +93,10 @@ from sequence_base.contract.accounts import (
93
93
  UsageReport,
94
94
  )
95
95
 
96
- # official template weights — template://<name>[@v<n>]
96
+
97
97
  from sequence_base.contract.templates import TEMPLATE_SCHEME, parse_template
98
98
 
99
- # contract 7 — volumes (uploaded checkpoints and datasets)
99
+
100
100
  from sequence_base.contract.volumes import (
101
101
  MAX_FILES,
102
102
  MAX_UPLOAD_BYTES,
@@ -109,37 +109,37 @@ from sequence_base.contract.volumes import (
109
109
  parse_vol,
110
110
  )
111
111
 
112
- # shared error bodies
112
+
113
113
  from sequence_base.contract.errors import ERRORS, ErrorBody, ErrorCode, ErrorSpec, WarmingError, code_for_status
114
114
 
115
115
  __all__ = [
116
- # contract 4
116
+
117
117
  "ImageFrame", "Proprioception", "Observation", "ActionSpace", "ActionStep", "ActionChunk",
118
118
  "ActRequest", "ActResponse",
119
- # contract 1
119
+
120
120
  "SeqFlags",
121
121
  "ImageStepUvPip", "ImageStepApt", "ImageStepEnv", "ImageStepRun", "AddLocal", "ImageStepAddLocal", "ImageStep",
122
122
  "ImageSpec",
123
123
  "VolumeMount", "VolumeRef", "Concurrency", "ActionContract", "Camera", "ObservationContract", "Embodiment",
124
124
  "PolicySpec", "PolicyRegistration",
125
- # contract 2
125
+
126
126
  "MAX_CODE_BUNDLE_BYTES", "CodeBundle",
127
127
  "Resources", "Autoscaler", "Timeouts", "VolumeAttach", "DeploymentPolicy", "InferParam", "DeploymentRequest",
128
128
  "DeploymentAccepted", "DeploymentState", "DeploymentStatusResponse",
129
- # contract 3
129
+
130
130
  "Lease", "ConnectRequest", "ConnectResponse",
131
- # contract 5
131
+
132
132
  "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
133
133
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
134
134
  "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
135
135
  "AdapterKind", "AdapterTransform",
136
- # contract 6
136
+
137
137
  "SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse", "UsageReport",
138
- # contract 7
138
+
139
139
  "MAX_FILES", "MAX_UPLOAD_BYTES", "VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse",
140
140
  "VolumeInfo", "check_volume_name", "parse_vol",
141
- # official template weights
141
+
142
142
  "TEMPLATE_SCHEME", "parse_template",
143
- # errors
143
+
144
144
  "ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status",
145
145
  ]
@@ -1,5 +1,5 @@
1
1
  """
2
- 契约 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,8 +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
- # F6: write-direction plaintext carrier — hide_input_in_errors so a malformed body's ValidationError
44
- # str() never echoes the raw secret value (symmetric with SecretInfo). RUNTIME config, no schema change.
43
+
44
+
45
45
  model_config = ConfigDict(extra="forbid", hide_input_in_errors=True)
46
46
 
47
47
  name: str
@@ -51,10 +51,10 @@ class SecretCreateRequest(BaseModel):
51
51
  class SecretInfo(BaseModel):
52
52
  """GET /v1/secrets element — metadata only, NO values. Exposes `env_keys`, not `env`."""
53
53
 
54
- # hide_input_in_errors: if a malformed wire response carries a value-bearing extra field, extra="forbid"
55
- # raises ValidationError; without this, its str() would echo the raw input (the secret value). Defense in
56
- # depth so no caller that forgets to guard model_validate can leak it. RUNTIME config, not a wire shape —
57
- # does NOT change the serialized schema, so CONTRACT_VERSION is unaffected.
54
+
55
+
56
+
57
+
58
58
  model_config = ConfigDict(extra="forbid", hide_input_in_errors=True)
59
59
 
60
60
  name: str
@@ -67,15 +67,15 @@ class BootstrapResponse(BaseModel):
67
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
68
68
  WRITE-direction injection of the policy's declared user secrets into its subprocess (goal 15)."""
69
69
 
70
- # F6: carries down-direction platform secrets + write-direction user env — hide_input_in_errors so a
71
- # malformed body's ValidationError never echoes plaintext (symmetric with SecretInfo). RUNTIME config.
70
+
71
+
72
72
  model_config = ConfigDict(extra="forbid", hide_input_in_errors=True)
73
73
 
74
74
  direct_secret: str = Field(..., description="Platform-minted bearer the worker's guard checks")
75
75
  tls_key: str = Field(..., description="Self-signed TLS private key (down-direction platform secret)")
76
76
  tls_cert: str = Field(..., description="Self-signed TLS certificate (public)")
77
77
  env: dict[str, str] = Field(..., description="Policy's user secrets, expanded ENV_KEY → value")
78
- # None: a policy without a checkpoint — nothing was copied or mounted. {gs-plans/storage T13}
78
+
79
79
  weights_uri: str | None = None
80
80
  lease: Lease
81
81
 
@@ -5,7 +5,7 @@ They are no longer the platform's wire: since contract 0.4.14 the worker passes
5
5
  (`sequence_base.contract.wire`). This module keeps `from sequence_base.contract.act import Observation` resolving to the
6
6
  same classes for the gateway, harness and SDK code that still uses the preset.
7
7
  """
8
- from sequence_base.presets.robot_arm import ( # noqa: F401 — re-exports
8
+ from sequence_base.presets.robot_arm import (
9
9
  ActionChunk,
10
10
  ActionSpace,
11
11
  ActionStep,
@@ -1,5 +1,5 @@
1
1
  """
2
- 契约 5 (registration half) — benchmark is a second authorizable artifact, its registration symmetric to
2
+ Contract 5 (registration half) — benchmark is a second authorizable artifact, its registration symmetric to
3
3
  a policy's. `BenchmarkSpec` carries the same infra declaration a PolicySpec does, plus a structured
4
4
  `Conditions` (the eval matrix), versioned `assets` volumes, an optional `render` (mp4) declaration, and
5
5
  SeqFlags→method bindings covering SETUP / RESET / CHECK / SCORE. The eval *run* wire types (RolloutResult,
@@ -60,10 +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
- # How the platform turns each frame before encoding it. Whether a camera's picture is upside down is a property of
64
- # the renderer (OpenGL's glReadPixels returns the bottom row first: LIBERO / robosuite), so its author says it once
65
- # here instead of everyone who runs an eval passing it. {gs-plans inbox "LIBERO 风格的相机录出来是倒的"}
66
- # None (as drawn) is left off the wire, so a recording that is not turned registers on any platform version.
63
+
64
+
65
+
66
+
67
67
  flip: Literal["vertical", "horizontal", "both"] | None = Field(
68
68
  None, description="'vertical': rows reversed (upside down); 'horizontal': mirrored; 'both': turned 180°; "
69
69
  "None: as drawn")
@@ -103,20 +103,20 @@ class BenchmarkSpec(BaseModel):
103
103
  handler_ref: str
104
104
  bindings: dict[SeqFlags, str] = Field(..., description="SETUP / RESET / CHECK / SCORE (+ OBSERVE / STEP) → method name")
105
105
  gpu: str | list[str] | None = None
106
- # How many environments one benchmark instance runs at once when an eval does not say (the author's default).
106
+
107
107
  envs: int | None = Field(default=None, ge=1, le=65536)
108
108
  assets: list[VolumeRef] = Field(default_factory=list)
109
109
  render: RenderSpec | None = None
110
110
  cpu: int | None = None
111
111
  memory_gb: int | None = None
112
112
  secrets: list[SecretRef] = Field(default_factory=list)
113
- # The physics engine its simulation runs on (mujoco, sapien, isaac, genesis, pybullet): its icon in the console.
113
+
114
114
  engine: str | None = Field(default=None, pattern=KIND_NAME)
115
115
 
116
116
  @model_validator(mode="after")
117
117
  def _bindings_only_benchmark_hooks(self) -> "BenchmarkSpec":
118
- # eval-raw: only SETUP / RESET / CHECK / SCORE are bindable. ROLLOUT is deprecated (never bound) and
119
- # a policy-lifecycle flag has no place here — either is a malformed registration, caught at build.
118
+
119
+
120
120
  bad = set(self.bindings) - set(BENCHMARK_BINDABLE)
121
121
  if bad:
122
122
  names = ", ".join(sorted(f.name or str(f.value) for f in bad))
@@ -132,7 +132,7 @@ class BenchmarkSpec(BaseModel):
132
132
 
133
133
  class BenchmarkConditionSpec(BaseModel):
134
134
  """One episode setting exactly as the author declared it — a sparse list or a cross product, with its own step
135
- cap, wall-clock limit and suite. {gs-plans/customization/benchmark.md "6. 其它在 SDK 里收下、在生产里丢掉的声明"}"""
135
+ cap, wall-clock limit and suite."""
136
136
 
137
137
  model_config = ConfigDict(extra="forbid")
138
138
 
@@ -160,43 +160,43 @@ class BenchmarkRegisterRequest(BaseModel):
160
160
  render: RenderSpec | None = None
161
161
  cpu: int | None = None
162
162
  memory_gb: int | None = None
163
- # The benchmark's own source (reset/check hooks, its adapters), shipped like a policy's — the eval worker
164
- # imports handler_ref and any adapter ref from it. None only when the image installs the module itself.
163
+
164
+
165
165
  code: CodeBundle | None = None
166
- # Which suite each task belongs to (task -> suite), so reports aggregate per suite without the platform
167
- # guessing from task names. A task not listed here has no suite.
166
+
167
+
168
168
  suite_of: dict[str, str] = Field(default_factory=dict)
169
- # The action contract the benchmark's sim consumes; eval compares it with the policy's and requires an
170
- # adapter when they differ.
169
+
170
+
171
171
  action_contract: ActionContract | None = None
172
- # Credentials the sim's own code needs (a dataset token), by name only — injected into the build check and
173
- # every eval shard, never into the policy. {gs-plans/customization/benchmark.md "A.1 SECRETS"}
172
+
173
+
174
174
  secrets: list[SecretRef] = Field(default_factory=list)
175
- # Whether the benchmark defines @seq.score — the platform then calls it per group (overall, each suite, each
176
- # task) after every episode has run, and its keys override those groups' means. {benchmark.md "A.2"}
175
+
176
+
177
177
  score: bool = False
178
- # Every condition as declared (a sparse list stays sparse; each keeps its own max_steps / timeout_s / suite),
179
- # where `conditions` can only say tasks x seeds x variants. The eval runs these when present.
178
+
179
+
180
180
  condition_list: list[BenchmarkConditionSpec] | None = Field(default=None, max_length=5000)
181
- # An episode's wall-clock limit (seconds) when a condition sets none; past it the episode ends truncated.
181
+
182
182
  timeout_s: float | None = Field(default=None, gt=0)
183
- # The adapter (module:Class in the benchmark's own code) an eval uses when it names none.
183
+
184
184
  default_adapter_ref: str | None = None
185
- # The card each benchmark instance runs on (L4 or RTX-PRO-6000); None takes the platform's default (L4). The
186
- # simulation never runs on a CPU. {gs-plans/benchmark-internals/design.md "一、规则"}
185
+
186
+
187
187
  gpu: str | None = Field(default=None, max_length=32)
188
- # How many environments one instance runs at once when an eval does not say; None takes 1.
188
+
189
189
  envs: int | None = Field(default=None, ge=1, le=65536)
190
- # The parameters its @seq.setup declares — `def setup(self, envs, *, noise_std: float = 0.02)` — each with its type
191
- # and default, which an eval may set (--param benchmark.noise_std=0); None: it declares none, or an SDK from before
192
- # them. {gs-plans/eval-adapters/36}
190
+
191
+
192
+
193
193
  params: dict[str, InferParam] | None = Field(default=None, max_length=32)
194
- # Whether the benchmark is batched (binds OBSERVE and STEP and steps many environments in one call).
194
+
195
195
  batched: bool = False
196
- # The Dockerfile's build context, as for a deployment.
196
+
197
197
  image_context: CodeBundle | None = None
198
- # The physics engine the benchmark declares (`@seq.benchmark(engine="mujoco")`): its icon in the console. None:
199
- # undeclared, or an SDK from before it.
198
+
199
+
200
200
  engine: str | None = Field(default=None, pattern=KIND_NAME)
201
201
 
202
202
  @model_validator(mode="after")
@@ -1,9 +1,9 @@
1
1
  """
2
- 契约 3 — connect / lease (client → gateway; control plane, first call + renewal).
2
+ Contract 3 — connect / lease (client → gateway; control plane, first call + renewal).
3
3
 
4
4
  Control plane / data plane split: `connect(model)` goes through the gateway once (admission → acquire →
5
5
  ensure worker up) and hands back the *direct* coordinates the client then uses to hit the worker's
6
- `/act` without the gateway in the hot path (契约 4). The cold-start fallback is a defined wire body,
6
+ `/act` without the gateway in the hot path (contract 4). The cold-start fallback is a defined wire body,
7
7
  not an HTTP header alone — a 503 returns `WarmingError` (contract/errors.py), so `503 + Retry-After`
8
8
  and the warming ETA are typed and checkable.
9
9
  """
@@ -13,7 +13,7 @@ from datetime import datetime
13
13
 
14
14
  from pydantic import BaseModel, ConfigDict, Field
15
15
 
16
- # The 503 cold/warming body is defined once in contract.errors and reused here — no second shape.
16
+
17
17
  from sequence_base.contract.errors import WarmingError
18
18
  from sequence_base.contract.io import ActionContract, ObservationContract
19
19
 
@@ -43,7 +43,7 @@ class ConnectResponse(BaseModel):
43
43
  """200 — the full set of coordinates for a direct worker connection.
44
44
 
45
45
  `direct_secret` is a plaintext platform-minted bearer for the worker's `/act`; it is on the
46
- allow-list of fields permitted to carry a secret value in the down direction (契约 6 / goal 15)."""
46
+ allow-list of fields permitted to carry a secret value in the down direction (contract 6 / goal 15)."""
47
47
 
48
48
  model_config = ConfigDict(extra="forbid")
49
49
 
@@ -53,9 +53,9 @@ class ConnectResponse(BaseModel):
53
53
  lease: Lease
54
54
  warming: bool = Field(default=False, description="True → worker still warming; see warming_eta_s")
55
55
  warming_eta_s: int | None = Field(default=None, description="Seconds until warm, when warming")
56
- # The contracts this session is held to, so the client can check and assemble before the first act.
56
+
57
57
  action: ActionContract | None = None
58
58
  observation: ObservationContract | None = None
59
59
  embodiment: str | None = None
60
- # The deployment's own description of its inputs and outputs (DeploymentPolicy.io), when the author wrote one.
60
+
61
61
  io: str | None = None