Sign in Get started

CLI

Every `pictograph` subcommand, mirroring the SDK 1:1. Install via `pip install 'pictograph[cli]'`.

View as Markdown

The pictograph CLI is a thin wrapper over the SDK with Rich-formatted output. Same operations, same auth, same vocabulary.

pip install 'pictograph[cli]'
pictograph login                # interactive; writes ~/.pictograph/config.toml
pictograph datasets list

Auth resolves --api-key flag, then PICTOGRAPH_API_KEY, then ~/.pictograph/config.toml. --api-key, --json and --yes are per-command options, not global: write pictograph datasets list --json.

--version / -V is the only root-level flag. Every command takes --help.

Datasets, images, models, deployments, workflows and webhooks are addressed by name; a UUID works anywhere a name does.

init / login

Source: cli/commands/init.py · cli/commands/login.py

pictograph init                  # drop an AGENTS.md template into ./
pictograph login                 # save an API key (input hidden)

datasets

Source: cli/commands/datasets.py

pictograph datasets list --json
pictograph datasets get road-signs --include-images
pictograph datasets insights road-signs                     # class balance, stages, dimensions
pictograph datasets duplicates road-signs -t 0.94           # near-duplicate clusters
pictograph datasets create road-signs -d "Description" -t bbox
pictograph datasets update road-signs --new-name renamed
pictograph datasets archive road-signs                      # hide from the default list
pictograph datasets unarchive road-signs
pictograph datasets delete road-signs --yes
pictograph datasets download road-signs -o ./dump -w 10     # images + annotations
pictograph datasets export road-signs --format coco -o ./exports   # -o is a DIRECTORY
pictograph datasets import-coco road-signs ./instances.json
pictograph datasets storage road-signs                      # cold-storage state + restore quote
pictograph datasets freeze road-signs                       # cold storage (free)
pictograph datasets restore road-signs                      # charges compute credits

images

Source: cli/commands/images.py

Every per-image command takes the dataset first, then the filename.

pictograph images list road-signs --directory /train --status complete
pictograph images list road-signs --split val --min-confidence-lt 0.4   # active learning
pictograph images upload road-signs ./photo.jpg --directory /cars
pictograph images bulk-upload road-signs ./a.jpg ./b.jpg --directory /cars
pictograph images upload-directory road-signs ./photos      # recreates the subdirectory tree
pictograph images get road-signs 001.jpg
pictograph images download road-signs 001.jpg -o ./out.jpg
pictograph images delete road-signs 001.jpg --yes           # --archive to soft-delete
pictograph images tag road-signs <image-uuid> -t blurry     # UUIDs; --remove to strip
pictograph images review road-signs 001.jpg                 # approve -> complete
pictograph images review road-signs 001.jpg --request-changes -n "fix bbox"
pictograph images split road-signs 001.jpg train            # train | val | test | none
pictograph images rebalance <dataset-uuid> --train 80 --val 10 --test 10

annotations

Source: cli/commands/annotations.py

pictograph annotations get road-signs 001.jpg
pictograph annotations save road-signs 001.jpg -f ./anns.json   # JSON list, full overwrite
pictograph annotations bulk-save -f ./many.json                 # {"image-uuid": [...]}
pictograph annotations delete road-signs 001.jpg --yes
pictograph annotations rename-class road-signs car vehicle --yes
pictograph annotations merge-class road-signs van truck --yes   # reassign, then drop `van`
pictograph annotations delete-class road-signs van --with-annotations --yes

auto-annotate

Source: cli/commands/auto_annotate.py

pictograph auto-annotate point road-signs 001.jpg --x 120 --y 90 --name sign
pictograph auto-annotate box road-signs 001.jpg --box 10,20,200,150 --name sign
pictograph auto-annotate text road-signs 001.jpg --prompt "stop sign"
pictograph auto-annotate batch road-signs --images a.jpg,b.jpg \
    --classes "person:bbox,car:polygon" --confidence 0.5     # waits unless --no-wait
pictograph auto-annotate batch road-signs --images a.jpg,b.jpg --model "Shelf Detector"
pictograph auto-annotate quote --dataset road-signs --images a.jpg,b.jpg \
    --classes "person:bbox"                                  # price it without running
pictograph auto-annotate get <job-uuid>
pictograph auto-annotate cancel-batch <job-uuid> --yes

quote --frames N prices images that do not exist yet, which is what you want before cutting a video into frames.

train

Source: cli/commands/train.py

A run trains a completed export, so start takes the dataset and the export name.

pictograph train start road-signs road-signs-v1 --pipeline yolox --gpu a10g
pictograph train start road-signs road-signs-v1 --pipeline rfdetr_segmentation \
    --gpu a100 --config '{"epochs": 50}'
pictograph train list --status running
pictograph train status <run-uuid>
pictograph train wait <run-uuid> --timeout 7200
pictograph train cancel <run-uuid> --yes
pictograph train cancel-batch <run-uuid> <run-uuid> --yes

augment

Source: cli/commands/augment.py

pictograph augment ops                                       # every op and its flag
pictograph augment dataset road-signs --into road-signs-aug \
    --multiplier 3 --flip --rotate 15 --brightness 0.2
pictograph augment dataset road-signs --grayscale --blur 2 \
    --crop 0.8 --resize 640x480 --seed 42                    # --seed for reproducibility

tile

Source: cli/commands/tile.py

pictograph tile dataset aerial --into aerial-tiled -r 2 -c 2
pictograph tile dataset aerial --into aerial-tiled \
    -r 3 -c 3 --overlap 0.1 --exclude-empty

models

Source: cli/commands/models.py

pictograph models list
pictograph models get "Shelf Detector"
pictograph models update "Shelf Detector" --name "Signs v2" --visibility public
pictograph models download "Shelf Detector" -o ./yolox.onnx -f onnx
pictograph models predict "Shelf Detector" ./photo.jpg       # local; needs [inference]
pictograph models predict "Shelf Detector" ./photo.jpg --remote   # runs on our GPUs
pictograph models fork <organization> <model>          # fork a public model
pictograph models delete "Shelf Detector" --yes              # admin/owner

-f accepts onnx (default), pytorch, safetensors, pte or engine. A format the model does not publish is refused, never substituted.

metrics

Source: cli/commands/metrics.py

Offline detection evaluation: no network call, no credits. Both files are Pictograph JSON mapping an image key to its annotations ({"img.jpg": [{…, "confidence": 0.8}]}). Handy in CI to fail a build when mAP drops.

pictograph metrics evaluate preds.json ground_truth.json --iou 0.5   # P/R/F1 + mAP

deployments

Source: cli/commands/deployments.py

pictograph deployments list
pictograph deployments get "prod-detector"
pictograph deployments compute-options                       # tiers + per-minute rate
pictograph deployments quote --gpu t4 --min-containers 0
pictograph deployments create "Shelf Detector" --name prod --gpu t4   # one-time token
pictograph deployments predict "prod-detector" ./photo.jpg --token pk_deploy_...
pictograph deployments pause "prod-detector"                 # stops compute + billing
pictograph deployments resume "prod-detector"
pictograph deployments delete "prod-detector" --yes

Pass --endpoint https://…/predict to predict and the pk_deploy_ token becomes the only credential needed, with no account API key.

workflows

Source: cli/commands/workflows.py

pictograph workflows list
pictograph workflows get "gate-crossings"
pictograph workflows create gate-crossings -g ./graph.json
pictograph workflows run "gate-crossings"                    # waits unless --no-wait
pictograph workflows run-status <run-uuid>
pictograph workflows cancel <run-uuid> --yes                 # refunds the deposit
pictograph workflows delete "gate-crossings" --yes

exports

Source: cli/commands/exports.py

pictograph exports list --dataset road-signs --status completed
pictograph exports create road-signs --name v1 -f coco       # waits unless --no-wait
pictograph exports create road-signs --name v1 -f yolo \
    --include-images --organize-by-split                     # directly-trainable layout
pictograph exports get road-signs v1
pictograph exports download road-signs v1 -o ./out.zip
pictograph exports get-by-id <export-uuid>
pictograph exports download-by-id <export-uuid> -o ./out.zip
pictograph exports delete road-signs v1 --yes                # admin/owner
pictograph exports bulk-delete <export-uuid> <export-uuid> --yes

connectors

Source: cli/commands/connectors.py

export PICTOGRAPH_SOURCE_KEY=# the SOURCE provider's key, not yours
pictograph connectors validate v7                            # list importable datasets
pictograph connectors check-limits --images 500 --bytes 100000000
pictograph connectors import v7 -d <source-dataset-id>       # waits unless --no-wait
pictograph connectors status <import-id>
pictograph connectors cancel <import-id>                     # keeps imported images

Pass the source key by environment variable: a key on the command line lands in shell history and is readable by any user via ps.

Source: cli/commands/search.py

pictograph search similar road-signs 001.jpg -n 20 -t 0.6    # visual similarity
pictograph search tags --dataset road-signs --object car     # --object/--scene/--attribute

video

Source: cli/commands/video.py

pictograph video upload ./clip.mp4                           # prints the stored path
pictograph video probe <stored-path>                         # duration / fps / dimensions
pictograph video extract-frames road-signs <stored-path> \
    --directory-name frames --sample-fps 1                   # waits unless --no-wait
pictograph video status <job-uuid>

organizations

Source: cli/commands/organizations.py

pictograph organizations me                                  # tier, credits, member cap
pictograph organizations update --name "New Name" --public
pictograph organizations members
pictograph organizations member-role <membership-uuid> --role admin
pictograph organizations member-remove <membership-uuid> --yes
pictograph organizations invites --status pending
pictograph organizations invite teammate@example.com --role member
pictograph organizations invite-revoke <invite-uuid>

member-role and member-remove take the membership UUID printed by members.

webhooks

Source: cli/commands/webhooks.py

pictograph webhooks event-types                              # subscribable events
pictograph webhooks create https://example.com/hook -e workflow.run.completed
pictograph webhooks list
pictograph webhooks get https://example.com/hook
pictograph webhooks update https://example.com/hook --disabled
pictograph webhooks rotate-secret https://example.com/hook   # new secret, printed once
pictograph webhooks test https://example.com/hook            # synthetic signed event
pictograph webhooks deliveries --endpoint https://example.com/hook --status failed
pictograph webhooks replay <delivery-uuid>
pictograph webhooks delete https://example.com/hook --yes

create and rotate-secret print the signing secret once.

directories

Source: cli/commands/directories.py

pictograph directories list road-signs --parent /train       # direct children
pictograph directories tree road-signs
pictograph directories stats road-signs /train               # counts incl. subdirectories
pictograph directories create road-signs /train/positive     # parents auto-created
pictograph directories rename road-signs /train/old new      # NEW_NAME is one segment
pictograph directories delete road-signs /train/old --cascade --yes

--cascade moves the directory’s images up to its parent, then deletes it.

tasks

Source: cli/commands/tasks.py

pictograph tasks list --limit 25
pictograph tasks list --all --max-total 500                  # auto-page every task
pictograph tasks contributions <task-id>                     # per-annotator breakdown
pictograph tasks contributions <task-id> --json

contributions prints who annotated how many images, active editing time, and annotations authored - the same numbers the app’s task modal shows.

notifications

Source: cli/commands/notifications.py

pictograph notifications list --unread
pictograph notifications unread-count
pictograph notifications read <notification-id>
pictograph notifications read-all
pictograph notifications delete <notification-id>

credits

Source: cli/commands/credits.py

pictograph credits balance --json
pictograph credits history --all --max-total 5000            # auto-page the ledger
pictograph credits usage -r week                             # day / week / month / all
pictograph credits estimate training_a10g -q 30

agents

Source: cli/commands/agents.py

pictograph agents list-tools                                 # all 37 tools
pictograph agents export-tools -o tools.json                 # JSON Schema dump
pictograph agents install-skill --target claude-code         # ~/.claude/skills/pictograph-cv/
pictograph agents install-skill --target claude-ai           # ./pictograph-cv.zip

Recipes

# Build, train, download.
pictograph exports create road-signs --name v1 -f pictograph --include-images
pictograph train start road-signs v1 --pipeline yolox
pictograph models download "road-signs-detector" -o ./yolox.onnx

# Nightly COCO export of every dataset.
for ds in $(pictograph datasets list --json | jq -r '.[].name'); do
  pictograph exports create "$ds" --name nightly -f coco --no-wait
done

# Remaining included allowance this period, in dollars.
pictograph credits balance --json | jq '.included_remaining_micro_usd / 1000000'

Output and exit codes

Default output is a Rich table sized to your terminal; --json emits the same payload as the SDK’s model_dump(mode="json"), ready for jq. Errors print bold-red to stderr.

Code Meaning
0 success
1 API error
2 usage / config error (missing args, no API key)

See also

Copied to clipboard