bioX The model EH14 X BGC-1 EH18 Designer Get an API key

API reference

Everything EH14 X can do, with a request you can paste into a terminal and the answer it gives back. No client library to install: it is JSON over HTTPS.

Getting started

Confirm an e-mail address at /key and the key appears in the tab you asked from. Send it as a bearer token on every call.

export BIOX_KEY="your-key-here"

curl -s https://bioxcompute.com/v1/models \
  -H "Authorization: Bearer $BIOX_KEY"

Every answer carries the release that produced it, such as EH14 X/1. Quote that in a paper and the same request returns the same answer a year from now.

Withdrawn/v1/variant/score · /v1/variant/explain

These routes returned a judgement on human single-letter changes. They have been withdrawn and now answer 410.

Two different models carried the same name: the one serving this route reported 0.815, while EH14 X itself scores 0.3687 on variant effect — below the 0.5 of chance. Leaving both under one name made the number meaningless, and human variant interpretation is a different field from what this model is for.

Everything EH14 X is measured on, including what it fails at, is at eh14x.

Read a sequencePOST /v1/sequence/score

How expected is every base of a stretch of marker-gene DNA? Low-surprise stretches are the ones evolution has refused to change, which is where a primer binds.

curl -s https://bioxcompute.com/v1/sequence/score \
  -H "Authorization: Bearer $BIOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sequence":"ATGCTTGTCTCAAAGATTAAGCCATGCATGTCTCAGTATAAGCTTTTACATGGCGAAACT"}'
{
  "length": 60,
  "nll": 1.2225,
  "perplexity": 3.3956,
  "gc": 0.3833,
  "probs":        [[0.25, 0.25, 0.25, 0.25], [0.6615, 0.0646, 0.11, 0.1639], ...],
  "conservation": [0.0, 0.5724, 0.3981, 0.4997, 0.5684, 0.912, ...],
  "entropy":      [1.432, 1.602, 1.501, 2.048, 1.093, ...],
  "entropy_mean": 1.3375,
  "placement": [{"cosine": 0.4283, "clazz": "Globothalamea",
                 "domain": "eukaryota", "phylum": "..."}, ...],
  "placement_method": "4-mer profile against 60 reference groups",
  "model_version": "EH14 X/1"
}

conservation is the field to reach for. One number per base, high where the model finds that position hard to vary. Those are the stretches that have stayed the same across species, which is exactly where you put a primer.

placement_method says 4-mer profile and not a neural network, and that is not an oversight. We trained a network for this and it lost to counting on the same held-out taxa, so we serve the method that won. Both numbers are on the EH14 X measurements.

Fields

namewhat
sequenceACGT, up to 320 bases
sequencesa list instead, up to 200 per call
placealso return the reference groups it sits closest to (default true)
per_basereturn the per-base tables (default true; set false for just the totals)
reading_framesalso score the six reading frames

This is the one for unnamed sequence. Placement does not look anything up in a database, so a read that matches nothing still comes back with the company it keeps.

Write a sequencePOST /v1/sequence/generate

Continue a sequence, or write one from scratch for a lineage.

curl -s https://bioxcompute.com/v1/sequence/generate \
  -H "Authorization: Bearer $BIOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sequence":"ATGCTTGTCTCAAAGATTAAGCCATGCATG",
       "num_tokens":200, "temperature":0.9, "top_k":4}'

Fields

namewhat
sequenceoptional prompt to continue
organismoptional lineage to write for, instead of a prompt
num_tokenshow many bases to write
temperaturehigher is more varied (default 0.9)
top_k, top_pthe usual sampling controls

Design a probePOST /v1/design

How this works, precisely. The motif is found by counting k-mers across the target genus and the background, then improved one letter at a time. The model does not write it. Twenty-two bases that stick to that organism and to nothing else in the sample around it.

curl -s https://bioxcompute.com/v1/design \
  -H "Authorization: Bearer $BIOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{"genus":"Trypanosoma","rounds":6}'
{
  "genus": "Trypanosoma", "disease": "sleeping sickness",
  "designed": {
    "seq": "CACACTGCAAACGATGACACCC",
    "dekking": 0.94, "achtergrond": 0.00136,
    "gc": 0.545, "smeltpunt": 56.7, "bruikbaar": true
  },
  "found_by_counting": { ... },
  "tested": false,
  "use": "research; a candidate, not a validated assay"
}
# without `genus`, it lists what it will answer for
{"targets": [{"genus": "Candida", "disease": "candidiasis"},
             {"genus": "Trypanosoma", "disease": "sleeping sickness"}, ...],
 "note": "Pass one of these as `genus`. Detection probes only: the corpus is
          ribosomal RNA, which carries identity and no function."}

Call it without genus to see which targets it answers for. It answers for that fixed list and refuses everything else. The corpus it was built on is ribosomal RNA, which carries identity and not function, so nothing about how an organism works can be written out of it.

"tested": false is on every answer and it is not boilerplate. What comes out is a candidate. Whether it binds in a tube is what your laboratory is for, and we would very much like to hear what you find.

Chimera or realPOST /v1/sequence/chimera

Is this barcode read a PCR artefact or something real. This is the one task where EH14 X beats the standard tool in the field: AUC 0.9735 against UCHIME's 0.9442 on held out taxonomic groups, difference 0.0293 with an interval of 0.0208 to 0.0385. Counting 4-mers in the two halves sits at 0.5000 and shuffled labels at 0.4409.

Read the caveat that comes back with every answer. That comparison is at equal abundance and abskew 1.0, where both methods see only the letters. In a real sample UCHIME also has the abundance, and we do not model it.

curl -s https://bioxcompute.com/v1/sequence/chimera \
  -H "Authorization: Bearer $BIOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sequences":["ATGC...321 bases...","ATGC...321 bases..."]}'

Fields

250 to 332 bases. The head was trained on barcode length amplicons, and the feature window is tied to that geometry. A read outside the range comes back with "score": null and the reason, rather than a number we cannot stand behind. For longer reads the head has to be retrained at that length.

Raw tensorsPOST /v1/sequence/forward

Probabilities and embeddings as a base64 NPZ, the way the Evo 2 NIM returns them, so an existing pipeline can point at this instead.

curl -s https://bioxcompute.com/v1/sequence/forward \
  -H "Authorization: Bearer $BIOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sequence":"ATGCTTGTCTCAAAGATTAAGCC","output_layers":["probs"]}'

Running it on data that cannot leave your building

Some data does not travel. Patient variants are the clear case: sending them to anyone else's server means a processing agreement and a legal review, and the review usually says no before the researcher has finished asking.

So the model travels instead. The part that ranks variants is 529 kB. It trains on a laptop in minutes, which means you can sharpen it on your own cases without a single record leaving the building.

What you get back is three numbers on the same held-out genes:

hand-written features     the quick method anyone reaches for first
EH14 X as it is           without having seen a letter of your data
EH14 X after              once it has

The middle number is there on purpose. Sharpening a model can also do nothing, or make it worse, and you want to see that rather than only the figure at the end. If it did not help, the report says so.

Your data needs five columns, and a sixth helps:

chrom,pos,ref,alt,label[,gene]
chr17,43092919,G,A,1
chr13,32339132,G,A,0

label is 1 for pathogenic and 0 for benign. Without gene the split cannot be made per gene, and the number at the end comes out more optimistic than it should. The report warns you when the held-out set is too small to mean anything.

This is not a download link. Ask at /request, say what you work on and who is accountable for it, and a person reads it. The agreement is what makes it possible for us to hand over a model at all.

Ask for a local copy

Errors and limits

codewhat it means
401no key, or an unknown one. Get one at /key
400the request is missing something; the message says what
429over the hourly limit. Ask for more and say what for
503that model is not loaded on this instance

Every error is JSON with an error field in plain English. If one is ever unclear, that is a bug and we would like to know.

Ask for a higher limit · Contact