Skip to main content
A Job is one execution of an Assignment. Use duvo runs to start Jobs, check status, stream messages, respond to human-in-the-loop requests, and stop running Jobs.

Starting and inspecting Jobs

duvo runs start --agent <agent-id>             # start a Job
duvo runs get <run-id>                         # get Job status
duvo runs messages <run-id>                    # list conversation messages
duvo runs stop <run-id>                        # stop a running Job
Add --json to any command for machine-readable output suitable for scripting.

Streaming a Job live

Add --follow to watch messages stream in real time instead of polling duvo runs get. It works two ways:
duvo runs start --agent <agent-id> --follow    # start a Job and stream its messages
duvo runs messages <run-id> --follow           # attach to a running Job and follow new messages
--follow keeps printing new messages until the Job completes, then exits.

Mid-run interaction

Send a message to a Job in progress (for example, to add clarifying instructions):
duvo runs send-message <run-id> \
  --message "Please also check the backup."

Responding to human-in-the-loop requests

When an Assignment pauses to ask a human a question or request approval, you can respond from the CLI:
duvo runs respond <run-id> --approve                  # approve a human request
duvo runs respond <run-id> --deny                     # deny a human request
duvo runs respond <run-id> \
  --answer "<question-id>=<answer-text>"             # answer a pending question
The --answer flag takes a <question-id>=<answer-text> pair. Find the <question-id> by running duvo runs messages <run-id> and looking at the pending human request.

Scripting examples

Start a Job and wait for it to finish

RUN_ID=$(duvo runs start --agent "$AGENT_ID" --json | jq -r '.run.id')

while true; do
  STATUS=$(duvo runs get "$RUN_ID" --json | jq -r '.run.status')
  case "$STATUS" in
    completed|failed|stopped) break ;;
  esac
  sleep 5
done

echo "Job $RUN_ID finished with status: $STATUS"

Auto-approve any pending human requests on a Job

Useful in trusted batch pipelines where every approval is expected to pass:
duvo runs messages "$RUN_ID" --json \
  | jq -r '.messages[] | select(.type=="human_request" and .status=="pending") | .id' \
  | xargs -I {} duvo runs respond "$RUN_ID" --approve

Forward Job output to a script

duvo runs messages "$RUN_ID" --json \
  | jq -r '.messages[] | select(.role=="assistant") | .content' \
  > job-output.log