sequence-base 0.3.0__tar.gz → 0.3.2__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.
- {sequence_base-0.3.0 → sequence_base-0.3.2}/PKG-INFO +1 -1
- {sequence_base-0.3.0 → sequence_base-0.3.2}/pyproject.toml +1 -1
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/__init__.py +3 -2
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/__init__.py +2 -1
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/benchmarks.py +23 -1
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/deployments.py +28 -1
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/eval.py +3 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schema_export.py +2 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/BenchmarkRegisterRequest.json +95 -0
- sequence_base-0.3.2/sequence_base/schemas/BenchmarkStatusResponse.json +44 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/EvalReport.json +8 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/tests/test_contracts.py +38 -2
- {sequence_base-0.3.0 → sequence_base-0.3.2}/.github/workflows/ci.yml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/.gitignore +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/README.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/README.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/REVIEW.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/START.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/accounts.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/billing.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/build/BUILD_LOG.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/build/goal_sha256.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/build/gs-build-wave.js +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/build/gs-spec-goals.js +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/container.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/contracts.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/deploy/PLAN.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/deploy/PROD_REORG.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/deploy/SCHEMA_COMPAT.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/deploy/archive/sequences-gw.genseq-506918.20261001.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/eval.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/gateway.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/A1.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/A2.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/A3.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/C1.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/C2.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/C3.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/C4.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/C5.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/G1.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/G2.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/G3.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/G4.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/G5.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/O1.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/O2.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/O3.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/O4.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/O5.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/R1.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/R2.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/R3.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/S1.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/S2.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/S3.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/S4.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/S5.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/S6.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/V1-storage.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/V2-user-quotas.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/W0.1.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/goals/W0.2.yaml +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/README.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/architecture.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/connect.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/cost.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/custom-domain.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/debugging.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/goals.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/limits.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/plan.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/white-label.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/modal/wiring.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/observability.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/references.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/docs/platform/sdk.md +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/auth.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/codec/__init__.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/codec/image.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/codec/resize.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/constants/__init__.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/constants/env.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/constants/headers.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/constants/version.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/accounts.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/act.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/connect.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/errors.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/flags.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/contract/policy.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/errors/__init__.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/errors/transport.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/obs/__init__.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/obs/log.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/obs/rid.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ActionChunk.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ActionContract.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ActionStep.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/AdapterTransform.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Autoscaler.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/BenchmarkSpec.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/BootstrapResponse.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ClampInfo.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/CodeBundle.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Concurrency.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Conditions.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ConnectRequest.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ConnectResponse.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/DeploymentAccepted.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/DeploymentPolicy.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/DeploymentRequest.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/DeploymentStatusResponse.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ErrorBody.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Estimate.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/EvalDryRunResponse.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/EvalRequest.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/EvalResponse.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ImageFrame.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ImageSpec.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ImageStepApt.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ImageStepEnv.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ImageStepRun.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/ImageStepUvPip.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Lease.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/LossyTransform.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/MetricAgg.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Observation.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/PolicyRegistration.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/PolicySpec.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Proprioception.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/RenderSpec.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Resources.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/RolloutResult.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/SecretCreateRequest.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/SecretInfo.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/SecretRef.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/SeqFlags.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Step.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/SuiteAgg.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/TaskAgg.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Timeouts.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/UsageReport.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/Variant.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/VolumeAttach.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/VolumeMount.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/VolumeRef.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/WarmingError.json +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/telemetry/__init__.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/telemetry/events.py +0 -0
- {sequence_base-0.3.0 → sequence_base-0.3.2}/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.
|
|
3
|
+
Version: 0.3.2
|
|
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.
|
|
3
|
+
version = "0.3.2"
|
|
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.
|
|
135
|
+
__version__ = "0.3.2"
|
|
@@ -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
|
|
@@ -14,10 +14,11 @@ from __future__ import annotations
|
|
|
14
14
|
import base64
|
|
15
15
|
import binascii
|
|
16
16
|
import hashlib
|
|
17
|
+
import re
|
|
17
18
|
from enum import Enum
|
|
18
19
|
from typing import Literal
|
|
19
20
|
|
|
20
|
-
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
21
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
21
22
|
|
|
22
23
|
from sequence_base.contract.accounts import SecretRef
|
|
23
24
|
from sequence_base.contract.policy import (
|
|
@@ -168,6 +169,32 @@ class DeploymentRequest(BaseModel):
|
|
|
168
169
|
concurrency: Concurrency = Field(default_factory=lambda: Concurrency(max_inputs=1, target_inputs=1))
|
|
169
170
|
timeouts: Timeouts | None = None
|
|
170
171
|
|
|
172
|
+
@field_validator("name")
|
|
173
|
+
@classmethod
|
|
174
|
+
def _name_is_a_slug(cls, v: str) -> str:
|
|
175
|
+
"""The name is how a robot addresses the model (`connect(model=name)`) and how the console lists it, so
|
|
176
|
+
it is a slug: letters, digits, `.`, `_`, `-`, starting with a letter or digit, at most 64 characters.
|
|
177
|
+
A raw POST once registered "hfcheck-missing hf://nobody/x" — a space, a scheme and a slash in a name.
|
|
178
|
+
{LIVE 2026-10-02: THREE DEPLOYMENTS NAMED "<SLUG> HF://…" WERE ACCEPTED 202 WITH AN EMPTY WEIGHTS URI}"""
|
|
179
|
+
if not _NAME.fullmatch(v):
|
|
180
|
+
raise ValueError("name must be 1-64 letters, digits, '.', '_' or '-', starting with a letter or digit")
|
|
181
|
+
return v
|
|
182
|
+
|
|
183
|
+
@model_validator(mode="after")
|
|
184
|
+
def _weights_have_an_origin(self) -> "DeploymentRequest":
|
|
185
|
+
"""The checkpoint the build provisions: a gs:// prefix or an hf:// repo, never empty. PolicySpec already
|
|
186
|
+
enforces this for SDK-authored deploys; this holds it for a body POSTed by anything else."""
|
|
187
|
+
uri = self.weights.uri.strip()
|
|
188
|
+
if not any(uri.startswith(s) and len(uri) > len(s) for s in _WEIGHTS_SCHEMES):
|
|
189
|
+
raise ValueError("weights.uri must be a gs://bucket/prefix or an hf://org/model checkpoint")
|
|
190
|
+
return self
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
# A deployment name: what `connect(model=...)` and the console address. {DeploymentRequest._name_is_a_slug}
|
|
194
|
+
_NAME = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]{0,63}")
|
|
195
|
+
# The origins the build knows how to provision weights from.
|
|
196
|
+
_WEIGHTS_SCHEMES = ("gs://", "hf://")
|
|
197
|
+
|
|
171
198
|
|
|
172
199
|
class DeploymentAccepted(BaseModel):
|
|
173
200
|
"""202 — the build is async; the id comes back first, status pinned to `building`."""
|
|
@@ -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,
|
{sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/BenchmarkRegisterRequest.json
RENAMED
|
@@ -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)},
|
|
@@ -627,3 +631,35 @@ def test_code_bundle_rejects_tampering_bad_base64_and_oversize():
|
|
|
627
631
|
def test_deploy_body_without_code_is_still_valid():
|
|
628
632
|
# A handler installed by the image itself needs no bundle.
|
|
629
633
|
assert INSTANCES["DeploymentRequest"].code is None
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
# ── a POSTed deployment is held to what the SDK already guarantees ───────────────────────────────────────
|
|
637
|
+
def _deploy_body(**over):
|
|
638
|
+
body = {"name": "pi05-droid", "image": {"base": "python:3.11-slim"},
|
|
639
|
+
"weights": {"uri": "gs://bkt/ckpt", "mount": "/data"},
|
|
640
|
+
"resources": {"gpu": ["L4"], "cpu": 4, "memory_gb": 16},
|
|
641
|
+
"policy": {"handler_ref": "p:P", "action": {"robot": "r", "action_space": "joint_delta",
|
|
642
|
+
"action_dim": 8, "control_frequency_hz": 15.0}}}
|
|
643
|
+
body.update(over)
|
|
644
|
+
return body
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
@pytest.mark.parametrize("name", ["Pi05Droid", "pi05-droid", "my_policy.v2", "a"])
|
|
648
|
+
def test_a_deployment_name_is_a_slug(name):
|
|
649
|
+
from sequence_base import DeploymentRequest
|
|
650
|
+
assert DeploymentRequest.model_validate(_deploy_body(name=name)).name == name
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
@pytest.mark.parametrize("name", ["hfcheck-missing hf://nobody/x", "", "-lead", "a/b", "x" * 65, "na me"])
|
|
654
|
+
def test_a_name_with_spaces_slashes_or_schemes_is_refused(name):
|
|
655
|
+
"""{LIVE 2026-10-02: "HFCHECK-MISSING HF://…" WAS ACCEPTED AS A DEPLOYMENT NAME}"""
|
|
656
|
+
from sequence_base import DeploymentRequest
|
|
657
|
+
with pytest.raises(ValueError):
|
|
658
|
+
DeploymentRequest.model_validate(_deploy_body(name=name))
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
@pytest.mark.parametrize("uri", ["", " ", "gs://", "hf://", "s3://bkt/x", "/local/path"])
|
|
662
|
+
def test_weights_need_a_gs_or_hf_origin(uri):
|
|
663
|
+
from sequence_base import DeploymentRequest
|
|
664
|
+
with pytest.raises(ValueError):
|
|
665
|
+
DeploymentRequest.model_validate(_deploy_body(weights={"uri": uri, "mount": "/data"}))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sequence_base-0.3.0 → sequence_base-0.3.2}/sequence_base/schemas/DeploymentStatusResponse.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|