NL2CGA 自主学习系统开发计划
让自然语言生成引擎随语法演进自动进化 — 2026 Q2~Q4 技术路线图
🚀 版本控制与网站修复发布流程
当前生产环境的所有代码均直接部署在 /www/wwwroot/ 下,本地 git 仓库没有配置 remote,也没有启用 CI/CD。因此每一次文件修改都会直接影响线上。下面的流程图与说明同时适用于“引擎发版”和“前端热修”两条独立流水线。
关键约定
- 引擎(Engine)与前端站点分开发布:引擎更新需要编译、跑测试、替换 dist;前端 HTML/JS/CSS 修复直接改文件即可。
- 先备份再动手:任何改动前先打包
/www/wwwroot/www.rulepackage.com、/www/wwwroot/cgajs-api、/etc/nginx到/root/backups/。 - 本地提交但无推送:目前 repo 没有 remote,
git commit只保留本地历史;远程仓库与 CI/CD 需后续单独建立。 - 回滚即还原备份:出问题时用备份 tar 包覆盖即可,无需复杂回滚脚本。
引擎发版流程(Engine Release)
/www/wwwroot/cgajs-engine/src 中修改 TypeScript 代码、语法规则、编译器或运行时。npm test 确认全部用例通过;必要时补充新的 e2e / 单元测试。npm run build 生成新的 dist/。此步骤会短时占用 1–2 GB 内存与大量 CPU,建议在闲时执行。dist、前端文件、nginx 配置,并记录 EngineVersion 行号。dist 到 /www/wwwroot/cgajs-api/engine,重启 cgajs-api.service,更新数据库 EngineVersion 表。前端/网站修复流程(Frontend Hotfix)
tar czf /root/backups/www.rulepackage.com-YYYYMMDD-HHMMSS.tgz /www/wwwroot/www.rulepackage.com/www/wwwroot/www.rulepackage.com/**/*.html、*.js、*.css。由于没有 staging,所有改动即时生效。git add -A && git commit -m "fix: 修复 XXX"。仅本地记录,不推送到远程。回滚方案
发现问题后的标准回滚
- 引擎回滚:找到最近一次备份 tar 包,解压
cgajs-api-*.tgz中的旧 dist 覆盖/www/wwwroot/cgajs-api/engine,重启服务;或把数据库EngineVersion改回上一版本号。 - 前端回滚:
tar xzf /root/backups/www.rulepackage.com-YYYYMMDD-HHMMSS.tgz -C /(tar 包内路径以/www/wwwroot/www.rulepackage.com开头),即可还原全部 HTML/JS/CSS。 - nginx 回滚:若改动了站点配置,使用
nginx-*.tgz还原/etc/nginx/sites-enabled/,执行nginx -t && systemctl reload nginx。
版本号与数据库记录
| 对象 | 当前位置 / 字段 | 更新时机 | 回滚依据 |
|---|---|---|---|
| 引擎版本 | 数据库 EngineVersion 表;站点页脚显示的版本号 | 执行构建脚本或 admin 面板“构建并发布到生产”后 | 备份中的 dist + 数据库上一行记录 |
| 前端版本 | 无显式版本号;以 git log 本地 commit 为准 | 每次修改文件后 | /root/backups/ 下的 tar 包 |
| nginx 配置 | /etc/nginx/sites-enabled/*.rulepackage.com | 域名、HTTPS、子站点调整时 | /root/backups/nginx-*.tgz |
| 环境变量 | /etc/cgajs/cgajs-api.env | 调整 worker 数量、数据库连接、引擎池等 | 备份文件或手动回写 |
当前状态与后续改进
- 已落地单 worker uvicorn、
ENGINE_POOL_SIZE=2、cgajs.com全域名清理、本地备份脚本。 - 待改进建立 staging 子域或本地容器,让
npm run build与前端验证不再直接打生产。 - 待改进配置 git remote(GitHub / Gitea),启用 Pull Request + GitHub Actions 自动测试与部署。
- 可选引入语义化版本(SemVer),为前端站点也维护
package.json版本号。
🏗️ NL2CGA 与 Marketplace CGA 资产统一方案
本方案已实施 P0+P1。当前分散在 Python 代码、参数化模板文件和 Marketplace 数据库中的 CGA 资产,已统一进入可验证、可检索、可版本化的 cga_assets 数据层;Marketplace 中的失败示例已被标记,不会污染 NL2CGA。
一、现状
| 来源 | 存储位置 | 数量/规模 | 当前问题 |
|---|---|---|---|
| NL2CGA 预构建模板 | nl2cga_service.py 中的 PREBUILT_CGA_LIBRARY 硬编码列表 |
~20 个模板 | 修改需发版 API;无法热更新;无编译校验 |
| NL2CGA 参数化模板 | nl2cga/template_engine/template_library.py |
以中国古建为主 | 与预构建模板分两套体系;DB 中无记录 |
| Marketplace CGA 示例 | cga_files 表 + 磁盘文件 |
1077 个文件 | 大量示例未通过编译校验;直接用于 NL2CGA 会污染生成结果 |
| 学习闭环 | cga_success_cases / cga_failure_cases / learning_queue |
持续写入 | 成功案例未与资产库打通;失败案例未阻止再次入库 |
二、核心原则
- 统一数据层:所有可被 NL2CGA 或 Marketplace 引用的 CGA 代码都进入
cga_assets。 - 分类维度解耦:NL2CGA 的“意图/类型标签”与 Marketplace 的“商品分类”各自维护,通过映射表关联,不强制一一对应。
- 安全门机制:任何资产必须先通过当前引擎版本编译校验,才能被 NL2CGA 使用;Marketplace 可以展示未校验资产,但必须显式标注。
- 向后兼容:迁移期间保留旧接口作为
cga_assets的只读包装,分阶段下线。
三、统一数据模型 cga_assets
CREATE TABLE cga_assets (
id SERIAL PRIMARY KEY,
asset_type VARCHAR(32), -- prebuilt / parameterized_template / example / user_work
source VARCHAR(32), -- nl2cga_prebuilt / nl2cga_parameterized / marketplace / user_upload
title VARCHAR(255),
slug VARCHAR(128) UNIQUE,
description TEXT,
cga_code TEXT NOT NULL,
-- 参数化模板专属
params JSONB, -- { lot_width: {default, min, max, type, label}, ... }
-- 检索与分类
keywords TEXT[], -- NL2CGA 意图关键词,如 ["住宅", "简单", "house"]
nl2cga_tags TEXT[], -- NL2CGA 类型标签,如 ["residential", "simple"]
marketplace_tags TEXT[], -- Marketplace 标签,如 ["建筑", "屋顶"]
marketplace_category VARCHAR(64), -- 一级分类:建筑 / 植被 / 道路 / 城市 / 示例 / 组件
-- 来源关联
author_id INT,
original_marketplace_id INT, -- 关联 cga_files.id(可选)
-- Marketplace 商业字段
price FLOAT DEFAULT 0,
is_public BOOLEAN DEFAULT TRUE,
is_approved BOOLEAN DEFAULT FALSE,
download_count INT DEFAULT 0,
sales_count INT DEFAULT 0,
-- 编译安全门
compile_status VARCHAR(20), -- pending / success / failed / timeout
compile_error TEXT,
verified_at TIMESTAMP,
engine_version VARCHAR(32),
nl2cga_ready BOOLEAN DEFAULT FALSE,
quality_score FLOAT, -- 可基于通过率、评分、使用次数计算
metadata JSONB, -- { thumbnail, lot_size, complexity, style, ... }
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now()
);
CREATE INDEX idx_cga_assets_nl2cga_ready ON cga_assets(nl2cga_ready, source);
CREATE INDEX idx_cga_assets_keywords ON cga_assets USING GIN(keywords);
CREATE INDEX idx_cga_assets_marketplace_category ON cga_assets(marketplace_category);
CREATE INDEX idx_cga_assets_compile_status ON cga_assets(compile_status, engine_version);
四、分类体系设计
不建议把 Marketplace 的“商品分类”直接作为 NL2CGA 的模板分类,二者用途不同。
| 维度 | 用途 | 示例 |
|---|---|---|
nl2cga_tags |
自然语言意图匹配 | residential, office, tower, apartment, chinese_classical, modern, simple |
marketplace_category |
商品浏览与筛选 | 建筑 / 植被 / 道路 / 城市 / 示例教程 / 组件库 |
keywords |
模糊搜索、同义词召回 | ["住宅", "房子", "house", "别墅", "villa"] |
如果未来希望 Marketplace 分类也能被 NL2CGA 识别,可新增 cga_category_mappings 映射表,例如:
marketplace_category | nl2cga_tag
---------------------|------------
建筑/整体 | residential
建筑/结构 | structural
城市/街区 | urban_block
五、安全门:编译校验流程
cga_assets,compile_status='pending',nl2cga_ready=FALSE。/api/v1/compile(使用默认 footprint)测试每个资产。compile_status='success',nl2cga_ready=TRUE。失败:记录
compile_error,禁止进入 NL2CGA。nl2cga_ready=TRUE 的资产;未再次通过则降级。NL2CGA 查询必须带过滤
db.query(CgaAsset)
.filter(CgaAsset.nl2cga_ready == True)
.filter(CgaAsset.compile_status == 'success')
.filter(CgaAsset.engine_version == CURRENT_ENGINE_VERSION)
.filter(CgaAsset.source.in_(['nl2cga_prebuilt','nl2cga_parameterized','marketplace_verified']))
六、NL2CGA 改造点
- 替换
PREBUILT_CGA_LIBRARY:将硬编码模板迁移到cga_assets,match_prebuilt_cga()改为 SQL/向量检索。 - 参数化模板入库:
template_library.py中的模板以asset_type='parameterized_template'写入cga_assets,保留params字段。 - RAG 训练数据隔离:NL2CGA 的 few-shot 示例只能从
cga_assets.nl2cga_ready=TRUE和cga_success_cases中抽取。 - 失败案例反哺:编译失败的 Marketplace 资产进入
cga_failure_cases,用于提示 AI 避免同类错误,但不会被检索。
七、Marketplace 改造点
- 列表源切换:
/api/v1/marketplace改为查询cga_assets中source='marketplace'且is_public=TRUE的记录。 - 分类字段标准化:上传表单增加
marketplace_category,与前端CATEGORY_MAP对齐。 - 校验徽章:卡片显示“已通过引擎校验”或“未校验”标签,未校验示例不可用于 NL2CGA。
- 权限控制:付费资产可设置
nl2cga_ready=FALSE或仅限购买者调用,避免免费 NL2CGA 直接挪用付费内容。
八、分阶段实施计划
| 阶段 | 工作 | 影响 | 预计周期 |
|---|---|---|---|
| P0 建表 | 创建 cga_assets、索引、cga_category_mappings |
仅新增表,不影响线上 | 1 天 |
| P1 迁移 NL2CGA | 把 PREBUILT_CGA_LIBRARY 和参数化模板写入 cga_assets,并校验 |
旧接口继续可用 | 2 天 |
| P2 校验 Marketplace | 批量编译 1077 个 Marketplace 文件,标记 nl2cga_ready |
可能发现大量失败示例 | 2–3 天 |
| P3 切换 NL2CGA | match_prebuilt_cga 改为查库;移除硬编码列表 |
NL2CGA 开始受安全门保护 | 2 天 |
| P4 切换 Marketplace | 列表/详情/上传改为 cga_assets;旧 cga_files 作为兼容视图 |
Marketplace 与 NL2CGA 共用资产池 | 3 天 |
| P5 持续校验 | 引擎发版后自动重跑校验;新增资产自动入队 | 长期质量保障 | 持续 |
九、风险与应对
- Marketplace 失败示例多:P2 会大量标记失败,需批量下架或移到“未校验”区,避免影响现有用户。
- 编译校验耗资源:1000+ 文件在 2H8G 上跑可能占满 CPU;建议在闲时(凌晨)分批执行,并发限制 2。
- NL2CGA 模板被付费化:需明确
price > 0的 Marketplace 资产是否对 NL2CGA 可见,默认建议不可见。 - 旧接口兼容:在 Marketplace 路由中保留
cga_files读取,但写操作双写cga_assets,双写稳定后再切单写。
十、决策结论
- 实施范围:已执行 P0+P1,NL2CGA 模板现在从
cga_assets读取并受编译安全门保护。 - Marketplace 分类:已同步改造,
cga_files与cga_assets均新增marketplace_category,列表/Feed 支持分类筛选。 - 付费资产可见性:付费 Marketplace 资产对 NL2CGA 可见,但受
nl2cga_access_policy='purchase'控制;调用时检查购买记录或扣减余额。 - 历史失败示例:已启动后台批量编译校验,失败示例仅标记
compile_status='failed'与nl2cga_ready=FALSE,不下架、不删除,等待人工审阅。
结论
统一是可行且推荐的,但前提是必须先建立编译校验安全门。NL2CGA 的模板结构与 Marketplace 的示例分类不宜直接合并,而是共用 cga_assets 数据层、各自维护分类标签、通过 nl2cga_ready 控制是否可被自然语言生成系统使用。这样既能丰富 NL2CGA 的模板来源,又能避免 Marketplace 的失败示例污染解析与生成能力。
🗺️ 系统架构图
本站所有子站点与后端服务围绕 CGA.js 引擎构成的整体架构如下。图中清晰展示了 IDE、函数库、NL2CGA、Marketplace、插件生态、文档等入口如何汇聚到 Nginx / FastAPI,最终由引擎 Worker Pool 执行并输出三维结果。
子站点说明
- IDE(ide.html / IDEA / IDEB / IDEC):在线 CGA 编辑器,集成 CodeMirror、实时预览、代码补全、Marketplace 联动、Console 输出。
- 函数库(ku.html / ku/*):309+ CGA 函数/操作的签名、实现状态、文档示例与搜索。
- NL2CGA(nl2cga.html / api.rulepackage.com/nl2cga/*):自然语言生成 CGA 规则;包含模板库、意图识别、参数化模板、错误修复与自主学习数据飞轮。
- Marketplace(marketplace.rulepackage.com / plugin.html):CGA 模块、材质、场景、DCC 插件(Blender / SketchUp / Unity / Unreal / Maya / 3ds Max / Houdini / CityEngine)的交易与版本化 registry。
- 文档 / 学习(study.html / updata.html / docs/*):架构设计、更新日志、开发指南与能力评估报告。
📋 更新日志
- 在 runtime.cityvistion.cn 部署 Loki 2.9.8,本地监听 127.0.0.1:3100,数据持久化到 /var/lib/loki。
- runtime 与 gateway 两台服务器部署 Promtail 2.9.8,采集 systemd-journal 与 application 日志并推送到 Loki。
- Nginx 为
/loki/添加 Basic Auth,跨节点推送使用 HTTPS + 用户名/密码。 - Grafana 新增 Loki 数据源与 "Runtime Logs" 日志面板,CityVistion Runtime Overview 看板同时展示 Metrics 与 Logs。
- 新增 C++ 几何内核
cv_geometry_native(Clipper2 + earcut + pybind11),已集成到 cga_runtime.py,offset/inset/slice/extrude 走 native 路径,失败自动回退 shapely/trimesh。
- 修复 admin.html 编码与站点管理面板
- 新增站点脚本模板与 nginx 配置模板
- 安全同步 rulepackage cgajs-api 到 cgajs 并验证稳定
- 根据完整诊断日志,定位到真正失败点:
DIAG import FAIL: /assets/cgajs-engine/index.js?v=31。 - 进一步排查发现
cgajs-engine/dist/engine-Q6UQinqA.js顶部存在静态导入import { readFile } from "node:fs/promises";,浏览器解析模块时会直接失败,导致整个引擎加载中断。 - 修复:移除该静态导入,改为在
loadAssetGeometryUncached函数内部动态await import('node:fs/promises'),仅在 Node 环境实际调用时才加载。 - 将引擎版本戳从
v=31提升到v=32,强制浏览器重新拉取修复后的文件。 - 本次备份:
/root/backups/www.cgajs.com-20260615-204504.tgz。
- 用户反馈只能看到部分 fetch OK 诊断,缺少引擎文件与 import 诊断;怀疑
/cgajs-engine/dist/路径被浏览器/扩展/网络层拦截。 - 将
/cgajs-engine/dist通过符号链接暴露到/assets/cgajs-engine,所有 IDE 中的引擎引用改为/assets/cgajs-engine/index.js?v=31,避免原路径被拦截。 - 动态 import 诊断也改为绝对 URL,不再依赖 importmap。
- 在页面顶部增加固定
<textarea id="ide-raw-logs">日志区,所有错误自动追加,便于一键复制完整输出。 - 本次备份:
/root/backups/www.cgajs.com-20260615-204131.tgz。
- 用户反馈
v=25/26/27均报Resource failed to load | inline-module,说明问题不在ide-core.js本身,而在其 ES Module 静态依赖加载。 - 将内联模块从静态
import改为异步await import(),并用绝对 URL,彻底绕过 importmap 可能的解析问题。 - 引入
es-module-shims.min.js作为 importmap / 模块加载 polyfill,覆盖浏览器原生实现有缺陷的场景。 - 在
ide.html增加两层诊断脚本:- fetch 诊断:直接请求每个依赖 URL,区分网络层失败还是模块层失败。
- 动态 import 诊断:对每个依赖调用
import(),失败时输出具体错误和堆栈。
- 为
cgajs-engine/dist/index.js的相对导入./engine-Q6UQinqA.js追加?v=31,避免其历史缓存影响。 - 本次备份:
/root/backups/www.cgajs.com-20260615-201226.tgz。
- 用户反馈
v=25/26/27均报Resource failed to load: https://www.cgajs.com/assets/ide-core.js?v=27,说明单纯版本戳无法解决。 - 服务端确认
ide-core.js及其所有静态依赖(three、cgajs-engine、addons)HTTP 均为 200 + CORS 头,且文件内容完整无语法错误。 - 彻底修复:将
ide-core.js直接内联到ide.html,消除该文件本身的网络请求/缓存/扩展拦截等失败可能。 - importmap 中
three与cgajs-engine的版本戳分别刷新为?v=27与?v=31,避免其缓存中可能存在的历史失败响应。 - 增强前端错误捕获:资源失败时现在会输出
tag/type/src/inline-module/message/filename/lineno/colno等完整字段,便于定位真实失败点。 - 本次备份:
/root/backups/www.cgajs.com-20260615-200404.tgz。
- 用户反馈通过
https://cgajs.com/ide.html访问时,调试面板仍报Resource failed to load: https://cgajs.com/assets/ide-core.js?v=26。 - 服务端验证该文件可正常返回 200,判断为浏览器端缓存/域名不一致导致。
- 将
ide-core.js与cga-codemirror-mode.js的版本戳从v=26提升到v=27,强制浏览器重新拉取。 - 在 Nginx 中为 js/css/引擎/字体/图片等静态资源统一添加
Access-Control-Allow-Origin: *,避免crossorigin/ ES Module 出现 CORS 偶发失败。 - 在 HTTPS 层面对
cgajs.com添加 301 跳转至www.cgajs.com,统一规范域名,消除双域名缓存/跨域歧义。 - 本次备份:
/root/backups/www.cgajs.com-20260615-195951.tgz。
- 用户反馈调试面板显示
Resource failed to load: https://www.cgajs.com/assets/ide-core.js?v=25。 - 服务端验证该文件 HTTPS 返回 200 +
application/javascript,资源本身正常。 - 将
ide-core.js与cga-codemirror-mode.js的版本戳从v=25提升到v=26,强制浏览器跳过可能存在的旧缓存/301 重定向缓存。 - 为
ide-core.js模块脚本增加crossorigin="anonymous",改善错误报告与跨域一致性。 - 本次备份:
/root/cgajs_full_backup_20260615_195557.tar.gz。
- API、Marketplace、引擎资源 HTTP 返回均正常;服务端无异常日志。
- 移除
.CodeMirror { height: 100% !important; }中的!important,避免 CodeMirror 内部setSize被覆盖。 - 在
ide.html增加前端错误浮层,捕获 JS Error / 资源加载失败 / 未处理 Promise,方便用户直接反馈。 - 等待用户按 Ctrl+Shift+R 强制刷新后,把页面底部红色调试信息贴回。
- 本次备份:
/root/cgajs_full_backup_20260615_195036.tar.gz。
- 恢复
.layoutflex 列布局与html { font-size: 14px; }基准,解决字体变大问题。 - 补全侧栏
.panel-tabs/.panel-tab/.panel-content样式,修复 Inspector / AST / Diagnostics 等面板显示异常。 - 补全
#viewer canvas100% 填充与.error-item样式,恢复 3D 视图与诊断列表。 - 将 IDE 初始化失败检测从单次 2.5s 改为 8s 轮询,并在初始化成功后自动移除提示,避免大模块加载时被误判。
- 本次备份:
/root/cgajs_full_backup_20260615_194229.tar.gz。
- 创建
backup-full.sh:每次修改前自动全站备份,保留最近 10 份。 - 创建
update-project-dashboards.py:自动更新updata.html会话卡片、me.html用户待办、首页导航菜单。 - 创建
kimi-wrap-up.sh:一键执行备份 + 更新仪表盘 + 同步共享记忆库。 - 本次已自动备份:
/root/cgajs_full_backup_20260615_192208.tar.gz。
对 https://www.rulepackage.com/architecture-report.html 提出的“cgajs.com 专注引擎/AI,rulepackage.com 专注 CGA 资产与 Omega 测试”解耦方案进行了可行性评估。结论:架构方向合理、技术上可行,但落地风险集中在“服务器即开发机”的工作流和跨站 API 完整性。
一、方案优势(值得采纳)
- 职责清晰:cgajs.com 作为“引擎大脑”负责 parser、geometry runtime、NL2CGA、auth/billing、IDE;rulepackage.com 作为“资产与标尺中心”负责 CGA 仓库、Marketplace、Omega golden case。避免两站同时维护同一份权威数据。
- 单一权威:CGA 文件只在 rulepackage.com 编辑,引擎只在 cgajs.com 编辑,天然消除写入冲突。
- API 优先:跨站调用走 REST API,不直接读对方数据库,符合分布式系统最佳实践。
- 按需同步:引擎产物 rsync、语料 webhook + cron、Omega golden case API 拉取,三种同步策略与数据特性匹配。
二、当前落地差距(需要补齐)
| 差距项 | 当前状态 | 建议动作 |
|---|---|---|
| rulepackage.com 侧 corpus API | 报告列出 /api/v1/cga-corpus、/api/v1/cga-corpus/{slug}/download、/api/v1/cga-corpus/{slug}/manifest,但 rulepackage.com 当前未实现 | 在 rulepackage.com 新建 cga-corpus router,先从磁盘文件索引,再逐步接入 DB |
| cgajs.com 侧 corpus-updated webhook | 报告要求 /api/v1/webhook/corpus-updated,cgajs.com 当前只有 /api/v1/webhooks/rulepackage(资产上传事件) | 扩展为通用 corpus 更新回调,支持 asset/omega/marketplace 三类事件 |
| 跨站认证 | 报告建议 cgajs.com JWT/API Key,但 IP 白名单 + 共享密钥方案尚未配置 | 在 /etc/cgajs/cgajs-api.env 与 rulepackage.com 环境变量中同步 RULEPACKAGE_API_KEY |
| 站点版本对账 | 报告要求 site-version.json 与 /api/v1/engine/version,当前 cgajs.com 有版本表但无统一 site-version 文件 | 生成 site-version.json,部署脚本自动 bump,状态面板标红版本不一致 |
| promote-to-prod 脚本 | 报告要求 cgajs.com CI 通过后同步 dist-stable 到 rulepackage.com,当前无此脚本 | 新增 scripts/promote-to-prod.sh,通过 SSH/RSYNC 推送 dist-stable 并 bump site-version |
| cgajs.com Marketplace 权威 | cgajs.com 当前仍有 marketplace_routes 与 cga_files 写入能力,需弱化 | Marketplace 写操作迁移到 rulepackage.com;cgajs.com 保留只读/推荐/下架能力 |
三、最大风险:服务器即开发机
- 报告提出“直接在服务器上修改、提交、测试”。这在生产环境是高风险反模式:没有 PR review、没有 staging、没有回滚分支、一次误操作即可影响线上。
- 建议改为:服务器上保留 git 工作区用于快速验证,但关键变更仍需走“本地/容器开发 → PR → CI → 部署脚本”流程;紧急热修也必须先
git commit再改文件,便于事后追溯。 - 当前已创建的
docker-compose.yml、.github/workflows/ci.yml、scripts/deploy.sh已经为 CI/CD 闭环打下基础,应继续完善而非回到纯服务器开发模式。
四、推荐实施节奏
| 阶段 | 周期 | 目标 |
|---|---|---|
| P1 契约补齐 | 1 周 | rulepackage.com 实现 cga-corpus/omega/marketplace API;cgajs.com 扩展 webhook;双方配置共享密钥 |
| P2 权威迁移 | 1–2 周 | CGA 文件/Marketplace 写入切到 rulepackage.com;cgajs.com 改为只读消费;Omega 上传入口统一 |
| P3 同步自动化 | 1 周 | promote-to-prod.sh、webhook、site-version.json、状态面板、CI 镜像发布全部跑通 |
| P4 长期治理 | 持续 | 引擎发版后自动重跑 corpus 校验;Marketplace 资产质量门;Omega golden 作为发布硬门槛 |
五、立即可以执行的 3 件事
- 在 rulepackage.com 创建
/api/v1/cga-corpus与/api/v1/omega/sync-to-cgajs,先把磁盘文件暴露为 API。 - 在 cgajs.com 扩展
/api/v1/webhooks/rulepackage,支持asset.created、asset.updated、omega.batch_ready、marketplace.approved四种事件类型。 - 新增
scripts/promote-to-prod.sh:cgajs.com 引擎 CI 通过后,rsyncdist-stable到 rulepackage.com,并同步更新双方的site-version.json。
最终结论:该解耦方案可行且建议采纳,但不要采用“服务器即开发机”的原始工作流,而是把当前已搭建的 Docker/CI/GitHub Actions 能力接进去,形成真正可维护的双站协作体系。
为同时支撑“解析器完整能力”和“NL2CGA 未来进化”,提出不再把两个站点合并成一个网站,而是让 cgajs.com 专注 CGA 引擎/解析器/NL2CGA 生成,rulepackage.com 专注 CGA 文件仓库与 Omega 黄金测试体系,二者通过 API 互联。
一、角色定位
| 站点 | 核心职责 | 典型数据 / 服务 |
|---|---|---|
cgajs.com |
CGA 引擎云 | parser、engine run、IDE、NL2CGA 生成、用户 auth、billing、admin |
rulepackage.com |
CGA 资源与黄金测试中心 | CGA 文件存储、Omega OBJ 上传、golden case 仓库、对比测试报告、NL2CGA 语料源 |
二、跨站 API 契约
cgajs.com 提供:
POST /api/v1/engine/run:输入 CGA 规则 + 初始 Shape,返回执行后的 geometry 与 metadata。POST /api/v1/geometry/compare:输入 expected / actual + 对比策略,返回 pass/fail 与差异。POST /api/v1/parse:已存在,保持不变。
rulepackage.com 新增 omega-api:
POST /api/v1/omega/build-case:从 OBJ 生成标准tests/golden/cases/<caseId>/目录结构。POST /api/v1/omega/run-test:调用 cgajs.com engine/run + geometry/compare,写入报告。GET /api/v1/omega/reports:获取 golden 测试报告。POST /api/v1/omega/sync-to-cgajs:批量推送 golden cases 给 cgajs.com CI。
三、数据流向
rulepackage.com (Omega 上传 OBJ)
↓
生成 golden case → tests/golden/cases/<caseId>/
↓
调用 cgajs.com /api/v1/engine/run 执行 rule
↓
调用 cgajs.com /api/v1/geometry/compare 对比 expected
↓
生成报告 ← 反哺修复 engine ← CGA 文件/语料同步给 cgajs.com NL2CGA
四、实施阶段
- Phase 1(1 周):定义 API 契约;cgajs.com 新增
engine/run与geometry/compare;rulepackage.com 新建omega-api。 - Phase 2(1 周):统一 golden case 目录格式(
rule.cga+initial-shape.json+expected.json),迁移已有 uploads。 - Phase 3(1 周):Omega 前端打通“生成 case → 运行测试 → 查看报告”闭环。
- Phase 4(1 周):rulepackage.com CGA 文件作为 NL2CGA 权威语料源,rsync/webhook 同步到 cgajs.com 重建向量 RAG 索引。
- Phase 5(1–2 周):cgajs.com IDE 增加“提交到 Golden Test”按钮;admin 嵌入 rulepackage.com 报告看板。
- Phase 6(持续):rulepackage.com 每日/触发式运行
npm run test:golden,作为 cgajs.com 引擎发布的硬门槛。
五、数据所有权
- CGA 文件 / marketplace / library:权威在
rulepackage.com,消费方是 cgajs.com NL2CGA 与 IDE。 - Golden cases / expected outputs:权威在
rulepackage.com,cgajs.com engine/CI 消费。 - Parser / Engine / NL2CGA model:权威在
cgajs.com,rulepackage.com 测试调用。 - 用户 / auth / billing / IDE:权威在
cgajs.com。 - Omega 上传工具 / 测试报告:权威在
rulepackage.com。
目标:以 cgajs.com 的解析器和 NL2CGA 为躯干,以 rulepackage.com 的 Omega 黄金测试体系为“眼睛和标尺”,两边合并后通过持续 golden case 驱动 NL2CGA 自我进化,形成真正可用、可维护、可扩展的 CGA 智能生成平台。
实际扫描远端 8.216.94.109 上 /www/wwwroot 全域,共发现 534 个 .cga 文件(扫描覆盖 531 个)。这些文件不应只躺在磁盘里,而应被索引为解析器回归套件、NL2CGA 训练/检索语料、Marketplace 商品目录三类资产。
一、资产盘点
| 来源目录 | 数量 | 资产性质 |
|---|---|---|
marketplace.rulepackage.com/files | 380 | 用户上传 / 交易市场原始文件(UUID 命名) |
nl2cga-service/library/* | 99 | 按风格分类的 NL2CGA 素材库(住宅/商业/交通/宗教/工业等) |
cgajs-api/nl2cga/prebuilt | 20 | NL2CGA 预建标准模板(simple-house、villa、office…) |
cgajs-api/nl2cga/template_engine/templates | 23 | 参数化模板(含 $param 占位符) |
cgajs-project/private-knowledge/rag-source | 9 | 中式宫殿高复杂度私有知识库 |
www.cgajs.com/assets/examples-standard | 5 | 官网标准示例 |
其它(OSM / engine golden / patterns) | 3 | 散落的标准测试文件 |
元数据画像:总大小约 0.83 MB,平均每文件 1.6 KB;共提取到 2 262 个 attr 声明、236 个 @StartRule、229 个文件含规则描述;前三大复用模块为 roof、facade、material。
二、解析器完善:把 534 文件变成“不会退化的标尺”
- 回归套件:在
cgajs-engine/tests/cga-corpus/下按原目录结构软链接/复制全部 534 文件,CI 中批量跑parseCGA(),当前 525/531 通过(98.9%)。 - 失败专项:6 个失败全部集中在
private-knowledge/rag-source中式宫殿文件,典型错误为split(z)、顶层const与comp选择器混用、splitArea(z, noAdjust)。为每个错误建独立 issue,逐个补齐语法或做源码规范化。 - AST 往返测试:对 marketplace 380 个 UUID 文件执行“解析 → AST → 代码生成 → 再解析”,保证 AST 稳定、无信息丢失。
- 注解覆盖:23 个模板文件大量使用
@Group/@Range/@Color/@Enum/@Hidden,用它们验证 parser 对注解语法的完整支持。
三、NL2CGA 进化:从文件堆到可检索的语义库
- RAG 语料
cga-corpus.jsonl:每条记录包含文件路径、风格标签、自然语言描述(提取@RuleFileDescription、目录名、文件名)、参数 schema、StartRule、imports、关键规则片段。 - 参数 schema 库:聚合 2 262 个 attr 的
@Group/@Range/@Enum/@Color信息,生成cga-parameter-schema.json,让 NL2CGA 生成时不再瞎造参数名。 - Few-shot 样本库:从 20 个预建模板 + 23 个参数化模板 + 99 个 library 分类文件中,按风格挑选 canonical 示例,作为大模型 in-context learning 的 shot。
- 评测基准:建立 NL2CGA eval benchmark,输入为自然语言描述,期望输出为对应 CGA 文件;评测指标 = 语义相似度 + parse 成功率 + engine 渲染成功率。
- 风格专场:9 个中式宫殿文件用于训练“古建/宫殿”专属生成能力;marketplace 380 文件用于训练真实用户分布的风格分类器。
四、Marketplace 完善:从 UUID 文件到可售资产
- 元数据补全:自动把 UUID 文件名替换为语义名(如
modern_villa.cga),依据@RuleFileDescription、规则名、高频 attr 关键词;无描述时走 LLM 自动 caption。 - 质量门:公开上架前必须通过 parse 成功、engine 渲染成功、无运行时错误;高价值 case 再跑 Omega golden diff。
- 自动分类:按目录/内容关键词打上 Residential / Commercial / Industrial / Transportation / Religious / Public / ChineseArchitecture / Infrastructure 等标签。
- 预览与参数面板:每个文件生成缩略图(engine 渲染 OBJ → 截图)、参数 UI JSON(从注解生成滑动条/颜色选择器/下拉枚举),前端支持搜索、预览、一键在 cgajs.com IDE 打开。
- manifest 规范:每个资产增加
manifest.json(title、description、tags、author、license、parameters、preview、source)。
五、4 周落地路线
| 阶段 | 目标 | 产出 |
|---|---|---|
| Week 1 | 资产索引 + 解析回归 | cga-corpus/ 套件、CI parse report、6 个失败 issue |
| Week 2 | NL2CGA 语料与 schema | cga-corpus.jsonl、参数 schema、few-shot bank、eval benchmark |
| Week 3 | Marketplace 元数据与质量门 | UUID 重命名、自动分类、manifest、预览渲染、质量门 |
| Week 4 | 跨站集成与流水线 | rulepackage.com 语料同步到 cgajs.com、CI golden case 联动、NL2CGA RAG 上线 |
六、立即可以开始的 3 个动作
- 远端执行
node /www/wwwroot/cgajs-engine/scripts/scan_cga_corpus.js,生成每日解析率报告。 - 在
rulepackage.com新增/api/v1/cga-corpus:返回分类、参数 schema、下载链接,供 cgajs.com NL2CGA 消费。 - 为 marketplace UUID 文件跑一遍 engine 渲染,生成缩略图 + 失败清单,失败的文件先不入库。
目标:让这 534 个文件不再是“死文件”,而成为解析器不会退化的标尺、NL2CGA 不断进化的教材、Marketplace 持续增长的库存。
在上一轮 CGA 语料方案基础上,再次对比两个站点当前实际代码状态,发现双方已经“各走各的”:cgajs.com 实现了更多几何操作但本地提交较旧;rulepackage.com 有更新的 parser/IDE 修复但缺少这些几何操作。需要一次双向合并 + 权威归属 + 自动化同步。
一、现状快照
| 维度 | cgajs.com(远端) | rulepackage.com(本地) |
|---|---|---|
| 引擎代码提交 | 到 8ed614d(较旧) | 到 c7e5f09(较新) |
| 新增几何操作 | 已含 insert、inset、convert、asset-loader、asset-collector | 缺少 inset / convert / asset-loader;insert 只有基础 58 行 |
| E2E 测试 | 45 个,覆盖 insert/inset/convert/setback-advanced/shape-luo/uv-split 等 | 38 个,缺少上述专项测试 |
| CGA 语料套件 | tests/cga-corpus/ 533 个 symlink + cga-corpus.test.ts | 无 corpus 目录与测试 |
| CGA 资产 API | /api/v1/cga-corpus、cga_asset_service.py 含分类映射/quality_score | 有 CgaAsset 模型,但无 endpoint,服务文件较旧 |
| Omega 同步 | /omega/sync-to-cgajs 已落地 | Omega 后端缺少 sync endpoint |
| 站点版本管理 | site-version.json(engine 27) | 无 site-version;IDE 引用 engine v=24 |
| Marketplace | 380 个 UUID 文件,无 manifest/预览 | 380 个 UUID 文件,无 manifest/预览 |
二、关键差距
- 引擎“双向分叉”:cgajs.com 有 inset/convert/asset-loader 等实现但缺本地最新 parser/IDE 修复;rulepackage.com 有最新修复但缺这些几何操作。两边 dist-stable 版本不一致(v24 vs v27)。
- 语料权威在 rulepackage.com 但未落地:按架构方案,CGA 文件权威应在 rulepackage.com,但本地反而没有 corpus 目录和 API;远端已先一步实现。
- Omega golden case 未形成闭环:远端有
/omega/sync-to-cgajs,但 rulepackage.com(上传入口)没有,导致 golden case 无法从上传端主动推送给引擎端 CI。 - Marketplace 仍是 raw files:380 个 UUID 文件没有语义名、manifest、缩略图、质量门。
- 站点版本 / 缓存戳未统一:本地没有
site-version.json,IDE 引用的引擎版本落后,用户可能命中旧缓存。
三、继续完善方案
- 1. 引擎双向合并(P0)
- 把 cgajs.com 的
src/geometry/operations/create/insert.ts、inset.ts、src/runtime/asset-loader.ts、asset-collector.ts、import-resolver.ts以及convert()实现合并到 rulepackage.com。 - 把 rulepackage.com 的最新提交(autocomplete 313 项、primitiveSphere、block-body 解析、vector normalization、const annotations、function signatures)合并到 cgajs.com。
- 统一
dist-stable版本到同一 hash,并在两个站点同步site-version.json(engine 升到同一版本)。
- 把 cgajs.com 的
- 2. 建立 CGA 语料权威(P1)
- 在 rulepackage.com 新增
scripts/build_cga_corpus.py:扫描/www/wwwroot下 534 个.cga,按原目录结构软链接进cgajs-engine/tests/cga-corpus/。 - 新增
tests/parser/cga-corpus.test.ts与/api/v1/cga-corpusendpoint,把解析结果写入cga_assets表。 - cgajs.com 通过定时任务拉取 rulepackage.com 的
/api/v1/cga-corpus,重建本地tests/cga-corpus/与 DB。
- 在 rulepackage.com 新增
- 3. Omega golden case 闭环(P1)
- 在 rulepackage.com 的
omega_routes.py补齐/omega/sync-to-cgajs(直接复制远端实现)。 - cgajs.com 新增 cron:每 30 分钟拉取 rulepackage.com 的 golden cases,导入
tests/golden/omega-imports/并跑 diff。
- 在 rulepackage.com 的
- 4. Marketplace 资产化(P2)
- 写
scripts/enrich_marketplace.py:UUID → 语义 slug、自动 caption、参数 schema、标签分类、engine 渲染缩略图。 - 质量门:parse 成功 + render 成功 + 无缺失 import 才写入
marketplace.rulepackage.com/assets/<slug>/manifest.json并上架。
- 写
- 5. 站点版本与缓存统一(P0-P1)
- rulepackage.com 新增
site-version.json;ide.html、nl2cga.html、omega.html都从此文件读取 engine/autocomplete/mode 版本戳。 - 部署脚本
scripts/promote-to-prod.sh在同步 dist-stable 后自动 bumpsite-version.json并刷新 Nginx。
- rulepackage.com 新增
- 6. CI / 同步流水线(P2-P3)
- cgajs.com 引擎 CI 通过 → rsync
dist-stable到 rulepackage.com。 - rulepackage.com 语料 / Marketplace 更新 → webhook 通知 cgajs.com 拉取。
- 清理
dist-beta、bak 文件、未跟踪临时文件,避免仓库膨胀。
- cgajs.com 引擎 CI 通过 → rsync
- 7. 跨站状态面板(P3)
- 新增
/status.html,实时展示两站 engine 版本、corpus 数量、parse 成功率、marketplace 已审核数、上次同步时间。
- 新增
四、建议落地顺序
| 阶段 | 目标 | 产出 |
|---|---|---|
| P0(3 天) | 引擎双向合并 + 站点版本统一 | 双方 insert/inset/convert/asset-loader 一致;IDE engine v=27;site-version.json |
| P1(1 周) | rulepackage.com 语料权威 + Omega 同步闭环 | tests/cga-corpus/、/api/v1/cga-corpus、/omega/sync-to-cgajs、cgajs.com 定时拉取 |
| P2(1 周) | Marketplace 资产化与质量门 | 380 文件 manifest + 缩略图;审核通过清单 |
| P3(1 周) | CI 同步流水线 + 状态面板 | 夜间自动 sync、/status.html、dist-beta 清理 |
五、马上可执行的 3 件事
- 从 cgajs.com 把
src/geometry/operations/create/inset.ts、src/runtime/asset-loader.ts、tests/e2e/insert.test.ts、tests/e2e/convert.test.ts等文件 rsync 到 rulepackage.com。 - 在 rulepackage.com 创建
scripts/build_cga_corpus.py,生成cgajs-engine/tests/cga-corpus/并跑通cga-corpus.test.ts。 - 两端都新增
site-version.json,并把 IDE 中的?v=24统一改为读取site-version.json的engine字段。
目标:结束“双站分叉”,让 cgajs.com 专注引擎能力、rulepackage.com 专注资产与测试,两边通过自动化同步保持完全一致,用户无论访问哪个站点都得到同一套最新引擎与同一批高质量 CGA 资产。
已输出一份独立的可视化报告,明确两个站点解耦后的权威职责、跨站 API 契约、数据流向、功能砍留清单,以及未来直接在服务器上开发的工作流。
- cgajs.com 保留:引擎 / 解析器 / runtime、NL2CGA AI 生成、IDE、用户/鉴权/计费/管理后台、函数库文档、插件生态。
- cgajs.com 砍掉/弱化:canonical CGA 文件仓库、Omega 上传与 golden case 存储、Marketplace 资产发布后台、多版本 dist 并存。
- rulepackage.com 保留:CGA 文件仓库 / Marketplace 资产、Omega 黄金测试体系、NL2CGA 语料源、跨站测试报告 / 状态面板。
- rulepackage.com 砍掉/弱化:引擎源码主开发、NL2CGA 生成服务、完整用户/计费/admin、独立 IDE 创作入口。
- 通信方式:rulepackage.com 暴露
/api/v1/cga-corpus、/api/v1/omega/sync-to-cgajs、/api/v1/marketplace/assets;cgajs.com 暴露/api/v1/engine/run、/api/v1/geometry/compare、/api/v1/nl2cga/generate;引擎产物用 rsync,语料用 webhook + cron。
针对“哪台是主开发机、cgajs 同时改解析器是否冲突、能否在本机开发远端任务、宕机如何检测恢复、重启后如何恢复、记忆数据如何备份”等问题,输出了一份详细运维计划,待确认后开发。
- 角色:cgajs.com 是引擎主节点;rulepackage.com 是控制与资产主节点。没有唯一“主开发机”。
- 冲突避免:引擎源码只在 cgajs.com 写;CGA 资产只在 rulepackage.com 写;shared-memory 先 pull 再改。
- 远端开发:在本机通过
ssh -t root@8.216.94.109 'kimi -C'直接开发 cgajs.com 任务。 - 宕机检测:双机每分钟互相 ping HTTP/SSH,写入
shared-memory/health/;宕机时记录 incidents 并告警。 - 重启恢复:
/root/kimi-recover.sh重启 tunnel、拉取 shared-memory、备份并清理损坏的 Kimi wire。 - 备份:shared-memory git 三副本;数据库/ golden cases / Marketplace 文件 nightly rsync;Kimi 日志异地备份,但实时 wire 不同步。
当前两个站点都保留了 /omega.html 与 /omega-docs.html,但上传入口、golden case 存储与引擎对比的权威归属不同。以下是选型分析。
一、现状
| 维度 | rulepackage.com | cgajs.com |
|---|---|---|
| 上传入口 | ✅ 主要入口,/api/v1/omega/convert 接收 OBJ 并生成 golden JSON | ⚠️ 保留页面与历史报告,但非权威上传端 |
| golden case 存储 | ✅ 权威存储:/www/wwwroot/cgajs-engine/tests/golden/omega-uploads/<batch>/ | ⚠️ 仅有历史测试记录与本地缓存 |
| 批次完成通知 | ✅ 已新增 /api/v1/omega/batch/close,可通知 cgajs.com | ❌ 作为被通知方 |
| 引擎对比能力 | ⚠️ 需调用 cgajs.com /api/v1/engine/run 与 /geometry/compare | ✅ 引擎运行与几何对比权威 |
| 站点角色 | CGA 资产与测试标尺中心 | CGA 引擎与 AI 生成大脑 |
二、推荐结论
Omega 测试的主入口应放在 rulepackage.com,cgajs.com 的 Omega 页面建议退化为“只读报告看板”或直接 301 跳转。
三、理由
- 单一权威:golden case 的生成、命名、版本化、报告都在 rulepackage.com,避免 cgajs.com 也产生重复或冲突的 golden 数据。
- 架构定义:architecture-report 明确 rulepackage.com 负责 Omega 黄金测试体系,cgajs.com 负责引擎运行与几何对比。
- 闭环最短:rulepackage.com 完成批次后可通过 webhook 通知 cgajs.com;cgajs.com 拉取 golden cases 进入 CI 回归,流程自然。
- 用户心智清晰:创作者去 cgajs.com IDE 写规则,QA/测试人员去 rulepackage.com Omega 上传 OBJ 并验证。
- 避免双写风险:若两边都支持上传,同一 batch_id 可能在两台服务器产生不同目录,状态面板无法对账。
四、建议的后续动作
- cgajs.com
/omega.html移除上传 UI,改为只读报告/同步状态看板;或直接 301 到https://www.rulepackage.com/omega.html。 - cgajs.com 保留
/api/v1/omega/health、/reports用于监控,但关闭/convert写入能力(或仅内部调试使用)。 - rulepackage.com Omega 后端在对比环节优先调用 cgajs.com engine/compare;对比报告回写到 rulepackage.com。
一句话:上传 golden case 去 rulepackage.com,跑引擎对比与回归在 cgajs.com。
按“上传 golden case 去 rulepackage.com,跑引擎对比与回归在 cgajs.com”的架构建议,完成了双站 Omega 职责拆分与代码修复。
一、cgajs.com 侧调整
/omega.html已改为跳转页,自动跳转到https://www.rulepackage.com/omega.html,移除上传入口。/api/v1/omega/convert写入端点已禁用:环境变量OMEGA_UPLOAD_DISABLED=1已写入/etc/cgajs/cgajs-api.env,调用时返回 403 并提示前往 rulepackage.com。- 保留只读能力:
/api/v1/omega/health、/reports、/report/<batchId>、/sync-to-cgajs以及/run-test引擎对比端点均正常可用。
二、rulepackage.com 侧增强
- 新增
/api/v1/omega/run-test代理端点,将前端对比请求透明转发到 cgajs.com/api/v1/omega/run-test。 - 新增
/api/v1/omega/batch/run-test端点:读取本地 golden case,批量调用 cgajs.com 引擎执行engine/run + geometry/compare,返回每个 case 的对比结果。 /omega.html结果区新增“🔬 运行对比测试”按钮,点击即可对当前批次触发 cgajs.com 引擎对比。
三、验证结果
- ✅ cgajs.com
/api/v1/omega/convert返回 403,提示使用 rulepackage.com。 - ✅ rulepackage.com
/api/v1/omega/convert仍可正常上传 OBJ 并生成 golden JSON。 - ✅ rulepackage.com
/api/v1/omega/batch/run-test成功调用 cgajs.com 引擎并返回对比结果。
根据最新约定,建立并落地以下工作流:每次修改先备份网站;每次对话与任务写入 updata.html;需要站主亲自处理的任务写入 me.html;新增页面/子站点自动加入首页菜单或导航下拉。
一、已落地的机制
| 机制 | 实现方式 |
|---|---|
| 修改前备份 | 修改前打包 /www/wwwroot/www.*、cgajs-api、shared-memory 到 /root/*-premod-*.tgz |
| 记忆库更新 | 所有对话与任务在 /www/wwwroot/shared-memory/updata.html 追加卡片;通过 sync.sh 同步到双站 |
| 站主待办 | 新增 /me.html(共享内存),按类别归档需站主亲自决策/确认/补充资料/付费/协调/创作的任务 |
| 导航同步 | 双站首页与全局导航均新增 🧭 导航 下拉菜单,集中展示所有页面与子站点;新增页面/子站点时同步更新 site-nav.js 与首页内联菜单 |
| 缓存刷新 | site-nav.js 版本戳随内容变更升级(当前 v=3),避免浏览器缓存旧导航 |
二、me.html 已写入的待办任务
- ME-20260615-01 NL2CGA 独立服务形态决策(方案 A/B)
- ME-20260615-02 是否启动 Marketplace 元数据化改造
- ME-20260615-03 cgajs.com Marketplace 写入权威是否迁移到 rulepackage.com
- ME-20260615-04 确认 rulepackage.com → cgajs.com 实时同步的共享密钥
- ME-20260615-05 确认 parser ambiguity 警告的治理优先级
- ME-20260615-06 为 380 个 Marketplace UUID 文件提供/确认语义名与分类
三、导航菜单覆盖范围
- rulepackage.com:Omega、Marketplace、状态、站主待办、架构报告、灾备计划、更新日志;子站点 apihand/marketplace/pic/osm;cgajs.com 引擎入口。
- cgajs.com:IDE、CGA Library、NL2CGA、Omega、函数库、知识库、插件、文档、状态、架构报告、灾备计划、更新日志、站主待办、路线图;子站点 apihand/marketplace/pic(cgajs 与 rulepackage)。
访问地址:/me.html
对 cgajs.com 与 rulepackage.com 进行了全站 HTTP/API 健康检查、静态链接扫描、核心功能冒烟测试,修复了导航缺失问题,并完成整站备份。
一、检查范围
- 双站首页、IDE、NL2CGA、函数库、插件、管理后台、Omega、状态页、共享报告等核心页面。
- 关键 API:
/api/v1/health、/api/v1/status、/api/v1/parse、/api/v1/validate、/api/v1/compile、/api/v1/cga-corpus、/api/v1/marketplace、/api/v1/omega/*。 - 静态链接扫描:cgajs.com 394 个 URL,rulepackage.com 核心页面与归档跳转。
二、发现的问题
- cgajs.com 全局导航缺失:
site-nav.js与首页未链接共享的/architecture-report.html和/updata.html,用户难以找到架构报告与更新日志。 - cgajs.com 23 个页面引用旧版 site-nav.js?v=1:修改导航后可能导致浏览器缓存旧导航。
- cgajs.com /api/v1/marketplace/recent 端点不存在:但站点页面未引用该端点,不影响线上功能。
三、已执行的修复
- cgajs.com
assets/site-nav.js增加“🏛️ 架构报告”和“📋 更新日志”入口。 - cgajs.com
index.html顶部导航与页脚同步增加架构报告、更新日志链接。 - 将 cgajs.com 全站 23 处
site-nav.js?v=1统一升级为v=2,避免缓存旧导航。 - rulepackage.com Omega 批次完成后调用
/api/v1/omega/batch/close异步通知 cgajs.com(已在上一轮落地)。
四、验证结果
- ✅ cgajs.com 与 rulepackage.com 核心页面全部 200。
- ✅
/api/v1/parse、/api/v1/validate对简单 CGA 返回success: true。 - ✅ rulepackage.com
/api/v1/omega/convert与/api/v1/omega/batch/close正常工作。 - ✅ 双站
/api/v1/status引擎版本一致(1.3.2)。 - ✅ cgajs.com 首页与 site-nav.js 已出现“架构报告”“更新日志”链接。
五、备份清单
/root/rulepackage-www-postfix-20260615-191648.tgz(18 MB)/root/rulepackage-api-postfix-20260615-191648.tgz(100 MB)/root/shared-memory-postfix-20260615-191648.tgz(1.5 MB)- cgajs.com:
/root/cgajs-www-postfix-20260615-191707.tgz(17 MB)、/root/cgajs-api-postfix-20260615-191707.tgz(405 MB) - 数据库:rulepackage.com 已执行
backup-db.sh,dump 文件已异地同步到 cgajs.com。
cgajs.com 已完成 P0-P4 架构修复(引擎仓库干净、promote-to-prod、site-version 统一)。现在需要把 rulepackage.com 也精简到 architecture-report 定义的角色: CGA 资产与测试标尺中心。清理失去功能的菜单和页面,保留核心能力,确保稳定。
一、两站最终功能架构对比
| 功能域 | cgajs.com | rulepackage.com |
|---|---|---|
| 引擎 / 解析器 / Runtime | 权威源码、CI、dist-stable | 只读同步副本,仅用于测试 |
| IDE / 在线编辑器 | 权威入口 | 移除,跳转 cgajs.com/ide.html |
| NL2CGA AI 生成 | 权威服务 | 移除,跳转 cgajs.com/nl2cga.html |
| 函数库 / CGA 模板文档 | 权威文档 | 移除,跳转 cgajs.com/ku.html |
| 用户 / 鉴权 / 计费 / Admin | 权威体系 | 移除前端页面,API 保留但不再主动使用 |
| CGA 文件仓库 | 本地缓存(从 rulepackage.com 拉取) | 权威存储 + Marketplace 文件 |
| Omega 黄金测试 | 被调用方(engine/run/compare) | 权威上传入口 + golden case 存储 |
| 共享记忆 / 报告 | 承载 bare repo,消费页面 | 维护与展示 updata / architecture-report / disaster-recovery-plan |
| 跨站状态 / 监控 | 被监控方 | watchdog 发起方 + /status.html 仪表盘 |
二、需要清理的页面(归档到 /archive/,根目录放 301 跳转)
| 页面 | 原因 | 处理方式 |
|---|---|---|
| ide.html / IDEA.html / IDEB.html / IDEC.html | IDE 权威在 cgajs.com | 归档,根目录放跳转到 https://cgajs.com/ide.html 的页面 |
| nl2cga.html | NL2CGA 权威在 cgajs.com | 归档,根目录跳转 https://cgajs.com/nl2cga.html |
| ku.html / cga.html / cga-ku.html | 函数库/CGA模板文档权威在 cgajs.com | 归档,根目录跳转 https://cgajs.com/ku.html |
| plugin.html | 插件生态权威在 cgajs.com | 归档,根目录跳转 https://cgajs.com/plugin.html |
| auth.html / billing.html / profile.html / admin.html / admin-monitor.html | 用户/鉴权/计费/Admin 权威在 cgajs.com | 归档,根目录跳转 https://cgajs.com/auth.html 或对应后台 |
| help.html / study.html / timeline.html / roadmap.html / wenti.html / cityengine-ops.html | 过时或重复文档,角色不清 | 归档,根目录跳转 /updata.html 或 /architecture-report.html |
三、保留的核心页面
index.html:rulepackage.com 首页,说明自身角色(CGA 资产 / Omega 测试 / 跨站监控)。omega.html/omega-docs.html:Omega 上传与文档。status.html:跨站状态仪表盘。architecture-report.html/disaster-recovery-plan.html/updata.html:共享记忆与报告。404.html:保留,用于归档后的旧链接友好提示。
四、菜单精简方案
统一后的顶部菜单(site-nav.js + index.html inline nav):
🏠 首页 | 📤 Omega测试 | 🏪 Marketplace | 📊 状态 | 🏛️ 架构报告 | 🛡️ 容灾计划 | 📋 更新日志
五、首页 index.html 改造
- 标题改为:rulepackage.com — CGA 资产与测试中心。
- 副标题说明:这里是 CGA 文件权威仓库、Omega 黄金测试入口、双机共享记忆与状态监控中心。
- CTA 按钮:
📤 上传 OBJ 测试(→ /omega.html)、🏛️ 架构报告、📊 站点状态。 - 移除“打开 IDE”等指向 cgajs.com 功能的按钮,改为清晰的跳转说明。
六、Omega 与 cgajs.com 的进一步闭环
- 在
omega_routes.py批次处理完成后,调用 cgajs.com/api/v1/webhooks/rulepackage或/api/v1/omega/sync-to-cgajs,通知 cgajs.com 拉取 golden cases。 - 在 omega.html 增加提示:“需要创作/编辑 CGA?前往 cgajs.com IDE”。
七、稳定性保障措施
- 先备份:执行前把
/www/wwwroot/www.rulepackage.com打包到/root/rulepackage-www-backup-<date>.tgz。 - 先归档、后替换:旧页面移动到
/archive/,根目录放置<meta http-equiv="refresh">跳转页,不直接删除,便于回滚。 - 保留 API:不删除 cgajs-api 中的任何路由,避免 cgajs.com 调用失败;仅移除前端 HTML/菜单。
- 不改引擎源码:
/www/wwwroot/cgajs-engine/src保持只读。 - 验证清单:修改后 curl 检查 index/omega/status/architecture-report/updata 均 200;检查被清理页面返回 301/302 跳转。
八、实施顺序(建议)
| 阶段 | 任务 | 预计时间 |
|---|---|---|
| S1 | 备份 → 归档旧页面 → 根目录放跳转页 → 更新 site-nav.js 与 index.html 菜单 | 2h |
| S2 | 重写 index.html 首页文案与 CTA | 1h |
| S3 | status.html 接入 site-nav.js;Omega 批次完成 webhook | 2h |
| S4 | 全站链接验证 + 回滚预案确认 | 1h |
九、已执行记录
- 备份:已打包整站到
/root/rulepackage-www-backup-20260615-184616.tgz。 - 归档:ide/IDEA/IDEB/IDEC、nl2cga、ku/cga/cga-ku、plugin、auth/billing/profile/admin/admin-monitor、help/study/timeline/roadmap/wenti/cityengine-ops 已移至
/archive/。 - 跳转:上述页面在根目录保留 meta-refresh 跳转页;IDE/函数库/NL2CGA/插件/账户跳转 cgajs.com,其余跳转架构报告。
- 导航:
site-nav.js已精简为:首页 / Omega 测试 / Marketplace / 状态 / 架构报告 / 灾备计划 / 更新日志;index.html 与 status.html、omega.html、omega-docs.html 已同步引用 v=2。 - 首页:
index.html已重写为“CGA 资产与测试中心”,保留 Marketplace/Omega/状态/架构/灾备/更新日志入口。 - Omega 闭环:新增
/api/v1/omega/batch/close,批次转换完成后异步通知 cgajs.com;cgajs-api 已重启生效。 - 验证:核心页面全部 200;归档页面均含正确跳转目标;API 与 Omega 健康检查 200。
已按确认执行 P0-P2 全部任务,两站现在具备角色边界、冲突防护、故障检测与数据备份能力。
- P0 完成:双机 SSH 别名(
cga-ssh/cga-kimi/cga-test、rpk-ssh/rpk-kimi/rpk-test);rulepackage.com 上cgajs-engine/src只读标记 + pre-commit hook;/root/kimi-recover.sh双机部署;shared-tunnel.service健康运行。 - P1 完成:
watchdog.sh每分钟互 ping HTTP/SSH,写入shared-memory/health/*.json,连续 3 次失败写incidents.json与alerts.log,支持 webhook 告警配置。 - P2 完成:
backup-db.sh:每日 03:00 PostgreSQL dump,同步到对端。backup-files.sh:每日 02:30 同步 Omega golden cases / Marketplace 文件 / NL2CGA library。backup-kimi-logs.sh:每日 01:00 同步 Kimi CLI 日志到对端。
当前双机状态均为 overall_ok: true,备份目录已相互同步。下一步 P3:shared-memory 异地镜像 + 真实故障演练。
对 cgajs.com 进行了全面扫描:引擎测试全过(68 文件 / 1285 测试),但仓库有 448 条未提交变更;API 与 NL2CGA 端点已就绪,但版本号不一致、webhook 未打通、Omega 未主动拉取。
- P0:清理提交 cgajs-engine(删除备份目录、dist-beta,重建 dist-stable,分批 commit)。
- P1:新增
scripts/promote-to-prod.sh,统一两站引擎版本与site-version.json。 - P2:决策 NL2CGA 独立服务去留(压测内嵌端点后决定归档或启动)。
- P3:配置
RULEPACKAGE_WEBHOOK_SECRET,让 rulepackage.com 实时推送资产/Omega 事件到 cgajs.com。 - P4:CGA 语料自动索引,
CgaAsset表状态持续更新。 - P5:parser ambiguity 统计与治理,禁止新增二义性。
完整方案在 architecture-report.html 第 8 节:/architecture-report.html#cgajs-assessment
完成 CGA.js 引擎黄金标准对比测试前提出的 8 项修复计划,并同步升级 /omega.html 为批量上传工具,服务端自动保存成功 case、生成失败报告,方便后续 AI 修复。
一、引擎修复 8 项计划(全部完成)
- mirror / mirrorScope 负 scope 修复:翻转轴向并对尺寸取
Math.abs,消除负体积/负面积。 - geometry.* 硬编码常量修复:
area、volume、isPlanar、isRectangular、isConcave、isClosedSurface改为基于真实几何计算;hasTags改为布尔语义。 - primitive / extrude 轴向量同步修复:所有 primitive 与 extrude 操作后调用
updateAxisVectors(),避免缩放/旋转错位。 - copy 真复制修复:由共享引用改为返回
[shape, cloneShape(shape)]独立副本。 - utility 函数 SPEC 与矩阵测试补齐:覆盖
color、set、print、convert、reportError等。 - boolean 函数 SPEC 与矩阵测试补齐:覆盖
union、subtract、intersect、offset组合。 - setback 函数 SPEC 与矩阵测试补齐:覆盖凹多边形、退台大于尺寸、多边形孔洞等边界。
- SPEC / coverage-gap 文档同步更新:偏差与 TODO 已清理,并跑通全量测试。
二、Omega 工具 v3.2 升级
- 批量上传:支持一次拖拽/选择多个 OBJ,前端顺序调用
/api/v1/omega/convert。 - 文件名自动解析:
function_param1_param2_inputshape.obj自动识别函数、参数、输入形状。 - 8 种 footprint 预设:正方形、长方形、L 形、U 形、凹多边形、带孔洞、极小、极大。
- 服务端自动保存:成功 case 写入
/www/wwwroot/cgajs-engine/tests/golden/omega-uploads/<batch_id>/<case_id>/golden.json。 - 失败报告:同目录
report.json记录失败文件名与错误,支持/api/v1/omega/report/<batch_id>读取。 - 一键复制:结果区可直接复制“批次 ID”或“失败列表”给 AI,无需手动整理。
- 精度保证:OBJ 顶点原样保留;默认对比策略
bbox+vertex+ε=1e-4,忽略 UV 与 Scope 旋转差异。
测试结果:全量 672 passed / 1 skipped;typecheck、build、signature 一致性检查全部通过。
文档:omega-docs.html 已同步更新至 v3.2。
在 /cga.html 上线 CGA 模板在线编辑器,所有 NL2CGA 模板以真实 .cga 文件形式展示,支持在线修改、自动编译校验、备份与回滚。
- 全部模板文件化:20 个预建模板从
nl2cga_service.py迁出到nl2cga/prebuilt/*.cga,与 23 个参数化模板统一以文件为操作对象;PREBUILT_CGA_LIBRARY改为从manifest.json加载。 - 管理员写、公开读:新增
/api/v1/cga-library/*接口,列出/读取/保存/回滚模板;写操作需要管理员权限并记录审计日志。 - 保存即编译:保存前自动备份原文件,调用 cgajs-engine 编译;编译失败立即恢复原文件并返回错误,不会入库。
- 修改可追踪:每次保存生成
backups/cga/<slug>/<timestamp>.cga,提供 diff、回滚、改动列表与全量校验功能。 - 全量资产 43 个编译通过:运行
migrate_nl2cga_assets.py后,20 预建 + 23 参数化模板全部success。
/cga.html 现在支持浏览和编辑 NL2CGA CGA 架构图中的全部 CGA 文件,并增加页面级密码保护。
- 密码浏览:访问
cga.html需要输入密码316891(仅前端校验,会话期内免重复输入)。 - 接入架构图全量库:新增
nl2cga-service/library/**/*.cga来源,共 92 个 library 文件,与原有 43 个 NL2CGA 模板合计 135 个可编辑 CGA 文件。 - Library 编译支持 import:保存 library 文件时自动把整个
library/目录作为 workspace 传入引擎,使import "../../base/roof.cga"等相对路径正确解析。 - 多次修改与备份策略:同一文件可无限次保存,每次自动备份;每个 slug 仅保留最近 20 份备份,防止磁盘无限增长。
- 全量校验通过:
/api/v1/cga-library/verify-all对 135 个文件重新编译,全部success。
确定“模板优先 + 本地小模型兜底”的九个月商业化路线,并完成本周当务之急:修复 NL2CGA 管道 bug、建立模板自动编译流水线、扩展 20 个预建模板、建立基准报告、评估本地 Ollama 可行性。
- 修复
nl2cga_service.py:knowledge_context在模板引擎匹配失败分支使用前未定义,已提前初始化并保留模板引擎错误上下文供 LLM 参考。 - 模板自动编译校验流水线:新增
scripts/verify_nl2cga_assets.py,对cga_assets中所有 NL2CGA 资产批量编译并更新compile_status/nl2cga_ready;scripts/migrate_nl2cga_assets.py现在失败时返回非零退出码。 - 扩展 20 个 Tier 1 预建模板:新增 Mosque、Gothic Church、Modern Museum、Library、Gymnasium、Hospital、Hotel、Gas Station、Bus Stop;
cga_assets现有 29 个 NL2CGA 资产全部编译通过。 - 建立基准报告:新增
training/baseline_report.py,对 50 条 benchmark 跑模板匹配基线;当前模板覆盖率 16%(8/50),模板编译成功率 100%,报告保存为training/report-v1.json。 - 本地 AI 可行性评估:确认 E5-2670V2 + 32G 内存可运行 Qwen2.5-Coder-7B(Q4_K_M 约 4.7 GB);新增
docs/local-ai-setup.md与scripts/setup_local_ollama.sh。
roofHip 屋顶与地块轮廓不匹配
2026-06-13 22:48
旧版 roofHip 直接使用 footprint 的轴对齐包围盒生成矩形屋顶,导致非矩形地块(如五边形、L 形)屋顶与墙体错位。现已改为基于真实 footprint 生成屋顶。
- 矩形地块:自动检测实际四角,按真实长宽方向生成四坡屋顶,支持旋转矩形。
- 非矩形凸多边形:使用轮廓外扩(overhang)+ 中心尖顶生成贴合地块的金字塔式屋顶。
- 凹多边形 / 退化情况:回退到基于真实轮廓的金字塔屋顶,避免再生成错误的外接矩形。
- 全量引擎测试通过(440 passed),cgajs-engine 重新构建并重启 cgajs-api 服务。
按决策实施 P0+P1:建立 cga_assets 统一数据层,迁移并编译校验 NL2CGA 模板,改造服务优先读库;同步支持 Marketplace 分类字段与付费资产授权设计。
- P0 建表:新增
cga_assets、cga_category_mappings模型与迁移;cga_files增加marketplace_category,cga_purchases增加cga_asset_id。 - P1 迁移 NL2CGA 资产:20 个预构建 + 参数化模板全部写入
cga_assets,经引擎编译校验,全部nl2cga_ready=TRUE。 - 服务读库改造:
match_prebuilt_cga()与参数化模板引擎优先查询cga_assets,失败时回退内存库,不影响旧接口。 - Marketplace 分类同步:上传/发布接口新增
category字段;列表/Feed 支持?category=筛选;新上传文件自动镜像到cga_assets。 - 付费资产 NL2CGA 授权:新增
nl2cga_access_policy(free/purchase/subscription)与nl2cga_purchase_price;实现余额扣费 +cga_purchases记录的检查函数。 - 历史失败示例标记:后台任务正在批量编译 1077 个 Marketplace 文件,失败示例仅标记
compile_status='failed',不下架、不删除,便于人工审阅。
上线子站点 osm.rulepackage.com,用于验证 OpenStreetMap 属性通过 JSON 导入 CGA 后批量生成建筑模型。
- 提供 50 栋示例建筑数据(含 footprint、height、levels、building、wallColor)。
- CGA 编辑器升级为一体式 CodeMirror,支持行号、语法高亮、自动补全(与 IDE 同款能力)。
- 内置 Leaflet 地图:搜索城市、框选区域、范围 100m~1000m,通过 Overpass API 下载真实 OSM 建筑数据并自动执行 CGA 生成。
- 默认 CGA 使用
import "building.json" as b读取外部 JSON,支持attr height = b.height等字段绑定。 - 批量生成并发限制为 2,避免 2H8G 服务器过载;支持“仅测 5 栋”快速验证。
- 引擎 CLI / Worker 增加
workspace解析支持,使 JSON 导入在 API 调用中可用。 - API 域名白名单支持通配符
*.rulepackage.com,CORS 同时放行所有 rulepackage.com 子域。
在 updata.html 新增“NL2CGA 与 Marketplace CGA 资产统一方案”章节,提出建立 cga_assets 统一数据层 + 编译安全门的详细实施计划,待决策后执行。
- 统一 NL2CGA 预构建模板、参数化模板、Marketplace 示例三类资产。
- 通过
nl2cga_ready与编译校验隔离失败示例,防止污染 NL2CGA 解析与自然语言生成。 - 建议 NL2CGA 标签与 Marketplace 分类解耦,通过映射表关联。
- 给出 P0~P5 分阶段实施计划、风险应对与待决策事项。
在 updata.html 中新增“版本控制与网站修复发布流程”章节,明确引擎发版、前端热修、回滚方案、版本号记录与后续改进方向。
- 补充“引擎发版流程”与“前端/网站修复流程”两条可视化流水线。
- 明确当前生产环境无 CI/CD、无 git remote、无 staging,所有修改直接生效的风险与备份策略。
- 列出
EngineVersion、前端 git commit、nginx 配置、环境变量四类版本/配置的回滚依据。
本次对 www.rulepackage.com、marketplace.cgajs.com、apihand.cgajs.com 及引擎/NL2CGA 服务进行了静态扫描 + 人工抽查,共覆盖 376 个 HTML 文件。以下是详细检查报告与修复建议。
一、扫描统计
- 扫描 HTML 文件:376 个(含 309 个函数详情页
ku/*.html)。 - 确认死链 / 可疑链接:17 条(详见下文清单)。
- 同页重复 ID:1 处(
billing.html的qrcode-img)。 - JS 引用缺失 DOM ID:3 处(均为
billing.html动态创建的pay-jump-btn,静态分析误报,但逻辑上需警惕)。 - 未设置 viewport 的页面:350 个(主要是
ku/*.html与docs/*.html,移动端体验差)。 - 表单缺少 action:2 处(
auth.html登录/注册表单,实际由 JS 拦截,可接受但建议保留action="javascript:void(0)"兜底)。
二、菜单与导航不一致(P0)
全站没有统一的导航组件,导致每个页面入口不同,用户容易迷路。
- IDE 四件套菜单不统一:
ide.html/IDEA.html/IDEB.html:首页 / 🏪 CGA市场 / 🐛 报告问题。IDEC.html:首页 / 标准 IDE / 帮助。IDEA有 AI 切换按钮,IDEB没有;IDEC缺少用户下拉与发布入口。
- 公开页菜单互相“漏页”:
index.html链接到/docs/、/plugin.html、/roadmap.html,但ku.html、nl2cga.html、study.html都没同时覆盖这些入口。ku.html使用/timeline.html,而index.html使用/roadmap.html;两页内容高度重复。nl2cga.html的市场链接写成/marketplace.rulepackage.com/(相对路径 404),且缺少函数库、学习文档入口。study.html顶部导航只有 IDE / NL2CGA / Admin / GitHub;侧边栏才出现 Ku、Home。roadmap.html的市场链接同样是/marketplace.rulepackage.com/,且缺少 Updata。timeline.html有 Updata,但缺少 Study / Marketplace / Plugin。
- 用户中心/后台菜单断裂:
admin.html没有返回首页或监控页链接;监控看板卡片存在却不能跳转。admin-monitor.html只有 3 个入口(总览/监控/账单),账单还指向用户端/billing.html。profile.html/billing.html只互相链接 + IDE,缺少函数库/文档。auth.html没有任何站点导航。
- 子站点无统一导航:
marketplace.cgajs.com/index.html导航只有 IDE / Profile / Login,且依赖 nginx 重定向回www.rulepackage.com。apihand.cgajs.com/index.html完全没有跨站导航。
三、死链与路径错误(P0)
index.html:底部“文档”链接到/docs/,但该目录无index.html,会 404 或暴露目录列表。nl2cga.html、roadmap.html:/marketplace.rulepackage.com/是相对路径,应改为https://marketplace.rulepackage.com/。plugin.html:/pricing不存在,出现在 Pro 版购买与激活教程两处。marketplace.cgajs.com/index.html:/profile.html在子域名文件系统不存在,生产靠 nginx 跳转,但代码应显式写完整 URL。study.html:函数库速查表多处链接到不存在的/ku/scope.html、/ku/geometry.top.html、/ku/setTag.html(实际文件名为scope.*.html、geometry.top.html不存在、tag.html)。omega-docs.html:链接到/docs同样无index.html;正文还误写本地绝对路径/www/wwwroot/www.cgajs.com/omega-docs.html。index.html:GitHub 链接仍是占位https://github.com/yourname/cgajs-engine。cityengine-ops.html:页脚引用旧域名createurban.com。
四、JS 与交互逻辑问题(P1)
- IDE / 编辑器:
enhance.js仍按 CodeMirror 6 的.cm-content取值,但页面使用 CodeMirror 5,导致自动同步 inspector/API 导出失效。IDEA.html、IDEB.html调用cm.getSearchCursor(),但未加载 CodeMirror searchcursor addon,会抛异常。IDEC.html调用未暴露的window.__setWireframeMode与window.__ideEditor,相关按钮无响应。IDEA.html存在两个aiAutoFix定义,后者覆盖前者,导致侧边栏“自动修复当前代码”只是把错误复制到聊天框。- 功能诊断弹窗
#fd-modal-overlay及相关函数在所有 IDE 中均为死代码,无入口触发。
- 后台 / 权限(
admin.html):loadReleaseKanban()被定义两次,第二次覆盖第一次。renderReleaseCard()调用未定义的promoteProd()、rollbackVersion()。adminLogin()把 admin token 同时写入cgajs_token,污染用户 token 存储。logout()只清cgajs_admin_token,不清共享 cookie 与用户 token。- 多处深属性访问无空值保护(
u.balance.toFixed、sys.load.join、status.production.version)。 renderReleaseCard()把版本号/备份路径直接拼入onclick,若含单引号会破化事件处理器。
- 监控页(
admin-monitor.html):- 未登录时只更新状态栏,不跳
/auth.html。 renderEndpointStats()/renderAlerts()未转义输出,存在 XSS 风险。updateGauge()未对百分比做 0–100 截断。
- 未登录时只更新状态栏,不跳
- 充值页(
billing.html):- 同页存在两个
id="qrcode-img"(初始 img 与后续 innerHTML 插入)。 data.pay_url无效时直接return,导致支付状态文案与轮询未初始化。me.balance.toFixed(2)在 balance 缺失时会抛异常。
- 同页存在两个
- 其它:
omega.html:复制按钮在转换失败时也会显示“已复制”;大小写校验导致.OBJ被拒绝;失败分支假设后端返回 JSON。help.html:侧边栏全部使用href="#",前进/后退与 hash 定位体验差。apihand.cgajs.com/index.html:showPage(id)依赖内联事件的全局event,不标准。
五、样式与移动端问题(P1)
ku/*.html(309 个函数页)与docs/*.html全部缺少<meta name="viewport">,手机端无法阅读。docs/*.html使用浅色独立模板,与全站深色 GitHub 风格不统一,且无返回导航。ku/*.html页面间 CSS 变量与版式不一致(如--accent、max-width),说明非统一模板生成。nl2cga.html使用未定义 CSS 变量:--border-hover、--red、--yellow、--blue、--green、--text-secondary。study.html内联样式引用--fg-dim,但:root只定义了--fg-muted。study.html、marketplace.cgajs.com/index.html、apihand.cgajs.com/index.html缺少<link rel="icon">。
六、内容重复与数据不一致(P1)
roadmap.html与timeline.html内容高度重复,都包含 NL2CGA 开发计划时间线。nl2cga.html与study.html在架构、能力、路线图上大量重叠。study.html的“高频函数速查表”与ku.html职能重复。nl2cga.html:架构统计“83 文件 / 3,811 行”与列出的“92 文件 / ~3,656 行”不一致;目录名religious/、agricultural/与实际religious_monumental/、agricultural_rural/不一致。study.html:仍写“Beta 测试站已下线”,却又描述 Beta 构建流程;部署表写前端目录为/www/wwwroot/www.cgajs.com/,实际为/www/wwwroot/www.rulepackage.com/;Grammar 工作流步骤 8/9 重复npm run build。apihand.cgajs.com/index.html使用 Three.js r128 CDN,与引擎文档声明的three@0.164.1不一致。
七、子站点与域名问题(P1)
marketplace.cgajs.com/index.html实际通过 nginx 部署在marketplace.rulepackage.com,文件路径与域名不一致。apihand.cgajs.com/index.html同理部署在apihand.rulepackage.com。- Marketplace SPA 没有自己的 auth/profile 路由,完全依赖 nginx 重定向,SEO 与直接访问体验差。
八、修复建议(按优先级)
- 统一导航组件:抽取一个
site-nav.js/ 共用 header 片段,注入到所有页面;确保核心入口(IDE、函数库、NL2CGA、Marketplace、插件、文档、更新日志、管理后台)在每个页面都可到达。 - 修死链:
/docs/下补index.html(聚合 docs/*.html 与 Markdown),或把首页“文档”改为/study.html。- 所有 Marketplace 链接改为
https://marketplace.rulepackage.com/。 - 修正
study.html函数库速查表中的错误文件名。 plugin.html的/pricing改为/billing.html或创建 pricing 页。- 修正 GitHub 占位链接。
- 修复 IDE JS 兼容性问题:让
enhance.js同时支持 CodeMirror 5;补齐 CodeMirror searchcursor addon;清理IDEC中无效的全局调用;合并/移除aiAutoFix重复定义。 - 修复 admin 逻辑缺陷:移除重复函数定义、补充缺失的
promoteProd/rollbackVersion、隔离 admin/user token、logout 清理共享 cookie、对后端字段做空值保护。 - 修复充值/监控页:去重
qrcode-imgID、处理pay_url无效分支、修复 admin-monitor 的 XSS 与未登录跳转。 - 统一模板与 viewport:为
ku/*.html与docs/*.html统一生成模板并补 viewport;统一 docs 主题色;清理未定义 CSS 变量。 - 内容去重:合并
roadmap.html/timeline.html;让study.html专注于架构与开发指南,函数详情引流到ku.html;修正 nl2cga.html 的统计数字与目录名。 - 清理废弃页面:
cga-ku.html可被 301 到/ku.html;omega.html/omega-docs.html如已废弃建议加 deprecation banner 或下线。
九、附录:按页面问题速查
| 页面 | 主要问题 |
|---|---|
| ide.html / IDEA / IDEB / IDEC | 菜单不统一、CM5/CM6 混用、无效全局调用、死代码弹窗 |
| index.html | /docs/ 死链、GitHub 占位、菜单与其它页不一致 |
| ku.html / ku/* | 无统一 header、ku 页无 viewport、CSS 变量不一致 |
| nl2cga.html | 市场链接错误、缺失入口、数据不一致、未定义 CSS 变量 |
| study.html | 死链、--fg-dim 未定义、内容重复、路径错误 |
| updata.html | 导航仅覆盖自身锚点,缺少主要站点入口 |
| plugin.html | /pricing 死链、/ku.html 重复、菜单缺失 |
| roadmap.html / timeline.html | 内容重复、市场链接错误、菜单不一致 |
| admin.html | 重复函数定义、未定义按钮回调、token 污染、logout 不彻底 |
| admin-monitor.html | 未登录不跳转、XSS、gauge 越界、菜单断裂 |
| billing.html | 重复 ID、pay_url 无效分支、balance 空值风险 |
| profile.html / auth.html | 导航缺失、auth cookie 在 HTTP 环境无法写入 |
| marketplace.cgajs.com | 依赖 nginx 重定向、无自身 auth/profile 路由 |
| apihand.cgajs.com | 无跨站导航、showPage 依赖全局 event |
| omega.html / omega-docs.html | 体验/文案 bug、疑似废弃 |
- 问题:官方 CGA 示例中大量
setback、splitArea、splitAndSetbackPerimeter、offset、shapeL/U/O、modify、union/subtract/intersect的块语法(如{ front : A }、{ '0.2 : ColorMe })被解析为 StochasticBody,导致分支被忽略、失败用例增多。 - 根因:grammar 中
blockBody把'{' ruleBody '}'放在'{' paramBlockBranch ... '}'之前,ANTLR 在歧义时优先选择 stochastic 解释,AST 生成器因此产生 StochasticBody 而非 ParamBlockBody。 - 修复:在
evaluator.ts中新增normalizeBlockBody(),把 StochasticBody 转换为通用的 parameter-block 分支格式(2 段selector:body或 3 段length:depth:body),并在所有相关 block 操作中统一使用;splitArea/splitAndSetbackPerimeter的 repeat 模式因此正确执行。 - IDE 补全增强:把
cgaHint的列表项改为直接显示完整函数签名(如extrude(distance, [world.y])),并支持对签名内容模糊过滤;重新生成cga-autocomplete.js,升级cga-codemirror-mode.js?v=21/cga-autocomplete.js?v=15缓存戳,覆盖 ide.html / IDEA.html / IDEB.html / IDEC.html。 - 验证:
npm test440/441 通过(1 skipped),其中split-area与split-and-setback-perimeter两个重点失败用例已修复;npm run build零错误;dist-stable已重新同步。
- 1. git commit / deploy / 修改 dist-stable 的影响
git commit:仅把当前修改记录到本地仓库,不会直接影响线上;可随时git revert或切分支回滚,是最安全的操作。npm run build:生成dist/,这是最新构建产物,但生产环境默认加载的是dist-stable/,所以只改dist/不会立即影响用户。./scripts/deploy.sh prod/ 管理后台“发布到生产”:会把dist/同步到dist-stable/,同时同步前端文件(ide.html / enhance.js / ku.html 等),并可能触发 API worker 重启。这是真正影响线上用户的一步。- 修改
dist-stable/的风险:如果构建产物有隐藏 bug,所有通过 importmap 加载引擎的页面(IDE、Marketplace 预览、API)都会受影响,可能导致编译大面积失败。建议发布前确保npm test通过(当前仅剩 2 个已知旧基线失败),并做好全站备份。
- 2. 失败用例是否需要用新基线?
- 当前失败的
split-area和split-and-setback-perimeter是旧有实现缺陷,不是本次改动引入的回归。 - 不建议直接改成新基线:如果把它们标记为“通过”或从 CI 中移除,会掩盖真实几何算法缺口,后续 splitArea 的 repeat 分发、perimeter split 的 segment 索引等 bug 就不会再被监控。
- 影响:保持失败会阻止“零失败才能部署”的严格 CI 策略;建议的正确做法是继续修复底层算法,而不是降低测试标准。若短期内必须发布,可在部署脚本中明确列出这 2 个已知豁免项,而不是修改测试断言。
- 当前失败的
- 3. 为什么代码编辑器没有了自动补全功能?
- 根因:
assets/cga-codemirror-mode.js里的静态补全数组被清空,并计划从/cga-autocomplete.js提供的window.CGA_COMPLETIONS读取;但 mode 文件实际仍使用自己的空数组,没有引用window.CGA_COMPLETIONS。 - 叠加问题:mode 文件在 HTML 的
<head>中较早加载,而cga-autocomplete.js在页面底部加载,即使引用全局变量,mode 初始化时也拿不到数据。 - 修复:在
cgaHint里改为动态读取window.CGA_COMPLETIONS || [],不再依赖加载顺序;并把cga-codemirror-mode.js缓存戳从v=19升到v=20(ide.html / IDEA.html / IDEB.html / IDEC.html 全部更新)。 - 效果:542 条 CGA 函数/操作/关键字/注解补全恢复,支持带说明和参数占位符的 snippet 插入。
- 根因:
- 4. JSON 数据绑定 import 的具体用法与影响
- 语法:
import "https://api.example.com/building/123.json" as data // 或 import data: "./params.json" - 解析与绑定:引擎通过
importResolver或全局fetch拉取 JSON,解析成功后把整个对象写入初始 shape 的attributes,键名为 alias(上例即data)。 - 在 CGA 中使用:
attr height = data.height attr wallColor = data.materials.wall case data.zone == "commercial" : CommercialFacade else : ResidentialFacade - 典型场景:
- 从 GIS/ CityJSON / GeoJSON 批量读取地块属性驱动生成;
- 前端表单把用户参数 POST 到临时 JSON URL,再交给引擎编译;
- 风格库、材质配置、LOD 阈值等外部化,规则文件只保留逻辑。
- 影响:彻底把“数据”和“规则”解耦;规则可以通用化,同一份 CGA 加载不同 JSON 就能生成不同城市/地块/风格;也为 NL2CGA 从知识库注入参数打通了最后一段。
- 语法:
- 5. 远程/版本化 import(pkg:)的具体作用与表现
- 语法:
import "pkg:facade@v2.1" as facade import "pkg:roof-kit@latest/lib/roof.cga" as roofs - 解析规则:
pkg:id@version/path会被映射到{baseUrl}/api/pkg/{id}/{version}/{path};若省略 path 则默认index.cga;未指定 version 则默认latest。 - 递归加载:被 import 的 CGA 内部还可以继续
import其他模块,引擎会递归解析并合并到同一张 AST;同时支持 alias 命名空间(facade.Main)和原始名称兼容调用。 - 市场表现:
- Marketplace 不再只是“示例仓库”,而变成可版本化的模块 registry;
- 用户可以发布
屋顶库 v1.0、立面库 v2.1,其他规则按版本引用,避免“改一个库所有规则崩掉”; - 企业/团队可搭建私有 registry,
baseUrl指向内网地址,实现代码复用与权限隔离。
- 与 JSON import 结合:
import "pkg:building-config@v1" as cfg import "https://data.city/osm/parcel-42.json" as parcel Init --> extrude(parcel.height) color(cfg.wallColor) comp(f) { top: cfg.roofRule } - 影响:CGA.js 从“单文件脚本”升级到“模块化、版本化、数据驱动的规则生态”,与 CityEngine 桌面版相比形成 web 原生优势。
- 语法:
- 根因:
assets/cga-codemirror-mode.js里把静态补全数组清空后,cgaHint实际仍在使用自己的空数组,没有读取/cga-autocomplete.js注入的window.CGA_COMPLETIONS;同时 mode 文件在<head>中早于 autocomplete 文件加载,即便引用全局变量也拿不到数据。 - 修复:把
cgaHint改为运行时动态读取window.CGA_COMPLETIONS || [],不再依赖脚本加载顺序;542 条唯一补全项(函数/操作/关键字/注解)恢复,带说明与参数占位符。 - 缓存戳:
cga-codemirror-mode.js?v=19 → v=20(ide.html / IDEA.html / IDEB.html / IDEC.html 全部同步),cga-autocomplete.js?v=14保持不变。
- 为
LlmClient.chat()增加超时/网络、HTTP 5xx、限流以及“System is too busy”类错误的指数退避重试机制(最多 3 次),提升“连接测试”在高延迟或被限流场景下的成功率 - 增强响应体错误解析:对返回 200 但 body 含
error/code/message的异常响应进行识别,并将访问被拒绝类错误归类为LlmAuthError - Kimi Code API 要求请求方必须是受认可的 Coding Agent(Kimi CLI、Claude Code、Roo Code 等),因此保留
User-Agent: KimiCLI/1.5身份标识 - Kimi Code 当前模型只接受
temperature=1.0,代码已自动对kimi_codeprovider 强制使用该温度值 - 统一使用
requests.Session,改善连接复用 - 说明:Kimi Code 官方模型 ID 固定为
kimi-for-coding,后端会自动映射到最新版本(当前为 2.7),客户端无需修改 model 名称即可使用最新模型
- 清理冗余文件:删除网站根目录下的
*.bak.*与*.bak.latest备份文件;保留IDEA/IDEB/IDEC.html(help.html 仍引用这些 AI 方案入口) - 补齐函数文档:为缺失的 52 个函数/操作自动生成
/ku/*.html详情页(如geometry.*、primitivePyramid、copy、instance、scatter、setback、tag等) - 补全签名库:在
src/functions/signatures.ts中新增 57 条签名,覆盖 evaluator 已实现但此前缺失的操作与函数(如NIL、convexify、setback、geometry.*、len、print等) - 补充冒烟测试:新增
tests/e2e/operation-smoke.test.ts,覆盖 35 个此前缺少测试的操作(Transform 别名、几何清理、offset、setback、shapeL/U/O、copy、repeat、scatter 等) - 重新生成知识库:
grammar-knowledge.json已同步最新签名;引擎已重新构建并更新缓存戳至v=21 - 测试全绿:
407 passed | 1 skipped
- CityEngine Shape Recomposition 文档学习:完整学习官方 “Shape Recomposition: Essential Knowledge” 页面,提取 13 个 CGA 示例并全部通过回归测试
- 新增回归测试:
tests/e2e/shape-recomposition.test.ts覆盖inline(recompose)、modify、cleanupGeometry、roofHip、布尔运算等全部文档示例 - 函数库分类重构:
- 新增
recomposition分类:将modify、cleanupGeometry归入形状重组类别 - 将
inline、union、subtract、intersect统一归入boolean分类(Rule Inlining and Boolean 3D) - 为
cleanupGeometry补全签名描述与示例
- 新增
- 文档自动生成:重新运行
scripts/extract-grammar-docs.mjs,grammar-knowledge.json已同步最新分类与签名 - Marketplace 示例发布:13 个 CityEngine 形状重组示例已发布到 Marketplace(ID #1098 ~ #1110),标签
recomposition,inline,modify,cityengine-doc - print / report 输出可视化:CGA 中的
print(...)与report(...)输出现在会被收集并返回给 IDE,在 HUD 右下角新增 Console 面板实时显示 - Marketplace → IDE 联动修复:
ide.html现在自动读取?cga_id=参数并加载对应 CGA- Marketplace “在 IDE 中打开”链接修正为
https://www.rulepackage.com/ide.html?cga_id=...
- 缓存戳升级:引擎 importmap
v=18、ide-core.js?v=22、enhance.js?v=prod-1.3.4
- 函数实现度全景统计:ku.html 新增顶部统计面板,实时显示 294 已完成 / 15 部分完成 / 0 未实现,支持按状态筛选
- 新增数学函数:
log(x)自然对数、round(x)四舍五入 - 新增字符串函数:
search(string, substring)查找子串位置、strcasecmp(a, b)不区分大小写比较 - 新增数组/转换函数:
array(...)数组构造函数 - 新增颜色函数:
hsb(h, s, b)HSB 转 RGB、rgb(r, g, b)RGB 构造函数、colorConvert(color, from, to)颜色空间转换(支持 rgb↔hsb) - 新增 Asset 函数:
assetType(path)返回资源类型(image/model/unknown)、assetWidth/Height/Depth(path)返回资源尺寸 - 新增文件函数:
filePath(path)返回文件路径 - 新增拓扑查询函数:
topology.averageNormal(shape)返回平均法向量、topology.connectedFaces(shape)返回连通面组数 - 新增常量:
PI(3.14159...)、E(2.71828...),可在表达式中直接使用 - 新增 Operations:
repeat(n)重复形状 n 次、copy()复制当前形状、instance(name)创建命名实例 - Scope 属性全面支持:
scope.sx/sy/sz/tx/ty/tz/rx/ry/rz已可在表达式中访问 - 语法关键字状态修正:
attr/const/start/extension/style/import/version/case/else/conditional/stochastic/with-params标记为已实现(解析器层面支持) - 注解状态修正:
@Group/@Order/@Range/@Color/@Enum/@Hidden/@Locked/@Description/@Deprecated标记为已实现(解析器层面支持) - 部分实现函数状态更新:
convert标记为已实现(基础坐标转换) - ku.html 重构:从静态 HTML 改为从
ku-data.json动态加载,支持按完成状态筛选,顶部新增统计面板 - ku-data.json 数据更新:309 个函数全部录入,294 个已实现,15 个部分实现,0 个未实现
- 目录结构总览:
/www/wwwroot/nl2cga-service/library/下共 83 个 .cga 文件,总计 3,811 行,平均 46 行/文件 - 第一层:总调度入口:
main.cga(250行)— 解析buildingType + buildingStyle双维度路由,通过case分支调用对应分类的Generate()规则 - 第二层:全局配置层:
config/目录含 3 个文件 —global_params.cga(全局参数/属性默认值)、lod_settings.cga(Lod0~Lod3 分级阈值)、style_mapping.cga(风格编码 → CGA 分类映射表,112行) - 第三层:基础组件层:
base/目录含 6 个文件 —roof.cga(5种屋顶+LOD分级,45行)、facade.cga(窗框/门廊+LOD分级,48行)、material.cga(PBR材质/纹理映射,44行)、structure.cga(柱网/梁架,35行)、decoration.cga(雕花/瓦片,35行)、utils.cga(工具函数,21行) - 第四层:分类建筑层:8 大分类共 73 个文件 — residential 居住(33个) / commercial 商业(8个) / industrial 工业(7个) / public 公共(6个) / religious_monumental 宗教纪念(8个) / transportation 交通(7个) / agricultural_rural 农业乡村(4个) / special 特殊(4个)。每个分类暴露统一接口
Generate(floorCount, lod) - 第五层:示例与扩展:
examples/(3个场景:中式村落/欧洲城市/现代街区)+custom/(2个用户自定义风格预留接口) - 数据流:用户输入 → 意图识别 → main.cga 调度 → import config + base → 分类 Generate() → 调用 roof/facade/material/structure/decoration → 引擎编译器 → Three.js BufferGeometry → GLB/OBJ/JSON 输出
- 架构设计原则:分层解耦 / 统一接口 / LOD 分级 / import 链完整 / 风格映射 / 用户扩展隔离
- 现状与改进:平均 46 行/文件偏薄(框架代码为主),计划提升至 100+ 行(补充 LOD L2 细部);base 层计划新增 lighting.cga(光照系统)和 terrain.cga(地形适配);config 层计划新增 climate_config.cga(气候带)和 era_config.cga(时代配置)
- 详细文档:
/www/wwwroot/www.rulepackage.com/docs/NL2CGA-CGA-LIBRARY-ARCHITECTURE.md(20KB,含完整目录树、层次图、数据流图、行数统计表)
- 引擎函数库深度诊断:基于 CityEngine 2025.1 官方文档与当前代码库(177+ 内置函数 / 80+ 几何操作)全面对比,识别出 8 个 P0 必须实现、10 个 P1 重要缺失、6 个 P2 中期增强 函数/操作
- P0 核心缺失:
inset(多边形内偏移)、setPivotMatrix(矩阵级 pivot 控制)、writeTextFile/writeFloatTable/writeStringTable(文件写出)、geometry.angle/du/dv/uMin/uMax/vMin/vMax(修复硬编码返回值)等 - P1 重要缺失:
trim(当前 no-op)、convexify(仅 2D)、alignScopeToGeometry(归零简化)、insert/i(仅 stub)、asset*Sort*(伪排序)、convert(no-op)等 - 解析器改进:补齐
StyleDecl/ExtensionDef/ImportDecl的 AST→Evaluator 链路;增加strictMode错误恢复;修复多维索引 ragged array 支持;Lexer 增加\n/\t/\uXXXX转义 - 测试覆盖补强:当前仅 ~28 个函数有测试,~140+ 个无测试。计划分五阶段补测:Math/String/Array/Color(2周)→ Geometry Query(2周)→ File I/O(1周)→ Context(1周)→ Roof 家族(1周)
- NL2CGA 诊断:Tier 1 预建模板 11 个(无参数化)、Tier 2 参数化模板仅 9 个(全部中国古建)、知识库实体仅 8 个(全部中国宫殿)、CGA 资产库 60+ 文件但平均仅 30 行、意图识别纯关键词匹配无语义
- NL2CGA 六阶段提升方案:
- Phase 1:参数化模板从 9→50+,覆盖全球主要建筑风格(中国/伊斯兰/哥特/巴洛克/现代/装饰艺术/日式/印度/非洲/基础设施/景观)
- Phase 2:Tier 1 预建模板增强参数化,新增清真寺/哥特教堂/现代文化馆
- Phase 3:知识库实体从 8→50+,覆盖全球标志性建筑
- Phase 4:意图识别升级 Embedding 语义匹配(BGE / text-embedding-3-small)
- Phase 5:修复规则从 10→30+,覆盖语义错误(roof 参数、comp 选择器、case 穷尽性等)
- Phase 6:AST 直接生成(绕过文本 parse,零语法错误)
- 关键 KPI:引擎测试覆盖率 15%→85%;NL2CGA Tier 3 首次编译成功率 40-60%→70-85%;修复后成功率 60-75%→85-95%;引擎与 CityEngine 兼容度 25%→55%
- 详细报告:
/www/wwwroot/www.rulepackage.com/docs/CGAJS-ENGINE-NL2CGA-ROADMAP.md(19KB 完整方案)
- 备份目录:
/root/backups/cgajs_prod_20260611_043125 - 备份大小:636 MB,共 29,435 个文件
- 备份内容:
- 前端
www.rulepackage.com(IDE、首页、文档、管理后台等全部静态文件) - API 后端
cgajs-api(FastAPI 路由、模型、服务、配置、训练数据) - 引擎
cgajs-engine(TypeScript 源码、dist/dist-stable 构建产物、测试) - 子站点(Marketplace / 图床 pic / API文档 apihand / NL2CGA服务 / cgajs-project)
- Nginx 配置(sites-enabled / conf.d / nginx.conf)
- SSL 证书(Let's Encrypt + panel 证书)
- systemd 服务配置(cgajs-api.service 等)
- 前端
- 备份习惯:每次重大修改前执行全站备份,保留历史快照,支持随时回滚
- 愿景:让程序化的力量重塑三维世界 —— 从单体建筑到完整城市,从静态模型到动态生态系统,成为生成式 3D 时代的核心基础设施
- Phase 1 — 引擎夯实期(2026 Q3,7~9月)
- Boolean CSG 替换:引入
three-bvh-csg或manifold实现真正的网格布尔运算(开窗、阳台切割不再出错) - Split 非 Box 裁剪完善:实现基于几何包围盒的局部坐标裁剪,旋转/复杂网格的 split 结果精确
- Instance 实例化实现:scene-builder 中检测同材质+同几何,使用
THREE.InstancedMesh降低 Draw Call - 模板引擎扩展至 50 个:覆盖全球主要建筑风格(哥特式/巴洛克/日式/伊斯兰/现代主义等)
- AST 直接组装:跳过文本 parse 阶段,Python 层直接组装 AST 节点调用引擎,速度提升 10 倍
- 构件库建立:柱/梁/窗/门/屋顶/栏杆等标准构件,支持组合式生成
- Import 跨文件支持:引擎层实现
import加载器,模块化 CGA 开发 - IDE 实时预览:
requestAnimationFrame循环 +Stats.js+ OrbitControls 相机控制 - 目标:编译成功率 >95%,模板生成延迟 <500ms
- Boolean CSG 替换:引入
- Phase 2 — 城市级生成(2026 Q4,10~12月)
- LOD 四级系统:Lod0~Lod3 在 CGA 层和渲染层同时实现,根据相机距离自动切换
- 道路网络生成:L-System 道路生长算法,主干道/次干道/支路三级网络
- 地块划分:Voronoi 图 + 用地类型(住宅/商业/工业/绿化/公共服务)
- 建筑批量生成:根据用地类型自动选择 CGA 规则模板,批量参数化生成
- 植被填充:Scatter 操作 + 气候带植被库(热带/温带/寒带/沙漠)
- 地形适配:Perlin Noise 地形生成,建筑自动贴合地形坡度
- 水体系统:河流/湖泊/海洋生成,支持水面反射和波浪动画
- 材质图集:自动打包纹理为图集,Draw Call 从数百降至个位数
- 目标:场景规模从单体建筑扩展至 城市街区(~500万三角面)
- Phase 3 — 智能模拟(2027 Q1,1~3月)
- 多智能体城市模拟:居民 Agent(行为树驱动工作/居住/购物/娱乐)、车辆 Agent(A*路径规划+流量模拟)、建筑 Agent(能耗/寿命/维护状态)
- 时间系统:昼夜循环(光照/阴影/建筑灯光自动开关)、四季变化(植被/天气/人群)
- 天气系统:晴/雨/雪/雾,影响光照、材质、交通流量
- 事件系统:自然灾害(地震/洪水)、政策变化( zoning 调整)、经济波动
- 城市演化:建筑老化→拆除→重建,城市形态随时间自然演变
- 资产管道完善:OBJ/GLB/FBX 导入,外部模型与 CGA 生成几何融合
- PBR 材质库:200+ 预设材质,支持自定义导入和实时编辑
- 目标:场景规模 完整城市(~1000万三角面),支持实时模拟
- Phase 4 — AI 深度融合(2027 Q2,4~6月)
- NeRF 照片重建:用户上传建筑照片 → NeRF 重建 3D 模型 → 自动提取 CGA 规则参数
- 风格迁移:将实景建筑照片风格迁移到 CGA 生成模型,一键统一城市风格
- 虚实融合:NeRF 实景背景 + CGA 程序化前景,数字孪生基础
- 自进化引擎:LLM 根据需求描述自动生成缺失的 CGA 函数实现,语法自动扩展
- 自动性能优化:编译结果自动分析瓶颈 → 生成优化建议 → 自动应用
- 训练数据自动化:每日自动从成功案例导出训练数据,触发增量 LoRA 微调
- 目标:NL2CGA 编译成功率 >98%,无人干预的引擎自动进化
- Phase 5 — 元宇宙(2027 Q3~Q4,7~12月)
- WebXR 支持:VR/AR 模式下沉浸式浏览生成场景,手柄交互编辑
- WebGPU 渲染:从 WebGL 迁移至 WebGPU,性能提升 3~5 倍,支持 ~5000万三角面
- 实时协作:多用户同时编辑同一场景,WebSocket 同步,冲突自动合并
- 数字孪生:对接 IoT 传感器数据(温度/人流/能耗),实时更新建筑状态
- 区块链资产:CGA 规则作为 NFT,交易市场支持版权追踪和收益分配
- 云端渲染:复杂场景云端光追渲染,前端流式传输
- UGC 生态:用户创作 CGA 规则 → Marketplace 交易 → 游戏/影视/城市规划使用
- 目标:构建完整的 程序化 3D 元宇宙 生态
- 关键技术指标演进
指标 当前 Phase 1 Phase 2 Phase 3 Phase 5 编译成功率 ~85% >95% >95% >95% >98% 生成延迟 3~5s <500ms <1s <1s <500ms 场景规模 单体建筑 单体建筑 城市街区 完整城市 元宇宙城市 三角面数 ~50万 ~100万 ~500万 ~1000万 ~5000万 FPS ~30 ~60 ~30 ~30 ~60 (WebGPU) 自动化 人工驱动 半自动 自动 智能 自治 - 详细报告:完整架构分析 + 发展规划已保存至
/www/wwwroot/www.rulepackage.com/docs/CGAJS-ARCHITECTURE-REPORT.md
- 顶部导航清理:移除失效的「函数库」和「知识库」导航链接,当前仅保留「首页」「CGA 市场」「报告问题」三个入口
- CGA 市场从下拉改为模态窗口:点击「🏪 CGA 市场」按钮后弹出居中模态窗口(而非顶部下拉面板),含搜索框 + 结果列表 + 前往 Marketplace 链接,点击外部或 × 关闭
- 编辑器/AI/市场三独立:编辑器保持中间左侧、AI 生成保持右侧边栏、CGA 市场为独立弹窗,三者不再挤在同一个标签面板内
- 检查器移除 LotSize:Inspector 面板去掉「地块尺寸 (Lot Size)」区块(含 X/Z 滑块和 10m/50m/100m 预设按钮),该功能已由
@LotSize自声明机制替代 - 缓存清除:
inspector-enhance.js版本号从v=prod-1.3.2升级到v=prod-1.3.3,强制浏览器加载最新版本 - 备份:ide.html / enhance.js / inspector-enhance.js 均已备份(时间戳 1781122073)
- 8 大建筑分类,92 个 .cga 文件:
- base/ 6 个 — 屋顶/立面/结构/材质/装饰/工具(LOD 集中控制层)
- config/ 3 个 — 全局参数 / LOD 设置 / 风格映射常量表(共 60+ 常量)
- residential/ 33 个 — 亚洲传统(5) + 欧洲传统(10) + 美洲传统(8) + 现代当代(10)
- public/ 6 个 — 教育/医疗/文化/体育/会展/行政
- commercial/ 8 个 — 零售(3) + 酒店度假(2) + 餐饮/金融/服务
- industrial/ 7 个 — 重工业/轻工业/高新技术/仓库/物流/堆场/能源
- transportation/ 7 个 — 公路/铁路/地铁/停车/桥梁/港口/机场
- religious_monumental/ 8 个 — 基督教/伊斯兰教/佛教/道教/印度教/犹太教/锡克教/纪念性
- agricultural_rural/ 4 个 — 种植/养殖/加工/乡村公共
- special/ 4 个 — 军事/娱乐/应急/市政
- custom/ 2 个 — 用户自定义风格占位
- examples/ 3 个 — 中式村落/欧洲街区/现代商务区
- main.cga 总调度入口(248 行):按
buildingType + buildingStyle自动路由到对应分类规则,统一对外接口Generate(floorCount, lod) - LOD 集中控制设计:L0/L1/L2 三级精度仅在
base/roof.cga和base/facade.cga中实现,上层分类规则只覆盖风格参数(roofAngle / wallColor / windowWidth),不写 LOD 逻辑 - 风格参数化:每个 .cga 文件顶部定义
attr风格参数,支持前端 UI 动态调整或 GIS 批量导入 - 关键发现:引擎 evaluator 当前不支持 import 跨文件规则调用(parser 已解析 import 声明,但 evaluator 未加载被 import 的文件)。短期通过 NL2CGA Python 层内联组装解决,中期需在引擎层实现 import 加载器
- 代码位置:
/www/wwwroot/nl2cga-service/library/
- 三层生成架构:
- Layer 1 模板引擎:常见建筑直接匹配模板,AST 组装生成,0轮LLM调用,精度100%
- Layer 2 结构化组装(未来):从构件库组合,跳过文本parse阶段
- Layer 3 LLM辅助:创意建筑兜底,Prompt注入白名单函数约束
- 5个参数化模板:
- 太和殿(重檐庑殿顶)— 11个参数:面阔/进深/坡度/柱网/颜色
- 天安门(重檐歇山顶)— 6个参数
- 六角亭(攒尖顶)— 5个参数
- 牌坊(牌楼)— 5个参数
- 城墙 — 4个参数
- 编译验证闭环:生成 → 编译 → 错误 → 自动修复 → 再验证,最多3轮
- NL2CGA 集成:用户说"生成太和殿" → 模板引擎匹配 → 0ms生成 → 编译通过 → 输出代码,不经过LLM
- 速度对比:模板引擎 100ms vs LLM 3-5s,快30-50倍
- 代码位置:
/www/wwwroot/cgajs-api/nl2cga/template_engine/
- 去掉手动调节:移除 Inspector 地块尺寸滑块,用户不再需要手动猜地块大小
- CGA 自声明机制:代码第一行添加
# @LotSize(宽, 深),IDE 编译前自动解析并设置初始 shape - 示例已更新:所有标准示例均加入
@LotSize声明- 柱子/柱础 →
@LotSize(2, 2) - 斗拱 →
@LotSize(3, 3) - 庑殿顶/歇山顶 →
@LotSize(17, 13) - 太和殿 →
@LotSize(64, 37)
- 柱子/柱础 →
- NL2CGA 自动生成:Prompt 已更新,LLM 生成时会根据建筑实体库的
recommended_lot自动加入@LotSize - 向后兼容:没有
@LotSize的代码仍使用默认 10×10m 地块
- union 去重优化:合并几何时启用顶点焊接(tolerance=0.001),消除重复顶点,减少面数
- subtract 精确化:从重心测试升级为顶点级包围盒测试(全部在内→剔除/全部在外→保留/部分重叠→保留),大幅减少误删
- intersect 保持:Sutherland-Hodgman 多边形裁剪,精度中等,已满足基本需求
- inline 支持:append(默认)/ unify / recompose 三种合并策略
- 5个标准古建示例已发布到 CGA 市场:
- #1084 标准柱子 — 圆柱+方形柱础,参数化柱高/柱径/颜色
- #1085 标准柱础 — 方形底座+圆形鼓镜+方形覆盆三层
- #1086 标准斗拱 — 坐斗+三层交错出跳拱+散斗
- #1087 重檐庑殿顶 — 四坡五脊,下檐+上檐两层 roofHip
- #1088 重檐歇山顶 — 四面坡+山面三角形山花
- 示例代码位置:
/www/wwwroot/www.cgajs.com/assets/examples-standard/(01-column.cga ~ 05-gable-roof-double.cga) - 稳定性:npm test 19/19 文件通过,374/374 测试通过
- 地块尺寸控制面板:IDE Inspector 面板新增"地块尺寸(Lot Size)"区域,含 X/Z 方向滑块(5-200m)和 10m/50m/100m 一键预设按钮。调节后自动触发重新编译
- 默认地块扩展:原
createScope(0,0,0,0,0,0,10,1,10)(10×10m)改为通过window.__lotSize全局变量控制,支持任意尺寸地块 - 太和殿地块适配:CGA 代码中加入
scale_factor = min(scope.sx/64, scope.sz/37, 1.0)自动缩放,小地块也能生成比例正确的太和殿(但会提示"效果会失真") - 建筑实体库地块要求:8个实体均加入
min_lot_size和recommended_lot。太和殿:最小 50m×30m,推荐 64m×37m - NL2CGA Prompt 注入地块警告:知识检索器现在输出 "⚠ 重要:太和殿需要至少 50m × 30m 的地块,否则柱网比例会失真",大模型生成时会被告知地块要求
- 文件位置:
- 完整LOD版:
https://rulepackage.com/assets/private-examples/taihe-palace-lod.cga - 简化适配版:
https://rulepackage.com/assets/private-examples/taihe-palace-lod-minimal.cga(294行,含LOD+地块缩放)
- 完整LOD版:
- 太和殿面数预估:高精度(Lod3)约 146万三角面,远超引擎50万面流畅阈值。瓦片占55.9%(91万面)、斗拱占25.5%(42万面)是两大瓶颈
- LOD四级精度体系:
- Lod0 极远鸟瞰:~4.7万面,方块柱+纯色屋顶,Draw Call ~47
- Lod1 城市级:~14万面,6面柱+贴图瓦片,Draw Call ~142
- Lod2 街区级:~75万面,10面柱+简化瓦片,Draw Call ~751
- Lod3 特写级:~146万面,16面柱+完整瓦片+斗拱,Draw Call ~1,458
- CGA层LOD控制:
taihe-palace-lod.cga新增@Enum("Lod0","Lod1","Lod2","Lod3") attr lodstep,通过column_facenum/tile_density/has_dougong等LOD驱动常量,在代码层面控制几何精度 - 渲染器FPS监控:
ide-core.js?v=19新增性能面板(左上角),实时显示:- FPS 帧率
- Mesh 数量
- 三角面数(K为单位)
- 当前LOD级别
- 自动建议(⚠ FPS<25持续3秒建议降级 / ▲ FPS>50持续5秒建议升级)
- 自动LOD逻辑:渲染器每帧统计FPS,维护10秒历史窗口。低FPS持续触发降级建议,高FPS持续触发升级建议,用户可在Attributes面板手动调整
lodstep参数 - 面数瓶颈分析:瓦片随机颜色(
rand())导致无法按材质合并Mesh,是Draw Call飙升的主因。Lod1用贴图替代几何瓦片可解决此问题 - LOD模板:
lod-control-template.cga提供通用LOD控制代码片段,可复制到任意建筑CGA中使用
- NL2CGA增强架构:从"直接丢给大模型"升级为"意图识别 → 知识检索 → Prompt注入 → 大模型生成 → 编译器验证"五级流水线
- 意图识别器:
intent_router.py支持5类意图:generic(通用)/ entity(建筑实体)/ pattern(CGA模式)/ fix(报错修复)/ explain(解释询问)。实体关键词覆盖太和殿/角楼/千秋亭/保和殿/中和殿/紫禁城/城墙/瓦片等 - 知识检索器:
knowledge_retriever.py检索3层知识库:- 建筑实体库(8个实体:柱网比例、屋顶层数、关键函数、推荐参数)
- CGA模式库(11大模式:柱网/重檐/歇山/斗拱/F形网格等)
- RAG向量索引(361代码片段,本地TF-IDF检索)
- Prompt组装器:
prompt_assembler.py自动将检索到的实体信息、模式模板、RAG代码片段注入System Prompt,大模型生成时拥有"太和殿是67×31柱网、三层roofHip嵌套"等精确知识 - API集成:
nl2cga_service.py在RAG检索后新增步骤2.5(私有知识库检索),已集成到POST /api/v1/nl2cga/generate主流程,语法验证通过 - 建筑实体库:
building-entities.json定义8个实体:- 太和殿(67×31柱网,重檐庑殿顶,3层屋顶)
- 角楼(F形十字布局,十字脊重檐)
- 千秋亭(圆形攒尖顶,递归屋顶)
- 保和殿(53×25柱网,歇山顶,LOD四级)
- 中和殿(31×31柱网,攒尖顶,斗拱系统)
- 宫殿城市布局(setback+splitArea+innerRectangle)
- 城墙系统(墙垛+城门楼+马道)
- 瓦片系统(高精度瓦片+随机颜色)
- 注释与知识库更新机制:
- ✅ 注释越清楚,RAG检索准确率越高(注释是TF-IDF检索的核心文本)
- ⚠️ 当前不会自动更新:RAG索引是静态文件,代码内容相同但注释更新后,需要手动运行
build_rag_index.py重建索引 - 📝 建议流程:更新注释 → 运行重建脚本 → 验证新索引包含新注释
- 效果示例:用户说"生成太和殿" → 意图识别为ENTITY → 检索到"67×31柱网、base_roof_angle=27、三层roofHip" → Prompt注入 → 大模型生成精确代码
- 解析层:evaluator.ts 中 94 个唯一 simple operation(103 个 case label,含 9 组大小写别名)全部有实现或别名映射,无空占位
- 内置函数层:builtins.ts + 12 类插件共注册 163 个 built-in 函数(math 29、asset 22、string 20、array 17、list 16、color 15、file 13、context 9、conversion 9、misc 7、probability 2 等)
- 测试通过率:
- 函数契约测试 64/64 通过,100%(A级 12/12、B级 27/27、C级 25/25)
- 函数基础审计 82/82 通过,100%(0 parse failed、0 runtime crashed)
- 核心选择器:comp() 支持 8 个选择器 —
fevfefvgmhtop - 全功能可用函数(约 60+):extrude、s/t/r、translate/scale/rotate、rotateScope、center、mirror、primitiveCube/Sphere/Cylinder/Cone/Disk/Quad/Pyramid、roofGable/Hip/Pyramid/Ridge/Shed/Radial/Dutch/Gambrel/HalfHip/Round、comp(f/e/v/fe/fv/g/m/h/top)、split、setback、setbackPerEdge、setbackToArea、innerRectangle、splitAndSetbackPerimeter、color、texture、setupProjection、projectUV、rotateUV/scaleUV/translateUV/tileUV/deleteUV/normalizeUV/copyUV、tag/untag/label、union/subtract/intersect、print/report/assert 等
- 部分实现 / 简化函数(约 15~20):
insert/i:有解析分发,但未完整接入 OBJ/gltf 资产加载管线scatter/search:基础 case 存在,算法较简化shapeL/shapeU/shapeO/modify/offset/envelope:有实现,但与 CityEngine 完整行为存在差距geometry.*部分属性:isConcave/nHoles/isPlanar/hasTags 等多为 fallback 默认值,未做真实几何分析
- 与 CityEngine 对比:CityEngine 约 200+ operations + 150+ functions;当前核心建筑生成能力(extrude/split/comp/roof/transform/material)覆盖度约 70~80%,全功能可用率约 30%,解析覆盖率约 45%
- 结论:常用建筑生成函数基本齐全,可支撑 NL2CGA 生成标准中式/现代建筑;资产插入、高级几何修改、上下文感知、LOD/报告类函数仍是后续重点补齐方向
- CityEngine 文档爬取:成功获取 220 个官方文档页面列表,对比分析后确认核心函数覆盖率 > 95%
- 新增 isnull 函数:空值检查函数
isnull(value)→ 1/0,注册于 builtins.ts - 新增 10 个函数别名:projectUv/rotateUv/scaleUv/tileUv/translateUv/deleteUv/insertAlongUv/alignScopeToGeometryBox/normalizeUv/copyUv → 对应驼峰命名,兼容 CityEngine 大小写不敏感风格
- Marketplace 批量发布:18 个新 CGA 示例(ID #1066~#1083),含纹理 UV 操作、primitives、transformations、shapeU、roofs、materials、offset、stochastic、repeat 等教程
- 引擎构建:npm run build 零错误,dist 已同步到 dist-stable,ide.html importmap v=18
- 全站备份:351MB 完整备份(含 PostgreSQL dump 1.6MB + SQLite + SSL 证书 + Nginx 配置 + systemd)
- 性能检测:API 响应 50-100ms,内存 46-108MB,磁盘 42%,并发 20 请求 ~1s/次,无异常日志
- 新增 14 个 CityEngine 兼容函数:assert(condition, msg)、flatten(y)、geometry.area、geometry.volume、geometry.height、geometry.boundaryLength、geometry.nFaces、geometry.nEdges、geometry.nVertices、geometry.isPlanar、geometry.isRectangular、geometry.hasTags、geometry.hasUVs
- Marketplace 新发布:ID #1065「CityEngine 官方风格商业大厦 (10层)」— 展示 assert + geometry.area + 完整 split(y) 楼层分割
- 本地贴图上传功能:✅ 已完成 — Attributes 面板 texture() 参数旁添加 📤 上传按钮,支持点击选择和拖拽上传,上传后自动替换 CodeMirror 中的 URL
- 根因:
computeMergedFaceScope使用最长边界边作为 xAxis。建筑侧面最长边是高度(120),导致comp(f)后 scope.x = 高度、scope.y = 长度/宽度 - 后果:用户写
split(y)期望沿高度分楼层,实际沿水平方向分割;setupProjection(0, scope.xy)投影平面错误 → 两个对面贴图正确、另两个对面拉伸 - 修复:垂直面(法向量接近水平)优先使用世界水平方向(x/z 轴)作为 xAxis,yAxis 保持垂直方向。所有侧面 scope.y = 高度,
split(y)统一沿高度分割 - 验证:npm test 374/374 全过,已部署 dist-stable?v=5
- 贴图透明/不显示修复:scene-builder.ts 中
setIndex(Float32BufferAttribute)→setIndex(Uint32BufferAttribute),index buffer 类型错误导致三角面索引解析失败,面片错乱/消失 - 纹理颜色空间修复:ide-core.js 添加
renderer.outputColorSpace = THREE.SRGBColorSpace,纹理颜色从暗淡恢复为正常 - SSL 统一证书:rulepackage-com-unified 证书覆盖 rulepackage.com + www/api/marketplace/pic/beta/vip/apihand 共 8 个域名,自动续期
- Marketplace 外部贴图替换:6 个文件中的 raw.githubusercontent.com / images.unsplash.com 链接全部替换为 pic.rulepackage.com
- 构建验证:npm test 374/374 全过,npm run build 零错误
- pic.rulepackage.com SSL 证书:Let's Encrypt 申请成功,HTTPS 正常访问,CORS 跨域头已配置
- Marketplace 发布:ID #1064「现代商业办公楼 (纹理贴图示例)」— 使用 pic.rulepackage.com 6 种贴图(红砖/石材/玻璃/金属/屋顶瓦片/混凝土),展示完整 setupProjection + projectUV + texture 工作流
- roadmap.html 更新:Phase 1/2/2.5 标记完成,新增 Phase 5「渲染器性能与材质系统」8 项任务看板
- 渲染器承载数据:优化前 ~1000 Mesh @ 60fps → 优化后 ~50万三角面 @ 60fps
- 新建贴图站点:
https://pic.rulepackage.com— 11 种测试材质(混凝土/砖/木/金属/玻璃/草地/石材/屋顶瓦片),支持 CORS 跨域 - 渲染器性能瓶颈修复:原
buildScene()为每个 shape 创建独立 Mesh → 24638 三角面分布在 ~8000+ draw call 中严重卡顿 - 按材质自动合并:相同材质(颜色+粗糙度+金属度+纹理)的 shape 自动合并为单个 BufferGeometry,draw call 从 ~8000 降至 ~10
- 承载能力提升:优化前 ~1000 独立 Mesh @ 60fps → 优化后 ~500000 三角面 @ 60fps
- cleanupGeometry 等效实现:无需在 CGA 代码中手动调用,buildScene 层自动完成共面合并
- 构建验证:npm test 374/374 全过,npm run build 零错误,已同步到 dist-stable
- 故障现象:CodeMirror 编辑器无代码显示、3D 渲染窗口黑屏无模型
- 根因:Phase 2 重构时
plugins/context/index.ts引用了未定义的getShapeAABB/aabbContains/aabbOverlaps/aabbTouches;plugins/asset/index.ts引用了未定义的_assetMetaCache - Vite 行为:esbuild 报 TS2304 错误但仍继续构建,导致
CONTEXT_FUNCTIONS变量在产物中缺失,浏览器加载抛出ReferenceError: CONTEXT_FUNCTIONS is not defined - 连锁效应:
ide-core.js为 ES 模块,顶层import 'cgajs-engine'失败导致整个脚本不执行 → CodeMirror 和 Three.js 均不初始化 - 修复:补充 context 插件 AABB 辅助函数、补充 asset 插件
_assetMetaCacheMap,重建后npm run build零错误 - 验证:Node.js 模块加载测试通过,dist-stable 已同步,importmap 添加
?v=2缓存清除 - 操作:请按 Ctrl+F5 强制刷新浏览器缓存
- 开发计划来源:插件式函数库 + 快速修复系统(dazzler-gamora-rictor.md)
- 新增后端端点:
POST /api/v1/nl2cga/diagnose-function— 函数诊断(返回当前实现、测试覆盖率、已知问题) - 新增后端端点:
POST /api/v1/nl2cga/submit-function-fix— 提交修复(保存到 FunctionRepairLog + Nl2CgaHumanFix) - 前端 AI 面板新增 "🔧 函数诊断" 模态框:搜索函数 → 显示源码 → 在线编辑 → 快速测试 → 提交修复
- MVP 约束:仅支持 builtins(162 个函数),evaluator 操作修复放到 Phase 3
- 备份目录:
/root/backups/cgajs_prod_20260609_172916
- 新建目录结构:
src/functions/plugins/{math,probability,array,string,conversion,color,list,file,context,edge,asset,misc,topology,user}/— 13 个插件目录 - 拆分 builtins.ts:原 1243 行集中式文件 → 13 个独立插件文件。每个类别一个插件:MATH(27函数)、PROBABILITY(4函数)、ARRAY(16函数)、STRING(19函数)、COLOR(13函数)、CONVERSION(8函数)、CONTEXT(8函数)、EDGE_ATTR(7函数)、ASSET(5函数)、FILE(16函数)、MISC(12函数)
- 新建 registry.ts:全局插件注册表,支持
registerPlugin()、loadPlugin()(运行时加载用户插件)、unloadPlugin()、getPluginFunctions() - 提取共享模块:
core/random-state.ts—currentRandom/setCurrentRandom/getCurrentRandom/ensureRandom,避免 probability/list 插件与 builtins.ts 循环依赖;core/context-shapes.ts—_contextShapes/setContextShapes,避免 context/edge 插件循环依赖;plugins/file/virtual-files.ts—_virtualFileRegistry/registerVirtualFile/clearVirtualFiles - builtins.ts 重构为聚合文件:保留
callBuiltin()、BUILTIN_REGISTRY、ALL_BUILTINS、类型定义等核心基础设施,所有函数类别改为从插件目录import - 向后兼容:所有现有 import 路径不变,
callBuiltin(name, args)接口不变,旧代码零改动 - 验证:
npm run build零错误通过;npm test19/19 测试文件通过,374/374 测试通过;dist 已同步到 dist-stable
- 决策:Phase 3 暂停,优先完成 Phase 2.5(参数类型系统扩展到更多函数族)+ Phase 2(插件式目录重构)
- Phase 2 目标:将
builtins.ts(1243行,162个函数)按类别拆分到src/functions/plugins/目录,实现热插拔插件架构 - Phase 2.5 扩展目标:在拆分到插件的同时,为每个函数补充完整签名元数据(参数名、类型、枚举值、默认值)
- 关键约束:①
callBuiltin()接口不变;②BUILTIN_REGISTRY不变;③ 374测试全部通过;④ 向后兼容旧调用方式 - 执行顺序:设计目录结构 → 逐个类别迁移(math → array → string → color → geometry → probability → file)→ 创建 registry.ts → 验证构建 + 测试
- 备份目录:
/root/backups/cgajs_prod_20260609_183706
- 结论:Phase 3 对生产稳定性影响较大,不建议直接在 prod 上执行
- 核心原因:evaluator.ts(1785行)是引擎心脏,60+个操作全部从 switch/case 拆到独立文件。每个操作都直接依赖
EvalContext:ctx.random(确定性随机)、ctx.userFuncs(用户函数)、ctx.script(规则查找)、ctx.currentDepth/maxDepth(递归深度控制)、ctx.traceLog(调试追踪)。拆出后任何一项传递错误都会导致编译失败。 - 具体风险点:
①
setCurrentRandom(ctx.random)在每个操作前调用,拆出后极易遗漏 → 随机结果错乱; ② BlockOperation(comp/split/setback)分支逻辑复杂,迁移容易出错 → 孔洞/面拆分异常; ③ 规则调用时的ctx.currentDepth++和 random fork,拆出后逻辑可能断裂 → 无限递归或随机不一致; ④ 操作链依赖(extrude→comp→split→roofHip)一个错全链失败,374单元测试可能覆盖不了边界case - 生产影响:cgajs-api 有 12 个常驻 engine_worker 进程,每个编译请求都经过 evaluate()。如果引擎构建产物有 bug,所有编译请求全部失败,网站核心功能瘫痪。
- 建议方案: ❌ 禁止直接修改 prod evaluator.ts; ✅ 必须在 beta 分支完成,374测试全过 + 额外操作链集成测试后再部署; ✅ 分批次迁移:第一批 10 个简单操作(color/texture/translate/rotate)→ 第二批中等复杂度(extrude/primitive*)→ 第三批复杂操作(comp/split/setback/roof); ✅ 每批次独立构建 + 测试 + beta 验证,通过后再下一批。
- 新增文件:
cgajs-engine/src/functions/signatures.ts— 函数签名元数据类型系统,定义CGAFunctionSignature / CGAParameter接口,含参数名、类型、枚举值、默认值、可选性、描述 - 修改 roof.ts:9 个 roof 函数全部新增
valueType: RoofValueType = 'byAngle'参数;新增resolveRoofAngle()辅助函数,将byHeight按 footprint 半宽自动转换为等效角度 - 修改 evaluator.ts:9 个 roof case 全部支持新旧签名自动识别——如果 argVals[0] 是字符串
byAngle/byHeight按新签名解析,否则回退旧签名(完全向后兼容) - 修改 cga-autocomplete.js:roof 系列 9 个函数补全提示全部更新为含 valueType 的新签名;新增 roofGambrel、roofHalfHip 补全条目
- 修改 grammar-knowledge.json:9 个 roof operation 的参数元数据已更新,含 enumValues、optional、example
- 构建验证:
npm run build零错误通过;dist 已同步到 dist-stable - 编译测试:
roofHip(30, 1)(旧签名)✅、roofHip("byAngle", 30, 1, false)✅、roofHip("byHeight", 5, 1, false)✅ 全部编译通过
- 目标:建立函数签名元数据,让解析器、补全系统、运行时实现三层对齐 CityEngine 2025.1
- 首批修复范围:roof 系列 9 个函数(roofHip/roofGable/roofPyramid/roofShed/roofRidge/roofRadial/roofDutch/roofGambrel/roofHalfHip)
- 签名元数据格式:
src/functions/signatures.ts— 定义参数名、类型、枚举值、默认值、是否可选 - 修改文件清单:
evaluator.ts(增加 valueType 分支)、roof.ts(支持 byAngle/byHeight)、grammar-knowledge.json(参数类型注入)、cga-autocomplete.js(补全提示更新) - 备份目录:
/root/backups/cgajs_prod_20260609_181534
- 问题发现:以
roofHip为例,cgajs 当前签名roofHip(angle, overhang)(2参数),CityEngine 2025.1 官方签名roofHip(valueType, value, overhang, even)(4参数),缺少valueType ∈ {byAngle, byHeight}枚举参数 - 根因定位:
cga-autocomplete.js硬编码签名roofHip(${1:angle}, ${2:overhang});grammar-knowledge.json参数名为 arg1/arg2 无类型信息;evaluator.tsswitch/case 直接按位置取值argVals[0], argVals[1],无 valueType 分支; 底层roof.ts实现同样只接受 angle+overhang - 影响范围:不仅 roof 系列(roofGable/roofPyramid/roofShed 等均有类似缺失),大量函数的参数类型、枚举值、默认值均未与 CityEngine 2025.1 对齐。这导致:① 代码补全误导用户;② NL2CGA 生成的代码使用错误签名直接编译失败;③ 用户无法使用 byHeight 等高级参数模式
- Phase 2 影响评估: 若仅做目录重构(builtins.ts → plugins/)→ 影响很小,callBuiltin + BUILTIN_REGISTRY 接口不变,374测试可守护兼容性; 但若同时引入参数类型系统 → 影响中等,需在 parser / evaluator / autocomplete / grammar-knowledge 四层联动修改
- 建议执行顺序:
Phase 2.5 参数类型系统(先建立签名元数据,修复 roof 等函数实现)→Phase 2 目录重构(再拆分到插件目录,避免二次重写)→Phase 3 Evaluator插件化 - roadmap.html 已更新:新增「架构升级路线图」类别,含 Phase 1~4 共 22 项任务看板
- 后端
POST /api/v1/nl2cga/diagnose-function— 从builtins.ts提取函数源码、查询修复历史、返回语法知识,已验证通过(abs / rand 等函数正常返回) - 后端
POST /api/v1/nl2cga/submit-function-fix— 保存修复到FunctionRepairLog表,已验证通过(id=5 记录成功入库) - 前端 IDE AI 面板新增 "🔧 函数诊断与修复" 按钮,点击打开模态框
- 模态框功能:搜索函数 → 显示当前实现源码 + 行号 → 展示已知修复记录 → 在线编辑修复代码 → 填写修复说明 + 测试用例 → 提交保存
- 涉及文件:
main.py(+2端点)、nl2cga_service.py(诊断逻辑)、ide.html(CSS+HTML+JS) - 服务已重启,4 workers 运行正常,内存 177MB
- 修复
uvicorn main:app启动失败问题,根因:monitoring.py引入prometheus_client和psutil但未安装 - 安装缺失依赖后服务恢复正常,4 workers 运行中,内存 169MB
- 所有 NL2CGA 端点验证通过:health / styles / repairs / generate
export_training_data.py— 从数据库导出训练数据(成功案例+反馈数据)train_lora.py— LoRA 微调脚本,基于unsloth框架,支持 4bit QLoRA,结构完整(数据量不足时自动跳过)evaluate.py— 4 维度评估:编译成功率、BLEU/ROUGE-L、函数正确率、语法完整性benchmark.jsonl— 50 样本基准数据集,覆盖 13 种建筑风格,100% 编译通过
- 新增
FunctionRepairLog数据库表,记录函数修复历史(function_name, file_path, repair_summary, before/after_snippet, test_case) - NL2CGA Prompt 自动注入最近 7 天/最多 10 条修复记录,让 LLM 了解引擎最新变更
- 前端 IDE 底部展示近期修复列表(
GET /api/v1/nl2cga/repairs) - 已入库 4 条记录:roofGambrel、roofHalfHip、roofRound、compHoles
- 自动捕获脚本:编译失败后自动记录错误上下文到修复队列
admin-monitor.html— 实时仪表盘:QPS、编译成功率、NL2CGA 调用量、用户活跃度、资源监控log_analyzer.py— 每日自动分析 access_log,生成日报(请求量、状态码分布、Top 端点、错误聚类)resource_alert.py— CPU/内存/磁盘阈值告警,自动通知- 数据飞轮自动化:编译失败自动入队、每小时自动测试、每 6 小时高频案例 AI 修复
callBuiltin从 O(n) if-else 链重构为 O(1)Map.get()查找BUILTIN_REGISTRY: Map<string, Function>扁平注册表,分类:MATH(24)、PROBABILITY(4)、ARRAY(16)、STRING(19)、COLOR(13)、CONVERSION(8)、CONTEXT(8)、EDGE_ATTR(7)、ASSET(5)、FILE(16)、TOPOLOGY(2)、MISC(12)- 保留
ALL_BUILTINS对象向后兼容 - 验证:TypeScript 编译零错误,374 个现有测试全部通过
- 新增
DeterministicRandom(seed)基于 xorshift 的确定性随机数生成器 setCurrentRandom()/getCurrentRandom()线程本地存储EvalContext新增random字段,createEvalContext中初始化- 分支间随机隔离:
evalStochasticBody和evalSplitOperation/evalCompOperation中使用ctx.random.fork() rand/rand.int/rand.gaussian/p全部接入- 验证:相同 seed 产生完全相同的随机序列;374 个现有测试全部通过
nl2cga_service.py(907 行) 从 createurban-cga-lite 移植,7 个 API 端点/api/v1/nl2cga/generate— 预建模板匹配(免认证)+ LLM 生成(需认证)/api/v1/nl2cga/refine— 基于 LLM 的代码优化/api/v1/nl2cga/fix— 自动修复编译错误/api/v1/nl2cga/explain— 代码解释(开放访问)/api/v1/nl2cga/validate-code— 语法验证- 编译闭环:生成 → 编译验证 → 报错 → LLM 修复 → 最多 2 轮自动重试
- 语法注入:
build_context_prompt()自动加载grammar-knowledge.json注入当前引擎能力边界
rag_service.py— Marketplace 188 个 .cga 文件向量化- 关键词 + 向量混合匹配(Hybrid Search)
- CJK 同义词扩展:
中式 → [chinese, temple, pagoda]、玻璃 → [glass, panel, window] - 检索延迟 ~10-30ms,结果直接拼接到 LLM Few-shot 上下文
ide.html新增 320px 可折叠侧边栏- 功能:自然语言输入、风格选择(11种预建模板)、楼层滑块、生成/复制/插入/解释
aiGenerate()→ POST/api/v1/nl2cga/generateaiExplainSelection()→ 获取编辑器选中文本 → POST/explain- 风格列表动态加载:
GET /styles - 底部展示近期修复:
GET /repairs
roofGambrel(shape, angle, height2)— 谷仓屋顶,使用extractFootprintVerts+breakFrac控制折线高度roofHalfHip(shape, angle, hipFrac=0.3)— 半坡屋顶,ridgeInset控制 ridge 缩进比例roofRound(shape, angle)— 球形穹顶,3 层 ring + peak 球冠近似- 此前这 3 个函数仅为空壳/异常占位,导致 AI 生成相关代码时直接报错
compHoles(shape)— 支持两种 hole 来源检测- 来源 1:
PolygonData显式holes数组 - 来源 2:
BufferGeometry.userData.contours内环(如shapeO生成的 O-ring) - 使用
earcut重新三角化,计算贴合孔洞平面的 scope compMeta = { sel: 'hole', index, total }
extract-grammar-docs.mjs— 自动扫描源码生成结构化语法知识库- 输出
grammar-knowledge.json:163 个函数 + 90 个操作,含签名、参数、返回值、使用示例 - 输入:CGAGrammar.g4 + builtins.ts + evaluator.ts
- 绑定到构建流程,每次部署自动更新
- NL2CGA Prompt 动态读取,无需人工维护
- ANTLR4 驱动解析器,语法覆盖完整
- 1727 行核心求值器,支持 60+ Shape 操作
- 162 个内置函数基础注册
- 14 组 e2e 测试覆盖 happy path
一、现状诊断
CGA 引擎现状
- 解析器:ANTLR4 驱动,语法覆盖完整,错误恢复能力基础可用
- 运行时:1727 行核心求值器,支持 60+ Shape 操作、162 个内置函数
- 几何模块:Extrude / Split / Comp / Roof / UV / Boolean / Setback 等已实现,但部分为简化方案
- 测试:14 组 e2e 测试覆盖 happy path,边缘 case 不足
NL2CGA 现状
- 严重缺失引擎层
nl2cga_bridge.ts仅为接口空壳,prompt_templates.ts全部为空 - 部分可用API 层
ai_service.py有 LLM 客户端,但仅用于编译错误分析(修代码),不能生成代码 - 闭环存在
learning_routes.py已建立"失败案例 → LLM 分析 → 修复建议 → 人工审核"的学习闭环 - 资产可用
createurban-cga-lite中有预建模板 + LLM 生成实现,可直接移植
二、NL2CGA 三阶段路线图
🚀 第一阶段:Template + RAG(2~3 周)
- 移植
createurban-cga-lite的预建模板系统,扩展至 20~30 种建筑风格 - Marketplace 188 个
.cga文件向量化,构建语义检索库 - 前端 IDE 增加 "🎨 AI 生成" 面板(输入框 + 风格选择 + 参数滑块)
- 设计语法自描述文档生成器(核心,见下文第三节)
🔧 第二阶段:编译器反馈闭环(4~6 周)
- 新增
/api/v1/nl2cga/generate端点,接入ai_service.py的 LLM 客户端 - 实现 "生成 → 编译 → 报错 → LLM 修复" 的自动迭代循环(最多 3 轮)
- 将编译器作为判别器(Discriminator):只有编译成功的代码才返回给用户
- 每次成功的"生成-编译"对自动存入训练数据集,为第三阶段积累燃料
🧠 第三阶段:Fine-tuned CGA 专用模型(3~6 个月)
- 基于
Qwen2.5-Coder-7B或DeepSeek-Coder-V2-Lite做 LoRA 微调 - 训练数据来源:Marketplace 描述-CGA 对、学习闭环的成功案例、用户反馈数据
- 语法变更时自动触发模型增量微调,实现真正的自主学习
- 本地 vLLM 部署,单条生成成本 < ¥0.01
三、自主学习语法结构的核心机制
这是整个计划的重点。以下 5 个子系统构成 NL2CGA 的自进化引擎,确保每次你修改 CGA 语法时,AI 都能自动跟上:
3.1 语法文档自动提取器(Grammar Document Extractor)
问题:当前 Prompt 中硬编码"已支持语法",每次新增函数都要手动改 Prompt,极易遗漏和过时。
方案:编写一个构建时脚本,自动扫描源码生成结构化语法知识库:
# 自动提取脚本(建议放在 cgajs-engine/scripts/extract-grammar-docs.mjs) # 输入:CGAGrammar.g4 + builtins.ts + evaluator.ts # 输出:grammar-knowledge.json(被 RAG 和 Prompt 动态加载) 提取内容: 1. 从 CGAGrammar.g4 提取:规则定义语法、操作序列结构、条件/随机分支写法 2. 从 builtins.ts 提取:162 个函数的签名、参数类型、返回值、使用示例 3. 从 evaluator.ts 提取:60+ Shape 操作的用法和约束 4. 从 tests/ 提取:每个函数/操作的真实运行示例 输出格式(JSON): { "version": "1.3.2", "generatedAt": "2026-06-09", "operations": [ { "name": "extrude", "params": ["height"], "returns": "Shape[]", "example": "Lot --> extrude(10) comp(f) { top: Roof }", "constraints": ["height > 0"] } ], "functions": [ { "name": "rand.int", "category": "probability", "signature": "rand.int(min, max) -> int", "description": "返回 [min, max) 范围内的随机整数" } ], "annotations": ["@StartRule", "@Group", "@Range", "@Hidden"] }
触发方式:将脚本绑定到 npm run build 或 Git 预提交钩子,每次构建自动更新。Prompt 加载时动态读取此 JSON,而非写死。
3.2 实时语法注入系统(Live Syntax Injection)
当用户请求 NL2CGA 生成时,后端自动将当前引擎的完整语法快照注入 LLM 上下文:
# 动态 Prompt 组装(cgajs-api 层实现) system_prompt = f""" 你是 CGA.js v{engine_version} 专家。当前引擎支持的语法如下: ## 可用 Shape 操作({len(operations)} 个) {format_operations(grammar_knowledge['operations'])} ## 可用内置函数({len(functions)} 个) {format_functions(grammar_knowledge['functions'], top_used=30)} ## 关键约束 - 必须使用 @StartRule 标记入口规则 - split 轴只能是 x|y|z|u|v(当前 u/v 未实现,避免使用) - comp(h) 孔洞检测暂不支持,避免依赖 只输出有效 CGA 代码,不要解释。 """
价值:新增 roofGambrel 函数后,重新部署即自动出现在 AI 的知识范围内,零人工维护 Prompt。
3.3 编译器反馈强化学习(Compiler-RL)
这是让 NL2CGA "越用越聪明" 的核心飞轮:
| 步骤 | 动作 | 数据沉淀 |
|---|---|---|
| 1 | 用户输入"中式寺庙" → LLM 生成 v1 | — |
| 2 | 编译器解析 v1 → 发现 2 个错误 | (prompt, v1, error_json) → CgaFailureCase |
| 3 | 错误信息 + v1 喂给 LLM → 生成修复版 v2 | (v1, error, v2) → AiSuggestion |
| 4 | v2 编译通过 → 返回给用户 | (prompt, v2) → CgaSuccessCase |
| 5 | 用户点击 👍/👎 反馈 | 修正标签 → 高质量训练对 |
语法变更时的自动适应:当你修改了语法(如新增 @Import 注解),过去积累的"错误-修复"对中涉及旧语法的数据会被自动标记为 legacy,新语法的成功案例会被赋予更高权重进入训练集。
3.4 语义向量索引(Semantic Vector Index)
不仅要知道"有哪些函数",还要知道"什么时候该用什么函数"。
- 将 Marketplace 中每个
.cga文件 + 标题 + 描述向量化(使用代码嵌入模型) - 将 162 个函数的文档和 3~5 个典型用例向量化
- 用户输入自然语言时,检索 Top-5 最相关的 CGA 源码片段和函数文档
- 检索结果直接拼接到 LLM 上下文(Few-shot 示例),让 AI "看到"别人是怎么写的
# RAG 检索示例 用户输入:"做一个带飞檐的中式屋顶" 检索结果: 1. "03_japanese_pagoda.cga" — 相似度 0.91(roofHip 多层叠加) 2. "temple style guide" — 相似度 0.87(飞檐参数说明) 3. "roofHip 函数文档" — 相似度 0.85 LLM 上下文追加: "参考以下实现飞檐屋顶的方式:" + 检索到的代码片段
3.5 语法变更感知流水线(Grammar Change Detection Pipeline)
这是自主学习的触发器,确保语法变更被 NL2CGA 系统第一时间感知:
# 绑定到 CI/CD 或 Git 钩子的流水线 触发条件:grammar/CGAGrammar.g4 或 src/functions/builtins.ts 发生变更 自动执行: 1. 运行 extract-grammar-docs.mjs → 更新 grammar-knowledge.json 2. 运行全量 e2e 测试 → 确认新语法行为正确 3. 运行回归测试 → 确认旧语法未被破坏 4. 用新语法重新索引 Marketplace 文件 → 更新向量数据库 5. 重新编译预建模板 → 验证模板仍有效 6. 若存在 Fine-tuned 模型 → 触发增量微调任务(用新语法案例扩充数据集)
结果:你提交一个 PR 新增 geometry.isRectangular 函数,10 分钟后 NL2CGA 系统已经知道它的存在、签名、用法,并能在生成代码时正确推荐。
四、关键缺陷修复清单(与 NL2CGA 协同)
| 缺陷 | 对 NL2CGA 的影响 | 优先级 |
|---|---|---|
roofGambrel / roofHalfHip / roofRound 有签名无实现 |
AI 生成这些屋顶时代码直接报错,严重损害信任 | P0 |
comp(h) 孔洞检测返回空数组 |
AI 无法正确指导用户使用孔洞相关建模 | P0 |
rand / p 未接入 DeterministicRandom |
相同 seed 产生不同结果,AI 的"示例"不可复现 | P1 |
split(u/v) 未实现 |
AI 生成的 UV 分割代码无效 | P1 |
callBuiltin 使用 if-else 链而非 Map |
函数调用慢,批量生成时吞吐受限 | P1 |
| 解析器使用 BailErrorStrategy | 一次只报一个错误,AI 修复效率低 | P2 |
五、数据飞轮:让系统越用越聪明
📥 数据源
- Marketplace:188 个文件 ×(标题+描述+标签+CGA 源码)= 基础语料
- 编译日志:每次 /compile 调用的 (source, success/fail, error) = 监督信号
- 学习闭环:learning_routes 积累的 (failure, suggestion, accepted) = 高质量修正对
- 用户反馈:👍/👎 按钮 + 手动编辑后的最终代码 = 人类偏好数据
⚙️ 处理层
- 语法提取器:自动从源码生成结构化知识(随版本更新)
- 向量化引擎:将 CGA 代码和自然语言描述嵌入同一语义空间
- 质量过滤器:只有编译通过且用户点赞的数据才进入训练集
🚀 输出层
- RAG 检索:实时语义搜索最相关的代码示例
- 动态 Prompt:每次请求携带最新语法快照
- Fine-tuned 模型:专为 CGA 语法优化的小参数模型
六、执行时间表
| 时间 | 里程碑 | 交付物 |
|---|---|---|
| 第 1~2 周 | 语法提取器 + RAG 索引 | grammar-knowledge.json 自动生成、Marketplace 向量化、IDE AI 面板 |
| 第 3~4 周 | Template NL2CGA 上线 | 20+ 预建模板、语义搜索、零 LLM 成本可用 |
| 第 5~8 周 | 编译器反馈闭环 | /api/v1/nl2cga/* 端点、生成-编译-修复循环、数据沉淀 |
| 第 9~12 周 | P0 缺陷清零 | roofGambrel 等 3 个屋顶实现、comp(h) 孔洞检测、DeterministicRandom |
| 第 3~6 月 | 专用模型微调 | LoRA 微调 7B 模型、本地 vLLM 部署、单条成本 < ¥0.01 |
| 持续 | 自进化运维 | 每次语法变更自动触发知识库更新 → 回归测试 → 向量索引重建 → 模型增量微调 |
七、总结
CGA.js 的解析器和运行时已经具备专业级骨架,NL2CGA 是从"工具"跃迁为"平台"的决定性能力。
本计划的核心不是"写一个更好的 Prompt",而是构建一个自我维护、自我增强的技术体系:
- 语法文档自动提取消除 Prompt 与源码的同步问题
- 编译器反馈闭环保证生成质量并持续积累训练数据
- 语义向量索引让 AI 能"看到"社区的最佳实践
- 语法变更感知流水线确保系统随引擎同步进化
当你下次新增一个函数时,这个系统会在 10 分钟内自动学会它,并在接下来的每一次用户请求中正确使用它——这才是真正的自主学习。
八、NL2CGA 商业化落地路线图(已批准)
模板优先 + 本地小模型兜底 · 2026.06 ~ 2027.03 · 目标:几句话直接生成模型
战略定位与最终目标
让 nl2cga.rulepackage.com(及 IDE/插件端)实现“一句话生成模型”:用户用自然语言描述建筑/场景,系统在秒级返回可编译、可预览、可下载的 CGA 规则与三维模型。
- 高可用:普通句子 80% 以上能直接出模型,无需反复修复。
- 低成本:单次生成成本 < ¥0.1(理想 < ¥0.03),支持免费 tier + 订阅 + 按量付费。
- 广覆盖:覆盖住宅、商业、古建、现代地标、基础设施、植被等常见类别。
- 可扩展:新增一种建筑风格时,能在 1 天内完成模板/知识入库并自动生效。
核心路线
模板优先 + 本地小模型兜底:Prebuilt / Parameterized 模板优先命中 → 语义 RAG 补上下文 → 本地 Qwen2.5-Coder-7B 处理长尾 → 外部大模型仅作为最终兜底。
🚀 Phase 1:速效窗口期(第 1 个月)
- 修复 NL2CGA 管道 bug,建立模板自动编译校验流水线。
- 扩展 Tier 1 预建模板到 20 个,Tier 2 参数化模板到 20 个。
- 修复规则从 10 条扩展到 25 条,运行 benchmark 建立基线。
- 本周已完成:bug 修复、流水线、20 预建模板、基准报告(模板覆盖率 16%)。
🔧 Phase 2:语义与知识体系(第 2-3 个月)
- 扩展参数化模板到 50 个,建筑实体知识库到 50 个。
- 实现
inset、import递归加载等缺失引擎能力。 - 引入 Embedding 语义意图匹配,RAG 升级到向量索引(Milvus Lite / pgvector)。
- 建立生成质量仪表盘,持续监控来源、耗时、编译结果。
🧠 Phase 3:私有化 AI 与成本优化(第 4-6 个月)
- 在本地电脑(E5-2670V2 + 32G)部署 Ollama + Qwen2.5-Coder-7B。
- 构建 2000+ 条高质量训练数据集,部署 Milvus Lite 本地向量库。
- 云端 AutoDL A100 进行 1-2 次 LoRA 微调(约 50-100 元/次)。
- 建立自动训练流水线:每周扫描成功案例与人工修正,触发增量微调。
💰 Phase 4:AST 生成与商业化封装(第 7-9 个月)
- 建立 AST 直接生成路径,将高频模板逐步迁移到 ASTBuilder。
- 调整定价:prebuilt/parameterized 免费但有速率限制;LLM 调用按量扣费。
- 上线生成历史/收藏/编辑,集成 IDE、Blender/SketchUp 插件,发布 NL2CGA API。
资源与成本估算
- 人力资源:1 名全栈/后端工程师(你本人 + AI 辅助),可选建筑/图形学顾问。
- 基础设施:阿里云 2H8G 保持现状;本地电脑部署 Ollama + Milvus Lite(0 元);云端训练按需 AutoDL A100。
- 总现金支出:九个月约 ¥1000-2000(主要为 2 次云端训练 + 少量 API 调用)。
风险与应对
| 风险 | 概率 | 影响 | 应对 |
|---|---|---|---|
| 模板扩展工作量过大 | 中 | 高 | AI 批量生成骨架 + 自动编译校验;优先覆盖 20 个高频类别。 |
inset/import 实现复杂 | 中 | 高 | 使用成熟库(polygon-clipping、three-bvh-csg);分阶段交付。 |
| 本地模型效果不达预期 | 中 | 中 | 保留外部 API fallback;先聚焦 7B coder,必要时上 14B。 |
| 用户付费意愿低 | 中 | 中 | prebuilt/parameterized 免费引流,LLM/高级模板付费;订阅 + 按量双模式。 |
| 数据隐私合规 | 低 | 中 | 训练数据不上传云端;云端训练使用脱敏代码对;本地向量化。 |
当务之急(本周已启动)
- 已完成 修复
nl2cga_service.pyknowledge_context未定义 bug。 - 已完成 建立 NL2CGA 模板自动编译校验流水线。
- 已完成 扩展 20 个 Tier 1 预建模板并入库。
- 已完成 运行 benchmark 建立基线报告(模板覆盖率 16%)。
- 已完成 评估本地 Ollama 部署可行性并输出部署指南。
详细计划文件:/root/.kimi-code/sessions/wd_root_94a6b4475803/session_9ad7852c-06d8-49cc-8c82-67203bce72ed/agents/main/plans/firestorm-kate-bishop-fantomex.md
2026-06-15 NL2CGA 架构澄清:cga-library 与 Marketplace 分工
- cga-library(cgajs.com 本地)是 NL2CGA 的高质量训练语料库,包含
prebuilt、parameterized、library三层人工 curated 规则,用于意图匹配与 Few-shot 提示。 - marketplace.rulepackage.com 是用户示例仓库,作为 NL2CGA 的RAG 增强源与 IDE 示例浏览器,通过
/api/v1/cga-corpus只读消费。 - 已修正:回滚了 cgajs.com
/api/v1/cga-library/files/{slug}保存/回滚到 rulepackage.com 的代理,恢复为本地操作。 - 已落地:cgajs.com IDE 的 Marketplace 示例浏览器与下载已代理到 rulepackage.com,可直接读取权威 Marketplace 示例。
- 详细说明文档:NL2CGA-ARCHITECTURE.md
2026-06-15 双站审计与安全加固
- 测试覆盖:解析器性能/稳定性、CGA 引擎 compile/run、NL2CGA 预built/生成/校验/解释/修复、全站导航与关键页面、暴露文件/路径遍历/越权/SSRF/Omega 同步鉴权/上传校验。
- 已修复:cgajs.com
/api/v1/engine/run的assets参数存在 SSRF 风险,已增加_is_safe_asset_url()校验,拒绝 localhost/私有 IP/非 HTTP(S) 协议。 - 已修复:rulepackage.com uvicorn 仅启用 1 个 worker,单个慢请求(如未配置 LLM 的 explain/fix)会阻塞全站 API,已调整为 4 workers。
- 已清理:双站数据库中本轮审计生成的临时测试账号及对应 usage_logs。
- 已知项:引擎单元测试仍报告少量
[Parser Ambiguity],不影响功能,纳入后续语法优化;NL2CGA explain/fix 依赖外部 LLM,在 rulepackage.com 未配置 LLM 时会超时,已按警告处理。 - 测试报告:
/www/wwwroot/shared-memory/reports/dual_site_audit_report_20260615-122558.md
2026-06-15 修复 cgajs.com/ide.html 诊断日志污染页面
- 问题:
/ide.html被注入了调试用的 fetch/import 诊断脚本,所有成功/失败信息都以红色错误面板上屏,导致页面“全是报错”。 - 已修复:删除了两个诊断
<script>块;保留全局 JS 错误捕获与资源加载失败提示,便于真实问题排查。 - 已补充:
/ide.html引入全局导航/assets/site-nav.js?v=3,与首页菜单保持一致。 - 验证:主模块脚本语法检查通过;请站主在浏览器中按 Ctrl+Shift+R 强制刷新 /ide.html 确认编辑器与 3D 视图正常。
2026-06-15 cgajs.com 安全加固(代码审计后修复)
- SSRF 加固:
/api/v1/engine/run的资产下载改为follow_redirects=False,防止通过 302 跳转到内网 metadata 地址。 - 路径遍历加固:
cga_import_resolver.py:CGAimport解析限制在 base_path 内,禁止绝对路径与..逃逸。cga_editor_service.py:read_file、list_changes对 slug 做白名单校验并检查真实路径在备份目录内。cga_editor_routes.py:/files/{slug}/diff同样校验 slug 与路径 containment。
- 鉴权加固:
/api/v1/upload/asset由可选认证改为必须认证(仍支持 API Key),防止匿名滥用存储。/api/v1/ai-chat由匿名改为必须认证,防止 LLM 配额被盗用。
- Cookie 加固:登录、OAuth、管理员登录设置的
cgajs_token全部改为httponly=True,降低 XSS 盗 Cookie 风险。 - Webhook 加固:
/api/v1/webhooks/rulepackage在未配置RULEPACKAGE_WEBHOOK_SECRET时直接拒绝;下载资源 URL 增加 SSRF 校验并关闭重定向;健康检查不再返回本地路径。 - 配置保密:
/api/v1/admin/configs对 API key、secret、private_key、password、token、cert 等值做掩码处理。 - 指标端口加固:Prometheus metrics 服务器从
0.0.0.0:9090改为仅监听127.0.0.1:9090。 - OAuth 安全:GitHub OAuth 回调不再回退到未验证邮箱;修复
wechat/github_callback中request未定义的引用错误。 - 未修复/需后续决策:服务仍以 root 运行、部分异常信息可能暴露内部错误、CORS 使用
*.cgajs.com正则、内存级限流器多 worker 下会放大配额。这些需要更大范围的部署/架构调整,已记入me.html。
2026-06-15 调整 Marketplace 与 IDE 站点分工
- 新增:
https://www.rulepackage.com/ide.html正式上线,复用 cgajs.com IDE 代码,API 全部走 rulepackage.com 自身端点(/api/v1/marketplace/{id}/download、/api/v1/parse、/api/v1/nl2cga/*)。 - 替换:原
/www/wwwroot/www.rulepackage.com/ide.html的 “已迁移至 cgajs.com” 跳转页被替换为真实 IDE 页面;引擎静态资源通过/assets/cgajs-engine软链复用本地/www/wwwroot/cgajs-engine/dist。 - 跳转调整:
marketplace.rulepackage.com点击 CGA 示例时仍打开https://www.rulepackage.com/ide.html?cga_id=...,但现在是真实 IDE 而非跳转。 - cgajs.com IDE:保留为 “IDE测试” 入口,用于测试 CGA 解析与 NL2CGA;同时支持通过
?cga_id=...&marketplace=rulepackage打开 rulepackage.com 的示例(已给 cgajs.com 加 CORS 白名单)。 - 导航调整:rulepackage.com 顶部菜单与导航下拉新增 “💻 IDE”;cgajs.com 顶部 IDE 改为 “💻 IDE测试”,下拉导航中 “资产与测试(rulepackage.com)” 新增 rulepackage IDE 入口。
- 问题:IDE 侧栏 Omega 报告列表点击某条 batch 后,详情页 “← Back to reports” 触发
onclick="fetchOmegaReports()",但函数定义在 IIFE 模块内部,全局作用域未暴露,控制台报错fetchOmegaReports is not defined。 - 修复:在
ide.html模块闭包结束前增加window.fetchOmegaReports = fetchOmegaReports; window.fetchOmegaReport = fetchOmegaReport;,使内联 onclick 可正确返回报告列表。 - 部署:已同步更新
https://www.rulepackage.com/ide.html与https://www.cgajs.com/ide.html,并保留备份文件ide.html.bak.20260615。
本方案将现有能力重新划分到三个站点:cgajs.com 专注 CGA 解析与 NL2CGA 生成;rulepackage.com 专注 CGA 文件托管、测试与交易;cityvistion.cn 作为统一 API 网关与外部能力入口。cgajs.com 与 rulepackage.com 仅对内部白名单域名开放服务,cityvistion.cn 通过注册/订阅/Key 向外部提供全部能力。
一、设计目标
- 职责清晰:cgajs.com 只负责“生成/解析 CGA”,rulepackage.com 只负责“CGA 资产管理与交易”,cityvistion.cn 负责“对外商业化”。
- 安全收敛:cgajs.com 与 rulepackage.com 不直接面向外部用户,只接受内部白名单域名的服务间调用;外部流量全部走 cityvistion.cn 的 Key 鉴权。
- 数据飞轮:rulepackage.com 的 Marketplace CGA 文件回流到 cgajs.com,用于增强解析器与 NL2CGA 模型。
- 统一入口:CityEngine 插件、第三方开发者、外部网站全部通过 cityvistion.cn 获取 API Key 与下载插件。
二、三站角色定位
1. cgajs.com — CGA 解析 + NL2CGA 生成 + 内部管理后台
- 核心能力:CGA 编译/解析/三维几何生成、自然语言生成 CGA(NL2CGA)、解析器测试平台、AI 生成测试平台。
- 对外服务:仅对白名单域名(cityvistion.cn 等内部子站)提供 API,不直接对普通用户暴露 Key。
- 用户体系:取消公开注册,仅保留管理员后台。
- 保留工具:自学习系统、函数契约测试、AI 学习监督、自动循环,用于持续提升解析能力与生成质量。
2. rulepackage.com — CGA 文件托管 + Marketplace + 测试平台
- 核心能力:CGA 文件上传、发布、版本管理、交易/下载、测试、评分。
- 对外服务:同样仅对白名单域名开放 API,如文件列表、读取、下载、购买回调。
- 用户体系:继续面向创作者/买家开放注册(Marketplace 账户)。
- 数据回流:高质量公开 CGA 文件定期同步给 cgajs.com,用于 RAG 索引、模板库扩充、NL2CGA 训练。
3. cityvistion.cn — 统一 API 网关 + 外部能力入口 + 插件发布中心
- 核心能力:用户注册、会员订阅、API Key 发放、配额/计费、统一 API 路由、插件下载、文档。
- 后端调用:作为白名单域名,内部使用服务间凭证调用 cgajs.com 与 rulepackage.com。
- 对外形态:提供单一域名 + Key,外部用户无需关心后端由哪个站点承载。
三、调用链路
外部用户 / 插件 / 第三方站点
│
▼ X-API-Key: cityvistion-user-key
cityvistion.cn
│
├── 需要 CGA 解析 / NL2CGA ──▶ cgajs.com (白名单 + 服务签名)
│
├── 需要读取 / 购买 / 下载 CGA ──▶ rulepackage.com (白名单 + 服务签名)
│
└── 插件下载 / 文档 / 订阅 ──▶ cityvistion.cn 自身
四、安全与鉴权模型
对外层(cityvistion.cn ↔ 用户):
- 用户注册后生成
X-API-Key,按会员等级分配调用额度。 - cityvistion.cn 维护
users、subscriptions、api_keys、usage_logs表。 - 支持按能力计费:CGA 解析次数、NL2CGA 生成次数、Marketplace 下载/购买次数。
内部层(cityvistion.cn ↔ cgajs.com / rulepackage.com):
- 域名白名单:cgajs.com 与 rulepackage.com 的 CORS/请求域名白名单加入
cityvistion.cn及其子域。 - 服务签名:cityvistion.cn 调用后端时附加
X-Service-Key+ HMAC-SHA256 签名或 JWT,防止仅依赖 Origin 被伪造。 - IP 白名单(可选):将 cityvistion.cn 服务器 IP(123.56.81.100)加入 cgajs.com / rulepackage.com 的防火墙/API 允许列表。
五、数据与训练飞轮
- 素材来源:rulepackage.com Marketplace 中标记为公开、编译通过、质量评分高的 CGA 文件。
- 同步机制:cityvistion.cn 或 rulepackage.com 定时将新增/更新的 CGA 文件推送给 cgajs.com( webhook / 共享存储 / rsync )。
- 训练用途:
- 更新
rag_index.json,增强 RAG 检索。 - 扩充
nl2cga/prebuilt/与template_engine/templates/模板库。 - 进入自学习系统,发现新语法模式并补充解析器。
- 作为 NL2CGA 成功样本,用于模型微调。
- 更新
六、管理员后台职能调整建议
| 功能模块 | 建议归属 | 理由 |
|---|---|---|
| 自学习系统(语法自动学习) | 保留在 cgajs.com 后台 | 直接提升 CGA 解析器能力 |
| 函数契约测试 | 保留在 cgajs.com 后台 | 保障解析器函数正确性 |
| AI 学习监督 / 自动循环 | 保留在 cgajs.com 后台 | 直接优化 NL2CGA 生成质量 |
| 训练数据集管理 / 样本标注 | rulepackage.com 后台新增 | Marketplace 文件是数据源,便于运营人员筛选优质样本 |
| 用户注册 / Key 发放 / 订阅计费 | 迁移到 cityvistion.cn | cgajs.com 不再对外提供用户服务 |
| 域名白名单 / 服务凭证管理 | 保留在 cgajs.com / rulepackage.com 后台 | 内部安全策略由各自站点管理员控制 |
七、技术实现方案
1. 基础设施
- DNS:
cityvistion.cn已解析到123.56.81.100,在该服务器上部署 Nginx + 后端服务。 - 服务栈建议:cityvistion.cn 可用 FastAPI/Node.js + PostgreSQL + Redis(配额计数)+ Nginx。
- SSL:为 cityvistion.cn 申请证书,配置 HTTPS。
2. cgajs.com / rulepackage.com 改造
- 在
main.py的鉴权中间件中区分“服务间调用”与“用户调用”:- 含
X-Service-Key+ 有效 HMAC → 服务间调用,跳过用户登录与额度扣减。 - 仅含
X-API-Key→ 拒绝(未来只有 cityvistion.cn 能直接调用,普通用户 Key 不再被 cgajs/rulepackage 接受)。
- 含
- 域名白名单增加
cityvistion.cn及其子域,同时支持 IP 白名单123.56.81.100。 - 关闭 cgajs.com 的公开注册入口,仅保留管理员账户。
3. cityvistion.cn API 网关
统一 API 前缀建议:
POST /api/v1/cga/parse -> 代理到 cgajs.com/api/v1/parse
POST /api/v1/cga/validate -> 代理到 cgajs.com/api/v1/validate
POST /api/v1/nl2cga/generate -> 代理到 cgajs.com/api/v1/nl2cga/generate
POST /api/v1/nl2cga/polish -> 代理到 cgajs.com/api/v1/nl2cga/polish
GET /api/v1/marketplace/list -> 代理到 rulepackage.com/api/v1/marketplace/...
GET /api/v1/marketplace/download/{id} -> 代理到 rulepackage.com/...
POST /api/v1/marketplace/purchase -> 代理到 rulepackage.com/...
GET /api/v1/plugin/download -> cityvistion.cn 本地下载
网关职责:
- 校验
X-API-Key与会员额度。 - 记录用量到
usage_logs。 - 向 cgajs.com / rulepackage.com 发起带服务签名的内部请求。
- 统一错误码、限流、缓存热点响应。
4. 用户与订阅模型
- 免费层:少量 CGA 解析 + NL2CGA 调用,用于试用。
- 会员层:按月/年订阅,提升额度,解锁 Marketplace 下载折扣。
- 企业层:自定义额度、专属支持、SLA。
- 调用配额维度:parse 次数、generate 次数、marketplace 下载次数、并发 QPS。
5. 插件发布
- CityEngine 插件代码在本地开发,打包后上传到 cityvistion.cn 的
/plugins目录。 - 插件默认调用
https://cityvistion.cn/api/v1/...,用户填入自己的 API Key。 - cityvistion.cn 后台提供插件版本管理、下载统计、更新推送。
八、实施阶段建议
| 阶段 | 内容 | 预计周期 |
|---|---|---|
| Phase 1 | cityvistion.cn 服务器初始化、Nginx、SSL、数据库、基础用户注册/登录/Key 生成 | 1–2 天 |
| Phase 2 | cgajs.com / rulepackage.com 鉴权改造:服务签名、白名单、关闭公开注册 | 2–3 天 |
| Phase 3 | cityvistion.cn API 网关与代理:配额、计费、用量日志、错误统一 | 3–5 天 |
| Phase 4 | 数据飞轮:rulepackage → cgajs 自动同步、RAG 索引更新、训练样本沉淀 | 3–5 天 |
| Phase 5 | 插件下载中心、文档、订阅支付、管理员后台收尾 | 5–7 天 |
九、风险与应对
- 白名单伪造风险:仅靠 Origin/Referer 不够,必须启用
X-Service-Key+ HMAC 或 JWT 服务签名。 - 单点故障:cityvistion.cn 成为唯一外部入口,需做限流、熔断、多实例部署。
- 计费准确性:后端返回前 cityvistion.cn 必须可靠记录用量,建议使用 Redis 计数 + 异步落库。
- 数据一致性:rulepackage.com 文件删除/下架后,cgajs.com 的 RAG 索引需同步失效,建议用文件状态字段控制。
- CityEngine 插件分发:插件更新需通知用户,建议提供版本检查接口。
十、结论
该方案可行,且与现有代码结构兼容度高。核心改造点集中在:
- cgajs.com / rulepackage.com 的鉴权层(区分服务间调用与普通用户)。
- cityvistion.cn 作为独立站点,承担用户、Key、订阅、网关。
- 建立 rulepackage → cgajs 的数据回流通道。
建议先立项并启动 Phase 1(cityvistion.cn 基础设施),同时并行评估现有管理员后台中哪些功能需要迁移或精简。
当前 nl2cga_generate() 的决策顺序为:
Prebuilt 模板匹配 → Code Assembler → Template Engine → RAG 向量检索 → LLM 兜底。
只要第 1 层命中,后续层都不会执行。下文说明每一层的作用、触发条件、构成要素与快速完善方法。
1. Prebuilt 模板匹配
作用:最快速度返回一个完整的、预先写好的 CGA 文件,适合住宅、别墅、办公楼、教堂、城堡等通用建筑类型。
触发条件:match_prebuilt_cga(description, db) 对描述做关键词匹配,得分最高且达到 min_score=3 的模板被选中。
匹配源(两层):
- 数据库
cga_assets:通过https://www.cgajs.com/cga.html后台管理。 - 磁盘预置模板:
/www/wwwroot/cgajs-api/nl2cga/prebuilt/下的.cga文件 +manifest.json。
决定使用它的影响因素:描述里出现模板 keywords 中的词,命中关键词越长/越多得分越高。
构成的对象要素:
manifest.json:slug、文件名、名称、描述、keywords、tags、complexity、category。.cga文件:实际 CGA 代码。PrebuiltCGA数据类:keywords、name、description、code、tags、complexity。
如何快速填充/完善:
- 在
cga.html后台新增/编辑 CGA 资产:设置asset_type=prebuilt、nl2cga_ready=true、填写keywords。 - 直接修改磁盘模板:编辑
nl2cga/prebuilt/xx.cga,并在manifest.json中补充更细的关键词。 - 把一个模板拆成多个尺寸版本(如
small-house.cga、large-villa.cga),避免通用词被单一模板垄断。
2. Code Assembler 快速骨架
作用:用规则化代码直接拼接 CGA 骨架,不调用 LLM,毫秒级返回。依据 Polish 引擎输出的 size_class 与 geometry_strategy 决定几何构造方式。
触发条件:Prebuilt 未命中,且 Polish 引擎成功返回 PolishResult。
当前策略对照:
| 尺寸级 | geometry_strategy | CGA 写法 |
|---|---|---|
| tiny / small | cube | s(length, height, width) primitiveCube() |
| medium / large | quad_extrude | s(length, 1, width) primitiveQuad() extrude(height) |
| monumental / 可缩放建筑 | scoped_quad_extrude | primitiveQuad(scope.sx, scope.sz) extrude(scope.sy) |
构成的对象要素:
nl2cga/geometry_strategy.py:SIZE_CLASSES、GEOMETRY_STRATEGIES。nl2cga/code_assembler.py:build_skeleton()、build_attr_block()、inject_attrs()、ensure_start_rule()。polish_engine.PolishResult中的params与attrs。
如何快速填充/完善:
- 在
geometry_strategy.py中新增策略:cylinder、cone、arch、L_shape、U_shape 等。 - 在
build_skeleton()中按style参数扩展立面/屋顶规则模板。 - 添加“强制 Assembler”开关,让通用词也走规则化生成。
3. Parameterized Template Engine 参数化模板引擎
作用:针对地标/古建/复杂建筑(太和殿、天安门、牌坊、城墙、现代办公楼等),用预定义模板 + 参数填充生成 CGA,并通过本地 CGA 编译器自动验证和修复。
触发条件:Prebuilt 与 Assembler 都未命中/失败,且 generate_from_query() 能在 TEMPLATE_LIBRARY 中匹配到模板,且编译验证通过。
决定使用它的影响因素:描述里出现 template_library.py 中模板的 keywords;匹配得分 >= max(2, min_match_score);编译验证必须通过。
构成的对象要素:
nl2cga/template_engine/template_library.py:模板元数据、keywords、params、lot_size、template_code。nl2cga/template_engine/templates/*.cga:实际模板代码,使用$param占位符。nl2cga/template_engine/engine.py:fill_template()、compile_verify()、auto_fix_code()、generate_with_verification()。nl2cga/template_engine/error_fix_rules.json:自动修复规则库。
如何快速填充/完善:
- 在
templates/下新增.cga文件,使用$lot_width、$lot_depth、$height等占位符。 - 在
template_library.py中注册模板,填写keywords与params。 - 在
error_fix_rules.json中补充常见错误模式,增强自我修复能力。 - 统一模板参数命名,减少
nl2cga_service.py中的length→lot_width映射。
4. RAG 向量检索
作用:从 Marketplace 的 CGA 文件中检索最相关的代码片段,作为 LLM 的 few-shot 示例。只有前面三层都未命中/失败时才会启用。
触发条件:Prebuilt、Assembler、Template Engine 全部未返回有效代码,且 rag_service.get_relevant_cga_examples() 能检索到相关片段。
决定使用它的影响因素:查询词与 rag_index.json 中条目的关键词、标题、描述、tags、代码片段的匹配度;DOMAIN_SYNONYMS 同义词扩展;长度因子(关键词越多权重越高)。
构成的对象要素:
rag_index.json:检索索引,由构建脚本生成。rag_service.py:搜索入口search_index()、get_relevant_cga_examples()。scripts/build_rag_index.py:索引构建脚本。- 源数据:
/www/wwwroot/marketplace.rulepackage.com/files与根目录。
如何快速填充/完善:
- 上传更多优质 CGA 到 Marketplace;每个建筑风格/类型建议 3–5 个不同变体。
- 文件头部写清楚注释说明,便于构建脚本提取标题和关键词。
- 上传后重建索引:
python scripts/build_rag_index.py --mode local。 - 扩展
DOMAIN_SYNONYMS同义词表(如四合院、天井、骑楼、Art Deco、Brutalist)。 - 配置
EMBEDDING_API_URL/KEY/MODEL后使用--mode api,升级为语义检索。
5. LLM 兜底
作用:当前面四层都无法生成有效代码时调用大模型生成;同时用于 refine(优化代码)和 fix(修复报错)。
触发条件:前面四层全部失败或未命中;RAG 片段、私有知识库、Polish 参数与几何策略作为上下文注入。
决定使用它的影响因素:是否有可用的 LLM API Key(Kimi / DeepSeek / SiliconFlow / Qwen / OpenAI);llm.provider 决定首选模型;提示词中注入的上下文质量。
构成的对象要素:
ai_service.py:多模型客户端与自动切换链。nl2cga_service.py:SYSTEM_PROMPT、build_context_prompt()、build_generate_prompt()、geometry_strategy_hint()。nl2cga/prompt_assembler.py:实体/模式/RAG 片段格式化。nl2cga/intent_router.py:意图识别与实体/模式映射。nl2cga/knowledge_retriever.py:私有知识库检索。- 配置表
system_configs:llm.provider、各 provider API Key。
如何快速填充/完善:
- 在后台
SystemConfig中配置至少两个 LLM provider 的 Key,保证自动切换。 - 扩充私有知识库:
/www/wwwroot/cgajs-project/private-knowledge/cga-patterns/building-entities.json、chinese-palace-patterns.json、rag-index-private.json。 - 优化
SYSTEM_PROMPT,强化必须声明attr、使用注解、禁止随机scope.sy表达式。 - 利用
CgaSuccessCase中的成功样本做后续 SFT/RLHF 微调。
综合建议:如何让 AI 生成更智能、更高效
| 优先级 | 行动 | 预期效果 | 投入成本 |
|---|---|---|---|
| P0 | 让 Prebuilt 模板尊重 Polish 尺寸 | 解决大房子用 scope.sy 的问题 | 低 |
| P0 | 把通用建筑模板拆细 | 避免通用词被单一模板垄断 | 低 |
| P1 | 提升 Assembler 优先级或加开关 | 简单描述走规则化生成 | 中 |
| P1 | 扩充 Marketplace 优质 CGA | RAG 召回率与 LLM 质量提升 | 中 |
| P1 | 扩展 Template Engine 模板库 | 覆盖更多地标与常见建筑 | 中 |
| P2 | 启用 Embedding API 语义 RAG | 从关键词匹配升级到语义匹配 | 中 |
| P2 | 建立成功样本反馈闭环 | 用于模型微调或规则优化 | 高 |
| P2 | 引入用户评价/编辑回写 | 用户修改后的代码回流到知识库 | 高 |
关于“大房子平屋顶”的具体说明
输入 "生成一个大房子平屋顶" 时,Polish 引擎已正确识别 size_class=large、geometry_strategy=quad_extrude 以及具体尺寸/屋顶类型;但 nl2cga_generate() 在第 1 层 Prebuilt 匹配中命中了 02-modern-villa.cga(其 manifest.json 的 keywords 包含 "大房子"),因此直接返回该固定模板,跳过了 Assembler。
后续可考虑的四个方向:
- A:修改
02-modern-villa.cga,把extrude(scope.sy*1.5+rand(0.5))改成按attr length/width/height生成。 - B:新增
large-flat-roof.cga模板,keywords 包含"大房子 平屋顶",得分更高。 - C:调整
nl2cga_service.py优先级,把 Assembler 调到 Prebuilt 之前。 - D:在前端增加“强制规则化生成”开关。
完成 cgajs.com 与 rulepackage.com 之间的服务间认证改造,双站互调统一使用 HMAC-SHA256 服务签名,关闭公开注册入口,仅保留管理员后台手动开户。
- 公开注册关闭:
POST /api/v1/auth/register返回 403;auth.allow_public_registration=false由SystemConfig控制。 - OAuth 注册关闭:
auth.allow_oauth_registration=false;OAuth 回调不再自动创建新用户,未绑定邮箱时返回 403。 - 管理员手动开户:新增
POST /api/v1/admin/users,仅管理员可创建普通用户。 - 服务签名双通:cgajs.com → rulepackage.com 与 rulepackage.com → cgajs.com 均使用
X-Service-Id / X-Service-Timestamp / X-Service-Signature头,Base string 为{timestamp}\n{method}\n{path}\n{body_sha256},密钥分别存放在service.{id}.secret。 - 白名单兼容:
shared_auth.get_current_user_or_proxy优先 JWT,其次服务签名,最后保留 legacyX-API-Key用于过渡。 - 验证结果:双向
/api/v1/quota服务签名调用均返回 200;注册接口返回 403。
在 cityvistion.cn 网关层补齐配额扣减、按量计费、统一错误响应与增强用量日志,使外部流量全部可追踪、可计费、可审计。
- 统一错误响应:新增全局异常处理器,所有 4xx/5xx/校验错误返回统一 JSON
{success, code, message, detail, request_id, timestamp}。 - Request ID 全链路:中间件生成
request_id并写入 AccessLog / UsageLog,错误与审计均可追踪。 - 配额补全:
/api/v1/cv/*(parse/generate)、/api/v1/cv/preview、/api/v1/cv/jobs/{id}、/api/v1/marketplace/*/download、/api/v1/plugins/*/download全部接入按 Key 按天配额。 - 按量计费:
UsageLog.cost按当前套餐的price / (days * quota)自动计算,免费套餐为 0。 - 用量日志增强:
usage_logs新增request_id / action / latency_ms / response_size / http_status;access_logs新增request_id / latency_ms / response_size。 - Prometheus 指标:新增
cv_gateway_requests_total{endpoint,backend,status}与cv_gateway_request_duration_seconds{endpoint,backend}。 - 后端签名一致:cityvistion → cgajs/rulepackage 代理使用
\\n字面量 HMAC base string,与后端shared_service_auth.py保持一致。 - 验证结果:
/api/v1/cv/parse返回 200 并扣减 parse 配额;缺少 API Key / 404 / 校验错误均返回统一格式。
将 Runtime Worker 的几何生成全面迁移到 cv_geometry_native C++ 内核,补齐测试与性能基准,并通过 Celery autoscale 实现单节点弹性并发。
- C++ 内核覆盖补全:参数化建筑
runtime._triangulate_prism与 CGA_do_roof的屋顶侧墙均改为调用geometry_bridge.extrude_polygon,失败回退 trimesh/shapely。 - Bridge 可观测性:
geometry_bridge.py记录每个几何操作的 native/fallback 路径、耗时;新增 Prometheus 指标cv_geometry_native_calls_total、cv_geometry_fallback_calls_total、cv_geometry_op_duration_seconds{op,mode}。 - 回归测试:新增
cv_geometry_native/tests/test_native.py,覆盖 offset / inset / slice / extrude / triangulate / 带孔多边形 / 性能,7 项全部通过。 - 性能基准:新增
cv_geometry_native/tests/benchmark.py;native extrude 比 trimesh 快约 95 倍,offset/inset/slice 均快 2~20 倍。 - 弹性并发:
cv-runtime-worker.service启用 Celery--autoscale=8,2,队列空闲时保持 2 进程,任务激增时自动扩展到 8 进程。 - 验证结果:参数化预览与 CGA
Lot --> extrude(10)均成功生成场景;native benchmark 7 项通过。
在 Runtime Worker 原有三阶段交付基础上进一步生产化:提升 C++ 内核鲁棒性、基于队列深度的动态扩缩容、任务结果持久化指标与死信队列。
- C++ 内核压测:新增
cv_geometry_native/tests/stress_test.py,1000 次随机/星形/带孔/大坐标/自相交多边形测试;offset/inset/slice 100% 成功,extrude 99.2% 成功,native 路径占比 99% 以上。 - 输入自修复:
geometry_bridge.py对无效/退化多边形先执行buffer(0)修复,修复失败再 fallback;新增invalid_inputs与repair_attempts统计。 - 队列深度 Autoscaler:新增
autoscaler.py与cv-runtime-autoscaler.service;根据celery队列长度在min_max=4与absolute_max=16之间动态调整 Celery autoscale。 - OSS 上传指标:新增 Prometheus 指标
cv_runtime_oss_upload_total{status}与cv_runtime_dead_letter_total{reason}。 - 死信队列:任务异常与 OSS 上传失败均写入 Redis
cv:dead_letter列表,便于后续重试与审计。 - 验证结果:参数化预览返回
scene_url;autoscaler 已启动并初始缩放至 max=4。