sequence-base 0.4.9__tar.gz → 0.4.11__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.9 → sequence_base-0.4.11}/PKG-INFO +1 -1
  2. {sequence_base-0.4.9 → sequence_base-0.4.11}/pyproject.toml +1 -1
  3. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/__init__.py +5 -0
  4. sequence_base-0.4.11/sequence_base/constants/limits.py +16 -0
  5. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/constants/version.py +2 -1
  6. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/benchmarks.py +6 -4
  7. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/deployments.py +8 -1
  8. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/eval.py +70 -17
  9. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/policy.py +2 -0
  10. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ActRequest.json +1 -1
  11. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ActResponse.json +1 -1
  12. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ActionChunk.json +1 -1
  13. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ActionContract.json +1 -1
  14. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ActionStep.json +1 -1
  15. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/AdapterTransform.json +1 -1
  16. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/AddLocal.json +1 -1
  17. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Autoscaler.json +1 -1
  18. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
  19. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
  20. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/BenchmarkSpec.json +2 -2
  21. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  22. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/BootstrapResponse.json +1 -1
  23. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Camera.json +1 -1
  24. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ClampInfo.json +1 -1
  25. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/CodeBundle.json +1 -1
  26. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Concurrency.json +1 -1
  27. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Conditions.json +1 -1
  28. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ConnectRequest.json +1 -1
  29. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ConnectResponse.json +1 -1
  30. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  31. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/DeploymentPolicy.json +1 -1
  32. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/DeploymentRequest.json +3 -1
  33. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  34. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Embodiment.json +1 -1
  35. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ErrorBody.json +1 -1
  36. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ErrorCodes.json +1 -1
  37. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Estimate.json +1 -1
  38. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
  39. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/EvalReport.json +11 -1
  40. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/EvalRequest.json +138 -33
  41. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/EvalResponse.json +1 -1
  42. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageFrame.json +1 -1
  43. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageSpec.json +1 -1
  44. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  45. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageStepApt.json +1 -1
  46. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageStepEnv.json +1 -1
  47. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageStepRun.json +1 -1
  48. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
  49. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  50. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/InferParam.json +1 -1
  51. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Lease.json +1 -1
  52. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/LossyTransform.json +1 -1
  53. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/MetricAgg.json +1 -1
  54. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Observation.json +1 -1
  55. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ObservationContract.json +1 -1
  56. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/PolicyRegistration.json +2 -2
  57. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/PolicySpec.json +1 -1
  58. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Proprioception.json +1 -1
  59. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/RenderSpec.json +1 -1
  60. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/ReplaySpec.json +1 -1
  61. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Resources.json +3 -1
  62. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/RolloutResult.json +1 -1
  63. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  64. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/SecretInfo.json +1 -1
  65. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/SecretRef.json +1 -1
  66. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/SeqFlags.json +1 -1
  67. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Step.json +1 -1
  68. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/SuiteAgg.json +1 -1
  69. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/TaskAgg.json +1 -1
  70. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/TemplateFiles.json +1 -1
  71. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Timeouts.json +1 -1
  72. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/UploadTarget.json +1 -1
  73. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/Variant.json +1 -1
  74. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/VolumeAttach.json +1 -1
  75. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/VolumeFile.json +1 -1
  76. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/VolumeInfo.json +1 -1
  77. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/VolumeMount.json +1 -1
  78. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/VolumeRef.json +1 -1
  79. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  80. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  81. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schemas/WarmingError.json +1 -1
  82. {sequence_base-0.4.9 → sequence_base-0.4.11}/.gitignore +0 -0
  83. {sequence_base-0.4.9 → sequence_base-0.4.11}/README.md +0 -0
  84. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/auth.py +0 -0
  85. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/codec/__init__.py +0 -0
  86. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/codec/image.py +0 -0
  87. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/constants/__init__.py +0 -0
  88. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/constants/headers.py +0 -0
  89. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/__init__.py +0 -0
  90. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/accounts.py +0 -0
  91. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/act.py +0 -0
  92. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/connect.py +0 -0
  93. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/errors.py +0 -0
  94. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/flags.py +0 -0
  95. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/io.py +0 -0
  96. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/templates.py +0 -0
  97. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/volumes.py +0 -0
  98. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/contract/wire.py +0 -0
  99. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/errors/__init__.py +0 -0
  100. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/errors/transport.py +0 -0
  101. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/obs/__init__.py +0 -0
  102. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/obs/log.py +0 -0
  103. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/obs/rid.py +0 -0
  104. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/presets/__init__.py +0 -0
  105. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/presets/frames.py +0 -0
  106. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/presets/robot_arm.py +0 -0
  107. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/schema_export.py +0 -0
  108. {sequence_base-0.4.9 → sequence_base-0.4.11}/sequence_base/telemetry/__init__.py +0 -0
  109. {sequence_base-0.4.9 → sequence_base-0.4.11}/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.9
3
+ Version: 0.4.11
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.9"
3
+ version = "0.4.11"
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.10"
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
 
@@ -60,7 +60,12 @@ class Resources(BaseModel):
60
60
  memory_limit_gb: float | None = Field(default=None, ge=0.125, le=1024)
61
61
 
62
62
 
63
- region: str | None = Field(default=None, max_length=32)
63
+
64
+
65
+
66
+ region: str | None = Field(default=None, max_length=32, json_schema_extra={"deprecated": True},
67
+ description="Not accepted: a deployment's workers run wherever there are cards, so a "
68
+ "region is refused. Omit it (an older SDK still sends it).")
64
69
 
65
70
  @model_validator(mode="after")
66
71
  def _limits_cover_requests(self) -> "Resources":
@@ -185,6 +190,8 @@ class DeploymentPolicy(BaseModel):
185
190
  handler_ref: str
186
191
  action: ActionContract | None = None
187
192
  streaming: bool = False
193
+
194
+
188
195
  frames_per_chunk: int | None = None
189
196
  secrets: list[SecretRef] = Field(default_factory=list)
190
197
 
@@ -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,57 @@ __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)
64
+
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).")
51
69
 
52
70
 
53
71
 
54
72
 
55
- trials: int | dict[str, int] | None = None
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)
64
- 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
81
+ benchmark_instances: int | None = Field(default=None, ge=1, le=64)
82
+
83
+
84
+
85
+ benchmark_gpu: str | None = Field(default=None, max_length=32, json_schema_extra={"deprecated": True},
86
+ description="Not accepted: an eval runs on the card its benchmark was registered "
87
+ "on, so a card is refused. Omit it (an older SDK still sends it).")
88
+ envs: int | None = Field(default=None, ge=1)
89
+
90
+ gpus: int = Field(default=1, ge=1, le=64, json_schema_extra={"deprecated": True},
91
+ description="Deprecated name (sequence-ai <= 0.28) for policy_instances; use policy_instances.")
92
+ envs_per_gpu: int | None = Field(default=None, ge=1, le=1024, json_schema_extra={"deprecated": True},
93
+ description="Deprecated name (sequence-ai <= 0.28) for envs; use envs.")
94
+ adapter: str | None = Field(default=None, max_length=200)
68
95
 
69
96
 
70
97
  compare: str | list[str] | None = Field(default=None, description="Other model ids to compare against")
@@ -73,9 +100,15 @@ class EvalRequest(BaseModel):
73
100
 
74
101
  tasks: list[str] | None = Field(default=None, max_length=1000)
75
102
 
76
- max_usd: float | None = Field(default=None, gt=0)
77
103
 
78
- rerun_of: str | None = None
104
+ max_usd: float | None = Field(default=None, gt=0, le=MAX_USD)
105
+
106
+ rerun_of: str | None = Field(default=None, max_length=64)
107
+
108
+
109
+
110
+ rerun_unsuccessful_of: str | None = Field(default=None, max_length=64)
111
+ metric: str | None = Field(default=None, max_length=64)
79
112
 
80
113
 
81
114
 
@@ -89,6 +122,21 @@ class EvalRequest(BaseModel):
89
122
 
90
123
  replay: Literal["3d", "none"] | None = None
91
124
 
125
+
126
+ region: str | None = Field(default=None, max_length=32, json_schema_extra={"deprecated": True},
127
+ description="Not accepted: an eval's machines run wherever there are cards, so a region "
128
+ "is refused. Omit it (an older SDK still sends it).")
129
+
130
+ @field_validator("envs")
131
+ @classmethod
132
+ def _envs_cap(cls, v: int | None) -> int | None:
133
+ """One benchmark instance runs at most MAX_ENVS environments; keep the author-facing hint (run more by adding
134
+ instances) rather than a bare bound, and name the same shared constant as the gateway."""
135
+ if v is not None and v > MAX_ENVS:
136
+ raise ValueError(f"a benchmark instance runs at most {MAX_ENVS} environments at once; add more "
137
+ "benchmark_instances to run more")
138
+ return v
139
+
92
140
  @model_validator(mode="after")
93
141
  def _selection(self) -> "EvalRequest":
94
142
  """The selection's own bounds, as the platform holds them: a count 1-100000, at most 5000 seeds in a list and
@@ -382,11 +430,16 @@ class EvalReport(BaseModel):
382
430
  default_factory=list, description="Why episodes or the run failed, so an incomplete report says why"
383
431
  )
384
432
 
385
-
386
433
  arms: list[ArmReport] | None = None
387
434
  paired: list[PairedDiff] | None = None
388
435
  timing: EvalTiming | None = None
389
- stop_reason: str | None = None
436
+
437
+
438
+
439
+
440
+
441
+ stop_reason: Literal["canceled", "budget", "balance", "deadline", "mismatch", "refused", "queue_timeout",
442
+ "no_gpu_render"] | None = None
390
443
 
391
444
 
392
445
  arm_params: list[ArmParams] | None = None
@@ -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.10"
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.10"
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.10"
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.10"
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.10"
23
23
  }
@@ -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.10"
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.10"
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.10"
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.10"
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.10"
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.10",
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.10"
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.10"
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.10"
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.10"
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.10"
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.10"
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.10"
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.10"
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.10"
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.10"
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.10"
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.10"
534
534
  }
@@ -997,6 +997,8 @@
997
997
  }
998
998
  ],
999
999
  "default": null,
1000
+ "deprecated": true,
1001
+ "description": "Not accepted: a deployment's workers run wherever there are cards, so a region is refused. Omit it (an older SDK still sends it).",
1000
1002
  "title": "Region"
1001
1003
  }
1002
1004
  },
@@ -1224,5 +1226,5 @@
1224
1226
  ],
1225
1227
  "title": "DeploymentRequest",
1226
1228
  "type": "object",
1227
- "x-contract-version": "0.5.8"
1229
+ "x-contract-version": "0.5.10"
1228
1230
  }
@@ -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.10"
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.10"
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.10"
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.10",
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.10"
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.10"
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.10"
527
537
  }