sequence-base 0.3.29__tar.gz → 0.4.0__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.29 → sequence_base-0.4.0}/PKG-INFO +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/README.md +4 -5
- {sequence_base-0.3.29 → sequence_base-0.4.0}/pyproject.toml +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/__init__.py +1 -2
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/constants/version.py +2 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/__init__.py +1 -2
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/accounts.py +1 -16
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/connect.py +0 -2
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/deployments.py +5 -18
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/errors.py +0 -10
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/flags.py +0 -3
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/policy.py +11 -5
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/errors/transport.py +2 -4
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/obs/rid.py +0 -4
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schema_export.py +0 -2
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ActRequest.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ActResponse.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ActionChunk.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ActionContract.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ActionStep.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/AdapterTransform.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/AddLocal.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Autoscaler.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/BenchmarkSpec.json +2 -2
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/BootstrapResponse.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Camera.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ClampInfo.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/CodeBundle.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Concurrency.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Conditions.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ConnectRequest.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ConnectResponse.json +1 -20
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/DeploymentAccepted.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/DeploymentPolicy.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/DeploymentRequest.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Embodiment.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ErrorBody.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ErrorCodes.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Estimate.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/EvalReport.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/EvalRequest.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/EvalResponse.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ImageFrame.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ImageSpec.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ImageStepApt.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ImageStepEnv.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ImageStepRun.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ImageStepUvPip.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/InferParam.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Lease.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/LossyTransform.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/MetricAgg.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Observation.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/ObservationContract.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/PolicyRegistration.json +2 -2
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/PolicySpec.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Proprioception.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/RenderSpec.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Resources.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/RolloutResult.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/SecretCreateRequest.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/SecretInfo.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/SecretRef.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/SeqFlags.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Step.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/SuiteAgg.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/TaskAgg.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Timeouts.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/UploadTarget.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/Variant.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/VolumeAttach.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/VolumeFile.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/VolumeInfo.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/VolumeMount.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/VolumeRef.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/schemas/WarmingError.json +1 -1
- sequence_base-0.3.29/sequence_base/constants/env.py +0 -7
- sequence_base-0.3.29/sequence_base/schemas/UsageReport.json +0 -38
- {sequence_base-0.3.29 → sequence_base-0.4.0}/.gitignore +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/auth.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/codec/__init__.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/codec/image.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/constants/__init__.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/constants/headers.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/act.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/benchmarks.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/eval.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/io.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/templates.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/volumes.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/contract/wire.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/errors/__init__.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/obs/__init__.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/obs/log.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/presets/__init__.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/presets/robot_arm.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/sequence_base/telemetry/__init__.py +0 -0
- {sequence_base-0.3.29 → sequence_base-0.4.0}/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.
|
|
3
|
+
Version: 0.4.0
|
|
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.10
|
|
6
6
|
Requires-Dist: pydantic>=2.0
|
|
@@ -14,13 +14,12 @@ from sequence_base import TransportWarming, TransportOverloaded # error taxonom
|
|
|
14
14
|
```
|
|
15
15
|
sequence_base/
|
|
16
16
|
contract/ act.py — Observation / ActionChunk / ImageFrame / Proprioception / ActionSpace / ActionStep
|
|
17
|
-
|
|
17
|
+
· sdk + gateway + container
|
|
18
18
|
obs/ rid.py (HEADER, new_rid, clean) · log.py (log, Timer) · sdk + gateway + container
|
|
19
19
|
errors/ transport.py (Warming / Rejected / Overloaded / Unavailable) · gateway + container
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
telemetry/ [P1] events.py — container→gateway event shapes
|
|
20
|
+
constants/ headers.py · version.py · all three
|
|
21
|
+
codec/ [P1] image.py (encode/decode) — sdk encodes, container decodes; MUST match
|
|
22
|
+
telemetry/ [P1] events.py — the cold-start Stage vocabulary a worker logs
|
|
24
23
|
```
|
|
25
24
|
|
|
26
25
|
## The one rule for what goes in here
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sequence-base"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.0"
|
|
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"]
|
|
@@ -89,7 +89,6 @@ from sequence_base.contract import (
|
|
|
89
89
|
SuiteAgg,
|
|
90
90
|
TaskAgg,
|
|
91
91
|
Timeouts,
|
|
92
|
-
UsageReport,
|
|
93
92
|
Variant,
|
|
94
93
|
VolumeAttach,
|
|
95
94
|
VolumeMount,
|
|
@@ -142,7 +141,7 @@ __all__ = [
|
|
|
142
141
|
"EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
|
|
143
142
|
"AdapterKind", "AdapterTransform",
|
|
144
143
|
|
|
145
|
-
"SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse",
|
|
144
|
+
"SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse",
|
|
146
145
|
|
|
147
146
|
"VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse", "VolumeInfo", "parse_vol",
|
|
148
147
|
|
|
@@ -90,7 +90,6 @@ from sequence_base.contract.accounts import (
|
|
|
90
90
|
SecretCreateRequest,
|
|
91
91
|
SecretInfo,
|
|
92
92
|
SecretRef,
|
|
93
|
-
UsageReport,
|
|
94
93
|
)
|
|
95
94
|
|
|
96
95
|
|
|
@@ -134,7 +133,7 @@ __all__ = [
|
|
|
134
133
|
"EvalStatus", "SuiteAgg", "TaskAgg", "MetricAgg", "LossyTransform", "EvalReport",
|
|
135
134
|
"AdapterKind", "AdapterTransform",
|
|
136
135
|
|
|
137
|
-
"SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse",
|
|
136
|
+
"SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse",
|
|
138
137
|
|
|
139
138
|
"MAX_FILES", "MAX_UPLOAD_BYTES", "VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse",
|
|
140
139
|
"VolumeInfo", "check_volume_name", "parse_vol",
|
|
@@ -7,8 +7,7 @@ Secret-leak rule, mechanically checkable (goal 15). Two kinds of secret:
|
|
|
7
7
|
(b) user Secret-Manager values. May appear in the WRITE direction only:
|
|
8
8
|
SecretCreateRequest.env, BootstrapResponse.env (injected into the worker subprocess).
|
|
9
9
|
These four fields are the entire allow-list for carrying a plaintext secret value. Everything returned
|
|
10
|
-
to a client
|
|
11
|
-
eval report, /act response) exposes only names / env_keys — never a value-bearing field.
|
|
10
|
+
to a client or written to a report/log (SecretRef, SecretInfo, eval report, /act response) exposes only names / env_keys — never a value-bearing field.
|
|
12
11
|
"""
|
|
13
12
|
from __future__ import annotations
|
|
14
13
|
|
|
@@ -23,7 +22,6 @@ __all__ = [
|
|
|
23
22
|
"SecretCreateRequest",
|
|
24
23
|
"SecretInfo",
|
|
25
24
|
"BootstrapResponse",
|
|
26
|
-
"UsageReport",
|
|
27
25
|
]
|
|
28
26
|
|
|
29
27
|
|
|
@@ -78,16 +76,3 @@ class BootstrapResponse(BaseModel):
|
|
|
78
76
|
|
|
79
77
|
weights_uri: str | None = None
|
|
80
78
|
lease: Lease
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
class UsageReport(BaseModel):
|
|
84
|
-
"""A worker's metering report, sent as it serves. Carries counts only, no secrets.
|
|
85
|
-
This usage shape is defined here (sequence-base) once, so gateway and worker cannot drift."""
|
|
86
|
-
|
|
87
|
-
model_config = ConfigDict(extra="forbid")
|
|
88
|
-
|
|
89
|
-
deployment_id: str
|
|
90
|
-
window_start: datetime
|
|
91
|
-
window_end: datetime
|
|
92
|
-
requests: int
|
|
93
|
-
controlled_seconds: float
|
|
@@ -51,8 +51,6 @@ class ConnectResponse(BaseModel):
|
|
|
51
51
|
cert_fingerprint: str = Field(..., description="Self-signed cert fingerprint the SDK pins")
|
|
52
52
|
direct_secret: str = Field(..., description="Bearer for the worker /act; valid within the lease")
|
|
53
53
|
lease: Lease
|
|
54
|
-
warming: bool = Field(default=False, description="True → worker still warming; see warming_eta_s")
|
|
55
|
-
warming_eta_s: int | None = Field(default=None, description="Seconds until warm, when warming")
|
|
56
54
|
|
|
57
55
|
action: ActionContract | None = None
|
|
58
56
|
observation: ObservationContract | None = None
|
|
@@ -21,8 +21,6 @@ from typing import Literal
|
|
|
21
21
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
22
22
|
|
|
23
23
|
from sequence_base.contract.accounts import SecretRef
|
|
24
|
-
from sequence_base.contract.templates import TEMPLATE_SCHEME, parse_template
|
|
25
|
-
from sequence_base.contract.volumes import VOL_SCHEME, parse_vol
|
|
26
24
|
from sequence_base.contract.io import Embodiment, ObservationContract
|
|
27
25
|
from sequence_base.contract.policy import (
|
|
28
26
|
KIND_NAME,
|
|
@@ -304,9 +302,10 @@ class DeploymentRequest(BaseModel):
|
|
|
304
302
|
|
|
305
303
|
@model_validator(mode="after")
|
|
306
304
|
def _weights_have_an_origin(self) -> "DeploymentRequest":
|
|
307
|
-
"""The checkpoint the build provisions: an official template://, an hf:// repo or an
|
|
308
|
-
|
|
309
|
-
|
|
305
|
+
"""The checkpoint the build provisions, when there is one: an official template://, an hf:// repo or an
|
|
306
|
+
uploaded vol:// volume, never empty. PolicySpec already enforces this for SDK-authored deploys; this holds it
|
|
307
|
+
for any POSTed body."""
|
|
308
|
+
from sequence_base.contract.policy import check_weights_parts, check_weights_uri
|
|
310
309
|
|
|
311
310
|
if self.weights is None:
|
|
312
311
|
if self.weights_name or self.extra_weights:
|
|
@@ -315,25 +314,13 @@ class DeploymentRequest(BaseModel):
|
|
|
315
314
|
check_weights_parts(self.weights_name, dict(self.extra_weights or {}))
|
|
316
315
|
for what, ref in [("weights.uri", self.weights)] + [(f"extra_weights[{n!r}].uri", r)
|
|
317
316
|
for n, r in (self.extra_weights or {}).items()]:
|
|
318
|
-
|
|
319
|
-
if uri.startswith(TEMPLATE_SCHEME):
|
|
320
|
-
parse_template(uri)
|
|
321
|
-
continue
|
|
322
|
-
if uri.startswith(VOL_SCHEME):
|
|
323
|
-
parse_vol(uri)
|
|
324
|
-
continue
|
|
325
|
-
if not any(uri.startswith(s) and len(uri) > len(s) for s in _WEIGHTS_SCHEMES):
|
|
326
|
-
raise ValueError(f"{what} must be a template://<name> official template, an hf://org/model repo or "
|
|
327
|
-
"a vol://<name> volume (gs://, s3:// and https:// are still accepted until they "
|
|
328
|
-
"are removed)")
|
|
317
|
+
check_weights_uri(ref.uri.strip(), what)
|
|
329
318
|
return self
|
|
330
319
|
|
|
331
320
|
|
|
332
321
|
|
|
333
322
|
_NAME = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]{0,63}")
|
|
334
323
|
|
|
335
|
-
_WEIGHTS_SCHEMES = ("gs://", "hf://", "s3://", "https://")
|
|
336
|
-
|
|
337
324
|
|
|
338
325
|
class DeploymentAccepted(BaseModel):
|
|
339
326
|
"""202 — the build is async; the id comes back first, status pinned to `building`."""
|
|
@@ -111,16 +111,6 @@ class ErrorBody(BaseModel):
|
|
|
111
111
|
|
|
112
112
|
if not isinstance(data, dict):
|
|
113
113
|
return data
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if "message" in data and "detail" not in data:
|
|
118
|
-
data = {k: v for k, v in data.items() if k != "message"} | {"detail": data["message"]}
|
|
119
|
-
if "eta_s" in data:
|
|
120
|
-
eta = data["eta_s"]
|
|
121
|
-
data = {k: v for k, v in data.items() if k != "eta_s"}
|
|
122
|
-
if eta is not None:
|
|
123
|
-
data["details"] = {**data.get("details", {}), "eta_s": eta}
|
|
124
114
|
code = data.get("code")
|
|
125
115
|
if code is None:
|
|
126
116
|
default = cls.model_fields["code"].default
|
|
@@ -61,9 +61,6 @@ BENCHMARK_BINDABLE: frozenset[SeqFlags] = frozenset(
|
|
|
61
61
|
BENCHMARK_BATCHED: frozenset[SeqFlags] = frozenset({SeqFlags.OBSERVE, SeqFlags.STEP})
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
DEPRECATED_FLAGS: frozenset[SeqFlags] = frozenset({SeqFlags.ROLLOUT})
|
|
65
|
-
|
|
66
|
-
|
|
67
64
|
def seqflags_json_schema(contract_version: str) -> dict:
|
|
68
65
|
"""`SeqFlags` is an IntFlag, so `model_json_schema()` does not apply. Export it as an integer whose
|
|
69
66
|
named members are enumerated, with `x-flag-names` giving name→value for every member (WARMUP, PLAN and
|
|
@@ -251,7 +251,8 @@ MAX_WEIGHTS_PARTS = 8
|
|
|
251
251
|
|
|
252
252
|
def check_weights_uri(v: str, what: str = "weights") -> str:
|
|
253
253
|
"""A weights origin the build can provision: an official template://, an hf:// repo or an uploaded vol://
|
|
254
|
-
volume
|
|
254
|
+
volume. gs://, s3:// and https:// were removed in contract 0.5.0, after a release that warned for 7 days: files
|
|
255
|
+
from a bucket or a URL are uploaded once as a volume."""
|
|
255
256
|
|
|
256
257
|
if v.startswith("template://"):
|
|
257
258
|
from sequence_base.contract.templates import parse_template
|
|
@@ -262,12 +263,17 @@ def check_weights_uri(v: str, what: str = "weights") -> str:
|
|
|
262
263
|
from sequence_base.contract.volumes import parse_vol
|
|
263
264
|
parse_vol(v)
|
|
264
265
|
return v
|
|
266
|
+
if v.startswith("hf://") and len(v) > len("hf://"):
|
|
267
|
+
return v
|
|
268
|
+
if v.startswith(LEGACY_WEIGHTS_SCHEMES):
|
|
269
|
+
|
|
270
|
+
raise ValueError(f"{what}: weights from your own storage bucket or an https URL are no longer supported; upload "
|
|
271
|
+
"the files once as a volume (seq volume put <name> <dir>) and use vol://<name>, or an hf:// repo")
|
|
272
|
+
raise ValueError(f"{what} must be a template:// official template, an hf:// repo or a vol:// volume")
|
|
273
|
+
|
|
265
274
|
|
|
266
275
|
|
|
267
|
-
|
|
268
|
-
raise ValueError(f"{what} must be a template:// official template, an hf:// repo or a vol:// volume "
|
|
269
|
-
"(gs://, s3:// and https:// are still accepted until they are removed)")
|
|
270
|
-
return v
|
|
276
|
+
LEGACY_WEIGHTS_SCHEMES = ("gs://", "s3://", "https://", "http://")
|
|
271
277
|
|
|
272
278
|
|
|
273
279
|
def check_weights_parts(weights_name: str | None, extra: dict) -> None:
|
|
@@ -12,13 +12,11 @@ class TransportUnavailable(RuntimeError):
|
|
|
12
12
|
|
|
13
13
|
class TransportWarming(RuntimeError):
|
|
14
14
|
"""Model loading, not ready yet → 503 + Retry-After. Distinct from Unavailable: it WILL succeed
|
|
15
|
-
shortly and the only useful action is to wait `eta_s`.
|
|
16
|
-
running so the retry lands on a hot worker."""
|
|
15
|
+
shortly and the only useful action is to wait `eta_s`."""
|
|
17
16
|
|
|
18
|
-
def __init__(self, message: str, eta_s: float
|
|
17
|
+
def __init__(self, message: str, eta_s: float) -> None:
|
|
19
18
|
super().__init__(message)
|
|
20
19
|
self.eta_s = eta_s
|
|
21
|
-
self.job_id = job_id
|
|
22
20
|
|
|
23
21
|
|
|
24
22
|
class TransportRejected(RuntimeError):
|
|
@@ -25,7 +25,6 @@ from sequence_base.contract.accounts import (
|
|
|
25
25
|
SecretCreateRequest,
|
|
26
26
|
SecretInfo,
|
|
27
27
|
SecretRef,
|
|
28
|
-
UsageReport,
|
|
29
28
|
)
|
|
30
29
|
from sequence_base.contract.act import (
|
|
31
30
|
ActionChunk,
|
|
@@ -173,7 +172,6 @@ WIRE_MODELS: dict[str, type[BaseModel]] = {
|
|
|
173
172
|
"SecretCreateRequest": SecretCreateRequest,
|
|
174
173
|
"SecretInfo": SecretInfo,
|
|
175
174
|
"BootstrapResponse": BootstrapResponse,
|
|
176
|
-
"UsageReport": UsageReport,
|
|
177
175
|
|
|
178
176
|
"VolumeFile": VolumeFile,
|
|
179
177
|
"VolumeUploadRequest": VolumeUploadRequest,
|
|
@@ -297,7 +297,7 @@
|
|
|
297
297
|
],
|
|
298
298
|
"title": "SeqFlags",
|
|
299
299
|
"type": "integer",
|
|
300
|
-
"x-contract-version": "0.
|
|
300
|
+
"x-contract-version": "0.5.0",
|
|
301
301
|
"x-flag-names": {
|
|
302
302
|
"CHECK": 65536,
|
|
303
303
|
"INFER": 16,
|
|
@@ -518,5 +518,5 @@
|
|
|
518
518
|
],
|
|
519
519
|
"title": "BenchmarkSpec",
|
|
520
520
|
"type": "object",
|
|
521
|
-
"x-contract-version": "0.
|
|
521
|
+
"x-contract-version": "0.5.0"
|
|
522
522
|
}
|
|
@@ -274,25 +274,6 @@
|
|
|
274
274
|
],
|
|
275
275
|
"default": null
|
|
276
276
|
},
|
|
277
|
-
"warming": {
|
|
278
|
-
"default": false,
|
|
279
|
-
"description": "True → worker still warming; see warming_eta_s",
|
|
280
|
-
"title": "Warming",
|
|
281
|
-
"type": "boolean"
|
|
282
|
-
},
|
|
283
|
-
"warming_eta_s": {
|
|
284
|
-
"anyOf": [
|
|
285
|
-
{
|
|
286
|
-
"type": "integer"
|
|
287
|
-
},
|
|
288
|
-
{
|
|
289
|
-
"type": "null"
|
|
290
|
-
}
|
|
291
|
-
],
|
|
292
|
-
"default": null,
|
|
293
|
-
"description": "Seconds until warm, when warming",
|
|
294
|
-
"title": "Warming Eta S"
|
|
295
|
-
},
|
|
296
277
|
"worker_url": {
|
|
297
278
|
"description": "Worker static-IP direct URL, e.g. https://<ip>:8080",
|
|
298
279
|
"title": "Worker Url",
|
|
@@ -307,5 +288,5 @@
|
|
|
307
288
|
],
|
|
308
289
|
"title": "ConnectResponse",
|
|
309
290
|
"type": "object",
|
|
310
|
-
"x-contract-version": "0.
|
|
291
|
+
"x-contract-version": "0.5.0"
|
|
311
292
|
}
|
|
@@ -763,7 +763,7 @@
|
|
|
763
763
|
],
|
|
764
764
|
"title": "SeqFlags",
|
|
765
765
|
"type": "integer",
|
|
766
|
-
"x-contract-version": "0.
|
|
766
|
+
"x-contract-version": "0.5.0",
|
|
767
767
|
"x-flag-names": {
|
|
768
768
|
"CHECK": 65536,
|
|
769
769
|
"INFER": 16,
|
|
@@ -867,5 +867,5 @@
|
|
|
867
867
|
],
|
|
868
868
|
"title": "PolicyRegistration",
|
|
869
869
|
"type": "object",
|
|
870
|
-
"x-contract-version": "0.
|
|
870
|
+
"x-contract-version": "0.5.0"
|
|
871
871
|
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"""SEQ_* environment variable NAMES — a single source. Values live in ~/.config/sequences/, never here."""
|
|
2
|
-
|
|
3
|
-
DIRECT_SECRET = "SEQ_DIRECT_SECRET"
|
|
4
|
-
INTERNAL_SECRET = "SEQ_INTERNAL_SECRET"
|
|
5
|
-
GATEWAY_URL = "SEQ_GATEWAY_URL"
|
|
6
|
-
VOLUME_ROOT = "SEQ_VOLUME_ROOT"
|
|
7
|
-
MANIFEST = "SEQ_MANIFEST"
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"additionalProperties": false,
|
|
3
|
-
"description": "A worker's metering report, sent as it serves. Carries counts only, no secrets.\nThis usage shape is defined here (sequence-base) once, so gateway and worker cannot drift.",
|
|
4
|
-
"properties": {
|
|
5
|
-
"controlled_seconds": {
|
|
6
|
-
"title": "Controlled Seconds",
|
|
7
|
-
"type": "number"
|
|
8
|
-
},
|
|
9
|
-
"deployment_id": {
|
|
10
|
-
"title": "Deployment Id",
|
|
11
|
-
"type": "string"
|
|
12
|
-
},
|
|
13
|
-
"requests": {
|
|
14
|
-
"title": "Requests",
|
|
15
|
-
"type": "integer"
|
|
16
|
-
},
|
|
17
|
-
"window_end": {
|
|
18
|
-
"format": "date-time",
|
|
19
|
-
"title": "Window End",
|
|
20
|
-
"type": "string"
|
|
21
|
-
},
|
|
22
|
-
"window_start": {
|
|
23
|
-
"format": "date-time",
|
|
24
|
-
"title": "Window Start",
|
|
25
|
-
"type": "string"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
"required": [
|
|
29
|
-
"deployment_id",
|
|
30
|
-
"window_start",
|
|
31
|
-
"window_end",
|
|
32
|
-
"requests",
|
|
33
|
-
"controlled_seconds"
|
|
34
|
-
],
|
|
35
|
-
"title": "UsageReport",
|
|
36
|
-
"type": "object",
|
|
37
|
-
"x-contract-version": "0.4.25"
|
|
38
|
-
}
|
|
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
|