roboto.experimental.ingest#

Describe a recording’s contents and hand them to the platform in one call.

Callers state what their data is and which slices belong together; the platform composes the underlying writes.

Submodules#

Package Contents#

class roboto.experimental.ingest.Field(/, **data)#

Bases: pydantic.BaseModel

One column of a topic’s data, identified by name, type, and unit.

path lists the names from the schema root down to this field, so a nested field’s path extends its parent’s. name and path state one fact twice (the last path element is the field’s name), so either may be omitted and derives from the other: a top-level field needs only name, and a nested field needs only path. A vector column (e.g. a LeRobot observation.state feature) is expressed as a parent field holding the array plus one child field per named element.

This is what a caller declares. SchemaFieldRecord is what the platform returns for a field it has stored, and carries the identifiers it assigns.

Parameters:

data (Any)

canonical_data_type: roboto.domain.topics.record.CanonicalDataType#

Roboto’s normalized type for the field, used for cross-format reads and visualization.

data_type: str = None#

Native type of the field as recorded by the source format (e.g. "float32").

model_config#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: str = ''#

Name of the field. Defaults to the last element of path when only path is given; at least one of name and path must be declared.

path: list[str] = None#

The names from the schema root down to this field; a nested field’s path extends its parent’s path. Omitted, None, or empty defaults to [name]; when given, every element must be non-empty and the last element must equal name.

unit: str | None = None#

Unit of the field’s values (e.g. "rad"). A field typed Timestamp must carry a TimeUnit value (one of "s", "ms", "us", "ns").

class roboto.experimental.ingest.Schema(/, **data)#

Bases: pydantic.BaseModel

The structure of one topic’s data: the columns it carries.

However a schema is produced, whether hand-written field by field or converted from a source format’s own metadata, the registered result is the same: schemas are content-addressed server-side. Identity covers every attribute of every field (name, path, source data type, canonical type, and unit), so identical declarations collapse to a single stored schema no matter how many times they are repeated, while declarations differing in any field attribute are stored separately.

A column a timeline source reads is declared by typing it Timestamp with a TimeUnit unit; nothing else marks it. Which of a topic’s timeline sources reads fall back to is not part of the schema: it is stated on timeline_sources and can be changed later, so the same columns are one schema no matter which source is preferred.

This is what a caller declares, so it carries no checksum: the platform computes that from the fields. TopicSchemaRecord is the stored schema the platform returns, carrying that checksum and the identifiers it assigns.

Parameters:

data (Any)

fields: list[Field] = None#

Declared columns of the topic’s data. At least one is required, and every field’s path must be unique within the schema.

model_config#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: str | None = None#

Informational label for the schema (often the topic name). Not part of schema identity.