Skip to Content
Agent computeRuns & logs
Raw

Runs and logs

Listing the runs of an Aetherfy agent

A run on Aetherfy is one ephemeral execution of a type: job agent. List recent runs newest-first:

afy agents runs nightly-report afy agents runs nightly-report --limit 50

The default limit is 20 and the maximum is 100.

The listing shows five columns:

ColumnContains
WhenWhen the run was created
TriggerWhy it ran — printed as the raw value, literally cron or manual
StateHow it ended, or where it is now
DurationHow long the machine ran
Run IDThe identifier to pass to afy logs --run

Aetherfy lists only runs with a trigger source of cron or manual. Runs started by a parent agent are excluded from this listing — they belong to the parent’s history instead.

What the Aetherfy runs API returns

The equivalent Aetherfy REST call is:

GET /agents/{id}/runs
Query parameterAccepted valuesOn anything else
trigger_sourcecron or manual only422
limit1–100422
beforeAn ISO-8601 keyset cursor on creation time422

Each row Aetherfy returns carries these fields:

FieldContains
idThe run’s identifier
trigger_sourcecron, manual, or spawn
stateSee the state table below
created_atWhen the run was created
error_messageThe failure reason, when the run failed
machine_started_atWhen the machine began executing
machine_stopped_atWhen the machine stopped
duration_secondsExecution duration

before is a keyset cursor rather than an offset, so paging backwards through a long history stays correct even as new runs arrive.

Run and deployment states on Aetherfy

Aetherfy uses one state vocabulary for both deployments and runs. Four of the states are terminal — once a record reaches them it will not change again.

StateMeaningTerminal
queuedWaiting in the build queueNo
buildingThe image is buildingNo
deployingMachines are launchingNo
activeServing, or executing in the case of a runNo
completedA run’s machine ended on its own with exit code 0Yes
failedThe build, the deploy, or the run failedYes
supersededReplaced by a newer successful deploymentYes
rolled_backReplaced by a rollbackYes

completed applies to runs, which end by design. A long-lived service deployment that is working sits at active and stays there until a newer deployment supersedes it.

What decides completed versus failed for a run is the process exit code — see /agents/task-contract.

Agent status values on Aetherfy

An agent has its own status, separate from the state of any individual deployment or run.

StatusMeaning
pendingCreated, not yet built
buildingAn image is building
deployingMachines are launching
runningDeployed and operating
failedThe most recent deployment failed
stoppedStopped with afy agents stop
pausedPaused
usage_pausedPaused by Aetherfy at a spend limit — shown as paused for usage
archivedArchived, freeing the plan quota slot
deletingDeletion in progress
deletedDeleted

usage_paused is the one to recognise on sight: the agent is not broken and nothing needs repairing in your code. Raise the limit or settle the payment at https://app.aetherfy.com/dashboard/settings/billing  and the agent resumes.

Retrieving logs from Aetherfy

Everything an agent writes to stdout and stderr becomes its logs on Aetherfy.

afy logs nightly-report

Scope the output to a single run, using a Run ID from afy agents runs:

afy logs nightly-report --run 01JABCDEF0123456789ABCDEF
FlagShortDefaultEffect
--tail-n50How many lines to return. The server maximum is 1000.
--follow-foffKeep streaming new lines as they arrive
--sinceOnly lines newer than a duration, e.g. 1h, 30m
--levelComma-separated severities, e.g. ERROR,WARN
--streamComma-separated streams: stdout, stderr, system
--runRestrict to a single run id

Combined:

afy logs nightly-report --tail 200 --since 1h --level ERROR,WARN --stream stderr

One caveat worth knowing before you debug against it: on Aetherfy --follow polls, and it ignores both --tail and --since. It also does not honour JSON output. Use --follow to watch what happens next; use --tail and --since to look at what already happened.

Log record fields on Aetherfy

Every log record Aetherfy stores carries:

FieldContains
agentWhich agent emitted it
deploymentWhich deployment was running
timestampWhen the line was emitted
streamstdout, stderr, or system
levelThe severity
messageThe line itself

The system stream holds lines Aetherfy itself emits about the machine, as distinct from your program’s own output on stdout and stderr.

What Aetherfy does not record for you

Aetherfy logging is plain stdout/stderr capture, and nothing more. It does not auto-instrument calls your agent makes to model providers — there is no automatic capture of prompts, completions, token counts, latency or tool calls from an OpenAI, Anthropic or other SDK running inside your agent.

If you want that, log it yourself. A print() or logger.info() around the call lands in exactly the same place as the rest of your output and is searchable with afy logs --level:

import json, time started = time.monotonic() response = call_your_model(prompt) print(json.dumps({ "event": "llm_call", "model": "your-model-id", "elapsed_ms": round((time.monotonic() - started) * 1000), "prompt_chars": len(prompt), }))

Keep the per-line and per-deployment limits below in mind if you log full prompts — they are easy to exceed.

Log limits and retention on Aetherfy

Aetherfy caps log volume in several dimensions. Logs are an operational aid, not a durable data store — write anything you need to keep to a real destination.

LimitValue
Retention7 days
Per deployment5 MB
Per line4 KB
Chunks per minute, per agent60
Per upload body256 KB

When an agent exceeds the per-line or volume caps, the Aetherfy log forwarder backs off and emits a marker in the stream so the gap is visible rather than silent:

[SYSTEM] N log line(s) dropped

If you see that marker, the agent is logging faster than Aetherfy will accept. Reduce per-line size or log volume — a very large payload dumped per iteration is the usual cause.

Last updated on