mcpField
A
adaptyv-bio

adaptyv-bio

github.com/jaechang-hitsその他38468 回インストール6 日前に更新
リポジトリ

adaptyv-bio について

adaptyv-bioは、REST APIとPython SDKを通じて無細胞発現と結合特性評価を依頼する、タンパク質エンジニア向けスキルです。実験の登録、状態確認、親和性結果の取得を支援し、反復的なスクリーニングに利用できます。

主な機能

  1. 01実験用タンパク質配列の登録
  2. 02配列の一括登録
  3. 03実験状態の追跡
  4. 04結合親和性結果の取得
  5. 05実験履歴の一覧と絞り込み

活用シーン

  1. 01結合アッセイによる設計変異体の検証
  2. 02機械学習を用いた指向性進化の実施
  3. 03ナノボディや抗体のスクリーニング
  4. 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_typesubmit_experiment—"expression"、"binding"アッセイの種類:発現のみ、または発現+結合
sequencessubmit_experiment—文字列のリスト、最大96件各実験でスクリーニングするタンパク質配列
targetsubmit_experiment—登録済みのターゲット名結合測定の対象となる標的タンパク質
metadatasubmit_experiment{}dict実験とともに保存されるカスタムのキーと値のペア
projectlist_experimentsNone文字列プロジェクト名で実験を絞り込みます
KD 閾値下流の解析—1~1000 nMヒット選択に使用するユーザー定義のカットオフ

ベストプラクティス

  1. 陽性対照と陰性対照の配列を含める:各実験バッチには、既知の結合配列(陽性対照)とシャッフル配列またはヌル配列(陰性対照)を必ず含めます。これにより、アッセイの性能を検証し、未試験のバリアントについて結論を出す前に、バッチ単位の失敗を検出できます。

  2. プレート形式(48または96)に合わせて候補をバッチ設計する:Adaptyv Bio は48ウェルまたは96ウェル形式で実験を実施します。プレートを埋められるよう候補のバッチを設計してください。部分的なプレートも全プレートと費用は同じですが、実験あたりに得られるデータポイントは少なくなります。

  3. 提出時にすべてのメタデータを記録する:ラウンド番号、親配列、計算モデルのバージョン、生成パラメーターを metadata フィールドに含めます。これにより、論文作成や再現性のために、設計から実験までの履歴を再構成できます。

  4. KD で順位付けする前に発現量でフィルタリングする:発現に失敗したタンパク質や検出閾値未満のタンパク質では、信頼性の低い KD 値が得られます。KD でソートする前に、必ず expression_pass == True でフィルタリングしてください。

  5. 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")

トラブルシューティング

問題原因解決策
AuthenticationErrorAPI キーが無効または未設定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 と収量データを適応度関数として使用する多目的最適化

参考資料

コメント