quote-mcp-server
🏗️ decoration-quote-engine
装修硬装报价引擎 · 已落地生产验证:DXF 墙线拓扑重建 → 工程量提取 → 确定性报价 → HTTP / MCP 服务
配套智能体项目:interior-ai-agent(LangGraph 编排层,经 MCP 调用本引擎与软装目录) 软装单价目录(独立仓库):soft-mcp-server
✨ 它解决什么问题
装修报价长期依赖人工量房 + Excel 套价,存在三个痛点:
慢且不可复现 —— 同一张户型图,不同设计师出价差异大,客户难以比价。
黑盒 —— 客户看不到「面积怎么来、单价怎么定」,信任成本高。
LLM 幻觉 —— 直接让大模型算钱,金额随温度波动、无法审计。
本引擎用确定性代码替代人工套价:几何算量 + 规则报价全部可复现、可审计,仅在「风格识别」「置信度不足」等少数卡点引入人工确认(HITL)。
📦 它做什么(真实案例 · 南京·新块1)
输入一张量房后的原始墙体图(DWG→DXF,无任何闭合房间线),输出可直接给客户看的硬装 + 软装报价:
新块1.dxf(套内 60.48㎡,两室两厅)
→ 墙线 topo 重建,自动围合 7 个房间 + 干湿区分类
餐厅/主卧/客厅/次卧=dry,厨房/卫生间/阳台独立分区
→ 门 5 / 窗 5 / 垭口 1 自动识别
→ 硬装报价 标准档 ¥94,806.79(70 项明细)
→ 软装预算 奶油风格 标准档 ¥109,100
→ 客户整装预算 ≈ ¥203,907(硬装 + 软装)全程零 LLM 调用——算量与算钱都是确定性代码,同一输入永远得到同一输出。
🧱 架构(四层)
┌─────────────────────────────────────────────────────────────┐
│ 编排层 interior-ai-agent (LangGraph) │
│ intent 解析 / 多轮改价 / HITL 人工确认 / 案例图检索 │
└───────────────┬───────────────────────────┬─────────────────┘
│ MCP stdio │ MCP stdio
▼ ▼
┌───────────────────────────┐ ┌─────────────────────────────┐
│ 硬装引擎 (本仓库) │ │ 软装目录 soft-mcp-server │
│ parse_dxf │ │ soft_catalog │
│ compute_quote │ │ compute_soft_budget │
│ generate_report │ └─────────────────────────────┘
└───────────────┬───────────┘
│ 内部 importlib 加载 soft_prices.py
▼
┌───────────────────────────┐
│ A 层 src/service.py │ FastAPI:/quote /soft /health /reports
│ + Docker / docker-compose │ 可被任意前端 / 系统直接 HTTP 调用
└───────────────────────────┘🧠 核心设计
1. 墙线拓扑重建(src/agents/hard/takeoff.py)
原始墙体图往往没有闭合的房间多段线。本引擎用 shapely.polygonize + networkx
从纯墙线段自动围合房间,再按文字标注 / 面积启发式判定房间功能(厨房 / 卫生间 / 阳台),
输出带置信度的工程量 JSON:
ROOM图层闭合多段线优先(confidence 0.90)无 ROOM 图层时走
wall_polygonize墙线围合(confidence 0.75)confidence < 0.70 触发人工核对(HITL)
2. 规则报价引擎(src/agents/hard/cost.py)
单价表按 zone(dry/wet/kitchen/balcony/all)× basis(计量依据)驱动,内置一线业务规则:
规则 | 说明 |
门按套计 | 木门 1298 元/套;门套按 |
瓷砖品牌统一 | 同空间墙/地砖自动选同一品牌(两种品牌有 200 元小单费) |
地面材质分支 | 铺瓷砖→含铺贴人工、免地垫宝;铺地板→需地垫宝找平、踢脚线赠送 |
水电分档 | 1室1厅≤60平 8500;2室以上≤75平 10000;>75平按建筑面积×140(建面=套内/0.75) |
石膏板平顶 | 只算衣柜柜头:投影面积×(柜深/柜高),非全屋满吊 |
橱柜/定制柜估算 | 按套内面积-户型对照表自动估延米/投影面积,可用实测值覆盖 |
提问点机制 | 层高、卧室瓷砖还是地板、下沉找平——计算前必须确认 |
3. 档次分档(tier)—— 激活「预算调高 / 调低」
单价表(config/unit_price_nanjing_mq.csv)每行带 tier 列:最简 / 标准 / 轻奢 / 通用(不分档)。
标准为锚点(即原南京美全价目表基线);最简/轻奢缺项时自动回退到标准,保证任何档位都能算全。分档价差覆盖:木门、强化地板、瓷砖(300/800 系列)、钛合金门、集成吊顶、开关插座、定制柜等主材。
语义归一:
低档/经济→最简,中档/性价比→标准,高档/豪华→轻奢。同一套工程量下,三档真实金额(新块1):最简 ¥83,735 / 标准 ¥94,807 / 轻奢 ¥107,596。
4. MCP Server(src/mcp_server/server.py)
引擎以 MCP stdio 协议对外暴露 3 个工具,可被 LangGraph Agent、Claude Desktop、Cursor 等任意 MCP Host 调用:
Tool | 输入 → 输出 |
| DXF 路径 → 工程量 JSON + confidence + 房间摘要 |
| takeoff JSON + ProjectConfig(层高/地面材质/品牌偏好/tier)→ 报价 JSON |
| 报价 JSON → 打印友好 HTML |
5. A 层 HTTP 服务(src/service.py)
FastAPI 把引擎封装成 HTTP 接口,软装目录经 importlib 按路径加载(规避双 src 包命名冲突),
输出自动落盘到 output/,HTML 报价单通过 /reports 静态挂载直接预览。
📁 项目结构
decoration-quote-engine/
├── src/
│ ├── core/ # 数据模型 / DXF IO / 几何工具 / 配置
│ │ ├── models.py # Takeoff / HardQuote / ProjectState
│ │ ├── dxf_io.py
│ │ ├── geometry.py
│ │ └── config/ # 单价表加载
│ ├── agents/hard/
│ │ ├── takeoff.py # DXF 解析 + 墙线拓扑重建 + 工程量提取
│ │ ├── cost.py # 规则报价引擎(ProjectConfig + zone/basis 匹配)
│ │ └── quote_report.py # 报价 JSON → HTML
│ ├── mcp_server/server.py # quote-mcp-server(FastMCP stdio)
│ └── service.py # A 层 FastAPI:/quote /soft /health /reports
├── config/
│ └── unit_price_template.csv # 单价表格式模板(真实价目表不入库)
├── output/ # 运行产物(takeoff/quote/报价单 JSON+HTML)
├── tests/ # pytest(takeoff 回归 + MCP 全链路冒烟)
├── Dockerfile # python:3.13-slim
├── docker-compose.yml # 挂载 soft-mcp-server,端口 8000
├── .dockerignore
├── requirements.txt # fastapi / uvicorn / ezdxf / shapely / networkx
├── docs/
│ ├── deploy.md # 部署与端点说明
│ └── case_study.md # 落地复盘(真实数据)
└── 装修报价智能体_技术方案文档.md🚀 快速开始
A. CLI 跑通整条链路
pip install -r requirements.txt
# 1) DXF → 工程量
python -m src.agents.hard.takeoff path/to/户型.dxf output/takeoff.json
# 2) 工程量 → 硬装报价(需按 config/unit_price_template.csv 准备单价表)
python -m src.agents.hard.cost output/takeoff.json config/你的单价表.csv output/quote.json
# 2b) 带档次:--tier 最简/标准/轻奢
python -m src.agents.hard.cost output/takeoff.json --tier 轻奢 output/quote_lux.json
# 3) 报价 → HTML 报价单
python src/agents.hard/quote_report.py output/quote.json output/quote.html
# 直接起 MCP Server(stdio)
quote-mcp-server
# 测试
pytest tests/ -qB. HTTP 服务(A 层)
# 设置软装目录仓库路径(docker-compose 通过 SOFT_REPO_PATH 注入)
export SOFT_REPO_PATH=/path/to/soft-mcp-server
uvicorn src.service:app --host 0.0.0.0 --port 8000端点 | 方法 | 说明 |
| GET | 健康检查 |
| POST |
|
| POST | JSON: |
| GET | 已生成的 HTML 报价单(静态目录) |
# 调硬装报价
curl -F "dxf=@新块1.dxf" -F "style=奶油" -F "tier=标准" http://localhost:8000/quote
# 调软装预算
curl -X POST http://localhost:8000/soft -H "Content-Type: application/json" \
-d '{"style":"奶油","tier":"标准"}'C. Docker 部署
# 在 docker-compose.yml 中设置 SOFT_REPO_PATH 指向本地 soft-mcp-server
docker compose up --build
# → http://localhost:8000/health详见 docs/deploy.md。
🧾 真实落地效果(新块1 · 南京)
维度 | 结果 |
套内面积 | 60.48 ㎡ |
自动围合房间 | 7 间(4 dry + 厨房 + 卫生间 + 阳台) |
门窗识别 | 门 5 / 窗 5 / 垭口 1 |
解析方式 / 置信度 | wall_polygonize / 0.75(触发人工核对提示) |
硬装(标准档) | ¥94,806.79(70 项) |
软装(奶油·标准档) | ¥109,100 |
客户整装预算 | ≈ ¥203,907 |
硬装三档:最简 ¥83,735 / 标准 ¥94,807 / 轻奢 ¥107,596 软装五风格(标准档):现代简约 ¥98,190 / 奶油 ¥109,100 / 中古 ¥114,555 / 法式 ¥125,465 / 新中式 ¥130,920
完整复盘见 docs/case_study.md,全部原始产物在 output/。
⚠️ 已知边界
单价表基于南京市场(2026),其他城市需替换
config/下的价目表房间围合依赖墙线基本闭合;低置信度结果会在 JSON 中给出 warnings,由上层做人工确认(HITL)
橱柜延米 / 衣柜投影面积默认按户型规则估算,精确报价需实测值覆盖
A 层服务通过
importlib按文件路径加载软装目录的soft_prices.py,需正确设置SOFT_REPO_PATH
📜 License
MIT © 2026