@delta-infra/cli 1.0.97 → 1.0.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,73 +0,0 @@
1
- # LDM 科研工作流
2
-
3
- 这里的 **LDM / 大发现模型** 是用户可见的科研工作流名称,不是可以直接访问网关的
4
- tool。在线计算必须先按任务语义选择 `ldm-bo`、`strbo` 或 `antbo`,再通过
5
- `delta-cli science invoke`
6
- 调用 Delta CLI;禁止运行旧 `large-discovery-model` Skill、`run_ldm_loop.py`、gateway
7
- backend、`stream_widget` 中的联网命令或任何 HTTP 客户端。
8
-
9
- ## 路由
10
-
11
- | 用户目标 | 实际 tool | 需要同时读取 |
12
- | --- | --- | --- |
13
- | 在给定 SMILES 候选池中推荐下一批,或运行 PDF2Dock/Vina+NN 轨迹 | `ldm-bo` | `references/ldm-bo.md` |
14
- | 围绕服务端固定 KRAS G12D 生成、评估并迭代小分子 | `strbo` | `references/strbo.md` |
15
- | 为指定抗原生成、评估并迭代 11-aa CDRH3 | `antbo` | `references/antbo.md` |
16
-
17
- 不得因为用户只说“LDM”“药物发现”就自动选择后端。根据实体、已有数据和目标判断;
18
- 仍无法区分时,结束并说明需要用户确认“小分子候选池、KRAS G12D 生成优化或抗体
19
- CDRH3”中的哪一种。
20
-
21
- ## 最小执行范围
22
-
23
- - 用户只要求检查参数时,只调用相应 `*-validate` operation。
24
- - 用户只要求评估已有候选时,只调用 evaluate,不生成新候选。
25
- - 用户只要求推荐下一批且已经给出历史记录时,只调用 suggest/recommend。
26
- - 用户明确要求“完整迭代优化”时,才运行初始化、评估、建议、再评估的闭环。
27
- - 用户未给轮数时,STRBO/AntBO 最多执行一个建议轮次;不得沿用旧 Skill 的 6/8 轮
28
- 隐式默认值。LDM-BO `trajectory` 的评估次数必须来自用户,缺失时先要求确认。
29
-
30
- 生成、评估、建议和 trajectory 都会消耗远端资源。一次自然语言中的“帮我优化”视为
31
- 执行授权,但不得擅自扩大候选数、轮数或切换后端。
32
-
33
- ## STRBO 完整闭环
34
-
35
- 1. 调用 `molecules-init` 或 `molecules-init-job`,取得初始 SMILES。
36
- 2. 调用 `molecules-evaluate` 或对应异步 operation,取得 `[vina, activity]`。
37
- 3. 使用当前成功业务响应中的 SMILES 和 scores 构造 `history_xs/history_ys`。
38
- 4. 调用一次 `molecules-suggest-job`,按 STRBO reference 轮询至成功。
39
- 5. 只评估新建议,并把结果与当前任务内历史合并后返回。
40
-
41
- 提交 operation 不得重试。任一步失败、超时或返回数量不一致,立即结束;不得用旧
42
- gateway、离线 mock、本地 RDKit/Vina 或模型猜测补全。
43
-
44
- ## AntBO 完整闭环
45
-
46
- 1. 用户必须提供抗原;未提供时不得替用户选择。
47
- 2. 必要时调用一次 `ldm-health`,确认抗原与 CDRH3 长度约束。
48
- 3. 调用 `ldm-init` 取得初始 CDRH3,再调用 `evaluate` 取得结合能。
49
- 4. 使用当前成功业务响应构造一维 `history_ys`,调用一次 `ldm-suggest`。
50
- 5. 只评估新建议,并返回当前任务内的候选与结合能。
51
-
52
- 不得把 AntBO 的一维 score 改成 STRBO 的二维 score,也不得把 CDRH3 交给小分子
53
- LDM-BO。
54
-
55
- ## 固定候选池与轨迹
56
-
57
- - 已有候选池和历史分数,要求下一批:使用 `ldm-bo/recommend`。
58
- - 用户明确要求完整 PDF2Dock/Vina+NN 搜索并给出评估次数:使用
59
- `ldm-bo/trajectory`。
60
- - 不得把 `ldm-bo` 的 provider、模型路径、密钥、GPU 或 Vina 配置放进请求;这些由
61
- Science Server 管理。
62
-
63
- ## 结果与展示
64
-
65
- 只报告当前 Delta CLI 业务响应中真实存在的候选、目标值、warnings、job_id、状态和
66
- 服务端 provenance。不得自行添加相似度阈值、机制解释、湿实验结论或“最优”断言;
67
- 只有在方向明确且比较集合完整时,才能按实际目标值指出当前集合中的最好候选。
68
- 推荐结果中的 acquisition value 不是预测目标值、置信度或推荐理由;除非业务响应
69
- 明确给出语义和方向,否则只作为原始采集函数值报告。
70
-
71
- LDM 的仪表盘是展示层,不是计算入口。用户明确要求图表时,先完成一次 CLI 计算,
72
- 再让外层使用同一份已验证结果绘图;禁止为了仪表盘再次提交远端任务。普通请求直接
73
- 返回简洁文本。
@@ -1,59 +0,0 @@
1
- # Molecule Enrichment 详细规则
2
-
3
- 这是一个由 Science Server 编排的联合 workflow:先用 PubChem 批量解析输入,再按服务
4
- 返回的 SMILES 回退顺序调用 RDKit 批量解析/描述符/指纹。它适合用户明确要求“一次拿到
5
- 身份信息和结构计算结果”的场景;推荐结果仍只来自当前 CLI 业务响应。
6
-
7
- 当前 Science Server 的注册标签是 `chemistry`,operation 是 `molecule.enrich`。实际
8
- 名称必须以当前 catalog 返回值为准;该 operation 的存在不能通过直接访问
9
- `/chem/molecule/enrich` 推断或替代。所有调用都使用:
10
-
11
- ```text
12
- delta-cli science invoke --tool chemistry --endpoint molecule.enrich --data JSON
13
- ```
14
-
15
- ## Request
16
-
17
- 请求体:
18
-
19
- ```json
20
- {
21
- "inputs": ["aspirin", "caffeine"],
22
- "namespace": "name",
23
- "pubchem": {
24
- "properties": ["MolecularFormula", "MolecularWeight", "CanonicalSMILES"],
25
- "synonym_limit": 5
26
- },
27
- "rdkit": {
28
- "descriptors": true,
29
- "canonicalize": true,
30
- "fingerprint": {"type": "morgan", "radius": 2, "n_bits": 2048},
31
- "sanitize": true
32
- }
33
- }
34
- ```
35
-
36
- `inputs` 接受 1–100 个字符串;`namespace` 为 `cid`、`name`、`smiles`、`inchi`、
37
- `inchikey` 或 `formula`。`pubchem.properties` 和 `synonym_limit` 遵循 PubChem reference。
38
- RDKit 默认执行 descriptors、canonicalize 和 sanitize;`fingerprint` 可为 `false` 或
39
- Morgan 配置对象,radius 为 1–6,n_bits 为 128–8192。不要把一个服务的字段名改写成
40
- 另一个服务的字段名。
41
-
42
- ## Result
43
-
44
- 成功业务结果通常包含 `valid`、`count`、`failed_count`、`results`、`warnings` 和
45
- `metadata`。每个 `results[*]` 保留:
46
-
47
- - 原始输入 `input`;
48
- - PubChem 的 `valid`、`cid`、`smiles`、`formula`、`properties`、`aliases`、`synonyms`
49
- 和 `error`;
50
- - 可选 RDKit 的 `valid`、`canonical_smiles`、`descriptors`、`fingerprint_metadata`、
51
- `on_bits`、`bit_count`、`warnings` 和 `error`。
52
-
53
- SMILES 回退顺序固定为 `CanonicalSMILES -> ConnectivitySMILES -> SMILES ->
54
- IsomericSMILES`。PubChem 没有可用 SMILES,或 RDKit 失败时,该条记录保持无效并计入
55
- `failed_count`;不要用本地 RDKit/PubChem 或人工字符串补齐。
56
-
57
- 只要用户需要单一中间结果,就不要为了使用 workflow 额外调用另一服务。不要主动调用
58
- health 或保存文件;用户明确要求图片时仍单独使用 RDKit `render`,不要把本 workflow 的
59
- 描述符响应当成图像。
@@ -1,137 +0,0 @@
1
- # Delta Science operation 最小契约
2
-
3
- 本文只记录当前 CLI catalog 已暴露的 9 个 tools、42 个 operations。选择 operation 后
4
- 只读取对应小节。代码示例均在同一个 `python_repl` 中先定义以下函数;禁止 Bash、
5
- 目录探测、直接 HTTP 和字面 CLI 命令。
6
-
7
- 调用 `python_repl` 时工具参数必须严格为 `{"code":"..."}`;禁止添加 `deps`、
8
- `dependencies`、`packages` 或任何其他字段。
9
-
10
- ```python
11
- import json, os, subprocess, sys
12
-
13
- wrapper = os.path.join(os.environ["SKILLS_ROOT"], "delta-science", "scripts", "invoke.py")
14
-
15
- def invoke(tool, endpoint, data=None, params=None):
16
- argv = [sys.executable, wrapper, "--tool", tool, "--endpoint", endpoint]
17
- if data is not None:
18
- argv += ["--data-json", json.dumps(data)]
19
- if params is not None:
20
- argv += ["--params-json", json.dumps(params)]
21
- p = subprocess.run(argv, capture_output=True, text=True, shell=False)
22
- if p.returncode != 0:
23
- raise RuntimeError(p.stderr or p.stdout)
24
- r = json.loads(p.stdout)
25
- if r.get("ok") is not True or r.get("transport") != "delta-cli":
26
- raise RuntimeError(r)
27
- return r["native"]
28
- ```
29
-
30
- 每个代码示例只调用一次。将返回值投影成用户要求的有界 JSON 并显式 `print`,然后
31
- 调用 `step_finish(status="done", summary=<同一 JSON>)` 恰好一次。失败则
32
- `step_finish(status="failed", summary=<原始错误短摘要>)`,禁止重试或改走其他链路。
33
-
34
- ## PubChem(tool=`pubchem`)
35
-
36
- | operation | 人类情景 | 最小代码 | native 投影 |
37
- | --- | --- | --- | --- |
38
- | `health` | “PubChem 服务现在能用吗?” | `n=invoke("pubchem","health")` | status、availability、metadata、limits、warnings |
39
- | `compound-resolve-cids` | “把 aspirin 解析成 CID。” | `n=invoke("pubchem","compound-resolve-cids",data={"identifier":"aspirin","namespace":"name","max_records":20})` | identifier、valid、cids、error |
40
- | `compound-properties` | “查 aspirin 的分子式和分子量。” | `n=invoke("pubchem","compound-properties",data={"identifier":"aspirin","namespace":"name","properties":["MolecularFormula","MolecularWeight"]})` | cid、valid、properties、aliases、error |
41
- | `compound-synonyms` | “列出 aspirin 的前 5 个同义词。” | `n=invoke("pubchem","compound-synonyms",data={"identifier":"aspirin","namespace":"name","max_synonyms":5})` | cid、valid、synonyms、error |
42
- | `compound-summary` | “查阿司匹林的基础身份信息。” | `n=invoke("pubchem","compound-summary",data={"identifier":"aspirin","namespace":"name"})` | valid、cid、properties 中用户要求的键 |
43
- | `compound-batch-summary` | “一次比较 aspirin 和 caffeine 的基础属性。” | `n=invoke("pubchem","compound-batch-summary",data={"identifiers":["aspirin","caffeine"],"namespace":"name"})` | results[*].input、valid/error、properties |
44
-
45
- ## RDKit(tool=`rdkit`)
46
-
47
- | operation | 人类情景 | 最小代码 | native 投影 |
48
- | --- | --- | --- | --- |
49
- | `health` | “RDKit 服务可用吗?” | `n=invoke("rdkit","health")` | status、availability、metadata、limits、warnings |
50
- | `parse` | “这个 SMILES 合法吗?” | `n=invoke("rdkit","parse",data={"input":"CCO","format":"smiles","sanitize":True})` | valid、canonical_smiles、formula、inchi_key、warnings/error |
51
- | `descriptors` | “计算乙醇的基础 RDKit 描述符。” | `n=invoke("rdkit","descriptors",data={"smiles":"CCO","descriptor_set":"basic","sanitize":True})` | valid、descriptors、warnings/error |
52
- | `batch-descriptors` | “批量算几个 SMILES 的描述符。” | `n=invoke("rdkit","batch-descriptors",data={"smiles":["CCO","c1ccccc1"],"descriptor_set":"basic","sanitize":True})` | results 中输入、valid、descriptors、error |
53
- | `batch-parse-describe` | “校验阿司匹林并给基础描述符。” | `n=invoke("rdkit","batch-parse-describe",data={"molecules":[{"id":"aspirin","smiles":"CC(=O)OC1=CC=CC=C1C(=O)O"}],"descriptor_set":"basic","sanitize":True})` | results[*].id、valid、canonical_smiles、descriptors、warnings/error |
54
- | `render` | “画一张乙醇结构图。” | `n=invoke("rdkit","render",data={"smiles":"CCO","image_format":"png","width":500,"height":400})` | 指定图像字段;PNG 解码后验证 magic bytes |
55
- | `fingerprint` | “生成乙醇 Morgan 指纹。” | `n=invoke("rdkit","fingerprint",data={"smiles":"CCO","radius":2,"n_bits":2048})` | valid、fingerprint_metadata、on_bits、warnings/error |
56
- | `similarity` | “比较乙醇和乙胺的结构相似度。” | `n=invoke("rdkit","similarity",data={"query_smiles":"CCO","target_smiles":"CCN","radius":2,"n_bits":2048})` | similarity、metric、fingerprint metadata |
57
- | `similarity-matrix` | “比较一组分子的两两相似度。” | `n=invoke("rdkit","similarity-matrix",data={"molecules":[{"id":"a","smiles":"CCO"},{"id":"b","smiles":"CCN"}],"fingerprint":{"type":"morgan","radius":2,"n_bits":2048},"sanitize":True})` | matrix、ranked_pairs[{a,b,similarity}] |
58
- | `substructure` | “筛出含羧酸子结构的分子。” | `n=invoke("rdkit","substructure",data={"query_smarts":"C(=O)O","target_smiles":["CC(=O)O","CCO"]})` | query 与每个目标的 match/matches、valid/error |
59
-
60
- ## pymatgen(tool=`pymatgen`)
61
-
62
- | operation | 人类情景 | 最小代码 | native 投影 |
63
- | --- | --- | --- | --- |
64
- | `health` | “pymatgen 服务是否正常?” | `n=invoke("pymatgen","health")` | status、availability、metadata、limits、warnings |
65
- | `composition-parse` | “解析 LiFePO4 的组成和式量。” | `n=invoke("pymatgen","composition-parse",data={"formula":"LiFePO4","format":"formula"})` | valid、formula、reduced_formula、chemical_system、weight、element_amounts |
66
- | `structure-parse` | “校验这段 CIF 能否解析。” | `n=invoke("pymatgen","structure-parse",data={"input":cif_text,"format":"cif","primitive":False})` | valid、formula、nsites、lattice、warnings/error |
67
- | `structure-summary` | “总结这段 CIF 的结构信息。” | `n=invoke("pymatgen","structure-summary",data={"input":cif_text,"format":"cif","primitive":False})` | formula、reduced_formula、density、volume、lattice、species |
68
- | `structure-convert` | “把 CIF 转成 POSCAR。” | `n=invoke("pymatgen","structure-convert",data={"input":cif_text,"input_format":"cif","output_format":"poscar","primitive":False})` | valid、output_format、转换后的结构文本、warnings/error |
69
- | `structure-symmetry` | “分析这段 CIF 的空间群。” | `n=invoke("pymatgen","structure-symmetry",data={"input":cif_text,"format":"cif","primitive":False,"symprec":0.01,"angle_tolerance":5.0})` | space_group_symbol/number、crystal_system、point_group_symbol、hall、nsites |
70
-
71
- ## GSAS-II(tool=`gsasii`)
72
-
73
- | operation | 人类情景 | 最小代码 | native 投影 |
74
- | --- | --- | --- | --- |
75
- | `health` | “GSAS-II 服务能做衍射计算吗?” | `n=invoke("gsasii","health")` | status、gsasii_available、metadata、limits、warnings |
76
- | `powder-simulate` | “用这个 CIF 模拟 Cu Kα 粉末衍射。” | `n=invoke("gsasii","powder-simulate",data={"cif":cif_text,"phase_name":"phase","radiation":"CuKa","t_min":10.0,"t_max":80.0,"t_step":0.02,"include_profile":True,"max_profile_points":1000,"include_reflections":True,"max_reflections":1000,"return_refined_cif":False,"return_project":False})` | valid、profile、reflections、metadata、warnings |
77
- | `powder-refine` | “用真实粉末数据和仪器文件做 Rietveld 精修。” | `n=invoke("gsasii","powder-refine",data={"powder_data":powder_text,"powder_format":"xy","instrument_parameters":instrument_text,"phases":[{"name":"phase","cif":cif_text}],"refinement_mode":"rietveld","refinement_steps":[],"max_cycles":3,"histogram_name":"powder","include_profile":True,"max_profile_points":1000,"include_reflections":True,"max_reflections":1000,"return_refined_cif":False,"return_project":False})` | valid、residuals、phase summaries、profile、reflections、warnings |
78
-
79
- ## LAMMPS(tool=`lammps`)
80
-
81
- | operation | 人类情景 | 最小代码 | native 投影 |
82
- | --- | --- | --- | --- |
83
- | `health` | “LAMMPS 服务可用吗?” | `n=invoke("lammps","health")` | status、lammps_available、metadata、limits、warnings |
84
- | `lj-melt-example` | “给我跑部署自带的最小 LJ 示例做检查。” | `n=invoke("lammps","lj-melt-example")` | 示例说明与精确 `request`;此调用本身不执行模拟 |
85
- | `run` | “执行刚才返回的最小 LJ 请求。” | `example=invoke("lammps","lj-melt-example"); n=invoke("lammps","run",data=example["request"])` | valid、last_thermo、thermo rows、warnings、请求的输出文件;此场景固定两次依赖调用 |
86
-
87
- `run` 也可接收用户明确提供的 `input_script`、相对路径 files、timeout 和有界输出配置;
88
- 不得从化学式猜力场。长任务需明确授权,失败后不得重试。
89
-
90
- ## Delta-BO(tool=`delta-bo`)
91
-
92
- | operation | 人类情景 | 最小代码 | native 投影 |
93
- | --- | --- | --- | --- |
94
- | `commands` | “当前 Delta-BO 支持哪些命令?” | `n=invoke("delta-bo","commands")` | 当前部署返回的命令列表,不从旧文档补充 |
95
- | `generate` | “在 0 到 1 之间给两个随机初始实验点。” | `n=invoke("delta-bo","generate",data={"params":[{"name":"x","type":"numeric","low":0.0,"high":1.0}],"num_suggestions":2,"algorithm":"random-search","seed":42})` | suggestions、suggestion_metadata、warnings、diversity |
96
-
97
- 有历史观测且用户明确要求 BO 时,`generate` 可加入 objectives、object-form histories、
98
- model/acquisition/solver;历史少于 5 条默认 random-search,不编造观测。
99
-
100
- ## LDM-BO(tool=`ldm-bo`)
101
-
102
- 只用于小分子 SMILES/PDF2Dock,不用于抗体、CDRH3 或 AntBO。
103
-
104
- | operation | 人类情景 | 最小代码 | native 投影 |
105
- | --- | --- | --- | --- |
106
- | `health` | “分子 LDM-BO 服务可用吗?” | `n=invoke("ldm-bo","health")` | availability、Vina/ReaSyn/模型/LLM 配置状态、warnings |
107
- | `recommend` | “从候选池给下一条小分子 SMILES。” | `n=invoke("ldm-bo","recommend",data={"method":"bo-tanimoto","pool":["CCO","CCN","CCC"],"history":[{"smiles":"CCO","scores":[-7.1]},{"smiles":"CCN","scores":[-6.8]}],"batch_size":1})` | recommendations、acquisition_values、n_objectives、llm diagnostics |
108
- | `trajectory` | “跑一个有界的小分子 BO 轨迹。” | `n=invoke("ldm-bo","trajectory",data={"method":"bo-tanimoto","seed":42,"seed-smiles":"CCO,CCN,CCC","num-evaluations":4,"batch-size":1,"objective":"vina+nn"})` | config、history、summary、llm_trajectory;保留连字符字段 |
109
-
110
- ## SynBO(tool=`synbo`)
111
-
112
- | operation | 人类情景 | 最小代码 | native 投影 |
113
- | --- | --- | --- | --- |
114
- | `health` | “SynBO 服务当前可用吗?” | `n=invoke("synbo","health")` | status、synbo_available、metadata、limits、runtime、warnings |
115
- | `initialize` | “没有实验历史,先选三组反应条件。” | `n=invoke("synbo","initialize",data={"condition_dict":{"catalyst":["Pd(OAc)2","Pd(PPh3)4"],"solvent":["THF","Toluene"],"base":["K2CO3","DBU"]},"opt_metrics":["yield"],"opt_metric_settings":[{"opt_direct":"max","opt_range":[0,100],"metric_weight":1.0}],"batch_size":3,"sampling_method":"random","desc_normalize":"minmax","random_seed":42})` | recommendations/initial conditions、warnings、metadata |
116
- | `optimize` | “根据真实历史收率推荐下一批条件。” | `n=invoke("synbo","optimize",data={"condition_dict":{"catalyst":["Pd(OAc)2","Pd(PPh3)4","Pd2(dba)3"],"solvent":["THF","Dioxane","Toluene"],"base":["K2CO3","NaOEt","DBU"]},"opt_metrics":["yield"],"previous_results":[{"batch":0,"catalyst":"Pd(OAc)2","solvent":"THF","base":"K2CO3","yield":42.0},{"batch":0,"catalyst":"Pd(PPh3)4","solvent":"Dioxane","base":"NaOEt","yield":55.0},{"batch":0,"catalyst":"Pd2(dba)3","solvent":"Toluene","base":"DBU","yield":63.0}],"batch_size":2,"accuracy":"tiny","device":"cpu","random_seed":42})` | recommendations、model/acquisition metadata、warnings;失败/空结果不得本地替代 |
117
-
118
- ## AntBO(tool=`antbo`)
119
-
120
- 抗体/CDRH3 场景即使出现 “LDM” 也必须路由到 AntBO,不得改用分子 LDM-BO。
121
-
122
- | operation | 人类情景 | 最小代码 | native 投影 |
123
- | --- | --- | --- | --- |
124
- | `health` | “AntBO 环境可用吗?” | `n=invoke("antbo","health")` | status、antbo_available、metadata、limits、warnings |
125
- | `run-default-job` | “启动标准 AntBO 后台任务。” | `n=invoke("antbo","run-default-job",params={"log_name":"antbo_<唯一时间戳>.log","append":False,"timeout_seconds":86400})` | started、pid、log_name/log_path、timeout_seconds |
126
- | `run` | “用明确的受限配置同步跑一次 AntBO。” | `n=invoke("antbo","run",data={"script_path":"./bo/main.py","config_path":"./bo/config.yaml","n_trials":1,"seed":42,"antigens_file":"<项目根内路径>","extra_args":[],"timeout_seconds":86400,"cuda_visible_devices":"0","conda_env":"DGM","log_name":"antbo_custom.log","append":False})` | ok、returncode、timed_out、log_path、log_truncated |
127
- | `log` | “查看 antbo_run.log 的尾部。” | `n=invoke("antbo","log",params={"log_name":"antbo_run.log"})` | log_name、log、log_truncated |
128
- | `jobs` | “查看当前活动 AntBO 作业。” | `n=invoke("antbo","jobs")` | jobs[*].pid/running/returncode/log_name/log_path |
129
- | `stop` | “停止 PID 12345。” | `n=invoke("antbo","stop",params={"pid":12345})` | stopped、pid、message |
130
-
131
- `run-default-job`、`run`、`stop` 是远程变更,必须有用户明确授权,未知结果不得重试。
132
- AntBO `ldm/suggest`、`ldm/initialize`、`ldm/evaluate` 当前不在 catalog:不调用工具,
133
- 固定报告“未暴露该 operation;未发送远端请求”。
134
-
135
- 注意:AntBO `health` 可能公布公司服务内部的 `ldm_suggest` 等 endpoint,但它们并不
136
- 因此成为 Delta CLI operation;禁止调用不存在的 `antbo/catalog`,也禁止根据 health
137
- 为 Memento 推导新的 endpoint。
@@ -1,45 +0,0 @@
1
- # Delta Science 路由索引
2
-
3
- 本文件只描述稳定的科研意图边界,不复制 Science Server 的工具和 endpoint 清单。
4
- 实际可用工具以 `delta-cli science list` 和 `delta-cli science endpoints list` 返回的
5
- 实时目录为准。
6
-
7
- ## 路由优先级
8
-
9
- - 普通化合物名称、CID 和公共属性使用 PubChem;已有 SMILES/InChI 且需要结构计算时
10
- 使用 RDKit。
11
- - 用户明确要求一次得到名称解析、PubChem 字段和 RDKit 描述符/指纹时,使用
12
- `chemistry` 的 molecule-enrich workflow;不要为同一需求重复调用中间服务。
13
- - 无机化学式、组成、CIF、POSCAR 和空间群使用 pymatgen;粉末衍射模拟或 Rietveld
14
- 精修使用 GSAS-II。
15
- - 表格材料数据、可控变量/目标、候选空间、 surrogate 验证和候选排序使用
16
- Materials Design;不要把候选预测说成实验结果。
17
- - 需要 Quantum ESPRESSO 电子结构计算时使用 QE;先解析 workflow 与整组元素的 PP
18
- policy/lock,再按异步 job 生命周期处理 execution、solver 和 scientific 状态。
19
- - 明确的 LAMMPS input、data 和力场任务使用 LAMMPS;不得从化学式或 CIF 猜测势函数。
20
- - 通用数值、整数或分类实验变量优化使用 Delta-BO。
21
- - 固定 SMILES 候选池或 PDF2Dock 轨迹使用 LDM-BO;固定 KRAS G12D 生成式优化使用
22
- STRBO;反应条件与真实历史得率使用 SynBO;抗体 CDRH3 使用 AntBO。
23
- - “LDM/大发现模型”是跨上述三类能力的工作流意图,先读取 `ldm.md` 决定唯一后端,
24
- 不是服务端 tool,也不得路由到旧 `large-discovery-model` Skill。
25
-
26
- ## 已验证 reference
27
-
28
- - [pubchem.md](pubchem.md)
29
- - [rdkit.md](rdkit.md)
30
- - [molecule-enrich.md](molecule-enrich.md)
31
- - [pymatgen.md](pymatgen.md)
32
- - [gsasii.md](gsasii.md)
33
- - [lammps.md](lammps.md)
34
- - [delta-bo.md](delta-bo.md)
35
- - [materials-design.md](materials-design.md)
36
- - [qe-dft.md](qe-dft.md)
37
- - [ldm-bo.md](ldm-bo.md)
38
- - [ldm.md](ldm.md)
39
- - [strbo.md](strbo.md)
40
- - [synbo.md](synbo.md)
41
- - [antbo.md](antbo.md)
42
-
43
- 以上 reference 是已验证参数契约,不是服务端完整目录。用户明确点名新工具时,按
44
- `SKILL.md` 的实时 catalog 流程发现工具和 endpoint;若目录未返回请求 schema,不猜测
45
- 请求体。
@@ -1,112 +0,0 @@
1
- # 服务与参数参考
2
-
3
- 只读取当前所选服务对应的部分。下文中的 endpoint 是 Delta CLI catalog 名称,不是 URL 路径。
4
-
5
- ## PubChem
6
-
7
- Tool:`pubchem`。
8
-
9
- - 普通名称查询:`compound-summary`,data 为 `{"identifier":"caffeine","namespace":"name"}`。
10
- - 批量查询:`compound-batch-summary`。模糊的多分子比较必须严格使用 `{"identifiers":["aspirin","caffeine"],"namespace":"name"}`。
11
- - 批量查询不要添加 `properties` 或 `synonym_limit`,尤其不能把 `CID` 放进 `properties`。
12
- - 其他 operation:`compound-resolve-cids`、`compound-properties`、`compound-synonyms`。
13
-
14
- 单个 `compound-summary` 的业务字段直接位于 wrapper 的 `native` 顶层:读取
15
- `native.valid`、`native.cid`、`native.properties` 和 `native.synonyms`;不存在
16
- `native.data` 这一层。
17
-
18
- 模糊问题优先使用 summary。按 `CanonicalSMILES`、`ConnectivitySMILES`、`SMILES`、`IsomericSMILES` 的顺序提取 SMILES。PubChem 返回的 `MolecularWeight`、`XLogP` 和 `TPSA` 必须保留为 PubChem 数据。
19
-
20
- 批量 native 输出为 `{"results":[...]}`。每条记录用 `input` 保存原始标签,化合物字段位于嵌套的 `properties`;记录不是平铺结构,集合键也不是 `compounds`。
21
-
22
- ## RDKit
23
-
24
- Tool:`rdkit`。
25
-
26
- - `parse`:`{"input":"CCO","format":"smiles"}`
27
- - `descriptors`:`{"smiles":"CCO","descriptor_set":"basic","sanitize":true}`
28
- - `batch-parse-describe`:`{"molecules":[{"id":"ethanol","smiles":"CCO"}],"descriptor_set":"basic","sanitize":true}`
29
- - `render`:`{"smiles":"CCO","image_format":"png","width":500,"height":400}`
30
- - `similarity`:使用 `query_smiles` 和 `target_smiles`
31
- - `similarity-matrix`:使用 `molecules:[{id,smiles}]`
32
- - `substructure`:使用 `query_smarts` 和 `target_smiles`
33
-
34
- `batch-parse-describe` 使用 `molecules`,不能用 `inputs`;分子字段使用 `smiles`,不能用 `input`。fingerprint 选项是对象,不是布尔值。PubChem `XLogP` 与 RDKit `MolLogP` 使用不同模型。
35
-
36
- `similarity-matrix` 的 `ranked_pairs` 每项是
37
- `{"a": <输入 id>, "b": <输入 id>, "similarity": <数值>}`。不要读取
38
- `i`、`j` 或 `score`。
39
-
40
- ## pymatgen
41
-
42
- Tool:`pymatgen`。
43
-
44
- - 化学式:`composition-parse`,data 为 `{"formula":"LiFePO4","format":"formula"}`
45
- - 结构 operation:`structure-parse`、`structure-summary`、`structure-convert`、`structure-symmetry`
46
-
47
- 结构调用必须发送完整结构文本,不能发送本地文件路径。支持 CIF、POSCAR、JSON、CSSR 和 XSF。不要把 LAMMPS data/dump 文件交给 pymatgen。
48
-
49
- 对无机化学式/式量,只报告当前 native 的 `formula`、`reduced_formula`、
50
- `chemical_system`、`weight` 与元素组成。PubChem 未收录时保留 `not_found`,
51
- 不要编造 CID 或用本地计算补值。
52
-
53
- ## GSAS-II
54
-
55
- Tool:`gsasii`;operation 为 `powder-simulate` 和 `powder-refine`。
56
-
57
- 模拟需要完整 `cif` 文本。字段必须使用 `phase_name`、`include_profile`、`include_reflections`、`t_min`、`t_max` 和 `t_step`。
58
-
59
- 精修需要真实的 `powder_data`、`instrument_parameters` 和 `phases:[{name,cif}]`。依赖模拟结果时,只能从成功调用的 native `profile[*].x` 和 `profile[*].y_calc` 构造粉末数据。
60
-
61
- ## LAMMPS
62
-
63
- Tool:`lammps`。
64
-
65
- - 只读有界示例:`lj-melt-example`,无参数
66
- - 执行:`run`,参数必须是示例返回的精确 native `request`,或用户明确授权的 `input_script`/files
67
-
68
- 绝不能把 CLI 外层信封传给 `run`,只能传 `native["request"]`。LAMMPS 不会自动推断力场。交互式运行必须保持有界。
69
-
70
- 最小示例最终数值从当前 native `last_thermo` 读取;逐字保留 `Step`、`Temp`
71
- 和 `TotEng`,不要除以原子数、换算单位或推测收敛性。
72
-
73
- ## Delta-BO
74
-
75
- Tool:`delta-bo`。
76
-
77
- - 命令目录:`commands`,无参数
78
- - 无状态建议:`generate`,例如 `{"params":[{"name":"x","type":"numeric","low":0,"high":1}],"num_suggestions":2,"algorithm":"random-search","seed":42}`
79
-
80
- 观测少于五条时,除非用户明确要求 BO,否则优先使用 `random-search`。有状态 native session 命令属于变更操作,不能盲目重试。
81
-
82
- ## LDM-BO
83
-
84
- Tool:`ldm-bo`;operation 为 `recommend` 和 `trajectory`。
85
-
86
- 有界测试使用 `bo-tanimoto`。`recommend` 接受 `method`、`pool`、`history:[{smiles,scores}]` 和 `batch_size`。`trajectory` 必须保留 native 连字符字段:`seed-smiles`、`num-evaluations` 和 `batch-size`。
87
-
88
- ## SynBO
89
-
90
- Tool:`synbo`;operation 为 `initialize` 和 `optimize`。
91
-
92
- 二者都使用 `condition_dict`、`opt_metrics` 和 `batch_size`。`optimize` 还要求数值型 `previous_results`,且每条记录必须包含全部条件和指标。有界 CPU 测试使用 `accuracy:"tiny"` 和 `device:"cpu"`,并串行执行。
93
-
94
- 有真实 `previous_results` 的优化请求使用一次 `optimize`;每行必须包含全部条件列和
95
- 数值指标。失败、超时或空 recommendations 时如实报告,禁止本地替代优化。
96
-
97
- ## AntBO
98
-
99
- Tool:`antbo`。
100
-
101
- 当前 CLI catalog 暴露 `health`、`run-default-job`、`run`、`log`、`jobs` 和
102
- `stop`;准确参数见 `operation-contracts.md`。没有 `ldm/suggest`、
103
- `ldm/initialize`、`ldm/evaluate`。遇到 AntBO/CDRH3 的这些 LDM 请求时不要调用工具、
104
- 不要改用小分子 LDM-BO、不要探测目录或直连 HTTP;明确回复“当前 Delta CLI catalog
105
- 未暴露该 operation;未发送远端请求”。
106
-
107
- 启动作业只能根据同一次 native 的 `started`、`pid` 和 `log_name`/`log_path`
108
- 报告;任一字段缺失时标记为未验证,不要重复提交或编造作业信息。
109
-
110
- `health`、`log`、`jobs` 是只读调用。`run-default-job`、`run`、`stop` 会改变远端状态;
111
- `run-default-job` 的 `log_name`、`append`、`timeout_seconds` 使用 `--params-json`。
112
- 没有用户明确授权时不得启动或停止;未知结果不得重试。
@@ -1,98 +0,0 @@
1
- # 跨服务工作流
2
-
3
- 整个流程由单一 `delta-science` Skill 编排。线上调用最终执行
4
- `delta-cli science invoke`,禁止直接 HTTP。可使用 subagent 协助整理输入、核对 reference
5
- 或展示结果,但主流程负责工具选择和所有线上调用。CLI 成功后每一步只消费对应 reference
6
- 定义的 `data` 响应字段。已知 reference 中没有目标 operation 时,不猜测相近 endpoint;reference
7
- 缺失、过期或与 CLI 返回不一致时,按 `SKILL.md` 的只读实时 catalog 流程确认。
8
-
9
- ## 单个已命名分子
10
-
11
- 1. 用 PubChem `compound-summary` 解析名称并取得身份字段。
12
- 2. 按文档规定的回退顺序提取 SMILES。
13
- 3. 只有用户要求 RDKit 描述符或明确的结构校验时,才调用 RDKit `batch-parse-describe`。
14
- 4. 只有用户明确要求图片时,才调用 RDKit `render`,并解码、验证图片字节。
15
- 5. 比较分子式、分子量、InChIKey 和供体/受体数量时,要明确区分 LogP、TPSA 等依赖模型的数值。
16
-
17
- 如果用户明确要求一次返回 PubChem 记录以及 RDKit 规范化/描述符/指纹,使用
18
- `chemistry/molecule.enrich`;只要 PubChem 身份信息或只要 RDKit 计算时,仍使用对应的
19
- 单服务 operation。
20
-
21
- ## 多分子比较
22
-
23
- 1. 用 PubChem 批量解析全部名称,请求体只包含 `identifiers` 和 `namespace:"name"`。省略 `properties`。
24
- 2. 从业务响应的 `results[*]` 读取记录,并从每条记录的嵌套 `properties` 读取字段。
25
- 3. 未解析成功的记录要排除,并明确说明原因。
26
- 4. 使用 RDKit `similarity-matrix` 校验和排序两两相似度。它的 `sanitize` 已经校验输入,不要额外调用 parse。
27
- 5. 用 PubChem 记录的原始 `input` 作为 molecule id,并按文档顺序从嵌套属性中提取 SMILES。
28
- 6. 保持输入顺序,报告每个分数时明确对应的分子对。
29
- 7. 除非用户明确要求,不要渲染、保存用户文件、检查健康状态或探测额外描述符。
30
- 8. `ranked_pairs` 使用命名字段 `a`、`b`、`similarity`。找指定目标的最近邻时,
31
- 在包含该目标的记录中取最大 `similarity`,另一侧字段就是最近邻;不要使用
32
- `i`、`j`、`score` 或猜测矩阵下标。
33
-
34
- ## 材料工作流
35
-
36
- 1. 使用 pymatgen 校验化学式/结构并转换 CIF;无机式量只能取当前业务响应 `weight`。
37
- 2. GSAS-II 只能接收真实 CIF 文本后再做衍射计算。
38
- 3. LAMMPS 只能在已有明确的力场、data 和脚本设置后运行;部署检查可以使用内置有界示例。
39
- 4. 从 LAMMPS 返回 pymatgen 或 GSAS-II 前,需要从弛豫结果重新构造 CIF/POSCAR。不要直接传递 LAMMPS data/dump 文件。
40
-
41
- ## Materials Design 工作流
42
-
43
- 1. 先明确 identifier、可控设计变量、目标列及方向、泄漏/元数据列、分组或时间切分和
44
- 可行候选空间;不能优化 identifier、测量后变量或泄漏字段。
45
- 2. 优先使用用户提供的候选表;只有服务契约允许且假设已标明时,才从可控变量的观测域
46
- 生成离散候选。组成闭合、硬约束、步长和是否允许外推必须显式记录。
47
- 3. 读取作业的 `status` 后再读取 `result_status`;`completed` 不等于推荐可靠。
48
- `complete`、`exploratory`、`readiness_only` 和 `failed` 必须分别报告,并保留 warnings。
49
- 4. 只有用户要求或工作流需要时才下载 report/CSV/JSON artifact;依据服务返回的 size 和
50
- SHA-256 校验,不能声称结果已经写入本地项目目录。
51
-
52
- Materials Design 的 `jobs` 上传是 multipart。当前 `delta-cli science invoke` 只能传 JSON
53
- body/query;除非实时目录提供明确的文件上传 adapter,否则不猜测 endpoint、不要把文件
54
- 路径或 base64 塞进 `--data`,也不要改走直连 Gateway。
55
-
56
- ## QE DFT 工作流
57
-
58
- 1. 读取 health 和实时 workflow catalog,选择当前为 `supported` 的 workflow;收集完整
59
- campaign element union,并按服务返回值解析/锁定 PP。
60
- 2. 结构必须先成为服务返回的 checksum-addressed artifact;job 只引用 artifact ID、已批准
61
- parameter set、PP lock、k-points、workflow_inputs 和资源请求。
62
- 3. 提交必须使用稳定幂等语义;HTTP 202/accepted 只表示接收,不表示 QE 已收敛。轮询时
63
- 独立读取 `execution`、`solver`、`scientific` 三个状态,并按原始 stable error code 分类。
64
- 4. CPU 是默认资源策略。只有用户明确要求或项目已有 GPU 授权且 live catalog 标记为
65
- `gpu_support_status: verified` 时才请求 GPU;`gpu` 不得静默回退到 CPU,`auto` 也不等于
66
- 已实际使用 GPU。
67
- 5. 日志和结果 artifact 下载后按服务返回的 SHA-256 校验;不要把 scheduler 完成、solver
68
- 收敛或可解析输出直接写成 scientific acceptance。
69
-
70
- QE 原始 artifact 上传需要二进制 body,job 提交还需要自定义 `Idempotency-Key`。当前 CLI
71
- 没有这两类参数;只能调用 Science Server 已明确暴露的等价 adapter,否则报告“当前 CLI
72
- 未暴露该 operation;未发送远端请求”。
73
-
74
- ## 优化工作流
75
-
76
- - 通用数值或分类实验变量:Delta-BO
77
- - 固定 SMILES 候选池或 PDF2Dock/Vina+NN 轨迹:LDM-BO
78
- - 固定 KRAS G12D 的生成式小分子闭环:STRBO
79
- - 指定抗原的 11-aa CDRH3 闭环:AntBO
80
- - 偶联反应、反应条件和带真实历史得率的下一批实验推荐:SynBO
81
-
82
- 用户以 “LDM/大发现模型” 描述任务时,必须先按 `SKILL.md` 读取 `ldm.md`,再读取唯一
83
- 选定后端的 reference。LDM 是工作流意图,不是 tool;禁止旧
84
- `large-discovery-model`、`run_ldm_loop.py`、gateway backend 和直接 HTTP。
85
-
86
- 禁止为了让优化器运行而编造观测数据。用户没有提供测量结果时,只能使用初始化或随机建议模式,并明确说明它是待实验验证的建议,不是已经验证的最优条件。
87
- SynBO/Delta-BO 没有返回 recommendations 时,不得用本地回归、GP、UCB 或人工排序替代。
88
-
89
- SynBO 只接受离散条件列表。用户给连续范围时,在一次调用前完成以下处理:
90
-
91
- 1. 条件网格包含用户上下界、全部历史观测值和少量合理中间点。
92
- 2. 同一条件列在 `condition_dict` 与 `previous_results` 中统一为字符串。
93
- 3. 得率等 objective metric 保持数值。
94
- 4. 小数据 CPU 默认 `tiny + RF + UCB`,并在最终答案中报告实际离散网格。
95
- 5. CLI 返回失败或业务响应为空 recommendations 时结束;不得连续尝试多种 payload 或模型。
96
-
97
- 用户未要求文件时只返回 recommendations 文本,不创建输入 CSV。必须交接时,仅把本次
98
- 成功业务响应写入当前 `WORKSPACE_ROOT/synbo_result.json`。