sequence-base 0.3.25__tar.gz → 0.3.27__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.25 → sequence_base-0.3.27}/PKG-INFO +1 -1
  2. {sequence_base-0.3.25 → sequence_base-0.3.27}/pyproject.toml +1 -1
  3. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/auth.py +2 -2
  4. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/constants/env.py +1 -1
  5. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/constants/version.py +4 -2
  6. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/accounts.py +4 -5
  7. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/benchmarks.py +6 -1
  8. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/deployments.py +7 -3
  9. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/eval.py +4 -0
  10. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/policy.py +8 -0
  11. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/volumes.py +0 -1
  12. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ActRequest.json +1 -1
  13. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ActResponse.json +1 -1
  14. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ActionChunk.json +1 -1
  15. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ActionContract.json +1 -1
  16. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ActionStep.json +1 -1
  17. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/AdapterTransform.json +1 -1
  18. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/AddLocal.json +1 -1
  19. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Autoscaler.json +1 -1
  20. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
  21. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/BenchmarkRegisterRequest.json +15 -2
  22. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/BenchmarkSpec.json +16 -3
  23. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  24. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/BootstrapResponse.json +2 -2
  25. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Camera.json +1 -1
  26. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ClampInfo.json +1 -1
  27. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/CodeBundle.json +1 -1
  28. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Concurrency.json +1 -1
  29. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Conditions.json +1 -1
  30. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ConnectRequest.json +1 -1
  31. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ConnectResponse.json +1 -1
  32. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  33. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/DeploymentPolicy.json +15 -2
  34. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/DeploymentRequest.json +15 -2
  35. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  36. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Embodiment.json +1 -1
  37. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ErrorBody.json +1 -1
  38. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ErrorCodes.json +1 -1
  39. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Estimate.json +13 -1
  40. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/EvalDryRunResponse.json +13 -1
  41. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/EvalReport.json +1 -1
  42. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/EvalRequest.json +1 -1
  43. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/EvalResponse.json +13 -1
  44. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ImageFrame.json +1 -1
  45. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ImageSpec.json +2 -2
  46. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  47. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ImageStepApt.json +1 -1
  48. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ImageStepEnv.json +1 -1
  49. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ImageStepRun.json +2 -2
  50. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  51. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/InferParam.json +1 -1
  52. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Lease.json +1 -1
  53. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/LossyTransform.json +1 -1
  54. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/MetricAgg.json +1 -1
  55. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Observation.json +1 -1
  56. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/ObservationContract.json +1 -1
  57. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/PolicyRegistration.json +16 -3
  58. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/PolicySpec.json +15 -2
  59. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Proprioception.json +1 -1
  60. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/RenderSpec.json +1 -1
  61. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Resources.json +1 -1
  62. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/RolloutResult.json +1 -1
  63. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/SecretCreateRequest.json +2 -2
  64. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/SecretInfo.json +1 -1
  65. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/SecretRef.json +2 -2
  66. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/SeqFlags.json +1 -1
  67. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Step.json +1 -1
  68. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/SuiteAgg.json +1 -1
  69. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/TaskAgg.json +1 -1
  70. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Timeouts.json +1 -1
  71. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/UploadTarget.json +1 -1
  72. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/UsageReport.json +2 -2
  73. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/Variant.json +1 -1
  74. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/VolumeAttach.json +1 -1
  75. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/VolumeFile.json +1 -1
  76. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/VolumeInfo.json +1 -1
  77. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/VolumeMount.json +1 -1
  78. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/VolumeRef.json +1 -1
  79. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  80. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  81. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schemas/WarmingError.json +1 -1
  82. {sequence_base-0.3.25 → sequence_base-0.3.27}/.gitignore +0 -0
  83. {sequence_base-0.3.25 → sequence_base-0.3.27}/README.md +0 -0
  84. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/__init__.py +0 -0
  85. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/codec/__init__.py +0 -0
  86. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/codec/image.py +0 -0
  87. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/constants/__init__.py +0 -0
  88. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/constants/headers.py +0 -0
  89. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/__init__.py +0 -0
  90. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/act.py +0 -0
  91. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/connect.py +0 -0
  92. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/errors.py +0 -0
  93. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/flags.py +0 -0
  94. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/io.py +0 -0
  95. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/templates.py +0 -0
  96. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/contract/wire.py +0 -0
  97. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/errors/__init__.py +0 -0
  98. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/errors/transport.py +0 -0
  99. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/obs/__init__.py +0 -0
  100. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/obs/log.py +0 -0
  101. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/obs/rid.py +0 -0
  102. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/presets/__init__.py +0 -0
  103. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/presets/robot_arm.py +0 -0
  104. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/schema_export.py +0 -0
  105. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/telemetry/__init__.py +0 -0
  106. {sequence_base-0.3.25 → sequence_base-0.3.27}/sequence_base/telemetry/events.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sequence-base
3
- Version: 0.3.25
3
+ Version: 0.3.27
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.25"
3
+ version = "0.3.27"
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
  # 3.10, not 3.11: `seq` (which imports this) must run on ROS 2 Humble's Python 3.10, and nothing here needs 3.11.
6
6
  # {2026-10-03 the full suite on CPython 3.10.20: "147 PASSED"; vermin --eval-annotations: "MINIMUM REQUIRED VERSIONS: 3.9"}
@@ -2,8 +2,8 @@
2
2
  Bearer-token auth helpers — one implementation of the direct-connect / internal secret check.
3
3
 
4
4
  Three consumers, one rule: the container's inbound guard on a directly-exposed pod's /act, the
5
- gateway's SEQ_DIRECT_SECRET issuance + its /v1/internal/worker-log secret check, and the worker's
6
- emit() which builds the outbound header. compare_digest, not `==`, everywhere — a wrong secret must
5
+ gateway's issuance of that secret and its check of a worker's own reports, and the worker's emit() which
6
+ builds the outbound header. compare_digest, not `==`, everywhere — a wrong secret must
7
7
  not be recoverable from response timing.
8
8
  """
9
9
  from __future__ import annotations
@@ -1,7 +1,7 @@
1
1
  """SEQ_* environment variable NAMES — a single source. Values live in ~/.config/sequences/, never here."""
2
2
 
3
3
  DIRECT_SECRET = "SEQ_DIRECT_SECRET" # inbound /act auth on a public pod
4
- INTERNAL_SECRET = "SEQ_INTERNAL_SECRET" # auth for container → gateway telemetry
4
+ INTERNAL_SECRET = "SEQ_INTERNAL_SECRET" # auth for a worker's own reports
5
5
  GATEWAY_URL = "SEQ_GATEWAY_URL" # where the container sends telemetry
6
6
  VOLUME_ROOT = "SEQ_VOLUME_ROOT" # where fetched weights land
7
7
  MANIFEST = "SEQ_MANIFEST" # the policy manifest a container serves
@@ -4,14 +4,16 @@
4
4
  # across deployments / repos can tell which version of a shape it is validating against. MUST change
5
5
  # whenever any shared wire shape changes (a field added / removed / retyped) — that is what makes
6
6
  # contract evolution mechanically detectable instead of eyeballed. Bump on any shape change.
7
- CONTRACT_VERSION = "0.4.22" # 0.4.21 -> 0.4.22: ParamUsed.source "deployment" — an eval of a policy runs with the default its deployment sets (`seq policy params`), and its report says so (gs-plans deploy-serving/35)
7
+ CONTRACT_VERSION = "0.4.24" # 0.4.23 -> 0.4.24: PolicySpec / DeploymentPolicy.family and BenchmarkSpec / BenchmarkRegisterRequest.engine — the model family a policy declares and the physics engine a benchmark runs on (a short lowercase name, KIND_NAME), each its icon in the console (gs-plans U14)
8
+ # previous: 0.4.23 # 0.4.22 -> 0.4.23: Estimate.held_usd — what an eval holds from the balance when it differs from the estimate (the estimate on each machine's first card, the hold on its costliest; gs-plans inbox/audit-2026-10-07 B4)
9
+ # previous: 0.4.22 # 0.4.21 -> 0.4.22: ParamUsed.source "deployment" — an eval of a policy runs with the default its deployment sets (`seq policy params`), and its report says so (gs-plans deploy-serving/35)
8
10
  # previous: 0.4.21 # 0.4.20 -> 0.4.21: InferParam.min / max / choices — the values an inference parameter allows (seq.Range / seq.OneOf), refused before inference outside them; None, left off the wire, as before (gs-plans deploy-serving/35)
9
11
  # previous: 0.4.20 # 0.4.19 -> 0.4.20: BenchmarkRegisterRequest.params — the parameters a benchmark's @seq.setup declares (InferParam: type and default), which an eval may set; EvalReport.arm_params — per arm each parameter's value and source, and the steps that asked the policy of all it took (gs-plans eval-adapters/36)
10
12
  # previous: 0.4.19 # 0.4.18 -> 0.4.19: RenderSpec.flip — how the platform turns a recorded camera's frames before encoding ("vertical" / "horizontal" / "both"; None, left off the wire, as drawn), declared once by the benchmark's author (seq.Record(flip=...)); gs-plans benchmarks
11
13
  # previous: 0.4.18 # 0.4.17 -> 0.4.18: DeploymentPolicy.models — the platform models a policy calls while it runs (catalogue ids), which the act key driving it may call on /v1/chat and /v1/decide (gs-plans models-api/11)
12
14
  # previous: 0.4.17 # 0.4.16 -> 0.4.17: weights optional — PolicySpec.weights, DeploymentRequest.weights and BootstrapResponse.weights_uri may be None, for a policy without a checkpoint (nothing copied or mounted; gs-plans storage T13)
13
15
  # previous: 0.4.16 # 0.4.15 -> 0.4.16: batched benchmarks — SeqFlags.OBSERVE / STEP, BenchmarkSpec / BenchmarkRegisterRequest.envs and .batched; per-arm eval reports — EvalReport.arms / paired / timing / stop_reason, EvalStatus.CANCELED, Estimate.breakdown / default_timing, EvalResponse.arms, EvalDryRunResponse.layout / notes
14
- # previous: 0.4.15 # 0.4.14 -> 0.4.15: limits count GPUs and CPU/memory are billed like Modal — Resources.cpu / memory_gb optional floats + cpu_limit / memory_limit_gb; Autoscaler.max_gpus / on_full / queue_timeout_s replace max_containers; Concurrency fields optional + replicas_per_gpu / gpus_per_replica; DeploymentStatusResponse.reason; EvalRequest.policy_instances / policy_gpu / benchmark_instances / benchmark_gpu / envs replace gpus / envs_per_gpu; EvalStatus.QUEUED; EvalCards / EvalQueue
16
+ # previous: 0.4.15 # 0.4.14 -> 0.4.15: limits count GPUs and CPU/memory are billed per second — Resources.cpu / memory_gb optional floats + cpu_limit / memory_limit_gb; Autoscaler.max_gpus / on_full / queue_timeout_s replace max_containers; Concurrency fields optional + replicas_per_gpu / gpus_per_replica; DeploymentStatusResponse.reason; EvalRequest.policy_instances / policy_gpu / benchmark_instances / benchmark_gpu / envs replace gpus / envs_per_gpu; EvalStatus.QUEUED; EvalCards / EvalQueue
15
17
  # previous: 0.4.14 # 0.4.13 -> 0.4.14: the /act wire is opaque (ActRequest.inputs / ActResponse.outputs); action / observation contracts optional + DeploymentPolicy/PolicySpec/ConnectResponse .io; the robot-arm types live in sequence_base.presets.robot_arm (contract.act / contract.io re-export them); ImageStepAddLocal (seq.Image.add_local_*); ActionSpace.JOINT_VELOCITY (pi0.5 DROID's joint velocities + gripper position)
16
18
  # previous: 0.4.13 # 0.4.12 -> 0.4.13: template://<name>[@v<n>] — official template weights (parse_template); gs:// / s3:// / https:// still accepted until their removal
17
19
  # previous: 0.4.12 # 0.4.11 -> 0.4.12: one error definition — ErrorBody is every non-2xx body (detail, code, retryable, retry_after_s, request_id, hint, details), ErrorCode covers every case, ERRORS / ErrorCodes.json give each code its status, retryability, SDK class and CLI exit code
@@ -29,7 +29,7 @@ __all__ = [
29
29
 
30
30
  class SecretRef(BaseModel):
31
31
  """A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the
32
- value lives in Secret Manager and is injected at worker bootstrap. Never carries a value."""
32
+ platform keeps the value and injects it when a worker starts. Never carries a value."""
33
33
 
34
34
  model_config = ConfigDict(extra="forbid")
35
35
 
@@ -37,7 +37,7 @@ class SecretRef(BaseModel):
37
37
 
38
38
 
39
39
  class SecretCreateRequest(BaseModel):
40
- """POST /v1/secrets — one name = one group of env values (e.g. openrouter = {OPENROUTER_API_KEY}).
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
43
  # F6: write-direction plaintext carrier — hide_input_in_errors so a malformed body's ValidationError
@@ -64,8 +64,7 @@ class SecretInfo(BaseModel):
64
64
 
65
65
 
66
66
  class BootstrapResponse(BaseModel):
67
- """POST /v1/internal/bootstrap (worker instance-identity JWT) — everything a worker needs to serve
68
- direct TLS `/act`. `direct_secret` + `tls_key` are DOWN-direction platform secrets; `env` is the
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
69
68
  WRITE-direction injection of the policy's declared user secrets into its subprocess (goal 15)."""
70
69
 
71
70
  # F6: carries down-direction platform secrets + write-direction user env — hide_input_in_errors so a
@@ -82,7 +81,7 @@ class BootstrapResponse(BaseModel):
82
81
 
83
82
 
84
83
  class UsageReport(BaseModel):
85
- """POST /v1/internal/usage — the worker's async metering report. Carries counts only, no secrets.
84
+ """A worker's metering report, sent as it serves. Carries counts only, no secrets.
86
85
  This usage shape is defined here (sequence-base) once, so gateway and worker cannot drift."""
87
86
 
88
87
  model_config = ConfigDict(extra="forbid")
@@ -19,7 +19,7 @@ from pydantic import BaseModel, ConfigDict, Field, model_validator
19
19
  from sequence_base.contract.accounts import SecretRef
20
20
  from sequence_base.contract.deployments import CodeBundle, DeploymentState, InferParam
21
21
  from sequence_base.contract.flags import BENCHMARK_BATCHED, BENCHMARK_BINDABLE, SeqFlags
22
- from sequence_base.contract.policy import ActionContract, ImageSpec, VolumeRef
22
+ from sequence_base.contract.policy import KIND_NAME, ActionContract, ImageSpec, VolumeRef
23
23
 
24
24
  __all__ = [
25
25
  "Variant",
@@ -110,6 +110,8 @@ class BenchmarkSpec(BaseModel):
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.
114
+ engine: str | None = Field(default=None, pattern=KIND_NAME)
113
115
 
114
116
  @model_validator(mode="after")
115
117
  def _bindings_only_benchmark_hooks(self) -> "BenchmarkSpec":
@@ -193,6 +195,9 @@ class BenchmarkRegisterRequest(BaseModel):
193
195
  batched: bool = False
194
196
  # The Dockerfile's build context, as for a deployment.
195
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.
200
+ engine: str | None = Field(default=None, pattern=KIND_NAME)
196
201
 
197
202
  @model_validator(mode="after")
198
203
  def _param_names(self) -> "BenchmarkRegisterRequest":
@@ -25,6 +25,7 @@ from sequence_base.contract.templates import TEMPLATE_SCHEME, parse_template
25
25
  from sequence_base.contract.volumes import VOL_SCHEME, parse_vol
26
26
  from sequence_base.contract.io import Embodiment, ObservationContract
27
27
  from sequence_base.contract.policy import (
28
+ KIND_NAME,
28
29
  ActionContract,
29
30
  Concurrency,
30
31
  ImageSpec,
@@ -52,9 +53,9 @@ class Resources(BaseModel):
52
53
  model_config = ConfigDict(extra="forbid")
53
54
 
54
55
  gpu: list[str]
55
- # Physical cores and GiB the worker requests, billed like Modal: per second, at the greater of the request and what
56
- # it uses. None requests the minimum (0.125 cores, 0.125 GiB) and the worker may use more. A limit caps what it may
57
- # use; None leaves it free to burst. {gs-plans/parallel/cpu-memory.md "4. 默认申请量照 Modal"}
56
+ # Physical cores and GiB the worker requests, billed per second at the greater of the request and what it uses.
57
+ # None requests the minimum (0.125 cores, 0.125 GiB) and the worker may use more. A limit caps what it may use;
58
+ # None leaves it free to burst.
58
59
  cpu: float | None = Field(default=None, ge=0.125, le=64)
59
60
  cpu_limit: float | None = Field(default=None, ge=0.125, le=128)
60
61
  memory_gb: float | None = Field(default=None, ge=0.125, le=1024)
@@ -194,6 +195,9 @@ class DeploymentPolicy(BaseModel):
194
195
  # The author's own description of what infer() takes and returns; stored, handed to the robot at connect, never
195
196
  # interpreted by the platform.
196
197
  io: str | None = Field(default=None, max_length=4000)
198
+ # The model family the policy declares (`@seq.policy(family="pi")`): its icon in the console. None: undeclared,
199
+ # or an SDK from before it.
200
+ family: str | None = Field(default=None, pattern=KIND_NAME)
197
201
  # The inference parameters @seq.infer takes beyond the observation (name -> type, default). None: an older
198
202
  # SDK that did not look; {}: the policy declares none.
199
203
  params: dict[str, InferParam] | None = Field(default=None, max_length=32)
@@ -102,6 +102,10 @@ class Estimate(BaseModel):
102
102
  breakdown: dict[str, float] | None = None
103
103
  # True when no run of this benchmark version has been measured yet and the estimate uses the default step time.
104
104
  default_timing: bool | None = None
105
+ # What is held from the balance while the eval runs, when it differs from the estimate: the estimate prices each
106
+ # machine on the first card of its list (where it starts when one is free), the hold on the costliest (the most it
107
+ # can come to), with the reserve buffer, at most max_usd. None from a gateway before contract 0.4.23.
108
+ held_usd: float | None = None
105
109
 
106
110
 
107
111
  class EvalResponse(BaseModel):
@@ -175,6 +175,12 @@ class Concurrency(BaseModel):
175
175
  return self
176
176
 
177
177
 
178
+ # A family or an engine as a declaration names it: a short lowercase name (pi, gr00t, cosmos; mujoco, sapien, isaac).
179
+ # The console draws a policy's or a benchmark's icon from it, and the default icon for a name it does not know; the
180
+ # platform reads nothing else into it. {gs-plans U14 "声明参数 @seq.policy(family=) 和 @seq.benchmark(engine=)"}
181
+ KIND_NAME = r"^[a-z0-9][a-z0-9._-]{0,31}$"
182
+
183
+
178
184
  class PolicySpec(BaseModel):
179
185
  """What `@seq.policy(...)` accrues — a policy's complete infra declaration, losslessly. `action` /
180
186
  `observation` / `embodiments` are optional (contract 0.4.14): a policy that declares none defines its I/O in its own
@@ -215,6 +221,8 @@ class PolicySpec(BaseModel):
215
221
  # The author's own description of what infer() takes and returns. Stored and shown (connect hands it to the
216
222
  # robot); the platform never interprets it.
217
223
  io: str | None = Field(default=None, max_length=4000)
224
+ # The model family it belongs to (pi, gr00t, cosmos, lerobot): its icon in the console. None: undeclared.
225
+ family: str | None = Field(default=None, pattern=KIND_NAME)
218
226
 
219
227
  @field_validator("weights")
220
228
  @classmethod
@@ -10,7 +10,6 @@ WHY direct-to-storage targets rather than streaming through the API: a checkpoin
10
10
  host caps a request body at 32 MiB and would carry every byte twice. WHY the md5 list up front: the commit can
11
11
  then prove the platform holds exactly the bytes the client had — a truncated or corrupted upload is refused
12
12
  instead of becoming the weights a robot runs on.
13
- {gs-plans/customization/volumes.md "上传流程" + "为什么不直接上传进 MODAL VOLUME"}
14
13
  """
15
14
  from __future__ import annotations
16
15
 
@@ -65,5 +65,5 @@
65
65
  ],
66
66
  "title": "ActRequest",
67
67
  "type": "object",
68
- "x-contract-version": "0.4.22"
68
+ "x-contract-version": "0.4.24"
69
69
  }
@@ -75,5 +75,5 @@
75
75
  ],
76
76
  "title": "ActResponse",
77
77
  "type": "object",
78
- "x-contract-version": "0.4.22"
78
+ "x-contract-version": "0.4.24"
79
79
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "ActionChunk",
101
101
  "type": "object",
102
- "x-contract-version": "0.4.22"
102
+ "x-contract-version": "0.4.24"
103
103
  }
@@ -100,5 +100,5 @@
100
100
  ],
101
101
  "title": "ActionContract",
102
102
  "type": "object",
103
- "x-contract-version": "0.4.22"
103
+ "x-contract-version": "0.4.24"
104
104
  }
@@ -19,5 +19,5 @@
19
19
  ],
20
20
  "title": "ActionStep",
21
21
  "type": "object",
22
- "x-contract-version": "0.4.22"
22
+ "x-contract-version": "0.4.24"
23
23
  }
@@ -38,5 +38,5 @@
38
38
  ],
39
39
  "title": "AdapterTransform",
40
40
  "type": "object",
41
- "x-contract-version": "0.4.22"
41
+ "x-contract-version": "0.4.24"
42
42
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "AddLocal",
25
25
  "type": "object",
26
- "x-contract-version": "0.4.22"
26
+ "x-contract-version": "0.4.24"
27
27
  }
@@ -69,5 +69,5 @@
69
69
  },
70
70
  "title": "Autoscaler",
71
71
  "type": "object",
72
- "x-contract-version": "0.4.22"
72
+ "x-contract-version": "0.4.24"
73
73
  }
@@ -62,5 +62,5 @@
62
62
  ],
63
63
  "title": "BenchmarkConditionSpec",
64
64
  "type": "object",
65
- "x-contract-version": "0.4.22"
65
+ "x-contract-version": "0.4.24"
66
66
  }
@@ -558,7 +558,7 @@
558
558
  },
559
559
  "SecretRef": {
560
560
  "additionalProperties": false,
561
- "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nvalue lives in Secret Manager and is injected at worker bootstrap. Never carries a value.",
561
+ "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nplatform keeps the value and injects it when a worker starts. Never carries a value.",
562
562
  "properties": {
563
563
  "name": {
564
564
  "title": "Name",
@@ -702,6 +702,19 @@
702
702
  "default": null,
703
703
  "title": "Default Adapter Ref"
704
704
  },
705
+ "engine": {
706
+ "anyOf": [
707
+ {
708
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,31}$",
709
+ "type": "string"
710
+ },
711
+ {
712
+ "type": "null"
713
+ }
714
+ ],
715
+ "default": null,
716
+ "title": "Engine"
717
+ },
705
718
  "envs": {
706
719
  "anyOf": [
707
720
  {
@@ -836,5 +849,5 @@
836
849
  ],
837
850
  "title": "BenchmarkRegisterRequest",
838
851
  "type": "object",
839
- "x-contract-version": "0.4.22"
852
+ "x-contract-version": "0.4.24"
840
853
  }
@@ -264,7 +264,7 @@
264
264
  },
265
265
  "SecretRef": {
266
266
  "additionalProperties": false,
267
- "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nvalue lives in Secret Manager and is injected at worker bootstrap. Never carries a value.",
267
+ "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nplatform keeps the value and injects it when a worker starts. Never carries a value.",
268
268
  "properties": {
269
269
  "name": {
270
270
  "title": "Name",
@@ -297,7 +297,7 @@
297
297
  ],
298
298
  "title": "SeqFlags",
299
299
  "type": "integer",
300
- "x-contract-version": "0.4.22",
300
+ "x-contract-version": "0.4.24",
301
301
  "x-flag-names": {
302
302
  "CHECK": 65536,
303
303
  "INFER": 16,
@@ -416,6 +416,19 @@
416
416
  "default": null,
417
417
  "title": "Cpu"
418
418
  },
419
+ "engine": {
420
+ "anyOf": [
421
+ {
422
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,31}$",
423
+ "type": "string"
424
+ },
425
+ {
426
+ "type": "null"
427
+ }
428
+ ],
429
+ "default": null,
430
+ "title": "Engine"
431
+ },
419
432
  "envs": {
420
433
  "anyOf": [
421
434
  {
@@ -505,5 +518,5 @@
505
518
  ],
506
519
  "title": "BenchmarkSpec",
507
520
  "type": "object",
508
- "x-contract-version": "0.4.22"
521
+ "x-contract-version": "0.4.24"
509
522
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "BenchmarkStatusResponse",
42
42
  "type": "object",
43
- "x-contract-version": "0.4.22"
43
+ "x-contract-version": "0.4.24"
44
44
  }
@@ -29,7 +29,7 @@
29
29
  }
30
30
  },
31
31
  "additionalProperties": false,
32
- "description": "POST /v1/internal/bootstrap (worker instance-identity JWT) — everything a worker needs to serve\ndirect TLS `/act`. `direct_secret` + `tls_key` are DOWN-direction platform secrets; `env` is the\nWRITE-direction injection of the policy's declared user secrets into its subprocess (goal 15).",
32
+ "description": "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\nWRITE-direction injection of the policy's declared user secrets into its subprocess (goal 15).",
33
33
  "properties": {
34
34
  "direct_secret": {
35
35
  "description": "Platform-minted bearer the worker's guard checks",
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "BootstrapResponse",
81
81
  "type": "object",
82
- "x-contract-version": "0.4.22"
82
+ "x-contract-version": "0.4.24"
83
83
  }
@@ -34,5 +34,5 @@
34
34
  ],
35
35
  "title": "Camera",
36
36
  "type": "object",
37
- "x-contract-version": "0.4.22"
37
+ "x-contract-version": "0.4.24"
38
38
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "ClampInfo",
25
25
  "type": "object",
26
- "x-contract-version": "0.4.22"
26
+ "x-contract-version": "0.4.24"
27
27
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "CodeBundle",
25
25
  "type": "object",
26
- "x-contract-version": "0.4.22"
26
+ "x-contract-version": "0.4.24"
27
27
  }
@@ -61,5 +61,5 @@
61
61
  },
62
62
  "title": "Concurrency",
63
63
  "type": "object",
64
- "x-contract-version": "0.4.22"
64
+ "x-contract-version": "0.4.24"
65
65
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "Conditions",
57
57
  "type": "object",
58
- "x-contract-version": "0.4.22"
58
+ "x-contract-version": "0.4.24"
59
59
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "ConnectRequest",
27
27
  "type": "object",
28
- "x-contract-version": "0.4.22"
28
+ "x-contract-version": "0.4.24"
29
29
  }
@@ -307,5 +307,5 @@
307
307
  ],
308
308
  "title": "ConnectResponse",
309
309
  "type": "object",
310
- "x-contract-version": "0.4.22"
310
+ "x-contract-version": "0.4.24"
311
311
  }
@@ -18,5 +18,5 @@
18
18
  ],
19
19
  "title": "DeploymentAccepted",
20
20
  "type": "object",
21
- "x-contract-version": "0.4.22"
21
+ "x-contract-version": "0.4.24"
22
22
  }
@@ -318,7 +318,7 @@
318
318
  },
319
319
  "SecretRef": {
320
320
  "additionalProperties": false,
321
- "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nvalue lives in Secret Manager and is injected at worker bootstrap. Never carries a value.",
321
+ "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nplatform keeps the value and injects it when a worker starts. Never carries a value.",
322
322
  "properties": {
323
323
  "name": {
324
324
  "title": "Name",
@@ -373,6 +373,19 @@
373
373
  "default": null,
374
374
  "title": "Embodiments"
375
375
  },
376
+ "family": {
377
+ "anyOf": [
378
+ {
379
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,31}$",
380
+ "type": "string"
381
+ },
382
+ {
383
+ "type": "null"
384
+ }
385
+ ],
386
+ "default": null,
387
+ "title": "Family"
388
+ },
376
389
  "frames_per_chunk": {
377
390
  "anyOf": [
378
391
  {
@@ -463,5 +476,5 @@
463
476
  ],
464
477
  "title": "DeploymentPolicy",
465
478
  "type": "object",
466
- "x-contract-version": "0.4.22"
479
+ "x-contract-version": "0.4.24"
467
480
  }
@@ -368,6 +368,19 @@
368
368
  "default": null,
369
369
  "title": "Embodiments"
370
370
  },
371
+ "family": {
372
+ "anyOf": [
373
+ {
374
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,31}$",
375
+ "type": "string"
376
+ },
377
+ {
378
+ "type": "null"
379
+ }
380
+ ],
381
+ "default": null,
382
+ "title": "Family"
383
+ },
371
384
  "frames_per_chunk": {
372
385
  "anyOf": [
373
386
  {
@@ -890,7 +903,7 @@
890
903
  },
891
904
  "SecretRef": {
892
905
  "additionalProperties": false,
893
- "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nvalue lives in Secret Manager and is injected at worker bootstrap. Never carries a value.",
906
+ "description": "A by-name reference to a secret (PolicySpec.secrets / BenchmarkSpec.secrets). Name only — the\nplatform keeps the value and injects it when a worker starts. Never carries a value.",
894
907
  "properties": {
895
908
  "name": {
896
909
  "title": "Name",
@@ -1077,5 +1090,5 @@
1077
1090
  ],
1078
1091
  "title": "DeploymentRequest",
1079
1092
  "type": "object",
1080
- "x-contract-version": "0.4.22"
1093
+ "x-contract-version": "0.4.24"
1081
1094
  }
@@ -58,5 +58,5 @@
58
58
  ],
59
59
  "title": "DeploymentStatusResponse",
60
60
  "type": "object",
61
- "x-contract-version": "0.4.22"
61
+ "x-contract-version": "0.4.24"
62
62
  }
@@ -213,5 +213,5 @@
213
213
  ],
214
214
  "title": "Embodiment",
215
215
  "type": "object",
216
- "x-contract-version": "0.4.22"
216
+ "x-contract-version": "0.4.24"
217
217
  }
@@ -94,5 +94,5 @@
94
94
  ],
95
95
  "title": "ErrorBody",
96
96
  "type": "object",
97
- "x-contract-version": "0.4.22"
97
+ "x-contract-version": "0.4.24"
98
98
  }
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "title": "ErrorCode",
24
24
  "type": "string",
25
- "x-contract-version": "0.4.22",
25
+ "x-contract-version": "0.4.24",
26
26
  "x-errors": {
27
27
  "budget_exhausted": {
28
28
  "exit_code": 6,
@@ -32,6 +32,18 @@
32
32
  "default": null,
33
33
  "title": "Default Timing"
34
34
  },
35
+ "held_usd": {
36
+ "anyOf": [
37
+ {
38
+ "type": "number"
39
+ },
40
+ {
41
+ "type": "null"
42
+ }
43
+ ],
44
+ "default": null,
45
+ "title": "Held Usd"
46
+ },
35
47
  "vlm_calls": {
36
48
  "title": "Vlm Calls",
37
49
  "type": "integer"
@@ -48,5 +60,5 @@
48
60
  ],
49
61
  "title": "Estimate",
50
62
  "type": "object",
51
- "x-contract-version": "0.4.22"
63
+ "x-contract-version": "0.4.24"
52
64
  }
@@ -91,6 +91,18 @@
91
91
  "default": null,
92
92
  "title": "Default Timing"
93
93
  },
94
+ "held_usd": {
95
+ "anyOf": [
96
+ {
97
+ "type": "number"
98
+ },
99
+ {
100
+ "type": "null"
101
+ }
102
+ ],
103
+ "default": null,
104
+ "title": "Held Usd"
105
+ },
94
106
  "vlm_calls": {
95
107
  "title": "Vlm Calls",
96
108
  "type": "integer"
@@ -228,5 +240,5 @@
228
240
  ],
229
241
  "title": "EvalDryRunResponse",
230
242
  "type": "object",
231
- "x-contract-version": "0.4.22"
243
+ "x-contract-version": "0.4.24"
232
244
  }
@@ -523,5 +523,5 @@
523
523
  ],
524
524
  "title": "EvalReport",
525
525
  "type": "object",
526
- "x-contract-version": "0.4.22"
526
+ "x-contract-version": "0.4.24"
527
527
  }
@@ -281,5 +281,5 @@
281
281
  ],
282
282
  "title": "EvalRequest",
283
283
  "type": "object",
284
- "x-contract-version": "0.4.22"
284
+ "x-contract-version": "0.4.24"
285
285
  }