buildai-cli 0.3.69__tar.gz → 0.3.70__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.70}/.gitignore +3 -1
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/PKG-INFO +1 -1
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/processing.py +81 -43
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/pyproject.toml +1 -1
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/AGENTS.md +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/CLAUDE.md +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/buildai_bootstrap.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/_has_core.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/auth_local.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/api_proxy.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/auth.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/broker.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/common.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/migrate.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/query.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/schema.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/status.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/tunnel.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/dev.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/doctor.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/gigcamera.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/config.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/console.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/context.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/db_broker.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/guard.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/internal_api.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/main.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/nl_query/__init__.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/nl_query/dataset_tools.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/ops_init.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/output.py +0 -0
- {buildai_cli-0.3.69 → buildai_cli-0.3.70}/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,132 @@ def scheduler_tick(
|
|
|
289
289
|
)
|
|
290
290
|
|
|
291
291
|
|
|
292
|
-
@stage_jobs_app.command("
|
|
293
|
-
def
|
|
292
|
+
@stage_jobs_app.command("plan-egoexo")
|
|
293
|
+
def plan_egoexo_stage_jobs(
|
|
294
|
+
run_key: str = typer.Option(..., "--run-key", help="Stage-job run key to plan."),
|
|
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 stage keys. Defaults to pose_2d_recording,pose_3d_definition_run.",
|
|
309
|
+
),
|
|
310
|
+
limit: int = typer.Option(100, "--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
|
+
dry_run: bool = typer.Option(False, "--dry-run", help="Preview planned work."),
|
|
318
|
+
write: bool = typer.Option(False, "--write", help="Create work items. Omit for dry-run."),
|
|
319
|
+
) -> None:
|
|
320
|
+
"""Plan missing episode-scoped EgoExo stage jobs from canonical DB truth."""
|
|
321
|
+
_request(
|
|
322
|
+
"/v1/processing/stage-jobs/egoexo/plan",
|
|
323
|
+
method="POST",
|
|
324
|
+
body={
|
|
325
|
+
"program_slug": program_slug,
|
|
326
|
+
"recording_batch_id": recording_batch_id,
|
|
327
|
+
"stages": _parse_csv(
|
|
328
|
+
stages,
|
|
329
|
+
option_name="--stages",
|
|
330
|
+
allowed={"pose_2d", "pose_3d", "pose_2d_recording", "pose_3d_definition_run"},
|
|
331
|
+
),
|
|
332
|
+
"run_key": run_key,
|
|
333
|
+
"limit": limit,
|
|
334
|
+
"priority": priority,
|
|
335
|
+
"skip_existing_pose_3d": skip_existing_pose_3d,
|
|
336
|
+
"dry_run": dry_run or not write,
|
|
337
|
+
},
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
@stage_jobs_app.command("launch-egoexo-pose-2d-modal")
|
|
342
|
+
def launch_egoexo_pose_2d_modal(
|
|
294
343
|
limit: int = typer.Option(10, "--limit", min=1, max=200),
|
|
295
|
-
run_key: str = typer.Option(..., "--run-key", help="
|
|
344
|
+
run_key: str = typer.Option(..., "--run-key", help="Pose2D run key to drain."),
|
|
345
|
+
task_count: int = typer.Option(
|
|
346
|
+
500,
|
|
347
|
+
"--task-count",
|
|
348
|
+
min=1,
|
|
349
|
+
max=1000,
|
|
350
|
+
help="Maximum Modal workers per episode work item.",
|
|
351
|
+
),
|
|
296
352
|
execution_profile_key: str = typer.Option(
|
|
297
|
-
"
|
|
353
|
+
"modal.h100.500",
|
|
298
354
|
"--execution-profile-key",
|
|
299
|
-
help="
|
|
355
|
+
help="Modal execution profile used for each episode job.",
|
|
300
356
|
),
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
"--
|
|
304
|
-
help="
|
|
357
|
+
store_heatmaps: bool = typer.Option(
|
|
358
|
+
False,
|
|
359
|
+
"--store-heatmaps",
|
|
360
|
+
help="Persist pre-decoded Sapiens heatmap logits as optional artifacts.",
|
|
305
361
|
),
|
|
306
362
|
lease_seconds: int = typer.Option(24 * 60 * 60, "--lease-seconds", min=600),
|
|
307
363
|
dry_run: bool = typer.Option(False, "--dry-run", help="Preview ready work without leasing."),
|
|
308
364
|
write: bool = typer.Option(False, "--write", help="Launch jobs. Omit for dry-run."),
|
|
309
365
|
) -> 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)
|
|
366
|
+
"""Launch Modal-backed Sapiens Pose2D workers for ready EgoExo episodes."""
|
|
314
367
|
_request(
|
|
315
|
-
"/v1/processing/stage-jobs/egoexo/
|
|
368
|
+
"/v1/processing/stage-jobs/egoexo/pose-2d/launch-modal",
|
|
316
369
|
method="POST",
|
|
317
370
|
body={
|
|
318
371
|
"limit": limit,
|
|
319
372
|
"run_key": run_key,
|
|
373
|
+
"task_count": task_count,
|
|
320
374
|
"execution_profile_key": execution_profile_key,
|
|
321
|
-
"
|
|
375
|
+
"config": {"store_heatmaps": store_heatmaps},
|
|
322
376
|
"lease_seconds": lease_seconds,
|
|
323
377
|
"dry_run": dry_run or not write,
|
|
324
378
|
},
|
|
325
379
|
)
|
|
326
380
|
|
|
327
381
|
|
|
328
|
-
@stage_jobs_app.command("launch-egoexo-pose-
|
|
329
|
-
def
|
|
382
|
+
@stage_jobs_app.command("launch-egoexo-pose-3d-batch")
|
|
383
|
+
def launch_egoexo_pose_3d_batch(
|
|
330
384
|
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
|
-
),
|
|
385
|
+
run_key: str = typer.Option(..., "--run-key", help="Pose3D run key to drain."),
|
|
339
386
|
execution_profile_key: str = typer.Option(
|
|
340
|
-
"gcp.us.
|
|
387
|
+
"gcp.us.pose_3d_cpu",
|
|
341
388
|
"--execution-profile-key",
|
|
342
|
-
help="Cloud Batch execution profile used for each episode job.",
|
|
389
|
+
help="Cloud Batch execution profile used for each episode triangulation job.",
|
|
343
390
|
),
|
|
344
391
|
provisioning_model: str = typer.Option(
|
|
345
392
|
"standard",
|
|
346
393
|
"--provisioning-model",
|
|
347
394
|
help="Cloud Batch provisioning model: standard or spot.",
|
|
348
395
|
),
|
|
349
|
-
|
|
396
|
+
config_json: str | None = typer.Option(
|
|
350
397
|
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.",
|
|
398
|
+
"--config-json",
|
|
399
|
+
help="Optional Pose3D processor config JSON object.",
|
|
360
400
|
),
|
|
361
401
|
lease_seconds: int = typer.Option(24 * 60 * 60, "--lease-seconds", min=600),
|
|
362
402
|
dry_run: bool = typer.Option(False, "--dry-run", help="Preview ready work without leasing."),
|
|
363
403
|
write: bool = typer.Option(False, "--write", help="Launch jobs. Omit for dry-run."),
|
|
364
404
|
) -> None:
|
|
365
|
-
"""Launch
|
|
405
|
+
"""Launch optimized receipt-backed Pose3D triangulation jobs for ready episodes."""
|
|
366
406
|
if provisioning_model not in {"standard", "spot"}:
|
|
367
407
|
error("--provisioning-model must be one of: standard, spot")
|
|
368
408
|
raise typer.Exit(1)
|
|
369
409
|
_request(
|
|
370
|
-
"/v1/processing/stage-jobs/egoexo/pose-
|
|
410
|
+
"/v1/processing/stage-jobs/egoexo/pose-3d/launch-batch",
|
|
371
411
|
method="POST",
|
|
372
412
|
body={
|
|
373
413
|
"limit": limit,
|
|
374
414
|
"run_key": run_key,
|
|
375
|
-
"task_count": task_count,
|
|
376
415
|
"execution_profile_key": execution_profile_key,
|
|
377
416
|
"provisioning_model": provisioning_model,
|
|
378
|
-
"
|
|
379
|
-
"config": {"store_heatmaps": store_heatmaps},
|
|
417
|
+
"config": _parse_json_object(config_json, option_name="--config-json"),
|
|
380
418
|
"lease_seconds": lease_seconds,
|
|
381
419
|
"dry_run": dry_run or not write,
|
|
382
420
|
},
|
|
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
|