CLI

Reference for every Argos CLI command — what it does, what it takes, and how to use it.

Overview

The Argos CLI is how you talk to the daemon running on your robot's machine — it doesn't do any of the real work itself. Pulling model weights, opening a serial connection to a servo, spawning the inference engine, running the control loop: all of that happens inside a long-running background process, started once and left running. Every CLI command is really just an HTTP request to that daemon, wrapped in a clean terminal interface with readable errors and correct exit codes.

That split matters in practice. Starting a run doesn't tie up your terminal — you can close it, come back later, and the robot is still doing whatever you told it to do. And if a command fails because the daemon isn't running, you get a clear message telling you how to fix that, not a stack trace.

Installation

One command installs everything: system dependencies, a Python virtual environment, the inference engine built from source with GPU detection (Jetson, desktop GPU, or a CPU-only fallback), and the daemon itself as a systemd service.

$ curl -fsSL https://argos.sh/install | bash

The daemon is enabled but not started automatically — add your Hugging Face token to local/.env first, then start it:

$ sudo systemctl start argos

Commands

Every command below follows the same shape: a verb, sometimes a model or device argument, and options for anything optional. The two connect commands share a pattern worth calling out — run them with no arguments to discover what's available, then run them again with the specific one you want.

list

argos list

Shows the full model catalog and flags which ones are already pulled onto this machine. This is usually the first command you run — it's how you find out what's available before committing to a multi-gigabyte download.

$ argos list
No models have been pulled yet.
smolvla [not pulled]
pi0 [not pulled]
bitvla [not pulled]

pull

argos pull <model>

Downloads a model's weights from Hugging Face into the daemon's local cache. The model name must match one from `argos list`. This can take a while for larger models — the daemon shows a live progress spinner while it downloads.

model
Required. Model name from the catalog, e.g. smolvla.
$ argos pull smolvla
Pulled smolvla -> .../services/models/smolvla-libero.gguf

connect actuator

argos connect actuator [--port PORT] [--servo-id ID]

Connects the robot arm over the Feetech servo protocol. Run it with no arguments first — it scans and lists every serial port it can see, so you can figure out which one is actually your arm before connecting to it. Once you know the port, connecting does a real handshake: it pings each servo ID and only counts the connection as live if servos actually respond, not just because the port opened.

--port
Serial port, e.g. /dev/ttyUSB0. Omit to list available ports instead.
--servo-id
A servo ID to ping. Repeatable. Omit to use the default set for the reference arm.
$ argos connect actuator
/dev/ttyUSB0 USB-Serial Controller
$ argos connect actuator --port /dev/ttyUSB0
Connected /dev/ttyUSB0: responded=[1, 2, 3, 4, 5, 6] unresponsive=[]

connect sensor

argos connect sensor [--index N] [--view NAME]

Connects a camera under a named view. Just like connect actuator, running it with no arguments discovers what's available first. The --view name isn't just a label — it has to match one of the view names the model you're about to run actually expects, so the right camera feed ends up in the right slot instead of being guessed from connection order.

--index
Camera index. Omit to discover available cameras.
--view
View name — must match the model's expected camera view key exactly.
$ argos connect sensor
index 0
index 1
$ argos connect sensor --index 0 --view observation.images.image
Connected camera 0 as 'observation.images.image'

run

argos run <model> <instruction>

Starts the model running. This is the command that actually moves the arm: it checks that the model is pulled and that both the actuator and required cameras are connected, spawns the inference engine, and kicks off the control loop. The instruction is a plain-language description of what you want the robot to do — it gets fed straight to the model alongside the camera feed.

model
Required. Model name to run, e.g. smolvla.
instruction
Required. Natural-language task instruction for the robot.
$ argos run smolvla "pick up the red block"
Running smolvla (pid=48213, bind=tcp://127.0.0.1:5555)

devices

argos devices [--kind actuator|sensor]

Lists whatever's currently connected — useful as a sanity check before running, or any time you've lost track of what's plugged in. Filter to just one kind if you don't need the full picture.

--kind
Optional. Filter to 'actuator' or 'sensor'. Omit to show both.
$ argos devices
{'actuator': {'port': '/dev/ttyUSB0', 'servo_ids': [1, 2, 3, 4, 5, 6]},
'sensors': [{'index': 0, 'view_name': 'observation.images.image'}]}

In-session commands

While a run is active, three more operations are available: checking logs, checking status, and safely stopping. These exist today as routes on the daemon's own API — wiring them into the CLI as interactive commands you can type while a run is in progress is next.

logs

Coming soon
GET /cli/logs

Returns both the inference engine's raw output and Argos's own pipeline log (frame captured, request sent, response received, correction applied) — everything that's happened since the run started. Today this lives on the daemon's API; a native `argos logs` command that talks to it while a run is active is coming.

$ curl http://127.0.0.1:8000/cli/logs

status

Coming soon
GET /cli/status

Reports what model is loaded, which devices are connected, and how long the daemon and the current run have each been up. Same story as logs — available on the daemon today, landing as a CLI command next.

$ curl http://127.0.0.1:8000/cli/status

stop

Coming soon
POST /cli/stop

Safely ends the active run: stops the control loop, drives the arm back to a home position, and shuts down the inference engine — the daemon itself keeps running throughout, ready for the next run.

$ curl -X POST http://127.0.0.1:8000/cli/stop