k-dense-ai/scientific-agent-skillsMIT7 files

Waypoint Bio

Use when working with Outpost Bio's open microbiome foundation models - the Waypoint checkpoints (Waypoint-6m, Waypoint-45m, Waypoint-170m), the Atlas pretraining corpus, the Compass eight-task benchmark, or the `waypoint` CLI from the `waypoint-bio` package. Covers embedding microbiome samples, fine-tuning on taxonomic abundance data, benchmarking a checkpoint on Compass, pretraining a GPT-2 model on taxonomic abundance profiles, and converting MetaPhlAn, Kraken2, QIIME 2, or MGnify abundance tables into waypoint format.

Specification
Skill ID
k-dense-ai/scientific-agent-skills/waypoint-bio
Publisher
k-dense-ai
Repository
scientific-agent-skills
Installs
0
Files
7
License
MIT
Requires
Requires Python 3.10+ with `waypoint-bio` (pulls torch, transformers, datasets, peft, scikit-learn). Needs network access and a Hugging Face token with access granted to the gated outpost-bio repos. A GPU is strongly recommended for pretraining and benchmarking.
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

k-dense-ai/scientific-agent-skills/waypoint-bioInstalls these files
  • SKILL.md
  • references/cli-reference.md
  • references/compass-benchmark.md
  • references/data-preparation.md
  • references/python-api.md
  • scripts/profiler_to_waypoint.py
  • scripts/vocab_coverage.py

What this skill tells the agent

Waypoint: Outpost Bio's Open Microbiome Foundation Models

Overview

Outpost Bio open-sourced three artefacts under Apache 2.0, described in Treloar et al., bioRxiv 2026.05.02.722381:

ArtefactWhat it isHugging Face
WaypointGPT-2-style causal LMs over taxonomic tokens, 6M–170M paramsoutpost-bio/Waypoint-6m, -45m, -170m
Atlas539,308 microbiome samples scraped from MGnify (485,377 pretrain / 53,931 benchmark)outpost-bio/Atlas
CompassEight downstream tasks over four studiesoutpost-bio/Compass

The unifying idea: a microbiome sample is a sentence. Each taxon is one token, tokens are ordered by descending abundance z-score, and the model is trained with next-token prediction. A pretrained checkpoint then supplies sample-level embeddings or a fine-tuning backbone for prediction tasks.

All of it is driven by one CLI, waypoint, with five subcommands: prepare-dataset, embed, finetune, benchmark, pretrain.

When to use

  • Embedding 16S/shotgun taxonomic profiles into fixed-size vectors for clustering, visualisation, or a downstream classifier.
  • Fine-tuning a Waypoint checkpoint to predict a phenotype, treatment, or continuous readout from community composition.
  • Scoring your own microbiome model against Compass so the number is comparable to the paper.
  • Pretraining a taxonomic language model on Atlas or on your own corpus.
  • Converting profiler output (MetaPhlAn, Kraken2/Bracken, QIIME 2, MGnify TSVs) into the input format these tools expect.

Do not reach for this when you have fewer than ~1,000 labelled samples — see Scientific caveats. A random forest on relative abundances is the better tool there, and the paper says so.

Setup

pip install waypoint-bio       # installs the `waypoint` command

Atlas, Compass, and every Waypoint checkpoint are gated. Access is auto-approved, but you must click through once per repo and then authenticate:

  1. Request access on each repo page you need: Waypoint-6m, Waypoint-45m, Waypoint-170m, Atlas, Compass.
  2. Authenticate locally:
   hf auth login          # or: export HF_TOKEN=hf_...

A 401/403 from any subcommand almost always means access was never requested on that specific repo — a token alone is not enough. Use a read-scoped token. The tokenizer loads via trust_remote_code=True, so pin a revision if you need the remote code fixed across runs.

The waypoint data format

Everything except prepare-dataset consumes waypoint format: a .parquet / .csv / .tsv whose rows are samples, with two aligned list-columns plus any label columns you need.

ColumnTypeNotes
Taxalist[str]Full lineage strings, ;-separated: k__Bacteria; p__Firmicutes; ...; g__Lactobacillus
Relative Abundanceslist[float]Same length as Taxa, same order
(any)scalarTargets, covariates, or a Split column

Prefer parquet. CSV/TSV stores the lists as repr strings and round-trips through ast.literal_eval.

Give full lineages, not bare names. The tokenizer extracts the genus segment (g__) from each lineage and falls back to the most specific higher rank when genus is missing. Bare names disable that fallback entirely.

Workflow

1. Get your data into waypoint format

If you already have a sample × taxa (or taxa × sample) abundance matrix with lineage labels:

waypoint prepare-dataset \
    --input abundance_matrix.tsv \
    --metadata sample_labels.csv \
    --output dataset.parquet

Orientation is auto-detected from the first column header (taxonomy, lineage, taxon, otu, #otu id ⇒ taxa-as-rows); override with --orientation. Rows are normalised to sum to 1 unless you pass --no_normalize, and zeros are dropped unless you pass --keep_zeros.

prepare-dataset cannot read profiler output directly — MetaPhlAn uses | separators, Kraken2 reports encode the hierarchy as indentation, and QIIME 2/SILVA prefixes the domain d__ instead of k__ (which the tokenizer silently ignores). Use the bundled converter for those:

python scripts/profiler_to_waypoint.py \
    --input merged_metaphlan.tsv --format metaphlan \
    --output dataset.parquet

python scripts/profiler_to_waypoint.py \
    --input reports/*.kreport --format kraken \
    --output dataset.parquet

python scripts/profiler_to_waypoint.py \
    --input feature-table.tsv --format qiime2 \
    --output dataset.parquet

See references/data-preparation.md for every input layout, rank handling, and the d__/| gotchas.

2. Check vocabulary coverage before anything else

Waypoint's vocabulary is fixed at pretraining time from Atlas. Taxa absent from it become <unk> and are silently dropped by waypoint embed; the paper names this as the models' main limitation. A sample whose taxa are all out-of-vocabulary yields a degenerate [BOS][EOS] embedding.

python scripts/vocab_coverage.py --model outpost-bio/Waypoint-6m --data dataset.parquet

It reports per-sample and abundance-weighted coverage and flags samples below a threshold. Treat median abundance-weighted coverage under ~0.8 as a reason to re-examine your taxonomy labels before trusting any downstream number.

3. Embed samples

waypoint embed \
    --model outpost-bio/Waypoint-6m \
    --data dataset.parquet \
    --output embeddings.parquet

Output is indexed by sample ID with columns dim_0 … dim_{H-1} (H = 256 for 6m, 512 for 45m, 768 for 170m). Defaults: --pooling last_token, --batch_size 32, --max_length 512, device auto-detected (cuda → mps → cpu).

Keep --pooling last_token unless you have a reason to change it: it matches how the checkpoints were pretrained and how benchmark and finetune pool. mean is a reasonable alternative for unsupervised use; first_token/cls_token return the BOS position and carry little signal in a causal LM.

4. Fine-tune on your labels

# classification
waypoint finetune \
    --model outpost-bio/Waypoint-45m \
    --data dataset.parquet \
    --output_dir outputs/ft_disease \
    --task_type classification \
    --target "Disease Status" \
    --config configs/finetune_classification.yaml

# regression, with a categorical covariate one-hot appended to the pooled embedding
waypoint finetune \
    --model outpost-bio/Waypoint-45m \
    --data dataset.parquet \
    --output_dir outputs/ft_degradation \
    --task_type regression \
    --target "Degradation Rate" \
    --covariate_column Drug \
    --config configs/finetune_regression.yaml

Config paths resolve against the bundled waypoint_bio/configs/ tree, so configs/... works from any directory without cloning.

Defaults worth overriding for small datasets: warmup_steps: 1000 (drop to ~50 so warmup finishes before early stopping), num_epochs: 1 in the shipped configs (raise it — early stopping on validation loss is what actually terminates training), and use_lora: true when VRAM is tight (~1% of parameters trained; adapters are merged back before saving, so the checkpoint stays a plain AutoModel).

Splits default to a random 80/10/10. Set `split_column` to a `Split` column whenever samples are correlated — repeated measures, one donor sampled over time, technical replicates — or a random split leaks and the test score is meaningless.

Outputs land in --output_dir: best_model/ (loadable by embed/benchmark), test_metrics.json, training_log.csv + .html, and finetune_results.json.

5. Benchmark on Compass

More from k-dense-ai

Use this skill in a project

Open any RiverX project, search the Skills panel for k-dense-ai/scientific-agent-skills/waypoint-bio, and install it in one click.

Use this skill