虚拟筛选用于将同一靶点与多个候选分子分别组合,批量预测复合物结构,并汇总候选的排名与置信度。您可以通过一次任务比较多条候选肽或多个小分子配体,也可以为每个候选提供多个分子实体。
虚拟筛选使用 Melo-1 模型,任务类型为 2,沿用任务管理 API 的询价、创建、查询、列表与取消接口。身份认证和通用响应格式见 API 接入指南。
使用流程
- 准备输入:填写共用靶点
target,为每个候选分配唯一的id并填写分子信息。 - 查询费用:调用
POST /v1/tasks/quote,确认每个组合的 Token 数和整批预估费用。 - 提交任务:使用相同的模型、任务类型和输入调用
POST /v1/tasks/create,保存返回的task_id。 - 查询与下载:通过
GET /v1/tasks/status查询任务;任务结束后,使用output_url下载结果 ZIP。 - 查看候选结果:先阅读
summary.csv,再根据候选 ID 查看对应的结构结果。
输入格式
以下示例将一条靶点蛋白分别与两条候选肽组合。候选肽使用 protein 类型;小分子候选则使用 ligand,并提供 smiles 或 ccd。
将以下请求保存为 screening.json,可直接用于下方的询价与提交示例:
{
"model": "Melo-1",
"task_type": 2,
"input": {
"target": {
"sequences": [
{
"type": "protein",
"id": ["A"],
"sequence": "MQIFVKTLTGKTITLEVEPSDTIENVKAKIQDKEGIPPDQQRLIFAGKQLEDGRTLSDYNIQKESTLHLVLRLRGG"
}
]
},
"candidates": [
{
"id": "peptide1",
"sequences": [
{ "type": "protein", "id": ["B"], "sequence": "ACDEFGHIKLMNPQRSTVWY" }
]
},
{
"id": "peptide2",
"sequences": [
{ "type": "protein", "id": ["B"], "sequence": "ACDEFGHIKL" }
]
}
]
}
}
示例用于说明请求格式,不代表经过验证的结合分子。
请求参数
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
model | string | 否 | 省略时为 Melo-1;虚拟筛选仅支持该模型 |
task_type | int | 是 | 必须为 2;省略时按结构预测任务处理 |
task_name | string | 否 | 仅创建任务时使用,命名规则见提交推理任务 |
input.target | object | 是 | 所有候选共用的靶点 |
input.target.sequences | array | 是 | 靶点分子实体列表,至少包含一项 |
input.candidates | array | 是 | 候选列表,至少包含一个候选 |
input.candidates[].id | string | 是 | 候选唯一标识,用于关联报价、汇总表和结果文件 |
input.candidates[].sequences | array | 是 | 当前候选的分子实体列表,至少包含一项 |
分子实体参数
target.sequences 和各候选的 sequences 使用以下字段。模型名和分子类型均区分大小写。
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
type | string | 是 | protein、dna、rna、ligand 或 ion |
id | array[string] | 是 | 分子链标识列表,格式与唯一性要求见下方说明 |
sequence | string | 条件必填 | protein、dna、rna 必填,单条序列至少为 4;请求中的空白字符会被忽略 |
smiles | string | 条件必填 | ligand 或 ion 至少提供 smiles、ccd 之一;两者同时提供时使用 smiles |
ccd | string | 条件必填 | PDB CCD 编码,建议使用大写,例如 ATP、HEM、MG |
template_seq | string | 否 | 仅靶点的 protein 实体可用,具体用法见下方说明 |
| 序列类型 | 可用字符 |
|---|---|
protein | 20 种标准氨基酸单字母:ACDEFGHIKLMNPQRSTVWY |
dna | ATCG |
rna | AUCGN |
建议使用大写序列。平台还会验证 SMILES 和 CCD 是否有效。仅传入本指南说明的输入参数。
候选与链标识
- 候选 ID:长度为 1~100,只能包含英文字母、数字、下划线和连字符,且必须以字母或数字开头。同一任务内忽略大小写后不可重复,例如
peptide1与Peptide1不能同时使用。 - 链标识
sequences[].id:每项包含 1~50 个链标识,每个标识长度为 1~50;虚拟筛选的链标识只能包含英文字母和数字。 - 组合内唯一:靶点与任意一个候选组成的复合物中,链标识不可重复。不同候选之间可以复用链标识;例如上面的两个候选都使用
B,但不能与靶点共用A。 - 序列格式:建议提供不含空白的大写序列。蛋白质、DNA 和 RNA 单条序列至少包含 4 个残基或碱基。
如需指定用于模板搜索的蛋白质序列,可在靶点的 protein 实体中提供可选字段 template_seq。该字段仅用于靶点蛋白,使用标准氨基酸单字母序列,最长为 2,000;省略、传入 null 或空字符串时使用默认模板搜索方式。实际预测的靶点序列仍由 sequence 指定。
询价与提交
查询整批与逐候选费用
使用您的 API Key 替换示例中的占位值:
curl --request POST 'https://api.atomelody.com/v1/tasks/quote' \
--header 'Authorization: Bearer ak_your_api_key_here' \
--header 'Content-Type: application/json' \
--data-binary @screening.json
上面的输入包含 76 个残基的靶点,以及分别为 20 和 10 个残基的候选肽。响应示例:
{
"code": "OK",
"message": "OK",
"data": {
"token_num": 182,
"base_cost": 20,
"quantity": 1,
"estimated_cost": 20,
"candidate_costs": [
{ "candidate_id": "peptide1", "token_num": 96, "estimated_cost": 10 },
{ "candidate_id": "peptide2", "token_num": 86, "estimated_cost": 10 }
]
}
}
| 字段 | 描述 |
|---|---|
token_num | 所有“靶点 + 单个候选”组合的 Token 数之和;靶点在每组中分别计入 |
base_cost | 整批基础费用(算力点数),为各组合按 Token 阶梯计算的基础费用之和 |
quantity | 计费数量,虚拟筛选固定为 1,不是候选数量 |
estimated_cost | 整批任务预估消耗的算力点数,为各组合费用之和 |
candidate_costs | 按输入候选顺序返回的逐候选报价 |
candidate_costs[].candidate_id | 对应输入中的候选 ID |
candidate_costs[].token_num | 靶点与当前候选组合的 Token 数 |
candidate_costs[].estimated_cost | 当前组合按 Token 阶梯计算的预估点数 |
2,000 Token 上限适用于每个组合,不适用于所有组合累加后的 token_num。费用按组合分别套用阶梯后求和,不将整批 Token 合并套用一次阶梯。详细规则见虚拟筛选计费。
询价不会创建任务或冻结点数,也不锁定价格。询价与创建均会校验 1,000 点的单任务费用上限;超出时返回 INVALID_ARGUMENT。分子输入或单个组合 Token 数不合法时返回 INVALID_SEQUENCE。
提交筛选任务
确认报价后,使用同一份输入提交:
如需限制本次任务的点数消耗,可在 screening.json 顶层添加 max_cost,值取询价返回的 data.estimated_cost(上例为 20)。创建时整批费用超过此值会返回 MAX_COST_EXCEEDED,不会创建任务或冻结点数;省略或设为 0 则不设置用户费用上限。1,000 点的单任务费用上限仍然生效。
curl --request POST 'https://api.atomelody.com/v1/tasks/create' \
--header 'Authorization: Bearer ak_your_api_key_here' \
--header 'Content-Type: application/json' \
--data-binary @screening.json
创建成功后的字段定义见任务创建响应。保存 data.task_id,并通过 data.billing_order.frozen 确认本次实际预占的点数。
查询状态与下载结果
长时间等待时,推荐使用任务等待脚本,由脚本自动查询,只输出状态变化和最终结果。
curl --get 'https://api.atomelody.com/v1/tasks/status' \
--header 'Authorization: Bearer ak_your_api_key_here' \
--data-urlencode 'task_id=<TASK_ID>'
状态接口仅返回任务 ID、状态,以及按需返回的结果地址和错误;如需查看 task_type、靶点与候选输入,可调用 /v1/tasks/query 获取详情。状态编码与任务状态表一致;候选的执行结果需从下载包中的 summary.csv 查看。
| 筛选结果 | 任务状态 | 点数结算 |
|---|---|---|
| 全部候选成功 | 4(COMPLETED) | 扣除全部组合费用 |
| 部分候选成功 | 4(COMPLETED) | 仅扣除成功组合的费用,失败组合的预占点数释放 |
| 全部候选失败 | 5(FAILED) | 释放全部预占点数;已生成汇总结果时仍可下载 |
| 在允许阶段取消 | 6(CANCELLED) | 释放全部预占点数 |
output_url 有效期为 10 分钟,过期后重新查询任务即可获取新地址。下载时使用返回的完整 URL;任务错误处理和取消规则见任务管理 API。
结果文件与解读
结果 ZIP 的根目录包含一份汇总表和成功候选的结果 ZIP。例如两个候选均成功时:
output.zip
├── summary.csv
├── peptide1.zip
└── peptide2.zip
summary.csv 保留所有候选。失败候选没有对应的结构 ZIP;若全部候选失败且已生成汇总结果,下载包中仅包含 summary.csv。
汇总表常用字段
| 列名 | 含义 |
|---|---|
id | 输入中的候选 ID |
status | 当前候选的执行结果:success 表示成功,failed 表示失败 |
rank | 成功候选按 ranking_score 从高到低的排名;失败候选为空 |
ranking_score | 当前候选代表结构的排名分数 |
has_clash | 代表结构是否检测到原子碰撞 |
iptm / ptm | 代表结构的界面与整体结构置信度指标 |
plddt | 代表结构的平均原子 pLDDT,范围为 0~100 |
sample_count | 当前候选用于统计的结构样本数 |
ranking_score_mean / ranking_score_std / ranking_score_min | 当前候选各样本排名分数的均值、标准差与最小值 |
clash_sample_count | 当前候选检测到原子碰撞的样本数量 |
成功候选排在汇总表前部,失败候选排在后部。请按列名读取 CSV,并通过 id 关联输入与结果文件,不要依赖输入顺序或固定列位置;未列出的附加字段可以忽略。失败候选的评分为空,不应将空值当作零分参与比较。
建议结合排名分数、界面置信度、碰撞情况与具体结构共同评估候选。样本间评分差异反映分数变化,不能直接视为结构收敛程度;这些指标也不等同于实验测得的结合亲和力或活性。
可使用虚拟筛选结果报告模板,将整批 ZIP 生成为可离线打开的交互报告,在候选排名表中定位结果,再查看每个候选的三维结构、PAE 与 pLDDT。