@trillboards/edge-sdk 0.2.58 → 0.2.61

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.
@@ -61,6 +61,87 @@ mkdir -p "$LOG_DIR" "$LA_DIR" 2>/dev/null || true
61
61
  LOG="$LOG_DIR/litertlm-setup.log"
62
62
  log() { printf '[trillboards setup-litertlm] %s %s\n' "$(date '+%H:%M:%S')" "$*" >>"$LOG" 2>&1; printf '[trillboards setup-litertlm] %s\n' "$*"; }
63
63
  fail() { log "ERROR: $*"; exit 1; }
64
+ # -- Local-inference tuning (config.json) ------------------------------------
65
+ #
66
+ # `litert-lm serve` takes NO flags for any of this: `serve` accepts only
67
+ # --host/--port/--api/--cors-origin/--verbose. Every engine knob it honours comes
68
+ # from `$LITERT_LM_DIR/config.json`, which `litert_lm_cli.config.get_model_config`
69
+ # merges per model id. So this file IS the tuning surface, and writing it is the
70
+ # whole change -- the serve stays stock.
71
+ #
72
+ # Two settings, both MEASURED on an M4 Max (12P+4E/48G), litert-lm 0.16.0, Gemma
73
+ # 4 E2B, delegate asserted GPU from the native log, 16 warm-ups before timing,
74
+ # arms interleaved sample-by-sample, operator/SOP field set + the two committed
75
+ # CCTV fixtures:
76
+ #
77
+ # vision_backend=gpu The vision encoder ran on the CPU because NOTHING ASKED
78
+ # IT NOT TO -- `Engine(vision_backend=...)` defaults to
79
+ # None and the 0.13.1 HTTP shim hardcoded Backend.CPU()
80
+ # (upstream b/515805503). It is not a hardware limit and
81
+ # not a model constraint; GPU vision is Google's own
82
+ # reference config and CPU is their FALLBACK tier.
83
+ # Image encode 0.804 s -> 0.175 s p50, i.e. 76% of a SOP
84
+ # frame removed.
85
+ # speculative_decoding 1.433x on the decode-heavy audience schema, and the
86
+ # generations are BYTE-IDENTICAL to greedy (12/12 same
87
+ # text), which is the property that makes it safe: it is
88
+ # a speed change, not an answer change.
89
+ #
90
+ # Together, in-process: 1.054 s -> 0.385 s per SOP frame (2.765x paired, min
91
+ # 2.560 / max 2.919 over 16 rounds); 3,416 -> 9,295 analyses/hour. Through this
92
+ # stock serve over HTTP: 1752.5 ms -> 1005.8 ms p50 (1.742x), 12/12 schema-valid
93
+ # on BOTH arms. Accuracy is not traded for it: people_present 16/16 on both arms,
94
+ # person_count 8/16 on both, and where they differ the GPU encoder is CLOSER to
95
+ # the hand label (4 vs 3 against a truth of 5).
96
+ #
97
+ # WHY THE VERIFY BELOW EXISTS. Pinning the vision encoder to the GPU is the one
98
+ # setting here that can make a host WORSE than it is today: a box whose GPU will
99
+ # not bind fails engine init, and unlike the main backend there is no demotion
100
+ # path for it -- `LiteRtVlmProvider.recordGpuDemotion` re-posts the BARE model
101
+ # id, which changes the main backend and leaves this config untouched. So a
102
+ # blind write would brick sensing on exactly the weak hosts that need it most.
103
+ # We therefore do what Google's own cascade does: try GPU vision, prove it with
104
+ # one real image inference, and fall back to the CPU default if it does not
105
+ # answer.
106
+ CONFIG_JSON="$LITERT_DIR/config.json"
107
+
108
+ # A 223-byte 32x32 grey JPEG. Small enough to inline, real enough that decoding
109
+ # it exercises the vision encoder we are trying to prove.
110
+ LITERTLM_PROBE_JPEG_B64="/9j/4AAQSkZJRgABAgAAAQABAAD//gAPTGF2YzYzLjEuMTAxAP/bAEMACD4+ST5JVVVVVVVVZF1kaGhoZGRkZGhoaHBwcIODg3BwcGhocHB8fIODj5OPh4eDh5OTm5uburqystnZ4P/////EAEoAAQAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAARAQAAAAAAAAAAAAAAAAAAAAD/wAARCAAgACADASIAAhEAAxEA/9oADAMBAAIRAxEAPwAAAAAAAAD/2Q=="
111
+
112
+ # Write config.json. $1 = "gpu" pins the vision encoder; empty leaves it on the
113
+ # CPU default. speculative_decoding is written EITHER WAY -- it is delegate
114
+ # independent and byte-identical, so it survives the fallback.
115
+ write_litertlm_config() {
116
+ _vision="$1"
117
+ mkdir -p "$LITERT_DIR" 2>/dev/null || true
118
+ if [ -n "$_vision" ]; then
119
+ printf '{"models":{"%s":{"vision_backend":"%s","speculative_decoding":true}}}\n' \
120
+ "$MODEL_ID" "$_vision" > "$CONFIG_JSON.tmp" 2>/dev/null || return 1
121
+ else
122
+ printf '{"models":{"%s":{"speculative_decoding":true}}}\n' \
123
+ "$MODEL_ID" > "$CONFIG_JSON.tmp" 2>/dev/null || return 1
124
+ fi
125
+ mv -f "$CONFIG_JSON.tmp" "$CONFIG_JSON" 2>/dev/null || return 1
126
+ log "wrote $CONFIG_JSON (vision_backend=${_vision:-cpu-default}, speculative_decoding=true)"
127
+ }
128
+
129
+ # One real image inference against the running serve. A 200 means the vision
130
+ # encoder loaded AND ran on whatever backend config.json just asked for.
131
+ # Deliberately NOT a /v1/models check: that answers 200 without ever building an
132
+ # engine, so it cannot tell a working GPU encoder from one that fails on first
133
+ # use.
134
+ verify_litertlm_vision() {
135
+ _body="$LITERT_DIR/.vision-probe.json"
136
+ printf '{"model":"%s,gpu","messages":[{"role":"user","content":[{"type":"text","text":"Reply with the single word: ok"},{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,%s"}}]}],"max_completion_tokens":8,"temperature":0}' \
137
+ "$MODEL_ID" "$LITERTLM_PROBE_JPEG_B64" > "$_body" 2>/dev/null || return 1
138
+ _code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 180 \
139
+ -X POST "http://127.0.0.1:$SERVE_PORT/v1/chat/completions" \
140
+ -H 'Content-Type: application/json' --data-binary @"$_body" 2>/dev/null)
141
+ rm -f "$_body" 2>/dev/null || true
142
+ [ "$_code" = "200" ]
143
+ }
144
+
64
145
  local_ai_healthy() {
65
146
  curl -fsS --max-time 3 "http://127.0.0.1:$SERVE_PORT/v1/models" 2>/dev/null \
66
147
  | grep -Fq "$MODEL_ID"
@@ -305,6 +386,7 @@ if [ -f "$TEMPLATE" ]; then
305
386
  -e "s#__PORT__#$SERVE_PORT#g" \
306
387
  -e "s#__LOG_DIR__#$LOG_DIR#g" \
307
388
  "$TEMPLATE" > "$TARGET" 2>/dev/null || log "WARN: could not render serve plist"
389
+ write_litertlm_config "gpu" || log "WARN: could not write $CONFIG_JSON - the serve will use its defaults"
308
390
  restart_launch_agent \
309
391
  || { [ "$REQUIRE_BUNDLED_MODEL" = "1" ] && fail "local AI service could not be started"; log "WARN: launchctl bootstrap failed for serve agent"; }
310
392
  else
@@ -312,6 +394,29 @@ else
312
394
  log "WARN: serve plist template missing at $TEMPLATE"
313
395
  fi
314
396
 
397
+ # The GPU-vision cascade. `local_ai_healthy` only proves /v1/models answers, and
398
+ # that route never builds an engine - so it cannot see a GPU vision encoder that
399
+ # fails on first USE. One real image inference is the only thing that can, and if
400
+ # it does not answer we fall back to the CPU encoder rather than leave the host
401
+ # unable to sense at all.
402
+ litertlm_vision_cascade() {
403
+ if verify_litertlm_vision; then
404
+ log "local AI healthy with the GPU vision encoder"
405
+ return 0
406
+ fi
407
+ log "WARN: GPU vision encoder did not answer a probe inference - falling back to the CPU encoder"
408
+ write_litertlm_config "" || log "WARN: could not rewrite $CONFIG_JSON"
409
+ restart_launch_agent || log "WARN: could not restart the serve agent after the vision fallback"
410
+ for _attempt in $(seq 1 60); do
411
+ if local_ai_healthy; then
412
+ log "local AI healthy on the CPU vision encoder (slower, but serving)"
413
+ return 0
414
+ fi
415
+ sleep 2
416
+ done
417
+ return 1
418
+ }
419
+
315
420
  if [ "$REQUIRE_BUNDLED_MODEL" = "1" ]; then
316
421
  log "waiting for local AI health check"
317
422
  HEALTHY=0
@@ -320,7 +425,15 @@ if [ "$REQUIRE_BUNDLED_MODEL" = "1" ]; then
320
425
  sleep 2
321
426
  done
322
427
  [ "$HEALTHY" -eq 1 ] || fail "Gemma is installed, but the local AI service did not respond"
428
+ litertlm_vision_cascade || fail "Gemma is installed, but the local AI service stopped answering after the vision fallback"
323
429
  log "local AI is installed and healthy"
430
+ else
431
+ # Best effort, and deliberately NOT a new wait: if the serve is already up we
432
+ # settle the vision backend now; if it is not, ensure-litertlm.sh re-runs this
433
+ # script and we settle it then.
434
+ if local_ai_healthy; then
435
+ litertlm_vision_cascade || log "WARN: the serve stopped answering after the vision fallback"
436
+ fi
324
437
  fi
325
438
 
326
439
  log "done"
@@ -36,8 +36,18 @@ fi
36
36
  exit 0
37
37
  EOF
38
38
 
39
+ # Fake curl models BOTH endpoints the setup script uses:
40
+ # GET /v1/models -> the catalogue body `local_ai_healthy` greps
41
+ # POST /v1/chat/completions -> the vision probe, which asks for `%{http_code}`
42
+ # TRILLBOARDS_TEST_VISION_PROBE_CODE lets a test drive the GPU-vision fallback.
39
43
  cat >"$FAKE_BIN/curl" <<'EOF'
40
44
  #!/bin/bash
45
+ for arg in "$@"; do
46
+ if [ "$arg" = "-w" ]; then
47
+ printf '%s' "${TRILLBOARDS_TEST_VISION_PROBE_CODE:-200}"
48
+ exit 0
49
+ fi
50
+ done
41
51
  printf '{"data":[{"id":"gemma-4-E2B-it.litertlm"}]}\n'
42
52
  EOF
43
53
 
@@ -103,7 +113,55 @@ if ! OUTPUT="$(/bin/bash "$SETUP" 2>&1)"; then
103
113
  fi
104
114
 
105
115
  [ "$(cat "$TRILLBOARDS_TEST_STATE_DIR/bootstrap-attempts")" = "2" ]
116
+ # A host whose GPU vision encoder answers keeps it: config.json must carry
117
+ # vision_backend=gpu and must NOT have been rewritten by the fallback.
118
+ grep -Fq '"vision_backend":"gpu"' "$LITERT_LM_DIR/config.json"
119
+ grep -Fq '"speculative_decoding":true' "$LITERT_LM_DIR/config.json"
120
+ grep -Fq 'local AI healthy with the GPU vision encoder' <<<"$OUTPUT"
106
121
  grep -Fq 'Bootstrap failed: 37: Operation already in progress' \
107
122
  "$HOME/Library/Logs/Trillboards/litertlm-setup.log"
108
123
  grep -Fq 'local AI is installed and healthy' <<<"$OUTPUT"
109
- printf 'macOS LiteRT-LM reinstall race regression passed\n'
124
+
125
+ # -- Scenario 2: a host whose GPU vision encoder does NOT answer --------------
126
+ #
127
+ # This is the case the cascade exists for. Pinning the vision encoder to the GPU
128
+ # is the one setting here that can make a host WORSE than it was, and there is no
129
+ # demotion path for it: `recordGpuDemotion` re-posts the BARE model id, which
130
+ # moves the MAIN backend and leaves vision_backend untouched. So a box whose GPU
131
+ # will not bind must end this script serving on the CPU encoder, not dead.
132
+ #
133
+ # `local_ai_healthy` cannot catch it -- /v1/models answers 200 without ever
134
+ # building an engine. Only a real image inference can, which is why the probe
135
+ # POSTs one and why this test drives its status code.
136
+ printf 'loaded\n' >"$TRILLBOARDS_TEST_STATE_DIR/service-state"
137
+ printf '0\n' >"$TRILLBOARDS_TEST_STATE_DIR/bootstrap-attempts"
138
+ export TRILLBOARDS_TEST_VISION_PROBE_CODE=500
139
+
140
+ if ! OUTPUT2="$(/bin/bash "$SETUP" 2>&1)"; then
141
+ printf '%s\n' "$OUTPUT2" >&2
142
+ printf 'FAIL: setup exited non-zero when the GPU vision probe failed; it must fall back, not fail\n' >&2
143
+ exit 1
144
+ fi
145
+
146
+ grep -Fq 'falling back to the CPU encoder' <<<"$OUTPUT2"
147
+ grep -Fq 'local AI healthy on the CPU vision encoder' <<<"$OUTPUT2"
148
+ grep -Fq 'local AI is installed and healthy' <<<"$OUTPUT2"
149
+
150
+ # The fallback must REMOVE vision_backend and KEEP speculative_decoding: the
151
+ # latter is delegate independent and byte-identical to greedy, so it is still
152
+ # correct on a CPU-vision host and is the only speedup that host keeps.
153
+ if grep -Fq 'vision_backend' "$LITERT_LM_DIR/config.json"; then
154
+ printf 'FAIL: fallback left vision_backend in config.json\n' >&2
155
+ cat "$LITERT_LM_DIR/config.json" >&2
156
+ exit 1
157
+ fi
158
+ grep -Fq '"speculative_decoding":true' "$LITERT_LM_DIR/config.json"
159
+
160
+ # 2 bootstraps for the first start (attempt 1 hits the 37 race), + 1 for the
161
+ # restart the fallback performs.
162
+ [ "$(cat "$TRILLBOARDS_TEST_STATE_DIR/bootstrap-attempts")" = "3" ]
163
+
164
+ unset TRILLBOARDS_TEST_VISION_PROBE_CODE
165
+
166
+ printf 'macOS LiteRT-LM reinstall race + GPU-vision fallback regressions passed\n'
167
+
@@ -69,6 +69,87 @@ log() {
69
69
  printf '[trillboards setup-litertlm] %s\n' "$*"
70
70
  }
71
71
  fail() { log "ERROR: $*"; exit 1; }
72
+ # -- Local-inference tuning (config.json) ------------------------------------
73
+ #
74
+ # `litert-lm serve` takes NO flags for any of this: `serve` accepts only
75
+ # --host/--port/--api/--cors-origin/--verbose. Every engine knob it honours comes
76
+ # from `$LITERT_LM_DIR/config.json`, which `litert_lm_cli.config.get_model_config`
77
+ # merges per model id. So this file IS the tuning surface, and writing it is the
78
+ # whole change -- the serve stays stock.
79
+ #
80
+ # Two settings, both MEASURED on an M4 Max (12P+4E/48G), litert-lm 0.16.0, Gemma
81
+ # 4 E2B, delegate asserted GPU from the native log, 16 warm-ups before timing,
82
+ # arms interleaved sample-by-sample, operator/SOP field set + the two committed
83
+ # CCTV fixtures:
84
+ #
85
+ # vision_backend=gpu The vision encoder ran on the CPU because NOTHING ASKED
86
+ # IT NOT TO -- `Engine(vision_backend=...)` defaults to
87
+ # None and the 0.13.1 HTTP shim hardcoded Backend.CPU()
88
+ # (upstream b/515805503). It is not a hardware limit and
89
+ # not a model constraint; GPU vision is Google's own
90
+ # reference config and CPU is their FALLBACK tier.
91
+ # Image encode 0.804 s -> 0.175 s p50, i.e. 76% of a SOP
92
+ # frame removed.
93
+ # speculative_decoding 1.433x on the decode-heavy audience schema, and the
94
+ # generations are BYTE-IDENTICAL to greedy (12/12 same
95
+ # text), which is the property that makes it safe: it is
96
+ # a speed change, not an answer change.
97
+ #
98
+ # Together, in-process: 1.054 s -> 0.385 s per SOP frame (2.765x paired, min
99
+ # 2.560 / max 2.919 over 16 rounds); 3,416 -> 9,295 analyses/hour. Through this
100
+ # stock serve over HTTP: 1752.5 ms -> 1005.8 ms p50 (1.742x), 12/12 schema-valid
101
+ # on BOTH arms. Accuracy is not traded for it: people_present 16/16 on both arms,
102
+ # person_count 8/16 on both, and where they differ the GPU encoder is CLOSER to
103
+ # the hand label (4 vs 3 against a truth of 5).
104
+ #
105
+ # WHY THE VERIFY BELOW EXISTS. Pinning the vision encoder to the GPU is the one
106
+ # setting here that can make a host WORSE than it is today: a box whose GPU will
107
+ # not bind fails engine init, and unlike the main backend there is no demotion
108
+ # path for it -- `LiteRtVlmProvider.recordGpuDemotion` re-posts the BARE model
109
+ # id, which changes the main backend and leaves this config untouched. So a
110
+ # blind write would brick sensing on exactly the weak hosts that need it most.
111
+ # We therefore do what Google's own cascade does: try GPU vision, prove it with
112
+ # one real image inference, and fall back to the CPU default if it does not
113
+ # answer.
114
+ CONFIG_JSON="$LITERT_DIR/config.json"
115
+
116
+ # A 223-byte 32x32 grey JPEG. Small enough to inline, real enough that decoding
117
+ # it exercises the vision encoder we are trying to prove.
118
+ LITERTLM_PROBE_JPEG_B64="/9j/4AAQSkZJRgABAgAAAQABAAD//gAPTGF2YzYzLjEuMTAxAP/bAEMACD4+ST5JVVVVVVVVZF1kaGhoZGRkZGhoaHBwcIODg3BwcGhocHB8fIODj5OPh4eDh5OTm5uburqystnZ4P/////EAEoAAQAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAARAQAAAAAAAAAAAAAAAAAAAAD/wAARCAAgACADASIAAhEAAxEA/9oADAMBAAIRAxEAPwAAAAAAAAD/2Q=="
119
+
120
+ # Write config.json. $1 = "gpu" pins the vision encoder; empty leaves it on the
121
+ # CPU default. speculative_decoding is written EITHER WAY -- it is delegate
122
+ # independent and byte-identical, so it survives the fallback.
123
+ write_litertlm_config() {
124
+ _vision="$1"
125
+ mkdir -p "$LITERT_DIR" 2>/dev/null || true
126
+ if [ -n "$_vision" ]; then
127
+ printf '{"models":{"%s":{"vision_backend":"%s","speculative_decoding":true}}}\n' \
128
+ "$MODEL_ID" "$_vision" > "$CONFIG_JSON.tmp" 2>/dev/null || return 1
129
+ else
130
+ printf '{"models":{"%s":{"speculative_decoding":true}}}\n' \
131
+ "$MODEL_ID" > "$CONFIG_JSON.tmp" 2>/dev/null || return 1
132
+ fi
133
+ mv -f "$CONFIG_JSON.tmp" "$CONFIG_JSON" 2>/dev/null || return 1
134
+ log "wrote $CONFIG_JSON (vision_backend=${_vision:-cpu-default}, speculative_decoding=true)"
135
+ }
136
+
137
+ # One real image inference against the running serve. A 200 means the vision
138
+ # encoder loaded AND ran on whatever backend config.json just asked for.
139
+ # Deliberately NOT a /v1/models check: that answers 200 without ever building an
140
+ # engine, so it cannot tell a working GPU encoder from one that fails on first
141
+ # use.
142
+ verify_litertlm_vision() {
143
+ _body="$LITERT_DIR/.vision-probe.json"
144
+ printf '{"model":"%s,gpu","messages":[{"role":"user","content":[{"type":"text","text":"Reply with the single word: ok"},{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,%s"}}]}],"max_completion_tokens":8,"temperature":0}' \
145
+ "$MODEL_ID" "$LITERTLM_PROBE_JPEG_B64" > "$_body" 2>/dev/null || return 1
146
+ _code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 180 \
147
+ -X POST "http://127.0.0.1:$SERVE_PORT/v1/chat/completions" \
148
+ -H 'Content-Type: application/json' --data-binary @"$_body" 2>/dev/null)
149
+ rm -f "$_body" 2>/dev/null || true
150
+ [ "$_code" = "200" ]
151
+ }
152
+
72
153
  local_ai_healthy() {
73
154
  curl -fsS --max-time 3 "http://127.0.0.1:$SERVE_PORT/v1/models" 2>/dev/null \
74
155
  | grep -Fq "$MODEL_ID"
@@ -172,25 +253,55 @@ fi
172
253
 
173
254
  # 4. Serve unit. Installed by install.sh (which has sudo); here we only start it
174
255
  # when we can, so a re-run from the service user still recovers a stopped serve.
175
- if command -v systemctl >/dev/null 2>&1; then
256
+ restart_litertlm_serve() {
257
+ command -v systemctl >/dev/null 2>&1 || return 0
176
258
  if systemctl list-unit-files "$SERVE_UNIT.service" >/dev/null 2>&1; then
177
259
  systemctl restart "$SERVE_UNIT" >>"$LOG" 2>&1 \
178
260
  || sudo -n systemctl restart "$SERVE_UNIT" >>"$LOG" 2>&1 \
179
- || log "WARN: could not restart $SERVE_UNIT — start it with: sudo systemctl restart $SERVE_UNIT"
261
+ || log "WARN: could not restart $SERVE_UNIT - start it with: sudo systemctl restart $SERVE_UNIT"
180
262
  else
181
263
  log "WARN: $SERVE_UNIT.service is not installed yet (install.sh installs it)"
182
264
  fi
183
- fi
265
+ }
266
+
267
+ wait_for_litertlm_health() {
268
+ log "waiting for local AI health check on :$SERVE_PORT"
269
+ for _attempt in $(seq 1 60); do
270
+ if local_ai_healthy; then return 0; fi
271
+ sleep 2
272
+ done
273
+ return 1
274
+ }
275
+
276
+ # Ask for GPU vision BEFORE the restart so the engine builds with it. The engine
277
+ # is constructed lazily on the first inference, so config.json must be on disk
278
+ # before that request, not merely before the next boot.
279
+ write_litertlm_config "gpu" || log "WARN: could not write $CONFIG_JSON - the serve will use its defaults"
280
+
281
+ restart_litertlm_serve
184
282
 
185
- log "waiting for local AI health check on :$SERVE_PORT"
186
283
  HEALTHY=0
187
- for _attempt in $(seq 1 60); do
188
- if local_ai_healthy; then HEALTHY=1; break; fi
189
- sleep 2
190
- done
284
+ if wait_for_litertlm_health; then HEALTHY=1; fi
285
+
191
286
  if [ "$HEALTHY" -eq 1 ]; then
192
- log "local AI is installed and healthy — the connector will run ON-DEVICE"
193
- else
287
+ # The cascade. `local_ai_healthy` only proves /v1/models answers, which it does
288
+ # without ever building an engine - so it CANNOT see a GPU vision encoder that
289
+ # fails on first use. One real image inference is the only thing that can.
290
+ if verify_litertlm_vision; then
291
+ log "local AI healthy with the GPU vision encoder - the connector will run ON-DEVICE"
292
+ else
293
+ log "WARN: GPU vision encoder did not answer a probe inference - falling back to the CPU encoder"
294
+ write_litertlm_config "" || log "WARN: could not rewrite $CONFIG_JSON"
295
+ restart_litertlm_serve
296
+ if wait_for_litertlm_health; then
297
+ log "local AI healthy on the CPU vision encoder (slower, but serving)"
298
+ else
299
+ HEALTHY=0
300
+ fi
301
+ fi
302
+ fi
303
+
304
+ if [ "$HEALTHY" -ne 1 ]; then
194
305
  # NOT fatal. auto-sense waits and beacons, so an install that gets this far
195
306
  # with the model on disk recovers by itself once the serve comes up.
196
307
  log "WARN: Gemma is installed but the serve did not answer yet; auto-sense will"
@@ -133,6 +133,79 @@ function Test-ServeHealthy {
133
133
  # that sentence stays gone rather than merely de-prioritised.
134
134
  #
135
135
  # Never throws: a diagnostic must not be able to fail an install.
136
+ # -- Local-inference tuning (config.json) ------------------------------------
137
+ #
138
+ # `litert-lm serve` takes NO flags for any of this: serve accepts only
139
+ # --host/--port/--api/--cors-origin/--verbose. Every engine knob it honours comes
140
+ # from $LITERT_LM_DIR\config.json, merged per model id by
141
+ # litert_lm_cli.config.get_model_config. So this file IS the tuning surface and
142
+ # the serve stays stock.
143
+ #
144
+ # MEASURED (M4 Max 12P+4E/48G, litert-lm 0.16.0, Gemma 4 E2B, delegate asserted
145
+ # GPU from the native log, 16 warm-ups, arms interleaved, operator/SOP field set,
146
+ # the two committed CCTV fixtures): image encode 0.804 s -> 0.175 s p50 and the
147
+ # whole SOP frame 1.054 s -> 0.385 s (2.765x paired); through the stock serve
148
+ # over HTTP 1752.5 ms -> 1005.8 ms p50 (1.742x), 12/12 schema-valid on both arms.
149
+ # The vision encoder was on the CPU because NOTHING ASKED IT NOT TO -- GPU vision
150
+ # is Google's reference config and CPU is their documented fallback tier.
151
+ # speculative_decoding is written too: 1.433x on the decode-heavy schema with
152
+ # BYTE-IDENTICAL generations, so it is a speed change and not an answer change.
153
+ $script:LitertlmProbeJpegB64 = "/9j/4AAQSkZJRgABAgAAAQABAAD//gAPTGF2YzYzLjEuMTAxAP/bAEMACD4+ST5JVVVVVVVVZF1kaGhoZGRkZGhoaHBwcIODg3BwcGhocHB8fIODj5OPh4eDh5OTm5uburqystnZ4P/////EAEoAAQAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAARAQAAAAAAAAAAAAAAAAAAAAD/wAARCAAgACADASIAAhEAAxEA/9oADAMBAAIRAxEAPwAAAAAAAAD/2Q=="
154
+
155
+ function Get-LitertlmConfigPath { Join-Path $LitertDir "config.json" }
156
+
157
+ # $VisionBackend = "gpu" pins the vision encoder; "" leaves it on the CPU
158
+ # default. speculative_decoding is written EITHER WAY -- it is delegate
159
+ # independent, so it survives the fallback.
160
+ function Write-LitertlmConfig {
161
+ param([string]$VisionBackend = "")
162
+ try {
163
+ if (-not (Test-Path -LiteralPath $LitertDir)) {
164
+ New-Item -ItemType Directory -Force -Path $LitertDir | Out-Null
165
+ }
166
+ $model = [ordered]@{}
167
+ if ($VisionBackend) { $model["vision_backend"] = $VisionBackend }
168
+ $model["speculative_decoding"] = $true
169
+ $cfg = [ordered]@{ models = [ordered]@{ $ModelId = $model } }
170
+ $path = Get-LitertlmConfigPath
171
+ $tmp = "$path.tmp"
172
+ ($cfg | ConvertTo-Json -Depth 6) | Set-Content -LiteralPath $tmp -Encoding UTF8
173
+ Move-Item -LiteralPath $tmp -Destination $path -Force
174
+ $label = if ($VisionBackend) { $VisionBackend } else { "cpu-default" }
175
+ Log "wrote $path (vision_backend=$label, speculative_decoding=true)"
176
+ return $true
177
+ } catch {
178
+ Log "WARN: could not write litert-lm config.json: $_"
179
+ return $false
180
+ }
181
+ }
182
+
183
+ # One real image inference. A 200 means the vision encoder loaded AND ran on the
184
+ # backend config.json just asked for. Deliberately NOT Test-ServeHealthy:
185
+ # /v1/models answers without ever building an engine, so it cannot tell a working
186
+ # GPU encoder from one that fails on first use.
187
+ function Test-LitertlmVision {
188
+ try {
189
+ $dataUri = "data:image/jpeg;base64," + $script:LitertlmProbeJpegB64
190
+ $body = @{
191
+ model = "$ModelId,gpu"
192
+ messages = @(@{ role = "user"; content = @(
193
+ @{ type = "text"; text = "Reply with the single word: ok" },
194
+ @{ type = "image_url"; image_url = @{ url = $dataUri } }
195
+ )})
196
+ max_completion_tokens = 8
197
+ temperature = 0
198
+ } | ConvertTo-Json -Depth 8
199
+ $resp = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/v1/chat/completions" `
200
+ -Method POST -ContentType "application/json" -Body $body `
201
+ -TimeoutSec 180 -UseBasicParsing
202
+ return ($resp.StatusCode -eq 200)
203
+ } catch {
204
+ Log "vision probe did not answer: $_"
205
+ return $false
206
+ }
207
+ }
208
+
136
209
  function Get-AdvertisedModelIds {
137
210
  try {
138
211
  $response = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/v1/models" -UseBasicParsing -TimeoutSec 5
@@ -475,6 +548,10 @@ if (-not (Test-Path -LiteralPath $registration)) {
475
548
  exit 1
476
549
  }
477
550
 
551
+ # Ask for GPU vision BEFORE the serve starts: the engine is built lazily on the
552
+ # first inference, so config.json must be on disk before that request.
553
+ Write-LitertlmConfig -VisionBackend "gpu" | Out-Null
554
+
478
555
  Log "registering litert-lm serve Scheduled Task on :$Port"
479
556
  & powershell.exe -NoProfile -ExecutionPolicy Bypass -File $registration -LitertLmPath $litertlmPath -Port $Port *>> $LogPath
480
557
  if ($LASTEXITCODE -ne 0) {
@@ -495,6 +572,29 @@ if (-not $healthy) {
495
572
  exit 1
496
573
  }
497
574
 
575
+ # The GPU-vision cascade. Health only proves /v1/models answers, and that route
576
+ # never builds an engine -- so it cannot see a GPU vision encoder that fails on
577
+ # first USE. If the probe inference does not answer we fall back to the CPU
578
+ # encoder rather than leave this host unable to sense at all.
579
+ if (-not (Test-LitertlmVision)) {
580
+ Log "WARN: GPU vision encoder did not answer a probe inference; falling back to the CPU encoder"
581
+ Write-LitertlmConfig | Out-Null
582
+ & powershell.exe -NoProfile -ExecutionPolicy Bypass -File $registration -LitertLmPath $litertlmPath -Port $Port *>> $LogPath
583
+ $healthy = $false
584
+ for ($attempt = 0; $attempt -lt 60 -and -not $healthy; $attempt++) {
585
+ $healthy = Test-ServeHealthy
586
+ if (-not $healthy) { Start-Sleep -Seconds 2 }
587
+ }
588
+ if (-not $healthy) {
589
+ Fail-LocalAi "Gemma is installed, but the local AI service did not respond. Restart Windows, then retry Local AI."
590
+ Stop-SetupLock
591
+ exit 1
592
+ }
593
+ Log "local AI healthy on the CPU vision encoder (slower, but serving)"
594
+ } else {
595
+ Log "local AI healthy with the GPU vision encoder"
596
+ }
597
+
498
598
  Complete-Setup
499
599
  Stop-SetupLock
500
600
  exit 0
@@ -1 +1 @@
1
- {"version":3,"file":"CloudSensingManager.d.ts","sourceRoot":"","sources":["../src/CloudSensingManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CloudSensingManager.d.ts","sourceRoot":"","sources":["../src/CloudSensingManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EAEvB,KAAK,eAAe,EACpB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAoB,MAAM,gBAAgB,CAAC;AAErE,OAAO,KAAK,EAAoB,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEhG,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAoB,KAAK,mBAAmB,EAA6B,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AA6LtF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAS/E;AAqBD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,OAAO,CACL,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,GAChE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACpC,kBAAkB,CAAC,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxF,WAAW,IAAI,MAAM,CAAC;IACtB;;;;;;;;;;;;OAYG;IACH,sBAAsB,CAAC,IAAI;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,IAAI,uBAAuB,CAAC;CAClD;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,kGAAkG;IAClG,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;IACzC;;;;;;OAMG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,+EAA+E;IAC/E,UAAU,EAAE,OAAO,CAAC;IACpB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mFAAmF;IACnF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,8BAA8B;IAC9B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvD;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,4EAA4E;IAC5E,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG;QACxC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB;;;;;;WAMG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;;;;WAMG;QACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,yBAAyB,GAAG;QAC5C,uDAAuD;QACvD,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB;;;;;WAKG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;;WAIG;QACH,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC,GAAG;YACtD,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC,CAAC;KACJ,CAAC;IACF;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,0EAA0E;IAC1E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CAC5C;AAiED,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB,CAAS;IACnC,wEAAwE;IACxE,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAS;IACvD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IACvE;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAS;IACrD,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAS;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmB;IACjD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuD;IAClF,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAkC;IACtE,iFAAiF;IACjF,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,iBAAiB,CAET;IAChB,6EAA6E;IAC7E,OAAO,CAAC,oBAAoB,CAAuB;IACnD,6EAA6E;IAC7E,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAuB;IAC7C,wEAAwE;IACxE,OAAO,CAAC,qBAAqB,CAAS;IACtC;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,0BAA0B;IAyN/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAoBlD,kDAAkD;IAClD,qBAAqB,IAAI,MAAM;IAI/B;;;;;OAKG;IACG,sBAAsB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAsB/D,uEAAuE;IACvE,YAAY,IAAI,MAAM;IAItB,sEAAsE;IACtE,QAAQ,IAAI,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB;sFAC8E;QAC9E,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,OAAO,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAaF,2EAA2E;IAC3E,iBAAiB,IAAI,iBAAiB;IAItC;;;;;;;;OAQG;IACH,gBAAgB,IAAI;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,qBAAqB,EAAE,MAAM,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB;;;;;;WAMG;QACH,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;QACzC,mFAAmF;QACnF,kBAAkB,EAAE,MAAM,CAAC;QAC3B;;;;;;WAMG;QACH,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;QACxC,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB;;;;;WAKG;QACH,OAAO,EAAE;YACP,OAAO,EAAE,OAAO,CAAC;YACjB,wEAAwE;YACxE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;YAC9B,mDAAmD;YACnD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;YAC/B,WAAW,EAAE,MAAM,CAAC;YACpB,8EAA8E;YAC9E,WAAW,EAAE,OAAO,CAAC;YACrB,gEAAgE;YAChE,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;SAC5C,CAAC;QACF;;;;;;;WAOG;QACH,eAAe,EAAE;YACf,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;YAC3B,sBAAsB;YACtB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;YACnB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,8DAA8D;YAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;YAC3B,OAAO,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAC5C,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,MAAM,CAAC;SACtB,CAAC;QACF;;;;;;;;;;;WAWG;QACH,WAAW,EAAE,wBAAwB,CAAC;QACtC,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAC;YACjB,eAAe,EAAE,MAAM,CAAC;YACxB,aAAa,EAAE,MAAM,CAAC;YACtB;;;;;eAKG;YACH,QAAQ,EAAE,MAAM,CAAC;YACjB,yEAAyE;YACzE,qBAAqB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACxD,0EAA0E;YAC1E,kBAAkB,EAAE,MAAM,CAAC;YAC3B,sEAAsE;YACtE,gBAAgB,EAAE,MAAM,CAAC;YACzB,YAAY,EAAE,OAAO,CAAC;YACtB,iBAAiB,EAAE,MAAM,CAAC;SAC3B,CAAC,CAAC;KACJ;IAiGD,SAAS,IAAI,OAAO;IAIpB,oGAAoG;IAC9F,KAAK,CAAC,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C/D;;;;;OAKG;YACW,kBAAkB;IAyBhC;;;;;;;;;;OAUG;IACH,qBAAqB,IAAI;QACvB,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,yBAAyB,CAAC,EAAE,MAAM,CAAC;QACnC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GAAG,IAAI;IAYR,yDAAyD;IACzD,oBAAoB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IAQrF,wCAAwC;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C3B;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAuB1D;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;;;;;OAOG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAQ3E,OAAO,CAAC,cAAc;YAIR,SAAS;YAwET,kBAAkB;IAUhC;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;IAyBnB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,UAAU;IAKlB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,YAAY;IAepB;;;;;;;;;;OAUG;YACW,gBAAgB;IA6B9B;;;;;OAKG;YACW,SAAS;IA6BvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,mBAAmB;IA8B3B;;;;;;;;OAQG;IACH,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,kBAAkB;IAY1B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,gBAAgB;IA2CxB,OAAO,CAAC,cAAc;IAOtB;;;OAGG;YACW,kBAAkB;IAsBhC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,cAAc;IAYtB;;;;;;;OAOG;YACW,aAAa;IAwG3B;;;;;;;OAOG;YACW,aAAa;IA8F3B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,cAAc;IAqEtB;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IA2CtB,uEAAuE;YACzD,cAAc;IAwC5B;;;;;;;;;;;;;OAaG;YACW,MAAM;CAiCrB;AA8HD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE;IACL,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,cAAc,CAAC;IAC7D,iBAAiB,CAAC,EAAE,CAClB,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,KAAK,KACT,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,qBAAqB,CAAC;IAC9D,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;mFAC+E;IAC/E,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAChD,GACA,eAAe,EAAE,CA8EnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EAAE,EACrB,WAAW,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,cAAc,EACnD,IAAI,CAAC,EAAE;IACL,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC/C;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC,GACA,KAAK,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC,CA+EvD;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,EAAE,CA4EpE"}
@@ -327,6 +327,35 @@ class CloudSensingManager extends events_1.EventEmitter {
327
327
  // One gate for the whole process. Defaulting to one slot PER LOOP keeps the
328
328
  // cloud path (a genuinely concurrent backend) exactly as it is today; the
329
329
  // local path passes 1 because its backend is single-conversation.
330
+ //
331
+ // MEASURED 2026-08-18, and the result is worse than "no speedup" — it is
332
+ // SILENT WRONG ANSWERS, so do not raise this for the local path.
333
+ //
334
+ // Two threads, one `litert_lm.Engine`, one conversation each, real frames:
335
+ // thread 0 returned 4/4 correct generations and thread 1 returned the
336
+ // EMPTY STRING 4/4 times. No exception, no status code, no log line — each
337
+ // empty call still blocked ~2.9 s first. Serial on the same engine in the
338
+ // same process was 8/8 valid. So concurrency did not trade correctness for
339
+ // throughput, it destroyed both: 1,250 valid analyses/hour against 2,330
340
+ // serial.
341
+ //
342
+ // TWO engines, one per thread, IS safe (8/8 valid, 1.249x) — but it costs a
343
+ // second engine's private footprint (~0.9 GB; the 1.3 GB of mapped model is
344
+ // clean and shared) and it is unreachable from here anyway, because the
345
+ // process on the other end of the socket is `litert-lm serve`.
346
+ //
347
+ // And that serve settles it independently: it is `http.server.HTTPServer`,
348
+ // the SERIAL one, on BOTH 0.13.1 and the pinned 0.16.0. Measured against a
349
+ // live serve, two requests issued 0.5 ms apart: the second received its
350
+ // first byte at 19,718 ms — exactly the sum of both, i.e. it was not even
351
+ // READ until the first had fully answered. There is no overlap to harvest,
352
+ // which also rules out pipelining frame N+1's image encode against frame
353
+ // N's decode: the seam does not exist at this layer.
354
+ //
355
+ // The throughput that WAS available came from the engine's configuration, not
356
+ // from concurrency — 2.765x on the SOP schema by moving the vision encoder to
357
+ // the GPU and enabling speculative decoding. See
358
+ // docs/runbooks/cctv-local-inference-hardware-floor.md §10.
330
359
  this.admissionGate = new VlmAdmissionGate_1.VlmAdmissionGate({
331
360
  maxInFlight: Math.max(1, Math.trunc(options.maxConcurrentAnalyses ?? this.loops.length)),
332
361
  maxInFlightMs: options.maxAnalysisInFlightMs,