File size: 2,268 Bytes
e488ce7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"""The seam between semantic plans and one video model's reality.

Four methods, one implementation (H3). This is deliberately NOT a plugin
system: there is no factory, no registry of backends, no second backend.
The seam exists so H3's grid law, window planning, guide placement and
expand-to-end semantics live in timeline/h3/ and nothing above it has to
know they exist (architecture amendment, 2026-08-14 night).

Stdlib only.
"""
import abc


class CompileResult(object):
    """What a backend hands back.

    graph:    the executable artifact (for H3: a ComfyUI .api.json dict).
    compiled: the cache block to store in plan['compiled'][backend_id]
              — hold maps, window geometry, dilated lengths, graph path.
    report:   human-readable receipt, printed by nodes and CLIs.
    warnings: things the operator should see but that do not block.
    """

    def __init__(self, graph, compiled, report, warnings=None):
        self.graph = graph
        self.compiled = compiled
        self.report = report
        self.warnings = list(warnings or [])

    def __repr__(self):
        return (f"CompileResult(nodes={len(self.graph or {})}, "
                f"warnings={len(self.warnings)})")


class VideoModelBackend(abc.ABC):
    """A model family's opinion about how to execute a plan."""

    backend_id = "abstract"

    @abc.abstractmethod
    def capabilities(self):
        """-> dict. What lane types compile, what the model can be asked
        for, which structural limits are non-negotiable. UIs use this to
        grey out lanes instead of guessing."""

    @abc.abstractmethod
    def validate(self, plan, ctx=None):
        """-> list of problems with running THIS plan on THIS model.
        Semantic validation already happened in schema.validate; this is
        the model's own refusals (unsupported lane, illegal length that
        cannot be reached, budget below the smallest possible pass)."""

    @abc.abstractmethod
    def compile(self, plan, ctx=None):
        """-> CompileResult. Must be deterministic: same plan revision in,
        same graph out."""

    @abc.abstractmethod
    def estimate(self, plan, ctx=None):
        """-> price.Estimate. The plan's cost on this model, without
        running anything."""