sequence-base 0.4.11__tar.gz → 0.4.13__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 (110) hide show
  1. {sequence_base-0.4.11 → sequence_base-0.4.13}/PKG-INFO +1 -1
  2. {sequence_base-0.4.11 → sequence_base-0.4.13}/pyproject.toml +1 -1
  3. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/__init__.py +1 -6
  4. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/constants/limits.py +5 -0
  5. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/constants/version.py +3 -1
  6. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/__init__.py +1 -6
  7. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/benchmarks.py +18 -8
  8. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/eval.py +6 -69
  9. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/presets/robot_arm.py +8 -17
  10. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schema_export.py +0 -6
  11. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ActRequest.json +1 -1
  12. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ActResponse.json +1 -1
  13. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ActionChunk.json +1 -1
  14. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ActionContract.json +1 -33
  15. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ActionStep.json +1 -1
  16. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/AddLocal.json +1 -1
  17. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Autoscaler.json +1 -1
  18. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -13
  19. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/BenchmarkRegisterRequest.json +22 -51
  20. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/BenchmarkSpec.json +2 -2
  21. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  22. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/BootstrapResponse.json +1 -1
  23. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Camera.json +1 -1
  24. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ClampInfo.json +1 -1
  25. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/CodeBundle.json +1 -1
  26. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Concurrency.json +1 -1
  27. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Conditions.json +1 -1
  28. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ConnectRequest.json +1 -1
  29. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ConnectResponse.json +1 -33
  30. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  31. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/DeploymentPolicy.json +1 -33
  32. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/DeploymentRequest.json +1 -33
  33. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  34. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Embodiment.json +1 -33
  35. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ErrorBody.json +1 -1
  36. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ErrorCodes.json +1 -1
  37. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Estimate.json +1 -1
  38. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
  39. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/EvalReport.json +30 -131
  40. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/EvalRequest.json +2 -30
  41. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/EvalResponse.json +1 -1
  42. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageFrame.json +1 -1
  43. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageSpec.json +1 -1
  44. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  45. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageStepApt.json +1 -1
  46. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageStepEnv.json +1 -1
  47. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageStepRun.json +1 -1
  48. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
  49. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  50. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/InferParam.json +1 -1
  51. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Lease.json +1 -1
  52. sequence_base-0.4.13/sequence_base/schemas/MetricAgg.json +55 -0
  53. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Observation.json +15 -10
  54. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ObservationContract.json +1 -1
  55. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/PolicyRegistration.json +2 -34
  56. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/PolicySpec.json +1 -33
  57. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Proprioception.json +15 -10
  58. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/RenderSpec.json +1 -1
  59. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/ReplaySpec.json +1 -1
  60. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Resources.json +1 -1
  61. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/RolloutResult.json +1 -1
  62. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  63. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/SecretInfo.json +1 -1
  64. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/SecretRef.json +1 -1
  65. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/SeqFlags.json +1 -1
  66. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Step.json +1 -1
  67. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/TaskAgg.json +1 -1
  68. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/TemplateFiles.json +1 -1
  69. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Timeouts.json +1 -1
  70. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/UploadTarget.json +1 -1
  71. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/Variant.json +1 -1
  72. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/VolumeAttach.json +1 -1
  73. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/VolumeFile.json +1 -1
  74. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/VolumeInfo.json +1 -1
  75. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/VolumeMount.json +1 -1
  76. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/VolumeRef.json +1 -1
  77. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  78. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  79. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/schemas/WarmingError.json +1 -1
  80. sequence_base-0.4.11/sequence_base/schemas/AdapterTransform.json +0 -42
  81. sequence_base-0.4.11/sequence_base/schemas/LossyTransform.json +0 -21
  82. sequence_base-0.4.11/sequence_base/schemas/MetricAgg.json +0 -87
  83. sequence_base-0.4.11/sequence_base/schemas/SuiteAgg.json +0 -26
  84. {sequence_base-0.4.11 → sequence_base-0.4.13}/.gitignore +0 -0
  85. {sequence_base-0.4.11 → sequence_base-0.4.13}/README.md +0 -0
  86. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/auth.py +0 -0
  87. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/codec/__init__.py +0 -0
  88. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/codec/image.py +0 -0
  89. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/constants/__init__.py +0 -0
  90. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/constants/headers.py +0 -0
  91. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/accounts.py +0 -0
  92. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/act.py +0 -0
  93. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/connect.py +0 -0
  94. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/deployments.py +0 -0
  95. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/errors.py +0 -0
  96. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/flags.py +0 -0
  97. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/io.py +0 -0
  98. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/policy.py +0 -0
  99. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/templates.py +0 -0
  100. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/volumes.py +0 -0
  101. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/contract/wire.py +0 -0
  102. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/errors/__init__.py +0 -0
  103. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/errors/transport.py +0 -0
  104. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/obs/__init__.py +0 -0
  105. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/obs/log.py +0 -0
  106. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/obs/rid.py +0 -0
  107. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/presets/__init__.py +0 -0
  108. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/presets/frames.py +0 -0
  109. {sequence_base-0.4.11 → sequence_base-0.4.13}/sequence_base/telemetry/__init__.py +0 -0
  110. {sequence_base-0.4.11 → sequence_base-0.4.13}/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.11
3
+ Version: 0.4.13
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.11"
3
+ version = "0.4.13"
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"]
@@ -37,8 +37,6 @@ from sequence_base.contract import (
37
37
  ActionContract,
38
38
  ActionSpace,
39
39
  ActionStep,
40
- AdapterKind,
41
- AdapterTransform,
42
40
  Autoscaler,
43
41
  BenchmarkConditionSpec,
44
42
  BenchmarkRegisterRequest,
@@ -75,7 +73,6 @@ from sequence_base.contract import (
75
73
  ImageStepRun,
76
74
  ImageStepUvPip,
77
75
  Lease,
78
- LossyTransform,
79
76
  MetricAgg,
80
77
  Observation,
81
78
  PolicyRegistration,
@@ -90,7 +87,6 @@ from sequence_base.contract import (
90
87
  SecretRef,
91
88
  SeqFlags,
92
89
  Step,
93
- SuiteAgg,
94
90
  TaskAgg,
95
91
  Timeouts,
96
92
  Variant,
@@ -146,8 +142,7 @@ __all__ = [
146
142
 
147
143
  "Variant", "Conditions", "RenderSpec", "ReplaySpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
148
144
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
149
- "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
150
- "AdapterKind", "AdapterTransform",
145
+ "EvalStatus", "TaskAgg", "MetricAgg", "EvalReport",
151
146
 
152
147
  "SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse",
153
148
 
@@ -14,3 +14,8 @@ MAX_USD = 100_000
14
14
 
15
15
  TASK_DESCRIPTION_MAX = 300
16
16
 
17
+
18
+
19
+ METRIC_UNITS_MAX = 64
20
+ METRIC_UNIT_MAX = 16
21
+
@@ -4,7 +4,9 @@
4
4
 
5
5
 
6
6
 
7
- CONTRACT_VERSION = "0.5.10"
7
+ CONTRACT_VERSION = "0.5.12"
8
+
9
+
8
10
 
9
11
 
10
12
 
@@ -72,8 +72,6 @@ from sequence_base.contract.benchmarks import (
72
72
  Variant,
73
73
  )
74
74
  from sequence_base.contract.eval import (
75
- AdapterKind,
76
- AdapterTransform,
77
75
  ClampInfo,
78
76
  Estimate,
79
77
  EvalDryRunResponse,
@@ -81,10 +79,8 @@ from sequence_base.contract.eval import (
81
79
  EvalRequest,
82
80
  EvalResponse,
83
81
  EvalStatus,
84
- LossyTransform,
85
82
  MetricAgg,
86
83
  RolloutResult,
87
- SuiteAgg,
88
84
  TaskAgg,
89
85
  )
90
86
 
@@ -134,8 +130,7 @@ __all__ = [
134
130
 
135
131
  "Variant", "Conditions", "RenderSpec", "ReplaySpec", "Step", "BenchmarkSpec", "BenchmarkConditionSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
136
132
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
137
- "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
138
- "AdapterKind", "AdapterTransform",
133
+ "EvalStatus", "TaskAgg", "MetricAgg", "EvalReport",
139
134
 
140
135
  "SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse",
141
136
 
@@ -16,7 +16,7 @@ from typing import Literal
16
16
 
17
17
  from pydantic import BaseModel, ConfigDict, Field, model_validator
18
18
 
19
- from sequence_base.constants.limits import MAX_ENVS, TASK_DESCRIPTION_MAX
19
+ from sequence_base.constants.limits import MAX_ENVS, METRIC_UNIT_MAX, METRIC_UNITS_MAX, TASK_DESCRIPTION_MAX
20
20
  from sequence_base.contract.accounts import SecretRef
21
21
  from sequence_base.contract.deployments import CodeBundle, DeploymentState, InferParam
22
22
  from sequence_base.contract.flags import BENCHMARK_BATCHED, BENCHMARK_BINDABLE, SeqFlags
@@ -167,10 +167,6 @@ class BenchmarkConditionSpec(BaseModel):
167
167
  timeout_s: float | None = Field(default=None, gt=0)
168
168
 
169
169
 
170
-
171
- suite: str | None = None
172
-
173
-
174
170
  class BenchmarkRegisterRequest(BaseModel):
175
171
  """POST /v1/benchmarks — register body, same types as the spec (ImageSpec / Conditions / VolumeRef /
176
172
  RenderSpec). Carries assets / render / cpu / memory_gb / max_steps so the gateway can build the image,
@@ -194,9 +190,6 @@ class BenchmarkRegisterRequest(BaseModel):
194
190
  code: CodeBundle | None = None
195
191
 
196
192
 
197
- suite_of: dict[str, str] = Field(default_factory=dict)
198
-
199
-
200
193
 
201
194
  task_descriptions: dict[str, str] = Field(default_factory=dict)
202
195
 
@@ -206,6 +199,14 @@ class BenchmarkRegisterRequest(BaseModel):
206
199
  seeds_repeat: bool | None = None
207
200
 
208
201
 
202
+
203
+ success_metric: str | None = Field(default=None, min_length=1, max_length=200)
204
+
205
+
206
+
207
+ metric_units: dict[str, str] = Field(default_factory=dict, max_length=METRIC_UNITS_MAX)
208
+
209
+
209
210
  action_contract: ActionContract | None = None
210
211
 
211
212
 
@@ -245,6 +246,15 @@ class BenchmarkRegisterRequest(BaseModel):
245
246
  raise ValueError(f"setup parameter {name!r} is not a public Python identifier")
246
247
  return self
247
248
 
249
+ @model_validator(mode="after")
250
+ def _metric_units(self) -> "BenchmarkRegisterRequest":
251
+ for metric, unit in self.metric_units.items():
252
+ if not metric or len(metric) > 200:
253
+ raise ValueError("metric_units names a metric of 1 to 200 characters")
254
+ if not unit.strip() or len(unit) > METRIC_UNIT_MAX:
255
+ raise ValueError(f"metric_units[{metric!r}] is a unit of 1 to {METRIC_UNIT_MAX} characters")
256
+ return self
257
+
248
258
  @model_validator(mode="after")
249
259
  def _task_descriptions(self) -> "BenchmarkRegisterRequest":
250
260
  """Each description names a task the benchmark declares - in `conditions` or `condition_list` - and is at most
@@ -20,7 +20,6 @@ __all__ = [
20
20
  "EvalRequest",
21
21
  "ClampInfo",
22
22
  "ArmReport",
23
- "PairedDiff",
24
23
  "EvalTiming",
25
24
  "Estimate",
26
25
  "EvalResponse",
@@ -31,13 +30,9 @@ __all__ = [
31
30
  "EvalQueue",
32
31
  "RolloutResult",
33
32
  "EvalStatus",
34
- "SuiteAgg",
35
33
  "TaskAgg",
36
34
  "MetricAgg",
37
- "LossyTransform",
38
35
  "EvalReport",
39
- "AdapterKind",
40
- "AdapterTransform",
41
36
  ]
42
37
 
43
38
 
@@ -51,7 +46,7 @@ class EvalRequest(BaseModel):
51
46
  leave them out and take the earlier eval's. `dry_run` selects the estimate-only response shape below.
52
47
 
53
48
  The one body the platform accepts: the current knobs plus the legacy names an older SDK still sends — `gpus` /
54
- `envs_per_gpu` for the instance counts, `suite`, `region` — each taken and mapped, or refused with the way on,
49
+ `envs_per_gpu` for the instance counts, `region` — each taken and mapped, or refused with the way on,
55
50
  never silently dropped. The gateway inherits this model rather than keeping its own."""
56
51
 
57
52
 
@@ -63,11 +58,6 @@ class EvalRequest(BaseModel):
63
58
  benchmark: str | None = Field(default=None, max_length=200)
64
59
 
65
60
 
66
- suite: str | None = Field(default=None, max_length=200, json_schema_extra={"deprecated": True},
67
- description="Gone: a benchmark is one set of tasks, so there is no suite; a non-null "
68
- "value is refused. Omit it (an older SDK still sends it).")
69
-
70
-
71
61
 
72
62
 
73
63
  trials: _Trials | dict[str, _Trials] | None = None
@@ -108,7 +98,6 @@ class EvalRequest(BaseModel):
108
98
 
109
99
 
110
100
  rerun_unsuccessful_of: str | None = Field(default=None, max_length=64)
111
- metric: str | None = Field(default=None, max_length=64)
112
101
 
113
102
 
114
103
 
@@ -289,18 +278,6 @@ class EvalStatus(str, Enum):
289
278
  CANCELED = "canceled"
290
279
 
291
280
 
292
- class SuiteAgg(BaseModel):
293
- """Per-suite aggregate of ONE user-named metric, as an eval from before contract 0.5.8 reported it: kept so those
294
- reports stay readable. A benchmark is one set of tasks now, and no eval since reports one.
295
- """
296
-
297
- model_config = ConfigDict(extra="forbid")
298
-
299
- suite: str
300
- value: float
301
- n: int
302
-
303
-
304
281
  class TaskAgg(BaseModel):
305
282
  """Per-task aggregate of ONE user-named metric — structured detail, not a bare dict."""
306
283
 
@@ -312,28 +289,17 @@ class TaskAgg(BaseModel):
312
289
 
313
290
 
314
291
  class MetricAgg(BaseModel):
315
- """The aggregate of one user-named metric key across the eval — overall plus per-task breakdowns (and, in a
316
- report from before contract 0.5.8, per-suite ones) and the sample count. The platform aggregates whatever the user returned in `Step.metrics`;
292
+ """The aggregate of one user-named metric key across the eval — overall plus per-task breakdowns and the sample
293
+ count. The platform aggregates whatever the user returned in `Step.metrics`;
317
294
  it neither defines nor injects `success_rate` (success is just one key the user may or may not name)."""
318
295
 
319
296
  model_config = ConfigDict(extra="forbid")
320
297
 
321
298
  overall: float
322
- per_suite: list[SuiteAgg] = Field(default_factory=list)
323
299
  per_task: list[TaskAgg] = Field(default_factory=list)
324
300
  n: int
325
301
 
326
302
 
327
- class LossyTransform(BaseModel):
328
- """A lossy adapter transform recorded in the report. Shape aligns with the lossy element of
329
- AdapterTransform (both {transform, reason})."""
330
-
331
- model_config = ConfigDict(extra="forbid")
332
-
333
- transform: str
334
- reason: str
335
-
336
-
337
303
  class ArmReport(BaseModel):
338
304
  """One arm of an eval (a model x one combination of swept inference parameters): its own metrics and episode
339
305
  counts, so arms are compared side by side and never pooled."""
@@ -346,8 +312,6 @@ class ArmReport(BaseModel):
346
312
 
347
313
  params: dict[str, int | float | bool | str] = Field(default_factory=dict)
348
314
  metrics: dict[str, MetricAgg] = Field(default_factory=dict)
349
-
350
- intervals: dict[str, list[float]] = Field(default_factory=dict)
351
315
  episodes: int = 0
352
316
  failed: int = 0
353
317
  not_run: int = 0
@@ -383,19 +347,6 @@ class ArmParams(BaseModel):
383
347
  steps: int | None = None
384
348
 
385
349
 
386
- class PairedDiff(BaseModel):
387
- """`compare`: one metric's difference between two arms over the seeds both ran (b - a), with its interval."""
388
-
389
- model_config = ConfigDict(extra="forbid")
390
-
391
- metric: str
392
- arm_a: int
393
- arm_b: int
394
- n: int
395
- mean_diff: float
396
- interval: list[float]
397
-
398
-
399
350
  class EvalTiming(BaseModel):
400
351
  """Where an eval's time went: cold starts, and per step the simulation, rendering, the policy's batched forward and
401
352
  the network around it, plus the forward's average batch size."""
@@ -423,15 +374,14 @@ class EvalReport(BaseModel):
423
374
  )
424
375
  cost_usd: float
425
376
  dashboard_url: str
426
- adapter_lossy: list[LossyTransform]
427
377
  videos: list[str] = Field(default_factory=list, description="mp4 pointers from the platform tool")
428
378
  incomplete: bool | None = None
429
379
  errors: list[str] = Field(
430
380
  default_factory=list, description="Why episodes or the run failed, so an incomplete report says why"
431
381
  )
432
382
 
383
+
433
384
  arms: list[ArmReport] | None = None
434
- paired: list[PairedDiff] | None = None
435
385
  timing: EvalTiming | None = None
436
386
 
437
387
 
@@ -445,22 +395,9 @@ class EvalReport(BaseModel):
445
395
  arm_params: list[ArmParams] | None = None
446
396
 
447
397
 
448
- class AdapterKind(str, Enum):
449
- LOSSLESS = "lossless"
450
- LOSSY = "lossy"
451
-
452
-
453
-
454
398
 
399
+ units: dict[str, str] | None = None
455
400
 
456
401
 
457
402
 
458
- class AdapterTransform(BaseModel):
459
- """One adapter transform: its kind (lossless / lossy), the transform's name, and an optional reason. A registered
460
- adapter and an older eval report carry these fields; they are kept for compatibility and are no longer acted on."""
461
-
462
- model_config = ConfigDict(extra="forbid")
463
-
464
- kind: AdapterKind
465
- transform: str
466
- reason: str | None = None
403
+ success_metric: str | None = None
@@ -12,7 +12,6 @@ resolving to these same classes.
12
12
  """
13
13
  from __future__ import annotations
14
14
 
15
- import math
16
15
  from enum import Enum
17
16
  from typing import Any, Literal
18
17
 
@@ -38,12 +37,18 @@ class ImageFrame(BaseModel):
38
37
  default=None, description="rgb (the default) or depth: a 16-bit PNG of millimetres, 0 where there is no reading")
39
38
 
40
39
 
40
+
41
+
42
+
43
+
44
+
41
45
  class Proprioception(BaseModel):
42
- """Proprioceptive state. Only joint_positions is required; the rest is zero-padded per model."""
46
+ """Proprioceptive state. Every field is optional: a policy's observation contract (proprio) says which it reads,
47
+ and its worker requires those, each at its length."""
43
48
 
44
49
  model_config = ConfigDict(extra="forbid")
45
50
 
46
- joint_positions: list[float] = Field(..., description="Joint angles, in radians")
51
+ joint_positions: list[float] | None = Field(default=None, description="Joint angles, in radians")
47
52
  joint_velocities: list[float] | None = None
48
53
 
49
54
  end_effector_pose: list[float] | None = Field(default=None, min_length=7, max_length=7)
@@ -124,22 +129,8 @@ class ActionContract(BaseModel):
124
129
  bounds: list[tuple[float, float]] | None = Field(default=None, max_length=256)
125
130
  max_delta: float | list[float] | None = None
126
131
 
127
-
128
- on_violation: Literal["clip", "refuse"] | None = None
129
-
130
-
131
-
132
-
133
- binarize: dict[int, float] | None = Field(
134
- default=None, description="dimension -> threshold: the client gives the robot 1.0 above it, 0.0 otherwise")
135
-
136
132
  @model_validator(mode="after")
137
133
  def _limits_fit(self) -> "ActionContract":
138
- for d, threshold in (self.binarize or {}).items():
139
- if not 0 <= d < self.action_dim:
140
- raise ValueError(f"binarize names dimension {d}; action_dim is {self.action_dim}")
141
- if not math.isfinite(threshold):
142
- raise ValueError(f"binarize[{d}] is {threshold}, not a finite threshold")
143
134
  if self.bounds is not None:
144
135
  if len(self.bounds) != self.action_dim:
145
136
  raise ValueError(f"bounds has {len(self.bounds)} [low, high] pairs; action_dim is {self.action_dim}")
@@ -67,17 +67,14 @@ from sequence_base.contract.volumes import (
67
67
  VolumeUploadResponse,
68
68
  )
69
69
  from sequence_base.contract.eval import (
70
- AdapterTransform,
71
70
  ClampInfo,
72
71
  Estimate,
73
72
  EvalDryRunResponse,
74
73
  EvalReport,
75
74
  EvalRequest,
76
75
  EvalResponse,
77
- LossyTransform,
78
76
  MetricAgg,
79
77
  RolloutResult,
80
- SuiteAgg,
81
78
  TaskAgg,
82
79
  )
83
80
  from sequence_base.contract.flags import seqflags_json_schema
@@ -167,12 +164,9 @@ WIRE_MODELS: dict[str, type[BaseModel]] = {
167
164
  "EvalResponse": EvalResponse,
168
165
  "EvalDryRunResponse": EvalDryRunResponse,
169
166
  "RolloutResult": RolloutResult,
170
- "SuiteAgg": SuiteAgg,
171
167
  "TaskAgg": TaskAgg,
172
168
  "MetricAgg": MetricAgg,
173
- "LossyTransform": LossyTransform,
174
169
  "EvalReport": EvalReport,
175
- "AdapterTransform": AdapterTransform,
176
170
 
177
171
  "SecretRef": SecretRef,
178
172
  "SecretCreateRequest": SecretCreateRequest,
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "ActRequest",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.10"
82
+ "x-contract-version": "0.5.12"
83
83
  }
@@ -89,5 +89,5 @@
89
89
  ],
90
90
  "title": "ActResponse",
91
91
  "type": "object",
92
- "x-contract-version": "0.5.10"
92
+ "x-contract-version": "0.5.12"
93
93
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "ActionChunk",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.10"
102
+ "x-contract-version": "0.5.12"
103
103
  }
@@ -23,22 +23,6 @@
23
23
  "action_space": {
24
24
  "$ref": "#/$defs/ActionSpace"
25
25
  },
26
- "binarize": {
27
- "anyOf": [
28
- {
29
- "additionalProperties": {
30
- "type": "number"
31
- },
32
- "type": "object"
33
- },
34
- {
35
- "type": "null"
36
- }
37
- ],
38
- "default": null,
39
- "description": "dimension -> threshold: the client gives the robot 1.0 above it, 0.0 otherwise",
40
- "title": "Binarize"
41
- },
42
26
  "bounds": {
43
27
  "anyOf": [
44
28
  {
@@ -87,22 +71,6 @@
87
71
  "default": null,
88
72
  "title": "Max Delta"
89
73
  },
90
- "on_violation": {
91
- "anyOf": [
92
- {
93
- "enum": [
94
- "clip",
95
- "refuse"
96
- ],
97
- "type": "string"
98
- },
99
- {
100
- "type": "null"
101
- }
102
- ],
103
- "default": null,
104
- "title": "On Violation"
105
- },
106
74
  "robot": {
107
75
  "title": "Robot",
108
76
  "type": "string"
@@ -116,5 +84,5 @@
116
84
  ],
117
85
  "title": "ActionContract",
118
86
  "type": "object",
119
- "x-contract-version": "0.5.10"
87
+ "x-contract-version": "0.5.12"
120
88
  }
@@ -19,5 +19,5 @@
19
19
  ],
20
20
  "title": "ActionStep",
21
21
  "type": "object",
22
- "x-contract-version": "0.5.10"
22
+ "x-contract-version": "0.5.12"
23
23
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "AddLocal",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.10"
26
+ "x-contract-version": "0.5.12"
27
27
  }
@@ -69,5 +69,5 @@
69
69
  },
70
70
  "title": "Autoscaler",
71
71
  "type": "object",
72
- "x-contract-version": "0.5.10"
72
+ "x-contract-version": "0.5.12"
73
73
  }
@@ -19,18 +19,6 @@
19
19
  "title": "Seed",
20
20
  "type": "integer"
21
21
  },
22
- "suite": {
23
- "anyOf": [
24
- {
25
- "type": "string"
26
- },
27
- {
28
- "type": "null"
29
- }
30
- ],
31
- "default": null,
32
- "title": "Suite"
33
- },
34
22
  "task": {
35
23
  "title": "Task",
36
24
  "type": "string"
@@ -62,5 +50,5 @@
62
50
  ],
63
51
  "title": "BenchmarkConditionSpec",
64
52
  "type": "object",
65
- "x-contract-version": "0.5.10"
53
+ "x-contract-version": "0.5.12"
66
54
  }
@@ -11,22 +11,6 @@
11
11
  "action_space": {
12
12
  "$ref": "#/$defs/ActionSpace"
13
13
  },
14
- "binarize": {
15
- "anyOf": [
16
- {
17
- "additionalProperties": {
18
- "type": "number"
19
- },
20
- "type": "object"
21
- },
22
- {
23
- "type": "null"
24
- }
25
- ],
26
- "default": null,
27
- "description": "dimension -> threshold: the client gives the robot 1.0 above it, 0.0 otherwise",
28
- "title": "Binarize"
29
- },
30
14
  "bounds": {
31
15
  "anyOf": [
32
16
  {
@@ -75,22 +59,6 @@
75
59
  "default": null,
76
60
  "title": "Max Delta"
77
61
  },
78
- "on_violation": {
79
- "anyOf": [
80
- {
81
- "enum": [
82
- "clip",
83
- "refuse"
84
- ],
85
- "type": "string"
86
- },
87
- {
88
- "type": "null"
89
- }
90
- ],
91
- "default": null,
92
- "title": "On Violation"
93
- },
94
62
  "robot": {
95
63
  "title": "Robot",
96
64
  "type": "string"
@@ -164,18 +132,6 @@
164
132
  "title": "Seed",
165
133
  "type": "integer"
166
134
  },
167
- "suite": {
168
- "anyOf": [
169
- {
170
- "type": "string"
171
- },
172
- {
173
- "type": "null"
174
- }
175
- ],
176
- "default": null,
177
- "title": "Suite"
178
- },
179
135
  "task": {
180
136
  "title": "Task",
181
137
  "type": "string"
@@ -888,6 +844,14 @@
888
844
  "default": null,
889
845
  "title": "Memory Gb"
890
846
  },
847
+ "metric_units": {
848
+ "additionalProperties": {
849
+ "type": "string"
850
+ },
851
+ "maxProperties": 64,
852
+ "title": "Metric Units",
853
+ "type": "object"
854
+ },
891
855
  "name": {
892
856
  "title": "Name",
893
857
  "type": "string"
@@ -954,12 +918,19 @@
954
918
  "default": null,
955
919
  "title": "Seeds Repeat"
956
920
  },
957
- "suite_of": {
958
- "additionalProperties": {
959
- "type": "string"
960
- },
961
- "title": "Suite Of",
962
- "type": "object"
921
+ "success_metric": {
922
+ "anyOf": [
923
+ {
924
+ "maxLength": 200,
925
+ "minLength": 1,
926
+ "type": "string"
927
+ },
928
+ {
929
+ "type": "null"
930
+ }
931
+ ],
932
+ "default": null,
933
+ "title": "Success Metric"
963
934
  },
964
935
  "task_descriptions": {
965
936
  "additionalProperties": {
@@ -991,5 +962,5 @@
991
962
  ],
992
963
  "title": "BenchmarkRegisterRequest",
993
964
  "type": "object",
994
- "x-contract-version": "0.5.10"
965
+ "x-contract-version": "0.5.12"
995
966
  }
@@ -368,7 +368,7 @@
368
368
  ],
369
369
  "title": "SeqFlags",
370
370
  "type": "integer",
371
- "x-contract-version": "0.5.10",
371
+ "x-contract-version": "0.5.12",
372
372
  "x-flag-names": {
373
373
  "CHECK": 65536,
374
374
  "INFER": 16,
@@ -625,5 +625,5 @@
625
625
  ],
626
626
  "title": "BenchmarkSpec",
627
627
  "type": "object",
628
- "x-contract-version": "0.5.10"
628
+ "x-contract-version": "0.5.12"
629
629
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "BenchmarkStatusResponse",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.10"
43
+ "x-contract-version": "0.5.12"
44
44
  }