lishLRF / dsh-3d-model-viewer

Listed

DSH 插件:在 DeepSeek Harness 的 Web 界面查看 OBJ/STL/STEP 三维模型,并转译为标准化、LLM 可读的 JSON(含语义分析),一键发送给 AI。

mainModel View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:lishLRF/dsh-3d-model-viewer

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit 074e8a6Synced Aug 17, 2026

This README snapshot could not be refreshed during the latest directory sync.

dsh-3d-model-viewer

一个面向 DeepSeek Harness (DSH) 的 插件:在 Web 界面里查看三维模型,并把模型转译成 标准化的、LLM 可读的 JSON, 让纯语言大模型无需 CAD 内核也能“看懂”一个零件。

#dsh-plugin


功能

#能力
1在 DSH Web 界面右侧的悬浮面板中展示 OBJ / STL / STEP 模型,样式对齐 DSH 主题。
2交互:旋转 / 平移 / 缩放;材质(颜色、金属度、粗糙度、线框)、光照(环境光 + 主光)、剖面(裁剪平面)视图
3把任意受支持模型转译成同一套标准 JSONdsh-3d-model/v1),含语义分析,语言模型可直接阅读。
4发送到 AI:一键把 JSON + 提示词写入 DSH 输入框,随用户输入一同上传;或立即发送为排队消息。

工作原理

一个包、两个半边(DSH 插件的标准形态):

  • Host 半边src/index.ts)—— 注册 read_3d_model 工具,让 Agent 自己能读盘上的 OBJ/STL 并转译成标准 JSON;同时导出转译库(translateFromBytes / translateObj / translateStl 与 schema)。
  • Client 半边src/client/*)—— 按 DSH client-module 契约构建的浏览器 bundle,在 shell.overlay(加性、帧级悬浮层,不会覆盖系统 UI)注册面板,用 three.js 渲染,并通过 sessions scope 触达对话、追加/发送模型块。
  拖拽/选文件 ──▶ load.ts ──▶ 解析器(obj|stl|step) ──▶ 标准 JSON 文档
                                                    │
                          ┌─────────────────────────┤
                          ▼                         ▼
                 three.js 查看器(scene.ts)     buildPromptBlock(send.ts)
                 旋转/材质/光照/剖面            └──▶ conversation.input.setDraft

安装与部署

本插件是一个 DSH bundlepackage.json 声明了 dsh.bundle(指向 cordis.patch.yml) 与 dsh.client(浏览器 bundle)。把它加进一个 profiledsh plugin 会将其作为一层 叠加在 @deepseek-ai/dsh-base 之上。

DSH 的 Web 界面运行在 web profile 上(dsh webdsh --profile web,由 @deepseek-ai/dsh-base + @deepseek-ai/dsh-web-app 组成)。如果你用的是其它 profile, 把下面的 web 换成你的 profile 名。

方式 A —— 从 GitHub 安装(推荐)

dsh plugin --profile web add github:lishLRF/dsh-3d-model-viewer

pnpm ≥ 10 会拒绝执行 git 依赖的 prepare 构建脚本,直到你显式允许。第一次 add 会失败并 打印需要复制的包名,把它写进 profile 的 pnpm-workspace.yaml,再重跑 add

allowBuilds:
  dsh-3d-model-viewer: true

为供应链安全建议锁定 commit(prepare 脚本会在你机器上执行):

dsh plugin --profile web add github:lishLRF/dsh-3d-model-viewer#<sha>

方式 B —— 从本地目录或 tarball 安装

# 本地目录(链接该文件夹;prepare 仍会构建 lib/)
dsh plugin --profile web add ./dsh-3d-model-viewer

# 或打包后安装(无需构建脚本)
pnpm pack
dsh plugin --profile web add ./dsh-3d-model-viewer-0.1.0.tgz

启动与验证

dsh web        # 或:dsh --profile web

然后确认已生效:

  1. Web 界面右上角出现 三维模型查看器 面板。
  2. 让 Agent 对某个 .obj/.stl 路径调用 read_3d_model,应返回标准 JSON(说明 Host 工具已注册)。
  3. 不启动也能检查组合结果:
    dsh --profile web --dump-config
    
    找到 # == dsh-3d-model-viewer 这一层即为成功。

卸载

dsh plugin --profile web remove dsh-3d-model-viewer

环境要求

  • Node ≥ 20,pnpm ≥ 10。
  • 查看器面板需要 web surface(web profile);headless/TUI profile 仍能使用 read_3d_model 工具,只是没有面板。

使用

  1. 打开一个会话。
  2. 三维模型查看器 面板中点击 加载模型(或拖拽文件)——.obj .stl .step .stp
  3. 旋转 / 平移 / 缩放,调节材质与光照,开启剖面查看;拖动面板头部可移动面板位置, 面板内容过长时可上下滚动。
  4. (可选)在 模型描述 文本框里写下这个模型的说明(是什么、特征、材质、孔位等)—— 它会写入标准 JSON 的 meta.description,随「发送到 AI」一起提供给 LLM,减少误判。
  5. 点击 发送到 AI 把标准 JSON + 提示词追加到输入框;或 立即发送下载 JSON / 复制 JSON 可导出文档。

设置 → 插件 的配置页(插件列表)里可开启/关闭右侧面板(开关会记住,持久化到浏览器)。

内置示例模型

examples/ 下有三个可用来快速验证的模型:

文件格式说明
examples/gear.objOBJ齿轮(带齿圆盘)
examples/torus.stlSTL圆环(二进制)
examples/box.stepSTEP立方体 40×20×10(AP214 BREP)

在面板里点 加载模型 选中它们即可;cube.obj 是最小的冒烟测试样例。

STEP (.stp/.step) 支持

STEP 是 BREP 实体格式,离散成三角网格需要 CAD 内核。本插件在浏览器端使用 occt-import-js(OpenCascade 的 WASM 移植)。 因此 Host 端的 read_3d_model 工具会提示 STEP 需在 Web 查看器中打开。

  • .wasm 无法与打包后的 client.js 同路径部署,默认从固定 CDN 加载。离线部署请修改 src/client/load.ts 中的 STEP_WASM_URL(或在 bundle 旁托管 .wasm)后重新构建。
  • 许可说明:本项目为 MIT,但 occt-import-js 封装了 OpenCascade(LGPL-2.1 + 例外)。 OCCT 的 WASM 是独立动态加载的二进制,详见 LICENSE 与 occt-import-js 仓库。

标准 JSON(LLM 可读可懂)

核心格式见 docs/SCHEMA.md,机器可读 Schema 见 docs/dsh-3d-model.schema.json。一个模型转译后形如:

{
  "schema": "dsh-3d-model/v1",
  "meta": { "sourceFormat": "stl", "name": "bracket.stl", "units": "mm" },
  "bounds": { "min": [0,0,0], "max": [40,20,10], "size": [40,20,10], "center": [20,10,5], "radius": 22.9 },
  "summary": { "partCount": 1, "vertexCount": 512, "triangleCount": 1024, "materialCount": 0 },
  "analysis": {
    "partCount": 1,
    "totalSurfaceArea": 2200.0,
    "totalVolume": 8000.0,
    "watertight": true,
    "parts": [ { "surfaceArea": 2200.0, "volume": 8000.0, "watertight": true,
                 "boundaryEdgeCount": 0, "dimensions": [40,20,10],
                 "primitive": "box", "primitiveConfidence": 0.99 } ],
    "naturalDescription": "bracket.stl: 1 part (box), bounding box 40×20×10 mm, surface area 2200 mm², closed solid, volume 8000 mm³"
  },
  "parts": [ { "id": "part-0", "vertices": [ … ], "indices": [ … ] } ]
}

其中 analysis.naturalDescription 就是那句让 LLM 一眼“看懂”模型的自然语言摘要。

开发

pnpm install
pnpm test         # vitest(红绿测试)
pnpm build        # 产出 lib/index.js(host)与 lib/client.js(浏览器 bundle)
pnpm typecheck    # tsc --noEmit
pnpm watch        # tsdown --watch

构建自包含(tsdown.config.ts):client bundle 将 DSH 平台模块(reactreact/jsx-runtime 等) 作为 external 从 shell 的冻结模块表解析,其余(threeocct-import-js)全部内联;host 半边 是纯 ESM 插件,对 DSH monorepo 无运行时依赖。

项目结构

src/
├── index.ts             host 插件:read_3d_model 工具 + 转译库导出
├── schema.ts            标准文档:类型 + 构建器 + 量化
├── analyze.ts           语义分析:表面积/体积/watertight/形状分类/自然语言描述
├── parse/
│   ├── obj.ts           Wavefront OBJ 解析器(文本、多边形扇形化)
│   ├── stl.ts           STL 解析器(ASCII + 二进制)
│   ├── step.ts          occt-import-js 适配器(无 import 依赖)
│   └── index.ts         格式识别 + Host 端分发
└── client/
    ├── index.ts         client 插件 apply(shell.overlay 注册 + 发送面)
    ├── panel.tsx        悬浮查看器面板
    ├── scene.ts         three.js 场景控制器(旋转/材质/光照/剖面)
    ├── geometry.ts      文档 → BufferGeometry
    ├── load.ts          浏览器 File → 文档(STEP 走 WASM)
    ├── send.ts          提示词块构建器
    ├── dsh.ts           client 服务最小类型声明
    └── styles.module.css

许可证

MIT —— 见 LICENSE,其中含第三方声明。

已知限制与路线图

  • STEP 仅浏览器端(WASM);Host 的 read_3d_model 工具覆盖 OBJ/STL。
  • 材质文件mtllib)只做尽力解析名字/颜色;完整 MTL 贴图/BRDF 加载暂不在 v1 范围。
  • 单位对 OBJ/STL 默认 unknown(格式本身无单位);STEP 单位在存在时读取。
  • 不自动居中——模型保留源坐标(见 bounds)。
  • 计划中:从 DSH 工作区读取模型(而非仅本地文件选择)、MTL 贴图支持、OBJ/STL→STEP 导出。

贡献

CONTRIBUTING.md。欢迎提 issue 与 PR;较大改动请先开 discussion 沟通。

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

TestsDetected
Contributing guideDetected
DocumentationDetected
ExamplesDetected

Repository information

Language
TypeScript
License
NOASSERTION
Last updated
Aug 17, 2026, 7:57 AM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.