sequence-base 0.4.32__tar.gz → 0.4.34__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 (124) hide show
  1. {sequence_base-0.4.32 → sequence_base-0.4.34}/PKG-INFO +1 -1
  2. {sequence_base-0.4.32 → sequence_base-0.4.34}/pyproject.toml +1 -1
  3. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/by_name.py +54 -6
  4. sequence_base-0.4.34/sequence_base/constants/cards.py +38 -0
  5. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/version.py +2 -1
  6. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/benchmarks.py +17 -0
  7. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActRequest.json +1 -1
  8. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActResponse.json +1 -1
  9. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActionChunk.json +1 -1
  10. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActionContract.json +1 -1
  11. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActionStep.json +1 -1
  12. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Actions.json +1 -1
  13. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/AdapterPair.json +1 -1
  14. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/AddLocal.json +1 -1
  15. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Autoscaler.json +1 -1
  16. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
  17. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkRegisterRequest.json +15 -1
  18. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkSpec.json +15 -2
  19. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  20. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BootstrapResponse.json +1 -1
  21. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Camera.json +1 -1
  22. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/CodeBundle.json +1 -1
  23. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Concurrency.json +1 -1
  24. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Conditions.json +1 -1
  25. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ConnectRequest.json +1 -1
  26. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ConnectResponse.json +1 -1
  27. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  28. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentPolicy.json +1 -1
  29. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentRequest.json +1 -1
  30. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  31. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ErrorBody.json +1 -1
  32. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ErrorCodes.json +1 -1
  33. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Estimate.json +1 -1
  34. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
  35. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalReport.json +1 -1
  36. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalRequest.json +1 -1
  37. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalResponse.json +1 -1
  38. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageFrame.json +1 -1
  39. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageSpec.json +1 -1
  40. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  41. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepApt.json +1 -1
  42. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepEnv.json +1 -1
  43. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepProject.json +1 -1
  44. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepRun.json +1 -1
  45. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
  46. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  47. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/InferParam.json +1 -1
  48. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Lease.json +1 -1
  49. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/MetricAgg.json +1 -1
  50. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Observation.json +1 -1
  51. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ObservationContract.json +1 -1
  52. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Observations.json +1 -1
  53. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ObserveRequest.json +1 -1
  54. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ObserveResponse.json +1 -1
  55. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/PolicyRegistration.json +2 -2
  56. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/PolicySpec.json +1 -1
  57. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Project.json +1 -1
  58. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Proprioception.json +1 -1
  59. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/RenderSpec.json +1 -1
  60. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ReplaySpec.json +1 -1
  61. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Resources.json +1 -1
  62. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/RolloutResult.json +1 -1
  63. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  64. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SecretInfo.json +1 -1
  65. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SecretRef.json +1 -1
  66. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SeqFlags.json +1 -1
  67. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Step.json +1 -1
  68. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Stream.json +1 -1
  69. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/TaskAgg.json +1 -1
  70. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/TemplateFiles.json +1 -1
  71. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Tensors.json +1 -1
  72. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Timeouts.json +1 -1
  73. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/UploadTarget.json +1 -1
  74. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Variant.json +1 -1
  75. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeFile.json +1 -1
  76. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeInfo.json +1 -1
  77. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeMount.json +1 -1
  78. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeRef.json +1 -1
  79. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  80. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  81. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/WarmingError.json +1 -1
  82. sequence_base-0.4.32/sequence_base/constants/cards.py +0 -16
  83. {sequence_base-0.4.32 → sequence_base-0.4.34}/.gitignore +0 -0
  84. {sequence_base-0.4.32 → sequence_base-0.4.34}/README.md +0 -0
  85. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/__init__.py +0 -0
  86. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/auth.py +0 -0
  87. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/codec/__init__.py +0 -0
  88. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/codec/image.py +0 -0
  89. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/codec/marked.py +0 -0
  90. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/__init__.py +0 -0
  91. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/headers.py +0 -0
  92. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/limits.py +0 -0
  93. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/construct.py +0 -0
  94. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/__init__.py +0 -0
  95. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/accounts.py +0 -0
  96. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/act.py +0 -0
  97. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/adapters.py +0 -0
  98. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/connect.py +0 -0
  99. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/deployments.py +0 -0
  100. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/errors.py +0 -0
  101. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/eval.py +0 -0
  102. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/flags.py +0 -0
  103. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/io.py +0 -0
  104. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/obs_schedule.py +0 -0
  105. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/observe.py +0 -0
  106. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/own_io.py +0 -0
  107. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/policy.py +0 -0
  108. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/retired.py +0 -0
  109. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/templates.py +0 -0
  110. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/volumes.py +0 -0
  111. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/wire.py +0 -0
  112. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/episode.py +0 -0
  113. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/errors/__init__.py +0 -0
  114. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/errors/transport.py +0 -0
  115. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/msgpack_io.py +0 -0
  116. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/obs/__init__.py +0 -0
  117. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/obs/log.py +0 -0
  118. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/obs/rid.py +0 -0
  119. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/presets/__init__.py +0 -0
  120. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/presets/frames.py +0 -0
  121. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/presets/robot_arm.py +0 -0
  122. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schema_export.py +0 -0
  123. {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/telemetry/__init__.py +0 -0
  124. {sequence_base-0.4.32 → sequence_base-0.4.34}/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.32
3
+ Version: 0.4.34
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.32"
3
+ version = "0.4.34"
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"]
@@ -17,10 +17,15 @@ rule on both sides.
17
17
 
18
18
  What the platform hands a method itself is `episode` - an act function, an observe function and the method an
19
19
  episode's end calls alike - and an eval's `seed`; `retired(parameters, what)` refuses a method that still takes what it
20
- handed once (episode_id, embodiment, feedback), and `ends(parameters, what)` an end method that takes anything but the episode,
21
- each in words that say what to write instead - the SDK when a class is declared, the worker when it loads one declared
22
- before.
20
+ handed once (episode_id, embodiment, feedback, and a composite's plan and robot), and `ends(parameters, what)` an end
21
+ method that takes anything but the episode, each in words that say what to write instead - the SDK when a class is
22
+ declared, the worker when it loads one declared before.
23
23
 
24
+
25
+ A composite's planner, @seq.plan, is called on a clock with the episode alone and what it returns is kept in the
26
+ episode's state, which the act function beside it reads: `plan_refused(plan, infer_takes_episode=...)` says why a plan
27
+ method cannot be served as it is written, and `wake_on_refused(value)` why a wake_on is no list of keys - one set of
28
+ words for the SDK and the worker.
24
29
  """
25
30
  from __future__ import annotations
26
31
 
@@ -29,17 +34,26 @@ from collections.abc import Iterable, Mapping
29
34
  from dataclasses import dataclass
30
35
  from typing import Any
31
36
 
32
- __all__ = ["INFER_PLATFORM", "OBSERVE_PLATFORM", "RETIRED", "ByName", "ends", "retired", "takes_by_name"]
37
+ __all__ = ["INFER_PLATFORM", "OBSERVE_PLATFORM", "RETIRED", "WAKE_ON", "ByName", "ends", "plan_refused", "retired",
38
+ "takes_by_name", "wake_on_refused"]
33
39
 
34
40
 
35
41
 
36
- INFER_PLATFORM = frozenset({"seed", "episode", "plan", "robot"})
42
+ INFER_PLATFORM = frozenset({"seed", "episode"})
37
43
  OBSERVE_PLATFORM = frozenset({"step", "episode"})
38
44
 
39
45
 
40
46
  RETIRED = {"episode_id": "take episode, a seq.Episode, and read episode.id",
41
47
  "embodiment": "send what the robot is with its observations, in observe(x)",
42
- "feedback": "send what the robot was playing with its observations, in observe(x)"}
48
+ "feedback": "send what the robot was playing with its observations, in observe(x)",
49
+
50
+ "plan": ('take episode and read the newest plan as episode.state["seq.plans"][-1]["value"], what '
51
+ '@seq.plan returned (before the first, episode.state.get("seq.plans") is None)'),
52
+ "robot": ("take episode: episode.state is the robot's own dict, which @seq.plan is handed too, and "
53
+ "episode.id names it")}
54
+
55
+ WAKE_ON = ('@seq.plan(wake_on=...) is a list of the observation\'s keys whose arrival plans at once, each a string - '
56
+ 'wake_on=["say"]: an observation that holds "say" plans its episode then, its clock going on beside')
43
57
 
44
58
  _VARIADIC = (inspect.Parameter.VAR_POSITIONAL, inspect.Parameter.VAR_KEYWORD)
45
59
 
@@ -125,3 +139,37 @@ def ends(parameters: Iterable[inspect.Parameter], what: str) -> str | None:
125
139
 
126
140
  def _keys(names: list) -> str:
127
141
  return ", ".join(repr(n) for n in names)
142
+
143
+
144
+ def plan_refused(plan: Any, *, infer_takes_episode: bool) -> str | None:
145
+ """Why `plan`, a policy's @seq.plan method, cannot be served as it is written - or None, when it can: it is called on
146
+ a clock with the episode alone, plain or async, returning (never yielding) what is kept in the episode's state for
147
+ the act function beside it, which must take the episode to read it.
148
+ """
149
+ name = getattr(plan, "__name__", "plan")
150
+ if inspect.isgeneratorfunction(plan) or inspect.isasyncgenfunction(plan):
151
+ return (f"@seq.plan {name} returns its plan rather than yielding it: return the value, which is kept in "
152
+ 'episode.state["seq.plans"] (None keeps the plans as they are)')
153
+ try:
154
+ params = inspect.signature(plan).parameters
155
+ except (TypeError, ValueError):
156
+ params = {}
157
+ others = [n for n, p in params.items()
158
+ if n not in ("self", "episode") and p.default is inspect.Parameter.empty and p.kind not in _VARIADIC]
159
+ if "episode" not in params or others:
160
+ return (f"@seq.plan is handed the episode alone: write def {name}(self, episode) - read what it needs from "
161
+ 'episode.state, and return the plan, which is kept in episode.state["seq.plans"] (None keeps the plans '
162
+ "as they are)")
163
+ if not infer_takes_episode:
164
+ return ("a policy with @seq.plan reads its plans where its act function runs: take episode in it and read "
165
+ 'episode.state["seq.plans"][-1]["value"]')
166
+ return None
167
+
168
+
169
+ def wake_on_refused(value: Any) -> str | None:
170
+ """Why `value` cannot be a @seq.plan's wake_on - the observation's top-level keys whose arrival plans an episode at
171
+ once - or None, when it can: a list (or tuple) of strings, or None for none.
172
+ """
173
+ if value is None or (isinstance(value, (list, tuple)) and all(isinstance(k, str) for k in value)):
174
+ return None
175
+ return WAKE_ON
@@ -0,0 +1,38 @@
1
+ """The cards a benchmark machine may run on, defined once here: the SDK refuses any other before a benchmark registers
2
+ (and `seq validate` offline, so the list is a constant, not a read), the gateway at registration and at an eval, and
3
+ the harness at the machine it starts - one list where each kept its own.
4
+
5
+
6
+ Both cards have RT cores, video encoders, EGL and Vulkan, so a benchmark only picks cheaper or faster; one that names a
7
+ card simulates on it (registration checks). CPU physics is the author's explicit choice, gpu="cpu": CPU machines, one
8
+ environment per core
9
+ .
10
+
11
+ A deployment's or a benchmark's driver is named here too, beside its card: DRIVER.
12
+ """
13
+ import re
14
+
15
+ BENCHMARK_GPUS = ("L4", "RTX-PRO-6000")
16
+
17
+ DEFAULT_BENCHMARK_GPU = "L4"
18
+
19
+ BENCHMARK_CPU = "cpu"
20
+
21
+
22
+
23
+
24
+
25
+
26
+ DRIVER = r"^[1-9][0-9]{2}$"
27
+
28
+
29
+ def driver_major(version: str | None) -> str | None:
30
+ """The major version of a driver as nvidia-smi says it ("580.178.04" -> "580"); None for anything that is not one."""
31
+ head = (version or "").strip().split(".", 1)[0]
32
+ return head if re.fullmatch(DRIVER, head) else None
33
+
34
+
35
+ def check_driver(driver: str | None, card: str | None) -> None:
36
+ """A driver is a GPU's: one named beside gpu="cpu" is refused."""
37
+ if driver is not None and (card or "").strip().lower() == BENCHMARK_CPU:
38
+ raise ValueError('driver= names a GPU driver: a gpu="cpu" machine has none')
@@ -4,7 +4,8 @@
4
4
 
5
5
 
6
6
 
7
- CONTRACT_VERSION = "0.5.29"
7
+ CONTRACT_VERSION = "0.5.30"
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.cards import DRIVER, check_driver
19
20
  from sequence_base.constants.limits import MAX_ENVS, METRIC_UNIT_MAX, METRIC_UNITS_MAX, TASK_DESCRIPTION_MAX
20
21
  from sequence_base.contract.accounts import SecretRef
21
22
  from sequence_base.contract.deployments import CodeBundle, DeploymentState, InferParam
@@ -126,6 +127,8 @@ class BenchmarkSpec(BaseModel):
126
127
 
127
128
  gpu: str | None = None
128
129
 
130
+ driver: str | None = Field(default=None, pattern=DRIVER)
131
+
129
132
  envs: int | None = Field(default=None, ge=1, le=MAX_ENVS)
130
133
  assets: list[VolumeRef] = Field(default_factory=list)
131
134
  render: RenderSpec | None = None
@@ -153,6 +156,11 @@ class BenchmarkSpec(BaseModel):
153
156
  raise ValueError("a batched benchmark binds both OBSERVE and STEP")
154
157
  return self
155
158
 
159
+ @model_validator(mode="after")
160
+ def _driver_of_a_card(self) -> "BenchmarkSpec":
161
+ check_driver(self.driver, self.gpu)
162
+ return self
163
+
156
164
 
157
165
  class BenchmarkConditionSpec(BaseModel):
158
166
  """One episode setting exactly as the author declared it — a sparse list or a cross product, with its own step
@@ -233,6 +241,10 @@ class BenchmarkRegisterRequest(BaseModel):
233
241
 
234
242
  gpu: str | None = Field(default=None, max_length=32)
235
243
 
244
+
245
+ driver: str | None = Field(default=None, pattern=DRIVER,
246
+ description='The NVIDIA driver its card must have, by major version: "580"')
247
+
236
248
  envs: int | None = Field(default=None, ge=1, le=MAX_ENVS)
237
249
 
238
250
 
@@ -253,6 +265,11 @@ class BenchmarkRegisterRequest(BaseModel):
253
265
  raise ValueError(f"setup parameter {name!r} is not a public Python identifier")
254
266
  return self
255
267
 
268
+ @model_validator(mode="after")
269
+ def _driver_of_a_card(self) -> "BenchmarkRegisterRequest":
270
+ check_driver(self.driver, self.gpu)
271
+ return self
272
+
256
273
  @model_validator(mode="after")
257
274
  def _metric_units(self) -> "BenchmarkRegisterRequest":
258
275
  for metric, unit in self.metric_units.items():
@@ -80,5 +80,5 @@
80
80
  ],
81
81
  "title": "ActRequest",
82
82
  "type": "object",
83
- "x-contract-version": "0.5.29"
83
+ "x-contract-version": "0.5.30"
84
84
  }
@@ -89,5 +89,5 @@
89
89
  ],
90
90
  "title": "ActResponse",
91
91
  "type": "object",
92
- "x-contract-version": "0.5.29"
92
+ "x-contract-version": "0.5.30"
93
93
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "ActionChunk",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.29"
102
+ "x-contract-version": "0.5.30"
103
103
  }
@@ -96,5 +96,5 @@
96
96
  ],
97
97
  "title": "ActionContract",
98
98
  "type": "object",
99
- "x-contract-version": "0.5.29"
99
+ "x-contract-version": "0.5.30"
100
100
  }
@@ -19,5 +19,5 @@
19
19
  ],
20
20
  "title": "ActionStep",
21
21
  "type": "object",
22
- "x-contract-version": "0.5.29"
22
+ "x-contract-version": "0.5.30"
23
23
  }
@@ -59,5 +59,5 @@
59
59
  },
60
60
  "title": "Actions",
61
61
  "type": "object",
62
- "x-contract-version": "0.5.29"
62
+ "x-contract-version": "0.5.30"
63
63
  }
@@ -17,5 +17,5 @@
17
17
  ],
18
18
  "title": "AdapterPair",
19
19
  "type": "object",
20
- "x-contract-version": "0.5.29"
20
+ "x-contract-version": "0.5.30"
21
21
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "AddLocal",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.29"
26
+ "x-contract-version": "0.5.30"
27
27
  }
@@ -57,5 +57,5 @@
57
57
  },
58
58
  "title": "Autoscaler",
59
59
  "type": "object",
60
- "x-contract-version": "0.5.29"
60
+ "x-contract-version": "0.5.30"
61
61
  }
@@ -50,5 +50,5 @@
50
50
  ],
51
51
  "title": "BenchmarkConditionSpec",
52
52
  "type": "object",
53
- "x-contract-version": "0.5.29"
53
+ "x-contract-version": "0.5.30"
54
54
  }
@@ -885,6 +885,20 @@
885
885
  "default": null,
886
886
  "title": "Default Adapter Ref"
887
887
  },
888
+ "driver": {
889
+ "anyOf": [
890
+ {
891
+ "pattern": "^[1-9][0-9]{2}$",
892
+ "type": "string"
893
+ },
894
+ {
895
+ "type": "null"
896
+ }
897
+ ],
898
+ "default": null,
899
+ "description": "The NVIDIA driver its card must have, by major version: \"580\"",
900
+ "title": "Driver"
901
+ },
888
902
  "engine": {
889
903
  "anyOf": [
890
904
  {
@@ -1089,5 +1103,5 @@
1089
1103
  ],
1090
1104
  "title": "BenchmarkRegisterRequest",
1091
1105
  "type": "object",
1092
- "x-contract-version": "0.5.29"
1106
+ "x-contract-version": "0.5.30"
1093
1107
  }
@@ -471,7 +471,7 @@
471
471
  ],
472
472
  "title": "SeqFlags",
473
473
  "type": "integer",
474
- "x-contract-version": "0.5.29",
474
+ "x-contract-version": "0.5.30",
475
475
  "x-flag-names": {
476
476
  "CHECK": 65536,
477
477
  "INFER": 16,
@@ -615,6 +615,19 @@
615
615
  "default": null,
616
616
  "title": "Cpu"
617
617
  },
618
+ "driver": {
619
+ "anyOf": [
620
+ {
621
+ "pattern": "^[1-9][0-9]{2}$",
622
+ "type": "string"
623
+ },
624
+ {
625
+ "type": "null"
626
+ }
627
+ ],
628
+ "default": null,
629
+ "title": "Driver"
630
+ },
618
631
  "engine": {
619
632
  "anyOf": [
620
633
  {
@@ -722,5 +735,5 @@
722
735
  ],
723
736
  "title": "BenchmarkSpec",
724
737
  "type": "object",
725
- "x-contract-version": "0.5.29"
738
+ "x-contract-version": "0.5.30"
726
739
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "BenchmarkStatusResponse",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.29"
43
+ "x-contract-version": "0.5.30"
44
44
  }
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "BootstrapResponse",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.29"
82
+ "x-contract-version": "0.5.30"
83
83
  }
@@ -122,5 +122,5 @@
122
122
  ],
123
123
  "title": "Camera",
124
124
  "type": "object",
125
- "x-contract-version": "0.5.29"
125
+ "x-contract-version": "0.5.30"
126
126
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "CodeBundle",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.29"
26
+ "x-contract-version": "0.5.30"
27
27
  }
@@ -96,5 +96,5 @@
96
96
  },
97
97
  "title": "Concurrency",
98
98
  "type": "object",
99
- "x-contract-version": "0.5.29"
99
+ "x-contract-version": "0.5.30"
100
100
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "Conditions",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.29"
58
+ "x-contract-version": "0.5.30"
59
59
  }
@@ -12,5 +12,5 @@
12
12
  ],
13
13
  "title": "ConnectRequest",
14
14
  "type": "object",
15
- "x-contract-version": "0.5.29"
15
+ "x-contract-version": "0.5.30"
16
16
  }
@@ -580,5 +580,5 @@
580
580
  ],
581
581
  "title": "ConnectResponse",
582
582
  "type": "object",
583
- "x-contract-version": "0.5.29"
583
+ "x-contract-version": "0.5.30"
584
584
  }
@@ -18,5 +18,5 @@
18
18
  ],
19
19
  "title": "DeploymentAccepted",
20
20
  "type": "object",
21
- "x-contract-version": "0.5.29"
21
+ "x-contract-version": "0.5.30"
22
22
  }
@@ -776,5 +776,5 @@
776
776
  ],
777
777
  "title": "DeploymentPolicy",
778
778
  "type": "object",
779
- "x-contract-version": "0.5.29"
779
+ "x-contract-version": "0.5.30"
780
780
  }
@@ -1557,5 +1557,5 @@
1557
1557
  ],
1558
1558
  "title": "DeploymentRequest",
1559
1559
  "type": "object",
1560
- "x-contract-version": "0.5.29"
1560
+ "x-contract-version": "0.5.30"
1561
1561
  }
@@ -58,5 +58,5 @@
58
58
  ],
59
59
  "title": "DeploymentStatusResponse",
60
60
  "type": "object",
61
- "x-contract-version": "0.5.29"
61
+ "x-contract-version": "0.5.30"
62
62
  }
@@ -94,5 +94,5 @@
94
94
  ],
95
95
  "title": "ErrorBody",
96
96
  "type": "object",
97
- "x-contract-version": "0.5.29"
97
+ "x-contract-version": "0.5.30"
98
98
  }
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "title": "ErrorCode",
24
24
  "type": "string",
25
- "x-contract-version": "0.5.29",
25
+ "x-contract-version": "0.5.30",
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.29"
63
+ "x-contract-version": "0.5.30"
64
64
  }
@@ -240,5 +240,5 @@
240
240
  ],
241
241
  "title": "EvalDryRunResponse",
242
242
  "type": "object",
243
- "x-contract-version": "0.5.29"
243
+ "x-contract-version": "0.5.30"
244
244
  }
@@ -432,5 +432,5 @@
432
432
  ],
433
433
  "title": "EvalReport",
434
434
  "type": "object",
435
- "x-contract-version": "0.5.29"
435
+ "x-contract-version": "0.5.30"
436
436
  }
@@ -318,5 +318,5 @@
318
318
  },
319
319
  "title": "EvalRequest",
320
320
  "type": "object",
321
- "x-contract-version": "0.5.29"
321
+ "x-contract-version": "0.5.30"
322
322
  }
@@ -153,5 +153,5 @@
153
153
  ],
154
154
  "title": "EvalResponse",
155
155
  "type": "object",
156
- "x-contract-version": "0.5.29"
156
+ "x-contract-version": "0.5.30"
157
157
  }
@@ -49,5 +49,5 @@
49
49
  ],
50
50
  "title": "ImageFrame",
51
51
  "type": "object",
52
- "x-contract-version": "0.5.29"
52
+ "x-contract-version": "0.5.30"
53
53
  }
@@ -348,5 +348,5 @@
348
348
  },
349
349
  "title": "ImageSpec",
350
350
  "type": "object",
351
- "x-contract-version": "0.5.29"
351
+ "x-contract-version": "0.5.30"
352
352
  }
@@ -38,5 +38,5 @@
38
38
  ],
39
39
  "title": "ImageStepAddLocal",
40
40
  "type": "object",
41
- "x-contract-version": "0.5.29"
41
+ "x-contract-version": "0.5.30"
42
42
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepApt",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.29"
17
+ "x-contract-version": "0.5.30"
18
18
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepEnv",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.29"
17
+ "x-contract-version": "0.5.30"
18
18
  }
@@ -87,5 +87,5 @@
87
87
  ],
88
88
  "title": "ImageStepProject",
89
89
  "type": "object",
90
- "x-contract-version": "0.5.29"
90
+ "x-contract-version": "0.5.30"
91
91
  }
@@ -46,5 +46,5 @@
46
46
  ],
47
47
  "title": "ImageStepRun",
48
48
  "type": "object",
49
- "x-contract-version": "0.5.29"
49
+ "x-contract-version": "0.5.30"
50
50
  }
@@ -37,5 +37,5 @@
37
37
  ],
38
38
  "title": "ImageStepTemplateFiles",
39
39
  "type": "object",
40
- "x-contract-version": "0.5.29"
40
+ "x-contract-version": "0.5.30"
41
41
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepUvPip",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.29"
17
+ "x-contract-version": "0.5.30"
18
18
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "InferParam",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.29"
102
+ "x-contract-version": "0.5.30"
103
103
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "Lease",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.29"
27
+ "x-contract-version": "0.5.30"
28
28
  }
@@ -51,5 +51,5 @@
51
51
  ],
52
52
  "title": "MetricAgg",
53
53
  "type": "object",
54
- "x-contract-version": "0.5.29"
54
+ "x-contract-version": "0.5.30"
55
55
  }
@@ -169,5 +169,5 @@
169
169
  ],
170
170
  "title": "Observation",
171
171
  "type": "object",
172
- "x-contract-version": "0.5.29"
172
+ "x-contract-version": "0.5.30"
173
173
  }
@@ -170,5 +170,5 @@
170
170
  },
171
171
  "title": "ObservationContract",
172
172
  "type": "object",
173
- "x-contract-version": "0.5.29"
173
+ "x-contract-version": "0.5.30"
174
174
  }
@@ -260,5 +260,5 @@
260
260
  },
261
261
  "title": "Observations",
262
262
  "type": "object",
263
- "x-contract-version": "0.5.29"
263
+ "x-contract-version": "0.5.30"
264
264
  }
@@ -53,5 +53,5 @@
53
53
  ],
54
54
  "title": "ObserveRequest",
55
55
  "type": "object",
56
- "x-contract-version": "0.5.29"
56
+ "x-contract-version": "0.5.30"
57
57
  }
@@ -13,5 +13,5 @@
13
13
  ],
14
14
  "title": "ObserveResponse",
15
15
  "type": "object",
16
- "x-contract-version": "0.5.29"
16
+ "x-contract-version": "0.5.30"
17
17
  }
@@ -1116,7 +1116,7 @@
1116
1116
  ],
1117
1117
  "title": "SeqFlags",
1118
1118
  "type": "integer",
1119
- "x-contract-version": "0.5.29",
1119
+ "x-contract-version": "0.5.30",
1120
1120
  "x-flag-names": {
1121
1121
  "CHECK": 65536,
1122
1122
  "INFER": 16,
@@ -1307,5 +1307,5 @@
1307
1307
  ],
1308
1308
  "title": "PolicyRegistration",
1309
1309
  "type": "object",
1310
- "x-contract-version": "0.5.29"
1310
+ "x-contract-version": "0.5.30"
1311
1311
  }
@@ -1163,5 +1163,5 @@
1163
1163
  ],
1164
1164
  "title": "PolicySpec",
1165
1165
  "type": "object",
1166
- "x-contract-version": "0.5.29"
1166
+ "x-contract-version": "0.5.30"
1167
1167
  }
@@ -72,5 +72,5 @@
72
72
  },
73
73
  "title": "Project",
74
74
  "type": "object",
75
- "x-contract-version": "0.5.29"
75
+ "x-contract-version": "0.5.30"
76
76
  }
@@ -68,5 +68,5 @@
68
68
  },
69
69
  "title": "Proprioception",
70
70
  "type": "object",
71
- "x-contract-version": "0.5.29"
71
+ "x-contract-version": "0.5.30"
72
72
  }
@@ -36,5 +36,5 @@
36
36
  ],
37
37
  "title": "RenderSpec",
38
38
  "type": "object",
39
- "x-contract-version": "0.5.29"
39
+ "x-contract-version": "0.5.30"
40
40
  }
@@ -52,5 +52,5 @@
52
52
  },
53
53
  "title": "ReplaySpec",
54
54
  "type": "object",
55
- "x-contract-version": "0.5.29"
55
+ "x-contract-version": "0.5.30"
56
56
  }
@@ -86,5 +86,5 @@
86
86
  ],
87
87
  "title": "Resources",
88
88
  "type": "object",
89
- "x-contract-version": "0.5.29"
89
+ "x-contract-version": "0.5.30"
90
90
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "RolloutResult",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.29"
58
+ "x-contract-version": "0.5.30"
59
59
  }
@@ -21,5 +21,5 @@
21
21
  ],
22
22
  "title": "SecretCreateRequest",
23
23
  "type": "object",
24
- "x-contract-version": "0.5.29"
24
+ "x-contract-version": "0.5.30"
25
25
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "SecretInfo",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.29"
43
+ "x-contract-version": "0.5.30"
44
44
  }
@@ -12,5 +12,5 @@
12
12
  ],
13
13
  "title": "SecretRef",
14
14
  "type": "object",
15
- "x-contract-version": "0.5.29"
15
+ "x-contract-version": "0.5.30"
16
16
  }
@@ -18,7 +18,7 @@
18
18
  ],
19
19
  "title": "SeqFlags",
20
20
  "type": "integer",
21
- "x-contract-version": "0.5.29",
21
+ "x-contract-version": "0.5.30",
22
22
  "x-flag-names": {
23
23
  "CHECK": 65536,
24
24
  "INFER": 16,
@@ -82,5 +82,5 @@
82
82
  ],
83
83
  "title": "Step",
84
84
  "type": "object",
85
- "x-contract-version": "0.5.29"
85
+ "x-contract-version": "0.5.30"
86
86
  }
@@ -189,5 +189,5 @@
189
189
  },
190
190
  "title": "Stream",
191
191
  "type": "object",
192
- "x-contract-version": "0.5.29"
192
+ "x-contract-version": "0.5.30"
193
193
  }
@@ -22,5 +22,5 @@
22
22
  ],
23
23
  "title": "TaskAgg",
24
24
  "type": "object",
25
- "x-contract-version": "0.5.29"
25
+ "x-contract-version": "0.5.30"
26
26
  }
@@ -22,5 +22,5 @@
22
22
  ],
23
23
  "title": "TemplateFiles",
24
24
  "type": "object",
25
- "x-contract-version": "0.5.29"
25
+ "x-contract-version": "0.5.30"
26
26
  }
@@ -10,5 +10,5 @@
10
10
  },
11
11
  "title": "Tensors",
12
12
  "type": "object",
13
- "x-contract-version": "0.5.29"
13
+ "x-contract-version": "0.5.30"
14
14
  }
@@ -34,5 +34,5 @@
34
34
  ],
35
35
  "title": "Timeouts",
36
36
  "type": "object",
37
- "x-contract-version": "0.5.29"
37
+ "x-contract-version": "0.5.30"
38
38
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "UploadTarget",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.29"
27
+ "x-contract-version": "0.5.30"
28
28
  }
@@ -20,5 +20,5 @@
20
20
  ],
21
21
  "title": "Variant",
22
22
  "type": "object",
23
- "x-contract-version": "0.5.29"
23
+ "x-contract-version": "0.5.30"
24
24
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "VolumeFile",
27
27
  "type": "object",
28
- "x-contract-version": "0.5.29"
28
+ "x-contract-version": "0.5.30"
29
29
  }
@@ -68,5 +68,5 @@
68
68
  ],
69
69
  "title": "VolumeInfo",
70
70
  "type": "object",
71
- "x-contract-version": "0.5.29"
71
+ "x-contract-version": "0.5.30"
72
72
  }
@@ -17,5 +17,5 @@
17
17
  ],
18
18
  "title": "VolumeMount",
19
19
  "type": "object",
20
- "x-contract-version": "0.5.29"
20
+ "x-contract-version": "0.5.30"
21
21
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "VolumeRef",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.29"
27
+ "x-contract-version": "0.5.30"
28
28
  }
@@ -56,5 +56,5 @@
56
56
  ],
57
57
  "title": "VolumeUploadRequest",
58
58
  "type": "object",
59
- "x-contract-version": "0.5.29"
59
+ "x-contract-version": "0.5.30"
60
60
  }
@@ -65,5 +65,5 @@
65
65
  ],
66
66
  "title": "VolumeUploadResponse",
67
67
  "type": "object",
68
- "x-contract-version": "0.5.29"
68
+ "x-contract-version": "0.5.30"
69
69
  }
@@ -86,5 +86,5 @@
86
86
  ],
87
87
  "title": "WarmingError",
88
88
  "type": "object",
89
- "x-contract-version": "0.5.29"
89
+ "x-contract-version": "0.5.30"
90
90
  }
@@ -1,16 +0,0 @@
1
- """The cards a benchmark machine may run on, defined once here: the SDK refuses any other before a benchmark registers
2
- (and `seq validate` offline, so the list is a constant, not a read), the gateway at registration and at an eval, and
3
- the harness at the machine it starts - one list where each kept its own.
4
-
5
-
6
- Both cards have RT cores, video encoders, EGL and Vulkan, so a benchmark only picks cheaper or faster; one that names a
7
- card simulates on it (registration checks). CPU physics is the author's explicit choice, gpu="cpu": CPU machines, one
8
- environment per core
9
- .
10
- """
11
-
12
- BENCHMARK_GPUS = ("L4", "RTX-PRO-6000")
13
-
14
- DEFAULT_BENCHMARK_GPU = "L4"
15
-
16
- BENCHMARK_CPU = "cpu"
File without changes