mcpField
A
adaptyv

adaptyv

github.com/k-dense-ai其他55.1k1.9k 次安装2 天前更新
代码仓库

关于 adaptyv

adaptyv 是用于操作 Adaptyv 云实验室 API 的流程技能,可将蛋白质序列转化为实验测量数据。它面向研究人员,涵盖实验设置、报价确认、状态跟踪和结果处理。

主要功能

  1. 01创建实验并估算费用
  2. 02提交实验并确认报价
  3. 03跟踪实验状态与结果
  4. 04校验序列和检测设置
  5. 05处理签名结果 Webhook

适用场景

  1. 01规划蛋白质亲和力或筛选实验
  2. 02提交序列进行实验测量
  3. 03归档完整实验结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/k-dense-ai/scientific-agent-skills --skill adaptyv

安装后在 Claude Code 中输入/adaptyv确认已加载。

附带文件references/api-endpoints.md

详细介绍

Adaptyv Bio Foundry API

使用此技能,通过 Adaptyv 的云实验室将蛋白质序列转化为经实验测量的数据。在提交批次前,确认目标构建体、测定条件、对照和重复方案;周转时间取决于实验本身。

已对照部署的 OpenAPI schema(info.version: 0.0.2)和官方 SDK 0.1.0(commit cdf207819ed5a58e0c127453626d2bce125c8064)进行核对。仅凭 schema 版本无法识别所有变更。当前请求/响应详情以及上游示例中的差异,请参见端点参考。

连接

Base URL: https://devs.adaptyvbio.com/api/v1。schema 位于 /openapi.json;切勿将该文件名附加到正常的端点请求中。

在 Foundry 中,通过 Organization → Settings → Tokens 创建 bearer token。读取操作使用 Viewer,实验写入使用 Member。从 ADAPTYV_API_KEY 读取凭证;文档中的 FOUNDRY_API_TOKEN 是同一 token 的替代变量名。如果使用项目 .env,请在 SDK 设置前显式调用 python-dotenv.load_dotenv();SDK 不会自动加载该文件。切勿打印或提交 token。

# ADAPTYV_API_KEY is already set in the environment.
curl --fail-with-body 'https://devs.adaptyvbio.com/api/v1/targets?limit=3' \
  -H "Authorization: Bearer $ADAPTYV_API_KEY"

资源端点需要 bearer 认证。schema 和存活检查端点 GET /info/health 是公开的。GET /whoami 会报告当前组织和权限;当账户范围不明确时请检查它。

Python SDK

在项目环境中安装已核对的修订版(需要 Python 3.11+):

uv pip install "git+https://github.com/adaptyvbio/adaptyv-sdk.git@cdf207819ed5a58e0c127453626d2bce125c8064"

从 adaptyv 导入,而非 adaptyv_sdk。FoundryClient 需要显式的 api_key 和 base_url;lab 便捷对象会读取 ADAPTYV_API_KEY 和 ADAPTYV_API_URL。将后者设置为上面的 base URL,以覆盖 SDK 较旧的主机名默认值。

以下示例仅用于说明认证后的用法。其请求构造和解析已通过模拟 HTTP 响应进行核对,而非付费实验室运行。请将环境输入替换为真实、经过审核的序列数据和目录 ID。

浏览、估算、创建草稿
import json
import os
from pathlib import Path
from adaptyv import FoundryClient

client = FoundryClient(
    api_key=os.environ["ADAPTYV_API_KEY"],
    base_url="https://devs.adaptyvbio.com/api/v1",
)

# Review vendor, catalog number, construct, and pricing before selecting an ID.
targets = client.targets.list(search="EGFR", selfservice_only=True, detailed=True)
for target in targets.items:
    print(target.id, target.name, target.vendor_name, target.catalog_number)

# candidates.json is a map of unique names to full amino acid sequences.
sequences = json.loads(Path("candidates.json").read_text())
spec = {
    "experiment_type": "screening",
    "method": "bli",
    "target_id": os.environ["ADAPTYV_TARGET_ID"],
    "sequences": sequences,
    "n_replicates": 3,
}

# SDK takes the spec itself; REST takes {"experiment_spec": spec}.
estimate = client.experiments.cost_estimate(spec)
if estimate.breakdown is None:
    raise ValueError("Incomplete estimate: review warnings and obtain a full quote")
print("Estimated USD cents, excluding VAT:", estimate.breakdown.total_cents)

# After the batch and estimated cost have been reviewed:
exp = client.experiments.create(name="EGFR binder screen batch 1", experiment_spec=spec)
experiment_id = exp.experiment_id
client.close()

create(name=..., experiment_spec=...) 不接受单个 REST body 字典。cost_estimate(spec) 直接包装 spec 本身;不要再次包装它。对于亲和力实验,SDK 还额外要求显式的 antigen_concentrations,尽管 REST 在省略时会提供默认值。

提交,然后检查并确认报价

在客户端已配置并保存了 experiment_id 的情况下:

client.experiments.submit(experiment_id)
# Quote generation is asynchronous. Retry get_quote with a bounded timeout if it
# returns 404 after successful submission; a draft has no forthcoming quote.
quote = client.experiments.get_quote(experiment_id)
print(quote.amount_total, quote.currency, quote.expires_at)

# Once the quote is accepted within the user's authorized scope:
accepted = client.experiments.confirm_quote(experiment_id)
print(accepted.invoice_id, accepted.hosted_invoice_url)

确认会创建/最终确定发票;它不会完成付款。请使用返回的托管发票 URL 或当前 REST 付款指引。SDK 0.1.0 不暴露发票付款、组织 webhook 或 whoami 辅助方法。

避免使用已核对 SDK 的 lab.experiment(target="EGFR") 快捷方式:它只接受 UUID 形式的目标,无法解析目标名称。auto_confirm=True 和 lab.confirm_experiment() 调用的是提交,而非报价确认端点。请使用上述显式客户端方法。该装饰器还会为非结合实验提供 method,而当前 API 会拒绝这一点。

检索所有结果而不丢失字段

SDK 生成的模型早于某些实时结果字段,可能会丢弃它们。在归档结果、目标引用或较新的动力学拟合时,请使用 REST JSON:

import json
import os
from pathlib import Path
import httpx

experiment_id = os.environ["ADAPTYV_EXPERIMENT_ID"]
with httpx.Client(
    base_url="https://devs.adaptyvbio.com/api/v1",
    headers={"Authorization": f"Bearer {os.environ['ADAPTYV_API_KEY']}"},
    timeout=30,
) as api:
    response = api.get(f"/experiments/{experiment_id}")
    response.raise_for_status()
    experiment = response.json()
    if experiment["results_status"] != "all":
        raise RuntimeError("Results are not complete; inspect status before analysis")
    results, offset = [], 0
    while True:
        response = api.get(f"/experiments/{experiment_id}/results",
                           params={"limit": 100, "offset": offset})
        response.raise_for_status()
        page = response.json()
        results.extend(page["items"])
        offset += len(page["items"])
        if not page["items"] or offset >= page["total"]:
            break
Path("foundry-results.json").write_text(json.dumps(
    {"experiment": experiment, "results": results}, indent=2
))

在可用时归档原始数据包,以及序列/目标标识、测定方法、单位、条件、重复测量值和拟合质量。空的动力学值表示缺失/未解析的测量值,而非零。筛选结合调用不是已测量的亲和力。仅在兼容的测定条件下比较 KD 值;schema 中的 kd_mean 对强结合重复值取平均,并不是对所有已测试重复值的无偏汇总。

实验类型与验证

experiment_typemethodtarget_id序列数量重复
affinity必填:bli 或 spr必填至少 1可选,1–5;默认 3
screening必填:bli 或 spr必填至少 1可选,1–5;默认 3
thermostability省略省略至少 1可选,1–5;默认 3
expression省略省略至少 1可选,1–5;默认 3
fluorescence省略省略至少 1可选,1–5;默认 3
epitope_binning省略必填4–28,且为 4 的倍数省略
enzyme_activity省略省略至少 1可选,1–5;默认 3

不适用的字段会被拒绝。antigen_concentrations 仅适用于 affinity,单位为 nM; REST 的默认值为 [1000.0, 316.2, 100.0, 31.6, 0.0]。parameters 保存可选的 检测设置;任何非标准配置请与实验室协调。

序列接受完整字符串或富条目,例如 {"candidate": {"aa_string": "EVQLVESGGGLVQPGGSLRLSCAAS", "control": false}}。 请使用 20 种标准氨基酸字母;输入不区分大小写,存储时转为 大写。冒号分隔链。省略号不是有效的序列字符。 富创建元数据受 SequenceMetadata 约束,而非任意 JSON: 请使用 SingleChain、ScFv、FAB 或 IgG;ScFv 需要 VH 和 VL,FAB 需要 framework_regions.ch 和 .cl。SDK 接受 schema 的 Portal 风格枚举 值。仅在状态为 draft 时通过 POST /sequences 添加序列。

生命周期与更新

传输状态值为小写蛇形命名:

draft -> waiting_for_confirmation -> quote_sent -> waiting_for_materials
      -> in_queue -> in_production -> data_analysis -> in_review -> done

canceled 也是可能的。results_status 独立地为 none、partial 或 all。在将结果集视为完整之前,请检查它。大多数实验 PATCH 字段可在 draft 或 in_review 中编辑;webhook_url 在任何状态下都保持可编辑。 序列 PATCH 会替换序列列表;POST /sequences 会追加到草稿中。

创建时的 REST 标志 skip_draft 和 auto_accept_quote 可启用自动化; auto_accept_quote 隐含 skip_draft,并且需要完整定价。它们可能将 批次提交至实验室处理和计费,因此请仅在 用户批准的实验/预算范围内使用。SDK 的公共 create() 方法 不暴露 auto_accept_quote、webhook_secret 或支付选择器;当需要这些字段时,请使用 参考文档中的 REST 契约。

对于签名投递,请在创建时设置每个实验的 webhook_url 和 webhook_secret (至少 32 个字符),或注册组织 webhook。在设置时保存 密钥;它是只写的。实验 webhook 会覆盖 组织投递。验证 X-Adaptyv-Signature(sha256=<hex>)为对原始 正文计算的 HMAC-SHA256,并使用恒定时间比较。事件为 experiment_update 面向客户的更新,并非状态转换的完整流。按 data.update_id 去重;delivery_id 标识一次尝试。返回 2xx;网络 故障和 5xx 最多重试三次,而 4xx 为永久性错误。如果投递缺失,请继续 轮询状态/结果。

列表、过滤器和错误

分页端点返回 {items, total, count, offset};使用 limit 1–100(默认 50)和 offset(默认 0)。获取所有页面。查询支持因端点而异:序列列表缺少 filter,token 列表仅支持分页,组织 webhook 返回未分页的数组。参见端点参考。

在支持的情况下,过滤器使用 eq(field,value)、neq、gt、gte、lt、lte、contains、between、in、is_null、is_not_null,并结合 and、or、not。示例:and(gte(created_at,2026-01-01),eq(status,done))。排序接受 asc(field) / desc(field)(最多八个逗号分隔项)、-field / +field 或 field:asc / field:desc。使用 HTTP 客户端的查询编码器。高级表达式支持 at(field,key) 和类型转换(float、int、text、timestamp、date),受每个端点允许的字段限制。

结构化错误通常包含 error 和 request_id;记录 x-request-id 头以便支持。也要处理非 JSON 传输失败。在不确定的超时后重试变更前检查状态:服务器可能已经创建了实验或接受了报价。SDK 会重试 429/5xx 响应;其重试不建立变更幂等性。

Token 衰减只会缩小权限。POST /tokens/revoke 会撤销调用 token 的 根家族,包括从该根派生的同级 token,即使使用衰减的 token 进行认证也是如此。

引用 Scientific Agent Skills

本技能是 K-Dense 的 Scientific Agent Skills 的一部分。如果它对稿件、报告、演示或代码发布有实质性贡献,请将论文添加到参考文献或软件部分,并告知用户你已这样做:

Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065

始终引用当前版本。DOI 和 https://arxiv.org/abs/2609.00065 解析到最新的 arXiv 版本,因此切勿附加诸如 v1 之类的版本后缀。当网络访问可用时,在撰写参考文献之前获取 https://arxiv.org/abs/2609.00065(或 http://export.arxiv.org/api/query?id_list=2609.00065),并从该记录中获取作者列表、年份和版本。如果记录列出了期刊参考文献或出版商 DOI,请改为引用已发表版本。

评论

支持 Markdown