sequence-base 0.4.16__tar.gz → 0.4.17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. {sequence_base-0.4.16 → sequence_base-0.4.17}/PKG-INFO +1 -1
  2. {sequence_base-0.4.16 → sequence_base-0.4.17}/pyproject.toml +1 -1
  3. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/__init__.py +4 -0
  4. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/constants/version.py +2 -1
  5. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/__init__.py +5 -0
  6. sequence_base-0.4.17/sequence_base/contract/adapters.py +181 -0
  7. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schema_export.py +2 -0
  8. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ActRequest.json +1 -1
  9. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ActResponse.json +1 -1
  10. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ActionChunk.json +1 -1
  11. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ActionContract.json +1 -1
  12. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ActionStep.json +1 -1
  13. sequence_base-0.4.17/sequence_base/schemas/AdapterPair.json +21 -0
  14. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/AddLocal.json +1 -1
  15. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Autoscaler.json +1 -1
  16. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
  17. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/BenchmarkRegisterRequest.json +1 -1
  18. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/BenchmarkSpec.json +2 -2
  19. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
  20. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/BootstrapResponse.json +1 -1
  21. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Camera.json +1 -1
  22. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/CodeBundle.json +1 -1
  23. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Concurrency.json +1 -1
  24. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Conditions.json +1 -1
  25. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ConnectRequest.json +1 -1
  26. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ConnectResponse.json +1 -1
  27. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/DeploymentAccepted.json +1 -1
  28. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/DeploymentPolicy.json +1 -1
  29. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/DeploymentRequest.json +1 -1
  30. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
  31. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Embodiment.json +1 -1
  32. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ErrorBody.json +1 -1
  33. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ErrorCodes.json +1 -1
  34. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Estimate.json +1 -1
  35. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
  36. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/EvalReport.json +1 -1
  37. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/EvalRequest.json +1 -1
  38. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/EvalResponse.json +1 -1
  39. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageFrame.json +1 -1
  40. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageSpec.json +1 -1
  41. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
  42. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageStepApt.json +1 -1
  43. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageStepEnv.json +1 -1
  44. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageStepRun.json +1 -1
  45. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
  46. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ImageStepUvPip.json +1 -1
  47. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/InferParam.json +1 -1
  48. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Lease.json +1 -1
  49. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/MetricAgg.json +1 -1
  50. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Observation.json +1 -1
  51. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ObservationContract.json +1 -1
  52. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/PolicyRegistration.json +2 -2
  53. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/PolicySpec.json +1 -1
  54. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Proprioception.json +1 -1
  55. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/RenderSpec.json +1 -1
  56. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/ReplaySpec.json +1 -1
  57. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Resources.json +1 -1
  58. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/RolloutResult.json +1 -1
  59. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/SecretCreateRequest.json +1 -1
  60. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/SecretInfo.json +1 -1
  61. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/SecretRef.json +1 -1
  62. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/SeqFlags.json +1 -1
  63. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Step.json +1 -1
  64. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/TaskAgg.json +1 -1
  65. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/TemplateFiles.json +1 -1
  66. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Timeouts.json +1 -1
  67. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/UploadTarget.json +1 -1
  68. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/Variant.json +1 -1
  69. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/VolumeFile.json +1 -1
  70. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/VolumeInfo.json +1 -1
  71. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/VolumeMount.json +1 -1
  72. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/VolumeRef.json +1 -1
  73. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
  74. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
  75. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/schemas/WarmingError.json +1 -1
  76. {sequence_base-0.4.16 → sequence_base-0.4.17}/.gitignore +0 -0
  77. {sequence_base-0.4.16 → sequence_base-0.4.17}/README.md +0 -0
  78. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/auth.py +0 -0
  79. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/codec/__init__.py +0 -0
  80. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/codec/image.py +0 -0
  81. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/constants/__init__.py +0 -0
  82. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/constants/headers.py +0 -0
  83. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/constants/limits.py +0 -0
  84. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/accounts.py +0 -0
  85. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/act.py +0 -0
  86. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/benchmarks.py +0 -0
  87. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/connect.py +0 -0
  88. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/deployments.py +0 -0
  89. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/errors.py +0 -0
  90. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/eval.py +0 -0
  91. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/flags.py +0 -0
  92. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/io.py +0 -0
  93. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/policy.py +0 -0
  94. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/templates.py +0 -0
  95. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/volumes.py +0 -0
  96. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/contract/wire.py +0 -0
  97. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/errors/__init__.py +0 -0
  98. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/errors/transport.py +0 -0
  99. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/obs/__init__.py +0 -0
  100. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/obs/log.py +0 -0
  101. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/obs/rid.py +0 -0
  102. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/presets/__init__.py +0 -0
  103. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/presets/frames.py +0 -0
  104. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/presets/robot_arm.py +0 -0
  105. {sequence_base-0.4.16 → sequence_base-0.4.17}/sequence_base/telemetry/__init__.py +0 -0
  106. {sequence_base-0.4.16 → sequence_base-0.4.17}/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.16
3
+ Version: 0.4.17
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.16"
3
+ version = "0.4.17"
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"]
@@ -33,6 +33,8 @@ from sequence_base.contract import (
33
33
  parse_vol,
34
34
  TEMPLATE_SCHEME,
35
35
  parse_template,
36
+ AdapterPair,
37
+ parse_pairs,
36
38
  ActionChunk,
37
39
  ActionContract,
38
40
  ActionSpace,
@@ -148,6 +150,8 @@ __all__ = [
148
150
 
149
151
  "TEMPLATE_SCHEME", "parse_template",
150
152
 
153
+ "AdapterPair", "parse_pairs",
154
+
151
155
  "ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status", "CONTRACT_VERSION",
152
156
  "MAX_ENVS", "MAX_USD", "TASK_DESCRIPTION_MAX",
153
157
 
@@ -4,7 +4,8 @@
4
4
 
5
5
 
6
6
 
7
- CONTRACT_VERSION = "0.5.15"
7
+ CONTRACT_VERSION = "0.5.16"
8
+
8
9
 
9
10
 
10
11
 
@@ -94,6 +94,9 @@ from sequence_base.contract.accounts import (
94
94
  from sequence_base.contract.templates import TEMPLATE_SCHEME, parse_template
95
95
 
96
96
 
97
+ from sequence_base.contract.adapters import AdapterPair, parse_pairs
98
+
99
+
97
100
  from sequence_base.contract.volumes import (
98
101
  MAX_FILES,
99
102
  MAX_UPLOAD_BYTES,
@@ -137,5 +140,7 @@ __all__ = [
137
140
 
138
141
  "TEMPLATE_SCHEME", "parse_template",
139
142
 
143
+ "AdapterPair", "parse_pairs",
144
+
140
145
  "ErrorCode", "ErrorBody", "WarmingError", "ERRORS", "ErrorSpec", "code_for_status",
141
146
  ]
@@ -0,0 +1,181 @@
1
+ """
2
+ An adapter's pairs - the benchmark → policy pairs a registered adapter converts between.
3
+
4
+ In one sentence: an adapter's author writes in its code which pairs its conversion is for - `@seq.adapter(pairs=[
5
+ (benchmark, policy), ...])`, each side an account's name, `template:<name>` (anything made from that template, at any
6
+ version) or `*` (any one), or `pairs="any"` for every pair → `seq deploy` registers them with the version → as an eval
7
+ starts, the gateway matches the eval's benchmark and policy against them (match) and refuses the rest before anything
8
+ runs. The rules are defined once, here: the SDK reads them (the decorator, `seq adapter check`) and so does the
9
+ gateway (registration, the eval's check, which adapters fit a pair), so what can be chosen is what runs.
10
+ WHY in the code, with the version: which pairs a conversion is for is part of the conversion - changing them is a new
11
+ version, and an eval keeps the version it ran. WHY by name and never by version: a benchmark's or a policy's I/O
12
+ seldom changes with its version, and pinned pairs would make every upgrade a new adapter. WHY a pair need not exist
13
+ yet: an adapter may come before the policy it feeds; names are matched as an eval starts.
14
+ {the user 10-19, through TEST USER: "you need to specify which benchmark and which policy you want the conversion to
15
+ be and then you can specify multiple … you can only apply those that are stated here as the pairs"; "We should have
16
+ the option to open to all"}
17
+
18
+ """
19
+ from __future__ import annotations
20
+
21
+ import re
22
+ from typing import Any, Iterable, Literal, Union
23
+
24
+ from pydantic import BaseModel, ConfigDict
25
+
26
+ ANY = "any"
27
+ WILDCARD = "*"
28
+ TEMPLATE = "template:"
29
+ MAX_PAIRS = 64
30
+
31
+
32
+
33
+ _NAME = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]{0,63}")
34
+ _TEMPLATE_NAME = re.compile(r"[a-z0-9][a-z0-9-]{0,63}")
35
+
36
+
37
+ class AdapterPair(BaseModel):
38
+ """One pair an adapter converts between: its benchmark side and its policy side, each an account's name,
39
+ `template:<name>` or `*`."""
40
+
41
+ model_config = ConfigDict(extra="forbid", frozen=True)
42
+
43
+ benchmark: str
44
+ policy: str
45
+
46
+
47
+ Pairs = Union[Literal["any"], list[AdapterPair]]
48
+
49
+ _EXAMPLE = 'pairs=[("libero-10", "my-pi05"), ("template:libero-spatial", "*")], or pairs="any"'
50
+
51
+
52
+ def _side(value: Any, which: str, i: int) -> str:
53
+ if not isinstance(value, str) or not value.strip():
54
+ raise ValueError(f"pair {i}: its {which} is {value!r}, not a name")
55
+ side = value.strip()
56
+ if side == WILDCARD:
57
+ return side
58
+ if side.startswith(TEMPLATE):
59
+ if not _TEMPLATE_NAME.fullmatch(side[len(TEMPLATE):]):
60
+ raise ValueError(f"pair {i}: {which} {value!r}: a template is template:<name>, the name `seq init` takes "
61
+ "(lowercase letters, digits or '-'), e.g. template:libero-10")
62
+ return side
63
+ if not _NAME.fullmatch(side):
64
+ raise ValueError(f"pair {i}: {which} {value!r} is no name: 1-64 letters, digits, '.', '_' or '-', starting "
65
+ "with a letter or digit - or template:<name>, or *")
66
+ return side
67
+
68
+
69
+ def parse_pairs(value: Any) -> Pairs:
70
+ """`"any"`, or the pairs as [(benchmark, policy), ...] or [{"benchmark", "policy"}, ...] → "any" or [AdapterPair,
71
+ ...] in their order, each once. Raises ValueError saying which pair and which side is wrong; None and [] are wrong
72
+ too - an adapter says which pairs it is for, or "any"."""
73
+ if isinstance(value, str):
74
+ if value == ANY:
75
+ return ANY
76
+ raise ValueError(f"pairs is {value!r}: write the (benchmark, policy) pairs the adapter converts between - "
77
+ f"{_EXAMPLE}")
78
+ if value is None:
79
+ raise ValueError(f"the adapter declares no pairs: say which benchmark → policy pairs it converts between - "
80
+ f"{_EXAMPLE}")
81
+ try:
82
+ items = list(value)
83
+ except TypeError:
84
+ raise ValueError(f"pairs is {value!r}, not a list of (benchmark, policy) pairs - {_EXAMPLE}") from None
85
+ if not items:
86
+ raise ValueError(f"pairs is empty: name at least one (benchmark, policy) pair - {_EXAMPLE}")
87
+ out: list[AdapterPair] = []
88
+ for i, item in enumerate(items, 1):
89
+ if isinstance(item, AdapterPair):
90
+ bench, policy = item.benchmark, item.policy
91
+ elif isinstance(item, dict) and set(item) == {"benchmark", "policy"}:
92
+ bench, policy = item["benchmark"], item["policy"]
93
+ elif isinstance(item, (list, tuple)) and len(item) == 2:
94
+ bench, policy = item
95
+ else:
96
+ raise ValueError(f"pair {i} is {item!r}: a pair is (benchmark, policy)")
97
+ pair = AdapterPair(benchmark=_side(bench, "benchmark", i), policy=_side(policy, "policy", i))
98
+ if pair not in out:
99
+ out.append(pair)
100
+ if len(out) > MAX_PAIRS:
101
+ raise ValueError(f"{len(out)} pairs; at most {MAX_PAIRS} - template:<name> or * names many at once")
102
+ return out
103
+
104
+
105
+ def as_json(pairs: Pairs | None) -> str | list[dict] | None:
106
+ """The pairs as the wire, the API and the table carry them: "any", [{"benchmark", "policy"}, ...], or None (a
107
+ version registered before pairs)."""
108
+ if pairs is None or pairs == ANY:
109
+ return pairs
110
+ return [p.model_dump() for p in pairs]
111
+
112
+
113
+ def _stored(pairs: Any) -> Pairs | None:
114
+ """Pairs as kept (as_json's form) or as parsed; None for none - never raises on what parse_pairs once accepted."""
115
+ if pairs is None or pairs == ANY:
116
+ return pairs
117
+ return [p if isinstance(p, AdapterPair) else AdapterPair(**p) for p in pairs]
118
+
119
+
120
+ def image_templates(image: Any) -> set[str]:
121
+ """The templates an image installs the files of - each `template_files` step's template, the line `seq init` writes
122
+ into a template's entry file and a user who edits the code keeps: what makes a benchmark or a policy one of the
123
+ template's for `template:<name>`. `image`: an ImageSpec, or its dict as a request or a stored spec carries it."""
124
+ if image is None:
125
+ return set()
126
+ steps = image.get("steps") if isinstance(image, dict) else getattr(image, "steps", None)
127
+ out: set[str] = set()
128
+ for step in steps or ():
129
+ files = step.get("template_files") if isinstance(step, dict) else getattr(step, "template_files", None)
130
+ name = files.get("template") if isinstance(files, dict) else getattr(files, "template", None)
131
+ if isinstance(name, str) and name:
132
+ out.add(name)
133
+ return out
134
+
135
+
136
+ def side_matches(side: str, name: str, templates: Iterable[str] = ()) -> bool:
137
+ """Whether one side of a pair is this benchmark or policy: `*`; `template:<t>` for one made from t; or its name."""
138
+ if side == WILDCARD:
139
+ return True
140
+ if side.startswith(TEMPLATE):
141
+ return side[len(TEMPLATE):] in set(templates or ())
142
+ return side == name
143
+
144
+
145
+ def _rank_side(side: str) -> int:
146
+ return 3 if side == WILDCARD else 1 if side.startswith(TEMPLATE) else 0
147
+
148
+
149
+ def rank(hit: AdapterPair | str) -> int:
150
+ """How specific a matching pair is, the most specific lowest: name and name 0, name and template 1, template and
151
+ template 2, a side `*` 3 and over, "any" 7 - the order an eval's adapters are offered in."""
152
+ if hit == ANY:
153
+ return 7
154
+ return _rank_side(hit.benchmark) + _rank_side(hit.policy)
155
+
156
+
157
+ def match(pairs: Any, benchmark: tuple[str, Iterable[str]],
158
+ policy: tuple[str, Iterable[str]]) -> AdapterPair | str | None:
159
+ """The pair of `pairs` that lets `benchmark` and `policy` - each (its name in the account, the templates it is
160
+ made from) - run with the adapter: the most specific one (rank); "any" for an adapter open to every pair; None
161
+ when none does, and for no pairs (a version registered before pairs)."""
162
+ pairs = _stored(pairs)
163
+ if pairs is None:
164
+ return None
165
+ if pairs == ANY:
166
+ return ANY
167
+ (bench_name, bench_templates), (policy_name, policy_templates) = benchmark, policy
168
+ hits = [p for p in pairs if side_matches(p.benchmark, bench_name, bench_templates)
169
+ and side_matches(p.policy, policy_name, policy_templates)]
170
+ return min(hits, key=rank) if hits else None
171
+
172
+
173
+ def describe(pairs: Any) -> list[str]:
174
+ """The pairs as lines a person reads: ["any"], or ["template:libero-10 → template:pi05-libero", ...]; [] for
175
+ none."""
176
+ pairs = _stored(pairs)
177
+ if pairs is None:
178
+ return []
179
+ if pairs == ANY:
180
+ return [ANY]
181
+ return [f"{p.benchmark} → {p.policy}" for p in pairs]
@@ -57,6 +57,7 @@ from sequence_base.contract.deployments import (
57
57
  Resources,
58
58
  Timeouts,
59
59
  )
60
+ from sequence_base.contract.adapters import AdapterPair
60
61
  from sequence_base.contract.errors import ErrorBody, WarmingError, error_codes_json_schema
61
62
  from sequence_base.contract.volumes import (
62
63
  UploadTarget,
@@ -163,6 +164,7 @@ WIRE_MODELS: dict[str, type[BaseModel]] = {
163
164
  "TaskAgg": TaskAgg,
164
165
  "MetricAgg": MetricAgg,
165
166
  "EvalReport": EvalReport,
167
+ "AdapterPair": AdapterPair,
166
168
 
167
169
  "SecretRef": SecretRef,
168
170
  "SecretCreateRequest": SecretCreateRequest,
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "ActRequest",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.15"
82
+ "x-contract-version": "0.5.16"
83
83
  }
@@ -89,5 +89,5 @@
89
89
  ],
90
90
  "title": "ActResponse",
91
91
  "type": "object",
92
- "x-contract-version": "0.5.15"
92
+ "x-contract-version": "0.5.16"
93
93
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "ActionChunk",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.15"
102
+ "x-contract-version": "0.5.16"
103
103
  }
@@ -84,5 +84,5 @@
84
84
  ],
85
85
  "title": "ActionContract",
86
86
  "type": "object",
87
- "x-contract-version": "0.5.15"
87
+ "x-contract-version": "0.5.16"
88
88
  }
@@ -19,5 +19,5 @@
19
19
  ],
20
20
  "title": "ActionStep",
21
21
  "type": "object",
22
- "x-contract-version": "0.5.15"
22
+ "x-contract-version": "0.5.16"
23
23
  }
@@ -0,0 +1,21 @@
1
+ {
2
+ "additionalProperties": false,
3
+ "description": "One pair an adapter converts between: its benchmark side and its policy side, each an account's name,\n`template:<name>` or `*`.",
4
+ "properties": {
5
+ "benchmark": {
6
+ "title": "Benchmark",
7
+ "type": "string"
8
+ },
9
+ "policy": {
10
+ "title": "Policy",
11
+ "type": "string"
12
+ }
13
+ },
14
+ "required": [
15
+ "benchmark",
16
+ "policy"
17
+ ],
18
+ "title": "AdapterPair",
19
+ "type": "object",
20
+ "x-contract-version": "0.5.16"
21
+ }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "AddLocal",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.15"
26
+ "x-contract-version": "0.5.16"
27
27
  }
@@ -57,5 +57,5 @@
57
57
  },
58
58
  "title": "Autoscaler",
59
59
  "type": "object",
60
- "x-contract-version": "0.5.15"
60
+ "x-contract-version": "0.5.16"
61
61
  }
@@ -50,5 +50,5 @@
50
50
  ],
51
51
  "title": "BenchmarkConditionSpec",
52
52
  "type": "object",
53
- "x-contract-version": "0.5.15"
53
+ "x-contract-version": "0.5.16"
54
54
  }
@@ -962,5 +962,5 @@
962
962
  ],
963
963
  "title": "BenchmarkRegisterRequest",
964
964
  "type": "object",
965
- "x-contract-version": "0.5.15"
965
+ "x-contract-version": "0.5.16"
966
966
  }
@@ -367,7 +367,7 @@
367
367
  ],
368
368
  "title": "SeqFlags",
369
369
  "type": "integer",
370
- "x-contract-version": "0.5.15",
370
+ "x-contract-version": "0.5.16",
371
371
  "x-flag-names": {
372
372
  "CHECK": 65536,
373
373
  "INFER": 16,
@@ -616,5 +616,5 @@
616
616
  ],
617
617
  "title": "BenchmarkSpec",
618
618
  "type": "object",
619
- "x-contract-version": "0.5.15"
619
+ "x-contract-version": "0.5.16"
620
620
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "BenchmarkStatusResponse",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.15"
43
+ "x-contract-version": "0.5.16"
44
44
  }
@@ -79,5 +79,5 @@
79
79
  ],
80
80
  "title": "BootstrapResponse",
81
81
  "type": "object",
82
- "x-contract-version": "0.5.15"
82
+ "x-contract-version": "0.5.16"
83
83
  }
@@ -72,5 +72,5 @@
72
72
  ],
73
73
  "title": "Camera",
74
74
  "type": "object",
75
- "x-contract-version": "0.5.15"
75
+ "x-contract-version": "0.5.16"
76
76
  }
@@ -23,5 +23,5 @@
23
23
  ],
24
24
  "title": "CodeBundle",
25
25
  "type": "object",
26
- "x-contract-version": "0.5.15"
26
+ "x-contract-version": "0.5.16"
27
27
  }
@@ -96,5 +96,5 @@
96
96
  },
97
97
  "title": "Concurrency",
98
98
  "type": "object",
99
- "x-contract-version": "0.5.15"
99
+ "x-contract-version": "0.5.16"
100
100
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "Conditions",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.15"
58
+ "x-contract-version": "0.5.16"
59
59
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "ConnectRequest",
27
27
  "type": "object",
28
- "x-contract-version": "0.5.15"
28
+ "x-contract-version": "0.5.16"
29
29
  }
@@ -310,5 +310,5 @@
310
310
  ],
311
311
  "title": "ConnectResponse",
312
312
  "type": "object",
313
- "x-contract-version": "0.5.15"
313
+ "x-contract-version": "0.5.16"
314
314
  }
@@ -18,5 +18,5 @@
18
18
  ],
19
19
  "title": "DeploymentAccepted",
20
20
  "type": "object",
21
- "x-contract-version": "0.5.15"
21
+ "x-contract-version": "0.5.16"
22
22
  }
@@ -486,5 +486,5 @@
486
486
  ],
487
487
  "title": "DeploymentPolicy",
488
488
  "type": "object",
489
- "x-contract-version": "0.5.15"
489
+ "x-contract-version": "0.5.16"
490
490
  }
@@ -1138,5 +1138,5 @@
1138
1138
  ],
1139
1139
  "title": "DeploymentRequest",
1140
1140
  "type": "object",
1141
- "x-contract-version": "0.5.15"
1141
+ "x-contract-version": "0.5.16"
1142
1142
  }
@@ -58,5 +58,5 @@
58
58
  ],
59
59
  "title": "DeploymentStatusResponse",
60
60
  "type": "object",
61
- "x-contract-version": "0.5.15"
61
+ "x-contract-version": "0.5.16"
62
62
  }
@@ -235,5 +235,5 @@
235
235
  ],
236
236
  "title": "Embodiment",
237
237
  "type": "object",
238
- "x-contract-version": "0.5.15"
238
+ "x-contract-version": "0.5.16"
239
239
  }
@@ -94,5 +94,5 @@
94
94
  ],
95
95
  "title": "ErrorBody",
96
96
  "type": "object",
97
- "x-contract-version": "0.5.15"
97
+ "x-contract-version": "0.5.16"
98
98
  }
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "title": "ErrorCode",
24
24
  "type": "string",
25
- "x-contract-version": "0.5.15",
25
+ "x-contract-version": "0.5.16",
26
26
  "x-errors": {
27
27
  "budget_exhausted": {
28
28
  "exit_code": 6,
@@ -60,5 +60,5 @@
60
60
  ],
61
61
  "title": "Estimate",
62
62
  "type": "object",
63
- "x-contract-version": "0.5.15"
63
+ "x-contract-version": "0.5.16"
64
64
  }
@@ -240,5 +240,5 @@
240
240
  ],
241
241
  "title": "EvalDryRunResponse",
242
242
  "type": "object",
243
- "x-contract-version": "0.5.15"
243
+ "x-contract-version": "0.5.16"
244
244
  }
@@ -432,5 +432,5 @@
432
432
  ],
433
433
  "title": "EvalReport",
434
434
  "type": "object",
435
- "x-contract-version": "0.5.15"
435
+ "x-contract-version": "0.5.16"
436
436
  }
@@ -318,5 +318,5 @@
318
318
  },
319
319
  "title": "EvalRequest",
320
320
  "type": "object",
321
- "x-contract-version": "0.5.15"
321
+ "x-contract-version": "0.5.16"
322
322
  }
@@ -153,5 +153,5 @@
153
153
  ],
154
154
  "title": "EvalResponse",
155
155
  "type": "object",
156
- "x-contract-version": "0.5.15"
156
+ "x-contract-version": "0.5.16"
157
157
  }
@@ -49,5 +49,5 @@
49
49
  ],
50
50
  "title": "ImageFrame",
51
51
  "type": "object",
52
- "x-contract-version": "0.5.15"
52
+ "x-contract-version": "0.5.16"
53
53
  }
@@ -245,5 +245,5 @@
245
245
  },
246
246
  "title": "ImageSpec",
247
247
  "type": "object",
248
- "x-contract-version": "0.5.15"
248
+ "x-contract-version": "0.5.16"
249
249
  }
@@ -38,5 +38,5 @@
38
38
  ],
39
39
  "title": "ImageStepAddLocal",
40
40
  "type": "object",
41
- "x-contract-version": "0.5.15"
41
+ "x-contract-version": "0.5.16"
42
42
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepApt",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.15"
17
+ "x-contract-version": "0.5.16"
18
18
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepEnv",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.15"
17
+ "x-contract-version": "0.5.16"
18
18
  }
@@ -46,5 +46,5 @@
46
46
  ],
47
47
  "title": "ImageStepRun",
48
48
  "type": "object",
49
- "x-contract-version": "0.5.15"
49
+ "x-contract-version": "0.5.16"
50
50
  }
@@ -37,5 +37,5 @@
37
37
  ],
38
38
  "title": "ImageStepTemplateFiles",
39
39
  "type": "object",
40
- "x-contract-version": "0.5.15"
40
+ "x-contract-version": "0.5.16"
41
41
  }
@@ -14,5 +14,5 @@
14
14
  ],
15
15
  "title": "ImageStepUvPip",
16
16
  "type": "object",
17
- "x-contract-version": "0.5.15"
17
+ "x-contract-version": "0.5.16"
18
18
  }
@@ -99,5 +99,5 @@
99
99
  ],
100
100
  "title": "InferParam",
101
101
  "type": "object",
102
- "x-contract-version": "0.5.15"
102
+ "x-contract-version": "0.5.16"
103
103
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "Lease",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.15"
27
+ "x-contract-version": "0.5.16"
28
28
  }
@@ -51,5 +51,5 @@
51
51
  ],
52
52
  "title": "MetricAgg",
53
53
  "type": "object",
54
- "x-contract-version": "0.5.15"
54
+ "x-contract-version": "0.5.16"
55
55
  }
@@ -169,5 +169,5 @@
169
169
  ],
170
170
  "title": "Observation",
171
171
  "type": "object",
172
- "x-contract-version": "0.5.15"
172
+ "x-contract-version": "0.5.16"
173
173
  }
@@ -120,5 +120,5 @@
120
120
  },
121
121
  "title": "ObservationContract",
122
122
  "type": "object",
123
- "x-contract-version": "0.5.15"
123
+ "x-contract-version": "0.5.16"
124
124
  }
@@ -778,7 +778,7 @@
778
778
  ],
779
779
  "title": "SeqFlags",
780
780
  "type": "integer",
781
- "x-contract-version": "0.5.15",
781
+ "x-contract-version": "0.5.16",
782
782
  "x-flag-names": {
783
783
  "CHECK": 65536,
784
784
  "INFER": 16,
@@ -878,5 +878,5 @@
878
878
  ],
879
879
  "title": "PolicyRegistration",
880
880
  "type": "object",
881
- "x-contract-version": "0.5.15"
881
+ "x-contract-version": "0.5.16"
882
882
  }
@@ -783,5 +783,5 @@
783
783
  ],
784
784
  "title": "PolicySpec",
785
785
  "type": "object",
786
- "x-contract-version": "0.5.15"
786
+ "x-contract-version": "0.5.16"
787
787
  }
@@ -68,5 +68,5 @@
68
68
  },
69
69
  "title": "Proprioception",
70
70
  "type": "object",
71
- "x-contract-version": "0.5.15"
71
+ "x-contract-version": "0.5.16"
72
72
  }
@@ -36,5 +36,5 @@
36
36
  ],
37
37
  "title": "RenderSpec",
38
38
  "type": "object",
39
- "x-contract-version": "0.5.15"
39
+ "x-contract-version": "0.5.16"
40
40
  }
@@ -52,5 +52,5 @@
52
52
  },
53
53
  "title": "ReplaySpec",
54
54
  "type": "object",
55
- "x-contract-version": "0.5.15"
55
+ "x-contract-version": "0.5.16"
56
56
  }
@@ -86,5 +86,5 @@
86
86
  ],
87
87
  "title": "Resources",
88
88
  "type": "object",
89
- "x-contract-version": "0.5.15"
89
+ "x-contract-version": "0.5.16"
90
90
  }
@@ -55,5 +55,5 @@
55
55
  ],
56
56
  "title": "RolloutResult",
57
57
  "type": "object",
58
- "x-contract-version": "0.5.15"
58
+ "x-contract-version": "0.5.16"
59
59
  }
@@ -21,5 +21,5 @@
21
21
  ],
22
22
  "title": "SecretCreateRequest",
23
23
  "type": "object",
24
- "x-contract-version": "0.5.15"
24
+ "x-contract-version": "0.5.16"
25
25
  }
@@ -40,5 +40,5 @@
40
40
  ],
41
41
  "title": "SecretInfo",
42
42
  "type": "object",
43
- "x-contract-version": "0.5.15"
43
+ "x-contract-version": "0.5.16"
44
44
  }
@@ -12,5 +12,5 @@
12
12
  ],
13
13
  "title": "SecretRef",
14
14
  "type": "object",
15
- "x-contract-version": "0.5.15"
15
+ "x-contract-version": "0.5.16"
16
16
  }
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "title": "SeqFlags",
19
19
  "type": "integer",
20
- "x-contract-version": "0.5.15",
20
+ "x-contract-version": "0.5.16",
21
21
  "x-flag-names": {
22
22
  "CHECK": 65536,
23
23
  "INFER": 16,
@@ -82,5 +82,5 @@
82
82
  ],
83
83
  "title": "Step",
84
84
  "type": "object",
85
- "x-contract-version": "0.5.15"
85
+ "x-contract-version": "0.5.16"
86
86
  }
@@ -22,5 +22,5 @@
22
22
  ],
23
23
  "title": "TaskAgg",
24
24
  "type": "object",
25
- "x-contract-version": "0.5.15"
25
+ "x-contract-version": "0.5.16"
26
26
  }
@@ -22,5 +22,5 @@
22
22
  ],
23
23
  "title": "TemplateFiles",
24
24
  "type": "object",
25
- "x-contract-version": "0.5.15"
25
+ "x-contract-version": "0.5.16"
26
26
  }
@@ -20,5 +20,5 @@
20
20
  ],
21
21
  "title": "Timeouts",
22
22
  "type": "object",
23
- "x-contract-version": "0.5.15"
23
+ "x-contract-version": "0.5.16"
24
24
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "UploadTarget",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.15"
27
+ "x-contract-version": "0.5.16"
28
28
  }
@@ -20,5 +20,5 @@
20
20
  ],
21
21
  "title": "Variant",
22
22
  "type": "object",
23
- "x-contract-version": "0.5.15"
23
+ "x-contract-version": "0.5.16"
24
24
  }
@@ -25,5 +25,5 @@
25
25
  ],
26
26
  "title": "VolumeFile",
27
27
  "type": "object",
28
- "x-contract-version": "0.5.15"
28
+ "x-contract-version": "0.5.16"
29
29
  }
@@ -68,5 +68,5 @@
68
68
  ],
69
69
  "title": "VolumeInfo",
70
70
  "type": "object",
71
- "x-contract-version": "0.5.15"
71
+ "x-contract-version": "0.5.16"
72
72
  }
@@ -17,5 +17,5 @@
17
17
  ],
18
18
  "title": "VolumeMount",
19
19
  "type": "object",
20
- "x-contract-version": "0.5.15"
20
+ "x-contract-version": "0.5.16"
21
21
  }
@@ -24,5 +24,5 @@
24
24
  ],
25
25
  "title": "VolumeRef",
26
26
  "type": "object",
27
- "x-contract-version": "0.5.15"
27
+ "x-contract-version": "0.5.16"
28
28
  }
@@ -56,5 +56,5 @@
56
56
  ],
57
57
  "title": "VolumeUploadRequest",
58
58
  "type": "object",
59
- "x-contract-version": "0.5.15"
59
+ "x-contract-version": "0.5.16"
60
60
  }
@@ -65,5 +65,5 @@
65
65
  ],
66
66
  "title": "VolumeUploadResponse",
67
67
  "type": "object",
68
- "x-contract-version": "0.5.15"
68
+ "x-contract-version": "0.5.16"
69
69
  }
@@ -86,5 +86,5 @@
86
86
  ],
87
87
  "title": "WarmingError",
88
88
  "type": "object",
89
- "x-contract-version": "0.5.15"
89
+ "x-contract-version": "0.5.16"
90
90
  }
File without changes