Skip to content

Python API

import kinodb

Exports:

NameDescription
kinodb.open(path)Open a .kdb file
kinodb.DatabaseRust-backed reader class
kinodb.__version__Python package version
db = kinodb.open("data.kdb")

Returns a Database. Raises IOError if the file cannot be opened or parsed.

len(db)
db.num_episodes()
db.num_frames()
db.path()
db.version()
db.summary()
MethodReturns
num_episodes()number of episodes
num_frames()total frames
path()source path
version()file format version string
summary()human-readable summary
__len__()same as num_episodes()
meta = db.read_meta(0)

Returns:

{
"episode_id": 0,
"embodiment": "franka",
"task": "open the drawer",
"num_frames": 92,
"fps": 20.0,
"action_dim": 7,
"success": True,
"total_reward": 1.0,
}
episode = db.read_episode(0)

Returns:

KeyType
metadict
actionsNumPy float32, (T, action_dim)
statesNumPy float32, (T, state_dim)
rewardsNumPy float32, (T,)
is_terminallist of bool
imagesdict camera -> NumPy uint8, (T, H, W, C)
episode = db.read_episode_actions_only(0)

Same shape for metadata/actions/states/rewards, but skips image decode and omits images.

Use this for low-dimensional policies or training benchmarks where images are not part of the measured path.

positions = db.query("success = true AND num_frames > 50")

Returns a list of matching episode positions.

Raises ValueError on parse errors.

from kinodb.torch import KinoDataset, KinoMapDataset, KinoIterDataset, from_mixture
dataset = KinoDataset(
"data.kdb",
kql_filter="success = true",
image_key="front",
image_size=(224, 224),
to_tensor=True,
)

Arguments:

ArgumentTypeDescription
db_pathstr.kdb path
kql_filterstr or NoneOptional KQL filter
image_keystr or NoneCamera name, first camera if omitted
image_sizetuple or NoneResize to (H, W)
to_tensorboolConvert NumPy arrays to Torch tensors
dataset = KinoIterDataset(
"data.kdb",
shuffle=True,
seed=42,
)

Can also receive {path: weight} for multi-source iteration.

dataset = from_mixture(
{"bridge.kdb": 0.4, "aloha.kdb": 0.6},
seed=42,
)

Returns a KinoIterDataset.

from kinodb.remote import KinoClient, KinoRemoteDataset
client = KinoClient("localhost:50051")
info = client.server_info()
meta = client.get_meta(0)
episode = client.get_episode(0)
batch = client.get_batch(32, mode="random", include_images=False)
hits = client.query("success = true", limit=10)
client.close()
dataset = KinoRemoteDataset(
"localhost:50051",
batch_size=32,
include_images=False,
to_tensor=True,
)

Yields episodes from server-side batches.

SituationPython error
Cannot open fileIOError
Invalid episode positionIndexError
KQL parse errorValueError
NumPy shape conversion issueValueError
Missing gRPC dependencyImportError