dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH (DeepSeek Harness) 化学科研 Agent 预设与插件:24 个 chem_* 工具,RDKit / ASE / xtb / AutoDock Vina / admet_ai 后端
为 DeepSeek Harness 定制的化学科研工作环境。调研依据见 research/(GitHub dsh-plugin 生态 + 化学 LLM agent 开源项目对比,2026-08-14 快照)。
┌─ Agent 预设层 ~/.dsh/.agent-presets/chemist/ ──────────────────────────┐
│ agent.cordis.yml:化学科研 persona + 事实校验/安全规则 + 工具行 tool-chem │
│ ~/.dsh/skills/chem-literature · chem-safety(技能包,目录自动发现) │
└──────────────────────┬───────────────────────────────────────────────────┘
│ 每会话挂载;工具行 resolve 宿主 chem 服务
┌──────────────────────▼── Host 平面(bundle: @dshchem/dsh-chem-core)──────┐
│ chem 服务:Python 桥(RDKit/ASE) │ PubChem/Crossref │ 配方库(~/.dsh/chem) │
│ /api/dsh-chem/render-svg(loopback-only)│ 每请求一进程,超时强杀 │
│ 挂载:profile package.json dsh.profile.bundles + cordis.patch.yml │
└──────────────────────────────┬────────────────────────────────────────────┘
│ dsh.client 清单 → 浏览器加载 client.js
┌──────────────────────────────▼── Browser 插件层 ──────────────────────────┐
│ chem_* 工具卡片(tool.call.toolview Slot):SMILES 2D 结构图 + 结果文本 │
└───────────────────────────────────────────────────────────────────────────┘
设计决策(用户确认):host 服务 + 预设工具行分离——引擎/网络/存储/路由在宿主平面跨会话共享,模型工具与 persona 仅化学预设会话可见;client 半通过 dsh.client 清单随 bundle 加载。
| 工具 | 用途 | 关键输出 |
|---|---|---|
chem_validate | SMILES 校验 + canonical 化 | canonical/formula/InChI/InChIKey/heavyAtoms |
chem_props | 分子描述符(RDKit) | MW/exactMw/logP/HBD/HBA/TPSA/旋转键/芳香环/电荷/分子式 |
chem_convert | 结构格式转换 + 2D/3D 结构图 | canonical/inchi/inchikey/mol/sdf/svg/xyz |
chem_pubchem | PubChem 交叉核对 + 名称自动补全 | CID/名称/分子式/MW/SMILES/IUPAC/InChIKey |
chem_calc | 能量计算 | emt / xtb GFN2-xTB 能量与弛豫 |
chem_reaction | 反应分析 | 原子守恒 / SMARTS 模板产物 |
chem_recipe_save / _search / _list | 配方记忆库 | id/title/tags/content(跨会话持久) |
chem_papers | 文献检索 | DOI/标题/期刊/年份/作者/摘要 |
chem_pdf | 本地 PDF 文本提取 | pages/chars/text |
chem_retro_step | 单步逆合成断键 | precursors/atomConserved/saScore |
chem_functional_groups | 官能团识别(24 种) | name/count |
chem_retro_plan | BFS 逆合成路线 | plans(route/terminal/reason) |
chem_reagents | 正向合成条件推荐 | conditions/notes |
chem_aizynth | AiZynthFinder 反应树搜索 | routes(score/reactionTree) |
chem_druglikeness | 类药性 + QED + SA | lipinski/veber/reos/verdict/qed/saScore |
chem_similarity | Tanimoto 相似性排序 | results(target/tanimoto/invalid) |
chem_cluster | Butina 聚类 + Murcko 骨架 | clusters/numSingletons/murckoScaffolds |
chem_mcs | 最大公共子结构 | smarts/numAtoms/numBonds |
chem_enumerate | R-group 组合枚举 | combinations/generated/products |
chem_admet | ADMET 端点预测(104 项) | endpoints/count |
chem_dock | AutoDock Vina 对接 | poses/bestAffinity_kcal_mol/batch |
chem_screen | 一站式虚拟筛选 | hits/failed/reportPath |
dshchem/
├─ research/ # 调研报告 + 11 个 README 证据
├─ packages/
│ ├─ dsh-chem-core/ # host 引擎(chem 服务 + Python/RDKit/ASE 桥 + PubChem/Crossref + 配方库 + 渲染路由 + 浏览器卡片)
│ │ ├─ lib/index.js # Cordis 插件:provide('chem') + /api/dsh-chem/render-svg 路由
│ │ ├─ python/chem_engine.py # 确定性引擎(19 个 op:validate/props/…/admet/dock/screen)
│ │ ├─ client.js # 浏览器半:chem_* 工具卡片内嵌 2D 结构图(tool.call.toolview Slot)
│ │ └─ cordis.patch.yml # profile bundle 补丁
│ └─ dsh-tool-chem/ # 预设工具行(24 个 chem_* 工具)
│ └─ lib/index.js # ctx.tools.register(defineTool(...))
├─ test/
│ ├─ integration.mjs # 端到端集成测试(真引擎 + 真工具注册 + schema 防回归断言)
│ └─ benchmark.mjs # ChemBench 风格评测(性质/校验/反应/计算/网络交叉核对/记忆/筛选)
└─ node_modules/@deepseek-ai # junction → harness 安装(依赖解析,见下)
@deepseek-ai/dsh-agent-presets 的 PresetTree.import),不是 profile node_modules。import '@deepseek-ai/dsh-tools' 从包自身位置向上解析。因此开发期:
packages/dsh-tool-chem/lib/index.js(行名支持绝对路径);node_modules/@deepseek-ai 是到 harness node_modules/@deepseek-ai 的 junction,使包内裸导入可解析。@deepseek-ai/dsh-tools 列为常规依赖发布,行名换包名即可(或继续绝对路径个人部署)。chemist 写入 ~/.dsh/.agent-presets/chemist/(persona + 规则 + tool-chem 行)~/.dsh/skills/chem-literature、chem-safetydsh plugin --profile web add link:...dsh-chem-core(profile package.json 已含 bundle)standingKeyFor('chemist') = mounted OK(含工具行导入)node test/integration.mjs、node test/benchmark.mjs);集成测试含通用输出 schema 校验闸门(对每个工具结果执行 harness 同款 validateJsonSchemaValue)chem_pubchem mw 字符串类型、chem_papers 缺字段条目 null 冲突(均改为「缺失字段省略 + 回归断言」)、chem_calc xtbOutputTail 未声明字段pip install rdkit ase pymupdf paper-qa litellm(本机:Python 3.14.7 + RDKit 2026.03.3 + ase 3.29.0 + pymupdf 1.27.2.3 + paper-qa 2026.8.12 已验证)~/.dsh/chem/bin/xtb-6.7.1/bin/xtb.exe(chem-core config xtbPath 或环境变量 XTB_COMMAND 可覆盖)DEEPSEEK_API_KEY,见 ~/.dsh/.credentials.yaml)python: 或环境变量 CHEM_PYTHONtools/paperqa_ask.py 轻量 RAG(pymupdf 提取 + BM25 检索 + litellm/DeepSeek 综合,带 [n] 引用);paper-qa 库已装(Python 3.14 兼容 ✓),但其索引/agent 运行时经实测评估不适用(全文索引 raw 字段无词元、aviary agent 挂起),故检索层自研;--agent 实验模式保留。2026-08-14 实测核验:8 论断 7 处逐字正确、1 处页码偏移(BM25 对图例数值召回不足,调参缓解);引用纪律(逐条页码标注 + 脚注)与代理不可达预检已加入;高价值数值建议按引用页 ±1 复核C:\Users\cloud\Desktop\aizynthfinder_dsh_314,官方测试 365 passed)→ 方案 A 复活并集成chem_retro_step(SA score 排序 + atomConserved 标记)+ chem_functional_groups(24 种官能团 SMARTS)chem_retro_plan BFS 路线规划(砌块库终止 + 复杂度启发,实测生成两步路线);chem_aizynth:AiZynthFinder 4.4.1(USPTO ONNX 策略 + ZINC 库存)完整反应树搜索(阿司匹林 3.7s 搜索、首解 0.01s、50 路线)chem_reagents 正向条件推荐(8 类反应规则表 + 逆向裂解备注)metadata.mapped_reaction_smiles(原 rxn.smiles 为模板派生的非法串 [cH3:5]),reaction 节点带 smilesValid 标记;② 非法输入 RDKit 预检 + 引擎优先解析 stdout JSON,不再泄漏 Python 堆栈;③ AiZynth 模板反应为简化表示(离去小分子隐式),校验规则为「无制造原子」而非精确守恒chem_aizynth 依赖 PY314 移植 venv(AIZYNTH_PYTHON/AIZYNTH_CONFIG 可覆盖)chem_druglikeness:Lipinski/Veber/REOS 逐条判定 + QED + SA score(阿司匹林 drug-like/QED 0.55、紫杉醇 not drug-like 验证)chem_similarity(Morgan/MACCS + Tanimoto 排序)、chem_cluster(Butina + Murcko 骨架,实测修复 distFunc 语义)、chem_mcschem_admet:torch 2.13 CPU + admet_ai 2.0.1(104 端点:AMES/hERG/CYP/溶解度/毒性等,chemprop 集成模型);实测修复 torch/torchvision CUDA 版本错配(cu128 vs cu132 → 统一 CPU 版)与 admet_ai 进度条污染 stdout JSON 协议chem_enumerate:R-group 组合枚举(dummy 原子骨架,3×3=9 验证,去重/截断/失败计数)chem_similarity 非法 target 的 tanimoto: null 触发 schema 拒绝导致整次调用不可用 → 改为省略字段 + invalid 标记(合法目标仍正常评分);顺带修复同类 null 泄漏(chem_druglikeness qed/saScore、chem_retro_step saScore 失败时省略而非置 null)与排序 KeyErrorchem_dock:AutoDock Vina 1.2.5 + meeko 配体准备(SMILES→3D→PDBQT),受体直接吃 PDB(vina 内置转换);1iep 测试体系验证(best ≈ -11.9 kcal/mol,9 poses)。实测修复:vina 1.2.5 Windows 的 --out 写入随机丢失 model(1-9 波动)→ 改为解析 stdout 打分表(始终完整)convert 新增 XYZ 输出(ETKDG 3D 坐标)+ /api/dsh-chem/xyz 路由 + 工具卡片「3D 查看」按钮(3Dmol.js CDN 双源加载,stick+sphere 渲染,可交互旋转)dsh-mcp-client 接口成熟(stdio/streamable-http、工具命名 mcp__<server>__<tool>);接入需在 profile 组合加行并安装 server(如 rdkit-mcp-server),改宿主组合有重启风险——留作可选增强,未改动 profileposition: relative 时逃逸到页面左上角)→ 容器加 position: relative;② chem_convert 工具枚举补 xyz(引擎已支持、工具侧未暴露——规格不一致修复)chem_screen:一站式筛选——枚举 → Lipinski/Veber/QED/SA 规则过滤 → 可选 ADMET 端点阈值过滤(批量模型调用)→ 可选 Tanimoto 相似性排序 → 可选 markdown 报告落盘chem_dock 新增 batch 模式(≤5 配体 vs 单受体,串行,亲和力排序表)reportPath 自动生成筛选漏斗 + 命中表 markdown(实测 3×3 库 → 9 命中排序 → 报告落盘)chem_screen 输出含 schema 未声明的 rulePassed 字段 → harness 拒绝(additionalProperties: false)→ 删除冗余字段 + 集成测试回归守卫(断言输出不含该键);引擎即时生效poseOut 选项返回 best pose XYZ 坐标/api/dsh-chem/complex 路由(loopback-only,读受体 PDB + 实时对接 best pose)→ chem_dock 卡片「对接查看」按钮——3Dmol.js 渲染受体(cartoon + VDW 表面)+ 配体 pose(橙色 stick),直接目检结合模式dockArgs 对象 → 重渲染清理并取消在途 fetch → ref 持有 + 稳定依赖;② 修复后仍卡 >10 分钟——根因是 3Dmol.js CDN script 加载挂起(受限网络下 onerror 不触发、promise 永不 settle,卡在对接前的加载环节)→ 3Dmol.js 本地化(vendor/3Dmol-min.js + /api/dsh-chem/3dmol.js 同源路由,CDN 降级为回退)+ 15s 加载总超时(任何情况下状态机必 settle)