@camstack/types 1.2.316 → 1.2.317
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.
- package/dist/addon.js +5 -1
- package/dist/addon.mjs +5 -1
- package/dist/capabilities/composer.cap.d.ts +1 -1
- package/dist/capabilities/core-blocks.cap.d.ts +8 -8
- package/dist/capabilities/pipeline-executor.cap.d.ts +73 -0
- package/dist/capabilities/pipeline-orchestrator.cap.d.ts +460 -0
- package/dist/client.js +3 -0
- package/dist/client.mjs +3 -0
- package/dist/composition/composition-report.d.ts +3 -3
- package/dist/generated/addon-api.d.ts +21 -0
- package/dist/generated/cap-input-defaults.d.ts +1 -1
- package/dist/generated/method-access-map.d.ts +1 -1
- package/dist/generated/method-device-selectors.d.ts +2 -2
- package/dist/generated/system-proxy.d.ts +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1178 -43
- package/dist/index.mjs +1146 -44
- package/dist/pipeline/best-settings/demand.d.ts +78 -0
- package/dist/pipeline/best-settings/detector-performance.d.ts +34 -0
- package/dist/pipeline/best-settings/hardware-class.d.ts +40 -0
- package/dist/pipeline/best-settings/index.d.ts +10 -0
- package/dist/pipeline/best-settings/plan-schemas.d.ts +859 -0
- package/dist/pipeline/best-settings/recommend.d.ts +54 -0
- package/dist/pipeline/model-bound-settings.d.ts +7 -0
- package/dist/types/models.d.ts +45 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5731,6 +5731,40 @@ var ModelFormatEntrySchema = zod.z.object({
|
|
|
5731
5731
|
revision: zod.z.string().min(1).optional()
|
|
5732
5732
|
});
|
|
5733
5733
|
/**
|
|
5734
|
+
* What a node holds for one (model, format) (D746). `current` is a complete
|
|
5735
|
+
* copy at its catalog revision — exactly what `downloaded: true` means.
|
|
5736
|
+
* `stale` is bytes on disk that are not (yet) proven current under D743/D744:
|
|
5737
|
+
* no or a different revision record, or a missing sibling. `missing` is no
|
|
5738
|
+
* copy. `downloaded` alone folds `stale` into "not downloaded", which hid
|
|
5739
|
+
* reclaimable bytes and a copy about to be replaced.
|
|
5740
|
+
*/
|
|
5741
|
+
var ModelOnDiskStateSchema = zod.z.enum([
|
|
5742
|
+
"current",
|
|
5743
|
+
"stale",
|
|
5744
|
+
"missing"
|
|
5745
|
+
]);
|
|
5746
|
+
/**
|
|
5747
|
+
* The numeric precision of one format's BUILD (D746) — reported only when the
|
|
5748
|
+
* build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
|
|
5749
|
+
* CamStack Core ML export). Absent means "not stated", never "fp32".
|
|
5750
|
+
*/
|
|
5751
|
+
var ModelFormatPrecisionSchema = zod.z.enum([
|
|
5752
|
+
"fp32",
|
|
5753
|
+
"fp16",
|
|
5754
|
+
"int8"
|
|
5755
|
+
]);
|
|
5756
|
+
/**
|
|
5757
|
+
* One format of one model as a node's `pipelineExecutor.getSchema` reports it.
|
|
5758
|
+
* `onDisk` / `precision` are optional for version skew: a runner that predates
|
|
5759
|
+
* them omits them, and a reader falls back to `downloaded`.
|
|
5760
|
+
*/
|
|
5761
|
+
var PipelineModelFormatStatusSchema = zod.z.object({
|
|
5762
|
+
downloaded: zod.z.boolean(),
|
|
5763
|
+
sizeMB: zod.z.number(),
|
|
5764
|
+
onDisk: ModelOnDiskStateSchema.optional(),
|
|
5765
|
+
precision: ModelFormatPrecisionSchema.optional()
|
|
5766
|
+
});
|
|
5767
|
+
/**
|
|
5734
5768
|
* Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
|
|
5735
5769
|
* The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
|
|
5736
5770
|
*/
|
|
@@ -26545,7 +26579,7 @@ var FrameRefSchema = zod.z.object({
|
|
|
26545
26579
|
timestamp: zod.z.number(),
|
|
26546
26580
|
capturedAt: zod.z.number().optional()
|
|
26547
26581
|
});
|
|
26548
|
-
var ModelFormatSchema$
|
|
26582
|
+
var ModelFormatSchema$2 = zod.z.enum([
|
|
26549
26583
|
"onnx",
|
|
26550
26584
|
"coreml",
|
|
26551
26585
|
"openvino",
|
|
@@ -26563,7 +26597,7 @@ var PipelineSlotSchema = zod.z.enum([
|
|
|
26563
26597
|
var PipelineEngineChoiceSchema = zod.z.object({
|
|
26564
26598
|
runtime: zod.z.literal("python"),
|
|
26565
26599
|
backend: zod.z.string(),
|
|
26566
|
-
format: ModelFormatSchema$
|
|
26600
|
+
format: ModelFormatSchema$2,
|
|
26567
26601
|
device: zod.z.string().optional()
|
|
26568
26602
|
});
|
|
26569
26603
|
/**
|
|
@@ -26621,10 +26655,7 @@ var PipelineTemplateSchema$1 = zod.z.object({
|
|
|
26621
26655
|
var PipelineModelOptionSchema = zod.z.object({
|
|
26622
26656
|
id: zod.z.string(),
|
|
26623
26657
|
name: zod.z.string(),
|
|
26624
|
-
formats: zod.z.record(zod.z.string(),
|
|
26625
|
-
downloaded: zod.z.boolean(),
|
|
26626
|
-
sizeMB: zod.z.number()
|
|
26627
|
-
})),
|
|
26658
|
+
formats: zod.z.record(zod.z.string(), PipelineModelFormatStatusSchema),
|
|
26628
26659
|
group: ModelVariantGroupSchema.optional(),
|
|
26629
26660
|
legacy: zod.z.boolean().optional(),
|
|
26630
26661
|
provider: ModelProviderIdSchema.optional(),
|
|
@@ -26839,6 +26870,32 @@ var pipelineExecutorCapability = {
|
|
|
26839
26870
|
auth: "admin"
|
|
26840
26871
|
}),
|
|
26841
26872
|
/**
|
|
26873
|
+
* Best settings (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
|
|
26874
|
+
* the object-detection root, and their binding keys) stored in THIS node's
|
|
26875
|
+
* per-camera detector settings — and, unless `dryRun`, remove them so the
|
|
26876
|
+
* running model's own defaults apply. Every other key of a camera's store
|
|
26877
|
+
* is kept. `nodeId` is the ROUTING key. `deviceIds` absent ⇒ every camera
|
|
26878
|
+
* with a store. A camera whose store could not be read is `refused`, never
|
|
26879
|
+
* reported as clean.
|
|
26880
|
+
*/
|
|
26881
|
+
clearModelBoundDeviceOverrides: require_sleep.method(zod.z.object({
|
|
26882
|
+
nodeId: zod.z.string(),
|
|
26883
|
+
deviceIds: zod.z.array(zod.z.number()).readonly().optional(),
|
|
26884
|
+
dryRun: zod.z.boolean()
|
|
26885
|
+
}), zod.z.object({
|
|
26886
|
+
entries: zod.z.array(zod.z.object({
|
|
26887
|
+
deviceId: zod.z.number(),
|
|
26888
|
+
keys: zod.z.array(zod.z.string()).readonly()
|
|
26889
|
+
})).readonly(),
|
|
26890
|
+
refused: zod.z.array(zod.z.object({
|
|
26891
|
+
deviceId: zod.z.number(),
|
|
26892
|
+
reason: zod.z.string()
|
|
26893
|
+
})).readonly()
|
|
26894
|
+
}), {
|
|
26895
|
+
kind: "mutation",
|
|
26896
|
+
auth: "admin"
|
|
26897
|
+
}),
|
|
26898
|
+
/**
|
|
26842
26899
|
* Which of THIS node's inference devices the executor currently refuses,
|
|
26843
26900
|
* and why. `nodeId` is the ROUTING key (stripped by the generated router).
|
|
26844
26901
|
*
|
|
@@ -26933,12 +26990,12 @@ var pipelineExecutorCapability = {
|
|
|
26933
26990
|
downloadModel: require_sleep.method(zod.z.object({
|
|
26934
26991
|
addonId: zod.z.string(),
|
|
26935
26992
|
modelId: zod.z.string(),
|
|
26936
|
-
format: ModelFormatSchema$
|
|
26993
|
+
format: ModelFormatSchema$2
|
|
26937
26994
|
}), DownloadModelResultSchema, { kind: "mutation" }),
|
|
26938
26995
|
deleteModel: require_sleep.method(zod.z.object({
|
|
26939
26996
|
addonId: zod.z.string(),
|
|
26940
26997
|
modelId: zod.z.string(),
|
|
26941
|
-
format: ModelFormatSchema$
|
|
26998
|
+
format: ModelFormatSchema$2
|
|
26942
26999
|
}), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation" }),
|
|
26943
27000
|
/**
|
|
26944
27001
|
* Stateless single-frame execution. Callers (runner, benchmark) pass
|
|
@@ -27185,6 +27242,206 @@ var pipelineExecutorCapability = {
|
|
|
27185
27242
|
}
|
|
27186
27243
|
};
|
|
27187
27244
|
//#endregion
|
|
27245
|
+
//#region src/pipeline/best-settings/plan-schemas.ts
|
|
27246
|
+
/**
|
|
27247
|
+
* The wire shapes of the Best settings plan and apply (D745), used by the
|
|
27248
|
+
* `pipeline-orchestrator` cap. The recommender's own types
|
|
27249
|
+
* (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
|
|
27250
|
+
* schemas are what crosses the cap boundary.
|
|
27251
|
+
*/
|
|
27252
|
+
var ModelFormatSchema$1 = zod.z.enum(MODEL_FORMATS);
|
|
27253
|
+
var HardwareClassIdSchema = zod.z.enum([
|
|
27254
|
+
"intel-core-ultra",
|
|
27255
|
+
"intel-n-series",
|
|
27256
|
+
"apple-m-base",
|
|
27257
|
+
"apple-m-pro",
|
|
27258
|
+
"unknown"
|
|
27259
|
+
]);
|
|
27260
|
+
var AcceleratorKindSchema = zod.z.enum([
|
|
27261
|
+
"intel-npu",
|
|
27262
|
+
"intel-igpu",
|
|
27263
|
+
"x86-cpu",
|
|
27264
|
+
"arm-cpu",
|
|
27265
|
+
"apple-ane",
|
|
27266
|
+
"coral"
|
|
27267
|
+
]);
|
|
27268
|
+
var RecommendationReasonSchema = zod.z.discriminatedUnion("kind", [
|
|
27269
|
+
zod.z.object({
|
|
27270
|
+
kind: zod.z.literal("fits"),
|
|
27271
|
+
utilisation: zod.z.number()
|
|
27272
|
+
}),
|
|
27273
|
+
zod.z.object({
|
|
27274
|
+
kind: zod.z.literal("tie-faster"),
|
|
27275
|
+
over: zod.z.string(),
|
|
27276
|
+
recallDelta: zod.z.number()
|
|
27277
|
+
}),
|
|
27278
|
+
zod.z.object({
|
|
27279
|
+
kind: zod.z.literal("stepped-down"),
|
|
27280
|
+
from: zod.z.string(),
|
|
27281
|
+
to: zod.z.string(),
|
|
27282
|
+
limitedBy: zod.z.string()
|
|
27283
|
+
}),
|
|
27284
|
+
zod.z.object({
|
|
27285
|
+
kind: zod.z.literal("no-fit-lightest"),
|
|
27286
|
+
utilisation: zod.z.number()
|
|
27287
|
+
}),
|
|
27288
|
+
zod.z.object({
|
|
27289
|
+
kind: zod.z.literal("derived-latency"),
|
|
27290
|
+
modelId: zod.z.string()
|
|
27291
|
+
}),
|
|
27292
|
+
zod.z.object({
|
|
27293
|
+
kind: zod.z.literal("estimated-load"),
|
|
27294
|
+
observedForMs: zod.z.number().nullable()
|
|
27295
|
+
}),
|
|
27296
|
+
zod.z.object({ kind: zod.z.literal("cpu-device") }),
|
|
27297
|
+
zod.z.object({ kind: zod.z.literal("coral-untouched") }),
|
|
27298
|
+
zod.z.object({ kind: zod.z.literal("device-disabled") }),
|
|
27299
|
+
zod.z.object({ kind: zod.z.literal("device-unavailable") }),
|
|
27300
|
+
zod.z.object({ kind: zod.z.literal("node-offline") }),
|
|
27301
|
+
zod.z.object({ kind: zod.z.literal("no-hardware-facts") }),
|
|
27302
|
+
zod.z.object({
|
|
27303
|
+
kind: zod.z.literal("no-measured-data"),
|
|
27304
|
+
hardwareClass: HardwareClassIdSchema
|
|
27305
|
+
}),
|
|
27306
|
+
zod.z.object({
|
|
27307
|
+
kind: zod.z.literal("no-family-build"),
|
|
27308
|
+
format: ModelFormatSchema$1
|
|
27309
|
+
})
|
|
27310
|
+
]);
|
|
27311
|
+
var DeviceDemandSchema = zod.z.object({
|
|
27312
|
+
nodeId: zod.z.string(),
|
|
27313
|
+
deviceKey: zod.z.string(),
|
|
27314
|
+
demandFps: zod.z.number(),
|
|
27315
|
+
maxCameraFps: zod.z.number(),
|
|
27316
|
+
alwaysOnCameras: zod.z.number(),
|
|
27317
|
+
onMotionSessions: zod.z.number(),
|
|
27318
|
+
onMotionSource: zod.z.enum([
|
|
27319
|
+
"observed-24h",
|
|
27320
|
+
"estimate",
|
|
27321
|
+
"none"
|
|
27322
|
+
]),
|
|
27323
|
+
observedForMs: zod.z.number().nullable()
|
|
27324
|
+
});
|
|
27325
|
+
var DeviceModelChoiceSchema = zod.z.object({
|
|
27326
|
+
modelId: zod.z.string(),
|
|
27327
|
+
p50Ms: zod.z.number(),
|
|
27328
|
+
fps: zod.z.number(),
|
|
27329
|
+
measured: zod.z.boolean(),
|
|
27330
|
+
utilisation: zod.z.number(),
|
|
27331
|
+
personRecall: zod.z.number()
|
|
27332
|
+
});
|
|
27333
|
+
var DeviceRecommendationSchema = zod.z.object({
|
|
27334
|
+
deviceKey: zod.z.string(),
|
|
27335
|
+
accelerator: AcceleratorKindSchema.nullable(),
|
|
27336
|
+
enabled: zod.z.boolean(),
|
|
27337
|
+
available: zod.z.boolean(),
|
|
27338
|
+
demand: DeviceDemandSchema.nullable(),
|
|
27339
|
+
chosen: DeviceModelChoiceSchema.nullable(),
|
|
27340
|
+
reasons: zod.z.array(RecommendationReasonSchema).readonly()
|
|
27341
|
+
});
|
|
27342
|
+
var NodeRecommendationSchema = zod.z.object({
|
|
27343
|
+
nodeId: zod.z.string(),
|
|
27344
|
+
reachable: zod.z.boolean(),
|
|
27345
|
+
hardwareClass: HardwareClassIdSchema.nullable(),
|
|
27346
|
+
cpuModel: zod.z.string().nullable(),
|
|
27347
|
+
skipped: zod.z.boolean(),
|
|
27348
|
+
acceleratorModelId: zod.z.string().nullable(),
|
|
27349
|
+
devices: zod.z.array(DeviceRecommendationSchema).readonly(),
|
|
27350
|
+
reasons: zod.z.array(RecommendationReasonSchema).readonly()
|
|
27351
|
+
});
|
|
27352
|
+
var ModelPinChangeSchema = zod.z.object({
|
|
27353
|
+
stepId: zod.z.string(),
|
|
27354
|
+
before: zod.z.string().nullable(),
|
|
27355
|
+
after: zod.z.string().nullable()
|
|
27356
|
+
});
|
|
27357
|
+
var NodeDeviceChangeSchema = zod.z.object({
|
|
27358
|
+
nodeId: zod.z.string(),
|
|
27359
|
+
deviceKey: zod.z.string(),
|
|
27360
|
+
madeExplicit: zod.z.boolean(),
|
|
27361
|
+
modelPins: zod.z.array(ModelPinChangeSchema).readonly(),
|
|
27362
|
+
thresholds: zod.z.array(zod.z.object({
|
|
27363
|
+
stepId: zod.z.string(),
|
|
27364
|
+
keys: zod.z.array(zod.z.string()).readonly()
|
|
27365
|
+
})).readonly()
|
|
27366
|
+
});
|
|
27367
|
+
var CameraOverrideClearSchema = zod.z.object({
|
|
27368
|
+
deviceId: zod.z.number(),
|
|
27369
|
+
source: zod.z.enum(["step-override", "wholesale"]),
|
|
27370
|
+
nodeId: zod.z.string(),
|
|
27371
|
+
deviceKey: zod.z.string().nullable(),
|
|
27372
|
+
stepId: zod.z.string(),
|
|
27373
|
+
modelIdBefore: zod.z.string().nullable(),
|
|
27374
|
+
keys: zod.z.array(zod.z.string()).readonly()
|
|
27375
|
+
});
|
|
27376
|
+
var DetectorStoreClearSchema = zod.z.object({
|
|
27377
|
+
deviceId: zod.z.number(),
|
|
27378
|
+
keys: zod.z.array(zod.z.string()).readonly()
|
|
27379
|
+
});
|
|
27380
|
+
var BestSettingsWarningSchema = zod.z.discriminatedUnion("kind", [
|
|
27381
|
+
zod.z.object({
|
|
27382
|
+
kind: zod.z.literal("detector-store-cluster-wide"),
|
|
27383
|
+
skippedNodes: zod.z.array(zod.z.string()).readonly()
|
|
27384
|
+
}),
|
|
27385
|
+
zod.z.object({
|
|
27386
|
+
kind: zod.z.literal("detector-store-unreadable"),
|
|
27387
|
+
error: zod.z.string()
|
|
27388
|
+
}),
|
|
27389
|
+
zod.z.object({
|
|
27390
|
+
kind: zod.z.literal("coral-enabled"),
|
|
27391
|
+
nodeId: zod.z.string(),
|
|
27392
|
+
deviceKey: zod.z.string()
|
|
27393
|
+
})
|
|
27394
|
+
]);
|
|
27395
|
+
var BestSettingsOptionsSchema = zod.z.object({
|
|
27396
|
+
/** Share of each accelerator's throughput kept free (0.3–0.5). */
|
|
27397
|
+
headroom: zod.z.number().min(.3).max(.5).default(.4) });
|
|
27398
|
+
var BestSettingsPlanSchema = zod.z.object({
|
|
27399
|
+
/** Hash of everything the apply will write — the apply refuses a different one. */
|
|
27400
|
+
planHash: zod.z.string(),
|
|
27401
|
+
family: zod.z.literal("yolov9"),
|
|
27402
|
+
headroom: zod.z.number(),
|
|
27403
|
+
generatedAt: zod.z.number(),
|
|
27404
|
+
nodes: zod.z.array(NodeRecommendationSchema).readonly(),
|
|
27405
|
+
nodeChanges: zod.z.array(NodeDeviceChangeSchema).readonly(),
|
|
27406
|
+
cameraClears: zod.z.array(CameraOverrideClearSchema).readonly(),
|
|
27407
|
+
detectorStoreClears: zod.z.array(DetectorStoreClearSchema).readonly(),
|
|
27408
|
+
warnings: zod.z.array(BestSettingsWarningSchema).readonly()
|
|
27409
|
+
});
|
|
27410
|
+
var BestSettingsApplyInputSchema = zod.z.object({
|
|
27411
|
+
planHash: zod.z.string(),
|
|
27412
|
+
headroom: zod.z.number().min(.3).max(.5).default(.4)
|
|
27413
|
+
});
|
|
27414
|
+
var BestSettingsPhaseResultSchema = zod.z.object({
|
|
27415
|
+
phase: zod.z.enum([
|
|
27416
|
+
"download",
|
|
27417
|
+
"camera-overrides",
|
|
27418
|
+
"detector-thresholds",
|
|
27419
|
+
"node-models",
|
|
27420
|
+
"redispatch"
|
|
27421
|
+
]),
|
|
27422
|
+
ok: zod.z.boolean(),
|
|
27423
|
+
detail: zod.z.string()
|
|
27424
|
+
});
|
|
27425
|
+
var BestSettingsApplyResultSchema = zod.z.discriminatedUnion("kind", [
|
|
27426
|
+
zod.z.object({
|
|
27427
|
+
kind: zod.z.literal("applied"),
|
|
27428
|
+
planHash: zod.z.string(),
|
|
27429
|
+
phases: zod.z.array(BestSettingsPhaseResultSchema).readonly()
|
|
27430
|
+
}),
|
|
27431
|
+
zod.z.object({
|
|
27432
|
+
kind: zod.z.literal("aborted"),
|
|
27433
|
+
phases: zod.z.array(BestSettingsPhaseResultSchema).readonly()
|
|
27434
|
+
}),
|
|
27435
|
+
zod.z.object({
|
|
27436
|
+
kind: zod.z.literal("stale"),
|
|
27437
|
+
plan: BestSettingsPlanSchema
|
|
27438
|
+
}),
|
|
27439
|
+
zod.z.object({
|
|
27440
|
+
kind: zod.z.literal("refused"),
|
|
27441
|
+
reason: zod.z.enum(["apply-in-progress"])
|
|
27442
|
+
})
|
|
27443
|
+
]);
|
|
27444
|
+
//#endregion
|
|
27188
27445
|
//#region src/capabilities/schemas/orchestrator-metrics.ts
|
|
27189
27446
|
/** Shared Zod schemas for the runtime pipeline orchestrator metrics. */
|
|
27190
27447
|
var OrchestratorMetricsSchema = zod.z.object({
|
|
@@ -29622,6 +29879,27 @@ var pipelineOrchestratorCapability = {
|
|
|
29622
29879
|
kind: "mutation",
|
|
29623
29880
|
auth: "admin"
|
|
29624
29881
|
}),
|
|
29882
|
+
/**
|
|
29883
|
+
* Best settings (D745) — DRY RUN. Recommends ONE detector family (YOLOv9)
|
|
29884
|
+
* for the whole cluster from each node's static hardware class, the
|
|
29885
|
+
* measured latency table and the detection demand, and lists every write
|
|
29886
|
+
* the apply would make: the node model pins set, the enrichment pins and
|
|
29887
|
+
* model-bound thresholds removed (node level and per camera), and the
|
|
29888
|
+
* per-camera detector thresholds cleared. Writes nothing. Step
|
|
29889
|
+
* enablement, device enablement, pins, recording, notifications, zones and
|
|
29890
|
+
* rules are never part of it. `planHash` names exactly this diff.
|
|
29891
|
+
*/
|
|
29892
|
+
planBestSettings: require_sleep.method(BestSettingsOptionsSchema, BestSettingsPlanSchema, { auth: "admin" }),
|
|
29893
|
+
/**
|
|
29894
|
+
* Best settings (D745) — APPLY the plan the operator confirmed. Recomputes
|
|
29895
|
+
* the plan and refuses (`stale`, with the fresh plan) when its hash is not
|
|
29896
|
+
* `planHash`, so what is written is exactly the confirmed diff. Offline
|
|
29897
|
+
* nodes are skipped; there is no undo.
|
|
29898
|
+
*/
|
|
29899
|
+
applyBestSettings: require_sleep.method(BestSettingsApplyInputSchema, BestSettingsApplyResultSchema, {
|
|
29900
|
+
kind: "mutation",
|
|
29901
|
+
auth: "admin"
|
|
29902
|
+
}),
|
|
29625
29903
|
/** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
|
|
29626
29904
|
getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
|
|
29627
29905
|
/** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
|
|
@@ -55704,6 +55982,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
55704
55982
|
addonId: null,
|
|
55705
55983
|
access: "delete"
|
|
55706
55984
|
},
|
|
55985
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": {
|
|
55986
|
+
capName: "pipeline-executor",
|
|
55987
|
+
capScope: "system",
|
|
55988
|
+
addonId: null,
|
|
55989
|
+
access: "delete"
|
|
55990
|
+
},
|
|
55707
55991
|
"pipelineExecutor.deleteModel": {
|
|
55708
55992
|
capName: "pipeline-executor",
|
|
55709
55993
|
capScope: "system",
|
|
@@ -55920,6 +56204,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
55920
56204
|
addonId: null,
|
|
55921
56205
|
access: "view"
|
|
55922
56206
|
},
|
|
56207
|
+
"pipelineOrchestrator.applyBestSettings": {
|
|
56208
|
+
capName: "pipeline-orchestrator",
|
|
56209
|
+
capScope: "system",
|
|
56210
|
+
addonId: null,
|
|
56211
|
+
access: "create"
|
|
56212
|
+
},
|
|
55923
56213
|
"pipelineOrchestrator.applyDeviceSettingsPatch": {
|
|
55924
56214
|
capName: "pipeline-orchestrator",
|
|
55925
56215
|
capScope: "system",
|
|
@@ -56094,6 +56384,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
56094
56384
|
addonId: null,
|
|
56095
56385
|
access: "create"
|
|
56096
56386
|
},
|
|
56387
|
+
"pipelineOrchestrator.planBestSettings": {
|
|
56388
|
+
capName: "pipeline-orchestrator",
|
|
56389
|
+
capScope: "system",
|
|
56390
|
+
addonId: null,
|
|
56391
|
+
access: "view"
|
|
56392
|
+
},
|
|
56097
56393
|
"pipelineOrchestrator.rebalance": {
|
|
56098
56394
|
capName: "pipeline-orchestrator",
|
|
56099
56395
|
capScope: "system",
|
|
@@ -64868,6 +65164,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
|
|
|
64868
65164
|
form: "single",
|
|
64869
65165
|
optional: false
|
|
64870
65166
|
}],
|
|
65167
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": [{
|
|
65168
|
+
name: "deviceIds",
|
|
65169
|
+
form: "array",
|
|
65170
|
+
optional: true
|
|
65171
|
+
}],
|
|
64871
65172
|
"pipelineExecutor.runPipeline": [{
|
|
64872
65173
|
name: "deviceId",
|
|
64873
65174
|
form: "single",
|
|
@@ -65935,6 +66236,7 @@ var SYSTEM_SCOPE_DEVICE_METHODS = [
|
|
|
65935
66236
|
"osdManager.previewSlot",
|
|
65936
66237
|
"osdManager.renderDevice",
|
|
65937
66238
|
"osdManager.setSlotBinding",
|
|
66239
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides",
|
|
65938
66240
|
"pipelineExecutor.runPipeline",
|
|
65939
66241
|
"pipelineExecutor.runPipelineBatch",
|
|
65940
66242
|
"pipelineOrchestrator.applyDeviceSettingsPatch",
|
|
@@ -66919,6 +67221,7 @@ function createSystemProxy(api) {
|
|
|
66919
67221
|
getVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "getVideoPipelineSteps", "query", input),
|
|
66920
67222
|
setVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "setVideoPipelineSteps", "mutation", input),
|
|
66921
67223
|
clearDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearDeviceOverrides", "mutation", input),
|
|
67224
|
+
clearModelBoundDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearModelBoundDeviceOverrides", "mutation", input),
|
|
66922
67225
|
getInferenceDeviceHealth: (input) => dispatch("pipelineExecutor", "getInferenceDeviceHealth", "query", input),
|
|
66923
67226
|
rearmInferenceDevice: (input) => dispatch("pipelineExecutor", "rearmInferenceDevice", "mutation", input),
|
|
66924
67227
|
getSchema: (input) => dispatch("pipelineExecutor", "getSchema", "query", input),
|
|
@@ -66974,6 +67277,8 @@ function createSystemProxy(api) {
|
|
|
66974
67277
|
setAgentInferenceDevices: (input) => dispatch("pipelineOrchestrator", "setAgentInferenceDevices", "mutation", input),
|
|
66975
67278
|
getNodeInferenceDevices: (input) => dispatch("pipelineOrchestrator", "getNodeInferenceDevices", "query", input),
|
|
66976
67279
|
resetNodePipelineDefaults: (input) => dispatch("pipelineOrchestrator", "resetNodePipelineDefaults", "mutation", input),
|
|
67280
|
+
planBestSettings: (input) => dispatch("pipelineOrchestrator", "planBestSettings", "query", input),
|
|
67281
|
+
applyBestSettings: (input) => dispatch("pipelineOrchestrator", "applyBestSettings", "mutation", input),
|
|
66977
67282
|
getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
|
|
66978
67283
|
setCameraSensors: (input) => dispatch("pipelineOrchestrator", "setCameraSensors", "mutation", input),
|
|
66979
67284
|
reconcileFromDisk: (input) => dispatch("pipelineOrchestrator", "reconcileFromDisk", "mutation", input),
|
|
@@ -71846,41 +72151,6 @@ function isRemovedModelId(stepId, modelId) {
|
|
|
71846
72151
|
}
|
|
71847
72152
|
//#endregion
|
|
71848
72153
|
//#region src/pipeline/model-bound-settings.ts
|
|
71849
|
-
/**
|
|
71850
|
-
* Model-bound step settings (D738): an operator value that is only meaningful
|
|
71851
|
-
* for ONE model, stored together with that model's id.
|
|
71852
|
-
*
|
|
71853
|
-
* The per-class confidence floors are the case it exists for. A score is a
|
|
71854
|
-
* property of one detector's output scale — on this hub the median score of a
|
|
71855
|
-
* correct person was 0.78 on `yolov9m-320-int8`, 0.68 on `yolo26s-320-int8`,
|
|
71856
|
-
* 0.40 on `yolo26n-320-int8` and 0.89 on `yolo26s` (640) — so a floor tuned on
|
|
71857
|
-
* one model is wrong on the next. The DEFAULT of such a field belongs to the
|
|
71858
|
-
* model (the catalog entry); an operator OVERRIDE belongs to the model it was
|
|
71859
|
-
* made for.
|
|
71860
|
-
*
|
|
71861
|
-
* The binding is checked at READ time against the model that RUNS, never
|
|
71862
|
-
* enforced by a write on the model-change path: a model can change without any
|
|
71863
|
-
* operator write at all (an unpinned root follows the elected device's
|
|
71864
|
-
* hardware-aware default, D736), and an event-driven reset could be dropped
|
|
71865
|
-
* (events are telemetry, D8/D11). So:
|
|
71866
|
-
*
|
|
71867
|
-
* effective = override when the stored binding names the running model
|
|
71868
|
-
* | override when no binding is stored (a legacy / programmatic
|
|
71869
|
-
* value — it applies to whatever runs, as before D738)
|
|
71870
|
-
* | the running model's default, when it declares one
|
|
71871
|
-
* | the field's global default.
|
|
71872
|
-
*
|
|
71873
|
-
* Storage shape: the value stays a plain number under its own key (every
|
|
71874
|
-
* reader of the raw settings bag keeps working), and the binding is a SIBLING
|
|
71875
|
-
* key, {@link modelBindingKey}. Both are flat so the shallow per-key merges of
|
|
71876
|
-
* the settings layers (node fold, camera override) carry a value and its
|
|
71877
|
-
* binding together whenever one layer writes both — which every writer here
|
|
71878
|
-
* does.
|
|
71879
|
-
*
|
|
71880
|
-
* Lives in the bare `@camstack/types` entry, which every addon bundles, so the
|
|
71881
|
-
* runner (`addon-pipeline`) and the editors (`ui-library`, `addon-admin-ui`)
|
|
71882
|
-
* apply the same rule.
|
|
71883
|
-
*/
|
|
71884
72154
|
/** Suffix of the sibling key that names the model a stored value was made for. */
|
|
71885
72155
|
var MODEL_BINDING_SUFFIX = "ModelId";
|
|
71886
72156
|
/** `minConfidencePerson` → `minConfidencePersonModelId`. */
|
|
@@ -71969,6 +72239,838 @@ function hasModelBoundOverrides(settings, boundKeys, modelId) {
|
|
|
71969
72239
|
function clearModelBoundOverrides(settings, boundKeys, modelId) {
|
|
71970
72240
|
return boundKeys.reduce((acc, key) => resolveModelBoundSetting(acc, key, modelId, void 0, void 0).source === "override" ? clearModelBoundSetting(acc, key) : acc, { ...settings });
|
|
71971
72241
|
}
|
|
72242
|
+
/**
|
|
72243
|
+
* The keys of every `bindsToModel` field of a step's config schema, groups
|
|
72244
|
+
* flattened (D738). One definition for the runner (which applies the binding)
|
|
72245
|
+
* and the orchestrator's Best settings (which clears those overrides, D745).
|
|
72246
|
+
*/
|
|
72247
|
+
function collectModelBoundKeys(fields) {
|
|
72248
|
+
return fields.flatMap((field) => {
|
|
72249
|
+
if (field.type === "group") return collectModelBoundKeys(field.fields);
|
|
72250
|
+
return "key" in field && "bindsToModel" in field && field.bindsToModel === true ? [field.key] : [];
|
|
72251
|
+
});
|
|
72252
|
+
}
|
|
72253
|
+
//#endregion
|
|
72254
|
+
//#region src/pipeline/best-settings/hardware-class.ts
|
|
72255
|
+
var APPLE_CHIP = /^Apple M(\d+)(?:\s+(Pro|Max|Ultra))?\b/i;
|
|
72256
|
+
var INTEL_CORE_ULTRA = /Core\(TM\)\s+Ultra|Core Ultra/i;
|
|
72257
|
+
var INTEL_N_SERIES = /Intel\(R\)\s+N\d{2,3}\b|\bIntel\s+N\d{2,3}\b/i;
|
|
72258
|
+
function parseAppleChip(cpuModel) {
|
|
72259
|
+
const match = APPLE_CHIP.exec(cpuModel.trim());
|
|
72260
|
+
if (match === null) return null;
|
|
72261
|
+
const generation = Number(match[1]);
|
|
72262
|
+
const variantRaw = (match[2] ?? "base").toLowerCase();
|
|
72263
|
+
return {
|
|
72264
|
+
generation,
|
|
72265
|
+
variant: variantRaw === "pro" || variantRaw === "max" || variantRaw === "ultra" ? variantRaw : "base"
|
|
72266
|
+
};
|
|
72267
|
+
}
|
|
72268
|
+
/**
|
|
72269
|
+
* Classify a node. Apple base chips (M1–M4) map to the measured M2 column, the
|
|
72270
|
+
* Pro/Max/Ultra chips to the measured M3 Pro column — the M2 was measured at
|
|
72271
|
+
* 1.0–1.2× the M3 Pro on the Neural Engine, so the generation inside a variant
|
|
72272
|
+
* matters less than the column's own error.
|
|
72273
|
+
*/
|
|
72274
|
+
function classifyInferenceHardware(hw) {
|
|
72275
|
+
const cpuModel = hw.cpuModel;
|
|
72276
|
+
const apple = parseAppleChip(cpuModel);
|
|
72277
|
+
if (apple !== null) return {
|
|
72278
|
+
hardwareClass: apple.variant === "base" ? "apple-m-base" : "apple-m-pro",
|
|
72279
|
+
cpuModel,
|
|
72280
|
+
apple
|
|
72281
|
+
};
|
|
72282
|
+
if (INTEL_CORE_ULTRA.test(cpuModel)) return {
|
|
72283
|
+
hardwareClass: "intel-core-ultra",
|
|
72284
|
+
cpuModel
|
|
72285
|
+
};
|
|
72286
|
+
if (INTEL_N_SERIES.test(cpuModel)) return {
|
|
72287
|
+
hardwareClass: "intel-n-series",
|
|
72288
|
+
cpuModel
|
|
72289
|
+
};
|
|
72290
|
+
return {
|
|
72291
|
+
hardwareClass: "unknown",
|
|
72292
|
+
cpuModel
|
|
72293
|
+
};
|
|
72294
|
+
}
|
|
72295
|
+
/**
|
|
72296
|
+
* The accelerator kind of one of a node's device keys (`openvino:npu`,
|
|
72297
|
+
* `openvino:gpu`, `coreml:all`, `edgetpu:usb`, `cpu`, `onnx:cpu`, …). `null`
|
|
72298
|
+
* for a key this table has no column for.
|
|
72299
|
+
*/
|
|
72300
|
+
function acceleratorKindOf(deviceKey, hw) {
|
|
72301
|
+
const [backend = "", device = ""] = deviceKey.split(":");
|
|
72302
|
+
if (backend === "edgetpu") return "coral";
|
|
72303
|
+
if (backend === "coreml") return device === "cpu" ? "arm-cpu" : "apple-ane";
|
|
72304
|
+
if (backend === "openvino" && device === "npu") return "intel-npu";
|
|
72305
|
+
if (backend === "openvino" && device === "gpu") return "intel-igpu";
|
|
72306
|
+
if (backend === "cpu" || device === "cpu") return hw.arch === "arm64" ? "arm-cpu" : "x86-cpu";
|
|
72307
|
+
return null;
|
|
72308
|
+
}
|
|
72309
|
+
//#endregion
|
|
72310
|
+
//#region src/pipeline/best-settings/detector-performance.ts
|
|
72311
|
+
var DETECTOR_PERF = {
|
|
72312
|
+
"intel-core-ultra": {
|
|
72313
|
+
"intel-npu": {
|
|
72314
|
+
"yolov9t-320": {
|
|
72315
|
+
p50Ms: 2.9,
|
|
72316
|
+
fps: 383,
|
|
72317
|
+
measured: true
|
|
72318
|
+
},
|
|
72319
|
+
"yolov9t-320-int8": {
|
|
72320
|
+
p50Ms: 3.8,
|
|
72321
|
+
fps: 333,
|
|
72322
|
+
measured: true
|
|
72323
|
+
},
|
|
72324
|
+
"yolov9t-640": {
|
|
72325
|
+
p50Ms: 7.4,
|
|
72326
|
+
fps: 139,
|
|
72327
|
+
measured: true
|
|
72328
|
+
},
|
|
72329
|
+
"yolov9t-640-int8": {
|
|
72330
|
+
p50Ms: 7.5,
|
|
72331
|
+
fps: 144,
|
|
72332
|
+
measured: true
|
|
72333
|
+
},
|
|
72334
|
+
"yolov9s-320": {
|
|
72335
|
+
p50Ms: 4.4,
|
|
72336
|
+
fps: 241,
|
|
72337
|
+
measured: true
|
|
72338
|
+
},
|
|
72339
|
+
"yolov9s-320-int8": {
|
|
72340
|
+
p50Ms: 4.1,
|
|
72341
|
+
fps: 264,
|
|
72342
|
+
measured: true
|
|
72343
|
+
},
|
|
72344
|
+
"yolov9s-640": {
|
|
72345
|
+
p50Ms: 12.7,
|
|
72346
|
+
fps: 82,
|
|
72347
|
+
measured: true
|
|
72348
|
+
},
|
|
72349
|
+
"yolov9s-640-int8": {
|
|
72350
|
+
p50Ms: 10.7,
|
|
72351
|
+
fps: 99,
|
|
72352
|
+
measured: true
|
|
72353
|
+
},
|
|
72354
|
+
"yolov9m-320": {
|
|
72355
|
+
p50Ms: 8.4,
|
|
72356
|
+
fps: 123,
|
|
72357
|
+
measured: true
|
|
72358
|
+
},
|
|
72359
|
+
"yolov9m-320-int8": {
|
|
72360
|
+
p50Ms: 6.5,
|
|
72361
|
+
fps: 165,
|
|
72362
|
+
measured: true
|
|
72363
|
+
},
|
|
72364
|
+
"yolov9m-640": {
|
|
72365
|
+
p50Ms: 29.5,
|
|
72366
|
+
fps: 32,
|
|
72367
|
+
measured: true
|
|
72368
|
+
},
|
|
72369
|
+
"yolov9m-640-int8": {
|
|
72370
|
+
p50Ms: 19.5,
|
|
72371
|
+
fps: 52,
|
|
72372
|
+
measured: true
|
|
72373
|
+
}
|
|
72374
|
+
},
|
|
72375
|
+
"intel-igpu": {
|
|
72376
|
+
"yolov9t-320": {
|
|
72377
|
+
p50Ms: 2.6,
|
|
72378
|
+
fps: 405,
|
|
72379
|
+
measured: true
|
|
72380
|
+
},
|
|
72381
|
+
"yolov9t-320-int8": {
|
|
72382
|
+
p50Ms: 2.8,
|
|
72383
|
+
fps: 324,
|
|
72384
|
+
measured: true
|
|
72385
|
+
},
|
|
72386
|
+
"yolov9t-640": {
|
|
72387
|
+
p50Ms: 6.5,
|
|
72388
|
+
fps: 157,
|
|
72389
|
+
measured: true
|
|
72390
|
+
},
|
|
72391
|
+
"yolov9t-640-int8": {
|
|
72392
|
+
p50Ms: 5.6,
|
|
72393
|
+
fps: 185,
|
|
72394
|
+
measured: true
|
|
72395
|
+
},
|
|
72396
|
+
"yolov9s-320": {
|
|
72397
|
+
p50Ms: 4.6,
|
|
72398
|
+
fps: 200,
|
|
72399
|
+
measured: true
|
|
72400
|
+
},
|
|
72401
|
+
"yolov9s-320-int8": {
|
|
72402
|
+
p50Ms: 4.1,
|
|
72403
|
+
fps: 239,
|
|
72404
|
+
measured: true
|
|
72405
|
+
},
|
|
72406
|
+
"yolov9s-640": {
|
|
72407
|
+
p50Ms: 15.2,
|
|
72408
|
+
fps: 69,
|
|
72409
|
+
measured: true
|
|
72410
|
+
},
|
|
72411
|
+
"yolov9s-640-int8": {
|
|
72412
|
+
p50Ms: 10.5,
|
|
72413
|
+
fps: 99,
|
|
72414
|
+
measured: true
|
|
72415
|
+
},
|
|
72416
|
+
"yolov9m-320": {
|
|
72417
|
+
p50Ms: 11.4,
|
|
72418
|
+
fps: 88,
|
|
72419
|
+
measured: true
|
|
72420
|
+
},
|
|
72421
|
+
"yolov9m-320-int8": {
|
|
72422
|
+
p50Ms: 7,
|
|
72423
|
+
fps: 127,
|
|
72424
|
+
measured: true
|
|
72425
|
+
},
|
|
72426
|
+
"yolov9m-640": {
|
|
72427
|
+
p50Ms: 40,
|
|
72428
|
+
fps: 25,
|
|
72429
|
+
measured: true
|
|
72430
|
+
},
|
|
72431
|
+
"yolov9m-640-int8": {
|
|
72432
|
+
p50Ms: 23.5,
|
|
72433
|
+
fps: 44,
|
|
72434
|
+
measured: true
|
|
72435
|
+
}
|
|
72436
|
+
},
|
|
72437
|
+
"x86-cpu": {
|
|
72438
|
+
"yolov9t-320": {
|
|
72439
|
+
p50Ms: 6.9,
|
|
72440
|
+
fps: 145,
|
|
72441
|
+
measured: true
|
|
72442
|
+
},
|
|
72443
|
+
"yolov9t-320-int8": {
|
|
72444
|
+
p50Ms: 2.7,
|
|
72445
|
+
fps: 405,
|
|
72446
|
+
measured: true
|
|
72447
|
+
},
|
|
72448
|
+
"yolov9t-640": {
|
|
72449
|
+
p50Ms: 23,
|
|
72450
|
+
fps: 44,
|
|
72451
|
+
measured: true
|
|
72452
|
+
},
|
|
72453
|
+
"yolov9t-640-int8": {
|
|
72454
|
+
p50Ms: 8.8,
|
|
72455
|
+
fps: 124,
|
|
72456
|
+
measured: true
|
|
72457
|
+
},
|
|
72458
|
+
"yolov9s-320": {
|
|
72459
|
+
p50Ms: 15.8,
|
|
72460
|
+
fps: 63,
|
|
72461
|
+
measured: true
|
|
72462
|
+
},
|
|
72463
|
+
"yolov9s-320-int8": {
|
|
72464
|
+
p50Ms: 6.5,
|
|
72465
|
+
fps: 180,
|
|
72466
|
+
measured: true
|
|
72467
|
+
},
|
|
72468
|
+
"yolov9s-640": {
|
|
72469
|
+
p50Ms: 58.2,
|
|
72470
|
+
fps: 17,
|
|
72471
|
+
measured: true
|
|
72472
|
+
},
|
|
72473
|
+
"yolov9s-640-int8": {
|
|
72474
|
+
p50Ms: 20.1,
|
|
72475
|
+
fps: 52,
|
|
72476
|
+
measured: true
|
|
72477
|
+
},
|
|
72478
|
+
"yolov9m-320": {
|
|
72479
|
+
p50Ms: 40,
|
|
72480
|
+
fps: 25,
|
|
72481
|
+
measured: true
|
|
72482
|
+
},
|
|
72483
|
+
"yolov9m-320-int8": {
|
|
72484
|
+
p50Ms: 14.2,
|
|
72485
|
+
fps: 74,
|
|
72486
|
+
measured: true
|
|
72487
|
+
},
|
|
72488
|
+
"yolov9m-640": {
|
|
72489
|
+
p50Ms: 155.8,
|
|
72490
|
+
fps: 6,
|
|
72491
|
+
measured: true
|
|
72492
|
+
},
|
|
72493
|
+
"yolov9m-640-int8": {
|
|
72494
|
+
p50Ms: 52.4,
|
|
72495
|
+
fps: 19,
|
|
72496
|
+
measured: true
|
|
72497
|
+
}
|
|
72498
|
+
}
|
|
72499
|
+
},
|
|
72500
|
+
"intel-n-series": {
|
|
72501
|
+
"intel-igpu": {
|
|
72502
|
+
"yolov9t-320": {
|
|
72503
|
+
p50Ms: 15,
|
|
72504
|
+
fps: 48,
|
|
72505
|
+
measured: true
|
|
72506
|
+
},
|
|
72507
|
+
"yolov9t-320-int8": {
|
|
72508
|
+
p50Ms: 14.1,
|
|
72509
|
+
fps: 67,
|
|
72510
|
+
measured: true
|
|
72511
|
+
},
|
|
72512
|
+
"yolov9t-640": {
|
|
72513
|
+
p50Ms: 38.5,
|
|
72514
|
+
fps: 26,
|
|
72515
|
+
measured: true
|
|
72516
|
+
},
|
|
72517
|
+
"yolov9t-640-int8": {
|
|
72518
|
+
p50Ms: 33.1,
|
|
72519
|
+
fps: 33,
|
|
72520
|
+
measured: true
|
|
72521
|
+
},
|
|
72522
|
+
"yolov9s-320": {
|
|
72523
|
+
p50Ms: 41.4,
|
|
72524
|
+
fps: 24,
|
|
72525
|
+
measured: true
|
|
72526
|
+
},
|
|
72527
|
+
"yolov9s-320-int8": {
|
|
72528
|
+
p50Ms: 23.3,
|
|
72529
|
+
fps: 34,
|
|
72530
|
+
measured: true
|
|
72531
|
+
},
|
|
72532
|
+
"yolov9s-640": {
|
|
72533
|
+
p50Ms: 127.4,
|
|
72534
|
+
fps: 8,
|
|
72535
|
+
measured: true
|
|
72536
|
+
},
|
|
72537
|
+
"yolov9s-640-int8": {
|
|
72538
|
+
p50Ms: 92.9,
|
|
72539
|
+
fps: 11,
|
|
72540
|
+
measured: true
|
|
72541
|
+
},
|
|
72542
|
+
"yolov9m-320": {
|
|
72543
|
+
p50Ms: 63.5,
|
|
72544
|
+
fps: 16,
|
|
72545
|
+
measured: true
|
|
72546
|
+
},
|
|
72547
|
+
"yolov9m-320-int8": {
|
|
72548
|
+
p50Ms: 39.4,
|
|
72549
|
+
fps: 26,
|
|
72550
|
+
measured: true
|
|
72551
|
+
},
|
|
72552
|
+
"yolov9m-640": {
|
|
72553
|
+
p50Ms: 215.5,
|
|
72554
|
+
fps: 5,
|
|
72555
|
+
measured: true
|
|
72556
|
+
},
|
|
72557
|
+
"yolov9m-640-int8": {
|
|
72558
|
+
p50Ms: 139.1,
|
|
72559
|
+
fps: 7,
|
|
72560
|
+
measured: true
|
|
72561
|
+
}
|
|
72562
|
+
},
|
|
72563
|
+
"x86-cpu": {
|
|
72564
|
+
"yolov9t-320": {
|
|
72565
|
+
p50Ms: 86.2,
|
|
72566
|
+
fps: 12,
|
|
72567
|
+
measured: true
|
|
72568
|
+
},
|
|
72569
|
+
"yolov9t-320-int8": {
|
|
72570
|
+
p50Ms: 52.7,
|
|
72571
|
+
fps: 20,
|
|
72572
|
+
measured: true
|
|
72573
|
+
},
|
|
72574
|
+
"yolov9t-640": {
|
|
72575
|
+
p50Ms: 322.1,
|
|
72576
|
+
fps: 3,
|
|
72577
|
+
measured: true
|
|
72578
|
+
},
|
|
72579
|
+
"yolov9t-640-int8": {
|
|
72580
|
+
p50Ms: 205.6,
|
|
72581
|
+
fps: 5,
|
|
72582
|
+
measured: true
|
|
72583
|
+
},
|
|
72584
|
+
"yolov9s-320": {
|
|
72585
|
+
p50Ms: 164.4,
|
|
72586
|
+
fps: 6,
|
|
72587
|
+
measured: true
|
|
72588
|
+
},
|
|
72589
|
+
"yolov9s-320-int8": {
|
|
72590
|
+
p50Ms: 86.9,
|
|
72591
|
+
fps: 12,
|
|
72592
|
+
measured: true
|
|
72593
|
+
},
|
|
72594
|
+
"yolov9s-640": {
|
|
72595
|
+
p50Ms: 341.3,
|
|
72596
|
+
fps: 3,
|
|
72597
|
+
measured: true
|
|
72598
|
+
},
|
|
72599
|
+
"yolov9s-640-int8": {
|
|
72600
|
+
p50Ms: 185.3,
|
|
72601
|
+
fps: 5,
|
|
72602
|
+
measured: true
|
|
72603
|
+
},
|
|
72604
|
+
"yolov9m-320": {
|
|
72605
|
+
p50Ms: 166.8,
|
|
72606
|
+
fps: 6,
|
|
72607
|
+
measured: true
|
|
72608
|
+
},
|
|
72609
|
+
"yolov9m-320-int8": {
|
|
72610
|
+
p50Ms: 226.3,
|
|
72611
|
+
fps: 4,
|
|
72612
|
+
measured: true
|
|
72613
|
+
},
|
|
72614
|
+
"yolov9m-640": {
|
|
72615
|
+
p50Ms: 663.5,
|
|
72616
|
+
fps: 2,
|
|
72617
|
+
measured: true
|
|
72618
|
+
},
|
|
72619
|
+
"yolov9m-640-int8": {
|
|
72620
|
+
p50Ms: 324.4,
|
|
72621
|
+
fps: 3,
|
|
72622
|
+
measured: true
|
|
72623
|
+
}
|
|
72624
|
+
}
|
|
72625
|
+
},
|
|
72626
|
+
"apple-m-pro": { "apple-ane": {
|
|
72627
|
+
"yolov9t-320": {
|
|
72628
|
+
p50Ms: 1.1,
|
|
72629
|
+
fps: 952,
|
|
72630
|
+
measured: true
|
|
72631
|
+
},
|
|
72632
|
+
"yolov9t-640": {
|
|
72633
|
+
p50Ms: 3,
|
|
72634
|
+
fps: 333,
|
|
72635
|
+
measured: true
|
|
72636
|
+
},
|
|
72637
|
+
"yolov9s-320": {
|
|
72638
|
+
p50Ms: 1.5,
|
|
72639
|
+
fps: 667,
|
|
72640
|
+
measured: true
|
|
72641
|
+
},
|
|
72642
|
+
"yolov9s-640": {
|
|
72643
|
+
p50Ms: 5.1,
|
|
72644
|
+
fps: 196,
|
|
72645
|
+
measured: true
|
|
72646
|
+
},
|
|
72647
|
+
"yolov9m-320": {
|
|
72648
|
+
p50Ms: 3.2,
|
|
72649
|
+
fps: 312,
|
|
72650
|
+
measured: true
|
|
72651
|
+
},
|
|
72652
|
+
"yolov9m-640": {
|
|
72653
|
+
p50Ms: 10.2,
|
|
72654
|
+
fps: 98,
|
|
72655
|
+
measured: true
|
|
72656
|
+
}
|
|
72657
|
+
} },
|
|
72658
|
+
"apple-m-base": { "apple-ane": {
|
|
72659
|
+
"yolov9t-320": {
|
|
72660
|
+
p50Ms: 1.32,
|
|
72661
|
+
fps: 758,
|
|
72662
|
+
measured: false
|
|
72663
|
+
},
|
|
72664
|
+
"yolov9t-640": {
|
|
72665
|
+
p50Ms: 3.45,
|
|
72666
|
+
fps: 290,
|
|
72667
|
+
measured: true
|
|
72668
|
+
},
|
|
72669
|
+
"yolov9s-320": {
|
|
72670
|
+
p50Ms: 1.8,
|
|
72671
|
+
fps: 556,
|
|
72672
|
+
measured: false
|
|
72673
|
+
},
|
|
72674
|
+
"yolov9s-640": {
|
|
72675
|
+
p50Ms: 5.46,
|
|
72676
|
+
fps: 183,
|
|
72677
|
+
measured: true
|
|
72678
|
+
},
|
|
72679
|
+
"yolov9m-320": {
|
|
72680
|
+
p50Ms: 3.79,
|
|
72681
|
+
fps: 264,
|
|
72682
|
+
measured: true
|
|
72683
|
+
},
|
|
72684
|
+
"yolov9m-640": {
|
|
72685
|
+
p50Ms: 10.34,
|
|
72686
|
+
fps: 97,
|
|
72687
|
+
measured: true
|
|
72688
|
+
}
|
|
72689
|
+
} }
|
|
72690
|
+
};
|
|
72691
|
+
var DETECTOR_ACCURACY = {
|
|
72692
|
+
"yolov9m-320": {
|
|
72693
|
+
personPrecision: .979,
|
|
72694
|
+
personRecall: .649
|
|
72695
|
+
},
|
|
72696
|
+
"yolov9m-320-int8": {
|
|
72697
|
+
personPrecision: .974,
|
|
72698
|
+
personRecall: .684
|
|
72699
|
+
},
|
|
72700
|
+
"yolov9m-640": {
|
|
72701
|
+
personPrecision: .976,
|
|
72702
|
+
personRecall: .854
|
|
72703
|
+
},
|
|
72704
|
+
"yolov9m-640-int8": {
|
|
72705
|
+
personPrecision: .976,
|
|
72706
|
+
personRecall: .847
|
|
72707
|
+
},
|
|
72708
|
+
"yolov9s-320": {
|
|
72709
|
+
personPrecision: .958,
|
|
72710
|
+
personRecall: .479
|
|
72711
|
+
},
|
|
72712
|
+
"yolov9s-320-int8": {
|
|
72713
|
+
personPrecision: .969,
|
|
72714
|
+
personRecall: .438
|
|
72715
|
+
},
|
|
72716
|
+
"yolov9s-640": {
|
|
72717
|
+
personPrecision: .986,
|
|
72718
|
+
personRecall: .753
|
|
72719
|
+
},
|
|
72720
|
+
"yolov9s-640-int8": {
|
|
72721
|
+
personPrecision: .963,
|
|
72722
|
+
personRecall: .823
|
|
72723
|
+
},
|
|
72724
|
+
"yolov9t-320": {
|
|
72725
|
+
personPrecision: .946,
|
|
72726
|
+
personRecall: .368
|
|
72727
|
+
},
|
|
72728
|
+
"yolov9t-320-int8": {
|
|
72729
|
+
personPrecision: .943,
|
|
72730
|
+
personRecall: .347
|
|
72731
|
+
},
|
|
72732
|
+
"yolov9t-640": {
|
|
72733
|
+
personPrecision: .979,
|
|
72734
|
+
personRecall: .646
|
|
72735
|
+
},
|
|
72736
|
+
"yolov9t-640-int8": {
|
|
72737
|
+
personPrecision: .979,
|
|
72738
|
+
personRecall: .646
|
|
72739
|
+
}
|
|
72740
|
+
};
|
|
72741
|
+
//#endregion
|
|
72742
|
+
//#region src/pipeline/best-settings/demand.ts
|
|
72743
|
+
var DEFAULT_DEMAND_OPTIONS = {
|
|
72744
|
+
onMotionConcurrency: .25,
|
|
72745
|
+
onMotionMinConcurrent: 2
|
|
72746
|
+
};
|
|
72747
|
+
/** A full observation window. */
|
|
72748
|
+
var OBSERVATION_WINDOW_MS = 1440 * 60 * 1e3;
|
|
72749
|
+
function deviceId(nodeId, deviceKey) {
|
|
72750
|
+
return `${nodeId}\u0000${deviceKey}`;
|
|
72751
|
+
}
|
|
72752
|
+
function charges(load) {
|
|
72753
|
+
return load.mode !== "disabled" && load.runsPipelineRoot && load.fps > 0;
|
|
72754
|
+
}
|
|
72755
|
+
/** The highest `count` rates, summed. */
|
|
72756
|
+
function topRatesSum(rates, count) {
|
|
72757
|
+
return rates.toSorted((a, b) => b - a).slice(0, Math.max(0, count)).reduce((sum, r) => sum + r, 0);
|
|
72758
|
+
}
|
|
72759
|
+
/** Concurrent on-motion sessions assumed cluster-wide without an observation. */
|
|
72760
|
+
function estimatedConcurrentSessions(cameraCount, options) {
|
|
72761
|
+
if (cameraCount <= 0) return 0;
|
|
72762
|
+
const share = Math.ceil(options.onMotionConcurrency * cameraCount);
|
|
72763
|
+
return Math.min(cameraCount, Math.max(share, Math.min(cameraCount, options.onMotionMinConcurrent)));
|
|
72764
|
+
}
|
|
72765
|
+
/**
|
|
72766
|
+
* Demand on every eligible device of the cluster.
|
|
72767
|
+
*/
|
|
72768
|
+
function estimateDeviceDemand(input) {
|
|
72769
|
+
const options = input.options ?? DEFAULT_DEMAND_OPTIONS;
|
|
72770
|
+
const eligibleById = new Map(input.eligible.map((d) => [deviceId(d.nodeId, d.deviceKey), d]));
|
|
72771
|
+
const peakById = new Map(input.peaks.map((p) => [deviceId(p.nodeId, p.deviceKey), p]));
|
|
72772
|
+
const weightByNode = /* @__PURE__ */ new Map();
|
|
72773
|
+
const eligibleCountByNode = /* @__PURE__ */ new Map();
|
|
72774
|
+
for (const d of input.eligible) {
|
|
72775
|
+
weightByNode.set(d.nodeId, (weightByNode.get(d.nodeId) ?? 0) + Math.max(d.weight, 0));
|
|
72776
|
+
eligibleCountByNode.set(d.nodeId, (eligibleCountByNode.get(d.nodeId) ?? 0) + 1);
|
|
72777
|
+
}
|
|
72778
|
+
const pinnedFps = /* @__PURE__ */ new Map();
|
|
72779
|
+
const alwaysOnFps = /* @__PURE__ */ new Map();
|
|
72780
|
+
const alwaysOnCount = /* @__PURE__ */ new Map();
|
|
72781
|
+
const maxFps = /* @__PURE__ */ new Map();
|
|
72782
|
+
const onMotionRates = [];
|
|
72783
|
+
const bump = (map, key, by) => {
|
|
72784
|
+
map.set(key, (map.get(key) ?? 0) + by);
|
|
72785
|
+
};
|
|
72786
|
+
const noteMax = (key, fps) => {
|
|
72787
|
+
maxFps.set(key, Math.max(maxFps.get(key) ?? 0, fps));
|
|
72788
|
+
};
|
|
72789
|
+
for (const cam of input.cameras) {
|
|
72790
|
+
if (!charges(cam)) continue;
|
|
72791
|
+
if (cam.devicePin !== null) {
|
|
72792
|
+
const key = deviceId(cam.devicePin.nodeId, cam.devicePin.deviceKey);
|
|
72793
|
+
if (!eligibleById.has(key)) continue;
|
|
72794
|
+
bump(pinnedFps, key, cam.fps);
|
|
72795
|
+
noteMax(key, cam.fps);
|
|
72796
|
+
continue;
|
|
72797
|
+
}
|
|
72798
|
+
if (cam.mode === "always-on" && cam.standingNodeId !== null) {
|
|
72799
|
+
const nodeWeight = weightByNode.get(cam.standingNodeId) ?? 0;
|
|
72800
|
+
for (const d of input.eligible) {
|
|
72801
|
+
if (d.nodeId !== cam.standingNodeId || nodeWeight <= 0) continue;
|
|
72802
|
+
const key = deviceId(d.nodeId, d.deviceKey);
|
|
72803
|
+
const share = Math.max(d.weight, 0) / nodeWeight;
|
|
72804
|
+
bump(alwaysOnFps, key, cam.fps * share);
|
|
72805
|
+
bump(alwaysOnCount, key, share);
|
|
72806
|
+
noteMax(key, cam.fps);
|
|
72807
|
+
}
|
|
72808
|
+
continue;
|
|
72809
|
+
}
|
|
72810
|
+
onMotionRates.push(cam.fps);
|
|
72811
|
+
}
|
|
72812
|
+
const fastestOnMotion = onMotionRates.reduce((m, r) => Math.max(m, r), 0);
|
|
72813
|
+
const nodeCount = weightByNode.size;
|
|
72814
|
+
const estimatedTotal = estimatedConcurrentSessions(onMotionRates.length, options);
|
|
72815
|
+
return input.eligible.map((d) => {
|
|
72816
|
+
const key = deviceId(d.nodeId, d.deviceKey);
|
|
72817
|
+
const peak = peakById.get(key) ?? (eligibleCountByNode.get(d.nodeId) === 1 ? peakById.get(deviceId(d.nodeId, "")) : void 0);
|
|
72818
|
+
const alwaysOn = alwaysOnCount.get(key) ?? 0;
|
|
72819
|
+
let onMotionSessions = 0;
|
|
72820
|
+
let onMotionSource = "none";
|
|
72821
|
+
if (onMotionRates.length > 0) if (peak !== void 0 && peak.observedForMs >= 864e5) {
|
|
72822
|
+
onMotionSessions = Math.max(0, Math.round(peak.peakSessions - alwaysOn));
|
|
72823
|
+
onMotionSource = "observed-24h";
|
|
72824
|
+
} else {
|
|
72825
|
+
const nodeWeight = weightByNode.get(d.nodeId) ?? 0;
|
|
72826
|
+
const share = nodeCount > 0 && nodeWeight > 0 ? Math.max(d.weight, 0) / nodeWeight / nodeCount : 0;
|
|
72827
|
+
onMotionSessions = Math.ceil(estimatedTotal * share);
|
|
72828
|
+
onMotionSource = "estimate";
|
|
72829
|
+
}
|
|
72830
|
+
const demandFps = (pinnedFps.get(key) ?? 0) + (alwaysOnFps.get(key) ?? 0) + topRatesSum(onMotionRates, onMotionSessions);
|
|
72831
|
+
return {
|
|
72832
|
+
nodeId: d.nodeId,
|
|
72833
|
+
deviceKey: d.deviceKey,
|
|
72834
|
+
demandFps: Math.round(demandFps * 100) / 100,
|
|
72835
|
+
maxCameraFps: Math.max(maxFps.get(key) ?? 0, fastestOnMotion),
|
|
72836
|
+
alwaysOnCameras: Math.round(alwaysOn * 100) / 100,
|
|
72837
|
+
onMotionSessions,
|
|
72838
|
+
onMotionSource,
|
|
72839
|
+
observedForMs: peak?.observedForMs ?? null
|
|
72840
|
+
};
|
|
72841
|
+
}).toSorted((a, b) => a.nodeId === b.nodeId ? a.deviceKey.localeCompare(b.deviceKey) : a.nodeId.localeCompare(b.nodeId));
|
|
72842
|
+
}
|
|
72843
|
+
//#endregion
|
|
72844
|
+
//#region src/pipeline/best-settings/recommend.ts
|
|
72845
|
+
/** The family the cluster runs. */
|
|
72846
|
+
var BEST_SETTINGS_FAMILY = "yolov9";
|
|
72847
|
+
/** Recall within this of the best counts as a tie — the faster one wins. */
|
|
72848
|
+
var RECALL_TIE = .02;
|
|
72849
|
+
/** Default share of an accelerator's throughput kept free. */
|
|
72850
|
+
var DEFAULT_HEADROOM = .4;
|
|
72851
|
+
function round(value, digits = 3) {
|
|
72852
|
+
const f = 10 ** digits;
|
|
72853
|
+
return Math.round(value * f) / f;
|
|
72854
|
+
}
|
|
72855
|
+
function utilisationOf(cell, demand) {
|
|
72856
|
+
return cell.fps > 0 ? round((demand?.demandFps ?? 0) / cell.fps) : Number.POSITIVE_INFINITY;
|
|
72857
|
+
}
|
|
72858
|
+
function fitsOn(cell, demand, headroom) {
|
|
72859
|
+
const budget = cell.fps * (1 - headroom);
|
|
72860
|
+
return budget >= (demand?.demandFps ?? 0) && budget >= (demand?.maxCameraFps ?? 0);
|
|
72861
|
+
}
|
|
72862
|
+
function candidatesFor(contexts, formatsByModel) {
|
|
72863
|
+
return Object.keys(DETECTOR_ACCURACY).filter((id) => id.startsWith(BEST_SETTINGS_FAMILY)).filter((id) => contexts.every((c) => c.column[id] !== void 0 && (formatsByModel[id] ?? []).includes(c.device.format))).map((id) => ({
|
|
72864
|
+
modelId: id,
|
|
72865
|
+
personRecall: DETECTOR_ACCURACY[id]?.personRecall ?? 0
|
|
72866
|
+
})).toSorted((a, b) => b.personRecall - a.personRecall || a.modelId.localeCompare(b.modelId));
|
|
72867
|
+
}
|
|
72868
|
+
function totalLatency(contexts, modelId) {
|
|
72869
|
+
return contexts.reduce((sum, c) => sum + (c.column[modelId]?.p50Ms ?? Number.POSITIVE_INFINITY), 0);
|
|
72870
|
+
}
|
|
72871
|
+
function worstUtilisation(contexts, modelId) {
|
|
72872
|
+
return contexts.reduce((worst, c) => {
|
|
72873
|
+
const cell = c.column[modelId];
|
|
72874
|
+
return Math.max(worst, cell ? utilisationOf(cell, c.demand) : Number.POSITIVE_INFINITY);
|
|
72875
|
+
}, 0);
|
|
72876
|
+
}
|
|
72877
|
+
/** One model for a group of devices that must agree (step 2–4 of the header). */
|
|
72878
|
+
function pickForGroup(contexts, formatsByModel, headroom) {
|
|
72879
|
+
const candidates = candidatesFor(contexts, formatsByModel);
|
|
72880
|
+
if (candidates.length === 0) return null;
|
|
72881
|
+
const fitting = candidates.filter((c) => contexts.every((ctx) => {
|
|
72882
|
+
const cell = ctx.column[c.modelId];
|
|
72883
|
+
return cell !== void 0 && fitsOn(cell, ctx.demand, headroom);
|
|
72884
|
+
}));
|
|
72885
|
+
if (fitting.length === 0) {
|
|
72886
|
+
const lightest = candidates.toSorted((a, b) => worstUtilisation(contexts, a.modelId) - worstUtilisation(contexts, b.modelId))[0];
|
|
72887
|
+
if (lightest === void 0) return null;
|
|
72888
|
+
return {
|
|
72889
|
+
modelId: lightest.modelId,
|
|
72890
|
+
reasons: [{
|
|
72891
|
+
kind: "no-fit-lightest",
|
|
72892
|
+
utilisation: worstUtilisation(contexts, lightest.modelId)
|
|
72893
|
+
}]
|
|
72894
|
+
};
|
|
72895
|
+
}
|
|
72896
|
+
const best = fitting[0];
|
|
72897
|
+
if (best === void 0) return null;
|
|
72898
|
+
const chosen = fitting.filter((c) => best.personRecall - c.personRecall <= .02).toSorted((a, b) => totalLatency(contexts, a.modelId) - totalLatency(contexts, b.modelId) || b.personRecall - a.personRecall)[0] ?? best;
|
|
72899
|
+
const reasons = [];
|
|
72900
|
+
const mostAccurate = candidates[0];
|
|
72901
|
+
if (mostAccurate !== void 0 && mostAccurate.modelId !== best.modelId) {
|
|
72902
|
+
const limitedBy = contexts.find((ctx) => {
|
|
72903
|
+
const cell = ctx.column[mostAccurate.modelId];
|
|
72904
|
+
return cell === void 0 || !fitsOn(cell, ctx.demand, headroom);
|
|
72905
|
+
})?.device.key ?? "";
|
|
72906
|
+
reasons.push({
|
|
72907
|
+
kind: "stepped-down",
|
|
72908
|
+
from: mostAccurate.modelId,
|
|
72909
|
+
to: best.modelId,
|
|
72910
|
+
limitedBy
|
|
72911
|
+
});
|
|
72912
|
+
}
|
|
72913
|
+
if (chosen.modelId !== best.modelId) reasons.push({
|
|
72914
|
+
kind: "tie-faster",
|
|
72915
|
+
over: best.modelId,
|
|
72916
|
+
recallDelta: round(best.personRecall - chosen.personRecall)
|
|
72917
|
+
});
|
|
72918
|
+
return {
|
|
72919
|
+
modelId: chosen.modelId,
|
|
72920
|
+
reasons
|
|
72921
|
+
};
|
|
72922
|
+
}
|
|
72923
|
+
function choiceOn(ctx, modelId) {
|
|
72924
|
+
const cell = ctx.column[modelId];
|
|
72925
|
+
if (cell === void 0) return null;
|
|
72926
|
+
return {
|
|
72927
|
+
modelId,
|
|
72928
|
+
p50Ms: cell.p50Ms,
|
|
72929
|
+
fps: cell.fps,
|
|
72930
|
+
measured: cell.measured,
|
|
72931
|
+
utilisation: utilisationOf(cell, ctx.demand),
|
|
72932
|
+
personRecall: DETECTOR_ACCURACY[modelId]?.personRecall ?? 0
|
|
72933
|
+
};
|
|
72934
|
+
}
|
|
72935
|
+
function deviceReasonsFor(ctx, choice) {
|
|
72936
|
+
const out = [{
|
|
72937
|
+
kind: "fits",
|
|
72938
|
+
utilisation: choice.utilisation
|
|
72939
|
+
}];
|
|
72940
|
+
if (!choice.measured) out.push({
|
|
72941
|
+
kind: "derived-latency",
|
|
72942
|
+
modelId: choice.modelId
|
|
72943
|
+
});
|
|
72944
|
+
if (ctx.demand?.onMotionSource === "estimate") out.push({
|
|
72945
|
+
kind: "estimated-load",
|
|
72946
|
+
observedForMs: ctx.demand.observedForMs
|
|
72947
|
+
});
|
|
72948
|
+
return out;
|
|
72949
|
+
}
|
|
72950
|
+
function skippedNode(node, reason, hardwareClass) {
|
|
72951
|
+
return {
|
|
72952
|
+
nodeId: node.nodeId,
|
|
72953
|
+
reachable: node.reachable,
|
|
72954
|
+
hardwareClass,
|
|
72955
|
+
cpuModel: node.hardware?.cpuModel ?? null,
|
|
72956
|
+
skipped: true,
|
|
72957
|
+
acceleratorModelId: null,
|
|
72958
|
+
devices: node.devices.map((d) => ({
|
|
72959
|
+
deviceKey: d.key,
|
|
72960
|
+
accelerator: node.hardware ? acceleratorKindOf(d.key, node.hardware) : null,
|
|
72961
|
+
enabled: d.enabled,
|
|
72962
|
+
available: d.available,
|
|
72963
|
+
demand: null,
|
|
72964
|
+
chosen: null,
|
|
72965
|
+
reasons: []
|
|
72966
|
+
})),
|
|
72967
|
+
reasons: [reason]
|
|
72968
|
+
};
|
|
72969
|
+
}
|
|
72970
|
+
/** Recommend one node. See the module header. */
|
|
72971
|
+
function recommendNode(input) {
|
|
72972
|
+
const { node } = input;
|
|
72973
|
+
const headroom = input.headroom ?? .4;
|
|
72974
|
+
const perf = input.perf ?? DETECTOR_PERF;
|
|
72975
|
+
if (!node.reachable) return skippedNode(node, { kind: "node-offline" }, null);
|
|
72976
|
+
if (node.hardware === null) return skippedNode(node, { kind: "no-hardware-facts" }, null);
|
|
72977
|
+
const hardware = node.hardware;
|
|
72978
|
+
const { hardwareClass, cpuModel } = classifyInferenceHardware(hardware);
|
|
72979
|
+
const classTable = perf[hardwareClass];
|
|
72980
|
+
if (hardwareClass === "unknown" || classTable === void 0) return skippedNode(node, {
|
|
72981
|
+
kind: "no-measured-data",
|
|
72982
|
+
hardwareClass
|
|
72983
|
+
}, hardwareClass);
|
|
72984
|
+
const demandByKey = new Map(input.demand.filter((d) => d.nodeId === node.nodeId).map((d) => [d.deviceKey, d]));
|
|
72985
|
+
const devices = node.devices.toSorted((a, b) => a.key.localeCompare(b.key));
|
|
72986
|
+
const contexts = /* @__PURE__ */ new Map();
|
|
72987
|
+
const early = /* @__PURE__ */ new Map();
|
|
72988
|
+
for (const device of devices) {
|
|
72989
|
+
const accelerator = acceleratorKindOf(device.key, hardware);
|
|
72990
|
+
if (accelerator === "coral") {
|
|
72991
|
+
early.set(device.key, device.enabled ? [{ kind: "coral-untouched" }] : []);
|
|
72992
|
+
continue;
|
|
72993
|
+
}
|
|
72994
|
+
if (!device.enabled) {
|
|
72995
|
+
early.set(device.key, [{ kind: "device-disabled" }]);
|
|
72996
|
+
continue;
|
|
72997
|
+
}
|
|
72998
|
+
if (!device.available) {
|
|
72999
|
+
early.set(device.key, [{ kind: "device-unavailable" }]);
|
|
73000
|
+
continue;
|
|
73001
|
+
}
|
|
73002
|
+
const column = accelerator === null ? void 0 : classTable[accelerator];
|
|
73003
|
+
if (accelerator === null || column === void 0) {
|
|
73004
|
+
early.set(device.key, [{
|
|
73005
|
+
kind: "no-family-build",
|
|
73006
|
+
format: device.format
|
|
73007
|
+
}]);
|
|
73008
|
+
continue;
|
|
73009
|
+
}
|
|
73010
|
+
contexts.set(device.key, {
|
|
73011
|
+
device,
|
|
73012
|
+
accelerator,
|
|
73013
|
+
column,
|
|
73014
|
+
demand: demandByKey.get(device.key) ?? null
|
|
73015
|
+
});
|
|
73016
|
+
}
|
|
73017
|
+
const isCpu = (a) => a === "x86-cpu" || a === "arm-cpu";
|
|
73018
|
+
const accelerators = [...contexts.values()].filter((c) => !isCpu(c.accelerator));
|
|
73019
|
+
const cpus = [...contexts.values()].filter((c) => isCpu(c.accelerator));
|
|
73020
|
+
const chosenByKey = /* @__PURE__ */ new Map();
|
|
73021
|
+
const reasonsByKey = /* @__PURE__ */ new Map();
|
|
73022
|
+
const nodeReasons = [];
|
|
73023
|
+
let acceleratorModelId = null;
|
|
73024
|
+
const groupPick = accelerators.length > 0 ? pickForGroup(accelerators, node.formatsByModel, headroom) : null;
|
|
73025
|
+
if (groupPick !== null) {
|
|
73026
|
+
acceleratorModelId = groupPick.modelId;
|
|
73027
|
+
nodeReasons.push(...groupPick.reasons);
|
|
73028
|
+
for (const ctx of accelerators) {
|
|
73029
|
+
const choice = choiceOn(ctx, groupPick.modelId);
|
|
73030
|
+
if (choice === null) continue;
|
|
73031
|
+
chosenByKey.set(ctx.device.key, choice);
|
|
73032
|
+
reasonsByKey.set(ctx.device.key, deviceReasonsFor(ctx, choice));
|
|
73033
|
+
}
|
|
73034
|
+
} else for (const ctx of accelerators) reasonsByKey.set(ctx.device.key, [{
|
|
73035
|
+
kind: "no-family-build",
|
|
73036
|
+
format: ctx.device.format
|
|
73037
|
+
}]);
|
|
73038
|
+
for (const ctx of cpus) {
|
|
73039
|
+
const pick = pickForGroup([ctx], node.formatsByModel, headroom);
|
|
73040
|
+
const choice = pick === null ? null : choiceOn(ctx, pick.modelId);
|
|
73041
|
+
if (pick === null || choice === null) {
|
|
73042
|
+
reasonsByKey.set(ctx.device.key, [{
|
|
73043
|
+
kind: "no-family-build",
|
|
73044
|
+
format: ctx.device.format
|
|
73045
|
+
}]);
|
|
73046
|
+
continue;
|
|
73047
|
+
}
|
|
73048
|
+
chosenByKey.set(ctx.device.key, choice);
|
|
73049
|
+
reasonsByKey.set(ctx.device.key, [
|
|
73050
|
+
{ kind: "cpu-device" },
|
|
73051
|
+
...pick.reasons,
|
|
73052
|
+
...deviceReasonsFor(ctx, choice)
|
|
73053
|
+
]);
|
|
73054
|
+
}
|
|
73055
|
+
return {
|
|
73056
|
+
nodeId: node.nodeId,
|
|
73057
|
+
reachable: true,
|
|
73058
|
+
hardwareClass,
|
|
73059
|
+
cpuModel,
|
|
73060
|
+
skipped: chosenByKey.size === 0,
|
|
73061
|
+
acceleratorModelId,
|
|
73062
|
+
devices: devices.map((device) => ({
|
|
73063
|
+
deviceKey: device.key,
|
|
73064
|
+
accelerator: acceleratorKindOf(device.key, hardware),
|
|
73065
|
+
enabled: device.enabled,
|
|
73066
|
+
available: device.available,
|
|
73067
|
+
demand: demandByKey.get(device.key) ?? null,
|
|
73068
|
+
chosen: chosenByKey.get(device.key) ?? null,
|
|
73069
|
+
reasons: early.get(device.key) ?? reasonsByKey.get(device.key) ?? []
|
|
73070
|
+
})),
|
|
73071
|
+
reasons: nodeReasons
|
|
73072
|
+
};
|
|
73073
|
+
}
|
|
71972
73074
|
//#endregion
|
|
71973
73075
|
//#region src/pipeline/root-face-crop.ts
|
|
71974
73076
|
/** Side of the square, as a multiple of the face box's longer side. */
|
|
@@ -74114,6 +75216,7 @@ exports.AUDIO_PRESETS = require_composition.AUDIO_PRESETS;
|
|
|
74114
75216
|
exports.AUDIO_SCALE_EPOCH_ISO = AUDIO_SCALE_EPOCH_ISO;
|
|
74115
75217
|
exports.AUDIO_SCALE_EPOCH_MS = AUDIO_SCALE_EPOCH_MS;
|
|
74116
75218
|
exports.AUTOMATIC_HUB_ADDRESS_FLAGS = AUTOMATIC_HUB_ADDRESS_FLAGS;
|
|
75219
|
+
exports.AcceleratorKindSchema = AcceleratorKindSchema;
|
|
74117
75220
|
exports.AccessoriesStatusSchema = AccessoriesStatusSchema;
|
|
74118
75221
|
exports.AccessoryKind = AccessoryKind;
|
|
74119
75222
|
exports.AddBrokerInputSchema = AddBrokerInputSchema;
|
|
@@ -74192,6 +75295,7 @@ exports.BASE_DEVICE_CAPS = BASE_DEVICE_CAPS;
|
|
|
74192
75295
|
exports.BASE_LIVE_EGRESS_PROFILE = BASE_LIVE_EGRESS_PROFILE;
|
|
74193
75296
|
exports.BATTERY_DEVICE_PROFILE = BATTERY_DEVICE_PROFILE;
|
|
74194
75297
|
exports.BATTERY_UNREACHABLE_AFTER_MS = BATTERY_UNREACHABLE_AFTER_MS;
|
|
75298
|
+
exports.BEST_SETTINGS_FAMILY = BEST_SETTINGS_FAMILY;
|
|
74195
75299
|
exports.BIRTH_DECISION_DEFAULT_LIMIT = BIRTH_DECISION_DEFAULT_LIMIT;
|
|
74196
75300
|
exports.BOOT_RECOVERY_BACKOFF_MS = require_sleep.BOOT_RECOVERY_BACKOFF_MS;
|
|
74197
75301
|
exports.BUILTIN_RESULT_KINDS = BUILTIN_RESULT_KINDS;
|
|
@@ -74207,6 +75311,12 @@ exports.BaseAddon = require_sleep.BaseAddon;
|
|
|
74207
75311
|
exports.BaseDevice = BaseDevice;
|
|
74208
75312
|
exports.BaseDeviceProvider = BaseDeviceProvider;
|
|
74209
75313
|
exports.BatteryStatusSchema = BatteryStatusSchema;
|
|
75314
|
+
exports.BestSettingsApplyInputSchema = BestSettingsApplyInputSchema;
|
|
75315
|
+
exports.BestSettingsApplyResultSchema = BestSettingsApplyResultSchema;
|
|
75316
|
+
exports.BestSettingsOptionsSchema = BestSettingsOptionsSchema;
|
|
75317
|
+
exports.BestSettingsPhaseResultSchema = BestSettingsPhaseResultSchema;
|
|
75318
|
+
exports.BestSettingsPlanSchema = BestSettingsPlanSchema;
|
|
75319
|
+
exports.BestSettingsWarningSchema = BestSettingsWarningSchema;
|
|
74210
75320
|
exports.BinaryStatusSchema = BinaryStatusSchema;
|
|
74211
75321
|
exports.BirthDecisionQueryInputSchema = BirthDecisionQueryInputSchema;
|
|
74212
75322
|
exports.BirthDecisionRecordSchema = BirthDecisionRecordSchema;
|
|
@@ -74309,6 +75419,7 @@ exports.CameraMetricsSchema = CameraMetricsSchema;
|
|
|
74309
75419
|
exports.CameraMetricsWithDeviceIdSchema = CameraMetricsWithDeviceIdSchema;
|
|
74310
75420
|
exports.CameraMotionStatusSchema = CameraMotionStatusSchema;
|
|
74311
75421
|
exports.CameraOccupancySnapshotForDeviceSchema = CameraOccupancySnapshotForDeviceSchema;
|
|
75422
|
+
exports.CameraOverrideClearSchema = CameraOverrideClearSchema;
|
|
74312
75423
|
exports.CameraOwnMotionSchema = CameraOwnMotionSchema;
|
|
74313
75424
|
exports.CameraRawLevelSchema = CameraRawLevelSchema;
|
|
74314
75425
|
exports.CameraRecordingModeSchema = CameraRecordingModeSchema;
|
|
@@ -74466,11 +75577,13 @@ exports.DEFAULT_CLUSTER_STEP_MODELS = DEFAULT_CLUSTER_STEP_MODELS;
|
|
|
74466
75577
|
exports.DEFAULT_CLUSTER_STEP_SETTINGS = DEFAULT_CLUSTER_STEP_SETTINGS;
|
|
74467
75578
|
exports.DEFAULT_CORE_BLOCK_ENTRY = DEFAULT_CORE_BLOCK_ENTRY;
|
|
74468
75579
|
exports.DEFAULT_DECODER_HWACCEL_CONFIG = DEFAULT_DECODER_HWACCEL_CONFIG;
|
|
75580
|
+
exports.DEFAULT_DEMAND_OPTIONS = DEFAULT_DEMAND_OPTIONS;
|
|
74469
75581
|
exports.DEFAULT_DETAIL_CROP_CONVENTION = DEFAULT_DETAIL_CROP_CONVENTION;
|
|
74470
75582
|
exports.DEFAULT_EVENTS_BAND_BUFFER_SEC = DEFAULT_EVENTS_BAND_BUFFER_SEC;
|
|
74471
75583
|
exports.DEFAULT_EVENT_COLOR = DEFAULT_EVENT_COLOR;
|
|
74472
75584
|
exports.DEFAULT_FEATURES = DEFAULT_FEATURES;
|
|
74473
75585
|
exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = require_composition.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
|
|
75586
|
+
exports.DEFAULT_HEADROOM = DEFAULT_HEADROOM;
|
|
74474
75587
|
exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
|
|
74475
75588
|
exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
|
|
74476
75589
|
exports.DEFAULT_OVERLAY_LAYERS = DEFAULT_OVERLAY_LAYERS;
|
|
@@ -74487,6 +75600,8 @@ exports.DETAIL_CROP_SECTION_ID = DETAIL_CROP_SECTION_ID;
|
|
|
74487
75600
|
exports.DETAIL_CROP_SQUARE_KEY = DETAIL_CROP_SQUARE_KEY;
|
|
74488
75601
|
exports.DETECTION_MACRO_CLASSES = DETECTION_MACRO_CLASSES;
|
|
74489
75602
|
exports.DETECTION_PIPELINE_CAP_NAME = DETECTION_PIPELINE_CAP_NAME;
|
|
75603
|
+
exports.DETECTOR_ACCURACY = DETECTOR_ACCURACY;
|
|
75604
|
+
exports.DETECTOR_PERF = DETECTOR_PERF;
|
|
74490
75605
|
exports.DEVICE_BACKEND_TO_FORMAT = DEVICE_BACKEND_TO_FORMAT;
|
|
74491
75606
|
exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
|
|
74492
75607
|
exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
|
|
@@ -74524,16 +75639,20 @@ exports.DetailCropConventionSchema = DetailCropConventionSchema;
|
|
|
74524
75639
|
exports.DetectionCatalogClassMapSchema = DetectionCatalogClassMapSchema;
|
|
74525
75640
|
exports.DetectionSourceSchema = DetectionSourceSchema;
|
|
74526
75641
|
exports.DetectionSourcesSchema = DetectionSourcesSchema;
|
|
75642
|
+
exports.DetectorStoreClearSchema = DetectorStoreClearSchema;
|
|
74527
75643
|
exports.DeviceAdminLinkSchema = DeviceAdminLinkSchema;
|
|
74528
75644
|
exports.DeviceCodeSeveritySchema = DeviceCodeSeveritySchema;
|
|
74529
75645
|
exports.DeviceConfig = DeviceConfig;
|
|
75646
|
+
exports.DeviceDemandSchema = DeviceDemandSchema;
|
|
74530
75647
|
exports.DeviceDiscoveryStatusSchema = DeviceDiscoveryStatusSchema;
|
|
74531
75648
|
exports.DeviceExportExposeInputSchema = ExposeInputSchema;
|
|
74532
75649
|
exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
|
|
74533
75650
|
exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
|
|
74534
75651
|
exports.DeviceFeature = require_err_msg.DeviceFeature;
|
|
74535
75652
|
exports.DeviceInfoSchema = DeviceInfoSchema;
|
|
75653
|
+
exports.DeviceModelChoiceSchema = DeviceModelChoiceSchema;
|
|
74536
75654
|
exports.DeviceNetworkStatsSchema = DeviceNetworkStatsSchema;
|
|
75655
|
+
exports.DeviceRecommendationSchema = DeviceRecommendationSchema;
|
|
74537
75656
|
exports.DeviceRestoreRetryScheduler = DeviceRestoreRetryScheduler;
|
|
74538
75657
|
exports.DeviceRole = require_err_msg.DeviceRole;
|
|
74539
75658
|
exports.DeviceRuntimeState = DeviceRuntimeState;
|
|
@@ -74686,6 +75805,7 @@ exports.HOURS_PER_DAY = HOURS_PER_DAY;
|
|
|
74686
75805
|
exports.HUB_ADDRESS_ROLES = HUB_ADDRESS_ROLES;
|
|
74687
75806
|
exports.HUB_VIEWER_MOUNT = HUB_VIEWER_MOUNT;
|
|
74688
75807
|
exports.HWACCEL_OPTIONS = HWACCEL_OPTIONS;
|
|
75808
|
+
exports.HardwareClassIdSchema = HardwareClassIdSchema;
|
|
74689
75809
|
exports.HealthStatusSchema = HealthStatusSchema;
|
|
74690
75810
|
exports.HfModelResolutionSchema = HfModelResolutionSchema;
|
|
74691
75811
|
exports.HistoryPointSchema = HistoryPointSchema;
|
|
@@ -74868,8 +75988,11 @@ exports.ModelDistributeInputSchema = ModelDistributeInputSchema;
|
|
|
74868
75988
|
exports.ModelDistributeResultSchema = ModelDistributeResultSchema;
|
|
74869
75989
|
exports.ModelExtraFileSchema = ModelExtraFileSchema;
|
|
74870
75990
|
exports.ModelFormatEntrySchema = ModelFormatEntrySchema;
|
|
75991
|
+
exports.ModelFormatPrecisionSchema = ModelFormatPrecisionSchema;
|
|
74871
75992
|
exports.ModelFormatsSchema = ModelFormatsSchema;
|
|
74872
75993
|
exports.ModelLicenseSchema = ModelLicenseSchema;
|
|
75994
|
+
exports.ModelOnDiskStateSchema = ModelOnDiskStateSchema;
|
|
75995
|
+
exports.ModelPinChangeSchema = ModelPinChangeSchema;
|
|
74873
75996
|
exports.ModelProviderIdSchema = ModelProviderIdSchema;
|
|
74874
75997
|
exports.ModelSubstitutionSchema = ModelSubstitutionSchema;
|
|
74875
75998
|
exports.ModelVariantGroupSchema = ModelVariantGroupSchema;
|
|
@@ -75106,14 +76229,17 @@ exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
|
|
|
75106
76229
|
exports.NetworkAddressSchema = NetworkAddressSchema;
|
|
75107
76230
|
exports.NetworkEndpointSchema = NetworkEndpointSchema;
|
|
75108
76231
|
exports.NetworkLinkStatusSchema = NetworkLinkStatusSchema;
|
|
76232
|
+
exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
|
|
75109
76233
|
exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
|
|
75110
76234
|
exports.NodeDirectorySchema = NodeDirectorySchema;
|
|
76235
|
+
exports.NodeRecommendationSchema = NodeRecommendationSchema;
|
|
75111
76236
|
exports.NotificationActionIconSchema = NotificationActionIconSchema;
|
|
75112
76237
|
exports.NotificationActionSchema = NotificationActionSchema;
|
|
75113
76238
|
exports.NotificationFormatSchema = NotificationFormatSchema;
|
|
75114
76239
|
exports.NotificationSchema = NotificationSchema;
|
|
75115
76240
|
exports.NotifierStatusSchema = NotifierStatusSchema;
|
|
75116
76241
|
exports.NumericSensorStatusSchema = NumericSensorStatusSchema;
|
|
76242
|
+
exports.OBSERVATION_WINDOW_MS = OBSERVATION_WINDOW_MS;
|
|
75117
76243
|
exports.OPERATOR_WRITTEN_STALE_MS = OPERATOR_WRITTEN_STALE_MS;
|
|
75118
76244
|
exports.OPS_LOG_DEFAULT_LIMIT = OPS_LOG_DEFAULT_LIMIT;
|
|
75119
76245
|
exports.OPS_LOG_RING_DEFAULT_MAX = OPS_LOG_RING_DEFAULT_MAX;
|
|
@@ -75187,6 +76313,7 @@ exports.PickedCamStreamSchema = PickedCamStreamSchema;
|
|
|
75187
76313
|
exports.PipelineAssignmentSchema = PipelineAssignmentSchema;
|
|
75188
76314
|
exports.PipelineDefaultStepSchema = PipelineDefaultStepSchema;
|
|
75189
76315
|
exports.PipelineEngineChoiceSchema = PipelineEngineChoiceSchema;
|
|
76316
|
+
exports.PipelineModelFormatStatusSchema = PipelineModelFormatStatusSchema;
|
|
75190
76317
|
exports.PipelineRunResultBridge = PipelineRunResultBridge;
|
|
75191
76318
|
exports.PipelineStepInputSchema = PipelineStepInputSchema;
|
|
75192
76319
|
exports.PipelineValidationIssueSchema = PipelineValidationIssueSchema;
|
|
@@ -75226,6 +76353,7 @@ exports.RATE_CONTROL_TIGHT = RATE_CONTROL_TIGHT;
|
|
|
75226
76353
|
exports.REACHABILITY_FAILURES_TO_OFFLINE = REACHABILITY_FAILURES_TO_OFFLINE;
|
|
75227
76354
|
exports.REACHABILITY_POLL_INTERVAL_MS = REACHABILITY_POLL_INTERVAL_MS;
|
|
75228
76355
|
exports.REACHABILITY_PROBE_TIMEOUT_MS = REACHABILITY_PROBE_TIMEOUT_MS;
|
|
76356
|
+
exports.RECALL_TIE = RECALL_TIE;
|
|
75229
76357
|
exports.RECOGNITION_TYPES = RECOGNITION_TYPES;
|
|
75230
76358
|
exports.RECORDING_AUDIO_TRIGGER_OFFERED_DBFS = RECORDING_AUDIO_TRIGGER_OFFERED_DBFS;
|
|
75231
76359
|
exports.RECORDING_EXPORT_MAX_READ_BYTES = RECORDING_EXPORT_MAX_READ_BYTES;
|
|
@@ -75258,6 +76386,7 @@ exports.ReadinessTimeoutError = require_sleep.ReadinessTimeoutError;
|
|
|
75258
76386
|
exports.RebuildObjectEmbeddingsRefusalSchema = RebuildObjectEmbeddingsRefusalSchema;
|
|
75259
76387
|
exports.RecentTracksPageSchema = RecentTracksPageSchema;
|
|
75260
76388
|
exports.RecentTracksQueryInput = RecentTracksQueryInput;
|
|
76389
|
+
exports.RecommendationReasonSchema = RecommendationReasonSchema;
|
|
75261
76390
|
exports.RecordTriggerSchema = RecordTriggerSchema;
|
|
75262
76391
|
exports.RecordWindowSchema = RecordWindowSchema;
|
|
75263
76392
|
exports.RecordingAvailabilityForDeviceSchema = RecordingAvailabilityForDeviceSchema;
|
|
@@ -75613,6 +76742,7 @@ exports.ZoneRulesArraySchema = ZoneRulesArraySchema;
|
|
|
75613
76742
|
exports.ZoneSchema = ZoneSchema;
|
|
75614
76743
|
exports.ZoneScopeBreakdownSchema = ZoneScopeBreakdownSchema;
|
|
75615
76744
|
exports.__resetLogChannelRegistryForTests = __resetLogChannelRegistryForTests;
|
|
76745
|
+
exports.acceleratorKindOf = acceleratorKindOf;
|
|
75616
76746
|
exports.accessoriesCapability = accessoriesCapability;
|
|
75617
76747
|
exports.accessoryStableId = accessoryStableId;
|
|
75618
76748
|
exports.actionsForBoundCaps = actionsForBoundCaps;
|
|
@@ -75704,6 +76834,7 @@ exports.carbonMonoxideCapability = carbonMonoxideCapability;
|
|
|
75704
76834
|
exports.cellsToRects = cellsToRects;
|
|
75705
76835
|
exports.checkRoleAddress = checkRoleAddress;
|
|
75706
76836
|
exports.classifyBearerPrincipal = classifyBearerPrincipal;
|
|
76837
|
+
exports.classifyInferenceHardware = classifyInferenceHardware;
|
|
75707
76838
|
exports.classifyStream = classifyStream;
|
|
75708
76839
|
exports.classifyStreams = classifyStreams;
|
|
75709
76840
|
exports.clearModelBoundOverrides = clearModelBoundOverrides;
|
|
@@ -75720,6 +76851,7 @@ exports.clusterStepSettingKey = clusterStepSettingKey;
|
|
|
75720
76851
|
exports.codecIsAccepted = codecIsAccepted;
|
|
75721
76852
|
exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
|
|
75722
76853
|
exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
|
|
76854
|
+
exports.collectModelBoundKeys = collectModelBoundKeys;
|
|
75723
76855
|
exports.collectSecretConfigKeys = collectSecretConfigKeys;
|
|
75724
76856
|
exports.colorCapability = colorCapability;
|
|
75725
76857
|
exports.colorForKind = colorForKind;
|
|
@@ -75851,6 +76983,8 @@ exports.enumerateInferenceDevices = enumerateInferenceDevices;
|
|
|
75851
76983
|
exports.enumerateItemArrayFields = enumerateItemArrayFields;
|
|
75852
76984
|
exports.enumerateSchemaFields = enumerateSchemaFields;
|
|
75853
76985
|
exports.errMsg = require_err_msg.errMsg;
|
|
76986
|
+
exports.estimateDeviceDemand = estimateDeviceDemand;
|
|
76987
|
+
exports.estimatedConcurrentSessions = estimatedConcurrentSessions;
|
|
75854
76988
|
exports.evaluateAst = require_composition.evaluateAst;
|
|
75855
76989
|
exports.evaluateCompositionField = evaluateCompositionField;
|
|
75856
76990
|
exports.evaluateCount = require_composition.evaluateCount;
|
|
@@ -76133,6 +77267,7 @@ exports.readTimelapseGeneratedAt = readTimelapseGeneratedAt;
|
|
|
76133
77267
|
exports.readUseRootModel = readUseRootModel;
|
|
76134
77268
|
exports.readinessKey = require_sleep.readinessKey;
|
|
76135
77269
|
exports.rebootCapability = rebootCapability;
|
|
77270
|
+
exports.recommendNode = recommendNode;
|
|
76136
77271
|
exports.reconcileBlockDevices = reconcileBlockDevices;
|
|
76137
77272
|
exports.recordingArchiveCapability = recordingArchiveCapability;
|
|
76138
77273
|
exports.recordingCapability = recordingCapability;
|