| name | roboflow-batch-processing |
|---|---|
| description | Use when processing a huge number of images or videos with a Roboflow Workflow WITHOUT importing them into Roboflow — staging local or cloud files with the inference-cli, starting and monitoring batch processing jobs, downloading results, and choosing between batch processing (ETL) and datasource bucket mirroring (ELT). |
For agents — source-of-truth: This skill is authored in
roboflow/computer-vision-skillsand shipped with the Roboflow plugin. If your client has loaded the plugin (you'll seeroboflow:<name>skills in your available skills list), use those local skills — they're read fresh from disk every session. The same content served as MCP resources atroboflow://skills/<name>/...is a fallback for clients without the plugin and may lag this repo. Don't callReadMcpResourceToolforroboflow://skills/...URIs when a localroboflow:<name>skill is available.
Run a Roboflow Workflow over a very large set of images or videos on Roboflow's autoscaling compute, without importing anything into the workspace. Files are staged into temporary Data Staging batches, a job processes them, and results are exported back to staging for download.
Two pipelines exist for "I have a ton of files in a bucket/on disk". Pick by what the user wants to end up with:
- Batch processing (this skill, ETL): run a model/Workflow over the files and get the results out. Nothing lands in the Roboflow workspace; staged data expires after ~7 days. Best for one-off or recurring bulk inference over local disks or cloud buckets.
- Datasources / bucket mirror (ELT, see the
cloud-storageskill): import the files INTO the workspace first for labeling, curation, and training, then work on them inside Roboflow.
Rule of thumb: "process and give me the outputs" → batch processing;
"get these into Roboflow" → datasources (connect_cloud_storage).
- The workspace needs the batch-processing feature. Gated calls fail with a 402 "Batch processing is not enabled for this workspace. Upgrade your plan or contact sales at https://roboflow.com/sales."
- Jobs consume credits; the workspace must have a positive balance.
- The Workflow must already exist in the workspace (
workflows_list,workflows_create). Jobs reference it byworkflow_id; there is no inline-spec option. - API key: set
ROBOFLOW_API_KEYin the environment (mint one with theapi_keys_createMCP tool). Never have the user paste a private key into chat.
Staging uploads run client-side with the inference-cli, on the machine that
can reach the files (local disk) or with the user's cloud credentials
(bucket sources). The MCP server cannot read the user's filesystem or cloud
credentials. Everything after staging is server-side via MCP tools:
batch_processing_job_start, _job_get, _job_logs, _job_abort,
_job_restart, batch_processing_staging_*.
The batch_processing_guide MCP tool returns this recipe plus an echo of
the arguments you pass it; it never touches files or the network.
Prefer batch_processing_run(batch_id, workflow_id, ...) to drive the whole
flow. Each call inspects the current state, advances what it can, waits up
to wait_seconds (bounded) and returns a status:
staging_required— no batch yet; the response contains the exact CLI commands (already wired to a webhook relay via--notifications-url) and cloud-credential env-var guidance. Run them, then call again.ingest_in_progress— files still registering; call again.running— the job was started (with the relay as its notifications URL) or is still working; includes stage progress and relayed events.completed— includes the export batch id and the first result files with signed download URLs.failed— includes logs and a restart hint.
Pass the returned job_id and relay_id back on every follow-up call to
resume; the server holds no state between calls.
Jobs and ingests can notify a webhook. batch_processing_run wires this
automatically to the MCP server's relay
(/webhooks/batch-processing/<relay_id>); the platform POSTs job
success/failure (roboflow-batch-job-notification-v1) and ingest-status
events there. Read them with batch_processing_events_poll(relay_id)
between calls, or just re-call batch_processing_run. Events are advisory:
confirm real state with batch_processing_job_get. Users with their own
webhook receiver can instead pass notifications_url to
batch_processing_job_start or --notifications-url on CLI commands.
pip install inference-cli
# For s3:// gs:// az:// sources:
pip install 'inference-cli[cloud-storage]'Cloud credentials are picked up from the standard env chains on the machine
running the CLI: AWS via the default credential chain (AWS_PROFILE,
AWS_REGION, AWS_ENDPOINT_URL honored; R2/MinIO work via
AWS_ENDPOINT_URL), GCS via GOOGLE_APPLICATION_CREDENTIALS, Azure via
AZURE_STORAGE_ACCOUNT_NAME plus AZURE_STORAGE_ACCOUNT_KEY or
AZURE_STORAGE_SAS_TOKEN. The CLI generates presigned URLs (24h expiry)
and hands those to Roboflow; bucket secrets never leave the machine.
Batch ids: lowercase letters, digits, - or _. Staged batches expire
after ~7 days.
# Local images (>32 images are packed into tar shards automatically)
inference rf-cloud data-staging create-batch-of-images \
--batch-id my-batch --images-dir ./images
# Local videos (uploaded one by one via signed URLs)
inference rf-cloud data-staging create-batch-of-videos \
--batch-id my-batch --videos-dir ./videos
# Cloud bucket (S3/GCS/Azure; glob over object paths)
inference rf-cloud data-staging create-batch-of-images \
--batch-id my-batch --data-source cloud-storage \
--bucket-path 's3://my-bucket/images/**/*.jpg'
# References file: JSONL lines of {"name": ..., "url": "https://..."}
inference rf-cloud data-staging create-batch-of-images \
--batch-id my-batch --data-source references-file --references refs.jsonlSharded, cloud-storage, and references ingests are asynchronous. Wait until
the batch is fully ingested before starting a job: poll the
batch_processing_staging_batch_get MCP tool (file count plus per-shard
ingest statuses), or inference rf-cloud data-staging show-batch-details -b my-batch / list-ingest-details from the CLI.
Practical limits: up to 20,000 references per ingest request (auto-chunked), ~1,000 videos per batch suggested, image formats jpg/png/webp/bmp/jp2, video formats mp4/mov/avi/mkv/flv/wmv/m4v.
Prefer the MCP tool:
batch_processing_job_start(
batch_id="my-batch", workflow_id="my-workflow",
content_type="images", # or "videos"
machine_type="gpu", # cpu|gpu, optional
workers_per_machine=4, # 1/2/4/8, optional
aggregation_format="jsonl", # or "csv"
save_image_outputs=True, # persist crops/visualizations
max_video_fps=5, # videos only: prediction subsampling
)
CLI equivalent: inference rf-cloud batch-processing process-images-with-workflow -b my-batch -w my-workflow -mt gpu (or
process-videos-with-workflow). Same job_id + identical definition is
idempotent; a divergent definition is rejected with a 409.
batch_processing_job_get(job_id)— status, current/planned stages, per-stage progress, output batches;job.isTerminal+job.errorare the end states.batch_processing_job_logs(job_id)— info/error logs for diagnosis.batch_processing_job_abort(job_id)/batch_processing_job_restart(job_id)— stop a run, or retry a failed one (optionally overriding machine type, workers, timeout).
Results land in Data Staging as platform-generated batches:
<job-id>-processing (raw per-shard outputs) and <job-id>-export
(packaged, downloadable archives).
- List with
batch_processing_staging_batch_files_list(batch_id="<job-id>-export"); entries carry signeddownloadURLs (~24h expiry). Archives (.tar/.tar.gz) must be unpacked after download. - Listings are capped at 10,000 entries per call. Past that scale, download
with the CLI instead (
inference rf-cloud data-staging export-batch -b <job-id>-export -t ./results, resumable), or import the source data into the workspace with datasources (ELT) and work inside Roboflow. - Do this within 7 days: staged inputs and results expire.