sequence-base 0.3.0__tar.gz → 0.3.1__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 (151) hide show
  1. {sequence_base-0.3.0 → sequence_base-0.3.1}/PKG-INFO +1 -1
  2. {sequence_base-0.3.0 → sequence_base-0.3.1}/pyproject.toml +1 -1
  3. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/__init__.py +3 -2
  4. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/__init__.py +2 -1
  5. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/benchmarks.py +23 -1
  6. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/eval.py +3 -0
  7. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schema_export.py +2 -0
  8. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/BenchmarkRegisterRequest.json +95 -0
  9. sequence_base-0.3.1/sequence_base/schemas/BenchmarkStatusResponse.json +44 -0
  10. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/EvalReport.json +8 -0
  11. {sequence_base-0.3.0 → sequence_base-0.3.1}/tests/test_contracts.py +6 -2
  12. {sequence_base-0.3.0 → sequence_base-0.3.1}/.github/workflows/ci.yml +0 -0
  13. {sequence_base-0.3.0 → sequence_base-0.3.1}/.gitignore +0 -0
  14. {sequence_base-0.3.0 → sequence_base-0.3.1}/README.md +0 -0
  15. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/README.md +0 -0
  16. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/REVIEW.md +0 -0
  17. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/START.md +0 -0
  18. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/accounts.md +0 -0
  19. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/billing.md +0 -0
  20. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/build/BUILD_LOG.md +0 -0
  21. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/build/goal_sha256.json +0 -0
  22. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/build/gs-build-wave.js +0 -0
  23. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/build/gs-spec-goals.js +0 -0
  24. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/container.md +0 -0
  25. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/contracts.md +0 -0
  26. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/deploy/PLAN.md +0 -0
  27. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/deploy/PROD_REORG.md +0 -0
  28. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/deploy/SCHEMA_COMPAT.md +0 -0
  29. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/deploy/archive/sequences-gw.genseq-506918.20261001.yaml +0 -0
  30. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/eval.md +0 -0
  31. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/gateway.md +0 -0
  32. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/A1.yaml +0 -0
  33. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/A2.yaml +0 -0
  34. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/A3.yaml +0 -0
  35. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/C1.yaml +0 -0
  36. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/C2.yaml +0 -0
  37. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/C3.yaml +0 -0
  38. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/C4.yaml +0 -0
  39. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/C5.yaml +0 -0
  40. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/G1.yaml +0 -0
  41. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/G2.yaml +0 -0
  42. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/G3.yaml +0 -0
  43. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/G4.yaml +0 -0
  44. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/G5.yaml +0 -0
  45. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/O1.yaml +0 -0
  46. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/O2.yaml +0 -0
  47. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/O3.yaml +0 -0
  48. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/O4.yaml +0 -0
  49. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/O5.yaml +0 -0
  50. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/R1.yaml +0 -0
  51. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/R2.yaml +0 -0
  52. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/R3.yaml +0 -0
  53. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/S1.yaml +0 -0
  54. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/S2.yaml +0 -0
  55. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/S3.yaml +0 -0
  56. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/S4.yaml +0 -0
  57. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/S5.yaml +0 -0
  58. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/S6.yaml +0 -0
  59. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/V1-storage.md +0 -0
  60. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/V2-user-quotas.md +0 -0
  61. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/W0.1.yaml +0 -0
  62. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/goals/W0.2.yaml +0 -0
  63. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/README.md +0 -0
  64. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/architecture.md +0 -0
  65. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/connect.md +0 -0
  66. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/cost.md +0 -0
  67. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/custom-domain.md +0 -0
  68. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/debugging.md +0 -0
  69. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/goals.md +0 -0
  70. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/limits.md +0 -0
  71. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/plan.md +0 -0
  72. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/white-label.md +0 -0
  73. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/modal/wiring.md +0 -0
  74. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/observability.md +0 -0
  75. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/references.md +0 -0
  76. {sequence_base-0.3.0 → sequence_base-0.3.1}/docs/platform/sdk.md +0 -0
  77. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/auth.py +0 -0
  78. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/codec/__init__.py +0 -0
  79. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/codec/image.py +0 -0
  80. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/codec/resize.py +0 -0
  81. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/constants/__init__.py +0 -0
  82. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/constants/env.py +0 -0
  83. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/constants/headers.py +0 -0
  84. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/constants/version.py +0 -0
  85. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/accounts.py +0 -0
  86. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/act.py +0 -0
  87. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/connect.py +0 -0
  88. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/deployments.py +0 -0
  89. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/errors.py +0 -0
  90. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/flags.py +0 -0
  91. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/contract/policy.py +0 -0
  92. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/errors/__init__.py +0 -0
  93. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/errors/transport.py +0 -0
  94. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/obs/__init__.py +0 -0
  95. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/obs/log.py +0 -0
  96. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/obs/rid.py +0 -0
  97. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ActionChunk.json +0 -0
  98. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ActionContract.json +0 -0
  99. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ActionStep.json +0 -0
  100. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/AdapterTransform.json +0 -0
  101. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Autoscaler.json +0 -0
  102. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/BenchmarkSpec.json +0 -0
  103. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/BootstrapResponse.json +0 -0
  104. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ClampInfo.json +0 -0
  105. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/CodeBundle.json +0 -0
  106. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Concurrency.json +0 -0
  107. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Conditions.json +0 -0
  108. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ConnectRequest.json +0 -0
  109. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ConnectResponse.json +0 -0
  110. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/DeploymentAccepted.json +0 -0
  111. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/DeploymentPolicy.json +0 -0
  112. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/DeploymentRequest.json +0 -0
  113. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/DeploymentStatusResponse.json +0 -0
  114. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ErrorBody.json +0 -0
  115. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Estimate.json +0 -0
  116. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/EvalDryRunResponse.json +0 -0
  117. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/EvalRequest.json +0 -0
  118. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/EvalResponse.json +0 -0
  119. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ImageFrame.json +0 -0
  120. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ImageSpec.json +0 -0
  121. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ImageStepApt.json +0 -0
  122. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ImageStepEnv.json +0 -0
  123. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ImageStepRun.json +0 -0
  124. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/ImageStepUvPip.json +0 -0
  125. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Lease.json +0 -0
  126. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/LossyTransform.json +0 -0
  127. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/MetricAgg.json +0 -0
  128. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Observation.json +0 -0
  129. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/PolicyRegistration.json +0 -0
  130. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/PolicySpec.json +0 -0
  131. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Proprioception.json +0 -0
  132. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/RenderSpec.json +0 -0
  133. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Resources.json +0 -0
  134. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/RolloutResult.json +0 -0
  135. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/SecretCreateRequest.json +0 -0
  136. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/SecretInfo.json +0 -0
  137. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/SecretRef.json +0 -0
  138. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/SeqFlags.json +0 -0
  139. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Step.json +0 -0
  140. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/SuiteAgg.json +0 -0
  141. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/TaskAgg.json +0 -0
  142. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Timeouts.json +0 -0
  143. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/UsageReport.json +0 -0
  144. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/Variant.json +0 -0
  145. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/VolumeAttach.json +0 -0
  146. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/VolumeMount.json +0 -0
  147. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/VolumeRef.json +0 -0
  148. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/schemas/WarmingError.json +0 -0
  149. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/telemetry/__init__.py +0 -0
  150. {sequence_base-0.3.0 → sequence_base-0.3.1}/sequence_base/telemetry/events.py +0 -0
  151. {sequence_base-0.3.0 → sequence_base-0.3.1}/tests/test_codec_roundtrip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sequence-base
3
- Version: 0.3.0
3
+ Version: 0.3.1
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
  Requires-Python: >=3.11
6
6
  Requires-Dist: pydantic>=2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sequence-base"
3
- version = "0.3.0"
3
+ version = "0.3.1"
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.11"
6
6
  dependencies = ["pydantic>=2.0"]
@@ -23,6 +23,7 @@ from sequence_base.contract import ( # noqa: F401 (re-export surface)
23
23
  AdapterTransform,
24
24
  Autoscaler,
25
25
  BenchmarkRegisterRequest,
26
+ BenchmarkStatusResponse,
26
27
  BenchmarkSpec,
27
28
  BootstrapResponse,
28
29
  ClampInfo,
@@ -115,7 +116,7 @@ __all__ = [
115
116
  # contract 3 — connect / lease
116
117
  "Lease", "ConnectRequest", "ConnectResponse",
117
118
  # contract 5 — benchmark + eval
118
- "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkRegisterRequest",
119
+ "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
119
120
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
120
121
  "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
121
122
  "AdapterKind", "AdapterTransform",
@@ -131,4 +132,4 @@ __all__ = [
131
132
  "auth", "WorkerLogEvent",
132
133
  ]
133
134
 
134
- __version__ = "0.3.0"
135
+ __version__ = "0.3.1"
@@ -50,6 +50,7 @@ from sequence_base.contract.connect import ConnectRequest, ConnectResponse, Leas
50
50
  # contract 5 — benchmark registration + eval run / report / adapter
51
51
  from sequence_base.contract.benchmarks import (
52
52
  BenchmarkRegisterRequest,
53
+ BenchmarkStatusResponse,
53
54
  BenchmarkSpec,
54
55
  Conditions,
55
56
  RenderSpec,
@@ -100,7 +101,7 @@ __all__ = [
100
101
  # contract 3
101
102
  "Lease", "ConnectRequest", "ConnectResponse",
102
103
  # contract 5
103
- "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkRegisterRequest",
104
+ "Variant", "Conditions", "RenderSpec", "Step", "BenchmarkSpec", "BenchmarkRegisterRequest", "BenchmarkStatusResponse",
104
105
  "EvalRequest", "ClampInfo", "Estimate", "EvalResponse", "EvalDryRunResponse", "RolloutResult",
105
106
  "EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
106
107
  "AdapterKind", "AdapterTransform",
@@ -15,8 +15,9 @@ from __future__ import annotations
15
15
  from pydantic import BaseModel, ConfigDict, Field, model_validator
16
16
 
17
17
  from sequence_base.contract.accounts import SecretRef
18
+ from sequence_base.contract.deployments import CodeBundle, DeploymentState
18
19
  from sequence_base.contract.flags import BENCHMARK_BINDABLE, SeqFlags
19
- from sequence_base.contract.policy import ImageSpec, VolumeRef
20
+ from sequence_base.contract.policy import ActionContract, ImageSpec, VolumeRef
20
21
 
21
22
  __all__ = [
22
23
  "Variant",
@@ -25,6 +26,7 @@ __all__ = [
25
26
  "Step",
26
27
  "BenchmarkSpec",
27
28
  "BenchmarkRegisterRequest",
29
+ "BenchmarkStatusResponse",
28
30
  ]
29
31
 
30
32
 
@@ -128,3 +130,23 @@ class BenchmarkRegisterRequest(BaseModel):
128
130
  render: RenderSpec | None = None
129
131
  cpu: int | None = None
130
132
  memory_gb: int | None = None
133
+ # The benchmark's own source (reset/check hooks, its adapters), shipped like a policy's — the eval worker
134
+ # imports handler_ref and any adapter ref from it. None only when the image installs the module itself.
135
+ code: CodeBundle | None = None
136
+ # Which suite each task belongs to (task -> suite), so reports aggregate per suite without the platform
137
+ # guessing from task names. A task not listed here has no suite.
138
+ suite_of: dict[str, str] = Field(default_factory=dict)
139
+ # The action contract the benchmark's sim consumes; eval compares it with the policy's and requires an
140
+ # adapter when they differ.
141
+ action_contract: ActionContract | None = None
142
+
143
+
144
+ class BenchmarkStatusResponse(BaseModel):
145
+ """GET /v1/benchmarks/{name} — the build state of a registered benchmark (same lifecycle as a deployment:
146
+ building → ready | failed), with the failure reason when failed."""
147
+
148
+ model_config = ConfigDict(extra="forbid")
149
+
150
+ name: str
151
+ status: DeploymentState
152
+ error: str | None = None
@@ -177,6 +177,9 @@ class EvalReport(BaseModel):
177
177
  adapter_lossy: list[LossyTransform]
178
178
  videos: list[str] = Field(default_factory=list, description="mp4 pointers from the platform tool")
179
179
  incomplete: bool | None = None
180
+ errors: list[str] = Field(
181
+ default_factory=list, description="Why episodes or the run failed, so an incomplete report says why"
182
+ )
180
183
 
181
184
 
182
185
  class AdapterKind(str, Enum):
@@ -36,6 +36,7 @@ from sequence_base.contract.act import (
36
36
  )
37
37
  from sequence_base.contract.benchmarks import (
38
38
  BenchmarkRegisterRequest,
39
+ BenchmarkStatusResponse,
39
40
  BenchmarkSpec,
40
41
  Conditions,
41
42
  RenderSpec,
@@ -128,6 +129,7 @@ WIRE_MODELS: dict[str, type[BaseModel]] = {
128
129
  "Step": Step,
129
130
  "BenchmarkSpec": BenchmarkSpec,
130
131
  "BenchmarkRegisterRequest": BenchmarkRegisterRequest,
132
+ "BenchmarkStatusResponse": BenchmarkStatusResponse,
131
133
  # contract 5 — eval run / report / adapter
132
134
  "EvalRequest": EvalRequest,
133
135
  "ClampInfo": ClampInfo,
@@ -1,5 +1,71 @@
1
1
  {
2
2
  "$defs": {
3
+ "ActionContract": {
4
+ "additionalProperties": false,
5
+ "description": "The fixed obs→ActionChunk contract a policy promises. Every field required; `action_space` reuses\ncontract 4's enum (not a free string). Each ActionChunk echoes exactly these invariants back.",
6
+ "properties": {
7
+ "action_dim": {
8
+ "title": "Action Dim",
9
+ "type": "integer"
10
+ },
11
+ "action_space": {
12
+ "$ref": "#/$defs/ActionSpace"
13
+ },
14
+ "control_frequency_hz": {
15
+ "title": "Control Frequency Hz",
16
+ "type": "number"
17
+ },
18
+ "robot": {
19
+ "title": "Robot",
20
+ "type": "string"
21
+ }
22
+ },
23
+ "required": [
24
+ "robot",
25
+ "action_space",
26
+ "action_dim",
27
+ "control_frequency_hz"
28
+ ],
29
+ "title": "ActionContract",
30
+ "type": "object"
31
+ },
32
+ "ActionSpace": {
33
+ "description": "Must be explicit: the same floats mean opposite things across spaces — executing an absolute\njoint position as a delta flings the arm into its limit stops. {schema.py:124}",
34
+ "enum": [
35
+ "joint_absolute",
36
+ "joint_delta",
37
+ "ee_absolute",
38
+ "ee_delta"
39
+ ],
40
+ "title": "ActionSpace",
41
+ "type": "string"
42
+ },
43
+ "CodeBundle": {
44
+ "additionalProperties": false,
45
+ "description": "The policy's own source, shipped with the deploy so the worker can import `policy.handler_ref`\n(what Modal's automount does for the entrypoint module). A gzip'd tar of the handler's top-level module\nor package, base64 on the wire, with the sha256 of the decoded bytes so a truncated or altered upload\nis refused at the edge instead of failing as an ImportError on a GPU.",
46
+ "properties": {
47
+ "data": {
48
+ "title": "Data",
49
+ "type": "string"
50
+ },
51
+ "format": {
52
+ "const": "tar.gz",
53
+ "default": "tar.gz",
54
+ "title": "Format",
55
+ "type": "string"
56
+ },
57
+ "sha256": {
58
+ "title": "Sha256",
59
+ "type": "string"
60
+ }
61
+ },
62
+ "required": [
63
+ "data",
64
+ "sha256"
65
+ ],
66
+ "title": "CodeBundle",
67
+ "type": "object"
68
+ },
3
69
  "Conditions": {
4
70
  "additionalProperties": false,
5
71
  "description": "The eval matrix — structured, not a bare dict. `tasks` and `seeds` required; `variants` optional.",
@@ -228,6 +294,17 @@
228
294
  "additionalProperties": false,
229
295
  "description": "POST /v1/benchmarks — register body, same types as the spec (ImageSpec / Conditions / VolumeRef /\nRenderSpec). Carries assets / render / cpu / memory_gb / max_steps so the gateway can build the image,\nprovision the `assets` Volume, and register in one call.",
230
296
  "properties": {
297
+ "action_contract": {
298
+ "anyOf": [
299
+ {
300
+ "$ref": "#/$defs/ActionContract"
301
+ },
302
+ {
303
+ "type": "null"
304
+ }
305
+ ],
306
+ "default": null
307
+ },
231
308
  "assets": {
232
309
  "items": {
233
310
  "$ref": "#/$defs/VolumeRef"
@@ -235,6 +312,17 @@
235
312
  "title": "Assets",
236
313
  "type": "array"
237
314
  },
315
+ "code": {
316
+ "anyOf": [
317
+ {
318
+ "$ref": "#/$defs/CodeBundle"
319
+ },
320
+ {
321
+ "type": "null"
322
+ }
323
+ ],
324
+ "default": null
325
+ },
238
326
  "conditions": {
239
327
  "$ref": "#/$defs/Conditions"
240
328
  },
@@ -287,6 +375,13 @@
287
375
  }
288
376
  ],
289
377
  "default": null
378
+ },
379
+ "suite_of": {
380
+ "additionalProperties": {
381
+ "type": "string"
382
+ },
383
+ "title": "Suite Of",
384
+ "type": "object"
290
385
  }
291
386
  },
292
387
  "required": [
@@ -0,0 +1,44 @@
1
+ {
2
+ "$defs": {
3
+ "DeploymentState": {
4
+ "description": "GET status — a restricted enum, not a free string (same discipline as EvalStatus).",
5
+ "enum": [
6
+ "building",
7
+ "ready",
8
+ "failed"
9
+ ],
10
+ "title": "DeploymentState",
11
+ "type": "string"
12
+ }
13
+ },
14
+ "additionalProperties": false,
15
+ "description": "GET /v1/benchmarks/{name} — the build state of a registered benchmark (same lifecycle as a deployment:\nbuilding → ready | failed), with the failure reason when failed.",
16
+ "properties": {
17
+ "error": {
18
+ "anyOf": [
19
+ {
20
+ "type": "string"
21
+ },
22
+ {
23
+ "type": "null"
24
+ }
25
+ ],
26
+ "default": null,
27
+ "title": "Error"
28
+ },
29
+ "name": {
30
+ "title": "Name",
31
+ "type": "string"
32
+ },
33
+ "status": {
34
+ "$ref": "#/$defs/DeploymentState"
35
+ }
36
+ },
37
+ "required": [
38
+ "name",
39
+ "status"
40
+ ],
41
+ "title": "BenchmarkStatusResponse",
42
+ "type": "object",
43
+ "x-contract-version": "0.4.1"
44
+ }
@@ -134,6 +134,14 @@
134
134
  "title": "Dashboard Url",
135
135
  "type": "string"
136
136
  },
137
+ "errors": {
138
+ "description": "Why episodes or the run failed, so an incomplete report says why",
139
+ "items": {
140
+ "type": "string"
141
+ },
142
+ "title": "Errors",
143
+ "type": "array"
144
+ },
137
145
  "incomplete": {
138
146
  "anyOf": [
139
147
  {
@@ -33,6 +33,7 @@ from sequence_base.contract.act import (
33
33
  )
34
34
  from sequence_base.contract.benchmarks import (
35
35
  BenchmarkRegisterRequest,
36
+ BenchmarkStatusResponse,
36
37
  BenchmarkSpec,
37
38
  Conditions,
38
39
  RenderSpec,
@@ -153,7 +154,10 @@ INSTANCES: dict[str, BaseModel] = {
153
154
  bindings={SeqFlags.SETUP: "setup", SeqFlags.RESET: "reset",
154
155
  SeqFlags.CHECK: "check", SeqFlags.SCORE: "score"}),
155
156
  "BenchmarkRegisterRequest": BenchmarkRegisterRequest(name="libero", image=_IMG, conditions=_COND,
156
- max_steps=400, handler_ref="m:B"),
157
+ max_steps=400, handler_ref="m:B",
158
+ code=CodeBundle.from_bytes(b"bench source"),
159
+ suite_of={"pick": "spatial"}, action_contract=_AC),
160
+ "BenchmarkStatusResponse": BenchmarkStatusResponse(name="libero", status=DeploymentState.READY),
157
161
  "EvalRequest": EvalRequest(model="pi05", benchmark="libero"),
158
162
  "ClampInfo": ClampInfo(limit="account_quota", requested=8, granted=4),
159
163
  "Estimate": _EST,
@@ -444,7 +448,7 @@ def test_eval_report_metrics_passthrough_no_overall_sr():
444
448
  assert "success_rate" not in EvalReport.model_fields
445
449
  assert EvalReport.model_fields["metrics"].annotation == dict[str, MetricAgg]
446
450
  assert set(EvalReport.model_fields) == {
447
- "status", "metrics", "cost_usd", "dashboard_url", "adapter_lossy", "videos", "incomplete"}
451
+ "status", "metrics", "cost_usd", "dashboard_url", "adapter_lossy", "videos", "incomplete", "errors"}
448
452
  rep = EvalReport(status=EvalStatus.COMPLETED,
449
453
  metrics={"success": MetricAgg(overall=0.5, n=4),
450
454
  "time_to_grasp": MetricAgg(overall=2.1, n=4)},
File without changes
File without changes