第 111 篇 · 台北 · 2026-04-21 一份持續書寫的工作日誌

oMLX 是什麼?Mac 跑 local LLM 為什麼該認識這條路

(前提:你已經照 day107 在 Mac 上架好 Ollama + Tailscale + Raycast。還沒架的先回去看那篇。)

day107 那套 Ollama + Tailscale + Raycast 架構跑短對話沒問題,但 context(對話記憶)一長就開始撞 timeout——Raycast 端等不到回應、curl 有時要快一分鐘才回。換 oMLX 之後同樣的長 context 場景順很多,MLX-native 在 Apple Silicon 上的長對話回應速度確實有差。

oMLX 是一個專為 Apple Silicon Mac 設計的 local LLM server,直接用 Apple 自己的 MLX 框架跑。Ollama 從 0.19 preview 開始也在 Mac 上改用 MLX 了,所以 "MLX vs llama.cpp" 已經不是重點。oMLX 真正的差異在兩個地方:一是 mlx-community(MLX 格式的模型庫)上有的模型它都能直接跑,不用等 Ollama 官方目錄收錄;二是它有自己的 SSD cache(把推理過程的 KV cache 暫存在硬碟,切換模型再切回來時不用重算先前的 context)機制。

架構上跟 day107 幾乎一樣(bind 到 tailnet、客戶端用 Raycast),但 oMLX 有一些跟 Ollama 完全相反的 default,每一個都被我踩到——這篇把坑跟 diff 一起寫。

【auth 是 default on——跟 Ollama 完全相反】

day107 那篇寫過一句 "Ollama 沒有 API key、沒有 token、沒有任何驗證——誰連到那個 port 直接等於誰能用你的 LLM"。在 Ollama 的世界這是對的。oMLX 反過來——

第一次啟動就會在 settings.json 裡塞一把自動生成的 API key:

"auth": {
  "api_key": "uty5xxx...czu",
  "skip_api_key_verification": false
}

沒帶 Bearer token(通行密碼)打 /v1/models 直接吐:

{"error": {"message": "API key required", "type": "authentication_error"}}

兩種處理方式:

→ 保留驗 key,把 key 複製到 Raycast——雙層保護(tailnet + bearer) → 改 skip_api_key_verification: true,純靠 Tailscale ACL 擋

我選第一種。Tailscale ACL(存取控制規則)雖然夠嚴,但哪天 laptop 被偷、tailnet 被 compromise,bearer token 多卡一層沒壞處。

這個預設差異值得記:同一族工具(local LLM server on Mac),Ollama 認為 "網路邊界 = auth 邊界",oMLX 認為 "network + token 雙因素"。沒有絕對對錯,但架構上要先知道自己在用哪種假設。

【Raycast 那端的雷:Local Models 看不到 oMLX】

day107 在 Raycast 用的是 Local Models 功能(Settings → AI → Local Models),那個是 Ollama-only、寫死 port 11434 的 Ollama API。oMLX 是 OpenAI-compatible + Anthropic-compatible 雙協議(跟 ChatGPT 和 Claude 講同一種 API 語言),Local Models 根本看不到它。

要走另一個入口:Custom Providers(Raycast 叫這功能 BYOM——Bring Your Own Model)。Settings → AI → Custom Providers → Reveal Providers Config,會跳出 ~/.config/raycast/ai/providers.yaml

貼這段進去:

providers:
  - id: omlx-pro
    name: oMLX @ Pro
    base_url: http://dawsons-macbook-pro:8000/v1
    api_keys:
      omlx: u......czu
    models:
      - id: Qwen3.6-35B-A3B-4bit
        name: Qwen3.6 35B A3B (4-bit) — Pro
        provider: omlx
        context: 32768

第一次我寫成 api_key:(單數、string)就爆了,Raycast 跳 unable to access AI — authorization failed——看起來像訂閱或帳號問題,繞了一大圈才發現只是欄位名寫錯。

對 oMLX 有興趣的話可以參考這篇 https://hackmd.io/@BASHCAT/r1X6UfQc-x

還沒看 day107 的可以回去補——那篇從零架 Ollama + Tailscale + Raycast,是這篇的前置作業。

投影片
Day 111 slide 1Day 111 slide 2Day 111 slide 3Day 111 slide 4Day 111 slide 5Day 111 slide 6
1 / 6
延伸閱讀 看完整 137 篇 →