janction-render 0.3.1__tar.gz → 0.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {janction_render-0.3.1 → janction_render-0.3.2}/PKG-INFO +8 -4
- {janction_render-0.3.1 → janction_render-0.3.2}/README.md +7 -3
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render/__init__.py +1 -1
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render/mcp_server.py +21 -6
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render.egg-info/PKG-INFO +8 -4
- {janction_render-0.3.1 → janction_render-0.3.2}/pyproject.toml +1 -1
- {janction_render-0.3.1 → janction_render-0.3.2}/LICENSE +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render/brief.py +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render/cli.py +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render/client.py +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render.egg-info/SOURCES.txt +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render.egg-info/dependency_links.txt +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render.egg-info/entry_points.txt +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render.egg-info/requires.txt +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/janction_render.egg-info/top_level.txt +0 -0
- {janction_render-0.3.1 → janction_render-0.3.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: janction-render
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Cloud GPU render farm for Blender, for AI agents: MCP server (remote + stdio) and CLI. Render Blender without a GPU from Claude, ChatGPT, Claude Code, Codex, Cursor.
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -28,6 +28,9 @@ without a GPU, or when rendering locally is slow.
|
|
|
28
28
|
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render;
|
|
29
29
|
`environment="compare"` previews the same frame under all four presets in one labelled image, so the agent can pick one.
|
|
30
30
|
- A `.gltf` or `.obj` brings its `.bin` / `.mtl` / textures along automatically (from the same folder or the same URL folder).
|
|
31
|
+
- `orbit=True` turns any scene or imported model into a turntable: an orbit camera circles it once (`orbit_frames`, default 24;
|
|
32
|
+
a preview shows 0/90/180/270 degrees, a final render without `frame_end` gives the whole turn as an MP4).
|
|
33
|
+
- While a job renders, `render_status` counts finished frames inside the running chunk, so the ETA updates every few seconds.
|
|
31
34
|
- `scene_info` reads the scene without rendering (cameras, frame range, missing files).
|
|
32
35
|
- `render_preview` returns 1-4 low-cost frames tiled in one image within seconds, so the agent can look, fix, and repeat.
|
|
33
36
|
- `render_estimate` says how long a render will take ("about 3 minutes") and whether it fits today's free quota.
|
|
@@ -111,8 +114,9 @@ Then, in Claude Code:
|
|
|
111
114
|
| `billing()` | free-beta quota (used today, daily limit, reset time); later balance and top-up link |
|
|
112
115
|
| `render_info()` | workers online or gated (GPU lent to another workload), queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
113
116
|
|
|
114
|
-
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night
|
|
115
|
-
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `
|
|
117
|
+
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night`, `compare` on previews; `environment_strength`,
|
|
118
|
+
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `orbit` / `orbit_frames` / `orbit_elevation` (turntable),
|
|
119
|
+
`blender` (`"5.2"`), and `assets` (stdio: local files
|
|
116
120
|
sent with the scene, found in the script through `os.environ["JR_ASSETS_DIR"]`; a `.blend`'s external files are collected
|
|
117
121
|
automatically with `pip install janction-render[blend]`) or `asset_urls` (remote).
|
|
118
122
|
|
|
@@ -145,7 +149,7 @@ POST /v1/files multipart "file" (.blend|.py|.glb|.fbx|.usd|.obj|...) -> {scen
|
|
|
145
149
|
POST /v1/files/{id}/assets multipart "files" textures, glTF .bin ... GET /v1/files/lookup?sha256= reuse an upload
|
|
146
150
|
POST /v1/estimate {kind, frames|frame_start/frame_end, width, height, samples, scene_id?} -> seconds, wall_seconds, human, quota
|
|
147
151
|
POST /v1/jobs {scene_id, kind: info|preview|final, frames|frame_start/frame_end, width, height, samples, camera, fps, output,
|
|
148
|
-
environment, environment_strength, environment_visible, blender}
|
|
152
|
+
environment, environment_strength, environment_visible, blender, orbit, orbit_frames, orbit_elevation}
|
|
149
153
|
GET /v1/jobs/{id} status, progress, eta, artifacts[], cost, warnings, info DELETE /v1/jobs/{id} cancel
|
|
150
154
|
GET /v1/jobs/{id}/artifacts/{name} PNG / MP4
|
|
151
155
|
POST /mcp remote MCP (Streamable HTTP; Bearer api key or OAuth)
|
|
@@ -11,6 +11,9 @@ without a GPU, or when rendering locally is slow.
|
|
|
11
11
|
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render;
|
|
12
12
|
`environment="compare"` previews the same frame under all four presets in one labelled image, so the agent can pick one.
|
|
13
13
|
- A `.gltf` or `.obj` brings its `.bin` / `.mtl` / textures along automatically (from the same folder or the same URL folder).
|
|
14
|
+
- `orbit=True` turns any scene or imported model into a turntable: an orbit camera circles it once (`orbit_frames`, default 24;
|
|
15
|
+
a preview shows 0/90/180/270 degrees, a final render without `frame_end` gives the whole turn as an MP4).
|
|
16
|
+
- While a job renders, `render_status` counts finished frames inside the running chunk, so the ETA updates every few seconds.
|
|
14
17
|
- `scene_info` reads the scene without rendering (cameras, frame range, missing files).
|
|
15
18
|
- `render_preview` returns 1-4 low-cost frames tiled in one image within seconds, so the agent can look, fix, and repeat.
|
|
16
19
|
- `render_estimate` says how long a render will take ("about 3 minutes") and whether it fits today's free quota.
|
|
@@ -94,8 +97,9 @@ Then, in Claude Code:
|
|
|
94
97
|
| `billing()` | free-beta quota (used today, daily limit, reset time); later balance and top-up link |
|
|
95
98
|
| `render_info()` | workers online or gated (GPU lent to another workload), queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
96
99
|
|
|
97
|
-
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night
|
|
98
|
-
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `
|
|
100
|
+
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night`, `compare` on previews; `environment_strength`,
|
|
101
|
+
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `orbit` / `orbit_frames` / `orbit_elevation` (turntable),
|
|
102
|
+
`blender` (`"5.2"`), and `assets` (stdio: local files
|
|
99
103
|
sent with the scene, found in the script through `os.environ["JR_ASSETS_DIR"]`; a `.blend`'s external files are collected
|
|
100
104
|
automatically with `pip install janction-render[blend]`) or `asset_urls` (remote).
|
|
101
105
|
|
|
@@ -128,7 +132,7 @@ POST /v1/files multipart "file" (.blend|.py|.glb|.fbx|.usd|.obj|...) -> {scen
|
|
|
128
132
|
POST /v1/files/{id}/assets multipart "files" textures, glTF .bin ... GET /v1/files/lookup?sha256= reuse an upload
|
|
129
133
|
POST /v1/estimate {kind, frames|frame_start/frame_end, width, height, samples, scene_id?} -> seconds, wall_seconds, human, quota
|
|
130
134
|
POST /v1/jobs {scene_id, kind: info|preview|final, frames|frame_start/frame_end, width, height, samples, camera, fps, output,
|
|
131
|
-
environment, environment_strength, environment_visible, blender}
|
|
135
|
+
environment, environment_strength, environment_visible, blender, orbit, orbit_frames, orbit_elevation}
|
|
132
136
|
GET /v1/jobs/{id} status, progress, eta, artifacts[], cost, warnings, info DELETE /v1/jobs/{id} cancel
|
|
133
137
|
GET /v1/jobs/{id}/artifacts/{name} PNG / MP4
|
|
134
138
|
POST /mcp remote MCP (Streamable HTTP; Bearer api key or OAuth)
|
|
@@ -51,6 +51,9 @@ mcp = MCPServer(
|
|
|
51
51
|
),
|
|
52
52
|
)
|
|
53
53
|
|
|
54
|
+
ORBIT_DOC = (" orbit=True: turntable; an orbit camera circles the scene once over orbit_frames frames (default 24, "
|
|
55
|
+
"elevation orbit_elevation deg, default 18). A preview without frames shows 0/90/180/270 deg; a final without "
|
|
56
|
+
"frame_end renders the whole turn as an MP4. Best for imported models (.glb/.fbx/.obj).")
|
|
54
57
|
ENV_DOC = ("environment: '' keeps the scene's own world; 'studio' | 'sunset' | 'overcast' | 'night' replaces it with a "
|
|
55
58
|
"bundled HDRI (good first render for scenes without lighting work); 'compare' (render_preview only) renders the "
|
|
56
59
|
"first frame under all four presets in one 2x2 image with labels, so you can pick one; environment_strength scales it (1.0); "
|
|
@@ -83,7 +86,7 @@ def _quota_block(exc: ClientError) -> Optional[dict[str, Any]]:
|
|
|
83
86
|
x = exc.extra
|
|
84
87
|
return {"quota_exceeded": True, "detail": exc.detail, "scope": x.get("scope"),
|
|
85
88
|
"gpu_seconds_used_today": x.get("gpu_seconds_used_today"), "gpu_seconds_per_day": x.get("gpu_seconds_per_day"),
|
|
86
|
-
"resets_at": x.get("resets_at"),
|
|
89
|
+
"resets_at": x.get("resets_at_iso") or x.get("resets_at"),
|
|
87
90
|
"next": "tell the user today's free GPU time is used up and when it resets; a smaller job (fewer frames, "
|
|
88
91
|
"lower resolution or samples) may still fit"}
|
|
89
92
|
|
|
@@ -209,6 +212,9 @@ def render_preview(
|
|
|
209
212
|
environment_visible: bool = True,
|
|
210
213
|
blender: str = "",
|
|
211
214
|
assets: Optional[list[str]] = None,
|
|
215
|
+
orbit: bool = False,
|
|
216
|
+
orbit_frames: int = 24,
|
|
217
|
+
orbit_elevation: float = 18.0,
|
|
212
218
|
) -> list[Any]:
|
|
213
219
|
"""Render a fast, cheap preview of a Blender scene on a JANCTION GPU and show the image.
|
|
214
220
|
|
|
@@ -222,14 +228,15 @@ def render_preview(
|
|
|
222
228
|
Look at the returned image, fix the scene, preview again; when it looks right, ask the user and
|
|
223
229
|
call render_final. Returns scene_id (reuse it without re-uploading), job_id, saved PNG paths,
|
|
224
230
|
Blender warnings (e.g. missing textures), GPU seconds, and the expiry time (24h after last use).
|
|
225
|
-
""" + ENV_DOC
|
|
231
|
+
""" + ENV_DOC + ORBIT_DOC
|
|
226
232
|
c = _client()
|
|
227
233
|
try:
|
|
228
|
-
frame_list = parse_frames(frames)
|
|
234
|
+
frame_list = parse_frames(frames) if (frames or not orbit) else None
|
|
229
235
|
sid = _resolve_scene(c, scene_path, scene_id, scene_script, assets)
|
|
230
236
|
j = c.submit(sid, kind="preview", frames=frame_list, camera=camera or None,
|
|
231
237
|
width=width, height=height, samples=samples,
|
|
232
|
-
**_job_params(environment, environment_strength, environment_visible, blender)
|
|
238
|
+
**_job_params(environment, environment_strength, environment_visible, blender),
|
|
239
|
+
**({"orbit": True, "orbit_frames": orbit_frames, "orbit_elevation": orbit_elevation} if orbit else {}))
|
|
233
240
|
_log(f"preview job {j['job_id']} submitted frames={frame_list}")
|
|
234
241
|
j = c.wait(j["job_id"], timeout=PREVIEW_WAIT_S)
|
|
235
242
|
except ClientError as exc:
|
|
@@ -305,6 +312,9 @@ def render_final(
|
|
|
305
312
|
environment_visible: bool = True,
|
|
306
313
|
blender: str = "",
|
|
307
314
|
assets: Optional[list[str]] = None,
|
|
315
|
+
orbit: bool = False,
|
|
316
|
+
orbit_frames: int = 24,
|
|
317
|
+
orbit_elevation: float = 18.0,
|
|
308
318
|
) -> str:
|
|
309
319
|
"""Render the final frames (or a video) of a Blender scene on JANCTION GPUs.
|
|
310
320
|
|
|
@@ -314,14 +324,19 @@ def render_final(
|
|
|
314
324
|
(output='png'; 'auto' picks). Use the same environment / blender as the approved preview. Returns job_id and a
|
|
315
325
|
time estimate right away; the render runs in the background: poll with render_status, then fetch with
|
|
316
326
|
render_download. Inputs and results are deleted 24 hours after last use, so download them.
|
|
317
|
-
""" + ENV_DOC
|
|
327
|
+
""" + ENV_DOC + ORBIT_DOC
|
|
318
328
|
c = _client()
|
|
319
329
|
try:
|
|
320
330
|
sid = _resolve_scene(c, scene_path, scene_id, scene_script, assets)
|
|
331
|
+
extra: dict[str, Any] = {}
|
|
332
|
+
if orbit:
|
|
333
|
+
extra.update({"orbit": True, "orbit_frames": orbit_frames, "orbit_elevation": orbit_elevation})
|
|
334
|
+
if frame_end <= frame_start:
|
|
335
|
+
frame_end = None # type: ignore[assignment] # 1 周ぶんは受付が決める
|
|
321
336
|
j = c.submit(sid, kind="final", frame_start=frame_start, frame_end=frame_end,
|
|
322
337
|
width=width, height=height, samples=samples, fps=fps, output=output,
|
|
323
338
|
camera=camera or None,
|
|
324
|
-
**_job_params(environment, environment_strength, environment_visible, blender))
|
|
339
|
+
**_job_params(environment, environment_strength, environment_visible, blender), **extra)
|
|
325
340
|
except ClientError as exc:
|
|
326
341
|
block = _payment_block(exc) or _quota_block(exc)
|
|
327
342
|
return _j(block if block else {"ok": False, "error": str(exc)})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: janction-render
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Cloud GPU render farm for Blender, for AI agents: MCP server (remote + stdio) and CLI. Render Blender without a GPU from Claude, ChatGPT, Claude Code, Codex, Cursor.
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -28,6 +28,9 @@ without a GPU, or when rendering locally is slow.
|
|
|
28
28
|
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render;
|
|
29
29
|
`environment="compare"` previews the same frame under all four presets in one labelled image, so the agent can pick one.
|
|
30
30
|
- A `.gltf` or `.obj` brings its `.bin` / `.mtl` / textures along automatically (from the same folder or the same URL folder).
|
|
31
|
+
- `orbit=True` turns any scene or imported model into a turntable: an orbit camera circles it once (`orbit_frames`, default 24;
|
|
32
|
+
a preview shows 0/90/180/270 degrees, a final render without `frame_end` gives the whole turn as an MP4).
|
|
33
|
+
- While a job renders, `render_status` counts finished frames inside the running chunk, so the ETA updates every few seconds.
|
|
31
34
|
- `scene_info` reads the scene without rendering (cameras, frame range, missing files).
|
|
32
35
|
- `render_preview` returns 1-4 low-cost frames tiled in one image within seconds, so the agent can look, fix, and repeat.
|
|
33
36
|
- `render_estimate` says how long a render will take ("about 3 minutes") and whether it fits today's free quota.
|
|
@@ -111,8 +114,9 @@ Then, in Claude Code:
|
|
|
111
114
|
| `billing()` | free-beta quota (used today, daily limit, reset time); later balance and top-up link |
|
|
112
115
|
| `render_info()` | workers online or gated (GPU lent to another workload), queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
113
116
|
|
|
114
|
-
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night
|
|
115
|
-
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `
|
|
117
|
+
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night`, `compare` on previews; `environment_strength`,
|
|
118
|
+
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `orbit` / `orbit_frames` / `orbit_elevation` (turntable),
|
|
119
|
+
`blender` (`"5.2"`), and `assets` (stdio: local files
|
|
116
120
|
sent with the scene, found in the script through `os.environ["JR_ASSETS_DIR"]`; a `.blend`'s external files are collected
|
|
117
121
|
automatically with `pip install janction-render[blend]`) or `asset_urls` (remote).
|
|
118
122
|
|
|
@@ -145,7 +149,7 @@ POST /v1/files multipart "file" (.blend|.py|.glb|.fbx|.usd|.obj|...) -> {scen
|
|
|
145
149
|
POST /v1/files/{id}/assets multipart "files" textures, glTF .bin ... GET /v1/files/lookup?sha256= reuse an upload
|
|
146
150
|
POST /v1/estimate {kind, frames|frame_start/frame_end, width, height, samples, scene_id?} -> seconds, wall_seconds, human, quota
|
|
147
151
|
POST /v1/jobs {scene_id, kind: info|preview|final, frames|frame_start/frame_end, width, height, samples, camera, fps, output,
|
|
148
|
-
environment, environment_strength, environment_visible, blender}
|
|
152
|
+
environment, environment_strength, environment_visible, blender, orbit, orbit_frames, orbit_elevation}
|
|
149
153
|
GET /v1/jobs/{id} status, progress, eta, artifacts[], cost, warnings, info DELETE /v1/jobs/{id} cancel
|
|
150
154
|
GET /v1/jobs/{id}/artifacts/{name} PNG / MP4
|
|
151
155
|
POST /mcp remote MCP (Streamable HTTP; Bearer api key or OAuth)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "janction-render"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.2"
|
|
8
8
|
description = "Cloud GPU render farm for Blender, for AI agents: MCP server (remote + stdio) and CLI. Render Blender without a GPU from Claude, ChatGPT, Claude Code, Codex, Cursor."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{janction_render-0.3.1 → janction_render-0.3.2}/janction_render.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|