Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Predict regulatory features, gene structure, and expression directly from DNA sequence using Genomic Intelligence's hosted transformer DNA language models — no local GPU or model weights. Six tasks over a REST API and a hosted MCP server (keyless public demo): promoter regions, splice donor/acceptor sites, enhancer activity, chromatin state, sequence-to-expression (log TPM), and de-novo gene annotation, plus a composite find-genes-then-predict-expression workflow. Use when the user has a gene sy
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 115% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 163% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 59% | 0% |
Genomic Intelligence (GI) serves transformer DNA language models over six sequence-analysis tasks on managed GPUs. Give it a gene symbol, a genomic region, or a DNA/FASTA sequence; it returns structured predictions — promoter regions, splice sites, enhancer activity, chromatin state, expression (log TPM), and de-novo gene annotation. Nothing runs locally: no model weights, no GPU, no heavy Python stack. It is a thin client over a hosted, versioned inference API.
Official docs: docs.genomicintelligence.ai · REST contract at api.genomicintelligence.ai/v1/openapi.json · hosted MCP server at https://mcp.genomicintelligence.ai/mcp
Use GI when the user has DNA and wants a model prediction:
promoter)splice)enhancer)chromatin)expression)annotation)Not for local alignment, variant calling, or file I/O — use a local tool (BioPython, bcftools) for those. GI is for model inference from sequence.
> For research and development use, not clinical or diagnostic decisions.
GI hosts an MCP server at https://mcp.genomicintelligence.ai/mcp (Streamable HTTP). When your agent host supports MCP, prefer it: it works keyless against a capped public demo quota (zero setup), and an optional gi_ bearer key raises the quota. It exposes acquisition tools that return a sequence handle (sequence_ref) and predict_* tools that take that handle — so large sequences never bloat the context. See MCP workflow below and references/mcp.md.
Plain HTTP with requests against https://api.genomicintelligence.ai/v1. The REST path requires a GI_API_KEY (a gi_ bearer). Use it on any host, in scripts, or when you need the raw envelope. See Core REST workflow.
/v1 API needs a key, sent as Authorization: Bearer <key>.Request one at contact@genomicintelligence.ai.
GI_API_KEY environment variable(or a .env via python-dotenv). Never commit keys.
bashexport GI_API_KEY="gi_yourkeyhere" # optional for MCP; required for REST export GI_BASE_URL="https://api.genomicintelligence.ai" # override for staging
Keys are scoped to a partner tier with concurrency and per-minute caps. A 429 means you hit a cap — back off and retry, or ask GI to raise your tier.
All REST tasks share one shape: POST /v1/tasks/{task}/predict with body {sequence, sequence_name, model?, options?}, returning a {data, meta} envelope. What differs per task:
| Task | Mode | Length bound | Notes | |---|---|---|---| | promoter | sync | 1–500,000 bp | sliding-window promoter regions | | splice | sync | 1–500,000 bp | donor/acceptor sites (long-context BigBird) | | enhancer | sync | 1–500,000 bp | dev + housekeeping scores (DeepSTARR, Drosophila) | | chromatin | sync | 1–500,000 bp | hundreds of tracks (DeepSEA) | | expression | sync | exactly 9,198 bp | log(TPM+1); needs a cell-type description | | annotation | async | 1–500,000 bp | de-novo transcripts; submit + poll |
Omit model and the API uses the task's default — that is the recommended call. Default model IDs are intentionally not documented here: defaults change and retired IDs fail hard, so never hardcode one. To pin a model, or to pick a non-human one (Drosophila, yeast, and Arabidopsis models exist for several tasks), discover IDs at call time with GET /v1/tasks/{task}/models (REST) or list_models (MCP) — and never invent one. Full per-task output shapes are in references/tasks.md.
Two hard rules the model enforces:
expression needs exactly 9,198 bp, a window centred on the TSS(4,599 upstream + TSS + 4,598 downstream). Any other length is rejected. Use the acquisition helpers below to build it — do not truncate by hand.
expression needs a description — a cell-type / assay string (e.g."K562 cells"), passed as options.description.
You rarely start from a raw 9,198 bp string. Acquire sequence first:
fetch_ensembl_sequence(gene=...); fromcoordinates → fetch_region(region=...). Both fetch public Ensembl reference sequence (no key). REST users can query Ensembl REST directly. (find_genes is the annotation task, not an acquisition tool.)
expression → use the TSS-centred fetch so the window is exactly9,198 bp. MCP: fetch_gene_for_expression (handles the centring). Do not build the window by hand.
store_inline_sequence, or read the file yourselffor REST. (load_local_fasta exists only in local deployments, not on the hosted server.)
load_demo_sequence(name=...) returns a ready handle(great for a keyless smoke test); name is required.
See references/sequence-acquisition.md for the exact Ensembl calls and the expression-window math.
Sync tasks (promoter, splice, enhancer, chromatin, expression) are one call:
pythonimport os, requests BASE = os.environ.get("GI_BASE_URL", "https://api.genomicintelligence.ai") HEADERS = {"Authorization": f"Bearer {os.environ['GI_API_KEY']}"} def predict(task, sequence, sequence_name, model=None, options=None): body = {"sequence": sequence, "sequence_name": sequence_name} if model: body["model"] = model if options: body["options"] = options r = requests.post(f"{BASE}/v1/tasks/{task}/predict", headers=HEADERS, json=body) r.raise_for_status() # 400 invalid; 401 no/bad key; 413 too long; 429 rate limit return r.json() # {"data": {...}, "meta": {...}} # Promoter: out = predict("promoter", seq, "TP53_region") print(out["data"]["summary"]) # Expression — exactly 9,198 bp + a cell-type description: out = predict("expression", tss_window_9198bp, "HBB", options={"description": "K562 cells"}) print(out["data"]["prediction"]["expression_log_tpm"])
annotation is submit-then-poll. Send Prefer: respond-async, get a job_id, poll until terminal:
pythonimport time r = requests.post(f"{BASE}/v1/tasks/annotation/predict", headers={**HEADERS, "Prefer": "respond-async"}, json={"sequence": seq, "sequence_name": "TP53"}) r.raise_for_status() # 202 Accepted job_id = r.json()["data"]["job_id"] while True: j = requests.get(f"{BASE}/v1/tasks/jobs/{job_id}", headers=HEADERS) if j.status_code == 200: # terminal: body is the final {data, meta} break j.raise_for_status() # 202 = still running (2xx, won't raise) time.sleep(5) # ~20 s typical for ~20 kb transcripts = j.json()["data"]["transcripts"]
On an MCP host, acquire a handle, then predict against it — sequences stay out of the context:
# 1. Acquire a sequence handle (each returns a sequence_ref):
load_demo_sequence(name="promoter_tp53") # keyless smoke test; `name` is REQUIRED
fetch_ensembl_sequence(gene="TP53") # gene symbol or Ensembl ID -> handle
fetch_region(region="chr11:5,225,000-5,235,000") # coordinates -> handle
fetch_gene_for_expression(gene="HBB") # TSS-centred 9,198 bp handle for expression
# 2. Predict against the handle:
predict_promoter(sequence_ref=<ref>)
predict_expression(sequence_ref=<ref>, description="K562 cells")
predict_splice(sequence_ref=<ref>) # + predict_enhancer / predict_chromatin
# 3. Annotation on MCP is `find_genes` (there is no predict_annotation).
# It takes a handle, not a region, and runs async internally:
find_genes(sequence_ref=<ref>) # wait=True (default) returns the result
find_genes(sequence_ref=<ref>, wait=False) # -> job_id; poll get_job(job_id)
# Discover models with list_models(task); reference context lives in the
# gi://models, gi://docs/tasks, and gi://account MCP resources.To answer "what genes are in this region and how are they expressed?", use the composite:
find_genes_and_predict_expression(sequence_ref=..., description=...)— takes a handle, not a region (acquire one with fetch_region first); description is required. Finds genes in the sequence and returns an expression prediction for each.
expression per gene (build eachTSS-centred 9,198 bp window via the acquisition helpers).
| Code | Meaning | Action | |---|---|---| | 400 | Invalid request / bad sequence | Check the body; expression must be exactly 9,198 bp and carry description | | 401 | Missing/invalid key (REST) | Set GI_API_KEY; or use the keyless MCP demo | | 413 | Sequence too long | Stay within the task's length bound (≤500,000 bp) | | 429 | Rate / concurrency cap | Back off and retry; ask GI to raise your tier | | 422 | Validation failed (validation_failed) | The most common failure: expression not exactly 9,198 bp, or a sequence below the model's minimum length | | 5xx | Server error | Retry; if persistent, contact support |
references/tasks.md — per-task output shapes, model registries, the asyncannotation contract.
references/api-and-auth.md — REST endpoints, the {data, meta} envelope,auth, base-URL override, tiers.
references/mcp.md — the hosted MCP tool list, the handle-based flow, and thegi:// resources.
references/sequence-acquisition.md — Ensembl fetch calls and theexpression-window (9,198 bp, TSS-centred) math.
Other measured skills in the registry, with their headline benchmark lift.