sequence-base 0.4.3__tar.gz → 0.4.5__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.4.3 → sequence_base-0.4.5}/PKG-INFO +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/pyproject.toml +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/__init__.py +2 -2
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/constants/version.py +3 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/policy.py +25 -4
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/wire.py +7 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/obs/log.py +6 -2
- sequence_base-0.4.5/sequence_base/obs/rid.py +64 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ActRequest.json +15 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ActResponse.json +15 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ActionChunk.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ActionContract.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ActionStep.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/AdapterTransform.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/AddLocal.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Autoscaler.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/BenchmarkSpec.json +2 -2
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/BootstrapResponse.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Camera.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ClampInfo.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/CodeBundle.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Concurrency.json +21 -2
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Conditions.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ConnectRequest.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ConnectResponse.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/DeploymentAccepted.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/DeploymentPolicy.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/DeploymentRequest.json +21 -2
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Embodiment.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ErrorBody.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ErrorCodes.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Estimate.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/EvalReport.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/EvalRequest.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/EvalResponse.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageFrame.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageSpec.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageStepApt.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageStepEnv.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageStepRun.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ImageStepUvPip.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/InferParam.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Lease.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/LossyTransform.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/MetricAgg.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Observation.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/ObservationContract.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/PolicyRegistration.json +22 -3
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/PolicySpec.json +21 -2
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Proprioception.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/RenderSpec.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Resources.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/RolloutResult.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/SecretCreateRequest.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/SecretInfo.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/SecretRef.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/SeqFlags.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Step.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/SuiteAgg.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/TaskAgg.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/TemplateFiles.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Timeouts.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/UploadTarget.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/Variant.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/VolumeAttach.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/VolumeFile.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/VolumeInfo.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/VolumeMount.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/VolumeRef.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schemas/WarmingError.json +1 -1
- sequence_base-0.4.3/sequence_base/obs/rid.py +0 -27
- {sequence_base-0.4.3 → sequence_base-0.4.5}/.gitignore +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/README.md +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/auth.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/codec/__init__.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/codec/image.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/constants/__init__.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/constants/headers.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/__init__.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/accounts.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/act.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/benchmarks.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/connect.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/deployments.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/errors.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/eval.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/flags.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/io.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/templates.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/contract/volumes.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/errors/__init__.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/errors/transport.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/obs/__init__.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/presets/__init__.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/presets/robot_arm.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/schema_export.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/telemetry/__init__.py +0 -0
- {sequence_base-0.4.3 → sequence_base-0.4.5}/sequence_base/telemetry/events.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sequence-base
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness.
|
|
5
5
|
Project-URL: Changelog, https://generalsequences.com/docs/changelog/
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sequence-base"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.5"
|
|
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"]
|
|
@@ -105,7 +105,7 @@ from sequence_base.constants.version import CONTRACT_VERSION
|
|
|
105
105
|
|
|
106
106
|
|
|
107
107
|
from sequence_base.obs.log import Timer, enabled, log
|
|
108
|
-
from sequence_base.obs.rid import HEADER, clean, new_rid
|
|
108
|
+
from sequence_base.obs.rid import HEADER, clean, clean_text, new_rid, unescape_text
|
|
109
109
|
|
|
110
110
|
|
|
111
111
|
from sequence_base.errors.transport import (
|
|
@@ -152,7 +152,7 @@ __all__ = [
|
|
|
152
152
|
|
|
153
153
|
"ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status", "CONTRACT_VERSION",
|
|
154
154
|
|
|
155
|
-
"HEADER", "new_rid", "clean", "log", "Timer", "enabled",
|
|
155
|
+
"HEADER", "new_rid", "clean", "clean_text", "unescape_text", "log", "Timer", "enabled",
|
|
156
156
|
|
|
157
157
|
"TransportUnavailable", "TransportWarming", "TransportRejected", "TransportOverloaded",
|
|
158
158
|
|
|
@@ -10,7 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
|
|
11
11
|
import re
|
|
12
12
|
|
|
13
|
-
from typing import
|
|
13
|
+
from typing import Literal
|
|
14
14
|
|
|
15
15
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
16
16
|
|
|
@@ -185,10 +185,27 @@ class Concurrency(BaseModel):
|
|
|
185
185
|
its own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the
|
|
186
186
|
worker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions
|
|
187
187
|
a worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the
|
|
188
|
-
slots.
|
|
188
|
+
slots.
|
|
189
|
+
|
|
190
|
+
`max_concurrent` (contract 0.5.5) - from `@seq.concurrent(max_concurrent=N)` on the policy's infer method - is the
|
|
191
|
+
most acts one forward pass takes, the largest batch the policy is built for (None: one robot a copy, each act
|
|
192
|
+
alone). With it, `dynamic` True has each worker measure its forwards and seat as many robots as it can serve on time,
|
|
193
|
+
planning when each sends - apart while each can be served alone, together only when they cannot; False seats
|
|
194
|
+
max_concurrent robots a worker and runs their acts together, so it needs max_concurrent. `dynamic` means something
|
|
195
|
+
only beside max_concurrent: an undeclared Concurrency() still carries its default (True) on the wire, and a reader
|
|
196
|
+
takes it for one robot a copy. The SDK takes `gpus_per_replica` and
|
|
197
|
+
`replica_start` in `@seq.policy(...)` from then on.
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
`max_inputs`, `target_inputs` and `replicas_per_gpu` are the old way's: kept so a stored spec and an older SDK's
|
|
201
|
+
request still read, and refused on a new deploy by the platform; the SDK from contract 0.5.5 never sends them.
|
|
202
|
+
|
|
203
|
+
"""
|
|
189
204
|
|
|
190
205
|
model_config = ConfigDict(extra="forbid")
|
|
191
206
|
|
|
207
|
+
max_concurrent: int | None = Field(default=None, ge=2, le=256)
|
|
208
|
+
dynamic: bool = True
|
|
192
209
|
max_inputs: int | None = Field(default=None, ge=1, le=1024)
|
|
193
210
|
target_inputs: int | None = Field(default=None, ge=1, le=1024)
|
|
194
211
|
replicas_per_gpu: int | None = Field(default=None, ge=1, le=64)
|
|
@@ -201,6 +218,10 @@ class Concurrency(BaseModel):
|
|
|
201
218
|
|
|
202
219
|
@model_validator(mode="after")
|
|
203
220
|
def _consistent(self) -> "Concurrency":
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
if self.dynamic is False and self.max_concurrent is None:
|
|
224
|
+
raise ValueError("dynamic=False seats max_concurrent robots a worker: it needs max_concurrent")
|
|
204
225
|
if self.max_inputs is not None and self.target_inputs is not None and self.max_inputs < self.target_inputs:
|
|
205
226
|
raise ValueError("max_inputs must be at least target_inputs")
|
|
206
227
|
if (self.gpus_per_replica or 1) > 1 and (self.replicas_per_gpu or 1) > 1:
|
|
@@ -279,8 +300,8 @@ MAX_WEIGHTS_PARTS = 8
|
|
|
279
300
|
|
|
280
301
|
def check_weights_uri(v: str, what: str = "weights") -> str:
|
|
281
302
|
"""A weights origin the build can provision: an official template://, an hf:// repo or an uploaded vol://
|
|
282
|
-
volume.
|
|
283
|
-
|
|
303
|
+
volume. Weights from a storage bucket or a URL were removed in contract 0.5.0, after a release that warned for 7
|
|
304
|
+
days: their files are uploaded once as a volume."""
|
|
284
305
|
|
|
285
306
|
if v.startswith("template://"):
|
|
286
307
|
from sequence_base.contract.templates import parse_template
|
|
@@ -37,6 +37,10 @@ class ActRequest(BaseModel):
|
|
|
37
37
|
description="Robot-arm preset only: which declared embodiment this session drives")
|
|
38
38
|
|
|
39
39
|
|
|
40
|
+
plan: dict[str, Any] | None = Field(default=None,
|
|
41
|
+
description="The robot's session, the steps it holds, its rate and network p95")
|
|
42
|
+
|
|
43
|
+
|
|
40
44
|
class ActResponse(BaseModel):
|
|
41
45
|
"""200 from /act, version 2. `outputs` is infer()'s return value, unchanged; the rest is platform metadata."""
|
|
42
46
|
|
|
@@ -51,3 +55,6 @@ class ActResponse(BaseModel):
|
|
|
51
55
|
|
|
52
56
|
action_chunk: dict[str, Any] | None = Field(default=None,
|
|
53
57
|
description="Version-1 key for a robot-arm preset chunk (= outputs)")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
plan: dict[str, Any] | None = Field(default=None, description="When to send the next act, and how this chunk plays")
|
|
@@ -9,7 +9,11 @@ import os
|
|
|
9
9
|
import sys
|
|
10
10
|
import time
|
|
11
11
|
|
|
12
|
-
from sequence_base.obs.rid import clean
|
|
12
|
+
from sequence_base.obs.rid import clean, clean_text
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
TEXT_FIELDS = frozenset({"error"})
|
|
13
17
|
|
|
14
18
|
|
|
15
19
|
def enabled() -> bool:
|
|
@@ -24,7 +28,7 @@ def log(ev: str, rid: str | None = None, **fields: object) -> None:
|
|
|
24
28
|
parts = [f"seq ev={clean(ev)}"]
|
|
25
29
|
if rid:
|
|
26
30
|
parts.append(f"rid={clean(rid)}")
|
|
27
|
-
parts.extend(f"{k}={clean(v)}" for k, v in fields.items() if v is not None)
|
|
31
|
+
parts.extend(f"{k}={clean_text(v) if k in TEXT_FIELDS else clean(v)}" for k, v in fields.items() if v is not None)
|
|
28
32
|
print(" ".join(parts), file=sys.stdout, flush=True)
|
|
29
33
|
|
|
30
34
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Correlation id — one value threads a call through sdk → gateway → worker, so "what happened to that
|
|
3
|
+
call" is one grep instead of three log stores and a stopwatch. {from general-sequences obs.py}
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
import uuid
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
HEADER = "X-Seq-Request-Id"
|
|
13
|
+
|
|
14
|
+
_UNSAFE = re.compile(r"\s+")
|
|
15
|
+
_BREAK = re.compile(r"\r\n|\r|\n")
|
|
16
|
+
_SPACE = re.compile(r"\s")
|
|
17
|
+
_ESCAPED = re.compile(r"\\(.)|_")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
FIELD_MAX = 200
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
TEXT_MAX = 4000
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def new_rid() -> str:
|
|
27
|
+
"""Short (read off a terminal, quoted in bug reports) + random (gateway instances don't
|
|
28
|
+
coordinate, so it must not collide)."""
|
|
29
|
+
return "r-" + uuid.uuid4().hex[:8]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def clean(v: object, limit: int = FIELD_MAX) -> str:
|
|
33
|
+
"""Collapse whitespace and cap length. A value with a space would split into two log fields and
|
|
34
|
+
let anything user-supplied forge keys into the line; 200 chars keeps a real error readable."""
|
|
35
|
+
s = _UNSAFE.sub("_", str(v))
|
|
36
|
+
return s if len(s) <= limit else s[:limit - 3] + "..."
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def clean_text(v: object, limit: int = TEXT_MAX) -> str:
|
|
40
|
+
"""A long text - an error with its traceback - as one log field that reads back as it was (unescape_text): a
|
|
41
|
+
backslash written `\\\\`, an underscore `\\_`, a line break `\\n`, every other whitespace character `_` (read
|
|
42
|
+
back as a space, so a traceback keeps its indentation), cut at `limit`. It holds no whitespace, so like clean() it
|
|
43
|
+
can neither split the line nor forge a field into it.
|
|
44
|
+
|
|
45
|
+
WHY escaped and not collapsed: clean() writes a traceback's line breaks and spaces both as `_`, and a reader that
|
|
46
|
+
turns `_` back into spaces breaks every name with one in it (infer_chunk); a traceback is read for those names."""
|
|
47
|
+
s = "\\n".join(_SPACE.sub("_", line.replace("\\", "\\\\").replace("_", "\\_")) for line in _BREAK.split(str(v)))
|
|
48
|
+
if len(s) <= limit:
|
|
49
|
+
return s
|
|
50
|
+
s = s[:limit - 3]
|
|
51
|
+
if (len(s) - len(s.rstrip("\\"))) % 2:
|
|
52
|
+
s = s[:-1]
|
|
53
|
+
return s + "..."
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def unescape_text(s: str) -> str:
|
|
57
|
+
"""clean_text's field as the text it was: `\\n` a line break, `\\\\` a backslash, `\\_` an underscore, `_` a
|
|
58
|
+
space; any other backslash as written. One pass, left to right."""
|
|
59
|
+
def one(m: re.Match) -> str:
|
|
60
|
+
if m.group(1) is None:
|
|
61
|
+
return " "
|
|
62
|
+
return {"n": "\n", "\\": "\\", "_": "_"}.get(m.group(1), m.group(0))
|
|
63
|
+
|
|
64
|
+
return _ESCAPED.sub(one, s)
|
|
@@ -46,6 +46,20 @@
|
|
|
46
46
|
"description": "Values for the inference parameters the policy declares",
|
|
47
47
|
"title": "Params"
|
|
48
48
|
},
|
|
49
|
+
"plan": {
|
|
50
|
+
"anyOf": [
|
|
51
|
+
{
|
|
52
|
+
"additionalProperties": true,
|
|
53
|
+
"type": "object"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"type": "null"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"default": null,
|
|
60
|
+
"description": "The robot's session, the steps it holds, its rate and network p95",
|
|
61
|
+
"title": "Plan"
|
|
62
|
+
},
|
|
49
63
|
"seed": {
|
|
50
64
|
"anyOf": [
|
|
51
65
|
{
|
|
@@ -65,5 +79,5 @@
|
|
|
65
79
|
],
|
|
66
80
|
"title": "ActRequest",
|
|
67
81
|
"type": "object",
|
|
68
|
-
"x-contract-version": "0.5.
|
|
82
|
+
"x-contract-version": "0.5.5"
|
|
69
83
|
}
|
|
@@ -34,6 +34,20 @@
|
|
|
34
34
|
"description": "Per-phase timings of this call",
|
|
35
35
|
"title": "Perf"
|
|
36
36
|
},
|
|
37
|
+
"plan": {
|
|
38
|
+
"anyOf": [
|
|
39
|
+
{
|
|
40
|
+
"additionalProperties": true,
|
|
41
|
+
"type": "object"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"type": "null"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"default": null,
|
|
48
|
+
"description": "When to send the next act, and how this chunk plays",
|
|
49
|
+
"title": "Plan"
|
|
50
|
+
},
|
|
37
51
|
"request_id": {
|
|
38
52
|
"anyOf": [
|
|
39
53
|
{
|
|
@@ -75,5 +89,5 @@
|
|
|
75
89
|
],
|
|
76
90
|
"title": "ActResponse",
|
|
77
91
|
"type": "object",
|
|
78
|
-
"x-contract-version": "0.5.
|
|
92
|
+
"x-contract-version": "0.5.5"
|
|
79
93
|
}
|
|
@@ -313,7 +313,7 @@
|
|
|
313
313
|
],
|
|
314
314
|
"title": "SeqFlags",
|
|
315
315
|
"type": "integer",
|
|
316
|
-
"x-contract-version": "0.5.
|
|
316
|
+
"x-contract-version": "0.5.5",
|
|
317
317
|
"x-flag-names": {
|
|
318
318
|
"CHECK": 65536,
|
|
319
319
|
"INFER": 16,
|
|
@@ -559,5 +559,5 @@
|
|
|
559
559
|
],
|
|
560
560
|
"title": "BenchmarkSpec",
|
|
561
561
|
"type": "object",
|
|
562
|
-
"x-contract-version": "0.5.
|
|
562
|
+
"x-contract-version": "0.5.5"
|
|
563
563
|
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"additionalProperties": false,
|
|
3
|
-
"description": "How one worker serves robots, every field optional. `replicas_per_gpu` model copies share each card (each copy is\nits own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the\nworker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions\na worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the\nslots.",
|
|
3
|
+
"description": "How one worker serves robots, every field optional. `replicas_per_gpu` model copies share each card (each copy is\nits own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the\nworker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions\na worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the\nslots.\n\n`max_concurrent` (contract 0.5.5) - from `@seq.concurrent(max_concurrent=N)` on the policy's infer method - is the\nmost acts one forward pass takes, the largest batch the policy is built for (None: one robot a copy, each act\nalone). With it, `dynamic` True has each worker measure its forwards and seat as many robots as it can serve on time,\nplanning when each sends - apart while each can be served alone, together only when they cannot; False seats\nmax_concurrent robots a worker and runs their acts together, so it needs max_concurrent. `dynamic` means something\nonly beside max_concurrent: an undeclared Concurrency() still carries its default (True) on the wire, and a reader\ntakes it for one robot a copy. The SDK takes `gpus_per_replica` and\n`replica_start` in `@seq.policy(...)` from then on.\n\n\n`max_inputs`, `target_inputs` and `replicas_per_gpu` are the old way's: kept so a stored spec and an older SDK's\nrequest still read, and refused on a new deploy by the platform; the SDK from contract 0.5.5 never sends them.",
|
|
4
4
|
"properties": {
|
|
5
|
+
"dynamic": {
|
|
6
|
+
"default": true,
|
|
7
|
+
"title": "Dynamic",
|
|
8
|
+
"type": "boolean"
|
|
9
|
+
},
|
|
5
10
|
"gpus_per_replica": {
|
|
6
11
|
"anyOf": [
|
|
7
12
|
{
|
|
@@ -16,6 +21,20 @@
|
|
|
16
21
|
"default": null,
|
|
17
22
|
"title": "Gpus Per Replica"
|
|
18
23
|
},
|
|
24
|
+
"max_concurrent": {
|
|
25
|
+
"anyOf": [
|
|
26
|
+
{
|
|
27
|
+
"maximum": 256,
|
|
28
|
+
"minimum": 2,
|
|
29
|
+
"type": "integer"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "null"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"default": null,
|
|
36
|
+
"title": "Max Concurrent"
|
|
37
|
+
},
|
|
19
38
|
"max_inputs": {
|
|
20
39
|
"anyOf": [
|
|
21
40
|
{
|
|
@@ -77,5 +96,5 @@
|
|
|
77
96
|
},
|
|
78
97
|
"title": "Concurrency",
|
|
79
98
|
"type": "object",
|
|
80
|
-
"x-contract-version": "0.5.
|
|
99
|
+
"x-contract-version": "0.5.5"
|
|
81
100
|
}
|
|
@@ -318,8 +318,13 @@
|
|
|
318
318
|
},
|
|
319
319
|
"Concurrency": {
|
|
320
320
|
"additionalProperties": false,
|
|
321
|
-
"description": "How one worker serves robots, every field optional. `replicas_per_gpu` model copies share each card (each copy is\nits own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the\nworker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions\na worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the\nslots.",
|
|
321
|
+
"description": "How one worker serves robots, every field optional. `replicas_per_gpu` model copies share each card (each copy is\nits own process and serves one control loop); `gpus_per_replica` cards make one copy (None: every card of the\nworker). A worker's slots = cards // gpus_per_replica × replicas_per_gpu. `target_inputs` is how many robot sessions\na worker holds before another starts, `max_inputs` the most it takes while a new one boots — both default to the\nslots.\n\n`max_concurrent` (contract 0.5.5) - from `@seq.concurrent(max_concurrent=N)` on the policy's infer method - is the\nmost acts one forward pass takes, the largest batch the policy is built for (None: one robot a copy, each act\nalone). With it, `dynamic` True has each worker measure its forwards and seat as many robots as it can serve on time,\nplanning when each sends - apart while each can be served alone, together only when they cannot; False seats\nmax_concurrent robots a worker and runs their acts together, so it needs max_concurrent. `dynamic` means something\nonly beside max_concurrent: an undeclared Concurrency() still carries its default (True) on the wire, and a reader\ntakes it for one robot a copy. The SDK takes `gpus_per_replica` and\n`replica_start` in `@seq.policy(...)` from then on.\n\n\n`max_inputs`, `target_inputs` and `replicas_per_gpu` are the old way's: kept so a stored spec and an older SDK's\nrequest still read, and refused on a new deploy by the platform; the SDK from contract 0.5.5 never sends them.",
|
|
322
322
|
"properties": {
|
|
323
|
+
"dynamic": {
|
|
324
|
+
"default": true,
|
|
325
|
+
"title": "Dynamic",
|
|
326
|
+
"type": "boolean"
|
|
327
|
+
},
|
|
323
328
|
"gpus_per_replica": {
|
|
324
329
|
"anyOf": [
|
|
325
330
|
{
|
|
@@ -334,6 +339,20 @@
|
|
|
334
339
|
"default": null,
|
|
335
340
|
"title": "Gpus Per Replica"
|
|
336
341
|
},
|
|
342
|
+
"max_concurrent": {
|
|
343
|
+
"anyOf": [
|
|
344
|
+
{
|
|
345
|
+
"maximum": 256,
|
|
346
|
+
"minimum": 2,
|
|
347
|
+
"type": "integer"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"type": "null"
|
|
351
|
+
}
|
|
352
|
+
],
|
|
353
|
+
"default": null,
|
|
354
|
+
"title": "Max Concurrent"
|
|
355
|
+
},
|
|
337
356
|
"max_inputs": {
|
|
338
357
|
"anyOf": [
|
|
339
358
|
{
|
|
@@ -1205,5 +1224,5 @@
|
|
|
1205
1224
|
],
|
|
1206
1225
|
"title": "DeploymentRequest",
|
|
1207
1226
|
"type": "object",
|
|
1208
|
-
"x-contract-version": "0.5.
|
|
1227
|
+
"x-contract-version": "0.5.5"
|
|
1209
1228
|
}
|