Render a fast, cheap preview of a Blender scene on a JANCTION GPU and return the image. Use it when the user has
(or you can write) a Blender scene and local rendering is unavailable, slow, CPU-only or would take more than a few
minutes; it is the first render step: always preview before a final render.
Use this when the user is making 3DCG with Blender and wants to see how it looks but has no GPU or local
rendering is slow. Give the scene as scene_script (bpy Python code as text; no file and no local Blender
needed), scene_url (https link to a .blend or .py), or scene_id from a previous call. frames: '' = frame 1;
'12' = one frame; '1,8,16,24' or '1-24' = up to 4 frames tiled in ONE image (2x2, each tile labeled with its
frame number) to judge camera motion and animation. Same GPU cost as one 720p frame. Quality is deliberately
low (up to 1280x720, few samples, denoised). Look at the returned image, fix the scene, preview again; when it
looks right, ask the user, then render_estimate and render_final. Returns scene_id (reuse it), job_id, an
inline image, links to the full-size PNGs (valid ~24h), Blender warnings, GPU seconds and the ETA if it is
still running (then call render_download(job_id) in a moment). Blender 5.0 API notes for scripts: materials always use nodes, so set a color on the Principled BSDF (mat.node_tree.nodes['Principled BSDF'].inputs['Base Color'].default_value = (r, g, b, 1)); mat.diffuse_color only affects the viewport. Animate with obj.keyframe_insert(); obj.animation_data.action.fcurves no longer exists (set bpy.context.preferences.edit.keyframe_new_interpolation_type='LINEAR' before inserting keyframes for constant-speed motion); do not set Material.use_nodes; leave resolution, samples and denoising to the service. environment: '' keeps the scene's own world; 'studio' | 'sunset' | 'overcast' | 'night' replaces it with a bundled HDRI (a good first render for scenes without lighting work); 'compare' (render_preview only) renders the first frame under all four presets in one 2x2 image with labels, so you can pick one; environment_strength scales it (1.0); environment_visible=False hides the HDRI from the camera (flat grey backdrop, HDRI lighting only). blender: '' (5.0) or '5.2'. asset_urls: https links to images or glTF .bin files sent with the scene; a .blend finds them through relative paths (same folder), a script through os.environ['JR_ASSETS_DIR']. asset_urls may also hold 'polyhaven:<id>' (a CC0 model, texture or HDRI from polyhaven.com, fetched by the service into JR_ASSETS_DIR/<id>/; find ids with asset_search). Import a model with bpy.ops.import_scene.gltf(filepath=os.path.join(os.environ['JR_ASSETS_DIR'], '<id>', '<id>_1k.gltf')). Inside the scene script, `import jr_assets` gives helpers: jr_assets.import_model('<id>', location=(x,y,z), scale=1.0) imports a Poly Haven model (or any file under JR_ASSETS_DIR) and returns the objects; jr_assets.material('<id>', scale=1.0) builds a Principled material from a Poly Haven texture set (diff / nor_gl / rough / arm / disp); jr_assets.apply(obj, mat) assigns it; jr_assets.world_hdri('<id>', strength=1.0) uses a Poly Haven HDRI as the world. orbit=True: turntable; an orbit camera circles the scene once over orbit_frames frames (default 24, elevation orbit_elevation deg, default 18). Flat floors/walls are ignored when framing; orbit_target = an object name or 'x,y,z' centres on that, orbit_distance scales the distance (1.0). A preview without frames shows 0/90/180/270 deg; a final without frame_end renders the whole turn as an MP4. Best for imported models. engine: '' or 'cycles' (path tracing, the default) | 'eevee' (Blender's real-time rasterizer: about half the per-frame cost on animations, but every job pays about 7 s of shader compilation, so it only pays off for a few dozen frames or more; previews are faster on Cycles; HDRI presets work; no caustics or accurate bounce light). transparent=True: transparent background (alpha) instead of the world/HDRI backdrop; the preview sheet shows it over dark grey.