
1. 為什么要在 Macbook 上折騰本地 Qwen3.6-27B 量化模型如果你手里是一臺(tái) Apple Silicon 的 Macbook又想讓 AI 編碼助手真正跑在本地MLX-LM 加載 Qwen3.6-27B 量化模型并接入 opencode 這套組合是目前比較省心的一條路。它解決的核心問(wèn)題是你不想把項(xiàng)目代碼發(fā)到云端也不想每個(gè)月為編碼訂閱付費(fèi)但又希望有一個(gè)能讀文件、能改代碼、能跑工具調(diào)用的本地 Agent 后端。MLX 是 Apple 官方開(kāi)源的數(shù)組計(jì)算框架專(zhuān)門(mén)為統(tǒng)一內(nèi)存架構(gòu)設(shè)計(jì)。模型權(quán)重、計(jì)算圖和內(nèi)存之間不需要來(lái)回拷貝這讓它在 Mac 上的推理效率比通用方案更直接。MLX-LM 則是在 MLX 之上封裝的推理與微調(diào)工具它自帶一個(gè) HTTP 服務(wù)接口形態(tài)和 OpenAI Chat Completions 基本一致默認(rèn)監(jiān)聽(tīng)127.0.0.1:8080。opencode 支持把任意兼容/v1/chat/completions的服務(wù)注冊(cè)成 provider所以兩者對(duì)接非常自然。這套方案適合誰(shuí)適合用 Macbook Pro M 系列、內(nèi)存 24GB 起步、想本地跑編碼 Agent 的開(kāi)發(fā)者。不適合誰(shuí)如果你只有 16GB 內(nèi)存或者需要同時(shí)服務(wù)多個(gè)用戶那 27B 的 4-bit 權(quán)重會(huì)非常吃力建議換更小的模型。我實(shí)測(cè)下來(lái)24GB 統(tǒng)一內(nèi)存跑 4-bit 量化是能用的但必須把并發(fā)和緩存壓到最低否則系統(tǒng)會(huì)開(kāi)始瘋狂交換內(nèi)存。Qwen3.6-27B 本身支持思考模式和工具調(diào)用這對(duì)編碼場(chǎng)景很關(guān)鍵。opencode 依賴工具調(diào)用來(lái)讀文件、寫(xiě)補(bǔ)丁、執(zhí)行命令所以模型必須能正確返回 OpenAI 格式的tool_calls。MLX-LM 的服務(wù)端代碼已經(jīng)能接收tools字段并返回對(duì)應(yīng)結(jié)構(gòu)這也是我選擇它而不是自己寫(xiě)一層適配的原因。整篇文章會(huì)按順序講清楚環(huán)境準(zhǔn)備、模型下載、服務(wù)啟動(dòng)參數(shù)、opencode 配置、端到端驗(yàn)證、常見(jiàn)報(bào)錯(cuò)排查。每一步都給可復(fù)制的命令或配置片段你可以直接跟著做。2. 前置準(zhǔn)備MLX-LM 安裝與 Qwen3.6-27B 量化權(quán)重獲取在 Macbook 上用 MLX-LM 跑 Qwen3.6-27B 量化模型第一步是把工具鏈裝好。我建議用uv來(lái)管理 MLX-LM因?yàn)樗馨衙钚泄ぞ吒綦x在獨(dú)立環(huán)境里升級(jí)和卸載都干凈。如果你還沒(méi)裝 Homebrew先執(zhí)行官方安裝腳本已經(jīng)裝過(guò)的可以跳過(guò)。/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)接著安裝 uv并刷新 shell 路徑brew install uv uv tool update-shell執(zhí)行完uv tool update-shell后一定要重新打開(kāi)終端否則mlx_lm.server可能找不到。然后安裝 MLX-LMuv tool install mlx-lm以后需要升級(jí)時(shí)用uv tool upgrade mlx-lm驗(yàn)證安裝是否成功mlx_lm.server --help如果這條命令能打印出參數(shù)列表說(shuō)明工具鏈就緒。如果提示command not found先執(zhí)行uv tool update-shell再重開(kāi)終端或者用uv tool dir --bin查看可執(zhí)行文件目錄并手動(dòng)加入 PATH。接下來(lái)是模型權(quán)重。推薦使用mlx-community/Qwen3.6-27B-4bit這是已經(jīng)為 MLX 轉(zhuǎn)換好的 4-bit 量化版本模型頁(yè)顯示文件約 16.1GB。24GB 內(nèi)存的機(jī)器跑它模型加載后還剩大約 7 到 8GB 給系統(tǒng)和 KV 緩存屬于緊但可用的狀態(tài)。下載方式有兩種。方案 A 是首次啟動(dòng)服務(wù)時(shí)自動(dòng)下載直接在啟動(dòng)命令里寫(xiě) Hugging Face 倉(cāng)庫(kù)名MLX-LM 會(huì)檢查本地緩存沒(méi)有就自動(dòng)拉取。方案 B 是下載到固定目錄適合你想明確管理模型文件位置的情況mkdir -p $HOME/Models uvx --from huggingface_hub hf download \ mlx-community/Qwen3.6-27B-4bit \ --local-dir $HOME/Models/Qwen3.6-27B-4bit下載完成后檢查目錄大小du -sh $HOME/Models/Qwen3.6-27B-4bit這里有幾個(gè)坑要避開(kāi)。BF16 版本遠(yuǎn)超 24GB不要選8-bit 通常約 30GB也放不下35B-A3B 的 4-bit 版本模型本身就接近 24GB幾乎不給系統(tǒng)和緩存留空間未標(biāo)注 MLX 的 GGUF 權(quán)重是給 llama.cpp 或 Ollama 用的MLX-LM 加載不了。選模型時(shí)認(rèn)準(zhǔn)mlx-community組織下帶-4bit后綴的 MLX 權(quán)重。如果你打算把本地推理端點(diǎn)接到 TaoToken 做對(duì)比測(cè)試可以先用 TaoToken 的模型對(duì)話頁(yè)面確認(rèn)云端 Qwen 系列的表現(xiàn)再?zèng)Q定本地量化版本是否滿足需求。TaoToken 的 API 地址是https://taotoken.net/api模型對(duì)話入口在 deep link 里可以找到。不過(guò)本文的重點(diǎn)是本地 MLX-LMTaoToken 只作為可選參照。3. 可復(fù)制配置MLX-LM 服務(wù)啟動(dòng)參數(shù)與 opencode 接入片段這一節(jié)是整篇的核心所有配置都可以直接復(fù)制。先啟動(dòng) MLX-LM 服務(wù)再寫(xiě) opencode 的 provider 配置。3.1 以 24GB 安全配置啟動(dòng) MLX-LM如果你用 Hugging Face 緩存中的模型啟動(dòng)命令如下mlx_lm.server \ --model mlx-community/Qwen3.6-27B-4bit \ --host 127.0.0.1 \ --port 8080 \ --max-tokens 2048 \ --temp 0.6 \ --top-p 0.95 \ --top-k 20 \ --decode-concurrency 1 \ --prompt-concurrency 1 \ --prefill-step-size 512 \ --prompt-cache-size 1 \ --prompt-cache-bytes 1GB \ --chat-template-args {enable_thinking:true}如果你下載到了固定目錄把--model換成絕對(duì)路徑MODEL_DIR$HOME/Models/Qwen3.6-27B-4bit mlx_lm.server \ --model $MODEL_DIR \ --host 127.0.0.1 \ --port 8080 \ --max-tokens 2048 \ --temp 0.6 \ --top-p 0.95 \ --top-k 20 \ --decode-concurrency 1 \ --prompt-concurrency 1 \ --prefill-step-size 512 \ --prompt-cache-size 1 \ --prompt-cache-bytes 1GB \ --chat-template-args {enable_thinking:true}參數(shù)逐個(gè)解釋一下。--host 127.0.0.1只允許本機(jī)訪問(wèn)不要改成0.0.0.0否則同網(wǎng)絡(luò)下其他設(shè)備可能連進(jìn)來(lái)。--max-tokens 2048限制默認(rèn)輸出長(zhǎng)度避免思考過(guò)程無(wú)限增長(zhǎng)把內(nèi)存吃滿。--temp 0.6、--top-p 0.95、--top-k 20是 Qwen 官方對(duì)精確編程任務(wù)建議的采樣參數(shù)。--decode-concurrency 1和--prompt-concurrency 1把解碼和預(yù)填充都限制為單請(qǐng)求減少內(nèi)存峰值。--prefill-step-size 512降低長(zhǎng)提示預(yù)填充時(shí)的峰值內(nèi)存。--prompt-cache-size 1只保留一份會(huì)話緩存--prompt-cache-bytes 1GB限制緩存總量。enable_thinking開(kāi)啟 Qwen3.6 的思考模式。首次建議不要啟用preserve_thinking。確認(rèn) opencode 能正確處理多輪思考內(nèi)容后可以改成--chat-template-args {enable_thinking:true,preserve_thinking:true}如果工具調(diào)用不穩(wěn)定可以測(cè)試非思考模式--temp 0.7 \ --top-p 0.8 \ --top-k 20 \ --chat-template-args {enable_thinking:false}3.2 opencode 穩(wěn)定版配置opencode 的全局配置放在~/.config/opencode/opencode.json項(xiàng)目級(jí)配置放在項(xiàng)目根目錄的opencode.json。建議先用項(xiàng)目級(jí)配置做測(cè)試確認(rèn)沒(méi)問(wèn)題再合并到全局。{ $schema: https://opencode.ai/config.json, model: mlx-local/default_model, provider: { mlx-local: { npm: ai-sdk/openai-compatible, name: MLX-LM Local, options: { baseURL: http://127.0.0.1:8080/v1, apiKey: local }, models: { default_model: { name: Qwen3.6 27B MLX 4-bit, limit: { context: 8192, output: 2048 } } } } } }這里用default_model作為模型鍵很關(guān)鍵。MLX-LM 服務(wù)端內(nèi)部提供了這個(gè)別名會(huì)把它映射到啟動(dòng)時(shí)的--model參數(shù)。這樣無(wú)論你用 Hugging Face 倉(cāng)庫(kù)名還是本地目錄啟動(dòng)opencode 都不需要知道絕對(duì)路徑也避免客戶端發(fā)送另一個(gè)倉(cāng)庫(kù)名導(dǎo)致服務(wù)嘗試切換或重新加載模型。limit.context是告訴 opencode 本地可用的上下文預(yù)算不會(huì)改變 Qwen 模型文件本身。24GB 機(jī)器先設(shè) 8192穩(wěn)定后再逐步增加。limit.output設(shè) 2048和啟動(dòng)參數(shù)里的--max-tokens保持一致。如果你已經(jīng)有opencode.json不要整份覆蓋只合并model和provider.mlx-local部分。3.3 opencode 2.0 beta 配置只有安裝了 opencode 2.0 beta 才使用本節(jié)。2.0 beta 的字段與穩(wěn)定版不同provider改為providersnpm改為packageoptions改為settings并且可以通過(guò)modelID把友好名稱(chēng)映射到 MLX-LM 的default_model。{ $schema: https://opencode.ai/config.json, model: mlx-local/qwen36-code, providers: { mlx-local: { name: MLX-LM Local, package: opencode-ai/ai/providers/openai-compatible, settings: { baseURL: http://127.0.0.1:8080/v1, apiKey: local }, models: { qwen36-code: { modelID: default_model, name: Qwen3.6 27B MLX 4-bit, capabilities: { tools: true, input: [text], output: [text] }, limit: { context: 8192, output: 2048 } } } } } }opencode 官方說(shuō)明 2.0 當(dāng)前屬于 beta不要把該配置與穩(wěn)定版字段混用。如果你不確定自己裝的是哪個(gè)版本運(yùn)行opencode --version確認(rèn)。4. 驗(yàn)證請(qǐng)求從健康檢查到端到端對(duì)話與顯存占用配置寫(xiě)完后必須一步步驗(yàn)證不要直接跳到 opencode 里跑。先確認(rèn) MLX-LM 服務(wù)本身正常再確認(rèn) opencode 能連上。4.1 健康檢查與模型列表另開(kāi)一個(gè)終端執(zhí)行curl http://127.0.0.1:8080/health預(yù)期返回{status:ok}然后查看模型列表curl http://127.0.0.1:8080/v1/models你應(yīng)該能看到default_model這個(gè)別名。如果這里報(bào)錯(cuò)說(shuō)明服務(wù)沒(méi)起來(lái)或者端口不對(duì)先回到啟動(dòng)命令檢查。4.2 測(cè)試普通對(duì)話用 curl 發(fā)一個(gè) Chat Completions 請(qǐng)求curl http://127.0.0.1:8080/v1/chat/completions \ -H Content-Type: application/json \ -d { model: default_model, messages: [ { role: user, content: 請(qǐng)用 Python 實(shí)現(xiàn)一個(gè)帶類(lèi)型標(biāo)注的 LRU 緩存并解釋復(fù)雜度。 } ], max_tokens: 1024, temperature: 0.6, top_p: 0.95, top_k: 20, stream: false }如果這個(gè)請(qǐng)求成功返回內(nèi)容說(shuō)明 MLX-LM 服務(wù)完全正常。注意model字段填default_model不要填 Hugging Face 倉(cāng)庫(kù)名。4.3 opencode 端到端驗(yàn)證確保 MLX-LM 服務(wù)仍在運(yùn)行然后查看 opencode 是否識(shí)別到模型opencode models mlx-local應(yīng)看到mlx-local/default_model接著用命令行模式跑一次只讀檢查opencode run \ --model mlx-local/default_model \ 檢查當(dāng)前項(xiàng)目的結(jié)構(gòu)只提出一個(gè)最值得優(yōu)先修復(fù)的問(wèn)題不要修改文件。也可以直接啟動(dòng) opencodeopencode進(jìn)入后運(yùn)行/models選擇 MLX-LM Local 下的 Qwen3.6。如果 opencode 要求憑據(jù)運(yùn)行/connect選擇 OtherProvider ID 填mlx-localAPI Key 填任意本地占位值例如local。MLX-LM 本地服務(wù)本身不會(huì)驗(yàn)證這個(gè)占位值。4.4 顯存占用檢查運(yùn)行時(shí)打開(kāi)「活動(dòng)監(jiān)視器 → 內(nèi)存」重點(diǎn)看三個(gè)指標(biāo)內(nèi)存壓力是否為綠色、交換內(nèi)存是否持續(xù)增長(zhǎng)、opencode 每輪對(duì)話后是否越來(lái)越慢。推薦調(diào)整順序保持上下文 8192如果內(nèi)存壓力變黃把輸出從 2048 降到 1024把--prompt-cache-bytes 1GB降為 512MB關(guān)閉瀏覽器重型頁(yè)面、Docker 和虛擬機(jī)仍然交換內(nèi)存時(shí)改用更小模型。只有在內(nèi)存壓力持續(xù)為綠色時(shí)才把 opencode 配置中的上下文依次增加為 8192 → 12288 → 16384。不要直接設(shè)成 32K、128K 或 256K。opencode 的倉(cāng)庫(kù)工具會(huì)把文件內(nèi)容、補(bǔ)丁、系統(tǒng)提示和工具定義全部計(jì)入上下文實(shí)際占用通常比普通聊天更高。4.5 工具調(diào)用測(cè)試opencode 依賴工具調(diào)用讀取和編輯項(xiàng)目。建議按以下順序測(cè)試只讀檢查項(xiàng)目讓模型讀取一個(gè)指定文件讓模型提出修改方案但不修改最后才允許小范圍編輯。測(cè)試提示列出當(dāng)前項(xiàng)目根目錄文件讀取 README.md然后總結(jié)項(xiàng)目用途。不要修改任何文件。如果模型只輸出類(lèi)似工具調(diào)用的文本卻沒(méi)有真正調(diào)用工具先升級(jí) MLX-LM確認(rèn)使用模型自帶的chat_template.jinja不要設(shè)置--use-default-chat-template覆蓋模型模板先關(guān)閉preserve_thinking測(cè)試非思考模式檢查 opencode 日志及 MLX-LM 終端是否出現(xiàn) tool parser 警告。5. 本篇常見(jiàn)錯(cuò)排查401、local proxy failed、reading choices 與 OAuth這一節(jié)對(duì)照真實(shí)報(bào)錯(cuò)給出排查路徑。如果你在接入過(guò)程中遇到問(wèn)題先在這里找對(duì)應(yīng)條目。5.1 401 Unauthorizedopencode 報(bào) 401通常是apiKey字段缺失或?yàn)榭?。MLX-LM 本地服務(wù)不驗(yàn)證 key但 opencode 的 OpenAI-compatible provider 要求這個(gè)字段存在。檢查配置options: { baseURL: http://127.0.0.1:8080/v1, apiKey: local }apiKey填任意非空字符串即可比如local。不要留空也不要?jiǎng)h掉這個(gè)字段。5.2 local proxy failed這個(gè)報(bào)錯(cuò)通常出現(xiàn)在 opencode 嘗試連接baseURL但服務(wù)沒(méi)起來(lái)或者地址寫(xiě)錯(cuò)。先確認(rèn) MLX-LM 服務(wù)在運(yùn)行curl http://127.0.0.1:8080/health如果這條命令失敗說(shuō)明服務(wù)沒(méi)啟動(dòng)或端口被占用。端口被占用時(shí)改用 8081mlx_lm.server \ --model mlx-community/Qwen3.6-27B-4bit \ --host 127.0.0.1 \ --port 8081然后把 opencode 的baseURL改成http://127.0.0.1:8081/v1。5.3 reading choices 報(bào)錯(cuò)這個(gè)報(bào)錯(cuò)說(shuō)明 opencode 收到了響應(yīng)但結(jié)構(gòu)不符合預(yù)期。常見(jiàn)原因是model字段填錯(cuò)或者 MLX-LM 返回了非標(biāo)準(zhǔn)格式。檢查 opencode 配置中的模型鍵是否為default_model以及baseURL是否包含/v1。如果用的是 2.0 beta 配置確認(rèn)modelID映射正確。5.4 OAuth 相關(guān)報(bào)錯(cuò)opencode 某些 provider 會(huì)走 OAuth 流程但 MLX-LM 是本地 OpenAI-compatible 服務(wù)不需要 OAuth。如果你看到 OAuth 相關(guān)提示說(shuō)明 provider 類(lèi)型選錯(cuò)了。確認(rèn)配置里用的是ai-sdk/openai-compatible而不是某個(gè)需要 OAuth 的官方 provider。5.5 其他常見(jiàn)問(wèn)題mlx_lm.server: command not found執(zhí)行uv tool update-shell重開(kāi)終端或用uv tool dir --bin查看可執(zhí)行文件目錄。Model type ... not supported升級(jí)uv tool upgrade mlx-lm確認(rèn)模型是 MLX 權(quán)重而不是 GGUF。opencode 報(bào) 404依次檢查curl http://127.0.0.1:8080/health和curl http://127.0.0.1:8080/v1/models確認(rèn)配置中的地址包含/v1。opencode 嘗試加載錯(cuò)誤模型確保穩(wěn)定版配置中的模型鍵是default_model并使用mlx-local/default_model。輸出只有幾百 tokens 就停止MLX-LM 默認(rèn)max_tokens是 512確認(rèn)啟動(dòng)命令包含--max-tokens 2048同時(shí)確認(rèn) opencode 中l(wèi)imit.output為 2048。服務(wù)啟動(dòng)后系統(tǒng)變得很卡模型加運(yùn)行時(shí)已接近 24GB 上限關(guān)閉其他重型應(yīng)用將緩存降至 512MB輸出降至 1024仍然卡頓則換較小模型。圖像輸入限制Qwen3.6-27B 本身帶視覺(jué)能力但當(dāng)前 MLX-LM 文本服務(wù)器會(huì)把 opencode 接入場(chǎng)景視為文本 Chat Completions服務(wù)端對(duì)消息內(nèi)容的處理只適合文本片段。opencode 中的代碼、終端輸出和文本文件可以正常使用不要期待此配置直接處理截圖或圖片附件。需要圖片輸入時(shí)使用 mlx-vlm、支持 MLX VLM 的 LM Studio或單獨(dú)建立視覺(jué)服務(wù)。6. 長(zhǎng)期編碼與 Agent 場(chǎng)景的 CTA 分流本地 MLX-LM 跑 Qwen3.6-27B 量化模型接入 opencode適合對(duì)代碼隱私敏感、想完全離線編碼的場(chǎng)景。但它也有明顯邊界24GB 內(nèi)存下上下文只能開(kāi)到 8192 到 16384并發(fā)只有 1模型切換和長(zhǎng)任務(wù)會(huì)受限于本地算力。如果你需要更長(zhǎng)的上下文、更高的并發(fā)或者想讓 Agent 跑更復(fù)雜的多步任務(wù)可以考慮把部分請(qǐng)求分流到云端。TaoToken 提供了 OpenAI-compatible 的 API 接入方式API 地址是https://taotoken.net/api。你可以把它作為 opencode 的另一個(gè) provider和本地 MLX-LM 并存按任務(wù)類(lèi)型切換。比如日常小改動(dòng)走本地長(zhǎng)上下文重構(gòu)走云端。TaoToken 的模型對(duì)話入口可以用來(lái)快速驗(yàn)證模型表現(xiàn)API Keys 管理頁(yè)面用來(lái)生成和輪換密鑰接入文檔里有完整的 Base URL、Key 和 Model ID 三件套說(shuō)明。如果你主要做長(zhǎng)期編碼和 Agent 任務(wù)可以關(guān)注 TaoToken 的 Coding Plan它針對(duì)編碼場(chǎng)景做了額度和模型路由的優(yōu)化。具體入口在 deep link 里可以找到模型對(duì)話、coding-plan、console、api-keys、doc 都有對(duì)應(yīng)頁(yè)面。配置云端 provider 時(shí)opencode 的寫(xiě)法類(lèi)似{ $schema: https://opencode.ai/config.json, provider: { taotoken: { npm: ai-sdk/openai-compatible, name: TaoToken, options: { baseURL: https://taotoken.net/api/v1, apiKey: 你的 TaoToken Key }, models: { qwen-plus: { name: Qwen Plus } } } } }注意 Base URL 要帶/v1Key 從 TaoToken 的 API Keys 頁(yè)面獲取Model ID 參考接入文檔。這樣你就有本地和云端兩條路徑按需切換。最后提醒一句MLX-LM 的 HTTP 服務(wù)只提供基礎(chǔ)安全檢查不要直接暴露到公網(wǎng)。本地開(kāi)發(fā)夠用生產(chǎn)環(huán)境需要額外的反向代理和鑒權(quán)層。