@camstack/types 1.2.315 → 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 +1186 -48
- package/dist/index.mjs +1154 -49
- 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
|
@@ -5718,16 +5718,53 @@ var ModelFormatEntrySchema = zod.z.object({
|
|
|
5718
5718
|
/** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
|
|
5719
5719
|
runtimes: zod.z.array(zod.z.enum(["python"])).readonly().optional(),
|
|
5720
5720
|
/**
|
|
5721
|
-
* Content revision of the
|
|
5722
|
-
*
|
|
5723
|
-
*
|
|
5721
|
+
* Content revision of the artefact, for one hosted OFF the CamStack mirror.
|
|
5722
|
+
* A format on the mirror leaves it unset: its revision (the sha256 of its
|
|
5723
|
+
* weight file) comes from the downloader's generated table, kept in step
|
|
5724
|
+
* with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
|
|
5725
|
+
* node records the revision it downloaded next to the file
|
|
5724
5726
|
* (`<file>.revision`); a copy with no record or a different one is stale
|
|
5725
|
-
*
|
|
5726
|
-
*
|
|
5727
|
+
* unless its weight file hashes to the revision, and a stale copy is
|
|
5728
|
+
* downloaded again, the old one serving until the new one is complete. No
|
|
5729
|
+
* revision at all ⇒ a file on disk is current, whatever it holds (D743).
|
|
5727
5730
|
*/
|
|
5728
5731
|
revision: zod.z.string().min(1).optional()
|
|
5729
5732
|
});
|
|
5730
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
|
+
/**
|
|
5731
5768
|
* Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
|
|
5732
5769
|
* The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
|
|
5733
5770
|
*/
|
|
@@ -26542,7 +26579,7 @@ var FrameRefSchema = zod.z.object({
|
|
|
26542
26579
|
timestamp: zod.z.number(),
|
|
26543
26580
|
capturedAt: zod.z.number().optional()
|
|
26544
26581
|
});
|
|
26545
|
-
var ModelFormatSchema$
|
|
26582
|
+
var ModelFormatSchema$2 = zod.z.enum([
|
|
26546
26583
|
"onnx",
|
|
26547
26584
|
"coreml",
|
|
26548
26585
|
"openvino",
|
|
@@ -26560,7 +26597,7 @@ var PipelineSlotSchema = zod.z.enum([
|
|
|
26560
26597
|
var PipelineEngineChoiceSchema = zod.z.object({
|
|
26561
26598
|
runtime: zod.z.literal("python"),
|
|
26562
26599
|
backend: zod.z.string(),
|
|
26563
|
-
format: ModelFormatSchema$
|
|
26600
|
+
format: ModelFormatSchema$2,
|
|
26564
26601
|
device: zod.z.string().optional()
|
|
26565
26602
|
});
|
|
26566
26603
|
/**
|
|
@@ -26618,10 +26655,7 @@ var PipelineTemplateSchema$1 = zod.z.object({
|
|
|
26618
26655
|
var PipelineModelOptionSchema = zod.z.object({
|
|
26619
26656
|
id: zod.z.string(),
|
|
26620
26657
|
name: zod.z.string(),
|
|
26621
|
-
formats: zod.z.record(zod.z.string(),
|
|
26622
|
-
downloaded: zod.z.boolean(),
|
|
26623
|
-
sizeMB: zod.z.number()
|
|
26624
|
-
})),
|
|
26658
|
+
formats: zod.z.record(zod.z.string(), PipelineModelFormatStatusSchema),
|
|
26625
26659
|
group: ModelVariantGroupSchema.optional(),
|
|
26626
26660
|
legacy: zod.z.boolean().optional(),
|
|
26627
26661
|
provider: ModelProviderIdSchema.optional(),
|
|
@@ -26836,6 +26870,32 @@ var pipelineExecutorCapability = {
|
|
|
26836
26870
|
auth: "admin"
|
|
26837
26871
|
}),
|
|
26838
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
|
+
/**
|
|
26839
26899
|
* Which of THIS node's inference devices the executor currently refuses,
|
|
26840
26900
|
* and why. `nodeId` is the ROUTING key (stripped by the generated router).
|
|
26841
26901
|
*
|
|
@@ -26930,12 +26990,12 @@ var pipelineExecutorCapability = {
|
|
|
26930
26990
|
downloadModel: require_sleep.method(zod.z.object({
|
|
26931
26991
|
addonId: zod.z.string(),
|
|
26932
26992
|
modelId: zod.z.string(),
|
|
26933
|
-
format: ModelFormatSchema$
|
|
26993
|
+
format: ModelFormatSchema$2
|
|
26934
26994
|
}), DownloadModelResultSchema, { kind: "mutation" }),
|
|
26935
26995
|
deleteModel: require_sleep.method(zod.z.object({
|
|
26936
26996
|
addonId: zod.z.string(),
|
|
26937
26997
|
modelId: zod.z.string(),
|
|
26938
|
-
format: ModelFormatSchema$
|
|
26998
|
+
format: ModelFormatSchema$2
|
|
26939
26999
|
}), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation" }),
|
|
26940
27000
|
/**
|
|
26941
27001
|
* Stateless single-frame execution. Callers (runner, benchmark) pass
|
|
@@ -27182,6 +27242,206 @@ var pipelineExecutorCapability = {
|
|
|
27182
27242
|
}
|
|
27183
27243
|
};
|
|
27184
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
|
|
27185
27445
|
//#region src/capabilities/schemas/orchestrator-metrics.ts
|
|
27186
27446
|
/** Shared Zod schemas for the runtime pipeline orchestrator metrics. */
|
|
27187
27447
|
var OrchestratorMetricsSchema = zod.z.object({
|
|
@@ -29619,6 +29879,27 @@ var pipelineOrchestratorCapability = {
|
|
|
29619
29879
|
kind: "mutation",
|
|
29620
29880
|
auth: "admin"
|
|
29621
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
|
+
}),
|
|
29622
29903
|
/** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
|
|
29623
29904
|
getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
|
|
29624
29905
|
/** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
|
|
@@ -55701,6 +55982,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
55701
55982
|
addonId: null,
|
|
55702
55983
|
access: "delete"
|
|
55703
55984
|
},
|
|
55985
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": {
|
|
55986
|
+
capName: "pipeline-executor",
|
|
55987
|
+
capScope: "system",
|
|
55988
|
+
addonId: null,
|
|
55989
|
+
access: "delete"
|
|
55990
|
+
},
|
|
55704
55991
|
"pipelineExecutor.deleteModel": {
|
|
55705
55992
|
capName: "pipeline-executor",
|
|
55706
55993
|
capScope: "system",
|
|
@@ -55917,6 +56204,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
55917
56204
|
addonId: null,
|
|
55918
56205
|
access: "view"
|
|
55919
56206
|
},
|
|
56207
|
+
"pipelineOrchestrator.applyBestSettings": {
|
|
56208
|
+
capName: "pipeline-orchestrator",
|
|
56209
|
+
capScope: "system",
|
|
56210
|
+
addonId: null,
|
|
56211
|
+
access: "create"
|
|
56212
|
+
},
|
|
55920
56213
|
"pipelineOrchestrator.applyDeviceSettingsPatch": {
|
|
55921
56214
|
capName: "pipeline-orchestrator",
|
|
55922
56215
|
capScope: "system",
|
|
@@ -56091,6 +56384,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
56091
56384
|
addonId: null,
|
|
56092
56385
|
access: "create"
|
|
56093
56386
|
},
|
|
56387
|
+
"pipelineOrchestrator.planBestSettings": {
|
|
56388
|
+
capName: "pipeline-orchestrator",
|
|
56389
|
+
capScope: "system",
|
|
56390
|
+
addonId: null,
|
|
56391
|
+
access: "view"
|
|
56392
|
+
},
|
|
56094
56393
|
"pipelineOrchestrator.rebalance": {
|
|
56095
56394
|
capName: "pipeline-orchestrator",
|
|
56096
56395
|
capScope: "system",
|
|
@@ -64865,6 +65164,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
|
|
|
64865
65164
|
form: "single",
|
|
64866
65165
|
optional: false
|
|
64867
65166
|
}],
|
|
65167
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": [{
|
|
65168
|
+
name: "deviceIds",
|
|
65169
|
+
form: "array",
|
|
65170
|
+
optional: true
|
|
65171
|
+
}],
|
|
64868
65172
|
"pipelineExecutor.runPipeline": [{
|
|
64869
65173
|
name: "deviceId",
|
|
64870
65174
|
form: "single",
|
|
@@ -65932,6 +66236,7 @@ var SYSTEM_SCOPE_DEVICE_METHODS = [
|
|
|
65932
66236
|
"osdManager.previewSlot",
|
|
65933
66237
|
"osdManager.renderDevice",
|
|
65934
66238
|
"osdManager.setSlotBinding",
|
|
66239
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides",
|
|
65935
66240
|
"pipelineExecutor.runPipeline",
|
|
65936
66241
|
"pipelineExecutor.runPipelineBatch",
|
|
65937
66242
|
"pipelineOrchestrator.applyDeviceSettingsPatch",
|
|
@@ -66916,6 +67221,7 @@ function createSystemProxy(api) {
|
|
|
66916
67221
|
getVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "getVideoPipelineSteps", "query", input),
|
|
66917
67222
|
setVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "setVideoPipelineSteps", "mutation", input),
|
|
66918
67223
|
clearDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearDeviceOverrides", "mutation", input),
|
|
67224
|
+
clearModelBoundDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearModelBoundDeviceOverrides", "mutation", input),
|
|
66919
67225
|
getInferenceDeviceHealth: (input) => dispatch("pipelineExecutor", "getInferenceDeviceHealth", "query", input),
|
|
66920
67226
|
rearmInferenceDevice: (input) => dispatch("pipelineExecutor", "rearmInferenceDevice", "mutation", input),
|
|
66921
67227
|
getSchema: (input) => dispatch("pipelineExecutor", "getSchema", "query", input),
|
|
@@ -66971,6 +67277,8 @@ function createSystemProxy(api) {
|
|
|
66971
67277
|
setAgentInferenceDevices: (input) => dispatch("pipelineOrchestrator", "setAgentInferenceDevices", "mutation", input),
|
|
66972
67278
|
getNodeInferenceDevices: (input) => dispatch("pipelineOrchestrator", "getNodeInferenceDevices", "query", input),
|
|
66973
67279
|
resetNodePipelineDefaults: (input) => dispatch("pipelineOrchestrator", "resetNodePipelineDefaults", "mutation", input),
|
|
67280
|
+
planBestSettings: (input) => dispatch("pipelineOrchestrator", "planBestSettings", "query", input),
|
|
67281
|
+
applyBestSettings: (input) => dispatch("pipelineOrchestrator", "applyBestSettings", "mutation", input),
|
|
66974
67282
|
getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
|
|
66975
67283
|
setCameraSensors: (input) => dispatch("pipelineOrchestrator", "setCameraSensors", "mutation", input),
|
|
66976
67284
|
reconcileFromDisk: (input) => dispatch("pipelineOrchestrator", "reconcileFromDisk", "mutation", input),
|
|
@@ -71843,41 +72151,6 @@ function isRemovedModelId(stepId, modelId) {
|
|
|
71843
72151
|
}
|
|
71844
72152
|
//#endregion
|
|
71845
72153
|
//#region src/pipeline/model-bound-settings.ts
|
|
71846
|
-
/**
|
|
71847
|
-
* Model-bound step settings (D738): an operator value that is only meaningful
|
|
71848
|
-
* for ONE model, stored together with that model's id.
|
|
71849
|
-
*
|
|
71850
|
-
* The per-class confidence floors are the case it exists for. A score is a
|
|
71851
|
-
* property of one detector's output scale — on this hub the median score of a
|
|
71852
|
-
* correct person was 0.78 on `yolov9m-320-int8`, 0.68 on `yolo26s-320-int8`,
|
|
71853
|
-
* 0.40 on `yolo26n-320-int8` and 0.89 on `yolo26s` (640) — so a floor tuned on
|
|
71854
|
-
* one model is wrong on the next. The DEFAULT of such a field belongs to the
|
|
71855
|
-
* model (the catalog entry); an operator OVERRIDE belongs to the model it was
|
|
71856
|
-
* made for.
|
|
71857
|
-
*
|
|
71858
|
-
* The binding is checked at READ time against the model that RUNS, never
|
|
71859
|
-
* enforced by a write on the model-change path: a model can change without any
|
|
71860
|
-
* operator write at all (an unpinned root follows the elected device's
|
|
71861
|
-
* hardware-aware default, D736), and an event-driven reset could be dropped
|
|
71862
|
-
* (events are telemetry, D8/D11). So:
|
|
71863
|
-
*
|
|
71864
|
-
* effective = override when the stored binding names the running model
|
|
71865
|
-
* | override when no binding is stored (a legacy / programmatic
|
|
71866
|
-
* value — it applies to whatever runs, as before D738)
|
|
71867
|
-
* | the running model's default, when it declares one
|
|
71868
|
-
* | the field's global default.
|
|
71869
|
-
*
|
|
71870
|
-
* Storage shape: the value stays a plain number under its own key (every
|
|
71871
|
-
* reader of the raw settings bag keeps working), and the binding is a SIBLING
|
|
71872
|
-
* key, {@link modelBindingKey}. Both are flat so the shallow per-key merges of
|
|
71873
|
-
* the settings layers (node fold, camera override) carry a value and its
|
|
71874
|
-
* binding together whenever one layer writes both — which every writer here
|
|
71875
|
-
* does.
|
|
71876
|
-
*
|
|
71877
|
-
* Lives in the bare `@camstack/types` entry, which every addon bundles, so the
|
|
71878
|
-
* runner (`addon-pipeline`) and the editors (`ui-library`, `addon-admin-ui`)
|
|
71879
|
-
* apply the same rule.
|
|
71880
|
-
*/
|
|
71881
72154
|
/** Suffix of the sibling key that names the model a stored value was made for. */
|
|
71882
72155
|
var MODEL_BINDING_SUFFIX = "ModelId";
|
|
71883
72156
|
/** `minConfidencePerson` → `minConfidencePersonModelId`. */
|
|
@@ -71966,6 +72239,838 @@ function hasModelBoundOverrides(settings, boundKeys, modelId) {
|
|
|
71966
72239
|
function clearModelBoundOverrides(settings, boundKeys, modelId) {
|
|
71967
72240
|
return boundKeys.reduce((acc, key) => resolveModelBoundSetting(acc, key, modelId, void 0, void 0).source === "override" ? clearModelBoundSetting(acc, key) : acc, { ...settings });
|
|
71968
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
|
+
}
|
|
71969
73074
|
//#endregion
|
|
71970
73075
|
//#region src/pipeline/root-face-crop.ts
|
|
71971
73076
|
/** Side of the square, as a multiple of the face box's longer side. */
|
|
@@ -74111,6 +75216,7 @@ exports.AUDIO_PRESETS = require_composition.AUDIO_PRESETS;
|
|
|
74111
75216
|
exports.AUDIO_SCALE_EPOCH_ISO = AUDIO_SCALE_EPOCH_ISO;
|
|
74112
75217
|
exports.AUDIO_SCALE_EPOCH_MS = AUDIO_SCALE_EPOCH_MS;
|
|
74113
75218
|
exports.AUTOMATIC_HUB_ADDRESS_FLAGS = AUTOMATIC_HUB_ADDRESS_FLAGS;
|
|
75219
|
+
exports.AcceleratorKindSchema = AcceleratorKindSchema;
|
|
74114
75220
|
exports.AccessoriesStatusSchema = AccessoriesStatusSchema;
|
|
74115
75221
|
exports.AccessoryKind = AccessoryKind;
|
|
74116
75222
|
exports.AddBrokerInputSchema = AddBrokerInputSchema;
|
|
@@ -74189,6 +75295,7 @@ exports.BASE_DEVICE_CAPS = BASE_DEVICE_CAPS;
|
|
|
74189
75295
|
exports.BASE_LIVE_EGRESS_PROFILE = BASE_LIVE_EGRESS_PROFILE;
|
|
74190
75296
|
exports.BATTERY_DEVICE_PROFILE = BATTERY_DEVICE_PROFILE;
|
|
74191
75297
|
exports.BATTERY_UNREACHABLE_AFTER_MS = BATTERY_UNREACHABLE_AFTER_MS;
|
|
75298
|
+
exports.BEST_SETTINGS_FAMILY = BEST_SETTINGS_FAMILY;
|
|
74192
75299
|
exports.BIRTH_DECISION_DEFAULT_LIMIT = BIRTH_DECISION_DEFAULT_LIMIT;
|
|
74193
75300
|
exports.BOOT_RECOVERY_BACKOFF_MS = require_sleep.BOOT_RECOVERY_BACKOFF_MS;
|
|
74194
75301
|
exports.BUILTIN_RESULT_KINDS = BUILTIN_RESULT_KINDS;
|
|
@@ -74204,6 +75311,12 @@ exports.BaseAddon = require_sleep.BaseAddon;
|
|
|
74204
75311
|
exports.BaseDevice = BaseDevice;
|
|
74205
75312
|
exports.BaseDeviceProvider = BaseDeviceProvider;
|
|
74206
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;
|
|
74207
75320
|
exports.BinaryStatusSchema = BinaryStatusSchema;
|
|
74208
75321
|
exports.BirthDecisionQueryInputSchema = BirthDecisionQueryInputSchema;
|
|
74209
75322
|
exports.BirthDecisionRecordSchema = BirthDecisionRecordSchema;
|
|
@@ -74306,6 +75419,7 @@ exports.CameraMetricsSchema = CameraMetricsSchema;
|
|
|
74306
75419
|
exports.CameraMetricsWithDeviceIdSchema = CameraMetricsWithDeviceIdSchema;
|
|
74307
75420
|
exports.CameraMotionStatusSchema = CameraMotionStatusSchema;
|
|
74308
75421
|
exports.CameraOccupancySnapshotForDeviceSchema = CameraOccupancySnapshotForDeviceSchema;
|
|
75422
|
+
exports.CameraOverrideClearSchema = CameraOverrideClearSchema;
|
|
74309
75423
|
exports.CameraOwnMotionSchema = CameraOwnMotionSchema;
|
|
74310
75424
|
exports.CameraRawLevelSchema = CameraRawLevelSchema;
|
|
74311
75425
|
exports.CameraRecordingModeSchema = CameraRecordingModeSchema;
|
|
@@ -74463,11 +75577,13 @@ exports.DEFAULT_CLUSTER_STEP_MODELS = DEFAULT_CLUSTER_STEP_MODELS;
|
|
|
74463
75577
|
exports.DEFAULT_CLUSTER_STEP_SETTINGS = DEFAULT_CLUSTER_STEP_SETTINGS;
|
|
74464
75578
|
exports.DEFAULT_CORE_BLOCK_ENTRY = DEFAULT_CORE_BLOCK_ENTRY;
|
|
74465
75579
|
exports.DEFAULT_DECODER_HWACCEL_CONFIG = DEFAULT_DECODER_HWACCEL_CONFIG;
|
|
75580
|
+
exports.DEFAULT_DEMAND_OPTIONS = DEFAULT_DEMAND_OPTIONS;
|
|
74466
75581
|
exports.DEFAULT_DETAIL_CROP_CONVENTION = DEFAULT_DETAIL_CROP_CONVENTION;
|
|
74467
75582
|
exports.DEFAULT_EVENTS_BAND_BUFFER_SEC = DEFAULT_EVENTS_BAND_BUFFER_SEC;
|
|
74468
75583
|
exports.DEFAULT_EVENT_COLOR = DEFAULT_EVENT_COLOR;
|
|
74469
75584
|
exports.DEFAULT_FEATURES = DEFAULT_FEATURES;
|
|
74470
75585
|
exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = require_composition.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
|
|
75586
|
+
exports.DEFAULT_HEADROOM = DEFAULT_HEADROOM;
|
|
74471
75587
|
exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
|
|
74472
75588
|
exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
|
|
74473
75589
|
exports.DEFAULT_OVERLAY_LAYERS = DEFAULT_OVERLAY_LAYERS;
|
|
@@ -74484,6 +75600,8 @@ exports.DETAIL_CROP_SECTION_ID = DETAIL_CROP_SECTION_ID;
|
|
|
74484
75600
|
exports.DETAIL_CROP_SQUARE_KEY = DETAIL_CROP_SQUARE_KEY;
|
|
74485
75601
|
exports.DETECTION_MACRO_CLASSES = DETECTION_MACRO_CLASSES;
|
|
74486
75602
|
exports.DETECTION_PIPELINE_CAP_NAME = DETECTION_PIPELINE_CAP_NAME;
|
|
75603
|
+
exports.DETECTOR_ACCURACY = DETECTOR_ACCURACY;
|
|
75604
|
+
exports.DETECTOR_PERF = DETECTOR_PERF;
|
|
74487
75605
|
exports.DEVICE_BACKEND_TO_FORMAT = DEVICE_BACKEND_TO_FORMAT;
|
|
74488
75606
|
exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
|
|
74489
75607
|
exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
|
|
@@ -74521,16 +75639,20 @@ exports.DetailCropConventionSchema = DetailCropConventionSchema;
|
|
|
74521
75639
|
exports.DetectionCatalogClassMapSchema = DetectionCatalogClassMapSchema;
|
|
74522
75640
|
exports.DetectionSourceSchema = DetectionSourceSchema;
|
|
74523
75641
|
exports.DetectionSourcesSchema = DetectionSourcesSchema;
|
|
75642
|
+
exports.DetectorStoreClearSchema = DetectorStoreClearSchema;
|
|
74524
75643
|
exports.DeviceAdminLinkSchema = DeviceAdminLinkSchema;
|
|
74525
75644
|
exports.DeviceCodeSeveritySchema = DeviceCodeSeveritySchema;
|
|
74526
75645
|
exports.DeviceConfig = DeviceConfig;
|
|
75646
|
+
exports.DeviceDemandSchema = DeviceDemandSchema;
|
|
74527
75647
|
exports.DeviceDiscoveryStatusSchema = DeviceDiscoveryStatusSchema;
|
|
74528
75648
|
exports.DeviceExportExposeInputSchema = ExposeInputSchema;
|
|
74529
75649
|
exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
|
|
74530
75650
|
exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
|
|
74531
75651
|
exports.DeviceFeature = require_err_msg.DeviceFeature;
|
|
74532
75652
|
exports.DeviceInfoSchema = DeviceInfoSchema;
|
|
75653
|
+
exports.DeviceModelChoiceSchema = DeviceModelChoiceSchema;
|
|
74533
75654
|
exports.DeviceNetworkStatsSchema = DeviceNetworkStatsSchema;
|
|
75655
|
+
exports.DeviceRecommendationSchema = DeviceRecommendationSchema;
|
|
74534
75656
|
exports.DeviceRestoreRetryScheduler = DeviceRestoreRetryScheduler;
|
|
74535
75657
|
exports.DeviceRole = require_err_msg.DeviceRole;
|
|
74536
75658
|
exports.DeviceRuntimeState = DeviceRuntimeState;
|
|
@@ -74683,6 +75805,7 @@ exports.HOURS_PER_DAY = HOURS_PER_DAY;
|
|
|
74683
75805
|
exports.HUB_ADDRESS_ROLES = HUB_ADDRESS_ROLES;
|
|
74684
75806
|
exports.HUB_VIEWER_MOUNT = HUB_VIEWER_MOUNT;
|
|
74685
75807
|
exports.HWACCEL_OPTIONS = HWACCEL_OPTIONS;
|
|
75808
|
+
exports.HardwareClassIdSchema = HardwareClassIdSchema;
|
|
74686
75809
|
exports.HealthStatusSchema = HealthStatusSchema;
|
|
74687
75810
|
exports.HfModelResolutionSchema = HfModelResolutionSchema;
|
|
74688
75811
|
exports.HistoryPointSchema = HistoryPointSchema;
|
|
@@ -74865,8 +75988,11 @@ exports.ModelDistributeInputSchema = ModelDistributeInputSchema;
|
|
|
74865
75988
|
exports.ModelDistributeResultSchema = ModelDistributeResultSchema;
|
|
74866
75989
|
exports.ModelExtraFileSchema = ModelExtraFileSchema;
|
|
74867
75990
|
exports.ModelFormatEntrySchema = ModelFormatEntrySchema;
|
|
75991
|
+
exports.ModelFormatPrecisionSchema = ModelFormatPrecisionSchema;
|
|
74868
75992
|
exports.ModelFormatsSchema = ModelFormatsSchema;
|
|
74869
75993
|
exports.ModelLicenseSchema = ModelLicenseSchema;
|
|
75994
|
+
exports.ModelOnDiskStateSchema = ModelOnDiskStateSchema;
|
|
75995
|
+
exports.ModelPinChangeSchema = ModelPinChangeSchema;
|
|
74870
75996
|
exports.ModelProviderIdSchema = ModelProviderIdSchema;
|
|
74871
75997
|
exports.ModelSubstitutionSchema = ModelSubstitutionSchema;
|
|
74872
75998
|
exports.ModelVariantGroupSchema = ModelVariantGroupSchema;
|
|
@@ -75103,14 +76229,17 @@ exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
|
|
|
75103
76229
|
exports.NetworkAddressSchema = NetworkAddressSchema;
|
|
75104
76230
|
exports.NetworkEndpointSchema = NetworkEndpointSchema;
|
|
75105
76231
|
exports.NetworkLinkStatusSchema = NetworkLinkStatusSchema;
|
|
76232
|
+
exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
|
|
75106
76233
|
exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
|
|
75107
76234
|
exports.NodeDirectorySchema = NodeDirectorySchema;
|
|
76235
|
+
exports.NodeRecommendationSchema = NodeRecommendationSchema;
|
|
75108
76236
|
exports.NotificationActionIconSchema = NotificationActionIconSchema;
|
|
75109
76237
|
exports.NotificationActionSchema = NotificationActionSchema;
|
|
75110
76238
|
exports.NotificationFormatSchema = NotificationFormatSchema;
|
|
75111
76239
|
exports.NotificationSchema = NotificationSchema;
|
|
75112
76240
|
exports.NotifierStatusSchema = NotifierStatusSchema;
|
|
75113
76241
|
exports.NumericSensorStatusSchema = NumericSensorStatusSchema;
|
|
76242
|
+
exports.OBSERVATION_WINDOW_MS = OBSERVATION_WINDOW_MS;
|
|
75114
76243
|
exports.OPERATOR_WRITTEN_STALE_MS = OPERATOR_WRITTEN_STALE_MS;
|
|
75115
76244
|
exports.OPS_LOG_DEFAULT_LIMIT = OPS_LOG_DEFAULT_LIMIT;
|
|
75116
76245
|
exports.OPS_LOG_RING_DEFAULT_MAX = OPS_LOG_RING_DEFAULT_MAX;
|
|
@@ -75184,6 +76313,7 @@ exports.PickedCamStreamSchema = PickedCamStreamSchema;
|
|
|
75184
76313
|
exports.PipelineAssignmentSchema = PipelineAssignmentSchema;
|
|
75185
76314
|
exports.PipelineDefaultStepSchema = PipelineDefaultStepSchema;
|
|
75186
76315
|
exports.PipelineEngineChoiceSchema = PipelineEngineChoiceSchema;
|
|
76316
|
+
exports.PipelineModelFormatStatusSchema = PipelineModelFormatStatusSchema;
|
|
75187
76317
|
exports.PipelineRunResultBridge = PipelineRunResultBridge;
|
|
75188
76318
|
exports.PipelineStepInputSchema = PipelineStepInputSchema;
|
|
75189
76319
|
exports.PipelineValidationIssueSchema = PipelineValidationIssueSchema;
|
|
@@ -75223,6 +76353,7 @@ exports.RATE_CONTROL_TIGHT = RATE_CONTROL_TIGHT;
|
|
|
75223
76353
|
exports.REACHABILITY_FAILURES_TO_OFFLINE = REACHABILITY_FAILURES_TO_OFFLINE;
|
|
75224
76354
|
exports.REACHABILITY_POLL_INTERVAL_MS = REACHABILITY_POLL_INTERVAL_MS;
|
|
75225
76355
|
exports.REACHABILITY_PROBE_TIMEOUT_MS = REACHABILITY_PROBE_TIMEOUT_MS;
|
|
76356
|
+
exports.RECALL_TIE = RECALL_TIE;
|
|
75226
76357
|
exports.RECOGNITION_TYPES = RECOGNITION_TYPES;
|
|
75227
76358
|
exports.RECORDING_AUDIO_TRIGGER_OFFERED_DBFS = RECORDING_AUDIO_TRIGGER_OFFERED_DBFS;
|
|
75228
76359
|
exports.RECORDING_EXPORT_MAX_READ_BYTES = RECORDING_EXPORT_MAX_READ_BYTES;
|
|
@@ -75255,6 +76386,7 @@ exports.ReadinessTimeoutError = require_sleep.ReadinessTimeoutError;
|
|
|
75255
76386
|
exports.RebuildObjectEmbeddingsRefusalSchema = RebuildObjectEmbeddingsRefusalSchema;
|
|
75256
76387
|
exports.RecentTracksPageSchema = RecentTracksPageSchema;
|
|
75257
76388
|
exports.RecentTracksQueryInput = RecentTracksQueryInput;
|
|
76389
|
+
exports.RecommendationReasonSchema = RecommendationReasonSchema;
|
|
75258
76390
|
exports.RecordTriggerSchema = RecordTriggerSchema;
|
|
75259
76391
|
exports.RecordWindowSchema = RecordWindowSchema;
|
|
75260
76392
|
exports.RecordingAvailabilityForDeviceSchema = RecordingAvailabilityForDeviceSchema;
|
|
@@ -75610,6 +76742,7 @@ exports.ZoneRulesArraySchema = ZoneRulesArraySchema;
|
|
|
75610
76742
|
exports.ZoneSchema = ZoneSchema;
|
|
75611
76743
|
exports.ZoneScopeBreakdownSchema = ZoneScopeBreakdownSchema;
|
|
75612
76744
|
exports.__resetLogChannelRegistryForTests = __resetLogChannelRegistryForTests;
|
|
76745
|
+
exports.acceleratorKindOf = acceleratorKindOf;
|
|
75613
76746
|
exports.accessoriesCapability = accessoriesCapability;
|
|
75614
76747
|
exports.accessoryStableId = accessoryStableId;
|
|
75615
76748
|
exports.actionsForBoundCaps = actionsForBoundCaps;
|
|
@@ -75701,6 +76834,7 @@ exports.carbonMonoxideCapability = carbonMonoxideCapability;
|
|
|
75701
76834
|
exports.cellsToRects = cellsToRects;
|
|
75702
76835
|
exports.checkRoleAddress = checkRoleAddress;
|
|
75703
76836
|
exports.classifyBearerPrincipal = classifyBearerPrincipal;
|
|
76837
|
+
exports.classifyInferenceHardware = classifyInferenceHardware;
|
|
75704
76838
|
exports.classifyStream = classifyStream;
|
|
75705
76839
|
exports.classifyStreams = classifyStreams;
|
|
75706
76840
|
exports.clearModelBoundOverrides = clearModelBoundOverrides;
|
|
@@ -75717,6 +76851,7 @@ exports.clusterStepSettingKey = clusterStepSettingKey;
|
|
|
75717
76851
|
exports.codecIsAccepted = codecIsAccepted;
|
|
75718
76852
|
exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
|
|
75719
76853
|
exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
|
|
76854
|
+
exports.collectModelBoundKeys = collectModelBoundKeys;
|
|
75720
76855
|
exports.collectSecretConfigKeys = collectSecretConfigKeys;
|
|
75721
76856
|
exports.colorCapability = colorCapability;
|
|
75722
76857
|
exports.colorForKind = colorForKind;
|
|
@@ -75848,6 +76983,8 @@ exports.enumerateInferenceDevices = enumerateInferenceDevices;
|
|
|
75848
76983
|
exports.enumerateItemArrayFields = enumerateItemArrayFields;
|
|
75849
76984
|
exports.enumerateSchemaFields = enumerateSchemaFields;
|
|
75850
76985
|
exports.errMsg = require_err_msg.errMsg;
|
|
76986
|
+
exports.estimateDeviceDemand = estimateDeviceDemand;
|
|
76987
|
+
exports.estimatedConcurrentSessions = estimatedConcurrentSessions;
|
|
75851
76988
|
exports.evaluateAst = require_composition.evaluateAst;
|
|
75852
76989
|
exports.evaluateCompositionField = evaluateCompositionField;
|
|
75853
76990
|
exports.evaluateCount = require_composition.evaluateCount;
|
|
@@ -76130,6 +77267,7 @@ exports.readTimelapseGeneratedAt = readTimelapseGeneratedAt;
|
|
|
76130
77267
|
exports.readUseRootModel = readUseRootModel;
|
|
76131
77268
|
exports.readinessKey = require_sleep.readinessKey;
|
|
76132
77269
|
exports.rebootCapability = rebootCapability;
|
|
77270
|
+
exports.recommendNode = recommendNode;
|
|
76133
77271
|
exports.reconcileBlockDevices = reconcileBlockDevices;
|
|
76134
77272
|
exports.recordingArchiveCapability = recordingArchiveCapability;
|
|
76135
77273
|
exports.recordingCapability = recordingCapability;
|