adaptyv-bio について
adaptyv-bioは、REST APIとPython SDKを通じて無細胞発現と結合特性評価を依頼する、タンパク質エンジニア向けスキルです。実験の登録、状態確認、親和性結果の取得を支援し、反復的なスクリーニングに利用できます。
主な機能
- 01実験用タンパク質配列の登録
- 02配列の一括登録
- 03実験状態の追跡
- 04結合親和性結果の取得
- 05実験履歴の一覧と絞り込み
活用シーン
- 01結合アッセイによる設計変異体の検証
- 02機械学習を用いた指向性進化の実施
- 03ナノボディや抗体のスクリーニング
- 04実験親和性データを用いた配列最適化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill adaptyv-bioインストール後、Claude Code で/adaptyv-bioを入力して読み込まれたか確認します。
詳細
Adaptyv Bio
概要
Adaptyv Bio は、REST API と Python SDK を介して利用するタンパク質発現・特性評価プラットフォームです。ユーザーはタンパク質配列(抗体、ナノボディ、酵素、結合タンパク質)を送信し、数日以内に発現したタンパク質と結合親和性の測定値(バイオレイヤー干渉法による KD)を受け取ります。このプラットフォームは、ハイスループットな指向性進化のループ向けに設計されています。候補配列を生成(計算またはライブラリ設計による)→ API 経由で発現とアッセイを依頼 → 親和性データを受け取る → モデルを再学習するか、有力候補を選択 → 繰り返します。SDK は、実験の送信、ステータスのポーリング、Python での結果取得を処理します。
使用する場面
- 計算で設計したタンパク質バリアントをスクリーニングし、実験で結合親和性を検証する場合
- インシリコでの候補生成とウェットラボでの特性評価を交互に行う、ML 主導の指向性進化ループを実行する場合
- ウェットラボの設備を維持せずに、ナノボディ、抗体、結合ドメインの無細胞発現を依頼する場合
- REST API を使ってハイスループットなタンパク質特性評価パイプラインを自動化する場合
- 実験で得た親和性データ(KD 値)を計算モデルと統合し、タンパク質配列のベイズ最適化を行う場合
- ESM、AlphaFold、ドッキングの予測を実験で得た結合データで検証する場合
- LIMS 形式の配列・プラスミド管理には
benchling-integrationを使用してください。ウェットラボを用意せずに無細胞発現と親和性評価を自動化する必要がある場合は、Adaptyv Bio を使用してください
前提条件
- Python パッケージ:
adaptyvbio、requests、pandas - アカウント:Adaptyv Bio のアカウントが必要です。ダッシュボードから API キーを取得してください
- データ要件:FASTA またはプレーン文字列形式のタンパク質配列(複数可)、および標的タンパク質の指定
pip install adaptyvbio requests pandas
# Set API key as environment variable
export ADAPTYV_API_KEY="your_api_key_here"
クイックスタート
import adaptyvbio as ab
import os
# Initialize client
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
# List available experiment types
experiment_types = client.get_experiment_types()
for et in experiment_types:
print(f" {et['name']}: {et['description']}")
コア API
モジュール 1:配列の送信
無細胞発現と特性評価のためにタンパク質配列を送信します。
import adaptyvbio as ab
import os
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
# Submit a single protein sequence for expression
sequence = "MAQRITLPSGMKELRLSYNMGEIVYKIEPVGSIVHIEYYDPENKDTLVNKPSDIVELTMPGKLVVENAKTFAEK"
submission = client.submit_experiment(
experiment_type="expression", # "expression" or "binding"
sequences=[sequence],
metadata={
"project": "nanobody_optimization_round1",
"designer": "ESM2_1000_candidates",
}
)
experiment_id = submission["experiment_id"]
print(f"Submitted experiment: {experiment_id}")
print(f"Status: {submission['status']}")
print(f"Estimated completion: {submission.get('estimated_completion', 'N/A')}")
# Submit batch of sequences (up to 96 per experiment)
import pandas as pd
# Load candidate sequences from CSV
candidates = pd.read_csv("esm_candidates.csv") # columns: name, sequence, score
top_candidates = candidates.nlargest(48, "score")
sequences = top_candidates["sequence"].tolist()
names = top_candidates["name"].tolist()
batch_submission = client.submit_experiment(
experiment_type="binding",
sequences=sequences,
sequence_names=names,
target="target_protein_name", # registered target in your Adaptyv account
metadata={"round": 2, "parent_experiment": experiment_id}
)
print(f"Batch experiment: {batch_submission['experiment_id']}")
print(f"Sequences submitted: {len(sequences)}")
モジュール 2:実験ステータスの追跡
実験のステータスをポーリングし、完了後に結果を取得します。
import adaptyvbio as ab
import os
import time
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
experiment_id = "exp_abc123" # from submission step
# Check current status
status = client.get_experiment_status(experiment_id)
print(f"Status: {status['status']}") # "pending", "running", "complete", "failed"
print(f"Progress: {status.get('progress', 0):.0%}")
# Poll until complete (with timeout)
max_wait_hours = 72
poll_interval_minutes = 30
timeout = max_wait_hours * 3600
start = time.time()
while time.time() - start < timeout:
status = client.get_experiment_status(experiment_id)
print(f"[{time.strftime('%H:%M')}] Status: {status['status']}")
if status["status"] in ("complete", "failed"):
break
time.sleep(poll_interval_minutes * 60)
print(f"Final status: {status['status']}")
モジュール 3:結果の取得
実験結果をダウンロードして解析します。
import adaptyvbio as ab
import pandas as pd
import os
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
experiment_id = "exp_abc123"
# Get results (only available when status is "complete")
results = client.get_experiment_results(experiment_id)
# Convert to DataFrame
records = []
for result in results["results"]:
records.append({
"name": result.get("sequence_name", "unnamed"),
"sequence": result["sequence"],
"kd_nM": result.get("kd_nM"), # binding dissociation constant
"yield_ug": result.get("yield_ug"), # expression yield
"expression_pass": result.get("expression_pass"),
"binding_pass": result.get("binding_pass"),
})
df = pd.DataFrame(records)
df = df.sort_values("kd_nM", ascending=True) # rank by affinity (lower KD = tighter binding)
print(f"Results: {len(df)} sequences")
print(f"Successfully expressed: {df['expression_pass'].sum()}")
print(f"KD range: {df['kd_nM'].min():.2f} – {df['kd_nM'].max():.2f} nM")
print(df[["name", "kd_nM", "yield_ug", "expression_pass"]].head(10).to_string())
df.to_csv(f"{experiment_id}_results.csv", index=False)
モジュール 4:実験履歴とプロジェクト管理
import adaptyvbio as ab
import pandas as pd
import os
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
# List all experiments
experiments = client.list_experiments(project="nanobody_optimization")
print(f"Total experiments: {len(experiments)}")
for exp in experiments:
print(f" {exp['experiment_id']}: {exp['status']} | "
f"{exp['n_sequences']} seqs | {exp['created_at'][:10]}")
# Retrieve all results across experiments for a project
all_results = []
for exp in experiments:
if exp["status"] == "complete":
results = client.get_experiment_results(exp["experiment_id"])
for r in results["results"]:
r["experiment_id"] = exp["experiment_id"]
r["round"] = exp.get("metadata", {}).get("round", "unknown")
all_results.append(r)
project_df = pd.DataFrame(all_results)
print(f"\nAll results: {len(project_df)} sequences across {len(experiments)} experiments")
print(f"Best KD: {project_df['kd_nM'].min():.3f} nM")
モジュール 5:配列設計との統合
Adaptyv Bio の結果を計算タンパク質設計ツールと統合します。
import adaptyvbio as ab
import pandas as pd
import numpy as np
import os
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
def run_design_iteration(previous_results_df, n_new_candidates=48):
"""
Closed-loop protein engineering iteration.
Input: DataFrame with sequence, kd_nM from previous round
Output: submitted experiment_id for new round
"""
# Select top performers as parents for next round
parents = previous_results_df.nsmallest(5, "kd_nM")["sequence"].tolist()
print(f"Top parent KDs: {previous_results_df.nsmallest(5, 'kd_nM')['kd_nM'].values}")
# --- Placeholder for computational design step ---
# In practice: call ESM, ProteinMPNN, or mutation scanning here
# new_sequences = design_model.generate(parents, n=n_new_candidates)
# For demonstration, create random variants:
new_sequences = [p[:20] + "X" * 10 + p[30:] for p in parents[:3]] # placeholder
# Submit new candidates
submission = client.submit_experiment(
experiment_type="binding",
sequences=new_sequences,
metadata={"round": "auto", "parent_kd_min": parents[0] if parents else None}
)
print(f"Round submitted: {submission['experiment_id']}")
return submission["experiment_id"]
# Example: load round 1 results and start round 2
round1 = pd.read_csv("exp_round1_results.csv")
if not round1.empty:
next_id = run_design_iteration(round1)
print(f"Round 2 experiment ID: {next_id}")
重要な概念
KD(解離定数)
KD はタンパク質と標的の結合親和性を測定します。KD が低いほど結合が強くなります。
- µM 範囲(>1000 nM):結合が弱く、通常は治療薬には適しません
- 100~1000 nM:中程度の結合
- 1~100 nM:良好な結合で、一般的な抗体の範囲です
- <1 nM:非常に良好な結合(ピコモル濃度の抗体、ナノボディ)
Adaptyv Bio は、バイオレイヤー干渉法(BLI)による定常状態または速度論的測定から得た KD を nM 単位で報告します。
無細胞発現
Adaptyv Bio は、クローニングなしでタンパク質を発現するために、無細胞タンパク質合成(CFPS)システム(小麦胚芽または大腸菌抽出液)を使用します。これによりハイスループットスクリーニング(96 ウェル形式で、数週間ではなく数日)が可能になりますが、制約もあります。真核生物の修飾(複雑なタンパク質における糖鎖付加、ジスルフィド結合など)は、細胞ベースの発現とは異なる場合があります。
一般的なワークフロー
ワークフロー 1:クローズドループ指向性進化
import adaptyvbio as ab
import pandas as pd
import os
import time
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
ROUNDS = 3
CANDIDATES_PER_ROUND = 48
TARGET = "your_target_protein"
all_data = pd.DataFrame()
for round_num in range(1, ROUNDS + 1):
print(f"\n=== Round {round_num} ===")
# Step 1: Generate candidates (replace with actual design model)
if round_num == 1:
sequences = ["MAQRITLPSGMKELRL" + "A" * 20 for _ in range(CANDIDATES_PER_ROUND)]
else:
parents = all_data.nsmallest(5, "kd_nM")["sequence"].tolist()
# In practice: sequences = design_model.generate_variants(parents, n=CANDIDATES_PER_ROUND)
sequences = parents[:CANDIDATES_PER_ROUND] # placeholder
# Step 2: Submit
submission = client.submit_experiment(
experiment_type="binding",
sequences=sequences,
target=TARGET,
metadata={"round": round_num}
)
exp_id = submission["experiment_id"]
print(f"Submitted {len(sequences)} sequences: {exp_id}")
# Step 3: Wait for results (skip in demo; poll in production)
# time.sleep(72 * 3600)
# Step 4: Retrieve results
results = client.get_experiment_results(exp_id)
round_df = pd.DataFrame(results["results"])
round_df["round"] = round_num
all_data = pd.concat([all_data, round_df], ignore_index=True)
best = round_df.nsmallest(1, "kd_nM").iloc[0]
print(f"Best KD this round: {best['kd_nM']:.2f} nM")
all_data.to_csv("directed_evolution_all_rounds.csv", index=False)
print(f"\nFinal best KD: {all_data['kd_nM'].min():.3f} nM")
ワークフロー 2:バッチスクリーニングとランキング
import adaptyvbio as ab
import pandas as pd
import matplotlib.pyplot as plt
import os
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
# Retrieve completed experiment results and rank
exp_id = "exp_completed_123"
results = client.get_experiment_results(exp_id)
df = pd.DataFrame(results["results"])
df = df.dropna(subset=["kd_nM"]).sort_values("kd_nM")
# Summary statistics
print(f"Sequences tested: {len(df)}")
print(f"Expression success rate: {df['expression_pass'].mean():.0%}")
print(f"Binding positives (KD < 100 nM): {(df['kd_nM'] < 100).sum()}")
# Rank plot
fig, ax = plt.subplots(figsize=(10, 4))
ax.semilogy(range(len(df)), df["kd_nM"].values, 'o', markersize=4)
ax.axhline(100, color='red', linestyle='--', label='100 nM threshold')
ax.set_xlabel("Sequence rank")
ax.set_ylabel("KD (nM)")
ax.set_title(f"Binding Affinity Rank — {exp_id}")
ax.legend()
plt.tight_layout()
plt.savefig(f"{exp_id}_rank_plot.pdf", bbox_inches="tight")
# Export top hits
top_hits = df.head(10)[["sequence_name", "sequence", "kd_nM", "yield_ug"]]
top_hits.to_csv(f"{exp_id}_top_hits.csv", index=False)
print(f"\nTop 10 hits:\n{top_hits.to_string(index=False)}")
主要なパラメーター
| パラメーター | モジュール/関数 | デフォルト | 範囲/オプション | 効果 |
|---|---|---|---|---|
experiment_type | submit_experiment | — | "expression"、"binding" | アッセイの種類:発現のみ、または発現+結合 |
sequences | submit_experiment | — | 文字列のリスト、最大96件 | 各実験でスクリーニングするタンパク質配列 |
target | submit_experiment | — | 登録済みのターゲット名 | 結合測定の対象となる標的タンパク質 |
metadata | submit_experiment | {} | dict | 実験とともに保存されるカスタムのキーと値のペア |
project | list_experiments | None | 文字列 | プロジェクト名で実験を絞り込みます |
| KD 閾値 | 下流の解析 | — | 1~1000 nM | ヒット選択に使用するユーザー定義のカットオフ |
ベストプラクティス
-
陽性対照と陰性対照の配列を含める:各実験バッチには、既知の結合配列(陽性対照)とシャッフル配列またはヌル配列(陰性対照)を必ず含めます。これにより、アッセイの性能を検証し、未試験のバリアントについて結論を出す前に、バッチ単位の失敗を検出できます。
-
プレート形式(48または96)に合わせて候補をバッチ設計する:Adaptyv Bio は48ウェルまたは96ウェル形式で実験を実施します。プレートを埋められるよう候補のバッチを設計してください。部分的なプレートも全プレートと費用は同じですが、実験あたりに得られるデータポイントは少なくなります。
-
提出時にすべてのメタデータを記録する:ラウンド番号、親配列、計算モデルのバージョン、生成パラメーターを
metadataフィールドに含めます。これにより、論文作成や再現性のために、設計から実験までの履歴を再構成できます。 -
KD で順位付けする前に発現量でフィルタリングする:発現に失敗したタンパク質や検出閾値未満のタンパク質では、信頼性の低い KD 値が得られます。KD でソートする前に、必ず
expression_pass == Trueでフィルタリングしてください。 -
API を使用してポーリング・結果取得・設計のループを自動化する:6~12時間ごとにポーリングし、完了時に結果を取得して、設計モデルを実行し、次のラウンドを提出する自動パイプラインを実装します。これにより、反復的なタンパク質エンジニアリングにおける手作業のボトルネックを解消できます。
よくあるレシピ
レシピ:上位ヒットを FASTA としてエクスポートする
import adaptyvbio as ab
import os
client = ab.Client(api_key=os.environ["ADAPTYV_API_KEY"])
def results_to_fasta(exp_id, top_n=10, kd_cutoff_nM=100, output_file="top_hits.fasta"):
results = client.get_experiment_results(exp_id)
hits = [r for r in results["results"]
if r.get("expression_pass") and r.get("kd_nM", float("inf")) < kd_cutoff_nM]
hits.sort(key=lambda x: x["kd_nM"])
with open(output_file, "w") as f:
for r in hits[:top_n]:
name = r.get("sequence_name", r["sequence"][:8])
f.write(f">{name}_KD{r['kd_nM']:.1f}nM\n{r['sequence']}\n")
print(f"Exported {min(top_n, len(hits))} sequences to {output_file}")
results_to_fasta("exp_abc123", top_n=10, kd_cutoff_nM=50)
レシピ:KD 分布をラウンドごとに比較する
import pandas as pd
import matplotlib.pyplot as plt
# Load all rounds
rounds = {
1: pd.read_csv("exp_round1_results.csv"),
2: pd.read_csv("exp_round2_results.csv"),
3: pd.read_csv("exp_round3_results.csv"),
}
fig, ax = plt.subplots(figsize=(8, 5))
for round_num, df in rounds.items():
kd_vals = df.dropna(subset=["kd_nM"])["kd_nM"]
ax.hist(kd_vals, bins=20, alpha=0.6, label=f"Round {round_num} (n={len(kd_vals)})")
ax.set_xlabel("KD (nM)")
ax.set_ylabel("Count")
ax.set_title("KD Distribution Across Directed Evolution Rounds")
ax.legend()
plt.tight_layout()
plt.savefig("kd_distribution_by_round.pdf", bbox_inches="tight")
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
AuthenticationError | API キーが無効または未設定 | ADAPTYV_API_KEY 環境変数を設定します。Adaptyv のダッシュボードでキーを再生成してください |
| 実験のステータスが「pending」のまま変わらない | キューの滞留、またはターゲット設定の不足 | Adaptyv サポートに連絡し、ターゲットタンパク質がアカウントに登録されていることを確認してください |
すべての配列で expression_pass=False と表示される | 配列が長すぎる、無効な文字が含まれる、またはフォールディングに問題がある可能性があります | 配列長を確認します(一般的な上限:<300 aa)。標準外アミノ酸が含まれていないことを確認し、結合アッセイの前に発現スクリーニングを実施してください |
| KD 値のばらつきが大きい(>3×) | 発現量が低く、BLI シグナルにノイズが生じている | yield_ug > 5 でフィルタリングし、発現が改善するよう配列を再設計してください |
ステータスが「complete」になった後も results フィールドが空 | API のタイミングの問題により、結果がまだ永続化されていない | 10分待ってから再試行し、Adaptyv のステータスページを確認してください |
| バッチの配列数が96未満に制限される | アカウントのプランによる制限 | アカウントをアップグレードするか、48件ずつ複数の実験に分割してください |
| CSV で一部の配列の KD 値が欠落している | BLI フィッティングに失敗した(結合動態が不良、または結合しない) | kd_nM=None の配列は非結合配列です。陰性結果として扱ってください |
関連スキル
esm-protein-language-model— Adaptyv Bio への提出用候補配列を生成しますbenchling-integration— Adaptyv Bio の実験と並行して、タンパク質エンジニアリング配列の LIMS 管理を行いますpymoo— Adaptyv Bio の KD と収量データを適応度関数として使用する多目的最適化
参考資料
- Adaptyv Bio プラットフォーム — サービス概要とドキュメント
- Adaptyv Bio API ドキュメント — SDK リファレンスとエンドポイントの説明
- 無細胞タンパク質合成のレビュー:Pardee et al. (2016), Cell — 無細胞発現技術の背景
- 指向性進化のレビュー:Arnold (2018), Angewandte Chemie — 指向性進化の手法に関するノーベル賞受賞講演
- バイオレイヤー干渉法のレビュー:Sultana & Lee (2015), CMS — KD 決定のための BLI 測定手法