Directory rename (git mv, history preserved) plus rewrite of all references: absolute imports in tests, the zero-dep runner, docstrings, comments, and the README. No behavior change. Run: python3 -m pytest v2/tests/ -q ; python3 v2/run_tests.py ; python3 -m v2.examples
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
"""Artifact — a named, typed output with provenance (design_v3 §12).
|
|
|
|
"This kills the ``extra['audio']`` pattern — audio carries its sample rate as a
|
|
first-class artifact, not a dict passenger." Every artifact records which program
|
|
node produced it (``producer``), so multi-modal fan-out outputs are traceable.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
from .._types import TensorLike
|
|
from .modalpart import Modality
|
|
|
|
|
|
@dataclass
|
|
class Artifact:
|
|
name: str # output slot name, e.g. "video", "audio", "text"
|
|
producer: str = "" # program node id that produced it (provenance)
|
|
meta: dict[str, object] = field(default_factory=dict)
|
|
|
|
|
|
@dataclass
|
|
class VideoArtifact(Artifact):
|
|
frames: TensorLike = None # T x H x W x C
|
|
fps: int = 16
|
|
|
|
|
|
@dataclass
|
|
class AudioArtifact(Artifact):
|
|
samples: TensorLike = None
|
|
sample_rate: int = 44100 # first-class, not an extra-dict passenger
|
|
|
|
|
|
@dataclass
|
|
class TextArtifact(Artifact):
|
|
token_ids: tuple[int, ...] = ()
|
|
text: str = ""
|
|
|
|
|
|
@dataclass
|
|
class TensorArtifact(Artifact):
|
|
tensor: TensorLike = None # generic (e.g. action stream)
|
|
|
|
|
|
@dataclass
|
|
class LatentArtifact(Artifact):
|
|
latent: TensorLike = None
|
|
of_modality: Modality = Modality.VIDEO
|
|
|
|
|
|
@dataclass
|
|
class Output:
|
|
"""The collected result of running a program for one request."""
|
|
request_id: str
|
|
artifacts: dict[str, Artifact] = field(default_factory=dict)
|
|
metrics: dict[str, float] = field(default_factory=dict)
|
|
error: str | None = None # set on partial/aborted delivery (failure isolation)
|
|
|
|
def get(self, name: str) -> Artifact | None:
|
|
return self.artifacts.get(name)
|