---
name: ai-kujiale-design
description: 室内智能设计skill，分步式对话完成户型确认→风格选择→布局确认→渲染出图。
version: 0.0.4
author: ManycoreTech
tags: [aiDesign, kujiale, coohom]
---

# 室内智能设计

## 说明
必须严格根据本文档流程来执行，不能自作主张发散。

## 初始化配置
首次使用需在项目根目录创建 `.kjlconfig.json` 文件（参考 `.kjlconfig-example.json`），配置 access_token。
若无 token，引导用户访问 https://www.kujiale.com/skills 生成并保存 `.kjlconfig.json`，key 是access_token，value
 是用户复制的值，`.kjlconfig.json`要保存在`.kjlconfig-example.json`同一目录下。

## Token 读取
所有脚本调用前，先从 `.kjlconfig.json` 读取 access_token字段作为 token：

## 版本校验
每次执行前调用：`node ./scripts/versionCheck.js --token=${token} --version=0.0.4`
- action=1：继续
- action=2：提示"版本已过时，建议更新"
- action=3：终止，提示"版本已废弃，需重新安装"

## 输出规则
- 进度反馈通过 `message(action=send)` 发送
- 最终结果只输出渲染图、全景图和设计亮点，最终结果要严格按照./outputs/result.md输出
- 已发送的消息不重复输出

---

## 分步流程

### 阶段1：户型获取与确认

**触发条件**：用户提到要做室内设计/装修设计

**步骤1.1**：询问户型来源
> "请问您有户型信息吗？
> - 输入小区名搜索户型
> - 或直接上传户型图"

**路径A：文字搜索户型**

**步骤1.2a**：询问城市
> "请问房子在哪个城市？"

**步骤1.3a**：询问小区
> "请问是哪个小区？户型信息（几室几厅、面积）也可以一起告诉我。"

**步骤1.4a**：搜索户型
```
node ./scripts/searchPlan.js --token=<token> --query=<小区名> --areaId=<城市id> --start=0 --num=20
```
展示结果让用户选择：
> "找到以下户型，请回复数字选择：
> 1. {小区名} {面积}㎡ {户型结构}
> 2. ..."

用户选择后获得 planId。

**步骤1.5a**：获取户型图并展示给用户确认
```
node ./scripts/getFloorplanInfo.js --planId=<planId>
```
解析返回结果：
- 若 `floorplanInfos` 为空数组：提示"户型图获取失败，请重新选择或上传户型图"，返回步骤1.4a
- 若有数据：取 `floorplanInfos[0].planImage` 展示给用户，直接展示图片

> "户型已生成，请查看户型图：
> [展示 planImage 图片]
> 面积：{realArea}㎡
> 请确认是否满意？
> - 回复「确认」继续创建方案
> - 回复「重新生成」重新搜索户型
> - 回复「上传图片」改为上传户型图"

等待用户回复：
- 若用户确认满意 → 进入步骤1.6创建方案
- 若用户不满意 → 根据用户选择重新执行路径A或路径B

**路径B：上传户型图**

同时监听 `~\.openclaw\media\inbound` 是否有新图片（每5秒检查）。

**步骤1.2b**：识别户型图
检测到图片后：
> "检测到您上传了图片，正在识别户型..."

**步骤1.3b**：上传图片
```
node ./scripts/getUploadToken.js --token=<token>
```
按 ./docs/upload.md 执行上传获取 url。

**步骤1.4b**：创建临摹任务
```
node ./scripts/createBitmapTask.js --token=<token> --bitmap=<url>
```
轮询结果：
```
node ./scripts/getBitmapTaskResult.js --token=<token> --taskId=<taskId>
```
获得 planId。

**步骤1.5b**：获取户型图并展示给用户确认
```
node ./scripts/getFloorplanInfo.js --planId=<planId>
```
解析返回结果：
- 若 `floorplanInfos` 为空数组：提示"户型图识别失败，请重新上传或搜索户型"，返回步骤1.2b
- 若有数据：取 `floorplanInfos[0].planImage` 展示给用户

> "户型已识别生成，请查看户型图：
> [展示 planImage 图片]
> 面积：{realArea}㎡
> 请确认是否满意？
> - 回复「确认」继续创建方案
> - 回复「重新生成」重新上传户型图
> - 回复「搜索户型」改为文字搜索"

等待用户回复：
- 若用户确认满意 → 进入步骤1.6创建方案
- 若用户不满意 → 根据用户选择重新执行路径A或路径B

**步骤1.6**：创建方案（两种路径合并）
```
node ./scripts/createDesign.js --token=<token> --planId=<planId>
```
获得 designId。

**步骤1.7**：确认户型
> "已确认户型：{户型信息}，接下来选择您喜欢的风格～"

---

### 阶段2：风格选择（标签+硬装风格）

**触发条件**：户型已确认

**步骤2.1**：获取标签并展示选项
```
node ./scripts/getTags.js --token=<token>
```
解析返回的标签列表，展示给用户：
> "请选择您的偏好：（单选，回复数字如'1'）
> 1. {标签项1名称}
> 2. {标签项2名称}
> 3. ...
> 或直接描述您的喜好"

用户选择后获得 tagItemIds 列表。

**步骤2.2**：查询硬装风格
```
node ./scripts/getStyles.js --token=<token> --tagItemIds=<id1,id2,...>
```

**步骤2.3**：风格选择
- 若返回多个风格：展示封面图让用户选择
> "以下硬装风格可选，请回复数字选择："
> 展示每个风格的 coverUrl 图片 + styleName，如果非Webchat渠道，直接展示图片

- 若返回单个风格：默认选择
> "已为您匹配{风格名}风格"

获得 styleId，进入下一阶段。

---

### 阶段3：布局生成与确认

**触发条件**：风格已确认。

**步骤3.1**：使用 message(action=send) 发送"开始布局，请稍等"

**步骤3.2**：执行智能布局（POST，参考 ./docs/layout.md）
参数：designId、tagIds、styleId、applyDecorationStyle=true、buildCeiling=true、autoDesign=true、platform=3

**步骤3.3**：等待并查询布局结果
```
node ./scripts/getLayoutResult.js --token=<token> --designId=<designId>
```
若 c!=0 则每10秒重复查询。

**步骤3.4**：展示布局结果并等待用户确认
使用 message(action=send) 发送布局信息：
> "布局已生成！以下是各房间的布局情况：
> - {房间名1}：{家具列表}
> - {房间名2}：{家具列表}
> ...
直接进入阶段4渲染出图



---

### 阶段4：渲染出图

**触发条件**：布局已确认

**步骤4.1**：使用 message(action=send) 发送："开始渲染，请稍等"

**步骤4.2**：触发渲染
```
node ./scripts/trigger-render.js --obsDesignId=<designId> --xToken=<token>
```
发送：`"正在生成效果图，预计几分钟..."`

**步骤4.3**：等待10秒后查询渲染结果
```
node ./scripts/getRenderResult.js --token=<token> --designId=<designId>
```
提取 pictype=0 的 img（渲染图）和 pictype=1 的 panoLink（全景图）。若空则每分钟重试，超5分钟反馈失败。

**步骤4.4**：输出最终结果
发送：`"效果图已生成！"`
严格按 ./outputs/result.md 格式输出：
- 设计亮点（根据第一张渲染图总结）
- 渲染图（按房间优先级：客餐厅→主卧→次卧→其他）
- 全景图链接
- 方案详情链接（https://www.kujiale.com/pcenter/design/{designId}/setting?from=skills）

---

## 渠道规则
- Webchat：直接发送图片链接
- 飞书：推送格式 `MEDIA:图片url`，即直接展示图片

## 结果排序
客餐厅 → 主卧 → 次卧 → 其他

## 接口文档
- 户型搜索：./docs/planSearch.md
- 户型图信息：./docs/floorplanInfo.md
- 生成方案：./docs/createDesign.md
- 硬装风格库：./docs/hardStyle.md
- 客户标签：./docs/customTag.md
- 智能布局：./docs/layout.md
- 布局结果：./docs/layoutResult.md
- 布局候选：./docs/layoutCandidates.md
- 渲染结果：./docs/renderResult.md
- 上传：./docs/upload.md
- 临摹导入：./docs/planUrlCreate.md
- 临摹轮询：./docs/planUrlCreateResult.md
- 版本校验：./docs/versionCheck.md