@delta-infra/cli 1.0.78 → 1.0.80

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 (52) hide show
  1. package/README.md +17 -27
  2. package/checksums.txt +5 -5
  3. package/package.json +2 -13
  4. package/scripts/install-wizard.js +14 -5
  5. package/scripts/install.js +7 -0
  6. package/skills/delta-science/SKILL.md +128 -149
  7. package/skills/delta-science/agents/openai.yaml +3 -3
  8. package/skills/{antbo-service/references/operations.md → delta-science/references/antbo.md} +59 -4
  9. package/skills/delta-science/references/cli-contract.md +18 -19
  10. package/skills/delta-science/references/delta-bo.md +90 -0
  11. package/skills/{gsasii/references/endpoints.md → delta-science/references/gsasii.md} +13 -27
  12. package/skills/{lammps/references/endpoints.md → delta-science/references/lammps.md} +13 -8
  13. package/skills/{ldm-bo/references/endpoints.md → delta-science/references/ldm-bo.md} +12 -9
  14. package/skills/delta-science/references/ldm.md +72 -0
  15. package/skills/{pubchem/references/endpoints.md → delta-science/references/pubchem.md} +15 -10
  16. package/skills/{pymatgen/references/endpoints.md → delta-science/references/pymatgen.md} +9 -9
  17. package/skills/{rdkit/references/endpoints.md → delta-science/references/rdkit.md} +20 -14
  18. package/skills/delta-science/references/routing-index.md +36 -0
  19. package/skills/delta-science/references/strbo.md +87 -0
  20. package/skills/{synbo-service/references/endpoints.md → delta-science/references/synbo.md} +57 -17
  21. package/skills/delta-science/references/workflows.md +24 -7
  22. package/skills/delta-science/scripts/catalog.py +92 -0
  23. package/skills/delta-science/scripts/invoke.py +162 -79
  24. package/skills/manifest.json +3 -1
  25. package/skills/antbo-ldm-guard/SKILL.md +0 -58
  26. package/skills/antbo-ldm-guard/agents/openai.yaml +0 -4
  27. package/skills/antbo-service/SKILL.md +0 -79
  28. package/skills/antbo-service/agents/openai.yaml +0 -4
  29. package/skills/delta-bo/SKILL.md +0 -36
  30. package/skills/delta-bo/agents/openai.yaml +0 -4
  31. package/skills/delta-bo/references/endpoints.md +0 -263
  32. package/skills/delta-science/references/generated-catalog.md +0 -48
  33. package/skills/delta-science/references/operation-contracts.md +0 -137
  34. package/skills/delta-science/references/services.md +0 -112
  35. package/skills/delta-science/scripts/generated_catalog.py +0 -69
  36. package/skills/gsasii/SKILL.md +0 -42
  37. package/skills/gsasii/agents/openai.yaml +0 -4
  38. package/skills/lammps/SKILL.md +0 -39
  39. package/skills/lammps/agents/openai.yaml +0 -4
  40. package/skills/ldm-bo/SKILL.md +0 -35
  41. package/skills/ldm-bo/agents/openai.yaml +0 -4
  42. package/skills/pubchem/SKILL.md +0 -93
  43. package/skills/pubchem/agents/openai.yaml +0 -4
  44. package/skills/pubchem/references/operations.md +0 -41
  45. package/skills/pymatgen/SKILL.md +0 -54
  46. package/skills/pymatgen/agents/openai.yaml +0 -4
  47. package/skills/rdkit/SKILL.md +0 -112
  48. package/skills/rdkit/agents/openai.yaml +0 -4
  49. package/skills/rdkit/references/operations.md +0 -64
  50. package/skills/science-tools.json +0 -127
  51. package/skills/synbo-service/SKILL.md +0 -36
  52. package/skills/synbo-service/agents/openai.yaml +0 -4
package/README.md CHANGED
@@ -251,10 +251,9 @@ delta-cli sandbox kill <sandbox_id>
251
251
  | `delta-cli science invoke --tool <tool_name> --endpoint <endpoint_name> [--data '{"key":"value"}'] [--params '{"key":"value"}']` | 调用工具端点 |
252
252
  | `delta-cli science endpoints list <tool_name>` | 列出指定工具的所有端点 |
253
253
 
254
- CLI 和内置 Science Skills 统一使用简洁 operation,例如 `health`、`composition-parse`、
255
- `similarity-matrix` 和 `optimize`。连接默认 `/science_tool` 旧服务时,CLI 会自动映射成
256
- `chem_pymatgen_health` 等旧 catalog 名称;连接新版 Science Server 时则自动适配其规范
257
- operation。`science endpoints list` 优先展示简洁名称,并在 `catalog_name` 中保留服务端原名。
254
+ `tools.name` 和 `tool_endpoints.name` 是 Science 工具调用的唯一权威名称。
255
+ `science list` 与 `science endpoints list` 原样展示服务端数据库中的启用项,
256
+ `science invoke` 原样传递 `--tool` 和 `--endpoint`,不执行别名映射或旧名称兼容。
258
257
 
259
258
  ## 输出格式
260
259
 
@@ -288,37 +287,28 @@ delta-cli 内置 AI Agent 操作手册(Skills),帮助 Claude Code 等 AI
288
287
  # 安装仓库中的全部 Skills
289
288
  npx skills add delta-infra/delta-infra-cli -y -g
290
289
 
291
- # 也可以只安装某个具名服务 Skill,例如 PubChem
292
- npx skills add delta-infra/delta-infra-cli -s pubchem
290
+ # 只安装统一 Science Skill
291
+ npx skills add delta-infra/delta-infra-cli -s delta-science
293
292
  ```
294
293
 
295
294
  Skill 文件位于 `skills/` 目录:
296
295
  - `delta-shared/` — 全局通用规则(认证、配置、错误处理)
297
296
  - `delta-sandbox/` — Sandbox 操作指南(生命周期、命令路由)
298
- - `delta-science/` — 具名 Science Skill 共用的编排参考与 Delta CLI wrapper
299
- - `pubchem/`、`rdkit/`、`pymatgen/` — 化合物与材料基础计算
300
- - `gsasii/`、`lammps/` — 衍射和分子动力学
301
- - `delta-bo/`、`ldm-bo/`、`synbo-service/` — 科学优化流程
302
- - `antbo-service/`、`antbo-ldm-guard/` — AntBO 作业与未暴露 LDM 请求保护
297
+ - `delta-science/` — 唯一 Science 入口,包含统一 Delta CLI wrapper、跨工具工作流和
298
+ PubChem、RDKit、pymatgen、GSAS-II、LAMMPS、Delta-BO、LDM-BO、SynBO、AntBO
299
+ 的按需 reference
303
300
 
304
- 一键安装、升级和卸载会同步上述完整集合。Memento 等宿主在规划阶段直接选择具名
305
- 服务 Skill;`delta-science` 只提供共享调用契约和跨步骤数据交接规则,不直接承接
306
- 普通用户步骤。Science Skill 仅暴露 `read_file`、`python_repl` 和 `step_finish` 等
307
- 完成任务所需的最小工具集合。
301
+ Memento 等宿主只需要选择 `delta-science`。Skill 根据自然语言科研目标选择 tool 和
302
+ operation,并且只加载当前工具对应的 reference,避免大量独立 Skill 给规划器增加
303
+ 负担。升级时会自动移除旧版独立 Science Skill。
308
304
 
309
305
  ### 添加 Science tool 或 operation
310
306
 
311
- `skills/science-tools.json` 是规范 tool、operation、legacy endpoint、Skill 清单和 npm
312
- 打包目录的唯一配置源。修改后运行:
313
-
314
- ```bash
315
- node scripts/generate-science-catalog.js
316
- node scripts/generate-science-catalog.js --check
317
- ```
318
-
319
- 生成器会同步 Go catalog、Python wrapper 映射、`skills/manifest.json`、npm `files`
320
- 清单及 catalog 参考文档。给现有服务增加 operation 时不需要创建新 Skill;只有新增
321
- 具有独立用户意图和参数契约的服务时,才新增一个服务级 Skill 目录。
307
+ 工具目录由 Science Server 数据库维护。新增工具时配置 `tools` 记录及对应的
308
+ `tool_endpoints` 记录;停用时设置 `status=false`。CLI 无需同步任何静态表或重新增加
309
+ 命令。若需要让 AI 根据自然语言自动选择新工具并安全组装请求,再更新
310
+ `skills/delta-science/references/<tool>.md` 和路由文档;数据库中的 name 与 reference
311
+ 必须完全一致。
322
312
 
323
313
  ## 开发
324
314
 
@@ -404,7 +394,7 @@ make release
404
394
  ```bash
405
395
  export GH_TOKEN=<your-github-pat>
406
396
  export NPM_TOKEN=<your-npm-token>
407
- ./release.sh v1.0.78
397
+ ./release.sh v1.0.80
408
398
  ```
409
399
 
410
400
  脚本执行步骤:
package/checksums.txt CHANGED
@@ -1,5 +1,5 @@
1
- 2c3ed809d7d30b5ede7e3528390a9dc3690f915ca23bfdd050886a1bf61cdeff delta-cli-darwin-amd64.tar.gz
2
- 19ba8dcd62b6f472f704da8d5f9d2ee1396abaa54748803027b9cc3e2d3b5312 delta-cli-darwin-arm64.tar.gz
3
- b49048666e65566e2612347d73f304129b99f75183374e00b5d93b8d1bab70a0 delta-cli-linux-amd64.tar.gz
4
- 77a2d6449dbd54b8bebce28909e8d9e77fed027a44c2889f3e470a3f2e7d95dc delta-cli-linux-arm64.tar.gz
5
- a35ec9ddf367b32042b20f25efe66d62c4916811976986e1ccf32f6f6c89e042 delta-cli-windows-amd64.zip
1
+ ad082d849a2c898743b4d99475d3f62050da4a05bdfd6520655c4c28cb82be67 delta-cli-darwin-amd64.tar.gz
2
+ 865ccbd0de1f9be7469e42d787782fc2f974252df28eb5b84bac52b9ba2bec0b delta-cli-darwin-arm64.tar.gz
3
+ a39e316c3c1e2a288d653dac86e21bd31c39a4ebcdd7153314a2681e288885db delta-cli-linux-amd64.tar.gz
4
+ 12a88ad3d66a6a10e1ca7ecb2e505d5641cad9b30b6a5ce08d7c1a6ec6876d0d delta-cli-linux-arm64.tar.gz
5
+ 25d765b44c267e5bb89707b64afb330a37a8a5db3489af28a17b843bec51ada4 delta-cli-windows-amd64.zip
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delta-infra/cli",
3
- "version": "1.0.78",
3
+ "version": "1.0.80",
4
4
  "description": "Delta Infra CLI for sandbox compute and science tools.",
5
5
  "bin": {
6
6
  "delta-cli": "scripts/run.js"
@@ -14,20 +14,9 @@
14
14
  "scripts/install-wizard.js",
15
15
  "scripts/run.js",
16
16
  "skills/manifest.json",
17
- "skills/science-tools.json",
18
17
  "skills/delta-sandbox/",
19
18
  "skills/delta-shared/",
20
- "skills/delta-science/",
21
- "skills/pubchem/",
22
- "skills/rdkit/",
23
- "skills/pymatgen/",
24
- "skills/gsasii/",
25
- "skills/lammps/",
26
- "skills/delta-bo/",
27
- "skills/ldm-bo/",
28
- "skills/synbo-service/",
29
- "skills/antbo-service/",
30
- "skills/antbo-ldm-guard/"
19
+ "skills/delta-science/"
31
20
  ],
32
21
  "os": [
33
22
  "darwin",
@@ -42,7 +42,9 @@ const PLATFORM_LABELS = {
42
42
  },
43
43
  };
44
44
 
45
- const { skills: SKILL_NAMES } = require("../skills/manifest.json");
45
+ const skillManifest = require("../skills/manifest.json");
46
+ const SKILL_NAMES = skillManifest.skills;
47
+ const RETIRED_SKILL_NAMES = skillManifest.retired_skills || [];
46
48
  const LANG = "zh";
47
49
 
48
50
  function platformSkillDir(platform) {
@@ -346,6 +348,9 @@ function installSkillsFromLocalPackage(platforms) {
346
348
  for (const platform of platforms) {
347
349
  const targetDir = platformSkillDir(platform);
348
350
  fs.mkdirSync(targetDir, { recursive: true });
351
+ for (const skill of RETIRED_SKILL_NAMES) {
352
+ try { fs.rmSync(path.join(targetDir, skill), { recursive: true, force: true }); } catch {}
353
+ }
349
354
  for (const skill of SKILL_NAMES) {
350
355
  const src = path.join(pkgSkillsDir, skill);
351
356
  if (!fs.existsSync(src)) continue;
@@ -505,7 +510,7 @@ async function stepUninstallSkills(msg) {
505
510
  let removedLocally = false;
506
511
  for (const platform of Object.keys(PLATFORM_PATHS)) {
507
512
  const dir = platformSkillDir(platform);
508
- for (const skill of SKILL_NAMES) {
513
+ for (const skill of [...SKILL_NAMES, ...RETIRED_SKILL_NAMES]) {
509
514
  try {
510
515
  fs.rmSync(path.join(dir, skill), { recursive: true, force: true });
511
516
  removedLocally = true;
@@ -519,13 +524,17 @@ async function stepUninstallSkills(msg) {
519
524
  }
520
525
 
521
526
  try {
522
- await runSilentAsync("npx", ["-y", "skills", "remove", ...SKILL_NAMES, "-g"], {
527
+ await runSilentAsync(
528
+ "npx",
529
+ ["-y", "skills", "remove", ...SKILL_NAMES, ...RETIRED_SKILL_NAMES, "-g"],
530
+ {
523
531
  timeout: 60000,
524
- });
532
+ },
533
+ );
525
534
  s.stop("AI skills removed");
526
535
  } catch {
527
536
  s.stop("Warning: skill removal failed. You can retry:");
528
- p.log.info(` npx skills remove ${SKILL_NAMES.join(" ")} -g`);
537
+ p.log.info(` npx skills remove ${[...SKILL_NAMES, ...RETIRED_SKILL_NAMES].join(" ")} -g`);
529
538
  }
530
539
  }
531
540
 
@@ -362,6 +362,7 @@ function install() {
362
362
  }
363
363
  }
364
364
  fs.chmodSync(dest, 0o755);
365
+ ensureExecutable(path.join(__dirname, "run.js"));
365
366
  console.error("Installed to " + dest);
366
367
  } finally {
367
368
  fs.rmSync(tmpDir, { recursive: true, force: true });
@@ -369,6 +370,12 @@ function install() {
369
370
  });
370
371
  }
371
372
 
373
+ function ensureExecutable(filePath) {
374
+ try {
375
+ if (fs.existsSync(filePath)) fs.chmodSync(filePath, 0o755);
376
+ } catch {}
377
+ }
378
+
372
379
  // ── Entry ──────────────────────────────────────────────────────────────────
373
380
 
374
381
  if (require.main === module) {
@@ -1,135 +1,139 @@
1
1
  ---
2
2
  name: delta-science
3
- description: "Delta Science 的内部共享运行时与跨服务编排参考。不要把普通用户步骤直接路由到本 Skill;规划器必须按科学目标选择 pubchem、rdkit、pymatgen、gsasii、lammps、delta-bo、ldm-bo、synbo-service、antbo-service 或 antbo-ldm-guard,并把跨服务任务拆成具名 Skill 步骤。"
4
- metadata:
5
- allowed-tools:
6
- - read_file
7
- - python_repl
8
- - step_finish
3
+ description: "公司在线 Science 能力的统一入口,所有调用都经 Delta CLI。凡是查询具体化合物/CID/SMILES/分子性质、计算分子描述符或相似度、解析晶体/CIF/空间群、模拟或精修 XRD、执行 LAMMPS、根据实验数据做贝叶斯优化、反应条件优化,以及任何 LDM/大发现模型、KRAS G12D 小分子生成优化、固定候选池/PDF2Dock 轨迹或抗体 CDRH3 优化任务,都必须使用本 Skill;不得调用旧 large-discovery-model Skill、旧 gateway 脚本、网页搜索或本地科学库绕过 Delta CLI。普通查询、比较或校验默认直接返回文本,不要主动增加 JSON/CSV、报告、图片或图表步骤;只有用户明确要求保存、导出、绘图或生成文件时才创建产物。"
9
4
  ---
10
5
 
11
6
  # Delta Science
12
7
 
13
- 把普通的人类科学任务转换为一个或多个经过验证的 Delta CLI 调用。用户只需描述科学目标;本 Skill 负责选择工具和 operation、构造参数、执行、校验并简洁报告结果。
8
+ 把自然语言科研任务转换为最少数量、可验证的 Delta CLI Science 调用。只暴露本
9
+ Skill;工具选择、operation、参数、跨工具交接和结果校验都在本 Skill 内完成。
14
10
 
15
11
  ## 强制调用链
16
12
 
17
- - 每个在线 Science 操作都必须由所选的具名 service Skill 直接执行本 Skill 的
18
- `scripts/invoke.py`,最终通过 Delta CLI。禁止把 Science 步骤派发给
19
- `task[general-purpose]`、通用 subagent 或自由文本子任务。
20
- - 第一个且唯一的实时执行工具是 `python_repl`。禁止 Bash、`list_dir`、
21
- `read_file`、`which`、`where`、`ls` 和路径探测;禁止执行字面命令
22
- `CLI science invoke`、`CLI`、`cli` 或 `delta-cli`。
23
- - `python_repl` 的工具参数对象只能包含 `code`;禁止传入 `deps`、
24
- `dependencies`、`packages` 或任何其他参数。
25
- - `SKILLS_ROOT` 只在 Python 中通过 `os.environ["SKILLS_ROOT"]` 读取,不能把
26
- `@SKILLS_ROOT` 当作文件路径。
27
- - 禁止使用 `httpx`、`requests`、`curl`、PowerShell Web 命令或浏览器直接访问公司网关、PubChem 或业务服务。
28
- - CLI 调用失败时,禁止改用本地 RDKit、pymatgen 或直接 HTTP;如实报告 CLI 或服务端错误。
29
- - 每次调用都使用 `scripts/invoke.py`。它负责解析 CLI 路径、安全传递 JSON、校验响应信封并记录调用链证据。
30
- - 不要预先检查 wrapper 源码。在 Memento 中,必须在一个 `python_repl` 中用 `subprocess.run(..., shell=False)` 和 argv 列表执行。
31
- - 用户请求中不需要出现 CLI 语法、operation、URL 或 JSON 字段;根据本 Skill 和 references 自动推断。
32
-
33
- 固定执行形式如下:
13
+ - 所有在线 Science 操作必须走
14
+ `宿主 shell/Python -> delta-science/scripts/invoke.py -> delta-cli science invoke -> Science Server`。
15
+ - 用宿主可用的 shell 或 Python 定位当前 Skill 的 `SKILL.md` 所在目录,再以该目录下的
16
+ `scripts/invoke.py` 的绝对路径执行 wrapper。Claude Code 可使用
17
+ `CLAUDE_SKILL_DIR`;Codex 应以当前已加载 Skill 的目录为工作目录,或在已安装的 Skills
18
+ 目录中查找精确的 `delta-science/scripts/invoke.py`。不得依赖宿主私有环境变量。
19
+ - 禁止直接执行 `delta-cli`、`curl`、`requests`、`httpx`、浏览器和 PowerShell Web 命令;
20
+ 禁止直接访问公司网关或业务服务 URL。
21
+ - 禁止使用本地 RDKit、pymatgen、LAMMPS、BO、回归或 sandbox 冒充 Science 结果。
22
+ - 执行前读取对应 reference,并从中逐字选择 operation 和请求字段;禁止凭记忆创造字段或
23
+ 枚举值。不得读取或修改 wrapper 源码、runtime 或配置文件。
24
+ - `tools.name` 和 `tool_endpoints.name` 是唯一权威调用名称。传给 wrapper 的 tool 和
25
+ endpoint 必须与当前数据库目录完全一致;CLI 和 wrapper 都不做别名映射、前缀裁剪、
26
+ profile 判断或 `not_found` 后改名重试。reference 与目录不一致时终止并报告配置问题。
27
+ - 业务结果直接位于 `result["native"]`。禁止读取 `native.data` 或递归搜索结果。
28
+ - 只有子进程退出码为 0、`result["ok"] is True` 且
29
+ `result["transport"] == "delta-cli"` 时,才能报告业务成功。
30
+
31
+ 固定 Python 模板(将 `wrapper` 替换为已定位的绝对路径):
34
32
 
35
33
  ```python
36
- import json, os, subprocess, sys
37
- wrapper = os.path.join(os.environ["SKILLS_ROOT"], "delta-science", "scripts", "invoke.py")
38
- payload = {"identifier": "aspirin", "namespace": "name"}
39
- p = subprocess.run(
40
- [sys.executable, wrapper, "--tool", "pubchem", "--endpoint", "compound-summary",
41
- "--data-json", json.dumps(payload)],
42
- capture_output=True, text=True,
43
- )
44
- result = json.loads(p.stdout)
34
+ import json, subprocess, sys
35
+
36
+ wrapper = "/absolute/path/to/delta-science/scripts/invoke.py"
37
+
38
+ def invoke(tool, endpoint, data=None, params=None, timeout=150):
39
+ argv = [sys.executable, wrapper, "--tool", tool, "--endpoint", endpoint]
40
+ if data is not None:
41
+ argv += ["--data-json", json.dumps(data, ensure_ascii=False)]
42
+ if params is not None:
43
+ argv += ["--params-json", json.dumps(params, ensure_ascii=False)]
44
+ p = subprocess.run(
45
+ argv, capture_output=True, text=True, encoding="utf-8",
46
+ errors="replace", shell=False, timeout=timeout
47
+ )
48
+ if p.returncode != 0:
49
+ raise RuntimeError(p.stderr or p.stdout)
50
+ result = json.loads(p.stdout)
51
+ if result.get("ok") is not True or result.get("transport") != "delta-cli":
52
+ raise RuntimeError(result)
53
+ return result
45
54
  ```
46
55
 
47
- 每次调用只替换 tool、endpoint 和 payload。只有 references 明确说明是查询参数时才使用 `--params-json`,否则使用 `--data-json`。必须满足 `result["ok"] is True` 且 `result["transport"] == "delta-cli"`,之后业务结果直接使用 `result["native"]`;wrapper 已完成信封解包,禁止再读取 `result["native"]["data"]`。
48
-
49
- 传给 wrapper 的 tool 和 endpoint 始终使用 references 中的规范名称,例如
50
- `pymatgen/health`、`pymatgen/composition-parse`、`synbo/optimize`。不得自行改写为
51
- `chem_pymatgen_health` 等旧数据库名称;wrapper 会根据 `science_base_url` 自动选择
52
- canonical 或 legacy catalog,并在结果中返回 `resolved_tool`、`resolved_endpoint` 和
53
- `catalog_profile` 作为调用证据。
54
-
55
- 根据已加载的内容选择服务。执行任何 operation 前,读取
56
- [references/operation-contracts.md](references/operation-contracts.md) 中该 tool 的
57
- 对应行;这里只读取已知资源,不进行目录探测。每行给出人类情景、最小代码和 native
58
- 投影。更复杂字段才读取其他 reference。
59
-
60
- 一次成功调用并显式打印有界 JSON 后,立即调用
61
- `step_finish(status="done", summary=<以“【最终答案,必须逐字转发】”开头的有界纯文本>)`
62
- 恰好一次;纯文本中的值必须来自同一 JSON,不得加单位、链接、解释或改写字符串。
63
- Skill final_response 与外层 Memento 必须逐字复制该 summary,不能重新排版或补充。
64
- 失败时调用
65
- `step_finish(status="failed", summary=<原始错误短摘要>)`。`step_finish` 后禁止输出
66
- 自由文本或调用任何工具。具名 service Skill 成功返回后,外层代理必须直接使用其
67
- summary 完成当前计划步骤;如果存在 `output_ref`,最多对该精确路径做一次原子
68
- `read_file`。禁止 `python_repl`、`list_dir`、寻找 CLI 或重复 Science。
69
-
70
- ## 执行流程
71
-
72
- 1. 在内部重述科学目标;不要向用户追问本 Skill 已经定义的实现细节。
73
- 2. 选择能完成任务的最窄服务,并严格保持用户请求范围。推断 operation 或参数不代表可以增加用户没有要求的图片、文件、健康检查、描述符探测、分析或交付物。
74
- 3. 如果 Memento 仅为跨步骤传递已验证数据而要求文件,可以在完成在线调用的同一个 `python_repl` 中写一个有界的内部 JSON。不得为生成或检查交接文件而重复业务调用,也不要把内部交接文件描述成用户要求的产物。
75
- 交接文件必须位于当前 `WORKSPACE_ROOT`(即 `@ROOT`)内;忽略任何其他
76
- workspace、runner 文件或历史结果文件,绝不能用它们补全当前会话。
77
- 4. 已知标识符直接使用。普通分子名称先由 PubChem 解析,再把返回的 SMILES 交给 RDKit。
78
- 5. 构造最小合法参数。对于模糊探索任务使用有界默认值,并在最终答案中说明会显著影响科学结论的假设。
79
- 6. 通过 wrapper 调用,并保留 `transport` 与 native 结果。只有进程退出码和所有响应信封均成功时,才算调用成功。
80
- 7. 单个已命名化合物的基础查询只调用一次 PubChem `compound-summary`;成功后直接完成,不得重放。
81
- 8. 多个已命名化合物的性质与结构相似度比较,默认只做两个 Science 调用:
82
- - PubChem `compound-batch-summary`
83
- - RDKit `similarity-matrix`
84
-
85
- 不得额外调用 health、parse、descriptors、fingerprint、substructure 或 render,除非用户明确需要这些不同输出。
86
-
87
- PubChem 默认请求体必须严格为:
88
-
89
- ```json
90
- {"identifiers":["aspirin","caffeine"],"namespace":"name"}
91
- ```
92
-
93
- 不要添加 `properties`、`synonym_limit` 或 `CID`。默认响应已经包含基础字段,不支持的属性会导致响应校验失败。记录位于 `native["results"]`;用每条记录的 `input` 保留原始标签,并从嵌套的 `properties` 读取属性。
94
-
95
- 两个服务应在各自规定的单个 `python_repl` 中完成。不得打印原始 stdout、stderr、完整信封或完整 native 对象。RDKit 请求使用:
96
-
97
- ```json
98
- {
99
- "molecules": [{"id":"aspirin","smiles":"..."}],
100
- "fingerprint": {"type":"morgan","radius":2,"n_bits":2048},
101
- "sanitize": true
102
- }
103
- ```
104
-
105
- `similarity-matrix` 的 `native["ranked_pairs"]` 每项固定为
106
- `{"a": <输入 id>, "b": <输入 id>, "similarity": <数值>}`,不是矩阵下标。
107
- 禁止读取 `i`、`j` 或 `score`。找某个目标分子的最近邻时,只筛选 `a` 或
108
- `b` 等于该目标的记录,取最大 `similarity` 并返回另一侧 id。
109
-
110
- 9. 下游调用只能使用上一步已验证的 native 输出。禁止伪造 CIF、SMILES、粉末衍射数据、历史实验或优化观测。
111
- 对无机材料化学式、组成或式量,首选 pymatgen `composition-parse`;不要把
112
- PubChem 的 `not_found`/404 改写为 CID、名称或式量,也不要用本地元素周期表补算。
113
- 10. 跨服务比较时保留数据来源。例如 PubChem `XLogP` 与 RDKit `MolLogP` 使用不同模型,不得相互覆盖。
114
- 11. 大型或二进制产物只能从文档明确的 native 字段解码。PNG 必须验证文件头为 PNG magic bytes,不能把以 `{` 开头的 JSON 保存成图片。
115
- 12. 先报告科学结果,再列出使用的服务与 CLI 调用链证据。失败和被阻塞的后续步骤必须明确说明。
116
- 13. 当前调用的 `native` 响应是 Skill 和 Memento 最终答案的完整证据边界。禁止补充当前结果未返回的记忆知识、机制推测、临床结论、单位、引用或链接。若规划要求了服务不支持的字段,写明“当前 Science 工具未返回该字段”,然后停止补充。
117
-
118
- 14. 反应优化必须由 SynBO 或 Delta-BO 的当前 CLI `recommendations` 支持。若
119
- `optimize` 返回数组维度错误、超时、空 recommendations 或失败,写入有界错误
120
- 交接并报告“未产生推荐”;禁止改用本地 GP、UCB、响应面、随机采样或人工排序。
121
- 15. AntBO 启动属于远端变更。只有当前 native 同时返回 `started=true`、`pid` 与
122
- `log_name` 或 `log_path` 时,才能声称作业已启动;将这些字段写入
123
- `@ROOT/antbo_submission.json` 后由主代理读取。字段缺失时不得编造或重复提交。
124
- 16. LAMMPS 最终答复只读取本次 `@ROOT/lammps_result.json`。逐字保留
125
- `final_step`、`final_temperature`、`final_total_energy` 和 `last_thermo`;
126
- 禁止将总能量除以原子数、替换步数、换算单位或推测物理收敛性。
127
- 17. 如果请求的 operation 不在当前 CLI catalog 中,不调用工具、不探测路径、不直连
128
- HTTP,直接说明该 operation 尚未暴露且“未发送远端请求”。AntBO 当前支持
129
- `health/run-default-job/run/log/jobs/stop`;`ldm/suggest` 不可由 Skill 补齐,
130
- 也不得改用小分子 LDM-BO。
131
-
132
- 每次 Skill 回答结尾都保留以下中文交接信息:
56
+ 只调用完成目标所需的 operation。跨工具任务在同一个 Skill 执行中按依赖顺序调用,
57
+ 下游只能使用上一步已验证的 `native`。已知工具不要额外调用 health、schema、
58
+ catalog、render、descriptors 或文件操作,除非用户确实要求对应结果。
59
+
60
+ ## 选择工具
61
+
62
+ | 科研目标 | tool | 详细规则 |
63
+ | --- | --- | --- |
64
+ | 化合物身份、CID、同义词、公共属性、名称转 SMILES | `pubchem` | [pubchem.md](references/pubchem.md) |
65
+ | SMILES/InChI、描述符、指纹、相似度、渲染、子结构 | `rdkit` | [rdkit.md](references/rdkit.md) |
66
+ | 无机化学式、CIF/POSCAR、晶体结构、空间群 | `pymatgen` | [pymatgen.md](references/pymatgen.md) |
67
+ | 粉末衍射模拟、Rietveld 精修 | `gsasii` | [gsasii.md](references/gsasii.md) |
68
+ | 分子动力学、最小化、thermo 与输出文件 | `lammps` | [lammps.md](references/lammps.md) |
69
+ | 通用数值/整数/分类实验变量优化 | `delta-bo` | [delta-bo.md](references/delta-bo.md) |
70
+ | 固定候选池 next-SMILES、PDF2Dock、分子 BO 轨迹 | `ldm-bo` | [ldm-bo.md](references/ldm-bo.md) |
71
+ | KRAS G12D 小分子生成、vina/activity 多目标迭代 | `strbo` | [strbo.md](references/strbo.md) |
72
+ | 反应条件初始化、基于真实得率推荐下一批实验 | `synbo` | [synbo.md](references/synbo.md) |
73
+ | 抗体 CDRH3 生成/评估及 AntBO 作业管理 | `antbo` | [antbo.md](references/antbo.md) |
74
+
75
+ 用户使用 “LDM”“大发现模型”“小分子药 LDM” 或 “抗体 LDM” 表述完整科研流程时,
76
+ 先读取 [ldm.md](references/ldm.md),再只读取其中选定后端对应的一个 reference。
77
+ `ldm.md` 是编排规则,不是 tool,不得把 `ldm` 当作 `--tool` 参数。
78
+
79
+ 工具明确时直接读取所选 tool 的 reference,其中已经包含 operation、参数和最小场景;
80
+ 不要读取其他工具文档。只有任务在两个或多个工具之间存在歧义时,才先读
81
+ [routing-index.md](references/routing-index.md)。跨工具任务再读
82
+ [workflows.md](references/workflows.md)。
83
+
84
+ 本表是经过验证的科研路由,不是服务端工具清单。若用户明确点名本表之外的新工具,
85
+ 允许通过宿主 shell/Python 运行同目录的 `scripts/catalog.py --tools`,再使用目录返回
86
+ 的精确 tool name 运行一次 `catalog.py --endpoints <tool>`;两次读取都必须满足
87
+ `transport="delta-cli"`。不得用空 body、错误参数、health、help、源码、wrapper 或
88
+ 直接 HTTP 探测。实时 endpoint 元数据若没有足够的请求字段契约,应说明“目录已发现,
89
+ 但服务端未提供可安全构造请求的 schema”,不得猜 body、模糊匹配或转换名称。新增工具
90
+ 因此无需修改 CLI;只有需要自然语言自动选路或自动组装参数时,才补充对应 reference。
91
+
92
+ ## 路由边界
93
+
94
+ - 普通分子名称先用 PubChem;只有需要结构计算时才把成功返回的 SMILES 交给 RDKit。
95
+ - 无机化学式、组成和式量优先 pymatgen,不用 PubChem 或本地元素表补算。
96
+ - 通用实验变量使用 Delta-BO;已有固定 SMILES 候选池或 PDF2Dock 轨迹使用 LDM-BO;
97
+ 围绕服务端固定 KRAS G12D 生成并迭代小分子使用 STRBO;偶联反应、反应条件和历史
98
+ 得率使用 SynBO;抗体/CDRH3 使用 AntBO,不得混用。
99
+ - 在线 LDM、STRBO、AntBO 和 LDM-BO 任务不得转交旧 `large-discovery-model` Skill,
100
+ 不得运行其 gateway 脚本或内置服务地址。离线演示不属于公司 Science 结果;只有用户
101
+ 明确要求“不调用公司资源”时才能说明该边界,但本 Skill 仍不得运行旧 Skill。
102
+ - GSAS-II 精修必须有真实粉末数据、仪器参数和 phase CIF。LAMMPS 必须有明确的
103
+ input/data/force-field;禁止编造实验数据、CIF、力场、历史观测或优化结果。
104
+
105
+ ## 安全、重试与产物
106
+
107
+ - `run-default-job`、`run`、`stop` 等远程变更必须由用户明确授权。结果未知、超时或
108
+ 断连时不得重试,因为远端操作可能已经发生。
109
+ - 参数校验、502、504、timeout、空 recommendations 和后端失败均按本次失败结束。
110
+ SynBO 每个用户任务最多一次业务调用;不得换模型、换 acquisition 或改用本地算法。
111
+ - wrapper 第一次返回失败后立即向用户返回原始错误的短摘要(包含 `stage` 和
112
+ `error_type`)。不得读取 wrapper/runtime/config、不得运行 `delta-cli config/auth/help`、
113
+ 不得修改环境变量、
114
+ 不得伪造 UID、令牌或 API Key,也不得改 operation、参数或调用链重试。
115
+ - `X-User-Uid`、登录、quota 或 permission 错误属于终止性认证错误;只转发原始错误和
116
+ 登录提示。Skill 绝不自行登录、检查凭据、猜测用户标识或尝试绕过 quota。
117
+ - 重型调用串行执行。客户端超时不代表远端计算已取消。
118
+ - 用户未要求文件时不创建 CSV、图片或报告。内部交接文件只能写入当前
119
+ `WORKSPACE_ROOT`,不得读取其他会话 workspace 或历史结果补全当前任务。
120
+ - 外层规划器自动附加的路径、JSON、图表或报告不等同于用户明确要求。若任务本质只是
121
+ 查询、比较或校验,直接返回最小文本结果;不得为了满足附加产物而重复 Science 调用。
122
+ - 二进制产物只解码文档明确的字段;PNG 必须验证 magic bytes。
123
+
124
+ ## 输出
125
+
126
+ 将当前 `native` 投影为用户要求的最小结果;逐字保留字符串、数值、警告和来源。
127
+ 不得补充 native 未返回的单位、机制、引用、链接、预测值或记忆知识。预测结果不得
128
+ 描述为实测结果。
129
+ 成功取得最后一个所需 native 后,直接将其投影为最终答复。禁止为了排序、排版、生成
130
+ 表格或摘要再次执行 wrapper,也禁止把 native 手工复制成新的 Python/JSON 字面量;简单
131
+ 筛选、比较和文本组织直接在最终答复中完成。
132
+
133
+ 成功时只返回由当前 native 生成的有界纯文本;失败时只返回包含 `stage`、`error_type` 的
134
+ 原始错误短摘要。完成后不得重新计算、改写或用手工建议替代成功/失败的 Science 结果。
135
+
136
+ 每次成功结果保留:
133
137
 
134
138
  ```text
135
139
  证据边界:仅限当前 Delta CLI native 结果
@@ -137,35 +141,10 @@ summary 完成当前计划步骤;如果存在 `output_ref`,最多对该精
137
141
  禁止补充未返回内容:是
138
142
  ```
139
143
 
140
- ## 服务选择
141
-
142
- | 用户需求 | 服务 |
143
- | --- | --- |
144
- | 化合物身份、CID、名称、同义词和公共属性 | PubChem |
145
- | SMILES 校验、描述符、渲染、相似度和 SMARTS | RDKit |
146
- | 化学式、组成、CIF/POSCAR、晶体结构和对称性 | pymatgen |
147
- | 粉末衍射模拟或精修 | GSAS-II |
148
- | 有界分子动力学或能量最小化 | LAMMPS |
149
- | 通用实验参数优化 | Delta-BO |
150
- | 分子 next-SMILES 推荐或 BO 轨迹 | LDM-BO |
151
- | 分类反应条件初始化或优化 | SynBO |
152
- | 抗体优化作业 | AntBO |
153
-
154
- ## 安全与重试
155
-
156
- - AntBO 启动/停止、Delta-BO 有状态命令和结果不明确的长任务属于远端变更。没有用户明确授权时不得执行或重试。
157
- - health、查询、解析、描述符和 dry-run 属于只读操作。
158
- - 参数校验错误不要重试;只读请求遇到临时网络错误最多重试一次;超时的变更操作绝不自动重试。
159
- - 重型服务串行运行。客户端超时不代表远端计算已取消。
160
- - 已经取得所需信息后,不要探测未记录的枚举值或替代参数。参数实验属于独立回归任务,不属于普通用户请求。
161
- - SynBO `optimize` 当前存在已知的后端数组维度问题,常规回归中跳过;只有用户明确要求时才测试。
162
-
163
144
  ## 完成标准
164
145
 
165
- 只有同时满足以下条件,任务才算完成:
166
-
167
- - 每个声称的科学数值都来自当前运行;
168
- - 每个在线操作都有 `transport="delta-cli"` 的 wrapper 证据;
169
- - 依赖调用使用了真实的上游 native 输出;
170
- - 失败被归类为 CLI/配置、Science Server、公司后端、参数校验或超时;
171
- - 没有使用直接 HTTP 或本地科学库替代。
146
+ - 每个在线操作都有 `transport="delta-cli"` 证据;
147
+ - 每个科学数值来自当前调用的 native;
148
+ - 下游输入来自当前任务中已验证的上游结果;
149
+ - 失败准确归类为配置、CLI、参数、Science Server、业务服务或超时;
150
+ - 没有直接 HTTP、本地科学库、跨会话文件或人工结果替代。
@@ -1,4 +1,4 @@
1
1
  interface:
2
- display_name: "Delta Science 公共运行时"
3
- short_description: "为具名 Science Skill 提供共享 CLI 调用和交接契约"
4
- default_prompt: "使用 $delta-science 规划跨服务 Science 流程并拆分为具名 Skill 步骤。"
2
+ display_name: "Delta Science"
3
+ short_description: "通过 Delta CLI 统一调用并编排全部 Science 工具"
4
+ default_prompt: "使用 $delta-science 分析科研目标,选择合适工具并通过 Delta CLI 完成任务。"
@@ -1,8 +1,11 @@
1
- # AntBO operation 契约
1
+ # AntBO 详细规则
2
2
 
3
3
  在 `SKILL.md` 的 wrapper 模板中设置 `endpoint`、`data`、`params`。业务结果直接位于
4
4
  `r["native"]`。标为“变更”的 operation 只有用户明确授权时才能执行,且不得重试。
5
5
 
6
+ 抗体/CDRH3 场景即使出现 “LDM” 也不得改用小分子 LDM-BO 或 STRBO。当前 catalog
7
+ 同时暴露 CDRH3 生成/建议/评估接口和传统 AntBO 作业管理接口。
8
+
6
9
  ## health(只读)
7
10
 
8
11
  - 情景:检查远程 AntBO 环境是否可用。
@@ -15,6 +18,9 @@
15
18
  - 代码:`endpoint="run-default-job"; data=None; params={"log_name":"antbo_<唯一时间戳>.log","append":False,"timeout_seconds":86400}`
16
19
  - 投影:started、pid、log_name/log_path、timeout_seconds;未知结果禁止重试。
17
20
 
21
+ 只有同一次 native 同时包含 `started=true`、非空 `pid` 以及 `log_name` 或
22
+ `log_path` 时,才能声称作业已启动;字段缺失时标记为未验证,不得重复提交。
23
+
18
24
  ## run(重型变更)
19
25
 
20
26
  - 情景:用户明确给出受限 AntBO 脚本、配置、抗原文件并要求同步执行。
@@ -39,7 +45,56 @@
39
45
  - 代码:`endpoint="stop"; data=None; params={"pid":12345}`
40
46
  - 投影:stopped、pid、message;不得盲目重试或在多任务时无参数调用。
41
47
 
42
- ## 当前不支持:AntBO LDM
48
+ ## CDRH3 生成与优化
49
+
50
+ 服务端支持的抗原由 health 的 `supported_antigens` 决定;不得猜测或把任意蛋白文件
51
+ 路径当成 antigen。部署通常支持 `1ADQ_A`、`1FBI_X`、`1H0D_C`、`1NSN_S`、
52
+ `1OB1_C`,但执行前以当前服务响应和用户选择为准。
53
+
54
+ ### ldm-health(只读)
55
+
56
+ - 代码:`endpoint="ldm-health"; data=None; params=None`
57
+ - 投影:supported_antigens、cdrh3_length、objective、Absolut/模型真实性字段。
58
+
59
+ ### ldm-init / ldm-init-validate
60
+
61
+ ```json
62
+ {
63
+ "task": "为指定抗原生成初始 CDRH3 候选",
64
+ "num_initial": 3,
65
+ "antigen": "1ADQ_A",
66
+ "seed": 42
67
+ }
68
+ ```
69
+
70
+ 只校验参数时使用 `ldm-init-validate`;正式生成使用 `ldm-init`。成功候选必须是服务
71
+ 返回的 CDRH3 序列,不得由模型自行编造。
72
+
73
+ ### ldm-suggest / ldm-suggest-validate
74
+
75
+ ```json
76
+ {
77
+ "task": "继续降低抗原结合能",
78
+ "history_xs": ["ARVGYSLYAMD", "AKYGGYDYAMD"],
79
+ "history_ys": [-18.2, -17.4],
80
+ "num_suggestions": 2,
81
+ "antigen": "1ADQ_A",
82
+ "seed": 42
83
+ }
84
+ ```
85
+
86
+ AntBO 是单目标,`history_ys` 必须是一维有限数值数组,并与 `history_xs` 等长。
87
+ 每条 CDRH3 必须是 11 个标准氨基酸字符;以 `ldm-health` 当前返回的
88
+ `cdrh3_length` 为最终约束。
89
+
90
+ ### evaluate / evaluate-validate
91
+
92
+ ```json
93
+ {
94
+ "designs": ["ARVGYSLYAMD", "AKYGGYDYAMD"],
95
+ "antigen": "1ADQ_A"
96
+ }
97
+ ```
43
98
 
44
- `ldm/suggest`、`ldm/initialize`、`ldm/evaluate` 不在 CLI catalog。不得调用工具或
45
- 切换到分子 `ldm-bo`,以 Skill 规定的固定能力边界答复结束步骤。
99
+ 成功 score 数量必须与 designs 一致;结合能越低越好。生成、建议和评估均为远端重型
100
+ 调用,结果未知或超时时不得重试,也不得用本地随机分数补全。