sequence-base 0.4.8__tar.gz → 0.4.10__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 (109) hide show
  1. {sequence_base-0.4.8 → sequence_base-0.4.10}/PKG-INFO +1 -1
  2. {sequence_base-0.4.8 → sequence_base-0.4.10}/pyproject.toml +1 -1
  3. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/__init__.py +5 -0
  4. sequence_base-0.4.10/sequence_base/constants/limits.py +16 -0
  5. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/constants/version.py +2 -1
  6. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/benchmarks.py +6 -4
  7. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/deployments.py +2 -0
  8. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/eval.py +71 -24
  9. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/policy.py +2 -0
  10. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ActRequest.json +1 -1
  11. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ActResponse.json +1 -1
  12. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ActionChunk.json +1 -1
  13. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ActionContract.json +1 -1
  14. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ActionStep.json +1 -1
  15. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/AdapterTransform.json +2 -2
  16. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/AddLocal.json +1 -1
  17. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Autoscaler.json +1 -1
  18. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
  19. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
  20. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/BenchmarkSpec.json +2 -2
  21. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  22. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/BootstrapResponse.json +1 -1
  23. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Camera.json +1 -1
  24. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ClampInfo.json +1 -1
  25. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/CodeBundle.json +1 -1
  26. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Concurrency.json +1 -1
  27. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Conditions.json +1 -1
  28. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ConnectRequest.json +1 -1
  29. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ConnectResponse.json +1 -1
  30. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  31. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/DeploymentPolicy.json +1 -1
  32. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/DeploymentRequest.json +1 -1
  33. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  34. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Embodiment.json +1 -1
  35. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ErrorBody.json +1 -1
  36. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ErrorCodes.json +1 -1
  37. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Estimate.json +1 -1
  38. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
  39. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/EvalReport.json +11 -1
  40. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/EvalRequest.json +136 -33
  41. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/EvalResponse.json +1 -1
  42. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageFrame.json +1 -1
  43. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageSpec.json +1 -1
  44. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  45. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageStepApt.json +1 -1
  46. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageStepEnv.json +1 -1
  47. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageStepRun.json +1 -1
  48. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
  49. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  50. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/InferParam.json +1 -1
  51. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Lease.json +1 -1
  52. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/LossyTransform.json +1 -1
  53. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/MetricAgg.json +1 -1
  54. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Observation.json +1 -1
  55. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ObservationContract.json +1 -1
  56. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/PolicyRegistration.json +2 -2
  57. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/PolicySpec.json +1 -1
  58. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Proprioception.json +1 -1
  59. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/RenderSpec.json +1 -1
  60. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/ReplaySpec.json +1 -1
  61. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Resources.json +1 -1
  62. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/RolloutResult.json +1 -1
  63. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  64. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/SecretInfo.json +1 -1
  65. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/SecretRef.json +1 -1
  66. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/SeqFlags.json +1 -1
  67. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Step.json +1 -1
  68. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/SuiteAgg.json +1 -1
  69. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/TaskAgg.json +1 -1
  70. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/TemplateFiles.json +1 -1
  71. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Timeouts.json +1 -1
  72. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/UploadTarget.json +1 -1
  73. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/Variant.json +1 -1
  74. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/VolumeAttach.json +1 -1
  75. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/VolumeFile.json +1 -1
  76. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/VolumeInfo.json +1 -1
  77. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/VolumeMount.json +1 -1
  78. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/VolumeRef.json +1 -1
  79. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  80. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  81. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schemas/WarmingError.json +1 -1
  82. {sequence_base-0.4.8 → sequence_base-0.4.10}/.gitignore +0 -0
  83. {sequence_base-0.4.8 → sequence_base-0.4.10}/README.md +0 -0
  84. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/auth.py +0 -0
  85. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/codec/__init__.py +0 -0
  86. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/codec/image.py +0 -0
  87. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/constants/__init__.py +0 -0
  88. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/constants/headers.py +0 -0
  89. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/__init__.py +0 -0
  90. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/accounts.py +0 -0
  91. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/act.py +0 -0
  92. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/connect.py +0 -0
  93. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/errors.py +0 -0
  94. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/flags.py +0 -0
  95. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/io.py +0 -0
  96. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/templates.py +0 -0
  97. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/volumes.py +0 -0
  98. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/contract/wire.py +0 -0
  99. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/errors/__init__.py +0 -0
  100. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/errors/transport.py +0 -0
  101. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/obs/__init__.py +0 -0
  102. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/obs/log.py +0 -0
  103. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/obs/rid.py +0 -0
  104. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/presets/__init__.py +0 -0
  105. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/presets/frames.py +0 -0
  106. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/presets/robot_arm.py +0 -0
  107. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/schema_export.py +0 -0
  108. {sequence_base-0.4.8 → sequence_base-0.4.10}/sequence_base/telemetry/__init__.py +0 -0
  109. {sequence_base-0.4.8 → sequence_base-0.4.10}/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.8
3
+ Version: 0.4.10
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.8"
3
+ version = "0.4.10"
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"]
@@ -105,6 +105,10 @@ from sequence_base.contract import (
105
105
  from sequence_base.constants.version import CONTRACT_VERSION
106
106
 
107
107
 
108
+
109
+ from sequence_base.constants.limits import MAX_ENVS, MAX_USD, TASK_DESCRIPTION_MAX
110
+
111
+
108
112
  from sequence_base.obs.log import Timer, enabled, log
109
113
  from sequence_base.obs.rid import HEADER, clean, clean_text, new_rid, unescape_text
110
114
 
@@ -152,6 +156,7 @@ __all__ = [
152
156
  "TEMPLATE_SCHEME", "parse_template",
153
157
 
154
158
  "ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status", "CONTRACT_VERSION",
159
+ "MAX_ENVS", "MAX_USD", "TASK_DESCRIPTION_MAX",
155
160
 
156
161
  "HEADER", "new_rid", "clean", "clean_text", "unescape_text", "log", "Timer", "enabled",
157
162
 
@@ -0,0 +1,16 @@
1
+ """Numeric limits the contract shares with the gateway, defined once here so one bound is enforced everywhere
2
+ rather than drifting between `EvalRequest`, the benchmark register body and the gateway's own routes.
3
+ """
4
+
5
+
6
+
7
+ MAX_ENVS = 65536
8
+
9
+
10
+
11
+ MAX_USD = 100_000
12
+
13
+
14
+
15
+ TASK_DESCRIPTION_MAX = 300
16
+
@@ -4,7 +4,8 @@
4
4
 
5
5
 
6
6
 
7
- CONTRACT_VERSION = "0.5.8"
7
+ CONTRACT_VERSION = "0.5.9"
8
+
8
9
 
9
10
 
10
11
 
@@ -16,6 +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
20
  from sequence_base.contract.accounts import SecretRef
20
21
  from sequence_base.contract.deployments import CodeBundle, DeploymentState, InferParam
21
22
  from sequence_base.contract.flags import BENCHMARK_BATCHED, BENCHMARK_BINDABLE, SeqFlags
@@ -125,7 +126,7 @@ class BenchmarkSpec(BaseModel):
125
126
  bindings: dict[SeqFlags, str] = Field(..., description="SETUP / RESET / CHECK / SCORE (+ OBSERVE / STEP) → method name")
126
127
  gpu: str | list[str] | None = None
127
128
 
128
- envs: int | None = Field(default=None, ge=1, le=65536)
129
+ envs: int | None = Field(default=None, ge=1, le=MAX_ENVS)
129
130
  assets: list[VolumeRef] = Field(default_factory=list)
130
131
  render: RenderSpec | None = None
131
132
 
@@ -221,9 +222,10 @@ class BenchmarkRegisterRequest(BaseModel):
221
222
  default_adapter_ref: str | None = None
222
223
 
223
224
 
225
+
224
226
  gpu: str | None = Field(default=None, max_length=32)
225
227
 
226
- envs: int | None = Field(default=None, ge=1, le=65536)
228
+ envs: int | None = Field(default=None, ge=1, le=MAX_ENVS)
227
229
 
228
230
 
229
231
 
@@ -253,8 +255,8 @@ class BenchmarkRegisterRequest(BaseModel):
253
255
  for task, text in self.task_descriptions.items():
254
256
  if task not in declared:
255
257
  raise ValueError(f"task_descriptions names {task!r}, which is not a declared task")
256
- if len(text) > 300:
257
- raise ValueError(f"task_descriptions[{task!r}] is {len(text)} characters: at most 300")
258
+ if len(text) > TASK_DESCRIPTION_MAX:
259
+ raise ValueError(f"task_descriptions[{task!r}] is {len(text)} characters: at most {TASK_DESCRIPTION_MAX}")
258
260
  return self
259
261
 
260
262
 
@@ -185,6 +185,8 @@ class DeploymentPolicy(BaseModel):
185
185
  handler_ref: str
186
186
  action: ActionContract | None = None
187
187
  streaming: bool = False
188
+
189
+
188
190
  frames_per_chunk: int | None = None
189
191
  secrets: list[SecretRef] = Field(default_factory=list)
190
192
 
@@ -10,9 +10,11 @@ not a bare dict or free text.
10
10
  from __future__ import annotations
11
11
 
12
12
  from enum import Enum
13
- from typing import Literal
13
+ from typing import Annotated, Literal
14
14
 
15
- from pydantic import BaseModel, ConfigDict, Field, model_validator
15
+ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
16
+
17
+ from sequence_base.constants.limits import MAX_ENVS, MAX_USD
16
18
 
17
19
  __all__ = [
18
20
  "EvalRequest",
@@ -39,32 +41,52 @@ __all__ = [
39
41
  ]
40
42
 
41
43
 
44
+
45
+
46
+ _Trials = Annotated[int, Field(ge=1, le=100000)]
47
+
48
+
42
49
  class EvalRequest(BaseModel):
43
- """`model` and `benchmark` required; the rest are optional knobs. `dry_run` selects the estimate-only
44
- response shape below."""
50
+ """`POST /v1/eval`. A real eval names `model` + `benchmark`; a rerun (`rerun_of` / `rerun_unsuccessful_of`) may
51
+ leave them out and take the earlier eval's. `dry_run` selects the estimate-only response shape below.
52
+
53
+ 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,
55
+ never silently dropped. The gateway inherits this model rather than keeping its own."""
56
+
57
+
45
58
 
46
59
  model_config = ConfigDict(extra="forbid")
47
60
 
48
- model: str
49
- benchmark: str
50
61
 
62
+ model: str | None = Field(default=None, max_length=200)
63
+ benchmark: str | None = Field(default=None, max_length=200)
51
64
 
52
65
 
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).")
53
69
 
54
70
 
55
- trials: int | dict[str, int] | None = None
71
+
72
+
73
+ trials: _Trials | dict[str, _Trials] | None = None
56
74
  seeds: list[int] | dict[str, list[int]] | None = None
57
75
 
58
76
 
59
77
 
60
78
 
61
- policy_instances: int = Field(default=1, ge=1, le=64)
79
+ policy_instances: int | None = Field(default=None, ge=1, le=64)
62
80
  policy_gpu: str | None = Field(default=None, max_length=32)
63
- benchmark_instances: int = Field(default=1, ge=1, le=64)
81
+ benchmark_instances: int | None = Field(default=None, ge=1, le=64)
64
82
  benchmark_gpu: str | None = Field(default=None, max_length=32)
65
- envs: int | None = Field(default=None, ge=1, le=100000)
66
- vlm_max_concurrency: int | None = None
67
- adapter: str | None = None
83
+ envs: int | None = Field(default=None, ge=1)
84
+
85
+ gpus: int = Field(default=1, ge=1, le=64, json_schema_extra={"deprecated": True},
86
+ description="Deprecated name (sequence-ai <= 0.28) for policy_instances; use policy_instances.")
87
+ envs_per_gpu: int | None = Field(default=None, ge=1, le=1024, json_schema_extra={"deprecated": True},
88
+ description="Deprecated name (sequence-ai <= 0.28) for envs; use envs.")
89
+ adapter: str | None = Field(default=None, max_length=200)
68
90
 
69
91
 
70
92
  compare: str | list[str] | None = Field(default=None, description="Other model ids to compare against")
@@ -73,9 +95,15 @@ class EvalRequest(BaseModel):
73
95
 
74
96
  tasks: list[str] | None = Field(default=None, max_length=1000)
75
97
 
76
- max_usd: float | None = Field(default=None, gt=0)
77
98
 
78
- rerun_of: str | None = None
99
+ max_usd: float | None = Field(default=None, gt=0, le=MAX_USD)
100
+
101
+ rerun_of: str | None = Field(default=None, max_length=64)
102
+
103
+
104
+
105
+ rerun_unsuccessful_of: str | None = Field(default=None, max_length=64)
106
+ metric: str | None = Field(default=None, max_length=64)
79
107
 
80
108
 
81
109
 
@@ -89,6 +117,21 @@ class EvalRequest(BaseModel):
89
117
 
90
118
  replay: Literal["3d", "none"] | None = None
91
119
 
120
+
121
+ region: str | None = Field(default=None, max_length=32, json_schema_extra={"deprecated": True},
122
+ description="Not accepted: an eval's machines run wherever there are cards, so a region "
123
+ "is refused. Omit it (an older SDK still sends it).")
124
+
125
+ @field_validator("envs")
126
+ @classmethod
127
+ def _envs_cap(cls, v: int | None) -> int | None:
128
+ """One benchmark instance runs at most MAX_ENVS environments; keep the author-facing hint (run more by adding
129
+ instances) rather than a bare bound, and name the same shared constant as the gateway."""
130
+ if v is not None and v > MAX_ENVS:
131
+ raise ValueError(f"a benchmark instance runs at most {MAX_ENVS} environments at once; add more "
132
+ "benchmark_instances to run more")
133
+ return v
134
+
92
135
  @model_validator(mode="after")
93
136
  def _selection(self) -> "EvalRequest":
94
137
  """The selection's own bounds, as the platform holds them: a count 1-100000, at most 5000 seeds in a list and
@@ -382,11 +425,16 @@ class EvalReport(BaseModel):
382
425
  default_factory=list, description="Why episodes or the run failed, so an incomplete report says why"
383
426
  )
384
427
 
385
-
386
428
  arms: list[ArmReport] | None = None
387
429
  paired: list[PairedDiff] | None = None
388
430
  timing: EvalTiming | None = None
389
- stop_reason: str | None = None
431
+
432
+
433
+
434
+
435
+
436
+ stop_reason: Literal["canceled", "budget", "balance", "deadline", "mismatch", "refused", "queue_timeout",
437
+ "no_gpu_render"] | None = None
390
438
 
391
439
 
392
440
  arm_params: list[ArmParams] | None = None
@@ -397,18 +445,17 @@ class AdapterKind(str, Enum):
397
445
  LOSSY = "lossy"
398
446
 
399
447
 
448
+
449
+
450
+
451
+
452
+
400
453
  class AdapterTransform(BaseModel):
401
- """One adapter transform, classified. A lossy transform must carry a non-empty reason; a lossless one
402
- needs none. The lossy element's shape ({transform, reason}) aligns with EvalReport.adapter_lossy."""
454
+ """One adapter transform: its kind (lossless / lossy), the transform's name, and an optional reason. A registered
455
+ adapter and an older eval report carry these fields; they are kept for compatibility and are no longer acted on."""
403
456
 
404
457
  model_config = ConfigDict(extra="forbid")
405
458
 
406
459
  kind: AdapterKind
407
460
  transform: str
408
461
  reason: str | None = None
409
-
410
- @model_validator(mode="after")
411
- def _lossy_needs_reason(self) -> "AdapterTransform":
412
- if self.kind is AdapterKind.LOSSY and not (self.reason and self.reason.strip()):
413
- raise ValueError("a lossy transform must carry a non-empty reason")
414
- return self
@@ -261,6 +261,8 @@ class PolicySpec(BaseModel):
261
261
  queue_timeout_s: int = Field(default=120, ge=5, le=3600)
262
262
  concurrency: Concurrency | None = None
263
263
  streaming: bool = False
264
+
265
+
264
266
  frames_per_chunk: int | None = None
265
267
 
266
268
  action: ActionContract | None = None
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "ActRequest",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.8"
82
+ "x-contract-version": "0.5.9"
83
83
  }
@@ -89,5 +89,5 @@
89
89
  ],
90
90
  "title": "ActResponse",
91
91
  "type": "object",
92
- "x-contract-version": "0.5.8"
92
+ "x-contract-version": "0.5.9"
93
93
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "ActionChunk",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.8"
102
+ "x-contract-version": "0.5.9"
103
103
  }
@@ -116,5 +116,5 @@
116
116
  ],
117
117
  "title": "ActionContract",
118
118
  "type": "object",
119
- "x-contract-version": "0.5.8"
119
+ "x-contract-version": "0.5.9"
120
120
  }
@@ -19,5 +19,5 @@
19
19
  ],
20
20
  "title": "ActionStep",
21
21
  "type": "object",
22
- "x-contract-version": "0.5.8"
22
+ "x-contract-version": "0.5.9"
23
23
  }
@@ -10,7 +10,7 @@
10
10
  }
11
11
  },
12
12
  "additionalProperties": false,
13
- "description": "One adapter transform, classified. A lossy transform must carry a non-empty reason; a lossless one\nneeds none. The lossy element's shape ({transform, reason}) aligns with EvalReport.adapter_lossy.",
13
+ "description": "One adapter transform: its kind (lossless / lossy), the transform's name, and an optional reason. A registered\nadapter and an older eval report carry these fields; they are kept for compatibility and are no longer acted on.",
14
14
  "properties": {
15
15
  "kind": {
16
16
  "$ref": "#/$defs/AdapterKind"
@@ -38,5 +38,5 @@
38
38
  ],
39
39
  "title": "AdapterTransform",
40
40
  "type": "object",
41
- "x-contract-version": "0.5.8"
41
+ "x-contract-version": "0.5.9"
42
42
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "AddLocal",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.8"
26
+ "x-contract-version": "0.5.9"
27
27
  }
@@ -69,5 +69,5 @@
69
69
  },
70
70
  "title": "Autoscaler",
71
71
  "type": "object",
72
- "x-contract-version": "0.5.8"
72
+ "x-contract-version": "0.5.9"
73
73
  }
@@ -62,5 +62,5 @@
62
62
  ],
63
63
  "title": "BenchmarkConditionSpec",
64
64
  "type": "object",
65
- "x-contract-version": "0.5.8"
65
+ "x-contract-version": "0.5.9"
66
66
  }
@@ -991,5 +991,5 @@
991
991
  ],
992
992
  "title": "BenchmarkRegisterRequest",
993
993
  "type": "object",
994
- "x-contract-version": "0.5.8"
994
+ "x-contract-version": "0.5.9"
995
995
  }
@@ -368,7 +368,7 @@
368
368
  ],
369
369
  "title": "SeqFlags",
370
370
  "type": "integer",
371
- "x-contract-version": "0.5.8",
371
+ "x-contract-version": "0.5.9",
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.8"
628
+ "x-contract-version": "0.5.9"
629
629
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "BenchmarkStatusResponse",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.8"
43
+ "x-contract-version": "0.5.9"
44
44
  }
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "BootstrapResponse",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.8"
82
+ "x-contract-version": "0.5.9"
83
83
  }
@@ -72,5 +72,5 @@
72
72
  ],
73
73
  "title": "Camera",
74
74
  "type": "object",
75
- "x-contract-version": "0.5.8"
75
+ "x-contract-version": "0.5.9"
76
76
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "ClampInfo",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.8"
26
+ "x-contract-version": "0.5.9"
27
27
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "CodeBundle",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.8"
26
+ "x-contract-version": "0.5.9"
27
27
  }
@@ -96,5 +96,5 @@
96
96
  },
97
97
  "title": "Concurrency",
98
98
  "type": "object",
99
- "x-contract-version": "0.5.8"
99
+ "x-contract-version": "0.5.9"
100
100
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "Conditions",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.8"
58
+ "x-contract-version": "0.5.9"
59
59
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "ConnectRequest",
27
27
  "type": "object",
28
- "x-contract-version": "0.5.8"
28
+ "x-contract-version": "0.5.9"
29
29
  }
@@ -342,5 +342,5 @@
342
342
  ],
343
343
  "title": "ConnectResponse",
344
344
  "type": "object",
345
- "x-contract-version": "0.5.8"
345
+ "x-contract-version": "0.5.9"
346
346
  }
@@ -18,5 +18,5 @@
18
18
  ],
19
19
  "title": "DeploymentAccepted",
20
20
  "type": "object",
21
- "x-contract-version": "0.5.8"
21
+ "x-contract-version": "0.5.9"
22
22
  }
@@ -530,5 +530,5 @@
530
530
  ],
531
531
  "title": "DeploymentPolicy",
532
532
  "type": "object",
533
- "x-contract-version": "0.5.8"
533
+ "x-contract-version": "0.5.9"
534
534
  }
@@ -1224,5 +1224,5 @@
1224
1224
  ],
1225
1225
  "title": "DeploymentRequest",
1226
1226
  "type": "object",
1227
- "x-contract-version": "0.5.8"
1227
+ "x-contract-version": "0.5.9"
1228
1228
  }
@@ -58,5 +58,5 @@
58
58
  ],
59
59
  "title": "DeploymentStatusResponse",
60
60
  "type": "object",
61
- "x-contract-version": "0.5.8"
61
+ "x-contract-version": "0.5.9"
62
62
  }
@@ -267,5 +267,5 @@
267
267
  ],
268
268
  "title": "Embodiment",
269
269
  "type": "object",
270
- "x-contract-version": "0.5.8"
270
+ "x-contract-version": "0.5.9"
271
271
  }
@@ -94,5 +94,5 @@
94
94
  ],
95
95
  "title": "ErrorBody",
96
96
  "type": "object",
97
- "x-contract-version": "0.5.8"
97
+ "x-contract-version": "0.5.9"
98
98
  }
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "title": "ErrorCode",
24
24
  "type": "string",
25
- "x-contract-version": "0.5.8",
25
+ "x-contract-version": "0.5.9",
26
26
  "x-errors": {
27
27
  "budget_exhausted": {
28
28
  "exit_code": 6,
@@ -60,5 +60,5 @@
60
60
  ],
61
61
  "title": "Estimate",
62
62
  "type": "object",
63
- "x-contract-version": "0.5.8"
63
+ "x-contract-version": "0.5.9"
64
64
  }
@@ -240,5 +240,5 @@
240
240
  ],
241
241
  "title": "EvalDryRunResponse",
242
242
  "type": "object",
243
- "x-contract-version": "0.5.8"
243
+ "x-contract-version": "0.5.9"
244
244
  }
@@ -485,6 +485,16 @@
485
485
  "stop_reason": {
486
486
  "anyOf": [
487
487
  {
488
+ "enum": [
489
+ "canceled",
490
+ "budget",
491
+ "balance",
492
+ "deadline",
493
+ "mismatch",
494
+ "refused",
495
+ "queue_timeout",
496
+ "no_gpu_render"
497
+ ],
488
498
  "type": "string"
489
499
  },
490
500
  {
@@ -523,5 +533,5 @@
523
533
  ],
524
534
  "title": "EvalReport",
525
535
  "type": "object",
526
- "x-contract-version": "0.5.8"
536
+ "x-contract-version": "0.5.9"
527
537
  }