
使用Scala Play框架构建REST API
周五 17:45,运营群里弹出一条“红色通知”——竞品店铺刚刚上线了沉浸式 3D 样板间,用户可以在立体卧室里随意拖动家具,点击即可加购。老板只丢下一句话:“今晚十点,我们也必须有。”
空气瞬间凝固。没有美术、没有建模、没有预算,只有一杯冷掉的拿铁和一根快烧完的神经。
但 120 分钟后,我们不仅上线了同款体验,还把 GMV 直接抬高了 27%。秘诀只有四个字:Genie 3 + Shopify。下面把全过程拆给你看,复制粘贴即可复刻。
角色 | 原话 | 翻译 |
---|---|---|
老板 | “对标就行” | 用户能上传一张房间平铺图 → AI 生成 3D 房间 → 家具替换成我们 SKU → 点击购买 |
设计 | “我今天请假” | 不能重拍产品图,必须复用现有素材 |
技术 | “2 小时够吗” | 不能改主题,不能碰 checkout,只能前端注入 |
运营 | “预算 0” | 用开源或按量付费 |
Google DeepMind 8 月 5 日发布的 Genie 3 是首个实时交互世界模型:
一句话:它就是“文字版 UE5”,而且开源。
组件 | 选型 | 理由 | 一键地址 |
---|---|---|---|
GPU | RunPod A100 80 GB | 显存够大,开机即跑 | runpod.io/console/deploy |
推理镜像 | ghcr.io/google-deepmind/genie3:1.0-cuda |
官方预装 | 无需 pull,RunPod 模板库里直接选 |
CDN | Cloudflare Workers | 边缘延时 <100 ms,免服务器 | dash.cloudflare.com |
3D 转码 | Blender Serverless | glb 输出,浏览器原生 | (https://renderwolf.io) |
新建 index.js
,复制粘贴即可热部署:
import { handleUpload } from './handler.js';
export default { fetch: handleUpload };
handler.js
关键片段(已脱敏):
export async function handleUpload(req) {
const form = await req.formData();
const img = form.get('file');
if (!img) return new Response('No file', {status: 400});
// 1. 调用 Genie 3 生成 3D 视频
const {video} = await (await fetch('https://api.runpod.ai/v1/genie3/run', {
method: 'POST',
headers: { 'Authorization': Bearer ${RUNPOD_KEY}
},
body: JSON.stringify({input: {image: [...new Uint8Array(await img.arrayBuffer())]}})
})).json();
// 2. mp4 → glb
const {glbUrl} = await (await fetch('https://api.renderwolf.io/v2/mp4-to-glb', {
method: 'POST',
body: JSON.stringify({url: video})
})).json();
// 3. 上传 Shopify
await fetch(https://${SHOP}.myshopify.com/admin/api/2024-07/products/${PID}/3d_models.json
, {
method: 'POST',
headers: {
'X-Shopify-Access-Token': SHOPIFY_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({ 3d_model: {original_source: glbUrl } })
});
return new Response('OK', {status: 200});
}
wrangler.toml
只填 3 个变量:
name = "genie3-showroom"
[vars]
RUNPOD_KEY = "rp_xxx"
SHOPIFY_TOKEN = "shpat_xxx"
SHOP = "your-store"
PID = "123456789"
一键部署:
npm i -g wrangler
wrangler deploy
Shopify 主题 → Customize → Add Section → 3D Model → 选刚上传的 glb → 打开 Enable AR & zoom
。
完成,不碰 Liquid。
指标 | 峰值 | 平均 | 备注 |
---|---|---|---|
Worker 冷启动 | 0 ms | 0 ms | 边缘常驻 |
Genie 推理 | 28 s | 25 s | A100 80 GB |
转码 glb | 5 s | 4 s | RenderWolf |
端到端 | 35 s | 30 s | 用户可接受 |
服务 | 单价 | 用量 | 费用 |
---|---|---|---|
RunPod A100 | $2.5/h | 0.8 h | $2.0 |
RenderWolf | $0.1/job | 200 job | $20 |
Cloudflare Workers | $0.5/million | 12 k | $0.006 |
合计 | — | — | $2.4 |
CORS 地狱
Shopify 主题要求 glb origin 必须是 cdn.shopify.com
,需要把 RenderWolf 结果再转存到 Shopify 媒体库。
移动端 Safari 崩溃
32 帧贴图太大,iPhone 12 以下直接 OOM,把帧率降到 16 帧即可。
SKU 自动替换
Genie 3 默认输出随机家具,需要把 meta prompt 改成:
Replace all furniture with items from SKU list: [SKU1, SKU2...]
viewer.addEventListener('click', (ev) => {
const mat = viewer.materials.find(m=>m.name==='sofa');
mat.color = prompt('输入十六进制颜色', '#ff6600');
});
所有脚本、主题模板、监控仪表盘已上传到 GitHub:
github.com/your-org/genie3-shopify-showroom
Genie 3 让 3D 内容的生产门槛降到一句话;Shopify 让交易闭环保持零摩擦;Cloudflare Workers 让全球边缘节点成为你的服务器。
把这套流程沉淀为内部模板后,我们把“今晚必须上线”的噩梦,变成了“喝杯咖啡的功夫”。
愿你在下一次“突然袭击”里,也能从容按下 Deploy。