buildai-cli 0.3.69__tar.gz → 0.3.71__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.
Files changed (36) hide show
  1. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/.gitignore +3 -1
  2. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/PKG-INFO +1 -1
  3. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/processing.py +89 -43
  4. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/pyproject.toml +1 -1
  5. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/AGENTS.md +0 -0
  6. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/CLAUDE.md +0 -0
  7. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/buildai_bootstrap.py +0 -0
  8. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/__init__.py +0 -0
  9. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/_has_core.py +0 -0
  10. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/auth_local.py +0 -0
  11. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/__init__.py +0 -0
  12. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/api_proxy.py +0 -0
  13. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/auth.py +0 -0
  14. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/__init__.py +0 -0
  15. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/broker.py +0 -0
  16. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/common.py +0 -0
  17. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/migrate.py +0 -0
  18. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/query.py +0 -0
  19. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/schema.py +0 -0
  20. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/status.py +0 -0
  21. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/tunnel.py +0 -0
  22. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/dev.py +0 -0
  23. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/doctor.py +0 -0
  24. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/gigcamera.py +0 -0
  25. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/config.py +0 -0
  26. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/console.py +0 -0
  27. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/context.py +0 -0
  28. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/db_broker.py +0 -0
  29. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/guard.py +0 -0
  30. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/internal_api.py +0 -0
  31. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/main.py +0 -0
  32. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/nl_query/__init__.py +0 -0
  33. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/nl_query/dataset_tools.py +0 -0
  34. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/ops_init.py +0 -0
  35. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/output.py +0 -0
  36. {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/pagination.py +0 -0
@@ -55,7 +55,9 @@ Thumbs.db
55
55
 
56
56
  # Local tool state
57
57
  .superpowers/
58
- .entire/
58
+ .entire/*
59
+ !.entire/
60
+ !.entire/settings.json
59
61
  .codex/config.toml
60
62
  .codex-bin/
61
63
  .mcp.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: buildai-cli
3
- Version: 0.3.69
3
+ Version: 0.3.71
4
4
  Summary: Build AI CLI (Typer)
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: httpx>=0.27.0
@@ -223,7 +223,7 @@ def scheduler_tick(
223
223
  stage_limits_json: str | None = typer.Option(
224
224
  None,
225
225
  "--stage-limits-json",
226
- help='Optional JSON object such as {"pose_3d": 50, "pose_2d": 4, "prepare": 20}.',
226
+ help='Optional JSON object such as {"pose_3d": 50, "pose_2d": 4}.',
227
227
  ),
228
228
  max_submit_manifests: int = typer.Option(5, "--max-submit-manifests", min=1, max=50),
229
229
  max_tasks: int = typer.Option(4, "--max-tasks", min=1, max=1000),
@@ -289,94 +289,140 @@ def scheduler_tick(
289
289
  )
290
290
 
291
291
 
292
- @stage_jobs_app.command("launch-egoexo-prepare-batch")
293
- def launch_egoexo_prepare_batch(
292
+ @stage_jobs_app.command("tick-egoexo")
293
+ def tick_egoexo_stage_jobs(
294
+ run_key: str | None = typer.Option(None, "--run-key", help="Stage-job run key to tick."),
295
+ program_slug: str = typer.Option(
296
+ "build-egoexo-2026",
297
+ "--program-slug",
298
+ help="Program slug whose active episodes should be planned.",
299
+ ),
300
+ recording_batch_id: str | None = typer.Option(
301
+ None,
302
+ "--recording-batch-id",
303
+ help="Optional recording batch id to plan exactly one finalized ingest batch.",
304
+ ),
305
+ stages: str | None = typer.Option(
306
+ None,
307
+ "--stages",
308
+ help="Comma-separated canonical stage keys. Defaults to the full recording-scoped pipeline.",
309
+ ),
310
+ plan_limit: int = typer.Option(500, "--plan-limit", min=1, max=5000),
311
+ priority: int = typer.Option(7, "--priority", min=0, max=10),
312
+ skip_existing_pose_3d: bool = typer.Option(
313
+ True,
314
+ "--skip-existing-pose-3d/--include-existing-pose-3d",
315
+ help="Skip Pose3D work for episodes that already have Pose3D outputs.",
316
+ ),
317
+ launch: bool = typer.Option(
318
+ False, "--launch/--no-launch", help="Launch ready workers after planning."
319
+ ),
320
+ dry_run: bool = typer.Option(
321
+ False, "--dry-run", help="Preview the tick without writes or launches."
322
+ ),
323
+ write: bool = typer.Option(False, "--write", help="Create work items. Omit for dry-run."),
324
+ ) -> None:
325
+ """Run the canonical recording-scoped EgoExo stage-job tick."""
326
+ _request(
327
+ "/v1/processing/stage-jobs/egoexo/tick",
328
+ method="POST",
329
+ body={
330
+ "program_slug": program_slug,
331
+ "recording_batch_id": recording_batch_id,
332
+ "stages": _parse_csv(
333
+ stages,
334
+ option_name="--stages",
335
+ allowed={"frame_index", "pose_2d", "pose_3d_definition_run"},
336
+ ),
337
+ "run_key": run_key,
338
+ "plan_limit": plan_limit,
339
+ "priority": priority,
340
+ "skip_existing_pose_3d": skip_existing_pose_3d,
341
+ "launch_frame_index": launch,
342
+ "launch_pose_2d": launch,
343
+ "launch_pose_3d": launch,
344
+ "dry_run": dry_run or not write,
345
+ },
346
+ )
347
+
348
+
349
+ @stage_jobs_app.command("launch-egoexo-pose-2d-modal")
350
+ def launch_egoexo_pose_2d_modal(
294
351
  limit: int = typer.Option(10, "--limit", min=1, max=200),
295
- run_key: str = typer.Option(..., "--run-key", help="Prepare run key to drain."),
352
+ run_key: str = typer.Option(..., "--run-key", help="Pose2D run key to drain."),
353
+ task_count: int = typer.Option(
354
+ 500,
355
+ "--task-count",
356
+ min=1,
357
+ max=1000,
358
+ help="Maximum Modal workers per episode work item.",
359
+ ),
296
360
  execution_profile_key: str = typer.Option(
297
- "gcp.us.media_l4",
361
+ "modal.h100.500",
298
362
  "--execution-profile-key",
299
- help="Cloud Batch execution profile used for each episode job.",
363
+ help="Modal execution profile used for each episode job.",
300
364
  ),
301
- provisioning_model: str = typer.Option(
302
- "standard",
303
- "--provisioning-model",
304
- help="Cloud Batch provisioning model: standard or spot.",
365
+ store_heatmaps: bool = typer.Option(
366
+ False,
367
+ "--store-heatmaps",
368
+ help="Persist pre-decoded Sapiens heatmap logits as optional artifacts.",
305
369
  ),
306
370
  lease_seconds: int = typer.Option(24 * 60 * 60, "--lease-seconds", min=600),
307
371
  dry_run: bool = typer.Option(False, "--dry-run", help="Preview ready work without leasing."),
308
372
  write: bool = typer.Option(False, "--write", help="Launch jobs. Omit for dry-run."),
309
373
  ) -> None:
310
- """Launch one Cloud Batch prepare job per ready EgoExo episode."""
311
- if provisioning_model not in {"standard", "spot"}:
312
- error("--provisioning-model must be one of: standard, spot")
313
- raise typer.Exit(1)
374
+ """Launch Modal-backed Sapiens Pose2D workers for ready EgoExo episodes."""
314
375
  _request(
315
- "/v1/processing/stage-jobs/egoexo/prepare/launch-batch",
376
+ "/v1/processing/stage-jobs/egoexo/pose-2d/launch-modal",
316
377
  method="POST",
317
378
  body={
318
379
  "limit": limit,
319
380
  "run_key": run_key,
381
+ "task_count": task_count,
320
382
  "execution_profile_key": execution_profile_key,
321
- "provisioning_model": provisioning_model,
383
+ "config": {"store_heatmaps": store_heatmaps},
322
384
  "lease_seconds": lease_seconds,
323
385
  "dry_run": dry_run or not write,
324
386
  },
325
387
  )
326
388
 
327
389
 
328
- @stage_jobs_app.command("launch-egoexo-pose-2d-batch")
329
- def launch_egoexo_pose_2d_batch(
390
+ @stage_jobs_app.command("launch-egoexo-pose-3d-batch")
391
+ def launch_egoexo_pose_3d_batch(
330
392
  limit: int = typer.Option(10, "--limit", min=1, max=200),
331
- run_key: str = typer.Option(..., "--run-key", help="Pose2D run key to drain."),
332
- task_count: int = typer.Option(
333
- 8,
334
- "--task-count",
335
- min=1,
336
- max=1000,
337
- help="Cloud Batch tasks per episode job.",
338
- ),
393
+ run_key: str = typer.Option(..., "--run-key", help="Pose3D run key to drain."),
339
394
  execution_profile_key: str = typer.Option(
340
- "gcp.us.gpu_a100",
395
+ "gcp.us.pose_3d_cpu",
341
396
  "--execution-profile-key",
342
- help="Cloud Batch execution profile used for each episode job.",
397
+ help="Cloud Batch execution profile used for each episode triangulation job.",
343
398
  ),
344
399
  provisioning_model: str = typer.Option(
345
400
  "standard",
346
401
  "--provisioning-model",
347
402
  help="Cloud Batch provisioning model: standard or spot.",
348
403
  ),
349
- max_active_jobs: int | None = typer.Option(
404
+ config_json: str | None = typer.Option(
350
405
  None,
351
- "--max-active-jobs",
352
- min=1,
353
- max=1000,
354
- help="Maximum active episode Batch jobs for this execution profile.",
355
- ),
356
- store_heatmaps: bool = typer.Option(
357
- False,
358
- "--store-heatmaps",
359
- help="Persist pre-decoded Sapiens heatmap logits as optional artifacts.",
406
+ "--config-json",
407
+ help="Optional Pose3D processor config JSON object.",
360
408
  ),
361
409
  lease_seconds: int = typer.Option(24 * 60 * 60, "--lease-seconds", min=600),
362
410
  dry_run: bool = typer.Option(False, "--dry-run", help="Preview ready work without leasing."),
363
411
  write: bool = typer.Option(False, "--write", help="Launch jobs. Omit for dry-run."),
364
412
  ) -> None:
365
- """Launch one episode-owned Cloud Batch Pose2D job per ready EgoExo episode."""
413
+ """Launch optimized receipt-backed Pose3D triangulation jobs for ready episodes."""
366
414
  if provisioning_model not in {"standard", "spot"}:
367
415
  error("--provisioning-model must be one of: standard, spot")
368
416
  raise typer.Exit(1)
369
417
  _request(
370
- "/v1/processing/stage-jobs/egoexo/pose-2d/launch-batch",
418
+ "/v1/processing/stage-jobs/egoexo/pose-3d/launch-batch",
371
419
  method="POST",
372
420
  body={
373
421
  "limit": limit,
374
422
  "run_key": run_key,
375
- "task_count": task_count,
376
423
  "execution_profile_key": execution_profile_key,
377
424
  "provisioning_model": provisioning_model,
378
- "max_active_jobs": max_active_jobs,
379
- "config": {"store_heatmaps": store_heatmaps},
425
+ "config": _parse_json_object(config_json, option_name="--config-json"),
380
426
  "lease_seconds": lease_seconds,
381
427
  "dry_run": dry_run or not write,
382
428
  },
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "buildai-cli"
7
- version = "0.3.69"
7
+ version = "0.3.71"
8
8
  description = "Build AI CLI (Typer)"
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes