
CAD AI 模块是嵌入网页 CAD 的插件:接收用户自然语言指令,调用大模型生成符合 MxCAD API 规范的 JS 代码,在隔离沙箱中执行,并把结果以图形呈现到图纸。模块本身不含模型、不直接操作图纸,只负责三件事:整理图纸状态、调用模型生成代码、执行并校验结果。

传统 CAD 对外提供高层命令(如 drawCircle(圆心, 半径)),命令本身不说明圆心如何确定、半径单位、颜色图层在哪设置,模型只能靠推测补全,出错率高。MxCAD 则把绘图能力拆分为具体的对象和属性:
const center = new McGePoint3d(0, 0, 0);
const circle = new McDbCircle();
circle.center = center;
circle.radius = 100;
circle.trueColor = new McCmColor(255, 0, 0);
entitys.push(circle);因此 MxCAD 接入 AI 后能做到:
这套做法属于“代码生成”路线(CadQuery / OpenSCAD 一类),缺点是复杂曲面支持较弱、单次失败率较高,优点是可读、可改。MxCAD 的价值在于把失败率控制到可用范围,同时保留可读可改的优势。
工程层面另有三个优点:
process(task, options),注册在agentStrategies 表中,新增智能体不需要改动其他代码。
以“画一个矩形,长 100,宽 60,四个角倒圆角,半径 10”为例,从接收指令到出图依次经过五个阶段、七个步骤,每一步只解决一个问题。
阶段一:接收与路由
阶段二:组装上下文
阶段三:模型生成
import,得到一段可运行的 JavaScript。阶段四:沙箱验证
阶段五:提交或重试
整个过程中模型只参与第三、四、五步,其余由框架完成。核心思路:不让模型直接操作 CAD,而是让它输出一段可被验证的代码,由框架负责验证与落地。

七个步骤分散在五层结构中,每层只承担一类职责,出问题时可单独排查。
process(task, options) 并注册到 agentStrategies;路由智能体根据指令选择智能体,被选中的负责组装 systemPrompt;新增领域智能体只需实现并注册,不改其他层。BaseAgent 负责调用流程与重试,LLMClient 负责网络请求,沙箱负责执行代码。这是框架主体,也是唯一接触网络、唯一执行外部代码的地方。智能体 | 职责 | 典型指令 |
|---|---|---|
IntentRecognitionAgent | 路由调度,不执行具体任务 | 用户无感 |
ModelingAgent | 图形创建与迭代修改 | “画一个长100宽60的矩形,圆角10” |
DefaultAgent | 图纸操作与查询 | “选中所有长度大于100的直线”“把标注图层改成红色” |
分工的意义在于缩小每个智能体的 systemPrompt 范围:ModelingAgent 只讲几何创建,DefaultAgent 只讲属性修改与查询。提示词越窄,模型输出无关内容的概率越低。
同时路由智能体保留“延续会话”判断:用户说“再大一点”时不重新判断意图,直接交给上一轮智能体,保证多轮修改落在同一对象上。
所有配置最终落到四个参数:供应商、API Key、模型 id、baseURL。入口统一为:CAD 网页 → 聊天胶囊上的齿轮按钮(或执行命令 MxCAD_AIConfig)打开“AI 配置设置”对话框。

前提条件(部署侧):
llama-server)、vLLM、Ollama、LM Studio、SGLang 均可;裸 transformers 脚本需加 FastAPI 或套 LiteLLM 网关;choices[0].message.content(插件硬编码解析该字段);--allow-origin "*";max_tokens: 4096)。方式 A:零代码接入(运行时配置,推荐)
参数 | 值 |
|---|---|
端点(baseURL 要填到完整路径) | http://xxxxxxxxxxx/v1/chat/completions |
API Key | xxxxxxxxxxxxxxxx |
模型 id | xxxxxxxxxxxxxxx |
服务能力 | 上下文 216K(n_ctx 216064),最大输出 40960 token |
第 0 步:接入前用 curl 验证
# 1) 拿真实模型 id(注意:llama.cpp 返回的是 gguf 文件路径,
# 必须以 /v1/models 返回的 id 为准)
curl http://xxxxxxxxxxxx/v1/models \
-H "Authorization: Bearer xxxxxxxxxxxx"
# 2) 模拟插件的真实请求,验证协议与 key
curl http://xxxxxxxxxxxx/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer xxxxxxxxxxxxxxxxx" \
-d '{"model":"xxxxxxxxxxxxxxxx",
"messages":[{"role":"user","content":"只回复四个字:接入成功"}],
"temperature":0,"max_tokens":64}'第 1 步:齿轮按钮(或命令 MxCAD_AIConfig)打开“AI 配置设置”对话框。
第 2 步:任选一个供应商(如 OpenRouter),此步只是占位,真实端点由下一步覆盖。
第 3 步:填 API Key,本地服务不校验 key 时任意非空串均可。
第 4 步:填写"自定义 API 地址"——http://xxxxxxxxxxxxxxxx/v1/chat/completions。注意必须写到 chat/completions 完整路径,代码直接 fetch 这个 URL,不会自动拼接。
第 5 步:在下拉框中手动输入模型 id。
第 6 步:点“保存”,配置写入 localStorage(mx_ai_chat_config),所有智能体立即切换,刷新后仍生效。
第 7 步:验证——输入“画一个圆”,确认沙箱出图、代码编辑器收到代码。**
方式 B:代码级内置(做成默认值,构建后开箱即用)
适用场景:交付的 CAD 页面不用进设置界面、默认就走你的模型。修改 MxDrawCloudServer/SRC/sample/app/plugins/pluginAiChatsrc/services/openRouterAPI.ts,重新打包运行。
// ① availableProviders 数组末尾新增供应商
{
id: 'local',
name: '本地/自定义模型',
description: '自托管 OpenAI 兼容服务(llama.cpp/vLLM/Ollama 等)',
icon: '$mdi-home-server',
baseURL: 'http://xxxxxxxxxxxxxxx/v1/chat/completions',
customizable: true
}
// ② fallbackModelsByProvider 新增模型列表(源码里反斜杠写成 \\)
local: [
{ id: 'xxxxxxxxxxxxxxxx(模型id)',
name: 'xxxxxxx',
description: '自托管 llama.cpp 服务,200K 上下文',
provider: 'local', free: true }
]
// ③ modelsByProvider 响应式对象同步加一行
local: [...fallbackModelsByProvider.local]
// ④ defaultConfig 改为默认生效
const defaultConfig: APIConfig = {
provider: 'local',
apiKey: 'Xxxxxxxxxxxxx',
selectedModel: 'xxxxxxxxxxxxxx(模型id)',
baseURL: 'http://xxxxxxxxxxx/v1/chat/completions'
}参数 | 值 |
|---|---|
供应商 | OpenRouter |
API Key | 用户自填,格式如 sk-or-v1-xxxxxxxx |
模型 | deepseek/deepseek-chat-v3-0324:free(免费,代码默认值) |
baseURL | https://openrouter.ai/api/v1/chat/completions(内置,无需手填) |
操作步骤:
MxCAD_AIConfig)打开“AI 配置设置”对话框;sk-or-v1- 开头的平台 key,OpenAI 为 sk- 开头的官方 key;内置供应商的行为特性:
HTTP-Referer、X-Title 头和 route: "fallback"(启用备用路由);response_format: json_object 仅对 openai / iflow 生效,其余场景由 parseJSONResponse 兜底解析(可剥离 Markdown 代码块包裹);cancelAllLLMRequests() 中止全部在途请求。输入:
画一个矩形,长 100,宽 60,四个角倒圆角,半径 10
系统不返回文字说明,而是生成如下代码并在沙箱中执行:
import { MxCpp, McGePoint3d, McDbPolyline, McCmColor } from "mxcad";
function drawRoundedRect() {
const mxcad = MxCpp.getCurrentMxCAD();
const L = 100, W = 60, R = 10;
const bulge = Math.tan(Math.PI / 8); // 90°圆弧的bulge值 ≈ 0.41421356
const pl = new McDbPolyline();
pl.isClosed = true;
pl.trueColor = new McCmColor(0, 128, 255);
pl.constantWidth = 1;
// 逆时针8个顶点,每段直线后跟一个90°圆弧
// 底边
pl.addVertexAt(new McGePoint3d(R, 0, 0));
pl.addVertexAt(new McGePoint3d(L - R, 0, 0), bulge); // 右下角圆弧
// 右边
pl.addVertexAt(new McGePoint3d(L, R, 0));
pl.addVertexAt(new McGePoint3d(L, W - R, 0), bulge); // 右上角圆弧
// 顶边
pl.addVertexAt(new McGePoint3d(L - R, W, 0));
pl.addVertexAt(new McGePoint3d(R, W, 0), bulge); // 左上角圆弧
// 左边
pl.addVertexAt(new McGePoint3d(0, W - R, 0));
pl.addVertexAt(new McGePoint3d(0, R, 0), bulge); // 左下角圆弧
mxcad.drawEntity(pl);
mxcad.zoomAll();
}
drawRoundedRect();执行成功后图形出现在预览区,用户确认后正式写入图纸。

输入:
选中所有长度大于 10 的直线,把它们改到 WALL 图层,颜色设为红色
系统生成的代码会读取当前图纸实体、逐个判断长度,符合条件者修改layer和trueColor属性后提交变更,全程无需人工逐个选择对象。

MxCAD AI 模块的设计思路:绘图动作转成代码,沙箱执行,结果交给人确认,模型只在中间负责生成文本与自我修正。模型生成、框架执行、人确认,三层分工明确。
建议实施顺序:先接入模型跑通“画一个圆” → 再改提示词适配行业规范 → 然后增加关键词路由提效 → 最后拆领域智能体深入特定场景。每一步都能立即看到效果。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。