---
sidebar:
  hidden: true
title: roboto.experimental.ingest.schema
---
## Module Contents

### Field

```python
class roboto.experimental.ingest.schema.Field(/, **data: Any)
```

`from roboto.experimental.ingest import Field`

[Source](https://github.com/roboto-ai/roboto-python-sdk/blob/main/src/roboto/experimental/ingest/schema.py#L15-L92)

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`](/reference/python-sdk/roboto/domain/topics/record#roboto.domain.topics.record.SchemaFieldRecord) is what the platform returns for a field it has stored, and carries the identifiers it assigns.

**Parameters**

- **data** (`Any`)

**Attributes**

- **Field.canonical_data_type** (`roboto.domain.topics.record.CanonicalDataType`): Roboto's normalized type for the field, used for cross-format reads and visualization.
- **Field.data_type** (`str`) = `None`: Native type of the field as recorded by the source format (e.g. `"float32"`).
- **Field.model_config**: Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- **Field.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.
- **Field.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`.
- **Field.unit** (`str | None`) = `None`: Unit of the field's values (e.g. `"rad"`). A field typed [`Timestamp`](/reference/python-sdk/roboto/domain/topics/record#roboto.domain.topics.record.CanonicalDataType.Timestamp) must carry a [`TimeUnit`](/reference/python-sdk/roboto/time#roboto.time.TimeUnit) value (one of `"s"`, `"ms"`, `"us"`, `"ns"`).

### Schema

```python
class roboto.experimental.ingest.schema.Schema(/, **data: Any)
```

`from roboto.experimental.ingest import Schema`

[Source](https://github.com/roboto-ai/roboto-python-sdk/blob/main/src/roboto/experimental/ingest/schema.py#L95-L133)

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`](/reference/python-sdk/roboto/domain/topics/record#roboto.domain.topics.record.CanonicalDataType.Timestamp) with a [`TimeUnit`](/reference/python-sdk/roboto/time#roboto.time.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`](/reference/python-sdk/roboto/experimental/ingest/operations#roboto.experimental.ingest.operations.TopicDeclaration.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`](/reference/python-sdk/roboto/domain/topics/record#roboto.domain.topics.record.TopicSchemaRecord) is the stored schema the platform returns, carrying that checksum and the identifiers it assigns.

**Parameters**

- **data** (`Any`)

**Attributes**

- **Schema.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.
- **Schema.model_config**: Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- **Schema.name** (`str | None`) = `None`: Informational label for the schema (often the topic name). Not part of schema identity.
