janction-render 0.3.0__tar.gz → 0.3.1__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.0 → janction_render-0.3.1}/PKG-INFO +5 -3
- {janction_render-0.3.0 → janction_render-0.3.1}/README.md +4 -2
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render/__init__.py +1 -1
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render/client.py +66 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render/mcp_server.py +2 -1
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render.egg-info/PKG-INFO +5 -3
- {janction_render-0.3.0 → janction_render-0.3.1}/pyproject.toml +1 -1
- {janction_render-0.3.0 → janction_render-0.3.1}/LICENSE +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render/brief.py +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render/cli.py +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render.egg-info/SOURCES.txt +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render.egg-info/dependency_links.txt +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render.egg-info/entry_points.txt +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render.egg-info/requires.txt +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/janction_render.egg-info/top_level.txt +0 -0
- {janction_render-0.3.0 → janction_render-0.3.1}/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.1
|
|
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
|
|
@@ -25,7 +25,9 @@ without a GPU, or when rendering locally is slow.
|
|
|
25
25
|
|
|
26
26
|
- Input: a `.blend` file (textures travel with it), a **bpy Python script that builds the scene** (no local Blender
|
|
27
27
|
needed), or a **3D file** (glTF/GLB, FBX, USD, OBJ, STL, PLY, Alembic) that is imported into an empty scene.
|
|
28
|
-
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render
|
|
28
|
+
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render;
|
|
29
|
+
`environment="compare"` previews the same frame under all four presets in one labelled image, so the agent can pick one.
|
|
30
|
+
- A `.gltf` or `.obj` brings its `.bin` / `.mtl` / textures along automatically (from the same folder or the same URL folder).
|
|
29
31
|
- `scene_info` reads the scene without rendering (cameras, frame range, missing files).
|
|
30
32
|
- `render_preview` returns 1-4 low-cost frames tiled in one image within seconds, so the agent can look, fix, and repeat.
|
|
31
33
|
- `render_estimate` says how long a render will take ("about 3 minutes") and whether it fits today's free quota.
|
|
@@ -107,7 +109,7 @@ Then, in Claude Code:
|
|
|
107
109
|
| `render_final(scene_id, frame_start, frame_end, width, height, samples, fps, output, environment?, blender?)` | PNG or MP4; returns job_id + estimate |
|
|
108
110
|
| `render_status(job_id)` | progress and ETA (`eta.human`); `render_download(job_id, only="mp4" / "frames" / "all")` files or links; `render_cancel(job_id)` |
|
|
109
111
|
| `billing()` | free-beta quota (used today, daily limit, reset time); later balance and top-up link |
|
|
110
|
-
| `render_info()` | workers online, queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
112
|
+
| `render_info()` | workers online or gated (GPU lent to another workload), queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
111
113
|
|
|
112
114
|
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night`; `environment_strength`,
|
|
113
115
|
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `blender` (`"5.2"`), and `assets` (stdio: local files
|
|
@@ -8,7 +8,9 @@ without a GPU, or when rendering locally is slow.
|
|
|
8
8
|
|
|
9
9
|
- Input: a `.blend` file (textures travel with it), a **bpy Python script that builds the scene** (no local Blender
|
|
10
10
|
needed), or a **3D file** (glTF/GLB, FBX, USD, OBJ, STL, PLY, Alembic) that is imported into an empty scene.
|
|
11
|
-
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render
|
|
11
|
+
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render;
|
|
12
|
+
`environment="compare"` previews the same frame under all four presets in one labelled image, so the agent can pick one.
|
|
13
|
+
- A `.gltf` or `.obj` brings its `.bin` / `.mtl` / textures along automatically (from the same folder or the same URL folder).
|
|
12
14
|
- `scene_info` reads the scene without rendering (cameras, frame range, missing files).
|
|
13
15
|
- `render_preview` returns 1-4 low-cost frames tiled in one image within seconds, so the agent can look, fix, and repeat.
|
|
14
16
|
- `render_estimate` says how long a render will take ("about 3 minutes") and whether it fits today's free quota.
|
|
@@ -90,7 +92,7 @@ Then, in Claude Code:
|
|
|
90
92
|
| `render_final(scene_id, frame_start, frame_end, width, height, samples, fps, output, environment?, blender?)` | PNG or MP4; returns job_id + estimate |
|
|
91
93
|
| `render_status(job_id)` | progress and ETA (`eta.human`); `render_download(job_id, only="mp4" / "frames" / "all")` files or links; `render_cancel(job_id)` |
|
|
92
94
|
| `billing()` | free-beta quota (used today, daily limit, reset time); later balance and top-up link |
|
|
93
|
-
| `render_info()` | workers online, queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
95
|
+
| `render_info()` | workers online or gated (GPU lent to another workload), queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
94
96
|
|
|
95
97
|
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night`; `environment_strength`,
|
|
96
98
|
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `blender` (`"5.2"`), and `assets` (stdio: local files
|
|
@@ -39,6 +39,53 @@ def select_artifacts(artifacts: list[dict[str, Any]], only: Optional[str] = None
|
|
|
39
39
|
raise ValueError("only must be one of: " + ", ".join(ONLY_CHOICES))
|
|
40
40
|
|
|
41
41
|
|
|
42
|
+
def companion_refs(kind: str, text: str) -> list[str]:
|
|
43
|
+
"""glTF(JSON)か OBJ の中で参照している外部ファイルの相対パス(data: URI と絶対パスは除く)。
|
|
44
|
+
OBJ は mtllib の .mtl だけを返す(.mtl の中の画像は mtl_refs で)。"""
|
|
45
|
+
import json as _json
|
|
46
|
+
import re as _re
|
|
47
|
+
|
|
48
|
+
out: list[str] = []
|
|
49
|
+
|
|
50
|
+
def add(ref: str) -> None:
|
|
51
|
+
ref = (ref or "").strip().replace("\\", "/")
|
|
52
|
+
if not ref or ref.startswith(("data:", "http://", "https://", "/")) or ".." in ref.split("/"):
|
|
53
|
+
return
|
|
54
|
+
if ref not in out:
|
|
55
|
+
out.append(ref)
|
|
56
|
+
|
|
57
|
+
if kind == "gltf":
|
|
58
|
+
try:
|
|
59
|
+
doc = _json.loads(text)
|
|
60
|
+
except ValueError:
|
|
61
|
+
return out
|
|
62
|
+
for key in ("buffers", "images"):
|
|
63
|
+
for item in doc.get(key) or []:
|
|
64
|
+
if isinstance(item, dict) and isinstance(item.get("uri"), str):
|
|
65
|
+
add(item["uri"])
|
|
66
|
+
return out
|
|
67
|
+
if kind == "obj":
|
|
68
|
+
for line in text.splitlines():
|
|
69
|
+
parts = line.strip().split(None, 1)
|
|
70
|
+
if len(parts) == 2 and parts[0].lower() == "mtllib":
|
|
71
|
+
for name in parts[1].split():
|
|
72
|
+
add(name)
|
|
73
|
+
return out
|
|
74
|
+
if kind == "mtl":
|
|
75
|
+
for line in text.splitlines():
|
|
76
|
+
parts = line.strip().split()
|
|
77
|
+
if len(parts) >= 2 and parts[0].lower() in ("map_kd", "map_ks", "map_ka", "map_ns", "map_d", "map_bump", "bump",
|
|
78
|
+
"disp", "decal", "norm", "map_ke", "refl"):
|
|
79
|
+
add(parts[-1])
|
|
80
|
+
return out
|
|
81
|
+
return out
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def companion_kind(name: str) -> str:
|
|
85
|
+
ext = Path(name).suffix.lower()
|
|
86
|
+
return {".gltf": "gltf", ".obj": "obj", ".mtl": "mtl"}.get(ext, "")
|
|
87
|
+
|
|
88
|
+
|
|
42
89
|
def sha256_of(path: Path) -> str:
|
|
43
90
|
import hashlib
|
|
44
91
|
|
|
@@ -263,6 +310,25 @@ class Client:
|
|
|
263
310
|
missing: list[str] = []
|
|
264
311
|
if p.suffix.lower() == ".blend" and trace_assets:
|
|
265
312
|
items, missing = trace_blend_assets(p)
|
|
313
|
+
elif companion_kind(p.name) in ("gltf", "obj") and trace_assets:
|
|
314
|
+
# glTF の .bin と画像、OBJ の .mtl とその画像を、ファイルの横から集める
|
|
315
|
+
base = p.parent
|
|
316
|
+
queue = companion_refs(companion_kind(p.name), p.read_text(encoding="utf-8", errors="replace"))
|
|
317
|
+
seen: set[str] = set()
|
|
318
|
+
while queue:
|
|
319
|
+
rel = queue.pop(0)
|
|
320
|
+
if rel in seen:
|
|
321
|
+
continue
|
|
322
|
+
seen.add(rel)
|
|
323
|
+
fp = base / rel
|
|
324
|
+
if not fp.is_file():
|
|
325
|
+
missing.append(rel)
|
|
326
|
+
continue
|
|
327
|
+
items.append((rel, fp))
|
|
328
|
+
if companion_kind(rel) == "mtl":
|
|
329
|
+
folder = Path(rel).parent.as_posix()
|
|
330
|
+
for sub in companion_refs("mtl", fp.read_text(encoding="utf-8", errors="replace")):
|
|
331
|
+
queue.append(sub if folder in ("", ".") else f"{folder}/{sub}")
|
|
266
332
|
for a in assets or []:
|
|
267
333
|
ap = Path(a)
|
|
268
334
|
if not ap.is_file():
|
|
@@ -52,7 +52,8 @@ mcp = MCPServer(
|
|
|
52
52
|
)
|
|
53
53
|
|
|
54
54
|
ENV_DOC = ("environment: '' keeps the scene's own world; 'studio' | 'sunset' | 'overcast' | 'night' replaces it with a "
|
|
55
|
-
"bundled HDRI (good first render for scenes without lighting work);
|
|
55
|
+
"bundled HDRI (good first render for scenes without lighting work); 'compare' (render_preview only) renders the "
|
|
56
|
+
"first frame under all four presets in one 2x2 image with labels, so you can pick one; environment_strength scales it (1.0); "
|
|
56
57
|
"environment_visible=False hides the HDRI from the camera (flat grey backdrop, HDRI lighting only). "
|
|
57
58
|
"blender: '' (5.0) or '5.2' to render with Blender 5.2 when available. assets: local files (images, glTF "
|
|
58
59
|
".bin, ...) sent along with the scene; a .blend finds them through relative paths, a script through "
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: janction-render
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
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
|
|
@@ -25,7 +25,9 @@ without a GPU, or when rendering locally is slow.
|
|
|
25
25
|
|
|
26
26
|
- Input: a `.blend` file (textures travel with it), a **bpy Python script that builds the scene** (no local Blender
|
|
27
27
|
needed), or a **3D file** (glTF/GLB, FBX, USD, OBJ, STL, PLY, Alembic) that is imported into an empty scene.
|
|
28
|
-
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render
|
|
28
|
+
- `environment="studio" | "sunset" | "overcast" | "night"` lights a scene with a bundled HDRI (CC0) for a good first render;
|
|
29
|
+
`environment="compare"` previews the same frame under all four presets in one labelled image, so the agent can pick one.
|
|
30
|
+
- A `.gltf` or `.obj` brings its `.bin` / `.mtl` / textures along automatically (from the same folder or the same URL folder).
|
|
29
31
|
- `scene_info` reads the scene without rendering (cameras, frame range, missing files).
|
|
30
32
|
- `render_preview` returns 1-4 low-cost frames tiled in one image within seconds, so the agent can look, fix, and repeat.
|
|
31
33
|
- `render_estimate` says how long a render will take ("about 3 minutes") and whether it fits today's free quota.
|
|
@@ -107,7 +109,7 @@ Then, in Claude Code:
|
|
|
107
109
|
| `render_final(scene_id, frame_start, frame_end, width, height, samples, fps, output, environment?, blender?)` | PNG or MP4; returns job_id + estimate |
|
|
108
110
|
| `render_status(job_id)` | progress and ETA (`eta.human`); `render_download(job_id, only="mp4" / "frames" / "all")` files or links; `render_cancel(job_id)` |
|
|
109
111
|
| `billing()` | free-beta quota (used today, daily limit, reset time); later balance and top-up link |
|
|
110
|
-
| `render_info()` | workers online, queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
112
|
+
| `render_info()` | workers online or gated (GPU lent to another workload), queue, expected wait, supported inputs, environment presets, Blender versions |
|
|
111
113
|
|
|
112
114
|
Options on `render_preview` / `render_final`: `environment` (`studio`, `sunset`, `overcast`, `night`; `environment_strength`,
|
|
113
115
|
`environment_visible=False` for a flat grey backdrop with HDRI lighting), `blender` (`"5.2"`), and `assets` (stdio: local files
|
|
@@ -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.1"
|
|
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
|
{janction_render-0.3.0 → janction_render-0.3.1}/janction_render.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|