From 3a4776c709f7297b2568759c4ebe4128937466cd Mon Sep 17 00:00:00 2001 From: javis-bot Date: Sat, 13 Jun 2026 21:59:35 +0900 Subject: [PATCH] perf(brain): env to disable pre-loop planner; cut voice latency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Warm per-turn timing showed STT 0.1s, TTS ~1-3s, but the reply engine (LLM) was 8-17s — even a simple "고마워" took 16.7s — because it makes multiple model calls per turn. Add a PLANNER_ENABLED env override (config.py) and default it to 0 in the userbot compose so the pre-loop planner's extra LLM round-trip is dropped on this latency-sensitive voice deployment. Also pins STT_LANGUAGE=ko in compose. Co-Authored-By: Claude Opus 4.7 --- docker-compose.yml | 5 +++++ src/jarvis/config.py | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3d66366..dbe60a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -69,6 +69,11 @@ services: WHISPER_COMPUTE_TYPE: ${WHISPER_COMPUTE_TYPE:-float16} # Optional single-language lock for replies (empty = user's own language). OUTPUT_LANGUAGE: ${OUTPUT_LANGUAGE:-} + # Drop the pre-loop planner LLM call to cut voice-reply latency on small + # hardware (the planner adds a full model round-trip per turn). + PLANNER_ENABLED: ${PLANNER_ENABLED:-0} + # Lock STT to Korean (skip Whisper auto-detect). + STT_LANGUAGE: ${STT_LANGUAGE:-ko} BRIDGE_URL: http://127.0.0.1:8765 depends_on: - ollama diff --git a/src/jarvis/config.py b/src/jarvis/config.py index 2fbae32..cbc61f1 100644 --- a/src/jarvis/config.py +++ b/src/jarvis/config.py @@ -710,7 +710,15 @@ def load_settings() -> Settings: else: evaluator_enabled = bool(_eval_raw) planner_model = str(merged.get("planner_model", "") or "").strip() - planner_enabled = bool(merged.get("planner_enabled", True)) + # Env override (PLANNER_ENABLED=0/1) so a latency-sensitive voice deployment + # can drop the pre-loop planner LLM call without editing the config file. + _planner_env = os.environ.get("PLANNER_ENABLED", "").strip().lower() + if _planner_env in ("0", "false", "no", "off"): + planner_enabled = False + elif _planner_env in ("1", "true", "yes", "on"): + planner_enabled = True + else: + planner_enabled = bool(merged.get("planner_enabled", True)) try: planner_timeout_sec = float(merged.get("planner_timeout_sec", 6.0)) except (TypeError, ValueError):