Mori 把每一輪 voice pipeline / agent call 拆成 7 個 layer,每層做完寫一條 JSONL event 到 ~/.mori/logs/mori-YYYY-MM-DD.jsonl。Append-only、一天一檔、明文 JSON,不需要 DB。
從 wake event 觸發到 Mori 回應完成,事件鏈大致是:
wake_word_event — Hey Mori 偵測到,score / thresholdspeaker_id_pass / speaker_id_reject — 聲紋比對(若 speaker_id.enabled)transcribe — Whisper STT 出 transcriptevaluator_decision — 過 fast LLM 判 intent(若 evaluator.enabled)llm_call — agent 跑時主 LLM call,可能多輪(tool calls)skill_dispatch — agent 呼叫某個 skill(translate / polish / shell skill / 動作 skill 等)agent_completed — 該輪 agent loop 全部 done,寫 response_chars + skill_calls list另外還有獨立事件:spawn_error(CLI provider 啟動失敗)、error(雜項)。
主視窗左側 sidebar 「Logs」 tab:
evaluator_decision 看所有意圖判斷groq / gemini / claude-bash 等)evaluator_decision 時顯示;可篩 proceed(走 agent)/ skip(背景噪音)/ ask_back(Mori 反問)每筆 row 點開 → 看完整 JSON。Evaluator row 額外顯示三色 outcome chip(綠 = proceed,灰 = skip,黃 = ask_back),不展開也看得出該輪走哪條路。
{
"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_back。clarifying_question 只在 outcome=ask_back 時出現。
{
"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"]
}
兩個系統互補:
| 系統 | 用途 | 大小 |
|---|---|---|
~/.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 自動清。