Roomet
上传一张房间照片,选择一种风格,AI 将重新构想这个空间。生成三种变体,挑选一个,然后逐件家具进行编辑,直到它完全符合你的心意。
- 类型
- 网站
- 角色
- 独立开发
- Status
- 进行中
- Tech
- Next.js 15 React 19 TypeScript Tailwind v4 FastAPI Gemini 3 Pro Image YOLO-World arq / Redis Supabase PostgreSQL
- Started
- 2026年2月
将 Roomet 对准一张房间照片,它会根据你选择的风格,返回三种 AI 生成的重设计方案。挑选一个,然后继续逐件家具进行编辑——更换沙发、换掉地毯、重新粉刷墙壁——直到你得到理想中的房间。每个版本都会被追踪,你随时可以回退。
功能简介
上传左侧的照片,描述想要的氛围,Roomet 会给出下面三种变体。每一种都是完全重新渲染的场景,保留了房间的骨架(窗户、门道、平面布局),但让风格、家具和配色方案随提示词自由发挥。



前后对比
输入始终是真实的照片——手机拍摄、光线杂乱、角度倾斜,都没关系。Roomet 能处理这些,因为繁重的任务由 Gemini 3 Pro Image 承担。
这是同一房间经过 Roomet 初次处理后的效果,在实际 UI 中有一个可拖动的“前后”滑块:


应用界面
整个体验由三个界面承载:一个着陆页、创建/配置流程和编辑器。



用户流程
/create 路由引导你完成:上传 → 配置 → 观看闪烁动画 → 从三个变体中选择一个。选择一个变体会跳转到 /edit/[variantId],真正的交互在这里发生。
家具级编辑
编辑器是产品的核心。将鼠标悬停在任何一件家具上,SegmentOverlay 会高亮显示它(后端使用 YOLO-World + Gemini 分割);点击选中它,底部的工具栏会变成一个针对该家具的提示词输入框。输入“把这个沙发换成奶油色亚麻布”,只有那个沙发会改变,房间的其余部分保持不变。
如果未选中任何物品,你的提示词将应用于整个场景。
版本历史
每次编辑都会产生一个新版本,在编辑器底部显示为缩略图条。点击任何旧版本即可回滚,而不会丢失之后的版本——历史记录是一个有向无环图,而非线性的撤销栈。这足以让你放心大胆地尝试。
灵感画廊
一个独立的画廊信息流会推送按风格标签分组的精选参考房间。点击一个即可将其风格复制到你自己的房间上。
架构
前端 (Next.js 15, React 19, TypeScript, Tailwind v4):
- 使用 App Router,包含四个顶级路由:
/、/create、/edit/[variantId]、/scene/[id](旧版重定向) - 用于分割的 Canvas 覆盖层 (
SegmentOverlay.tsx) 处理边界框命中测试和遮罩高亮 BeforeAfterSlider、StyleCard、PillSelector、ProductQueries构成了 UI 的其余部分- API 客户端通过
lib/api.ts中的pollJob()轮询后端以获取长时间运行的任务状态 - Next.js 重写代理将
/api/*和/uploads/*路由到本地 FastAPI 后端,因此浏览器从不直接与 Gemini 通信
后端 (FastAPI + Gemini + arq):
- FastAPI API,包含场景、变体、任务、画廊和分割的端点
- 繁重的生成任务在 arq workers(基于 Redis 的任务队列)中运行,以保持 HTTP 响应迅速;当 Redis 不可用时,优雅地回退到 Python 线程
- 使用 Gemini 3 Pro Image 进行生成和修复式编辑;使用 YOLO-World 进行按需家具分割
- 使用 SQLAlchemy 连接 Supabase PostgreSQL——连接池、版本化变体历史、任务状态
- 两层图像缓存:前端是 Redis(24 小时 TTL),API 实例上是内存 LRU(约 20 个槽位)
- 基于聊天会话的 Gemini 调用,因此对同一变体的多轮编辑能保持上下文感知
亮点
- 家具感知编辑——分割 + 修复技术让你可以一次编辑一个物体,而不是每次更改都重新生成整个图像。这是让 Roomet 感觉像一个工具而非老虎机的关键区别。
- 默认生成三种变体——一次生成调用产生三种风格不同的方案,让你从一个真正的菜单中挑选,而不是“不断重试直到满意”。
- 版本有向无环图,而非线性撤销——每次编辑都从其父版本分支出来。你总是可以回滚并选择不同的方向,而不会丢失已经探索过的时间线。
- 智能后端回退机制——没有 Redis?使用线程 worker。Gemini 被限速?指数退避重试。YOLO-World 模型未加载?在首次分割请求时惰性加载。