← 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,
};