EmbodiFlow文档
开始使用数据工作流与算法训练与部署开发者参考
  • 工作流与算法

工作流

  • 认识工作流
  • 搭建自己的工作流
  • 运行与日志

算法

  • 算法目录
  • 编写自定义算法

算法开发指南

  • 第一个算法
    • 标准化
    • 质检
    • 变换
    • 增强
    • 切分
    • 整理
    • 导出
  • 镜像算法
  • 在工作流中使用算法
  • 接口参考
  • SDK 参考
  • 命令行
  • MCP 工具
  • 问题排查

© 2026 EmbodiFlow

llms.txtOpenAPI JSON
  1. 工作流与算法
  2. 算法开发指南
  3. SDK 参考

SDK 参考

embodiflow Python SDK 的全部公开类、方法和装饰器参数,直接由 SDK 生成。

本页由浏览器编辑器做补全时用的同一份 SDK 索引生成,所以始终和你运行的 SDK 一致。所有内容都从 embodiflow 导入:

from embodiflow import Context, Feature, FeatureWriter, Recording, algorithm, param

SDK 自带类型提示(py.typed),你自己的编辑器也能补全;每个类和方法都有文档字符串,浏览器编辑器会在鼠标悬停时显示。下面的说明就是这些文档字符串的中文译文;参数名、类型和代码保持英文。

测试阶段。自定义算法和工作流已经在产品里,可以直接试用,但还没有在真实数据上完成完整验收。可能会遇到不完善的地方,依赖结果之前请先核对。

装饰器

@algorithm.standardize

声明一个标准化算法:把一条 raw 录制转换成标准的 recording。

参数类型必填默认值
namestr是
titlestr是
descriptionstr | None否None
checkslist[Check] | None否None
requiresdict[str, Any] | None否None
paramstype | None否None
resourcesdict[str, Any] | None否None
requirementslist[str] | None否None
retriesint | None否None
cachebool | None否None
serviceslist[str] | None否None

@algorithm.check

声明一个质检算法:判断数据,但从不修改数据。

参数类型必填默认值
namestr是
titlestr是
checkslist[Check]是
descriptionstr | None否None
levelstr | None否None
readsstr | None否None
inputsdict[str, Input] | None否None
requiresdict[str, Any] | None否None
paramstype | None否None
resourcesdict[str, Any] | None否None
requirementslist[str] | None否None
retriesint | None否None
cachebool | None否None
serviceslist[str] | None否None

@algorithm.transform

声明一个变换算法:返回一条替换或裁剪了部分数据流的录制。

参数类型必填默认值
namestr是
titlestr是
descriptionstr | None否None
inputsdict[str, Input] | None否None
checkslist[Check] | None否None
requiresdict[str, Any] | None否None
paramstype | None否None
resourcesdict[str, Any] | None否None
requirementslist[str] | None否None
retriesint | None否None
cachebool | None否None
serviceslist[str] | None否None
privacystr | None否None

@algorithm.enrich

声明一个增强算法:计算新的信息,但不修改录制。

参数类型必填默认值
namestr是
titlestr是
featureslist[Feature]是
descriptionstr | None否None
levelstr | None否None
inputsdict[str, Input] | None否None
checkslist[Check] | None否None
requiresdict[str, Any] | None否None
paramstype | None否None
resourcesdict[str, Any] | None否None
requirementslist[str] | None否None
retriesint | None否None
cachebool | None否None
serviceslist[str] | None否None
privacystr | None否None

@algorithm.segment

声明一个切分算法:提出任务片段,即带有任务文字的时间范围。

参数类型必填默认值
namestr是
titlestr是
descriptionstr | None否None
labelsdict[str, str] | None否None
inputsdict[str, Input] | None否None
checkslist[Check] | None否None
requiresdict[str, Any] | None否None
paramstype | None否None
resourcesdict[str, Any] | None否None
requirementslist[str] | None否None
retriesint | None否None
cachebool | None否None
serviceslist[str] | None否None
segment_sourcestr | None否None

@algorithm.curate

声明一个整理算法:逐个任务片段决定数据集版本是否保留它、它的划分和任务。

参数类型必填默认值
namestr是
titlestr是
descriptionstr | None否None
requiresdict[str, Any] | None否None
paramstype | None否None
resourcesdict[str, Any] | None否None
requirementslist[str] | None否None
retriesint | None否None
cachebool | None否None

@algorithm.export

声明一个导出算法:把数据集版本写成可下载的文件。

参数类型必填默认值
namestr是
titlestr是
descriptionstr | None否None
requiresdict[str, Any] | None否None
paramstype | None否None
resourcesdict[str, Any] | None否None
requirementslist[str] | None否None
retriesint | None否None
cachebool | None否None

函数

param(default, *, minimum=None, maximum=None, enum=None, title=None, description=None, widget=None)

声明 Params 数据类中的一个字段,包括默认值和取值范围。

类

ArtifactWriter

收集导出的文件(embodiflow-artifact/v1)。

属性含义
checks: 'CheckWriter'本算法声明的质检结果对应的 CheckWriter(checks=[Check(...)])。
方法含义
format(name: str) -> None指定文件的格式(lerobot-v3、csv 等)。
path(rel: str) -> Path产物中要写入的路径(会自动创建父目录)。
add(src: str | Path, rel: str) -> None把文件或文件夹 src 复制到产物的 rel 位置。
summary(doc: dict[str, Any]) -> None描述本次导出(数量、大小等),显示在下载页面上。

Camera

录制中的一个相机。

属性含义
anonymized: bool
distortion: list[float] | None
height: int
intrinsics: list[list[float]] | None
key: str
model: str | None
role: str
video_path: Path录制目录中该相机的 mp4 文件。
width: int
方法含义
valid() -> 'np.ndarray'每帧一个布尔值:相机有缺帧的位置为 False,视频中对应位置是黑色占位帧。
frames(start: int=0, stop: int | None=None, step: int=1, gray: bool=False, size: tuple[int, int] | None=None) -> Iterator[Frame]按 step 解码 start..stop 之间的帧(索引相对于本录制或任务片段窗口)。
frame(i: int) -> Frame解码第 i 帧。

Check

算法可以通过 CheckWriter.result 报告的一个质检结果 id。

属性含义
description: str
id: str
title: str
方法含义
to_dict() -> dict[str, Any]作为清单输入的声明形式。

CheckWriter

收集质检结果(embodiflow-checks/v1)。

属性含义
checks: 'CheckWriter'本算法声明的质检结果对应的 CheckWriter(checks=[Check(...)])。
方法含义
result(id: str, status: str, value: float | None=None, threshold: float | None=None, message: str='', evidence: Sequence[str | Path] | None=None, at: Mapping[str, Any] | None=None) -> None报告一条结果。
evidence_path(name: str) -> Pathevidence/ 下的路径,用来写入图片或文件;传给 result(evidence=[...])。
metrics(doc: dict[str, Any]) -> None附加一个 embodiflow-quality-metrics/v1 内容(仅限内置质检)。

Column

录制中的一个表格列:name、dtype、shape、names,以及约定字段 unit、frame、source。

属性含义
dtype: str
frame: str | None
name: str
names: list[str] | None
shape: list[int]
source: str | None
type: str | None
unit: str | None

Context

运行时可以获取的全部信息:参数、事实、标识符、临时空间、日志和进度。

属性含义
facts: Facts
log: logging.Logger
params: P
platform_params: dict[str, Any]平台为标准化步骤解析出的内容(rigProfiles、teamDataFormat),否则为空。
recording_id: str | None本步骤处理的录制(数据集级步骤为 None)。
run_id: str工作流运行 id。
step_id: str本步骤在工作流中的 id。
team_slug: str | None团队的存储标识(用于识别团队功能);作业未声明时为 None。
tmp: Path
方法含义
progress(done: int, total: int, message: str='') -> None向运行视图报告进度(进度条和预计剩余时间);可以频繁调用。
not_applicable(code: str, message: str) -> NoReturn以「不适用」结束本步骤(退出码 85,运行视图中显示为灰色,不算失败)。
input_unusable(code: str, message: str) -> NoReturn因数据损坏结束本步骤(退出码 87):步骤失败,录制会被隔离。

DatasetVersion

冻结的数据集版本:id、features(声明的名称和类型)和 members。

属性含义
document: dict[str, Any]
features: dict[str, dict[str, Any]]
id: str
members: list[Member]
方法含义
to_pandas() -> 'pd.DataFrame'每个成员一行:id、录制、起止与时长、任务、划分、标签、质检状态、会话和操作员。

Episode

录制中的一个任务片段:index、start_s、end_s(录制时间轴)、task、labels、confidence。

属性含义
confidence: float | None
duration_s: float长度,单位为秒。
end_s: float
index: int
labels: dict[str, Any]
start_s: float
task: str | None

EpisodeWriter

收集提出的任务片段(embodiflow-episodes/v1)。

属性含义
checks: 'CheckWriter'本算法声明的质检结果对应的 CheckWriter(checks=[Check(...)])。
方法含义
episode(start_s: float, end_s: float, task: str, labels: Mapping[str, Any] | None=None, confidence: float | None=None) -> None添加一个任务片段:startS/endS 为秒,task 为任务文字,可选 labels,confidence 取值 0 到 1。

Facts

主输入的事实(契约 2.1),可以用属性访问,例如 ctx.facts.kind、ctx.facts.stereo。

属性含义
action: bool | None
cameras: int | None
duration_s: float | None
episodes: int | None
format: str | None
gripper_width: bool | None
imu: bool | None
kind: str | None
privacy_required: bool | None
recorded_hand_pose: bool | None
stereo: bool | None
方法含义
get(name: str, default: Any=None) -> Any某个事实的值;未知时返回 default。
as_dict() -> dict[str, Any]所有已知事实,以普通字典返回。

Feature

enrich 算法声明的一个特征,之后通过 FeatureWriter 写入。

属性含义
describe: dict[str, Any] | None
dtype: str | None
frame: str | None
name: str
names: list[str] | None
per: str
shape: list[int] | None
source: str | None
type: str
unit: str | None
方法含义
to_dict() -> dict[str, Any]作为清单输入的声明形式:只包含传入过的参数。

FeatureWriter

收集 enrich 算法计算的特征(embodiflow-features/v1)。

属性含义
checks: 'CheckWriter'本算法声明的质检结果对应的 CheckWriter(checks=[Check(...)])。
方法含义
per_frame(name: str, values: Any, confidence: str | None=None) -> None每帧写入一行:values 的形状为 (num_frames, *shape)(标量为一维数组)。
per_recording(name: str, value: Any) -> None为整条录制写入一个值(JSON,最大 1 MiB)。
per_episode(name: str, value: Any) -> None写入正在处理的任务片段的值(仅限任务片段级的 enrich)。
file(name: str, path: str | Path, describe: Mapping[str, Any] | None=None) -> None为 per="file" 的特征附加一个文件(例如深度视频)。

Features

features 输入(包含 features.json、frames.parquet、episodes.parquet 和 files/)。

属性含义
document: dict[str, Any]
names: list[str]所有特征的名称。
num_frames: int
方法含义
info(name: str) -> dict[str, Any]name 对应的 features.json 条目(类型、per、dtype、shape、unit、frame、source、describe)。
of_type(semantic_type: str) -> list[str]语义类型为 semantic_type 的特征名称。
per_frame(name: str) -> 'np.ndarray'逐帧特征的值,形状为 (num_frames, *shape);任务片段窗口之外的行为 NaN/None。
per_recording(name: str) -> Any逐录制特征的值。
per_episode(name: str) -> dict[int, Any]逐任务片段特征的 {episodeIndex: value}。
file(name: str) -> Path逐文件特征(例如深度视频)的路径。

Frame

一帧解码后的视频:index(录制或片段窗口内的索引)、time_s 和 image(RGB 的 H x W x 3 uint8;gray 时为 H x W)。

属性含义
image: 'np.ndarray'
index: int
time_s: float

Input

额外的 features 输入(例如标定、手部姿态)。

属性含义
optional: bool
requires: list[str]
方法含义
to_dict() -> dict[str, Any]作为清单输入的声明形式。

InputUnavailableError

算法请求的输入不存在(端口缺失、文件或下载不存在)。

ManifestDriftError

代码的接口与本版本冻结的清单不一致。

ManifestError

算法接口无效(ALGORITHM_FILE_INVALID 及同类错误码)。

McapMessage

解码后的 ROS 2 消息:topic、schema、log_time_s(从文件第一条消息起的秒数)。

McapReader

通过摘要和查询所需的数据块读取的 MCAP 文件。

属性含义
duration_s: float
end_ns: int
start_ns: int
topics: list[McapTopic]
方法含义
messages(topics: Sequence[str] | None=None, start_s: float | None=None, end_s: float | None=None) -> Iterator[McapMessage]按日志时间排序的解码消息;topics 按名称过滤,start_s/end_s 限定日志时间。

McapTopic

MCAP 文件中的一个话题:name、消息 schema 名称、消息数 count 和平均频率 rate(Hz)。

属性含义
count: int
name: str
rate: float
schema: str

Member

数据集版本中的一个任务片段。

属性含义
duration_s: float任务片段的长度,单位为秒。
end_s: float
episode_id: str
features: dict[str, Any]
labels: dict[str, Any]
operator: str | None
quality: dict[str, Any]
recording_id: str
root: str
session: str | None
split: str | None
start_s: float
task: str | None
方法含义
recording() -> Recording任务片段所在录制的窗口;首次使用时会下载其文件。

OutputError

写入器拒绝了算法给出的内容。

RawFile

一个上传的文件:path(相对于上传根目录)、size(字节)和磁盘上的 local_path。

属性含义
local_path: Path
path: str
size: int
方法含义
open(mode: str='rb') -> IO[Any]打开文件(只读,默认为二进制)。

RawFiles

一条录制上传的全部文件,使用它们相对上传目录的路径。

属性含义
files: list[RawFile]
方法含义
find(pattern: str) -> list[RawFile]路径匹配通配符 pattern 的文件(* 匹配单层目录,** 跨目录匹配)。
read_json(path: str) -> Any解析 path 处的 JSON 文件。
read_yaml(path: str) -> Any解析 path 处的 YAML 文件。
mcap(path: str | None=None) -> 'McapReader'打开 MCAP 文件;上传中只有一个文件时可以省略 path。

Recording

标准录制(LeRobot v3 目录树加 meta/embodiflow/recording.json),或它的一段时间窗口。

属性含义
calibration: dict[str, Any]约定侧车文件中的标定:按原样保存的 frames、stereoPairs 和 timeOffsets。
cameras: list[Camera]
columns: list[Column]
conventions: dict[str, Any]
duration_s: float长度,单位为秒。
facts: dict[str, Any]
fps: float
info: dict[str, Any]
kind: str | None
meta: dict[str, Any]
num_frames: int
start_s: float本录制(或任务片段窗口)在录制时间轴上的起点,单位为秒。
stereo_pairs: list[dict[str, str]]
task: str | None
total_frames: int
方法含义
window(start_s: float, end_s: float) -> 'Recording'本录制中 start_s 到 end_s 之间的部分(秒,以本录制自己的时间轴计)。
table(columns: Sequence[str] | None=None) -> 'pa.Table'帧表(本录制或窗口每帧一行),为 pyarrow.Table。
column(name: str) -> 'np.ndarray'一列数据,为形状 (num_frames, *shape) 的 numpy 数组。

RecordingBuilder

从源格式构建标准录制。

属性含义
checks: 'CheckWriter'本算法声明的质检结果对应的 CheckWriter(checks=[Check(...)])。
root: Pathrecording 端口的输出目录(配合 :meth:adopt_tree 使用)。
方法含义
adopt_tree() -> None声明本次运行已自行把完整的标准目录树写入 out.root(内置标准化算法自带目录树写入器)。
fps(value: int) -> None声明录制的帧率:30(平台网格;其他帧率会被拒绝)。
task(text: str) -> None设置录制的任务文字(一条录制一个任务)。
camera(key: str, role: str, frames: Iterable[Any] | Any=None, video: str | Path | None=None, intrinsics: Sequence[Sequence[float]] | None=None, distortion: Sequence[float] | None=None, model: str | None=None) -> None从 RGB frames(形状 N x H x W x 3 的 uint8 数组,或逐帧的 H x W x 3 迭代器)或 video 文件添加一个相机。
column(name: str, values: Any, type: str='vector', unit: str='none', frame: str='none', source: str='recorded', names: Sequence[str] | None=None) -> None添加一个表格列,每帧一行:values 的形状为 (N,) 或 (N, ...)。
timestamps(seconds: Any) -> None记录每一行的源采集时间(秒,非递减);与录制一并保存。
stereo_pair(left: str, right: str) -> None把两个已添加的相机声明为一个立体对(键名或简称)。
dropped(what: str, reason: str) -> None声明源数据中未进入录制的内容,以及原因。

RecordingEditor

编辑输入录制:替换或删除相机、替换列、裁剪。

属性含义
checks: 'CheckWriter'本算法声明的质检结果对应的 CheckWriter(checks=[Check(...)])。
root: Pathrecording 端口的输出目录(配合 :meth:adopt_tree 使用)。
方法含义
adopt_tree() -> None声明本次运行已自行把完整的编辑后目录树写入 out.root(内置变换自带视频处理路径,例如使用硬件编码器的脱敏)。
unchanged() -> None原样透传输入录制(零拷贝)。
replace_camera(key: str, frames: Iterable[Any] | Any=None, video: str | Path | None=None, anonymized: bool | None=None) -> None用 frames(逐帧的 H x W x 3 uint8 图像迭代器,每输入帧一张)或 video 替换相机 key 的画面。
drop_camera(key: str) -> None从录制中删除相机 key。
replace_column(name: str, values: Any) -> None替换列 name 的值;values 的形状与现有列相同(每输入帧一行)。
trim(start_s: float, end_s: float) -> None只保留录制中 start_s 到 end_s(秒)的部分。

SelectionWriter

收集逐任务片段的决定(embodiflow-selection/v1)。

属性含义
checks: 'CheckWriter'本算法声明的质检结果对应的 CheckWriter(checks=[Check(...)])。
方法含义
keep(episode_id: str, split: str | None=None, task: str | None=None, reason: str | None=None) -> None保留该任务片段,可选指定 split(train/val/test),并替换它的 task 文字。
count(name: str, value: int) -> None在选择摘要(summary.counts)中报告一个命名计数,例如 count("grouped_by_recording", 3)。
drop(episode_id: str, reason: str) -> None从新版本中删除该任务片段;reason 会显示给团队。

SetupContext

setup(ctx) 能看到的内容:参数、事实、临时目录和日志记录器。

属性含义
facts: Facts
log: logging.Logger
params: Any
run_id: str工作流运行 id。
step_id: str本步骤在工作流中的 id。
tmp: Path

TransientError

当重试可能成功时抛出(网络、GPU 忙碌):步骤以退出码 88 结束并会被重试。

词表

名称允许的值
categoriesstandardize, check, transform, enrich, segment, curate, export
levelsrecording, episode, dataset
statusespass, warn, fail, error, not_evaluated, not_applicable
perframe, recording, episode, file
sourcesrecorded, imported, estimated, computed, retargeted
dtypesfloat32, float64, int8, int16, int32, int64, uint8, uint16
splitstrain, val, test
semanticTypesscalar, vector, label.bool, label.category, label.text, spans, embedding, pose.se3, keypoints3d.hand21, skeleton.hand21, skeleton.body22, keypoints2d, confidence, calibration.stereo, calibration.cam_imu, depth.video, mask.video, video.preview, ros2.mcap, action.joint, action.ee_pose, json
factskind, format, privacy_required, duration_s, cameras, stereo, imu, action, recorded_hand_pose, gripper_width, episodes
privacyredacts, numbers_only
servicesvlm
runParametersraw, recording, version, episode, out, ctx, state

下一步

  • 接口参考
  • 问题排查
上一页

接口参考

下一页

命令行