sgl-project/sglang · error · ValueError
invalid duration in action segment {segment!r}
Error message
invalid duration in action segment {segment!r} What it means
Raised by parse_sana_wm_action_string when the frames part of a segment (after the last '-') is not all digits or is <= 0. Duration must be a positive integer.
Source
Thrown at python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/sana_wm/base.py:133
raise ValueError(f"{error_label} must be list[list[str]]")
out.append([str(key).lower() for key in frame_actions])
return out
def parse_sana_wm_action_string(action: str) -> list[list[str]]:
cleaned = "".join(action.replace(",", ",").split())
if not cleaned:
raise ValueError("action string is empty")
per_frame: list[list[str]] = []
for segment in cleaned.split(","):
if not segment or "-" not in segment:
raise ValueError(
f"invalid action segment {segment!r}; expected '<keys>-<frames>'"
)
keys_part, duration = segment.rsplit("-", 1)
if not duration.isdigit() or int(duration) <= 0:
raise ValueError(f"invalid duration in action segment {segment!r}")
if keys_part.lower() == "none":
keys: list[str] = []
else:
bad = sorted(
{
char
for char in keys_part.lower()
if char not in _SANA_WM_ALLOWED_ACTION_KEYS
}
)
if bad:
raise ValueError(
f"unknown action keys {bad}; allowed keys are "
f"{sorted(_SANA_WM_ALLOWED_ACTION_KEYS)}"
)
keys = sorted(set(keys_part.lower()))
# Fresh list per frame: repeated frames must NOT alias one list objectView on GitHub (pinned to 0132848349)
Solutions
- Use a positive integer duration: 'ab-4' not 'ab-0' or 'ab-4.5'
- Clamp/round durations upstream: f'{max(1, round(d))}'
- Reject the request early with a clear message if duration parses to < 1
Example fix
// before segment = 'ab-0' // after segment = 'ab-1'
Defensive patterns
Strategy: validation
Validate before calling
assert all(p.isdigit() and int(p) > 0 for p in (seg.rsplit('-',1)[1] for seg in segments)) Type guard
def durations_valid(s: str) -> bool:
return all((lambda d: d.isdigit() and int(d) > 0)(seg.rsplit('-',1)[-1]) for seg in s.split(',') if seg) Prevention
- Clamp parsed durations to >= 1 at the input boundary
- Reject float/zero durations in request validation
When it happens
Trigger: Segments like 'ab-0', 'ab--1', 'ab-4.5', 'ab-x', or 'ab-' (empty duration). The code does segment.rsplit('-',1) then checks duration.isdigit() and int(duration) > 0.
Common situations: Zero or negative frame counts from user input; float durations like '4.5'; negative numbers creating '--1' after rsplit.
Related errors
- action string is empty
- invalid action segment {segment!r}; expected '<keys>-<frames
- unknown action keys {bad}; allowed keys are {sorted(_SANA_WM
- plucker_emb token count {plucker_emb.shape[1]} != latent tok
- chunk_size must be > 0, got {chunk_size}.
AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28).
Data as JSON: /api/errors/66a2b1726a59be10.
Report an issue: GitHub.