CLI reference¶
The datavo CLI covers configuration, catalog inspection, dataset and split
authoring from spec files, downloads, and the archive/delete lifecycle. Data-plane work —
selecting, iterating, attaching — is the SDK (guide).
Everything below runs as datavo <command> when the CLI is installed, or
uv run datavo <command> from this repo. Most commands take --format json for
machine-readable output.
Auth¶
datavo auth login # interactive Entra login
datavo auth status # local credential state
datavo auth logout # clear token and MSAL cache
The CLI targets https://prod.datavo.io unless you tell it otherwise, so a fresh
install needs nothing but auth login.
Profiles — only for other instances¶
datavo config set dev --url https://dev.datavo.io # create/update a profile
datavo config use dev # make it active
datavo config list # profiles, active one marked
datavo config show # the active profile + server config
datavo config remove dev
Profiles live in ~/.datavo/config.json; omitting the profile name on
config set names it after the URL's hostname. auth login takes no flags
against an Entra server — --token, --tenant-id, --client-id and --scope
are overrides for unusual setups.
Every command targets the active profile — and with none set that is production.
Check datavo config list before anything that writes; DATAVO_PROFILE=<name> datavo …
overrides for one invocation, as does DATAVO_API_BASE_URL=<url>.
datavo version prints the CLI's own version; it does not call the server. The
server's version and public settings come from GET /config, which config set
fetches and caches.
On a failure the CLI prints the request method, URL and status; a validation error
(422) is summarized field-by-field, and --verbose (or DATAVO_VERBOSE=1) adds the
full response body. When the CLI's version differs from the server's, the error ends
with an upgrade line — a stale CLI is the usual cause of a 422 or an unparseable
response, and uv tool upgrade datavo-cli is the fix.
Stores¶
datavo sample-store create voice_corpus_v1
datavo sample-store list
datavo sample-store get voice_corpus_v1
datavo sample-store archive voice_corpus_v1 # required before delete
datavo sample-store restore voice_corpus_v1 # undo an archive
datavo sample-store delete voice_corpus_v1 # archived stores only
# operation log — inspect and revert
datavo sample-store operations list voice_corpus_v1
datavo sample-store operations remove voice_corpus_v1 <op-id>
# seed a disposable store from real data (chapter 5 of the guide)
datavo sample-store copy eval-scratch --source-store voice_corpus_v1 --limit 50
datavo sample-store copy ds-scratch --source-dataset voice_train_v1 --limit 30
datavo sample-store transfer <source> <target> # move a whole store's contents
copy requires a source and --limit; --key projects keys, --has-key
narrows to samples that have one, and --randomize (with --seed) takes a
repeatable random subset. The full archive→delete lifecycle runs from the CLI:
archive first, then delete. Permanent deletion is blocked while a protecting
dataset depends on the store — see
lifecycle and retention.
operations list shows the store's grow/attach operations oldest-first with their
ids; operations remove <op-id> reverts one — an attach operation invalidates
exactly the samples it wrote (so a producer re-run recomputes only them), an add
or source_import removes the samples it introduced. It reports HTTP 409 while a
protected reference pins the operation.
Samples¶
datavo sample get <sample_id> # detail + available keys
datavo sample history <sample_id> # key revision history
Datasets¶
Dataset and split authoring is spec-file first, which is what makes definitions reviewable and checked in:
datavo dataset list # names, state, sample counts
datavo dataset preview --spec voice_train.yaml # dry run: counts, no writes
datavo dataset create --spec voice_train.yaml
datavo dataset get voice_train_v1
datavo dataset add-key-group voice_train_v1 --spec conditioning_group.yaml
datavo dataset pull voice_train_v1 --output-dir ./downloaded/train
datavo dataset archive voice_train_v1 # required before delete
datavo dataset restore voice_train_v1
datavo dataset delete voice_train_v1 # archived datasets only
list takes --query, --include-archived, and --offset/--limit. As with
stores, deletion runs archive→delete from the CLI and is blocked while a consumer
depends on the dataset.
A spec is the create request in YAML. The canonical form keeps a workset you selected with the SDK (guide chapter 11):
name: voice_train_v1
from_workset: ws_7f3c…
shard_plan:
shard_size: 1000
scalars:
sample_rate: 24000
Add --wait to create to poll until the dataset is ready instead of
returning the planning response. pull writes one tar per shard under
<output-dir>/<key-group>/, every key group unless --key-group narrows it;
--overwrite replaces existing files.
Split sets¶
datavo split-set preview voice_train_v1 --spec voice_split.yaml # dry run + diagnostics
datavo split-set create voice_train_v1 --spec voice_split.yaml
datavo split-set get voice_train_v1 voice_v1
datavo split-set list voice_train_v1 # split sets under a parent dataset
datavo split-set splits voice_train_v1 # the child datasets they generated
datavo split-set archive voice_train_v1 voice_v1 # required before delete
datavo split-set restore voice_train_v1 voice_v1
datavo split-set delete voice_train_v1 voice_v1 # archived split sets only
name: voice_v1
assignment_seed: 7
splits:
- name: train
ratio: 0.6
- name: val
ratio: 0.2
- name: test
ratio: 0.2
rules:
- kind: exclusivity
keys: [speaker.txt]
enforcement: hard
shard_plan:
shard_size: 256
The spec's name is the split-set name and becomes the prefix of the generated
datasets (voice_v1/train, …). Every split command takes the parent dataset as
its first argument. Pass --split-set <name> to splits to scope the listing when
a dataset has several.
Those children are ordinary datasets, so datavo dataset pull voice_v1/train
--output-dir ./data downloads one split's tars the same as any other dataset.
Cache¶
datavo warm voice_v1/train # pre-populate the local cache
datavo warm voice_v1/train --key audio.wav # only these keys
warm fetches shards ahead of a run — every key unless --key narrows it, and
--cache-config points at a shards.yaml other than the default.
See the shard cache.