@delta-infra/cli 1.0.83 → 1.0.84

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.
Files changed (30) hide show
  1. package/README.md +429 -429
  2. package/checksums.txt +5 -5
  3. package/package.json +1 -1
  4. package/scripts/install-wizard.js +625 -625
  5. package/scripts/install.js +417 -417
  6. package/scripts/run.js +65 -65
  7. package/skills/delta-sandbox/SKILL.md +356 -356
  8. package/skills/delta-sandbox/agents/openai.yaml +4 -4
  9. package/skills/delta-sandbox/references/commands.md +56 -56
  10. package/skills/delta-sandbox/references/lifecycle.md +92 -92
  11. package/skills/delta-sandbox/references/recipes.md +133 -133
  12. package/skills/delta-science/SKILL.md +140 -136
  13. package/skills/delta-science/agents/openai.yaml +4 -4
  14. package/skills/delta-science/references/antbo.md +100 -100
  15. package/skills/delta-science/references/cli-contract.md +53 -53
  16. package/skills/delta-science/references/delta-bo.md +89 -89
  17. package/skills/delta-science/references/gsasii.md +116 -116
  18. package/skills/delta-science/references/lammps.md +66 -66
  19. package/skills/delta-science/references/ldm-bo.md +129 -129
  20. package/skills/delta-science/references/ldm.md +73 -73
  21. package/skills/delta-science/references/pubchem.md +126 -126
  22. package/skills/delta-science/references/pymatgen.md +68 -68
  23. package/skills/delta-science/references/rdkit.md +138 -138
  24. package/skills/delta-science/references/routing-index.md +36 -36
  25. package/skills/delta-science/references/strbo.md +87 -87
  26. package/skills/delta-science/references/synbo.md +198 -198
  27. package/skills/delta-science/references/workflows.md +61 -61
  28. package/skills/delta-shared/SKILL.md +95 -95
  29. package/skills/delta-shared/agents/openai.yaml +4 -4
  30. package/skills/manifest.json +19 -19
@@ -1,198 +1,198 @@
1
- # SynBO operation 参考
2
-
3
- 所有在线调用都通过 `delta-cli science invoke`,服务地址来自 CLI 的标准
4
- `science_base_url` 配置。这里的路径只说明业务 operation,不得据此直连 HTTP。
5
-
6
- 用户说“优化反应条件”“推荐下一批实验”“偶联反应怎么继续做”,或给出溶剂、温度、
7
- 催化剂、碱、配体和历史得率时,即使没有提到 SynBO、BO、CLI 或字段名也使用本节。
8
- 每个用户任务最多一次 SynBO 业务调用;成功后立即结束,validation、502、504、
9
- timeout、断连或空 recommendations 均不得换参数、换模型或重试。
10
-
11
- ## Health
12
-
13
- operation:`health`,无 body。
14
-
15
- Reports SynBO import status, Torch/CUDA runtime availability, service limits,
16
- default device, and visible CUDA devices.
17
-
18
- Important fields inside gateway `data`:
19
-
20
- ```json
21
- {
22
- "status": "ok",
23
- "synbo_available": true,
24
- "metadata": {
25
- "service": "synbo-service",
26
- "engine": "synbo",
27
- "version": "0.1.0",
28
- "synbo_version": "0.1.0",
29
- "default_device": "cpu",
30
- "cuda_visible_devices": ""
31
- },
32
- "limits": {
33
- "max_batch_size": 128,
34
- "max_reaction_space_size": 200000,
35
- "max_previous_rows": 10000
36
- },
37
- "runtime": {
38
- "torch_available": true,
39
- "cuda_available": false,
40
- "cuda_device_count": 0,
41
- "cuda_device_names": []
42
- },
43
- "warnings": []
44
- }
45
- ```
46
-
47
- ## Initialize
48
-
49
- operation:`initialize`。
50
-
51
- Use for initial condition sampling when no measured previous results exist.
52
-
53
- Request body:
54
-
55
- ```json
56
- {
57
- "condition_dict": {
58
- "catalyst": ["Pd(OAc)2", "Pd(PPh3)4", "Pd2(dba)3"],
59
- "solvent": ["THF", "Dioxane", "Toluene"],
60
- "base": ["K2CO3", "NaOEt", "DBU"]
61
- },
62
- "opt_metrics": ["yield"],
63
- "opt_metric_settings": [
64
- {"opt_direct": "max", "opt_range": [0, 100], "metric_weight": 1.0}
65
- ],
66
- "batch_size": 3,
67
- "sampling_method": "random",
68
- "desc_normalize": "minmax",
69
- "random_seed": 42
70
- }
71
- ```
72
-
73
- Supported `sampling_method` values: `sobol`, `random`, `lhs`, `kmeans`.
74
-
75
- ## Optimize
76
-
77
- operation:`optimize`。
78
-
79
- Use after measured experiment rows are available. Each previous row must contain
80
- all condition columns and all objective metric columns.
81
-
82
- Request body:
83
-
84
- ```json
85
- {
86
- "condition_dict": {
87
- "catalyst": ["Pd(OAc)2", "Pd(PPh3)4", "Pd2(dba)3"],
88
- "solvent": ["THF", "Dioxane", "Toluene"],
89
- "base": ["K2CO3", "NaOEt", "DBU"]
90
- },
91
- "opt_metrics": ["yield"],
92
- "previous_results": [
93
- {"batch": 0, "catalyst": "Pd(OAc)2", "solvent": "THF", "base": "K2CO3", "yield": 42.0},
94
- {"batch": 0, "catalyst": "Pd(PPh3)4", "solvent": "Dioxane", "base": "NaOEt", "yield": 55.0},
95
- {"batch": 0, "catalyst": "Pd2(dba)3", "solvent": "Toluene", "base": "DBU", "yield": 63.0}
96
- ],
97
- "batch_size": 2,
98
- "accuracy": "tiny",
99
- "surrogate_model": "RF",
100
- "acq_func": "UCB",
101
- "device": "cpu",
102
- "random_seed": 42
103
- }
104
- ```
105
-
106
- ### 数值条件必须先离散化
107
-
108
- SynBO 的 `condition_dict` 只接受显式列表,不接受连续范围对象。对于“温度
109
- 40–100°C、催化剂用量 0.5–2.0%”并已有 60/70/80/90°C 与
110
- 0.5/1.0/1.5/2.0% 历史值的任务,使用:
111
-
112
- ```json
113
- {
114
- "condition_dict": {
115
- "solvent": ["ethanol", "acetonitrile", "DMSO"],
116
- "temperature_C": ["40", "60", "70", "80", "90", "100"],
117
- "catalyst_loading_pct": ["0.5", "1.0", "1.5", "2.0"]
118
- },
119
- "opt_metrics": ["yield"],
120
- "previous_results": [
121
- {
122
- "batch": 0,
123
- "solvent": "ethanol",
124
- "temperature_C": "60",
125
- "catalyst_loading_pct": "1.0",
126
- "yield": 55.0
127
- }
128
- ],
129
- "batch_size": 3,
130
- "accuracy": "tiny",
131
- "surrogate_model": "RF",
132
- "acq_func": "UCB",
133
- "device": "cpu",
134
- "random_seed": 42
135
- }
136
- ```
137
-
138
- 约束:
139
-
140
- - 每个条件值统一为字符串,objective metric 保持数值。
141
- - 每条 `previous_results` 中的条件值必须出现在对应 `condition_dict` 列表中。
142
- - 连续范围的离散网格必须包含用户上下界和全部历史观测值;最终答案必须说明实际网格。
143
- - 将条件值显式序列化为字符串,并确保每条历史记录只使用 `condition_dict` 中列出的值。
144
- 如需小数据 CPU 设置,显式传递 `accuracy:"tiny"`、`surrogate_model:"RF"`、
145
- `acq_func:"UCB"` 和 `device:"cpu"`;不得假定客户端会补充默认值。
146
-
147
- Useful optional fields:
148
-
149
- - `accuracy`: `tiny`, `low`, `medium`, `high`, or `ultra`.
150
- - `acq_func`: `EHVI`, `UCB`, `ParEGO`, or `NEI`.
151
- - `surrogate_model`: `GP`, `RF`, `BNN`, or `BayesianLinear`.
152
- - `device`: `cpu`, `auto`, `cuda`, or `cuda:0`.
153
- - `cuda_visible_devices`: request-level CUDA visibility hint. Use only when the
154
- user explicitly asks for it and `/health` indicates a CUDA-capable runtime.
155
- - `constraints`: map condition type to prohibited values.
156
-
157
- ## Descriptors
158
-
159
- If omitted, SynBO uses generated OneHot descriptors. To provide descriptors:
160
-
161
- ```json
162
- {
163
- "descriptors": {
164
- "solvent": [
165
- {"name": "THF", "polarity": 0.207, "boiling_point_C": 66.0},
166
- {"name": "Toluene", "polarity": 0.099, "boiling_point_C": 110.6}
167
- ]
168
- },
169
- "descriptor_index_col": "name"
170
- }
171
- ```
172
-
173
- `descriptors` must contain exactly the same keys as `condition_dict`. Descriptor
174
- rows must include the configured index column and numeric descriptor columns.
175
-
176
- ## Error Handling
177
-
178
- Gateway errors have the standard envelope:
179
-
180
- ```json
181
- {
182
- "code": 1,
183
- "message": "SynBO service returned HTTP 400",
184
- "data": {
185
- "endpoint": "/synbo/optimize",
186
- "synbo_response": {
187
- "detail": "previous_results is missing metric columns: ['yield']"
188
- }
189
- }
190
- }
191
- ```
192
-
193
- 常见原因包括条件空间过大、条件值重复、历史条件值不在 condition_dict 中、
194
- descriptor 非数值、历史行缺列、metric 非数值,以及无 GPU 时请求 CUDA。
195
-
196
- 服务端有独立于客户端的单次请求时限。GP、EHVI、高 accuracy 或共享资源繁忙可能导致
197
- timeout。普通用户任务中不得自动换参数重试;应报告“未产生推荐”,保留本次错误,
198
- 由用户决定是否另起一次明确的回归测试。
1
+ # SynBO operation 参考
2
+
3
+ 所有在线调用都通过 `delta-cli science invoke`,服务地址来自 CLI 的标准
4
+ `science_base_url` 配置。这里的路径只说明业务 operation,不得据此直连 HTTP。
5
+
6
+ 用户说“优化反应条件”“推荐下一批实验”“偶联反应怎么继续做”,或给出溶剂、温度、
7
+ 催化剂、碱、配体和历史得率时,即使没有提到 SynBO、BO、CLI 或字段名也使用本节。
8
+ 每个用户任务最多一次 SynBO 业务调用;成功后立即结束,validation、502、504、
9
+ timeout、断连或空 recommendations 均不得换参数、换模型或重试。
10
+
11
+ ## Health
12
+
13
+ operation:`health`,无 body。
14
+
15
+ Reports SynBO import status, Torch/CUDA runtime availability, service limits,
16
+ default device, and visible CUDA devices.
17
+
18
+ Important fields inside gateway `data`:
19
+
20
+ ```json
21
+ {
22
+ "status": "ok",
23
+ "synbo_available": true,
24
+ "metadata": {
25
+ "service": "synbo-service",
26
+ "engine": "synbo",
27
+ "version": "0.1.0",
28
+ "synbo_version": "0.1.0",
29
+ "default_device": "cpu",
30
+ "cuda_visible_devices": ""
31
+ },
32
+ "limits": {
33
+ "max_batch_size": 128,
34
+ "max_reaction_space_size": 200000,
35
+ "max_previous_rows": 10000
36
+ },
37
+ "runtime": {
38
+ "torch_available": true,
39
+ "cuda_available": false,
40
+ "cuda_device_count": 0,
41
+ "cuda_device_names": []
42
+ },
43
+ "warnings": []
44
+ }
45
+ ```
46
+
47
+ ## Initialize
48
+
49
+ operation:`initialize`。
50
+
51
+ Use for initial condition sampling when no measured previous results exist.
52
+
53
+ Request body:
54
+
55
+ ```json
56
+ {
57
+ "condition_dict": {
58
+ "catalyst": ["Pd(OAc)2", "Pd(PPh3)4", "Pd2(dba)3"],
59
+ "solvent": ["THF", "Dioxane", "Toluene"],
60
+ "base": ["K2CO3", "NaOEt", "DBU"]
61
+ },
62
+ "opt_metrics": ["yield"],
63
+ "opt_metric_settings": [
64
+ {"opt_direct": "max", "opt_range": [0, 100], "metric_weight": 1.0}
65
+ ],
66
+ "batch_size": 3,
67
+ "sampling_method": "random",
68
+ "desc_normalize": "minmax",
69
+ "random_seed": 42
70
+ }
71
+ ```
72
+
73
+ Supported `sampling_method` values: `sobol`, `random`, `lhs`, `kmeans`.
74
+
75
+ ## Optimize
76
+
77
+ operation:`optimize`。
78
+
79
+ Use after measured experiment rows are available. Each previous row must contain
80
+ all condition columns and all objective metric columns.
81
+
82
+ Request body:
83
+
84
+ ```json
85
+ {
86
+ "condition_dict": {
87
+ "catalyst": ["Pd(OAc)2", "Pd(PPh3)4", "Pd2(dba)3"],
88
+ "solvent": ["THF", "Dioxane", "Toluene"],
89
+ "base": ["K2CO3", "NaOEt", "DBU"]
90
+ },
91
+ "opt_metrics": ["yield"],
92
+ "previous_results": [
93
+ {"batch": 0, "catalyst": "Pd(OAc)2", "solvent": "THF", "base": "K2CO3", "yield": 42.0},
94
+ {"batch": 0, "catalyst": "Pd(PPh3)4", "solvent": "Dioxane", "base": "NaOEt", "yield": 55.0},
95
+ {"batch": 0, "catalyst": "Pd2(dba)3", "solvent": "Toluene", "base": "DBU", "yield": 63.0}
96
+ ],
97
+ "batch_size": 2,
98
+ "accuracy": "tiny",
99
+ "surrogate_model": "RF",
100
+ "acq_func": "UCB",
101
+ "device": "cpu",
102
+ "random_seed": 42
103
+ }
104
+ ```
105
+
106
+ ### 数值条件必须先离散化
107
+
108
+ SynBO 的 `condition_dict` 只接受显式列表,不接受连续范围对象。对于“温度
109
+ 40–100°C、催化剂用量 0.5–2.0%”并已有 60/70/80/90°C 与
110
+ 0.5/1.0/1.5/2.0% 历史值的任务,使用:
111
+
112
+ ```json
113
+ {
114
+ "condition_dict": {
115
+ "solvent": ["ethanol", "acetonitrile", "DMSO"],
116
+ "temperature_C": ["40", "60", "70", "80", "90", "100"],
117
+ "catalyst_loading_pct": ["0.5", "1.0", "1.5", "2.0"]
118
+ },
119
+ "opt_metrics": ["yield"],
120
+ "previous_results": [
121
+ {
122
+ "batch": 0,
123
+ "solvent": "ethanol",
124
+ "temperature_C": "60",
125
+ "catalyst_loading_pct": "1.0",
126
+ "yield": 55.0
127
+ }
128
+ ],
129
+ "batch_size": 3,
130
+ "accuracy": "tiny",
131
+ "surrogate_model": "RF",
132
+ "acq_func": "UCB",
133
+ "device": "cpu",
134
+ "random_seed": 42
135
+ }
136
+ ```
137
+
138
+ 约束:
139
+
140
+ - 每个条件值统一为字符串,objective metric 保持数值。
141
+ - 每条 `previous_results` 中的条件值必须出现在对应 `condition_dict` 列表中。
142
+ - 连续范围的离散网格必须包含用户上下界和全部历史观测值;最终答案必须说明实际网格。
143
+ - 将条件值显式序列化为字符串,并确保每条历史记录只使用 `condition_dict` 中列出的值。
144
+ 如需小数据 CPU 设置,显式传递 `accuracy:"tiny"`、`surrogate_model:"RF"`、
145
+ `acq_func:"UCB"` 和 `device:"cpu"`;不得假定客户端会补充默认值。
146
+
147
+ Useful optional fields:
148
+
149
+ - `accuracy`: `tiny`, `low`, `medium`, `high`, or `ultra`.
150
+ - `acq_func`: `EHVI`, `UCB`, `ParEGO`, or `NEI`.
151
+ - `surrogate_model`: `GP`, `RF`, `BNN`, or `BayesianLinear`.
152
+ - `device`: `cpu`, `auto`, `cuda`, or `cuda:0`.
153
+ - `cuda_visible_devices`: request-level CUDA visibility hint. Use only when the
154
+ user explicitly asks for it and `/health` indicates a CUDA-capable runtime.
155
+ - `constraints`: map condition type to prohibited values.
156
+
157
+ ## Descriptors
158
+
159
+ If omitted, SynBO uses generated OneHot descriptors. To provide descriptors:
160
+
161
+ ```json
162
+ {
163
+ "descriptors": {
164
+ "solvent": [
165
+ {"name": "THF", "polarity": 0.207, "boiling_point_C": 66.0},
166
+ {"name": "Toluene", "polarity": 0.099, "boiling_point_C": 110.6}
167
+ ]
168
+ },
169
+ "descriptor_index_col": "name"
170
+ }
171
+ ```
172
+
173
+ `descriptors` must contain exactly the same keys as `condition_dict`. Descriptor
174
+ rows must include the configured index column and numeric descriptor columns.
175
+
176
+ ## Error Handling
177
+
178
+ Gateway errors have the standard envelope:
179
+
180
+ ```json
181
+ {
182
+ "code": 1,
183
+ "message": "SynBO service returned HTTP 400",
184
+ "data": {
185
+ "endpoint": "/synbo/optimize",
186
+ "synbo_response": {
187
+ "detail": "previous_results is missing metric columns: ['yield']"
188
+ }
189
+ }
190
+ }
191
+ ```
192
+
193
+ 常见原因包括条件空间过大、条件值重复、历史条件值不在 condition_dict 中、
194
+ descriptor 非数值、历史行缺列、metric 非数值,以及无 GPU 时请求 CUDA。
195
+
196
+ 服务端有独立于客户端的单次请求时限。GP、EHVI、高 accuracy 或共享资源繁忙可能导致
197
+ timeout。普通用户任务中不得自动换参数重试;应报告“未产生推荐”,保留本次错误,
198
+ 由用户决定是否另起一次明确的回归测试。
@@ -1,61 +1,61 @@
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
- ## 多分子比较
18
-
19
- 1. 用 PubChem 批量解析全部名称,请求体只包含 `identifiers` 和 `namespace:"name"`。省略 `properties`。
20
- 2. 从业务响应的 `results[*]` 读取记录,并从每条记录的嵌套 `properties` 读取字段。
21
- 3. 未解析成功的记录要排除,并明确说明原因。
22
- 4. 使用 RDKit `similarity-matrix` 校验和排序两两相似度。它的 `sanitize` 已经校验输入,不要额外调用 parse。
23
- 5. 用 PubChem 记录的原始 `input` 作为 molecule id,并按文档顺序从嵌套属性中提取 SMILES。
24
- 6. 保持输入顺序,报告每个分数时明确对应的分子对。
25
- 7. 除非用户明确要求,不要渲染、保存用户文件、检查健康状态或探测额外描述符。
26
- 8. `ranked_pairs` 使用命名字段 `a`、`b`、`similarity`。找指定目标的最近邻时,
27
- 在包含该目标的记录中取最大 `similarity`,另一侧字段就是最近邻;不要使用
28
- `i`、`j`、`score` 或猜测矩阵下标。
29
-
30
- ## 材料工作流
31
-
32
- 1. 使用 pymatgen 校验化学式/结构并转换 CIF;无机式量只能取当前业务响应 `weight`。
33
- 2. GSAS-II 只能接收真实 CIF 文本后再做衍射计算。
34
- 3. LAMMPS 只能在已有明确的力场、data 和脚本设置后运行;部署检查可以使用内置有界示例。
35
- 4. 从 LAMMPS 返回 pymatgen 或 GSAS-II 前,需要从弛豫结果重新构造 CIF/POSCAR。不要直接传递 LAMMPS data/dump 文件。
36
-
37
- ## 优化工作流
38
-
39
- - 通用数值或分类实验变量:Delta-BO
40
- - 固定 SMILES 候选池或 PDF2Dock/Vina+NN 轨迹:LDM-BO
41
- - 固定 KRAS G12D 的生成式小分子闭环:STRBO
42
- - 指定抗原的 11-aa CDRH3 闭环:AntBO
43
- - 偶联反应、反应条件和带真实历史得率的下一批实验推荐:SynBO
44
-
45
- 用户以 “LDM/大发现模型” 描述任务时,必须先按 `SKILL.md` 读取 `ldm.md`,再读取唯一
46
- 选定后端的 reference。LDM 是工作流意图,不是 tool;禁止旧
47
- `large-discovery-model`、`run_ldm_loop.py`、gateway backend 和直接 HTTP。
48
-
49
- 禁止为了让优化器运行而编造观测数据。用户没有提供测量结果时,只能使用初始化或随机建议模式,并明确说明它是待实验验证的建议,不是已经验证的最优条件。
50
- SynBO/Delta-BO 没有返回 recommendations 时,不得用本地回归、GP、UCB 或人工排序替代。
51
-
52
- SynBO 只接受离散条件列表。用户给连续范围时,在一次调用前完成以下处理:
53
-
54
- 1. 条件网格包含用户上下界、全部历史观测值和少量合理中间点。
55
- 2. 同一条件列在 `condition_dict` 与 `previous_results` 中统一为字符串。
56
- 3. 得率等 objective metric 保持数值。
57
- 4. 小数据 CPU 默认 `tiny + RF + UCB`,并在最终答案中报告实际离散网格。
58
- 5. CLI 返回失败或业务响应为空 recommendations 时结束;不得连续尝试多种 payload 或模型。
59
-
60
- 用户未要求文件时只返回 recommendations 文本,不创建输入 CSV。必须交接时,仅把本次
61
- 成功业务响应写入当前 `WORKSPACE_ROOT/synbo_result.json`。
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
+ ## 多分子比较
18
+
19
+ 1. 用 PubChem 批量解析全部名称,请求体只包含 `identifiers` 和 `namespace:"name"`。省略 `properties`。
20
+ 2. 从业务响应的 `results[*]` 读取记录,并从每条记录的嵌套 `properties` 读取字段。
21
+ 3. 未解析成功的记录要排除,并明确说明原因。
22
+ 4. 使用 RDKit `similarity-matrix` 校验和排序两两相似度。它的 `sanitize` 已经校验输入,不要额外调用 parse。
23
+ 5. 用 PubChem 记录的原始 `input` 作为 molecule id,并按文档顺序从嵌套属性中提取 SMILES。
24
+ 6. 保持输入顺序,报告每个分数时明确对应的分子对。
25
+ 7. 除非用户明确要求,不要渲染、保存用户文件、检查健康状态或探测额外描述符。
26
+ 8. `ranked_pairs` 使用命名字段 `a`、`b`、`similarity`。找指定目标的最近邻时,
27
+ 在包含该目标的记录中取最大 `similarity`,另一侧字段就是最近邻;不要使用
28
+ `i`、`j`、`score` 或猜测矩阵下标。
29
+
30
+ ## 材料工作流
31
+
32
+ 1. 使用 pymatgen 校验化学式/结构并转换 CIF;无机式量只能取当前业务响应 `weight`。
33
+ 2. GSAS-II 只能接收真实 CIF 文本后再做衍射计算。
34
+ 3. LAMMPS 只能在已有明确的力场、data 和脚本设置后运行;部署检查可以使用内置有界示例。
35
+ 4. 从 LAMMPS 返回 pymatgen 或 GSAS-II 前,需要从弛豫结果重新构造 CIF/POSCAR。不要直接传递 LAMMPS data/dump 文件。
36
+
37
+ ## 优化工作流
38
+
39
+ - 通用数值或分类实验变量:Delta-BO
40
+ - 固定 SMILES 候选池或 PDF2Dock/Vina+NN 轨迹:LDM-BO
41
+ - 固定 KRAS G12D 的生成式小分子闭环:STRBO
42
+ - 指定抗原的 11-aa CDRH3 闭环:AntBO
43
+ - 偶联反应、反应条件和带真实历史得率的下一批实验推荐:SynBO
44
+
45
+ 用户以 “LDM/大发现模型” 描述任务时,必须先按 `SKILL.md` 读取 `ldm.md`,再读取唯一
46
+ 选定后端的 reference。LDM 是工作流意图,不是 tool;禁止旧
47
+ `large-discovery-model`、`run_ldm_loop.py`、gateway backend 和直接 HTTP。
48
+
49
+ 禁止为了让优化器运行而编造观测数据。用户没有提供测量结果时,只能使用初始化或随机建议模式,并明确说明它是待实验验证的建议,不是已经验证的最优条件。
50
+ SynBO/Delta-BO 没有返回 recommendations 时,不得用本地回归、GP、UCB 或人工排序替代。
51
+
52
+ SynBO 只接受离散条件列表。用户给连续范围时,在一次调用前完成以下处理:
53
+
54
+ 1. 条件网格包含用户上下界、全部历史观测值和少量合理中间点。
55
+ 2. 同一条件列在 `condition_dict` 与 `previous_results` 中统一为字符串。
56
+ 3. 得率等 objective metric 保持数值。
57
+ 4. 小数据 CPU 默认 `tiny + RF + UCB`,并在最终答案中报告实际离散网格。
58
+ 5. CLI 返回失败或业务响应为空 recommendations 时结束;不得连续尝试多种 payload 或模型。
59
+
60
+ 用户未要求文件时只返回 recommendations 文本,不创建输入 CSV。必须交接时,仅把本次
61
+ 成功业务响应写入当前 `WORKSPACE_ROOT/synbo_result.json`。