sequence-base 0.4.4__tar.gz → 0.4.6__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 (107) hide show
  1. {sequence_base-0.4.4 → sequence_base-0.4.6}/PKG-INFO +1 -1
  2. {sequence_base-0.4.4 → sequence_base-0.4.6}/pyproject.toml +1 -1
  3. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/__init__.py +2 -1
  4. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/constants/version.py +4 -1
  5. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/__init__.py +2 -1
  6. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/benchmarks.py +25 -0
  7. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/eval.py +3 -0
  8. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/policy.py +23 -2
  9. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/wire.py +7 -0
  10. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schema_export.py +2 -0
  11. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ActRequest.json +15 -1
  12. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ActResponse.json +15 -1
  13. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ActionChunk.json +1 -1
  14. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ActionContract.json +1 -1
  15. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ActionStep.json +1 -1
  16. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/AdapterTransform.json +1 -1
  17. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/AddLocal.json +1 -1
  18. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Autoscaler.json +1 -1
  19. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
  20. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/BenchmarkRegisterRequest.json +67 -1
  21. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/BenchmarkSpec.json +68 -2
  22. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  23. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/BootstrapResponse.json +1 -1
  24. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Camera.json +1 -1
  25. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ClampInfo.json +1 -1
  26. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/CodeBundle.json +1 -1
  27. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Concurrency.json +21 -2
  28. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Conditions.json +1 -1
  29. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ConnectRequest.json +1 -1
  30. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ConnectResponse.json +1 -1
  31. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  32. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/DeploymentPolicy.json +1 -1
  33. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/DeploymentRequest.json +21 -2
  34. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  35. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Embodiment.json +1 -1
  36. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ErrorBody.json +1 -1
  37. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ErrorCodes.json +1 -1
  38. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Estimate.json +1 -1
  39. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
  40. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/EvalReport.json +1 -1
  41. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/EvalRequest.json +17 -1
  42. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/EvalResponse.json +1 -1
  43. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageFrame.json +1 -1
  44. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageSpec.json +1 -1
  45. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  46. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageStepApt.json +1 -1
  47. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageStepEnv.json +1 -1
  48. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageStepRun.json +1 -1
  49. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
  50. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  51. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/InferParam.json +1 -1
  52. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Lease.json +1 -1
  53. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/LossyTransform.json +1 -1
  54. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/MetricAgg.json +1 -1
  55. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Observation.json +1 -1
  56. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/ObservationContract.json +1 -1
  57. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/PolicyRegistration.json +22 -3
  58. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/PolicySpec.json +21 -2
  59. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Proprioception.json +1 -1
  60. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/RenderSpec.json +1 -1
  61. sequence_base-0.4.6/sequence_base/schemas/ReplaySpec.json +56 -0
  62. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Resources.json +1 -1
  63. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/RolloutResult.json +1 -1
  64. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  65. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/SecretInfo.json +1 -1
  66. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/SecretRef.json +1 -1
  67. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/SeqFlags.json +1 -1
  68. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Step.json +1 -1
  69. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/SuiteAgg.json +1 -1
  70. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/TaskAgg.json +1 -1
  71. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/TemplateFiles.json +1 -1
  72. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Timeouts.json +1 -1
  73. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/UploadTarget.json +1 -1
  74. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/Variant.json +1 -1
  75. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/VolumeAttach.json +1 -1
  76. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/VolumeFile.json +1 -1
  77. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/VolumeInfo.json +1 -1
  78. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/VolumeMount.json +1 -1
  79. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/VolumeRef.json +1 -1
  80. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  81. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  82. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/schemas/WarmingError.json +1 -1
  83. {sequence_base-0.4.4 → sequence_base-0.4.6}/.gitignore +0 -0
  84. {sequence_base-0.4.4 → sequence_base-0.4.6}/README.md +0 -0
  85. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/auth.py +0 -0
  86. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/codec/__init__.py +0 -0
  87. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/codec/image.py +0 -0
  88. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/constants/__init__.py +0 -0
  89. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/constants/headers.py +0 -0
  90. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/accounts.py +0 -0
  91. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/act.py +0 -0
  92. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/connect.py +0 -0
  93. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/deployments.py +0 -0
  94. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/errors.py +0 -0
  95. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/flags.py +0 -0
  96. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/io.py +0 -0
  97. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/templates.py +0 -0
  98. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/contract/volumes.py +0 -0
  99. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/errors/__init__.py +0 -0
  100. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/errors/transport.py +0 -0
  101. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/obs/__init__.py +0 -0
  102. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/obs/log.py +0 -0
  103. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/obs/rid.py +0 -0
  104. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/presets/__init__.py +0 -0
  105. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/presets/robot_arm.py +0 -0
  106. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/telemetry/__init__.py +0 -0
  107. {sequence_base-0.4.4 → sequence_base-0.4.6}/sequence_base/telemetry/events.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sequence-base
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Summary: Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness.
5
5
  Project-URL: Changelog, https://generalsequences.com/docs/changelog/
6
6
  Requires-Python: >=3.10
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sequence-base"
3
- version = "0.4.4"
3
+ version = "0.4.6"
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"]
@@ -82,6 +82,7 @@ from sequence_base.contract import (
82
82
  PolicySpec,
83
83
  Proprioception,
84
84
  RenderSpec,
85
+ ReplaySpec,
85
86
  Resources,
86
87
  RolloutResult,
87
88
  SecretCreateRequest,
@@ -139,7 +140,7 @@ __all__ = [
139
140
 
140
141
  "Lease", "ConnectRequest", "ConnectResponse",
141
142
 
142
- "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
143
+ "Variant", "Conditions", "RenderSpec", "ReplaySpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
143
144
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
144
145
  "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
145
146
  "AdapterKind", "AdapterTransform",
@@ -4,7 +4,10 @@
4
4
 
5
5
 
6
6
 
7
- CONTRACT_VERSION = "0.5.3"
7
+ CONTRACT_VERSION = "0.5.6"
8
+
9
+
10
+
8
11
 
9
12
 
10
13
 
@@ -67,6 +67,7 @@ from sequence_base.contract.benchmarks import (
67
67
  BenchmarkSpec,
68
68
  Conditions,
69
69
  RenderSpec,
70
+ ReplaySpec,
70
71
  Step,
71
72
  Variant,
72
73
  )
@@ -131,7 +132,7 @@ __all__ = [
131
132
 
132
133
  "Lease", "ConnectRequest", "ConnectResponse",
133
134
 
134
- "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
135
+ "Variant", "Conditions", "RenderSpec", "ReplaySpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
135
136
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
136
137
  "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
137
138
  "AdapterKind", "AdapterTransform",
@@ -25,6 +25,7 @@ __all__ = [
25
25
  "Variant",
26
26
  "Conditions",
27
27
  "RenderSpec",
28
+ "ReplaySpec",
28
29
  "Step",
29
30
  "BenchmarkSpec",
30
31
  "BenchmarkRegisterRequest",
@@ -69,6 +70,26 @@ class RenderSpec(BaseModel):
69
70
  "None: as drawn")
70
71
 
71
72
 
73
+ class ReplaySpec(BaseModel):
74
+ """a.k.a. `seq.Replay` — declares that the platform records the eval's 3D replay: each step every node's world
75
+ transform, drawn in the owner's browser after the eval. `engine` picks the platform's
76
+ adapter that reads the simulation's state ("mujoco", "sapien", "isaac"); "own" means the benchmark hands the frames itself
77
+ (`seq.replay.scene` / `seq.replay.frame`); None takes the benchmark's own `engine`. `state` names the benchmark
78
+ method an adapter calls for the engine's state of an env (or of a batched benchmark's slots), `looks` the one that
79
+ says what the adapter cannot read - a colour or a visibility each episode sets. Whether an eval records it is the
80
+ eval's `replay` ("3d" by default, "none")."""
81
+
82
+ model_config = ConfigDict(extra="forbid")
83
+
84
+ engine: Literal["mujoco", "sapien", "isaac", "own"] | None = Field(
85
+ None, description="The adapter that reads the simulation: 'mujoco' (incl. MuJoCo Warp), 'sapien', 'isaac', or "
86
+ "'own' (the benchmark hands frames itself); None: the benchmark's engine")
87
+ state: str | None = Field(None, pattern=r"^[A-Za-z_][A-Za-z0-9_]*$",
88
+ description="The benchmark method an adapter calls for an env's (or slots') engine state")
89
+ looks: str | None = Field(None, pattern=r"^[A-Za-z_][A-Za-z0-9_]*$",
90
+ description="The benchmark method that says each episode's colours or visibility")
91
+
92
+
72
93
  class Step(BaseModel):
73
94
  """What `@seq.check` returns each step. The platform settles each env per-step from this and NEVER
74
95
  invents a success metric — `done` is the user's call, and `metrics` keys are user-named (the platform
@@ -107,6 +128,8 @@ class BenchmarkSpec(BaseModel):
107
128
  envs: int | None = Field(default=None, ge=1, le=65536)
108
129
  assets: list[VolumeRef] = Field(default_factory=list)
109
130
  render: RenderSpec | None = None
131
+
132
+ replay: ReplaySpec | None = None
110
133
  cpu: int | None = None
111
134
  memory_gb: int | None = None
112
135
  secrets: list[SecretRef] = Field(default_factory=list)
@@ -158,6 +181,8 @@ class BenchmarkRegisterRequest(BaseModel):
158
181
  handler_ref: str
159
182
  assets: list[VolumeRef] = Field(default_factory=list)
160
183
  render: RenderSpec | None = None
184
+
185
+ replay: ReplaySpec | None = None
161
186
  cpu: int | None = None
162
187
  memory_gb: int | None = None
163
188
 
@@ -82,6 +82,9 @@ class EvalRequest(BaseModel):
82
82
  record: Literal["per-task", "all", "none"] | None = None
83
83
 
84
84
 
85
+ replay: Literal["3d", "none"] | None = None
86
+
87
+
85
88
  class ClampInfo(BaseModel):
86
89
  """Why the granted GPU count was clamped below the request — structured, not a bare value."""
87
90
 
@@ -10,7 +10,7 @@ from __future__ import annotations
10
10
 
11
11
  import re
12
12
 
13
- from typing import Any, Literal
13
+ from typing import Literal
14
14
 
15
15
  from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
16
16
 
@@ -185,10 +185,27 @@ class Concurrency(BaseModel):
185
185
  its own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the
186
186
  worker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions
187
187
  a worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the
188
- slots."""
188
+ slots.
189
+
190
+ `max_concurrent` (contract 0.5.5) - from `@seq.concurrent(max_concurrent=N)` on the policy's infer method - is the
191
+ most acts one forward pass takes, the largest batch the policy is built for (None: one robot a copy, each act
192
+ alone). With it, `dynamic` True has each worker measure its forwards and seat as many robots as it can serve on time,
193
+ planning when each sends - apart while each can be served alone, together only when they cannot; False seats
194
+ max_concurrent robots a worker and runs their acts together, so it needs max_concurrent. `dynamic` means something
195
+ only beside max_concurrent: an undeclared Concurrency() still carries its default (True) on the wire, and a reader
196
+ takes it for one robot a copy. The SDK takes `gpus_per_replica` and
197
+ `replica_start` in `@seq.policy(...)` from then on.
198
+
199
+
200
+ `max_inputs`, `target_inputs` and `replicas_per_gpu` are the old way's: kept so a stored spec and an older SDK's
201
+ request still read, and refused on a new deploy by the platform; the SDK from contract 0.5.5 never sends them.
202
+
203
+ """
189
204
 
190
205
  model_config = ConfigDict(extra="forbid")
191
206
 
207
+ max_concurrent: int | None = Field(default=None, ge=2, le=256)
208
+ dynamic: bool = True
192
209
  max_inputs: int | None = Field(default=None, ge=1, le=1024)
193
210
  target_inputs: int | None = Field(default=None, ge=1, le=1024)
194
211
  replicas_per_gpu: int | None = Field(default=None, ge=1, le=64)
@@ -201,6 +218,10 @@ class Concurrency(BaseModel):
201
218
 
202
219
  @model_validator(mode="after")
203
220
  def _consistent(self) -> "Concurrency":
221
+
222
+
223
+ if self.dynamic is False and self.max_concurrent is None:
224
+ raise ValueError("dynamic=False seats max_concurrent robots a worker: it needs max_concurrent")
204
225
  if self.max_inputs is not None and self.target_inputs is not None and self.max_inputs < self.target_inputs:
205
226
  raise ValueError("max_inputs must be at least target_inputs")
206
227
  if (self.gpus_per_replica or 1) > 1 and (self.replicas_per_gpu or 1) > 1:
@@ -37,6 +37,10 @@ class ActRequest(BaseModel):
37
37
  description="Robot-arm preset only: which declared embodiment this session drives")
38
38
 
39
39
 
40
+ plan: dict[str, Any] | None = Field(default=None,
41
+ description="The robot's session, the steps it holds, its rate and network p95")
42
+
43
+
40
44
  class ActResponse(BaseModel):
41
45
  """200 from /act, version 2. `outputs` is infer()'s return value, unchanged; the rest is platform metadata."""
42
46
 
@@ -51,3 +55,6 @@ class ActResponse(BaseModel):
51
55
 
52
56
  action_chunk: dict[str, Any] | None = Field(default=None,
53
57
  description="Version-1 key for a robot-arm preset chunk (= outputs)")
58
+
59
+
60
+ plan: dict[str, Any] | None = Field(default=None, description="When to send the next act, and how this chunk plays")
@@ -40,6 +40,7 @@ from sequence_base.contract.benchmarks import (
40
40
  BenchmarkSpec,
41
41
  Conditions,
42
42
  RenderSpec,
43
+ ReplaySpec,
43
44
  Step,
44
45
  Variant,
45
46
  )
@@ -153,6 +154,7 @@ WIRE_MODELS: dict[str, type[BaseModel]] = {
153
154
  "Variant": Variant,
154
155
  "Conditions": Conditions,
155
156
  "RenderSpec": RenderSpec,
157
+ "ReplaySpec": ReplaySpec,
156
158
  "Step": Step,
157
159
  "BenchmarkSpec": BenchmarkSpec,
158
160
  "BenchmarkConditionSpec": BenchmarkConditionSpec,
@@ -46,6 +46,20 @@
46
46
  "description": "Values for the inference parameters the policy declares",
47
47
  "title": "Params"
48
48
  },
49
+ "plan": {
50
+ "anyOf": [
51
+ {
52
+ "additionalProperties": true,
53
+ "type": "object"
54
+ },
55
+ {
56
+ "type": "null"
57
+ }
58
+ ],
59
+ "default": null,
60
+ "description": "The robot's session, the steps it holds, its rate and network p95",
61
+ "title": "Plan"
62
+ },
49
63
  "seed": {
50
64
  "anyOf": [
51
65
  {
@@ -65,5 +79,5 @@
65
79
  ],
66
80
  "title": "ActRequest",
67
81
  "type": "object",
68
- "x-contract-version": "0.5.3"
82
+ "x-contract-version": "0.5.6"
69
83
  }
@@ -34,6 +34,20 @@
34
34
  "description": "Per-phase timings of this call",
35
35
  "title": "Perf"
36
36
  },
37
+ "plan": {
38
+ "anyOf": [
39
+ {
40
+ "additionalProperties": true,
41
+ "type": "object"
42
+ },
43
+ {
44
+ "type": "null"
45
+ }
46
+ ],
47
+ "default": null,
48
+ "description": "When to send the next act, and how this chunk plays",
49
+ "title": "Plan"
50
+ },
37
51
  "request_id": {
38
52
  "anyOf": [
39
53
  {
@@ -75,5 +89,5 @@
75
89
  ],
76
90
  "title": "ActResponse",
77
91
  "type": "object",
78
- "x-contract-version": "0.5.3"
92
+ "x-contract-version": "0.5.6"
79
93
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "ActionChunk",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.3"
102
+ "x-contract-version": "0.5.6"
103
103
  }
@@ -116,5 +116,5 @@
116
116
  ],
117
117
  "title": "ActionContract",
118
118
  "type": "object",
119
- "x-contract-version": "0.5.3"
119
+ "x-contract-version": "0.5.6"
120
120
  }
@@ -19,5 +19,5 @@
19
19
  ],
20
20
  "title": "ActionStep",
21
21
  "type": "object",
22
- "x-contract-version": "0.5.3"
22
+ "x-contract-version": "0.5.6"
23
23
  }
@@ -38,5 +38,5 @@
38
38
  ],
39
39
  "title": "AdapterTransform",
40
40
  "type": "object",
41
- "x-contract-version": "0.5.3"
41
+ "x-contract-version": "0.5.6"
42
42
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "AddLocal",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.3"
26
+ "x-contract-version": "0.5.6"
27
27
  }
@@ -69,5 +69,5 @@
69
69
  },
70
70
  "title": "Autoscaler",
71
71
  "type": "object",
72
- "x-contract-version": "0.5.3"
72
+ "x-contract-version": "0.5.6"
73
73
  }
@@ -62,5 +62,5 @@
62
62
  ],
63
63
  "title": "BenchmarkConditionSpec",
64
64
  "type": "object",
65
- "x-contract-version": "0.5.3"
65
+ "x-contract-version": "0.5.6"
66
66
  }
@@ -588,6 +588,61 @@
588
588
  "title": "RenderSpec",
589
589
  "type": "object"
590
590
  },
591
+ "ReplaySpec": {
592
+ "additionalProperties": false,
593
+ "description": "a.k.a. `seq.Replay` — declares that the platform records the eval's 3D replay: each step every node's world\ntransform, drawn in the owner's browser after the eval. `engine` picks the platform's\nadapter that reads the simulation's state (\"mujoco\", \"sapien\", \"isaac\"); \"own\" means the benchmark hands the frames itself\n(`seq.replay.scene` / `seq.replay.frame`); None takes the benchmark's own `engine`. `state` names the benchmark\nmethod an adapter calls for the engine's state of an env (or of a batched benchmark's slots), `looks` the one that\nsays what the adapter cannot read - a colour or a visibility each episode sets. Whether an eval records it is the\neval's `replay` (\"3d\" by default, \"none\").",
594
+ "properties": {
595
+ "engine": {
596
+ "anyOf": [
597
+ {
598
+ "enum": [
599
+ "mujoco",
600
+ "sapien",
601
+ "isaac",
602
+ "own"
603
+ ],
604
+ "type": "string"
605
+ },
606
+ {
607
+ "type": "null"
608
+ }
609
+ ],
610
+ "default": null,
611
+ "description": "The adapter that reads the simulation: 'mujoco' (incl. MuJoCo Warp), 'sapien', 'isaac', or 'own' (the benchmark hands frames itself); None: the benchmark's engine",
612
+ "title": "Engine"
613
+ },
614
+ "looks": {
615
+ "anyOf": [
616
+ {
617
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
618
+ "type": "string"
619
+ },
620
+ {
621
+ "type": "null"
622
+ }
623
+ ],
624
+ "default": null,
625
+ "description": "The benchmark method that says each episode's colours or visibility",
626
+ "title": "Looks"
627
+ },
628
+ "state": {
629
+ "anyOf": [
630
+ {
631
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
632
+ "type": "string"
633
+ },
634
+ {
635
+ "type": "null"
636
+ }
637
+ ],
638
+ "default": null,
639
+ "description": "The benchmark method an adapter calls for an env's (or slots') engine state",
640
+ "title": "State"
641
+ }
642
+ },
643
+ "title": "ReplaySpec",
644
+ "type": "object"
645
+ },
591
646
  "SecretRef": {
592
647
  "additionalProperties": false,
593
648
  "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.",
@@ -864,6 +919,17 @@
864
919
  ],
865
920
  "default": null
866
921
  },
922
+ "replay": {
923
+ "anyOf": [
924
+ {
925
+ "$ref": "#/$defs/ReplaySpec"
926
+ },
927
+ {
928
+ "type": "null"
929
+ }
930
+ ],
931
+ "default": null
932
+ },
867
933
  "score": {
868
934
  "default": false,
869
935
  "title": "Score",
@@ -906,5 +972,5 @@
906
972
  ],
907
973
  "title": "BenchmarkRegisterRequest",
908
974
  "type": "object",
909
- "x-contract-version": "0.5.3"
975
+ "x-contract-version": "0.5.6"
910
976
  }
@@ -278,6 +278,61 @@
278
278
  "title": "RenderSpec",
279
279
  "type": "object"
280
280
  },
281
+ "ReplaySpec": {
282
+ "additionalProperties": false,
283
+ "description": "a.k.a. `seq.Replay` — declares that the platform records the eval's 3D replay: each step every node's world\ntransform, drawn in the owner's browser after the eval. `engine` picks the platform's\nadapter that reads the simulation's state (\"mujoco\", \"sapien\", \"isaac\"); \"own\" means the benchmark hands the frames itself\n(`seq.replay.scene` / `seq.replay.frame`); None takes the benchmark's own `engine`. `state` names the benchmark\nmethod an adapter calls for the engine's state of an env (or of a batched benchmark's slots), `looks` the one that\nsays what the adapter cannot read - a colour or a visibility each episode sets. Whether an eval records it is the\neval's `replay` (\"3d\" by default, \"none\").",
284
+ "properties": {
285
+ "engine": {
286
+ "anyOf": [
287
+ {
288
+ "enum": [
289
+ "mujoco",
290
+ "sapien",
291
+ "isaac",
292
+ "own"
293
+ ],
294
+ "type": "string"
295
+ },
296
+ {
297
+ "type": "null"
298
+ }
299
+ ],
300
+ "default": null,
301
+ "description": "The adapter that reads the simulation: 'mujoco' (incl. MuJoCo Warp), 'sapien', 'isaac', or 'own' (the benchmark hands frames itself); None: the benchmark's engine",
302
+ "title": "Engine"
303
+ },
304
+ "looks": {
305
+ "anyOf": [
306
+ {
307
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
308
+ "type": "string"
309
+ },
310
+ {
311
+ "type": "null"
312
+ }
313
+ ],
314
+ "default": null,
315
+ "description": "The benchmark method that says each episode's colours or visibility",
316
+ "title": "Looks"
317
+ },
318
+ "state": {
319
+ "anyOf": [
320
+ {
321
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
322
+ "type": "string"
323
+ },
324
+ {
325
+ "type": "null"
326
+ }
327
+ ],
328
+ "default": null,
329
+ "description": "The benchmark method an adapter calls for an env's (or slots') engine state",
330
+ "title": "State"
331
+ }
332
+ },
333
+ "title": "ReplaySpec",
334
+ "type": "object"
335
+ },
281
336
  "SecretRef": {
282
337
  "additionalProperties": false,
283
338
  "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.",
@@ -313,7 +368,7 @@
313
368
  ],
314
369
  "title": "SeqFlags",
315
370
  "type": "integer",
316
- "x-contract-version": "0.5.3",
371
+ "x-contract-version": "0.5.6",
317
372
  "x-flag-names": {
318
373
  "CHECK": 65536,
319
374
  "INFER": 16,
@@ -541,6 +596,17 @@
541
596
  ],
542
597
  "default": null
543
598
  },
599
+ "replay": {
600
+ "anyOf": [
601
+ {
602
+ "$ref": "#/$defs/ReplaySpec"
603
+ },
604
+ {
605
+ "type": "null"
606
+ }
607
+ ],
608
+ "default": null
609
+ },
544
610
  "secrets": {
545
611
  "items": {
546
612
  "$ref": "#/$defs/SecretRef"
@@ -559,5 +625,5 @@
559
625
  ],
560
626
  "title": "BenchmarkSpec",
561
627
  "type": "object",
562
- "x-contract-version": "0.5.3"
628
+ "x-contract-version": "0.5.6"
563
629
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "BenchmarkStatusResponse",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.3"
43
+ "x-contract-version": "0.5.6"
44
44
  }
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "BootstrapResponse",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.3"
82
+ "x-contract-version": "0.5.6"
83
83
  }
@@ -72,5 +72,5 @@
72
72
  ],
73
73
  "title": "Camera",
74
74
  "type": "object",
75
- "x-contract-version": "0.5.3"
75
+ "x-contract-version": "0.5.6"
76
76
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "ClampInfo",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.3"
26
+ "x-contract-version": "0.5.6"
27
27
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "CodeBundle",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.3"
26
+ "x-contract-version": "0.5.6"
27
27
  }
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "additionalProperties": false,
3
- "description": "How one worker serves robots, every field optional. `replicas_per_gpu` model copies share each card (each copy is\nits own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the\nworker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions\na worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the\nslots.",
3
+ "description": "How one worker serves robots, every field optional. `replicas_per_gpu` model copies share each card (each copy is\nits own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the\nworker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions\na worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the\nslots.\n\n`max_concurrent` (contract 0.5.5) - from `@seq.concurrent(max_concurrent=N)` on the policy's infer method - is the\nmost acts one forward pass takes, the largest batch the policy is built for (None: one robot a copy, each act\nalone). With it, `dynamic` True has each worker measure its forwards and seat as many robots as it can serve on time,\nplanning when each sends - apart while each can be served alone, together only when they cannot; False seats\nmax_concurrent robots a worker and runs their acts together, so it needs max_concurrent. `dynamic` means something\nonly beside max_concurrent: an undeclared Concurrency() still carries its default (True) on the wire, and a reader\ntakes it for one robot a copy. The SDK takes `gpus_per_replica` and\n`replica_start` in `@seq.policy(...)` from then on.\n\n\n`max_inputs`, `target_inputs` and `replicas_per_gpu` are the old way's: kept so a stored spec and an older SDK's\nrequest still read, and refused on a new deploy by the platform; the SDK from contract 0.5.5 never sends them.",
4
4
  "properties": {
5
+ "dynamic": {
6
+ "default": true,
7
+ "title": "Dynamic",
8
+ "type": "boolean"
9
+ },
5
10
  "gpus_per_replica": {
6
11
  "anyOf": [
7
12
  {
@@ -16,6 +21,20 @@
16
21
  "default": null,
17
22
  "title": "Gpus Per Replica"
18
23
  },
24
+ "max_concurrent": {
25
+ "anyOf": [
26
+ {
27
+ "maximum": 256,
28
+ "minimum": 2,
29
+ "type": "integer"
30
+ },
31
+ {
32
+ "type": "null"
33
+ }
34
+ ],
35
+ "default": null,
36
+ "title": "Max Concurrent"
37
+ },
19
38
  "max_inputs": {
20
39
  "anyOf": [
21
40
  {
@@ -77,5 +96,5 @@
77
96
  },
78
97
  "title": "Concurrency",
79
98
  "type": "object",
80
- "x-contract-version": "0.5.3"
99
+ "x-contract-version": "0.5.6"
81
100
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "Conditions",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.3"
58
+ "x-contract-version": "0.5.6"
59
59
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "ConnectRequest",
27
27
  "type": "object",
28
- "x-contract-version": "0.5.3"
28
+ "x-contract-version": "0.5.6"
29
29
  }
@@ -342,5 +342,5 @@
342
342
  ],
343
343
  "title": "ConnectResponse",
344
344
  "type": "object",
345
- "x-contract-version": "0.5.3"
345
+ "x-contract-version": "0.5.6"
346
346
  }
@@ -18,5 +18,5 @@
18
18
  ],
19
19
  "title": "DeploymentAccepted",
20
20
  "type": "object",
21
- "x-contract-version": "0.5.3"
21
+ "x-contract-version": "0.5.6"
22
22
  }
@@ -530,5 +530,5 @@
530
530
  ],
531
531
  "title": "DeploymentPolicy",
532
532
  "type": "object",
533
- "x-contract-version": "0.5.3"
533
+ "x-contract-version": "0.5.6"
534
534
  }