Genomic Intelligence — DNA配列モデル
Genomic Intelligence (GI) は、マネージドGPU上で6つの配列解析タスクにわたるトランスフォーマーDNA言語モデルを提供します。遺伝子シンボル、ゲノム領域、またはDNA/FASTA配列を入力すると、プロモーター領域、スプライス部位、エンハンサー活性、クロマチン状態、発現量(log TPM)、およびde-novo遺伝子アノテーションといった構造化された予測結果を返します。ローカルで実行されるものはありません。モデル重みなし、GPUなし、重いPythonスタックも不要です。これはホスト型でバージョン管理された推論APIのシンクライアントです。
公式ドキュメント: docs.genomicintelligence.ai ·
RESTコントラクト: api.genomicintelligence.ai/v1/openapi.json ·
ホスト型MCPサーバー: https://mcp.genomicintelligence.ai/mcp
このスキルを使用するタイミング
ユーザーがDNAを持っていて、モデル予測を必要とする場合にGIを使用します。
- プロモーターの検索 — ゲノム領域内 (
promoter) - スプライス部位の予測 — ドナー/アクセプター部位 (
splice) - エンハンサー活性のスコアリング — 発生期 & ハウスキーピング (
enhancer) - クロマチン状態のアノテーション — 数百のトラックを横断 (
chromatin) - 発現量の予測 — 配列 + 細胞種コンテキストからの log(TPM+1) (
expression) - 遺伝子/転写産物のde-novoアノテーション — 参照配列不要 (
annotation) - 領域内の遺伝子を検索し、それぞれの発現量を予測 (複合ワークフロー)
ローカルアラインメント、バリアントコーリング、ファイルI/Oには使用しません。そのような場合はローカルツール(BioPython、bcftools)を使用してください。GIは配列からのモデル推論のためのものです。
研究開発目的での使用。臨床診断目的には使用できません。
GIを呼び出す2つの方法
ホスト型MCPサーバー (キーレス; MCPホストで推奨)
GIは https://mcp.genomicintelligence.ai/mcp (Streamable HTTP) でMCPサーバーをホストしています。エージェントホストがMCPをサポートしている場合は、こちらを推奨します。レート制限と同時接続数制限のあるパブリックデモティアに対してキーレスで動作し、オプションの gi_ ベアラキーによりこれらの制限を引き上げることができます。これは、シーケンスハンドル (sequence_ref) を返す取得ツールと、そのハンドルを受け取る predict_* ツールを公開しており、大きなシーケンスをコンテキスト外に保持します。MCP ワークフロー および references/mcp.md を参照してください。
REST API (ユニバーサル)
requests を使用した https://api.genomicintelligence.ai/v1 へのプレーンなHTTP呼び出し。RESTパスには必須で GI_API_KEY (gi_ ベアラ) が必要です。任意のホスト、スクリプト内、または生のエンベロープが必要な場合に使用します。Core REST ワークフロー を参照してください。
アクセスと認証
- ホスト型MCPデモはキーレスです — 何も設定せずに試せます。
- REST
/v1API にはキーが必要で、Authorization: Bearer <key>として送信します。 [email protected] からリクエストしてください。 - キーをハードコードしないでください。
GI_API_KEY環境変数から読み取ってください(またはpython-dotenv経由で.envから)。キーをコミットしないでください。
export GI_API_KEY="gi_yourkeyhere" # MCPではオプション; RESTでは必須
export GI_BASE_URL="https://api.genomicintelligence.ai" # ステージング用の上書き
キーは、同時接続数と1分あたりの制限があるパートナーティアにスコープされます。429 は制限に達したことを意味します — バックオフして再試行するか、GIにティアの引き上げを依頼してください。
6つのタスク
各タスクは独自の公開操作であり、独自のリクエストスキーマ、独自の最小長、独自のクローズド options オブジェクトを持ちます — POST /v1/tasks/promoter/predict、/v1/tasks/splice/predict、/v1/tasks/enhancer/predict、/v1/tasks/chromatin/predict、/v1/tasks/annotation/predict、/v1/tasks/expression/predict。各パスはリテラル文字列であるため、何も構築する必要はなく、共有された PredictRequest スキーマはありません。ボディは {sequence, sequence_name?, model?, options?} で、{data, meta} エンベロープを返します。タスクごとに異なる点:
| タスク | 推奨モード | 受け入れ長 | context_window_bp | 備考 |
|---|---|---|---|---|
promoter | 同期 | 300–500,000 bp | 2,000 bp | スライディングウィンドウプロモーター領域 |
splice | 同期 | 100–500,000 bp | 15,000 bp | ドナー/アクセプター部位 (ロングコンテキストBigBird); 鎖特異的 — 転写産物の向きを与える |
enhancer | 同期 | 50–500,000 bp | 249 bp | 発生期 + ハウスキーピングスコア (DeepSTARR, Drosophila) |
chromatin | 同期 | 200–500,000 bp | 1,000 bp | 数百のトラック (DeepSEA) |
expression | 同期 | 9,198–500,000 bp | n/a (trained_window_bp 9,198) | log(TPM+1); 正確に9,198 bpでない限り tss_index が必要。さらに細胞種の description が必要 |
annotation | 非同期 | 1,000–500,000 bp | n/a | de-novo転写産物; 送信 + ポーリング; 200,000 bpを超える同期は 413 sync_too_large |
推奨モード はガイダンスであり、制約ではありません — すべてのタスクが両方を受け入れます。同期 200 の場合は Prefer を省略し、202 と GET /v1/tasks/jobs/{job_id} の場合は Prefer: respond-async を送信します。唯一の強制制限は操作ごとです: /v1/openapi.json が POST に x-sync-limit-bp を公開している場合、その長さを超える同期リクエストは 413 sync_too_large になります — annotation では200,000 bp、複合ワークフローでは50,000 bp(info.version 2026.09.10.1時点)。数字を暗記するのではなく、フィールドを読み取ってください。他の予測タスクには今日の時点で制限はありません。
最小長はアドミッションコントロールであり、動作条件ではありません。 下限を超えているが、選択したモデルの bio_spec.context_window_bp より短いリクエストは受け入れられ、スコアリングされます — コンテキストウィンドウまでパディングされたウィンドウに対して。Enhancerはその典型例です: 下限は50 bpですが、コンテキストウィンドウは249 bpであるため、50–248 bpは主にパディングに対してスコアリングされます。GET /v1/tasks/{task}/models から context_window_bp と比較して、モデルが実際の配列を見たかどうかを確認してください。コンテキストより長い入力でも問題ありません — スキャナーは予測ウィンドウを一度に1ステップ進め、最後の部分的なウィンドウのみをパディングします。
下限未満および500,000 bpの上限を超える場合は、両方とも 422 validation_failed で loc ["body","sequence"] となります。長さ超過は 413 ではありません。すべての長さは、空白が削除された後に測定されるため、行折り返しされたFASTAボディをそのまま貼り付けることができます(> ヘッダー行はアルファベットチェックに失敗します)。
options は型付けされており、タスクごとにクローズド (additionalProperties: false) です — 不明なキーは、無視されることはなく、ハードな 422 validation_failed で type: "extra_forbidden" となります:
| タスク | options キー |
|---|---|
| promoter | threshold (0–1, デフォルト 0.5) |
| splice | threshold (0–1, デフォルト 0.5), site_types (["donor","acceptor"] のサブセット, デフォルト両方) |
| enhancer | (なし) |
| chromatin | threshold (0–1, デフォルト 0.5) |
| annotation | batch_size (1–128, デフォルト 8), shift_coordinates, reverse_complement (デフォルト true) |
| expression | description — 必須、かつ唯一のキー |
Prefer: respond-async は、annotation だけでなく、6つすべての予測操作と複合操作で宣言されたヘッダーパラメーターです — 非同期 を参照してください。
model を省略すると、APIはタスクのデフォルトを使用します — これが推奨される呼び出し方です。デフォルトのモデルIDは、ここでは意図的に文書化していません。デフォルトは変更される可能性があり、廃止されたIDはハードに失敗するため、ハードコードしないでください。モデルを固定する場合、または非ヒトモデル(Drosophila、yeast、Arabidopsisのモデルがいくつかのタスクに存在します)を選択する場合は、GET /v1/tasks/{task}/models (REST) または list_models (MCP) で呼び出し時にIDを確認してください — 決して独自に作成しないでください。完全なタスクごとの出力形状は references/tasks.md にあります。
expression は6つの中で最も厳格です。その中で唯一、そのスキーマは sequence に加えて options を必須としています。3つのハードルールを強制します — すべての違反は 422 であり、何もパディングまたはクランプされず、オプトアウトフラグ、ヘッダー、クエリパラメーターはありません:
- 常に正確に1つの9,198 bp TSS中心ウィンドウをスコアリングします —
sequence[tss_index-4599 : tss_index+4599]。エンドポイント自体は 9,198–500,000 bp を受け入れます。9,198 bp未満は即座に拒否されます。 tss_indexは、配列が正確に9,198 bpでない限り必須です。 これは、空白が削除された配列への0ベースのTSSオフセットであり、4599 ≤ tss_index ≤ len(sequence) − 4599にバインドされます。正確に9,198 bpの場合、デフォルトは4,599となり、そこでの唯一の合法値です。したがって、ロウカス全体(最大500 kb)を送信し、サーバーにウィンドウをカットさせることができます — ただし、サーバーはTSSを自動検出しません(それは複合ワークフローの仕事です)、また、逆相補もしません。遺伝子センス配列を送信してください。options.description— 細胞種/アッセイ文字列(例:"K562 cells") — は必須であり、expressionがoptions内で受け入れる唯一のキーです。未知のトップレベルボディフィールドも拒否されます。
注意: 合法な
tss_indexの範囲は広いため、単に間違ったオフセット(改行を含む生のFASTA文字数でカウントされた場合、または送信されたスライスではなくロウカス開始点を基準にした場合)はエラーになりません — 間違ったウィンドウに対して確信度の高い200を返します。応答内のmeta.task_specific_counts.scored_window/.tss_indexを確認してください。送信した長さはmeta.sequence_lengthです(data.input.submitted_sequence_lengthとしてもエコーされます); スコアリングされる幅は常に9,198、すなわちscored_window[1] - scored_window[0]です。(data.input.sequence_lengthはコントラクトリビジョン13で削除されました。)
tss_indexの両方の違反 — 「正確に9,198 bpでない限り必須」と範囲チェック — はモデル全体のバリデーターから発生するため、tss_indexの下ではなく、ボディレベルで表面化します。error.code == "validation_failed"にマッチし、メッセージを表示のみに使用してください。このスキルで引用されているlocタプルはすべて、その形状の例示であり、コントラクトの一部ではありません。スキーマで公開されておらず、分岐の基準にしてはいけません。
配列取得
生の9,198 bpの文字列から始めることはほとんどありません。最初に配列を取得します:
- 遺伝子シンボルから → MCP
fetch_ensembl_sequence(gene=...); 座標から →fetch_region(region=...)。どちらも公開Ensemblリファレンス配列を取得します(キー不要)。RESTユーザーはEnsembl RESTを直接クエリできます。(find_genesはアノテーションタスクであり、取得ツールではありません。) expressionの場合 → ウィンドウが正確に9,198 bpになるようにTSS中心のフェッチを使用します。MCP:fetch_gene_for_expression(センタリングを処理します)。それ以外の場合は、より広いロウカスをフェッチし、TSSをtss_indexとして渡してサーバーにウィンドウをカットさせます — ただし、そのオフセットはファイル文字ではなく、空白が削除されたヌクレオチド文字列で計算してください。- ローカルFASTAから → MCP
store_inline_sequence、またはREST用にファイルを自分で読み取ります。(load_local_fastaはホストサーバーではなく、ローカルデプロイメントにのみ存在します。) - デモ配列 → MCP
load_demo_sequence(name=...)は、キーレススモークテスト用の準備済みハンドルを返します。nameは必須です。
正確なEnsembl呼び出しと式ウィンドウの計算については、references/sequence-acquisition.md を参照してください。
コアRESTワークフロー
同期的に呼び出される — すべてのタスクのデフォルト — 予測は1回の呼び出しです:
import 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, tss_index=None):
body = {"sequence": sequence, "sequence_name": sequence_name}
if model: body["model"] = model
if options: body["options"] = options
if tss_index is not None: body["tss_index"] = tss_index # expression only
# 各タスクは独自の公開操作ですが、URL文字列は変更されません。
r = requests.post(f"{BASE}/v1/tasks/{task}/predict", headers=HEADERS, json=body)
# 422 validation_failed — タスクの下限未満または500,000 bpを超える配列、
# 不正なtss_index、欠落しているoptions.description、
# または未知のbody/optionsキー (options はクローズド)
# 401 キーなし/不正 · 404 不明なタスク · 413 ボディが16 MiB超過 · 429 レート制限
r.raise_for_status()
return r.json() # {"data": {...}, "meta": {...}}
# Promoter:
out = predict("promoter", seq, "TP53_region")
print(out["data"]["summary"])
# Expression — 事前にカットされた9,198 bp TSS中心ウィンドウ (tss_index はデフォルトで4,599):
out = predict("expression", tss_window_9198bp, "HBB",
options={"description": "K562 cells"})
print(out["data"]["prediction"]["expression_log_tpm"])
# Expression — ロウカス全体; サーバーは指定したTSSの周りの±4,599 bpをスライスします。
# tss_index は、空白が削除された配列への0ベースです。
out = predict("expression", locus_seq, "HBB",
options={"description": "K562 cells"}, tss_index=tss_offset_in_locus)
print(out["meta"]["task_specific_counts"]["scored_window"]) # スコアリングされたウィンドウを確認
非同期(任意のタスク; アノテーションに推奨)
Prefer: respond-async は、6つすべての予測操作と複合操作で宣言されたヘッダーパラメーターです。202 は同期 200 と同じ {data, meta} エンベロープを運び、data = {job_id, status: "accepted", links} となります。ジョブIDは Content-Location および X-Job-Id 応答ヘッダーにも含まれます。非同期は JSON のみです — テキスト format と組み合わせると拒否されます。annotation はそれを必要とするタスクです:
import 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: # 終了: ボディは最終的な {data, meta}
break
j.raise_for_status() # 202 = 実行中 (2xx, raise しない)
time.sleep(5) # 〜20 kbで約20秒
転写産物 = j.json()["data"]["transcripts"]
MCP ワークフロー (ハンドルベース)
MCPホスト上で、ハンドルを取得し、それに対して予測します — 配列はコンテキスト外に保持されます:
# 1. シーケンスハンドルを取得します (各々が sequence_ref を返します):
load_demo_sequence(name="promoter_tp53") # キーレススモークテスト