Spaces:
Runtime error
Runtime error
Add probe_g1 endpoint to inspect G1 robot model availability
Browse files
server.py
CHANGED
|
@@ -205,6 +205,67 @@ def kimodo_motion(
|
|
| 205 |
return {"status": "error", "error": f"{type(e).__name__}: {e}"}
|
| 206 |
|
| 207 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 208 |
def kimodo_motion_seq(
|
| 209 |
prompts_json: str,
|
| 210 |
frames_json: str,
|
|
@@ -566,6 +627,10 @@ with gr.Blocks(title="Genga Kimodo") as demo:
|
|
| 566 |
api_name="kimodo_motion_seq",
|
| 567 |
)
|
| 568 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 569 |
|
| 570 |
|
| 571 |
if __name__ == "__main__":
|
|
|
|
| 205 |
return {"status": "error", "error": f"{type(e).__name__}: {e}"}
|
| 206 |
|
| 207 |
|
| 208 |
+
def probe_g1(progress: gr.Progress = gr.Progress()) -> dict: # noqa: B008
|
| 209 |
+
"""Probe whether the Kimodo G1 robot model + skin assets are available
|
| 210 |
+
on this Space. Returns paths, shapes, and viz-module attribute lists so
|
| 211 |
+
the webapp can decide whether to ship a G1 SkinnedMesh.
|
| 212 |
+
"""
|
| 213 |
+
import importlib
|
| 214 |
+
import os
|
| 215 |
+
|
| 216 |
+
try:
|
| 217 |
+
out: dict = {"status": "ok"}
|
| 218 |
+
import kimodo as kpkg
|
| 219 |
+
root = os.path.dirname(kpkg.__file__)
|
| 220 |
+
|
| 221 |
+
# 1) Look for any g1 / G1 assets on disk.
|
| 222 |
+
candidates: list[str] = []
|
| 223 |
+
for dirpath, _dn, filenames in os.walk(root):
|
| 224 |
+
for fn in filenames:
|
| 225 |
+
low = fn.lower()
|
| 226 |
+
if "g1" in low or "g1" in dirpath.lower():
|
| 227 |
+
full = os.path.join(dirpath, fn)
|
| 228 |
+
try:
|
| 229 |
+
sz = os.path.getsize(full)
|
| 230 |
+
except OSError:
|
| 231 |
+
sz = -1
|
| 232 |
+
candidates.append(f"{full}\t{sz}")
|
| 233 |
+
out["g1_files"] = candidates[:200]
|
| 234 |
+
|
| 235 |
+
# 2) Try importing G1-related modules.
|
| 236 |
+
for mn in ("kimodo.viz.g1_skin", "kimodo.skeleton", "kimodo.skeleton.g1", "kimodo.assets.skeletons.g1"):
|
| 237 |
+
try:
|
| 238 |
+
mod = importlib.import_module(mn)
|
| 239 |
+
out[f"{mn}_attrs"] = [a for a in dir(mod) if not a.startswith("_")][:60]
|
| 240 |
+
except Exception as e:
|
| 241 |
+
out[f"{mn}_err"] = f"{type(e).__name__}: {e}"
|
| 242 |
+
|
| 243 |
+
# 3) Try loading a G1 model.
|
| 244 |
+
progress(0.5, desc="Trying to load G1 model ...")
|
| 245 |
+
try:
|
| 246 |
+
from kimodo import load_model
|
| 247 |
+
g1_model, g1_resolved = load_model("Kimodo-G1-RP-v1", device="cpu", default_family="Kimodo", return_resolved_name=True)
|
| 248 |
+
out["g1_model_resolved"] = g1_resolved
|
| 249 |
+
out["g1_model_attrs"] = [a for a in dir(g1_model) if not a.startswith("_")][:50]
|
| 250 |
+
sk = getattr(g1_model, "skeleton", None)
|
| 251 |
+
if sk is not None:
|
| 252 |
+
out["g1_skeleton_type"] = type(sk).__name__
|
| 253 |
+
out["g1_skeleton_attrs"] = [a for a in dir(sk) if not a.startswith("_")][:80]
|
| 254 |
+
# Try the standard "joint count" attr names.
|
| 255 |
+
for k in ("bone_order_names", "joint_names", "names"):
|
| 256 |
+
v = getattr(sk, k, None)
|
| 257 |
+
if v is not None:
|
| 258 |
+
out[f"g1_skeleton_{k}"] = list(v)
|
| 259 |
+
break
|
| 260 |
+
except Exception as e:
|
| 261 |
+
out["g1_load_err"] = f"{type(e).__name__}: {e}"
|
| 262 |
+
|
| 263 |
+
return out
|
| 264 |
+
except Exception as e:
|
| 265 |
+
traceback.print_exc()
|
| 266 |
+
return {"status": "error", "error": f"{type(e).__name__}: {e}"}
|
| 267 |
+
|
| 268 |
+
|
| 269 |
def kimodo_motion_seq(
|
| 270 |
prompts_json: str,
|
| 271 |
frames_json: str,
|
|
|
|
| 627 |
api_name="kimodo_motion_seq",
|
| 628 |
)
|
| 629 |
|
| 630 |
+
g1_btn = gr.Button("Probe G1 (admin)", visible=False)
|
| 631 |
+
g1_out = gr.JSON(label="g1 probe", visible=False)
|
| 632 |
+
g1_btn.click(fn=probe_g1, inputs=[], outputs=g1_out, api_name="probe_g1")
|
| 633 |
+
|
| 634 |
|
| 635 |
|
| 636 |
if __name__ == "__main__":
|