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.
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/.gitignore +3 -1
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/PKG-INFO +1 -1
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/processing.py +89 -43
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/pyproject.toml +1 -1
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/AGENTS.md +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/CLAUDE.md +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/buildai_bootstrap.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/_has_core.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/auth_local.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/api_proxy.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/auth.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/broker.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/common.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/migrate.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/query.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/schema.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/status.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/db/tunnel.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/dev.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/doctor.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/commands/gigcamera.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/config.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/console.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/context.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/db_broker.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/guard.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/internal_api.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/main.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/nl_query/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/nl_query/dataset_tools.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/ops_init.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/output.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.71}/cli/pagination.py +0 -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
|
|
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("
|
|
293
|
-
def
|
|
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="
|
|
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
|
-
"
|
|
361
|
+
"modal.h100.500",
|
|
298
362
|
"--execution-profile-key",
|
|
299
|
-
help="
|
|
363
|
+
help="Modal execution profile used for each episode job.",
|
|
300
364
|
),
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
"--
|
|
304
|
-
help="
|
|
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
|
|
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/
|
|
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
|
-
"
|
|
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-
|
|
329
|
-
def
|
|
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="
|
|
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.
|
|
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
|
-
|
|
404
|
+
config_json: str | None = typer.Option(
|
|
350
405
|
None,
|
|
351
|
-
"--
|
|
352
|
-
|
|
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
|
|
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-
|
|
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
|
-
"
|
|
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
|
},
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|