WalkingOnSaturn commited on
Commit
c0a51ca
·
verified ·
1 Parent(s): 9f127fb

Add probe_g1 endpoint to inspect G1 robot model availability

Browse files
Files changed (1) hide show
  1. server.py +65 -0
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__":