sequence-base 0.3.14__tar.gz → 0.3.16__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.14 → sequence_base-0.3.16}/PKG-INFO +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/pyproject.toml +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/__init__.py +4 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/constants/version.py +2 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/__init__.py +5 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/deployments.py +9 -5
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/errors.py +10 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/policy.py +11 -3
- sequence_base-0.3.16/sequence_base/contract/templates.py +33 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ActionChunk.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ActionContract.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ActionStep.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/AdapterTransform.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Autoscaler.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/BenchmarkSpec.json +2 -2
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/BootstrapResponse.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Camera.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ClampInfo.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/CodeBundle.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Concurrency.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Conditions.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ConnectRequest.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ConnectResponse.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/DeploymentAccepted.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/DeploymentPolicy.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/DeploymentRequest.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Embodiment.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ErrorBody.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ErrorCodes.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Estimate.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/EvalReport.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/EvalRequest.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/EvalResponse.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ImageFrame.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ImageSpec.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ImageStepApt.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ImageStepEnv.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ImageStepRun.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ImageStepUvPip.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/InferParam.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Lease.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/LossyTransform.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/MetricAgg.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Observation.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/ObservationContract.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/PolicyRegistration.json +3 -3
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/PolicySpec.json +2 -2
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Proprioception.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/RenderSpec.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Resources.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/RolloutResult.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/SecretCreateRequest.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/SecretInfo.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/SecretRef.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/SeqFlags.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Step.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/SuiteAgg.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/TaskAgg.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Timeouts.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/UploadTarget.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/UsageReport.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/Variant.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/VolumeAttach.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/VolumeFile.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/VolumeInfo.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/VolumeMount.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/VolumeRef.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schemas/WarmingError.json +1 -1
- {sequence_base-0.3.14 → sequence_base-0.3.16}/.gitignore +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/README.md +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/auth.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/codec/__init__.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/codec/image.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/codec/resize.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/constants/__init__.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/constants/env.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/constants/headers.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/accounts.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/act.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/benchmarks.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/connect.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/eval.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/flags.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/io.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/contract/volumes.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/errors/__init__.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/errors/transport.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/obs/__init__.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/obs/log.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/obs/rid.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/schema_export.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/sequence_base/telemetry/__init__.py +0 -0
- {sequence_base-0.3.14 → sequence_base-0.3.16}/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.
|
|
3
|
+
Version: 0.3.16
|
|
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.16"
|
|
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"]
|
|
@@ -24,6 +24,8 @@ from sequence_base.contract import ( # noqa: F401 (re-export surface)
|
|
|
24
24
|
VolumeUploadRequest,
|
|
25
25
|
VolumeUploadResponse,
|
|
26
26
|
parse_vol,
|
|
27
|
+
TEMPLATE_SCHEME,
|
|
28
|
+
parse_template,
|
|
27
29
|
ActionChunk,
|
|
28
30
|
ActionContract,
|
|
29
31
|
ActionSpace,
|
|
@@ -139,6 +141,8 @@ __all__ = [
|
|
|
139
141
|
"SecretRef", "SecretCreateRequest", "SecretInfo", "BootstrapResponse", "UsageReport",
|
|
140
142
|
# contract 7 — volumes (uploaded checkpoints and datasets)
|
|
141
143
|
"VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse", "VolumeInfo", "parse_vol",
|
|
144
|
+
# official template weights
|
|
145
|
+
"TEMPLATE_SCHEME", "parse_template",
|
|
142
146
|
# error bodies + version
|
|
143
147
|
"ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status", "CONTRACT_VERSION",
|
|
144
148
|
# obs
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
# across deployments / repos can tell which version of a shape it is validating against. MUST change
|
|
5
5
|
# whenever any shared wire shape changes (a field added / removed / retyped) — that is what makes
|
|
6
6
|
# contract evolution mechanically detectable instead of eyeballed. Bump on any shape change.
|
|
7
|
-
CONTRACT_VERSION = "0.4.
|
|
7
|
+
CONTRACT_VERSION = "0.4.13" # 0.4.12 -> 0.4.13: template://<name>[@v<n>] — official template weights (parse_template); gs:// / s3:// / https:// still accepted until their removal
|
|
8
|
+
# previous: 0.4.12 # 0.4.11 -> 0.4.12: one error definition — ErrorBody is every non-2xx body (detail, code, retryable, retry_after_s, request_id, hint, details), ErrorCode covers every case, ERRORS / ErrorCodes.json give each code its status, retryability, SDK class and CLI exit code
|
|
8
9
|
# previous: 0.4.11 # 0.4.10 -> 0.4.11: weights in named parts (weights_name, extra_weights)
|
|
9
10
|
# previous: 0.4.8 # 0.4.7 -> 0.4.8: ImageSpec.python, ImageStepRun.secrets, Resources.region, DeploymentRequest/BenchmarkRegisterRequest.image_context
|
|
10
11
|
# previous: 0.4.7 # 0.4.6 -> 0.4.7: ActionContract.bounds / max_delta / on_violation (action limits)
|
|
@@ -88,6 +88,9 @@ from sequence_base.contract.accounts import (
|
|
|
88
88
|
UsageReport,
|
|
89
89
|
)
|
|
90
90
|
|
|
91
|
+
# official template weights — template://<name>[@v<n>]
|
|
92
|
+
from sequence_base.contract.templates import TEMPLATE_SCHEME, parse_template
|
|
93
|
+
|
|
91
94
|
# contract 7 — volumes (uploaded checkpoints and datasets)
|
|
92
95
|
from sequence_base.contract.volumes import (
|
|
93
96
|
MAX_FILES,
|
|
@@ -128,6 +131,8 @@ __all__ = [
|
|
|
128
131
|
# contract 7
|
|
129
132
|
"MAX_FILES", "MAX_UPLOAD_BYTES", "VolumeFile", "VolumeUploadRequest", "UploadTarget", "VolumeUploadResponse",
|
|
130
133
|
"VolumeInfo", "check_volume_name", "parse_vol",
|
|
134
|
+
# official template weights
|
|
135
|
+
"TEMPLATE_SCHEME", "parse_template",
|
|
131
136
|
# errors
|
|
132
137
|
"ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status",
|
|
133
138
|
]
|
|
@@ -21,6 +21,7 @@ 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
|
|
24
25
|
from sequence_base.contract.volumes import VOL_SCHEME, parse_vol
|
|
25
26
|
from sequence_base.contract.io import Embodiment, ObservationContract
|
|
26
27
|
from sequence_base.contract.policy import (
|
|
@@ -225,21 +226,24 @@ class DeploymentRequest(BaseModel):
|
|
|
225
226
|
|
|
226
227
|
@model_validator(mode="after")
|
|
227
228
|
def _weights_have_an_origin(self) -> "DeploymentRequest":
|
|
228
|
-
"""The checkpoint the build provisions:
|
|
229
|
-
|
|
230
|
-
empty. PolicySpec already enforces this for SDK-authored deploys; this holds it for any POSTed body."""
|
|
229
|
+
"""The checkpoint the build provisions: an official template://, an hf:// repo or an uploaded vol:// volume —
|
|
230
|
+
and, until they are removed, a gs:// or s3:// prefix or an https:// file — never empty. PolicySpec already enforces this for SDK-authored deploys; this holds it for any POSTed body."""
|
|
231
231
|
from sequence_base.contract.policy import check_weights_parts
|
|
232
232
|
|
|
233
233
|
check_weights_parts(self.weights_name, dict(self.extra_weights or {}))
|
|
234
234
|
for what, ref in [("weights.uri", self.weights)] + [(f"extra_weights[{n!r}].uri", r)
|
|
235
235
|
for n, r in (self.extra_weights or {}).items()]:
|
|
236
236
|
uri = ref.uri.strip()
|
|
237
|
+
if uri.startswith(TEMPLATE_SCHEME):
|
|
238
|
+
parse_template(uri)
|
|
239
|
+
continue
|
|
237
240
|
if uri.startswith(VOL_SCHEME):
|
|
238
241
|
parse_vol(uri)
|
|
239
242
|
continue
|
|
240
243
|
if not any(uri.startswith(s) and len(uri) > len(s) for s in _WEIGHTS_SCHEMES):
|
|
241
|
-
raise ValueError(f"{what} must be a
|
|
242
|
-
"
|
|
244
|
+
raise ValueError(f"{what} must be a template://<name> official template, an hf://org/model repo or "
|
|
245
|
+
"a vol://<name> volume (gs://, s3:// and https:// are still accepted until they "
|
|
246
|
+
"are removed)")
|
|
243
247
|
return self
|
|
244
248
|
|
|
245
249
|
|
|
@@ -111,6 +111,16 @@ class ErrorBody(BaseModel):
|
|
|
111
111
|
# A subclass that fixes the code (WarmingError) is read through its default.
|
|
112
112
|
if not isinstance(data, dict):
|
|
113
113
|
return data
|
|
114
|
+
# The gateway's connect cold path still builds WarmingError(message=..., eta_s=...), and its image vendors
|
|
115
|
+
# whatever base is checked out, so the old arguments are read until deploy-only S3 moves it to detail /
|
|
116
|
+
# details. Delete these two branches once nothing passes them.
|
|
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}
|
|
114
124
|
code = data.get("code")
|
|
115
125
|
if code is None:
|
|
116
126
|
default = cls.model_fields["code"].default
|
|
@@ -138,7 +138,8 @@ class PolicySpec(BaseModel):
|
|
|
138
138
|
name: str
|
|
139
139
|
gpu: str | list[str] = Field(..., description="A GPU type, or a list = cross-provider fallback")
|
|
140
140
|
image: ImageSpec
|
|
141
|
-
weights: str = Field(..., description="Weights URI:
|
|
141
|
+
weights: str = Field(..., description="Weights URI: template:// (an official template), hf:// or vol:// (an "
|
|
142
|
+
"uploaded volume)")
|
|
142
143
|
volumes: dict[str, VolumeRef] = Field(default_factory=dict)
|
|
143
144
|
secrets: list[SecretRef] = Field(default_factory=list)
|
|
144
145
|
min_containers: int = 0
|
|
@@ -177,7 +178,13 @@ MAX_WEIGHTS_PARTS = 8
|
|
|
177
178
|
|
|
178
179
|
|
|
179
180
|
def check_weights_uri(v: str, what: str = "weights") -> str:
|
|
180
|
-
"""A weights origin the build can provision:
|
|
181
|
+
"""A weights origin the build can provision: an official template://, an hf:// repo or an uploaded vol://
|
|
182
|
+
volume — and, until they are removed, a gs:// or s3:// prefix or an https:// file."""
|
|
183
|
+
# template:// is an official template's checkpoint; the gateway resolves and pins its version at deploy.
|
|
184
|
+
if v.startswith("template://"):
|
|
185
|
+
from sequence_base.contract.templates import parse_template
|
|
186
|
+
parse_template(v)
|
|
187
|
+
return v
|
|
181
188
|
# vol:// is a volume the owner uploaded (contract 7); the gateway resolves it per owner at deploy.
|
|
182
189
|
if v.startswith("vol://"):
|
|
183
190
|
from sequence_base.contract.volumes import parse_vol
|
|
@@ -186,7 +193,8 @@ def check_weights_uri(v: str, what: str = "weights") -> str:
|
|
|
186
193
|
# s3:// (the author's own bucket, or any S3-compatible store) and https:// (one file or archive at a URL):
|
|
187
194
|
# {gs-plans/customization/README.md P2 "S3:// / HTTPS:// 权重"}
|
|
188
195
|
if not v.startswith(("gs://", "hf://", "s3://", "https://")):
|
|
189
|
-
raise ValueError(f"{what} must be a
|
|
196
|
+
raise ValueError(f"{what} must be a template:// official template, an hf:// repo or a vol:// volume "
|
|
197
|
+
"(gs://, s3:// and https:// are still accepted until they are removed)")
|
|
190
198
|
return v
|
|
191
199
|
|
|
192
200
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Official template weights — `template://<name>[@v<n>]`, the one weights reference that is not the deployer's own.
|
|
3
|
+
|
|
4
|
+
In one sentence: a template's code (or `seq.Weights.template("pi05-droid")`) names the official checkpoint by template
|
|
5
|
+
name → the gateway resolves the name, and the version when none is pinned, against the platform's public template
|
|
6
|
+
store at submit and pins it into the deployment version → the build copies that one version into the deployment's
|
|
7
|
+
own volume, so neither the code nor the deployer ever names a bucket or a provider.
|
|
8
|
+
{gs-plans/storage/decisions.md A7 "不写版本号时用哪个版本", A9 "SDK 接口", B3 "模板引用在线上的格式"}
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
|
|
14
|
+
TEMPLATE_SCHEME = "template://"
|
|
15
|
+
# A template name is the name `seq init` takes and the folder the template is published under.
|
|
16
|
+
_NAME = re.compile(r"[a-z0-9][a-z0-9-]{0,63}")
|
|
17
|
+
_VERSION = re.compile(r"v([1-9][0-9]{0,8})")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def parse_template(uri: str) -> tuple[str, int | None]:
|
|
21
|
+
"""`template://<name>[@v<n>]` → (name, n or None). Raises ValueError naming the problem."""
|
|
22
|
+
if not uri.startswith(TEMPLATE_SCHEME):
|
|
23
|
+
raise ValueError(f"{uri!r} is not a template:// reference")
|
|
24
|
+
name, _, ver = uri[len(TEMPLATE_SCHEME):].strip().rstrip("/").partition("@")
|
|
25
|
+
if not _NAME.fullmatch(name):
|
|
26
|
+
raise ValueError(f"{uri!r}: a template name is 1-64 lowercase letters, digits or '-', starting with a "
|
|
27
|
+
"letter or digit — the name `seq init` takes, e.g. template://pi05-droid")
|
|
28
|
+
if not ver:
|
|
29
|
+
return name, None
|
|
30
|
+
m = _VERSION.fullmatch(ver)
|
|
31
|
+
if not m:
|
|
32
|
+
raise ValueError(f"{uri!r}: pin a version as template://{name}@v<n>, e.g. @v1")
|
|
33
|
+
return name, int(m.group(1))
|
|
@@ -235,7 +235,7 @@
|
|
|
235
235
|
],
|
|
236
236
|
"title": "SeqFlags",
|
|
237
237
|
"type": "integer",
|
|
238
|
-
"x-contract-version": "0.4.
|
|
238
|
+
"x-contract-version": "0.4.13",
|
|
239
239
|
"x-flag-names": {
|
|
240
240
|
"CHECK": 65536,
|
|
241
241
|
"INFER": 16,
|
|
@@ -425,5 +425,5 @@
|
|
|
425
425
|
],
|
|
426
426
|
"title": "BenchmarkSpec",
|
|
427
427
|
"type": "object",
|
|
428
|
-
"x-contract-version": "0.4.
|
|
428
|
+
"x-contract-version": "0.4.13"
|
|
429
429
|
}
|
|
@@ -528,7 +528,7 @@
|
|
|
528
528
|
"type": "object"
|
|
529
529
|
},
|
|
530
530
|
"weights": {
|
|
531
|
-
"description": "Weights URI:
|
|
531
|
+
"description": "Weights URI: template:// (an official template), hf:// or vol:// (an uploaded volume)",
|
|
532
532
|
"title": "Weights",
|
|
533
533
|
"type": "string"
|
|
534
534
|
},
|
|
@@ -588,7 +588,7 @@
|
|
|
588
588
|
],
|
|
589
589
|
"title": "SeqFlags",
|
|
590
590
|
"type": "integer",
|
|
591
|
-
"x-contract-version": "0.4.
|
|
591
|
+
"x-contract-version": "0.4.13",
|
|
592
592
|
"x-flag-names": {
|
|
593
593
|
"CHECK": 65536,
|
|
594
594
|
"INFER": 16,
|
|
@@ -688,5 +688,5 @@
|
|
|
688
688
|
],
|
|
689
689
|
"title": "PolicyRegistration",
|
|
690
690
|
"type": "object",
|
|
691
|
-
"x-contract-version": "0.4.
|
|
691
|
+
"x-contract-version": "0.4.13"
|
|
692
692
|
}
|
|
@@ -570,7 +570,7 @@
|
|
|
570
570
|
"type": "object"
|
|
571
571
|
},
|
|
572
572
|
"weights": {
|
|
573
|
-
"description": "Weights URI:
|
|
573
|
+
"description": "Weights URI: template:// (an official template), hf:// or vol:// (an uploaded volume)",
|
|
574
574
|
"title": "Weights",
|
|
575
575
|
"type": "string"
|
|
576
576
|
},
|
|
@@ -596,5 +596,5 @@
|
|
|
596
596
|
],
|
|
597
597
|
"title": "PolicySpec",
|
|
598
598
|
"type": "object",
|
|
599
|
-
"x-contract-version": "0.4.
|
|
599
|
+
"x-contract-version": "0.4.13"
|
|
600
600
|
}
|
|
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
|