/artifacts.md. The full docset is at /llms-full.md and the index is at /llms.md.Artifact Output
The output of a job is its artifacts. These are things like plots produced by your job, trained neural network weights, or saved checkpoints.
Only files written to configured output directories are collected. By default this is $C3_ARTIFACTS_DIR (an artifacts/ directory pre-created for every job). You can add more directories with the output: field in your .c3 config. Files written elsewhere in the working directory are not collected.
Configuring output
Every job automatically collects files written to $C3_ARTIFACTS_DIR:
import os
output_dir = os.environ["C3_ARTIFACTS_DIR"] # always set, pre-created
with open(os.path.join(output_dir, "metrics.json"), "w") as f:
json.dump(results, f)
You can collect files from additional directories too:
output:
- results
- checkpoints
Both $C3_ARTIFACTS_DIR contents and output: directories end up in the same artifact manifest, downloadable with c3 pull.
Storage quota
Artifact bytes count toward your account's tracked storage usage. When the agent registers an artifact after upload, the control plane records the byte delta against your storage balance. This means your displayed storage usage may increase after artifact uploads.
The quota check is currently soft-fail — uploads are never rejected due to quota, but a warning is logged when usage exceeds the quota. You can check your current usage with c3 balance.
Artifact lifecycle
- Your script writes files to
$C3_ARTIFACTS_DIRand/or directories listed inoutput: - After the script finishes, the agent collects all output files and uploads them as content-addressed blobs
- An artifact manifest is created at
/jobs/<jobId>/ - Artifact bytes are charged to your storage usage quota
- You can download, browse, or reuse artifacts in another job
Important: If your script exits successfully (exit code 0) but artifact upload fails, the job is marked FAILED with reason UPLOAD_ERROR. This is non-retryable — the GPU work completed, but the output could not be saved. Check your storage configuration and job logs if you encounter this status. When the script itself fails (non-zero exit), is canceled, or times out, artifact upload is best-effort: upload errors are logged but the job status reflects the script failure, cancellation, or timeout.
Browsing artifacts
Artifacts are stored the same way as uploaded datasets, using the same content-addressed storage. You can browse them with the same c3 data commands, just at a different path.
You can reach a job's artifacts in two ways:
c3 data ls /jobs/job_abc123/ # By job ID (resolves project automatically)
c3 data ls /projects/my-project/jobs/job_abc123/ # By project + job ID
Both paths point to the same data. Having two paths does not mean the data is stored twice.
To list all jobs with artifacts in a project:
c3 data ls /projects/my-project/jobs/
Downloading artifacts
Download artifacts to your local machine with c3 pull:
c3 pull job_abc123 # Download a specific job's artifacts
c3 pull # Download all new completed jobs
Or use c3 data cp for more control:
c3 data cp /jobs/job_abc123/ ./local-output/
Reusing artifacts in another job
Because artifacts live in C3's centralised storage, you can mount them directly into a new job without downloading to your local machine first. This avoids the slow local-machine bottleneck entirely:
datasets:
- ref: /jobs/job_abc123
mount: /data/prev_weights
This mounts the output from job_abc123 at /data/prev_weights in your new job. The data transfers server-to-server at full speed.
Job chaining
Job chaining is mounting a previous job's artifacts directly into a new job. This lets you build multi-stage pipelines where each stage feeds into the next, with all data staying in C3's storage network:
# Stage 1: Preprocess data
c3 deploy -f
# Job completes, producing job_preprocess
# Stage 2: Train model (mount preprocessed data)
# Update .c3:
# datasets:
# - ref: /jobs/job_preprocess
# mount: /data/preprocessed
c3 deploy -f
# Job completes, producing job_train
# Stage 3: Evaluate (mount trained model)
# Update .c3:
# datasets:
# - ref: /jobs/job_train
# mount: /data/model
c3 deploy -f
Each stage mounts the previous stage's output directly. Data stays in C3's storage network and never needs to touch your local machine.