HiCAD 技术架构设计
HiCAD 采用前后端分离的 Monorepo 架构,核心目标是把自然语言建模需求转化为可执行、可编辑、可评测的参数化 JSCAD 代码,并在浏览器中通过 Worker 与 Three.js 完成安全渲染。
1. 架构总览
负责 AI 对话、Monaco 代码编辑、参数面板、3D 预览、质量评分面板、模型保存和导出交互。
负责认证、配额、模型文件、模板市场、支付、管理员后台、AI 编排和 Langfuse 观测。
通过统一 Adapter 调度 DeepSeek、Kimi、通义千问、豆包,并用意图分析、代码生成、质量评测等 Agent 分工降低不确定性。
用 Harness 约束 AI 生成装配关系,再由 Worker 执行建模代码并交给 Three.js 渲染工程级预览。
2. 技术选型
| 层级 | 技术 | 作用 |
|---|---|---|
| 前端框架 | Vue 3 + Vite + TypeScript | 快速开发 SPA,Composition API 适合编辑器与渲染状态组织。 |
| 状态管理 | Pinia | 管理 AI 生成、编辑器、用户登录、配额和质量评分状态。 |
| 代码编辑 | Monaco Editor | 提供 JSCAD/JavaScript 编辑、主题、补全和错误提示体验。 |
| 3D 渲染 | Three.js | 加载几何、材质渲染、相机控制、尺寸标注、截图和导出。 |
| CAD 建模 | JSCAD API + 自研 Worker Runtime | 用 JavaScript 表达参数化几何,并通过内置 API 注入降低 AI 输出复杂度。 |
| AI 编排 | NestJS + Adapter + Prompt Skills | 完成多模型路由、系统 Prompt 构建、双阶段生成、续改和评测。 |
| Agent 扩展 | .qoder/agents + .qoder/skills | 项目已预留 Qoder 代理与技能目录;当前业务内通过 Prompt Skills 和服务层 Agent 思想落地。 |
| 数据存储 | JSON 文件 + 文件系统 | MVP 阶段部署简单,便于私有化、备份和迁移。 |
| 观测 | Langfuse | 记录 AI Trace、模型、意图、管线、Prompt、输出长度、耗时和失败原因。 |
3. 前端分层
前端由页面、组件、Store、Composables 和 Utils 五层组成。最重要的是 EditorPage,它把 AI 对话、代码编辑、参数化调整、3D 视图、质量评分和导出能力连接起来。
frontend/src/
├── pages/EditorPage.vue # 编辑器主页面,编排 AI、代码、参数、预览和导出
├── components/ai/AiChatBox.vue # AI 对话、模型选择、自定义 Key、生成与停止
├── components/editor/CodeEditor.vue # Monaco 编辑器、补全、主题、debounce 写回
├── components/editor/ParamPanel.vue # 参数解析、滑块/输入控件、变量反写
├── components/editor/QualityPanel.vue # 质量评分、低分建议、一键优化
├── components/viewer/ThreeViewer.vue # 3D 预览容器和视图控制
├── stores/aiStore.ts # SSE、消息、模型、续改、自动评测
├── stores/editorStore.ts # 当前代码、渲染状态、质量结果、脏状态
├── stores/userStore.ts # 登录态、会员、配额、发布权限
├── composables/useJscad.ts # Worker 管理、requestId、防抖、STL 导入
└── composables/useThreeScene.ts # Three.js 场景、材质、几何更新、NaN 防护前端的关键设计是“状态驱动渲染”:AI 生成完成写入 editorStore.code,useJscad 监听代码执行 Worker,ThreeViewer 根据 GeometryGroup 更新场景,QualityPanel 根据评测结果更新建议。
4. 后端分层
后端使用 NestJS 的模块化组织方式,每个业务域拥有 Controller、Service 和 DTO。AI 模块是核心,它同时包含 Prompt、Adapter、双阶段 codegen、质量评测和观测。
backend/src/modules/
├── ai/
│ ├── ai.controller.ts # /api/ai/generate、/modify、/history、/optimize-prompt
│ ├── ai.service.ts # AI 编排、配额检查、单/双阶段生成、续改、历史保存
│ ├── adapters/ # AiAdapter、DeepSeekAdapter、MultiAdapter、OpenAIAdapter
│ ├── prompt-builder.ts # JSCAD 系统 Prompt 与 Skill-Harness 规则
│ ├── design-prompt.ts # 机械臂设计规格 Agent Prompt
│ ├── tank-prompt.ts # 坦克/装甲车辆设计规格 Prompt
│ ├── car-prompt.ts # 汽车/超跑设计规格 Prompt
│ ├── design-spec.types.ts # MechanicalArmSpec、TankSpec、CarSpec 与归一化
│ ├── jscad-codegen.ts # Stage 2 确定性 JSCAD 代码生成器
│ └── ai-quality-evaluator.service.ts # 7 维质量评测与基准报告
├── auth/ # JWT 登录和策略
├── user/ # 用户、会员、配额
├── model/ # 模型保存、分享、发布
├── template/ # 模板市场
├── pay/ # 支付和订单
├── admin/ # 管理后台
└── feedback/ # 用户反馈5. Skills 技术与多 Agents 实现方案
项目中存在两类“技能/代理”概念:一类是 Qoder 工程化扩展目录,另一类是 HiCAD 业务运行时的 AI 建模技能与 Agent 编排。当前项目的 .qoder/agents 和 .qoder/skills 是预留目录,适合后续沉淀专用文档、评测、建模优化代理;业务运行时则已经通过 Prompt Skills、多阶段 Agent 和确定性 Codegen 落地。
Qoder Skills / Agents
作为工程协作层,用于把“技术文档生成、AI 评测、建模规范审查、Prompt 优化”等流程固化成可复用技能或代理。
业务 AI Skills / Agents
作为产品运行层,内置在 prompt-builder、design-prompt、jscad-codegen、ai-quality-evaluator 等模块中。
| Agent / Skill | 当前落点 | 职责 |
|---|---|---|
| Prompt Skill | prompt-builder.ts | 定义 JSCAD 生成规则、坐标系、装配 Harness、材质语义和完整示例。 |
| Design Agent | design-prompt.ts / tank-prompt.ts / car-prompt.ts | 把自然语言转为结构化 DesignSpec,只做设计决策,不直接写定位代码。 |
| Codegen Agent | jscad-codegen.ts | 根据 Spec 确定性生成 JSCAD,负责精确坐标、嵌入量、参数声明和材质分层。 |
| Model Router | MultiAdapter | 根据模型 ID 路由 DeepSeek、Kimi、Qwen、Doubao,并处理自定义 Key 与输出窗口。 |
| Quality Agent | ai-quality-evaluator.service.ts | 从 7 个维度评测生成代码,输出评分、等级、warnings 和优化建议。 |
| Observability Agent | langfuse-observability.service.ts | 记录 AI Trace,沉淀模型、意图、管线、Prompt、输出和错误数据。 |
多 Agents 协作链路
用户需求
-> Intent Detector 判断 general / mechanical_arm / tank / car
-> Design Agent 输出结构化 Spec
-> Spec Normalizer 做范围裁剪和默认值兜底
-> Codegen Agent 生成确定性 JSCAD
-> Worker Runtime 执行代码并返回几何
-> Quality Agent 评分并生成优化建议
-> Modify Agent 基于当前代码续改6. Harness 技术思想:让 AI 建模从“摆零件”变成“可装配”
HiCAD 的 Harness 不是单个函数,而是一套约束 AI 输出的建模思想:统一坐标系、底部对齐、锚点公式、轻微嵌入、最终装配、自检评测。它解决的是 AI CAD 最常见的问题:零件悬浮、方向错误、比例失衡、返回散件、材质语义缺失。
stack
按 Y 轴从下到上自动堆叠,减少手写高度偏移错误。
stackOverlap
堆叠时加入 1-3mm 嵌入量,减少视觉分离缝。
attachY
把 child 自动贴到 base 顶部并嵌入,适合竖向装配。
assemble
语义化最终装配,等价 union,但更利于 Prompt 约束和评测识别。
// Harness 心智模型
const base = cuboid({ size: [100, 10, 60] })
const body = roundedCuboid({ size: [80, 35, 45], roundRadius: 4 })
const cover = cuboid({ size: [70, 8, 40] })
// 从下到上堆叠,并让每层有轻微嵌入
return stackOverlap(2, base, body, cover)| 约束 | 说明 | 解决的问题 |
|---|---|---|
| Y 轴向上 | 所有高度统一沿 Y 轴表达。 | 避免模型方向混乱。 |
| 底部对齐 | cuboid、cylinder、cone 默认底面在 y=0,顶面在 y=height。 | 避免反复计算 h/2。 |
| 锚点装配 | 横向/前后装配写清尺寸公式,例如 bodyWidth/2 - pegRadius。 | 避免目测 translate 导致悬浮。 |
| 轻微嵌入 | 零件接触处保留 overlap。 | 减少视觉裂缝和布尔分离。 |
| 语义材质 | colorize 第三个参数传 material ID。 | 让 Three.js 能映射金属、玻璃、橡胶等材质。 |
7. AI 深度技术方案
7.1 单阶段生成
通用模型走 Prompt → AI → JSCAD 代码的单阶段链路,适合支架、外壳、齿轮、花瓶、文字铭牌等通用建模需求。系统 Prompt 会注入 JSCAD API、坐标系、Harness、材质、参数化注释和反模式约束。
7.2 双阶段精准建模
复杂领域模型走“AI 设计决策 + 确定性代码生成”模式。机械臂、坦克、汽车会先由 Design Agent 输出 JSON Spec,再由 jscad-codegen.ts 生成代码,避免大模型直接写复杂定位代码时出现方向错误和零件分离。
Stage 1:Design Agent
Prompt -> {
type: 'car',
material: 'painted_metal',
style: 'supercar',
params: { carLength, carWidth, carHeight, wheelRadius },
features: { spoiler, sideIntakes, splitter, diffuser, glassRoof }
}
Stage 2:Deterministic Codegen
Spec -> 参数声明 -> 精确定位公式 -> JSCAD 几何 -> module.exports = { main }7.3 多模型 Adapter
后端通过统一 AiAdapter 接口暴露 generateStream(),MultiAdapter 根据 modelId 路由不同供应商,并支持用户自定义 API Key 优先、环境变量兜底、模型输出窗口差异治理和自动重试。
| 模型供应商 | 识别方式 | 治理策略 |
|---|---|---|
| DeepSeek | 默认或 deepseek-* 模型 | 支持 chat、coder、reasoner;503/429 自动重试。 |
| Kimi | moonshot-* 模型 | 优先使用 32K/128K 上下文,避免系统 Prompt 超窗。 |
| 通义千问 | qwen-* 模型 | 适配 OpenAI 兼容接口,注意长代码续改上下文。 |
| 豆包 | doubao-* 或 ep-* 模型 | 将 max_tokens 控制到 4096,避免供应商输出上限错误。 |
7.4 Prompt Skills 分层
prompt-builder.ts 不是简单提示词,而是一个可复用的技能包:强制输出纯代码、禁止散件、注入 Harness、定义材质 ID、提供参数化模板、补充齿轮/文字/曲面/戒指等垂直示例。
8. AI 质量闭环
质量评测不是后台报表,而是产品体验的一部分。前端生成完成后会调用 /api/ai/evaluation/code,把评分、等级、低分指标和建议显示在编辑器内,并可进一步触发一键优化。
| 指标 | 评测重点 |
|---|---|
| 可执行基础结构 | 是否有 function main、module.exports、return,是否残留 Markdown fence。 |
| 参数化程度 | 是否有带 unit/min/max 注释的参数,能否被 ParamPanel 识别。 |
| 几何丰富度 | primitive、transform、assembly/boolean 的数量和组合。 |
| 结构连贯与装配 | 是否使用 union、assemble、stackOverlap、attachY,是否存在散件风险。 |
| 材质语义 | 是否有 @material 和 colorize material ID,是否区分玻璃、橡胶、金属等。 |
| 需求匹配 | 是否命中标准用例关键词、必备规则和反模式约束。 |
| 安全与可维护性 | 是否包含 process、fs、fetch、eval 等危险 API,segments 是否过高。 |
项目内置标准用例覆盖 L 型支架、低趴超跑、现代坦克、工业机械臂、真实齿轮和电子设备外壳,便于持续回归 AI 生成质量。
9. 模型执行与安全治理
AI 输出代码必须先经过 Worker Runtime 清洗与沙箱执行,不能在主线程直接运行。HiCAD 在 Worker 中完成代码提取、导入清理、截断修复、变量冲突处理、API 注入、几何序列化和零拷贝传输。
去除 Markdown 代码块、语言标识和重复 require,兼容 CommonJS 与部分 export 写法。
自动补齐未闭合花括号和 module.exports,降低流式输出中断导致的失败率。
检测局部变量名与注入函数同名的情况,并重命名非函数调用位置。
把 positions、normals、indices 转为 TypedArray,并用 Transferable Objects 零拷贝传回主线程。
Worker Runtime
-> extractCode(rawCode)
-> autoRepairTruncatedCode(code)
-> executeJscad(cleanCode)
-> serializeGeometry(geometry)
-> postMessage({ groups, triangleCount, warning }, transferables)10. 数据与文件设计
当前项目采用 JSON 文件数据库,模型代码单独存储为 JSCAD 文件,便于迁移、备份和私有化部署。AI 相关数据则通过 sessions、Langfuse Trace 和评测报告沉淀。
| 文件 | 职责 |
|---|---|
| users.json | 用户、会员等级、AI 配额、权限信息。 |
| models.json | 模型元数据、分享状态、市场发布状态。 |
| templates.json | 官方模板与市场模板数据。 |
| orders.json | 支付订单与会员开通记录。 |
| sessions.json | AI 对话历史、生成代码、模型元信息。 |
| files/{userId}/{modelId}.jscad | 模型源码文件。 |
| Langfuse Trace | AI 调用、Prompt、输出、意图、管线、耗时、错误和质量观察。 |