Mori

DOCS

Logs

EVENT LOG · 7-LAYER OBSERVABILITY

Mori 把每一輪 voice pipeline / agent call 拆成 7 個 layer,每層做完寫一條 JSONL event 到 ~/.mori/logs/mori-YYYY-MM-DD.jsonl。Append-only、一天一檔、明文 JSON,不需要 DB。

7 個 layer

從 wake event 觸發到 Mori 回應完成,事件鏈大致是:

  1. wake_word_event — Hey Mori 偵測到,score / threshold
  2. speaker_id_pass / speaker_id_reject — 聲紋比對(若 speaker_id.enabled)
  3. transcribe — Whisper STT 出 transcript
  4. evaluator_decision — 過 fast LLM 判 intent(若 evaluator.enabled)
  5. llm_call — agent 跑時主 LLM call,可能多輪(tool calls)
  6. skill_dispatch — agent 呼叫某個 skill(translate / polish / shell skill / 動作 skill 等)
  7. agent_completed — 該輪 agent loop 全部 done,寫 response_chars + skill_calls list

另外還有獨立事件:spawn_error(CLI provider 啟動失敗)、error(雜項)。

Logs tab

主視窗左側 sidebar 「Logs」 tab:

每筆 row 點開 → 看完整 JSON。Evaluator row 額外顯示三色 outcome chip(綠 = proceed,灰 = skip,黃 = ask_back),不展開也看得出該輪走哪條路。

Schema 範例 — evaluator_decision

{
  "ts": "2026-05-19T15:30:42.123Z",
  "kind": "evaluator_decision",
  "intent": "Unclear",
  "reason": "半截話",
  "confidence": 0.68,
  "confidence_threshold": 0.85,
  "outcome": "ask_back",
  "skip": true,
  "clarifying_question": "然後呢?"
}

Intent 三種:AddressMori / BackgroundNoise / Unclear。Outcome 三種:proceed / skip / ask_backclarifying_question 只在 outcome=ask_back 時出現。

Schema 範例 — llm_call

{
  "ts": "2026-05-19T15:30:43.456Z",
  "kind": "llm_call",
  "provider": "gemini",
  "model": "gemini-2.5-flash",
  "latency_ms": 1340,
  "ok": true,
  "output_chars": 280,
  "tool_calls": ["translate"]
}

Logs vs Recordings

兩個系統互補:

系統 用途 大小
~/.mori/logs/ 事件摘要 — filter / 統計 / 找 pattern 輕(~KB / 天)
~/.mori/recordings/ 每輪完整 I/O(audio / transcript / prompt / context)— 重播、訓資料、debug 重(~MB / session)

Logs 永遠開啟、留 30+ 天無壓力。Recordings 預設保留 14 天可調(Recordings tab → retention)。

隱私

兩個目錄都 100% 本機,Mori 不會上傳到任何雲端。要刪自己刪:

rm -rf ~/.mori/logs/
rm -rf ~/.mori/recordings/

Logs tab 沒提供 UI 刪除單筆 — 因為 logs 是 append-only diagnostic data,刪單筆失去意義。Recordings tab 有 per-session 刪 + retention 自動清。