Skip to main content

Your first workflow job: image-qa

This walkthrough creates a project, creates a team, loads the image-qa workflow, starts the daemon, and submits a job.

Use a real directory you own for --local-path. The examples below use /tmp/my-project.

Create a project

lmctl project create my-project \
--workflow image-qa \
--team my-team \
--local-path /tmp/my-project

A project binds a directory to one default workflow and one team.

Create and seed a team

lmctl team create my-team
lmctl team add-member my-team --alias QA --provider claude
lmctl team seed my-team

Each team member has an alias and a provider. Workflows refer to members by alias, not by provider name. team seed starts each provider CLI once so lmctl can capture a native session id and snapshot the member prompt.

You can use a different provider if that CLI is installed and authenticated:

lmctl team add-member my-team --alias QA --provider codex

lmctl supports mixed-provider teams. A common pattern is to let one provider do the work and another review it, which catches different failure modes than a single-model loop.

Load the workflow

lmctl workflow load image-qa workflows/image-qa.compound.json

The workflow definition is stored in the local SQLite profile.

Start the daemon

lmctl serve > lmctl.log 2>&1 &

The daemon is the process that lmctl api ... commands talk to. It listens on 127.0.0.1:8787 by default.

Place a sample image

Before submitting the job, put an image at the path used by the workflow input. For example, copy an existing local image:

cp /path/to/local-image.png /tmp/my-project/sample.png

If you do not have a sample image handy, create a tiny placeholder PNG:

mkdir -p /tmp/my-project
base64 -d > /tmp/my-project/sample.png <<'EOF'
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+/p9sAAAAASUVORK5CYII=
EOF

Submit a job

image-qa expects an image path and a prompt:

lmctl api submit-job \
--workflow image-qa \
--project my-project \
--inputs '{"image_path": "/tmp/my-project/sample.png", "prompt": "What is in this image?"}'

submit-job waits until the run reaches a terminal state and prints structured result data.

Check status and attentions

lmctl status
lmctl api attentions

Use status for the operator-oriented view. Use api attentions to list persistent notifications such as workflow pauses, failures, or drift signals.