← back to Interiordesignershowroom
lib/scene.js
31 lines
// Room-scene generator DISPATCHER (TK-10402).
// Selects the image backend by SCENE_PROVIDER so a depleted provider is a one-flag flip:
//
// SCENE_PROVIDER=gemini (default) — nano-banana, multi-product reference. BEST + cheapest ($6 total).
// SCENE_PROVIDER=replicate-flux — Flux-Kontext fallback, single-reference. Needs a funded REPLICATE_API_TOKEN.
//
// Both providers export the same contract { generateScene, COST_PER_IMAGE }, so every
// caller (scripts/backfill-room-scenes.js, lib/roomgen, etc.) is untouched. Adding a new
// backend = drop a lib/scene-providers/<name>.js exporting that contract + name it here.
const PROVIDERS = {
gemini: () => require('./scene-providers/gemini'),
'replicate-flux': () => require('./scene-providers/replicate-flux'),
};
const NAME = (process.env.SCENE_PROVIDER || 'gemini').toLowerCase();
const load = PROVIDERS[NAME];
if (!load) {
throw new Error(`Unknown SCENE_PROVIDER "${NAME}". Valid: ${Object.keys(PROVIDERS).join(', ')}`);
}
const provider = load();
module.exports = {
PROVIDER: NAME,
generateScene: provider.generateScene,
// Editorial (reference-free) hero used by scripts/gen-guide-heroes.js. Routed through
// the SAME dispatcher so the guides half honours SCENE_PROVIDER too — before this it
// called Gemini directly and silently ignored the flag (TK-10402).
generateEditorial: provider.generateEditorial,
COST_PER_IMAGE: provider.COST_PER_IMAGE,
};