Mori

DOCS

Providers

CONFIG · COMBINATIONS · ROUTING

Mori 啟動時自動建 ~/.mori/config.json(第一次跑會看到 stub)。 從 Config tab 編,或直接改檔案。下面四種組合任選 — 改完不需要重啟,下一次熱鍵會即時讀新設定。

組合 A — 純雲(預設)

設好 Groq key 就能用。Free tier 涵蓋 Whisper(每天 7,200 秒)+ chat,個人用足夠。

{
  "provider": "groq",
  "stt_provider": "groq",
  "providers": {
    "groq": {
      "api_key": "gsk_...",
      "model": "openai/gpt-oss-120b",
      "stt_model": "whisper-large-v3-turbo"
    }
  }
}

console.groq.com → API Keys 拿 key。

組合 A+ — 加 Gemini

Gemini API 走 OpenAI-compat 端點,差別只在 base_url 跟 key。適合丟給「便宜 + 創意寫作 + 翻譯」這類 profile。

{
  "provider": "groq",
  "stt_provider": "groq",
  "api_keys": {
    "GEMINI_API_KEY": "AIza..."
  },
  "providers": {
    "groq":   { "api_key": "gsk_...", "model": "openai/gpt-oss-120b", "stt_model": "whisper-large-v3-turbo" },
    "gemini": { "model": "gemini-3.1-flash-lite-preview" }
  }
}

Profile 寫 provider: gemini 即啟用該模型。Key 從 OS env GEMINI_API_KEYapi_keys.GEMINI_API_KEY 取(env 優先)。

組合 B — 100% 本機(離線、不依賴雲)

{
  "provider": "ollama",
  "stt_provider": "whisper-local",
  "providers": {
    "ollama": {
      "base_url": "http://localhost:11434",
      "model":    "qwen3:8b"
    },
    "whisper-local": {
      "model_path":    "/home/<user>/.mori/models/ggml-small.bin",
      "server_binary": "/home/<user>/.mori/bin/whisper-server",
      "language":      "zh"
    }
  }
}

需要先:

中文模型大小取捨(Intel CPU 實測):base 142MB(快但常分不清同音字)/ small 466MB(夠用)/ medium 1.5GB(更準但慢)。

架構:Mori 不編 whisper.cpp,改 shell-out 子程序

v0.2 之後,Mori 不再 in-process 編 whisper.cpp C++ source 進 binary,改成 spawn 官方 whisper-server 子程序,HTTP POST WAV 給它。 Mori 第一次按 Ctrl+Alt+Space 時 lazy spawn,之後常駐;Mori 結束時 SIGKILL 收尾。

好處:

替換引擎(GPU 加速 / 自編變體)

whisper.cpp releases 提供多種預編 binary:

變體適合誰速度提升
whisper-bin-x64.zip所有人預設(純 CPU)基準
whisper-blas-bin-x64.zip多核心 CPU 想榨更多~30%
whisper-cublas-cuda12-bin-x64.zipNVIDIA RTX / Tesla3-5x
whisper-clblast-bin-x64.zipAMD / Intel GPU(OpenCL)2-3x
macOS binaryApple Silicon自帶 Metal,2-4x

替換流程:

  1. 從 whisper.cpp release 頁下載你要的變體 zip
  2. 解壓後找出 whisper-server(Linux)或 whisper-server.exe(Win)
  3. 整套(binary + 相依 .dll / .so)複製到 ~/.mori/bin/(Win 是 %USERPROFILE%\.mori\bin\)
  4. (Unix)chmod +x whisper-server
  5. 重啟 Mori — 下次 Ctrl+Alt+Space 起來的就是 GPU 版,Mori 程式碼一行都不用改

同時保留多版本(CPU + GPU 切換)?把 GPU 版放別處,在 config.json 寫絕對路徑:

"providers": {
  "whisper-local": {
    "server_binary": "/opt/whisper-cuda/whisper-server",
    "model_path":    "~/.mori/models/ggml-large-v3-turbo.bin",
    "language":      "zh"
  }
}

替換模型

同檔 .bin 在 Linux / Windows / macOS 通用 — 不依平台。Hugging Face ggerganov/whisper.cpp 有所有 ggml 格式 whisper 模型:

檔名大小適合
ggml-tiny.bin78 MB最快,只夠英文清晰錄音
ggml-base.bin142 MB低階機 / 英文場景
ggml-small.bin466 MBMori 預設,中文夠用
ggml-medium.bin1.5 GB專有名詞 / 多語混雜
ggml-large-v3.bin3.1 GB最準,需要 GPU 才不慢
ggml-large-v3-turbo.bin1.6 GBlarge-v3 蒸餾版,2x 快

下載任意 .bin~/.mori/models/,在 config 把 providers.whisper-local.model_path 指到那個檔即可。

組合 C — Bash CLI proxy(claude / gemini / codex 當 agent)

用 user 自己的 Pro/Max quota,透過 Bash tool 呼叫本機 mori CLI dispatch skill。

{
  "provider": "claude-bash",
  "stt_provider": "whisper-local",
  "providers": {
    "claude-bash": {
      "binary": "claude",
      "model": null,
      "mori_cli_path": null
    },
    "whisper-local": {
      "model_path":    "/home/<user>/.mori/models/ggml-small.bin",
      "server_binary": "/home/<user>/.mori/bin/whisper-server",
      "language":      "zh"
    }
  }
}

需要:

流程:Ctrl+Alt+Space → STT(whisper-local)→ claude-bash 啟動 claude --print 子程序 → claude 看 system prompt 知道有 mori CLI → 透過 Bash tool 跑 mori skill <name> → mori CLI HTTP 到主程式 dispatch skill → 結果回 claude → claude 給最終回應。

類似的還有 gemini-bash / codex-bash,把 "binary" 換成 "gemini" / "codex" 即可。

Windows 短名 binary 自動探 .cmd shim(v0.4.0+): geminicodex 在 Windows 是 npm 裝的 .cmd shim (%APPDATA%\npm\gemini.cmd),Rust Command::new 只自動補 .exe 不補 .cmd。v0.4.0 加了 cli_command() helper: binary 是短名時自動探 PATH 上的 .exe.cmd.bat, 找到 .cmdcmd /C 規避 Rust 1.77.2+ 的 CVE-2024-24576 batch file 限制。**Linux / Windows 現在用同一份短名寫法**,Win 用戶不必再記 .cmd 規矩。詳見 Troubleshooting → Windows Bash CLI 不能 spawn

Codex 在 Windows 注意:@openai/codex npm package 0.7 系列是 @native release(`use-native` 旗標),只有 Linux / macOS native binary,**Windows 不支援會 直接拒絕跑**(`Unsupported platform: win32`)。v0.130+ 改純 JS impl 才跨平台。 npm install -g @openai/codex 後若 codex --version 報錯,升級到 0.130+ 試試。

進階:per-skill provider 路由

agent 跟個別 skill 可走不同 provider 省 Groq TPD:

{
  "provider": "groq",
  "routing": {
    "agent": "groq",
    "skills": {
      "translate": "claude-cli",
      "polish":    "claude-cli",
      "summarize": "claude-cli",
      "compose":   "ollama"
    }
  }
}

沒設 routing 整套退回頂層 provider

還有 chat-only 變體 gemini-cli / codex-cli — 可用在 routing.skills, 省略 agent 旗標(--yolo / --dangerously-bypass-approvals-and-sandbox), non-TTY 下 tool 執行無法被核准 → 實質純文字 in/out。

{
  "providers": {
    "gemini-cli": { "binary": "gemini" },
    "codex-cli":  { "binary": "codex" }
  }
}

binary 選填,預設靠 PATH 找。

進階:自訂 OpenAI-compat 端點

Azure OpenAI / OpenRouter / 自家代理 / 任意 OpenAI-compat 端點都能掛進 mori 當「具名 provider」用 — 端點細節集中在 ~/.mori/config.json,profile 內 只寫 provider: <custom-name>:

{
  "api_keys": {
    "AZURE_OPENAI_API_KEY": ""
  },
  "providers": {
    "azure-gpt41": {
      "api_base":     "https://your-resource.openai.azure.com/openai/v1",
      "api_key_env":  "AZURE_OPENAI_API_KEY",
      "model":        "gpt-4.1"
    },
    "openrouter-sonnet": {
      "api_base":     "https://openrouter.ai/api/v1",
      "api_key_env":  "OPENROUTER_API_KEY",
      "model":        "anthropic/claude-sonnet-4"
    }
  }
}

規則:

Profile 內怎麼用:

---
provider: azure-gpt41    # 對應上面 providers.azure-gpt41
stt_provider: groq
enable_read: true
---
profile body...

同 mechanism 也能塞進 routing.skills:某個 skill 走 Azure、其他走 Groq:

{
  "routing": {
    "agent": "groq",
    "skills": {
      "polish": "azure-gpt41"
    }
  }
}

進階:語音輸入 cleanup_level

從 tray / UI 切到「輸入模式」後,熱鍵語意變 dictation。Cleanup 三級可挑:

{
  "voice_input": {
    "cleanup_level": "smart"
  },
  "routing": {
    "skills": {
      "voice_input_cleanup": "groq"
    }
  }
}

voice_input_cleanup provider 推薦 groq(gpt-oss-120b 1-2 秒 + 中文標點品質好)。釘 claude-cli 跑 user 自己 quota 也行。

進階:Fallback chain

主 provider 失敗(429 quota / timeout / network / 5xx 都算)時自動切下一個 provider 重試 — opt-in,沒設就維持「error + cancel 該次行為」的安全預設。

{
  "routing": {
    "agent": "groq",
    "fallback_chain": {
      "agent":               ["ollama", "claude-bash"],
      "voice_input_cleanup": ["gemini"]
    }
  }
}

規則:

Key 探測順序

  1. OS 環境變數(如 GROQ_API_KEY)
  2. ~/.mori/config.jsonproviders.<name>.api_key
  3. ~/.mori/config.jsonapi_keys.<NAME>_API_KEY

Profile 層覆蓋

個別 profile 可在 frontmatter 覆寫全域設定:

---
provider: gemini          # 這個 profile 用 gemini,即使全域是 groq
stt_provider: groq        # STT 仍走 groq(覆蓋 whisper-local)
cleanup_level: minimal
enabled_skills: [translate, polish]   # 留空 = 全開
---

profile body 內容(人格 / 行為指示)...