跳到主要內容

【2026 最新】Mellum 2.1 本機 Coding Agent 怎麼接 Pi?小型 Repo 修補六步教學

最後更新: ·
Mellum 2.1 本機 Coding Agent:用 Pi 接入並核對修補差異與固定測試

你讓本機模型回答一道程式題,它講得頭頭是道;換成「請讀專案、改檔案、重跑測試」,卻可能停在一段建議。Mellum 2.1 本機 Coding Agent 教學要解決的,就是從「會說」走到「有可檢查的修改」這段距離。

這篇寫給第一次接觸本機 Agent、願意把指令貼進終端機的讀者。先分清模型、執行程式與工具,再用 Pi 修一個只有兩份 JavaScript 檔案的小專案。你會學會接入 GGUF、檢查工具是否真的執行、保留差異,以及遇到錯誤時怎麼停下來。

以下依截至 2026 年 10 月 10 日的官方文件整理。本次執行環境未備妥 Mellum 推論 runtime 與模型權重,因此沒有進行 Mellum/Pi 端到端跑次;小專案是本文自建的練習,標準答案由本機 Node.js 驗算。模型接入與故障流程是供你操作、逐項填結果的驗收方法。

先說結論:Mellum 2.1 本機 Coding Agent 要過三關

可用的修補=模型回應+工具真的執行+固定測試通過。把它想成請師傅修門:師傅說得出做法、拿得動工具、修完門能開關,是三件不同的事。第一天只修一個可逆的小問題,比一次請它做完整網站更容易知道哪裡成功。

Mellum 2.1 本機 Coding Agent 的回應、工具與驗收三道關口
教學設計:連線成功之後,仍需逐項檢查工具紀錄與固定測試。

五個零件:誰負責想、誰負責動手?

① Mellum:「提出下一步的腦」。JetBrains 原始模型卡將它描述為 Thinking 模型,可用於 repository、命令與工具任務。MoE(Mixture of Experts,混合專家)像一個部門有很多專家,每一步只派一部分出場;12B 是總參數,2.5B 是活躍參數,不等於只要放下一個 2.5B 模型的記憶體。

② GGUF:「裝好權重的檔案」。量化是在保留模型可用性的前提下,用較低精度保存部分數值。檔案較小有助於載入,但選了量化名稱,仍要核對實際檔案與機器能留給推論的空間。

③ llama.cpp:「把模型跑起來的引擎」。它的 server 接收請求、套用聊天模板,再把輸出交回用戶端。聊天模板像包裝規則:同一句工具要求,必須用模型認得的格式放進去;只看 HTTP 回傳 200,還不足以驗收格式。

④ Pi:「把建議接成動作的執行層」。Pi 1.1.0 的 CLI 文件列出 read、bash、edit、write 等工具。模型提出工具名稱和參數,Pi 才執行讀檔或修改,把結果送回模型。這就是 Agent Harness 的分工。

⑤ Git 與測試:「交付收據」。Git 保存修改前後;測試回答行為是否符合題目。二者放在模型之外,就像修門前先拍照、修門後照同一份檢查單驗收。把這種流程寫成系統,可接著讀 建立 Agent Harness。

① 先選檔案與記憶體:別把活躍參數當成容量

痛點是「我的顯卡有 8GB,是否就能跑?」先看 官方 GGUF 檔案頁:圖中的容量是下載檔大小,另有 KV cache(保存對話計算狀態的快取)、runtime 與工作區開銷。顯卡記憶體、系統 RAM、Apple 統一記憶體,也不是同一個容量欄位。

Mellum 2.1 官方 GGUF 量化檔大小與記憶體選擇
檔案大小依 JetBrains GGUF 模型卡,採十進位 GB、約數;不是整機或顯卡最低容量。

本篇用官方推薦的 Q4_K_M 做設定示例,先以 CPU、較短 context 起步。下載前留出檔案、建置與日誌空間,再檢查可用 RAM;如果載入失敗或系統大量交換記憶體,就停在容量關,先降低 context 或改用能承載的機器。改量化時另開一份設定紀錄,不要和 runtime 升級一起做。

官方寫的 131,072 tokens 是模型 context 規格;本練習把 server 設為 16,384,是為了小專案驗收而選的值,並非最低需求或效能保證。先把一個小任務跑清楚,再試較長上下文。

② 固定版本:建立自己的練習資料夾

先在新的空資料夾工作,使用 macOS/Linux 的 shell。需要已安裝 Node.js 22.19 或更新版本、npm、Git、CMake 與 C++ 編譯工具;用 node --version、npm --version、git --version、cmake --version 逐項檢查。缺哪個就先完成該工具的官方安裝,不要直接跳到模型錯誤排查。

mkdir mellum-lab
cd mellum-lab
mkdir models
npm install --prefix ./pi-cli --ignore-scripts --save-exact @earendil-works/pi-coding-agent@1.1.0
git clone --branch v0.6.0 --depth 1 https://github.com/ggml-org/llama.cpp.git llama-runtime
cmake -S llama-runtime -B llama-runtime/build
cmake --build llama-runtime/build --config Release --target llama-server -j 2

這是專案內的 Pi 安裝與固定版號的 llama.cpp 原始碼建置。--ignore-scripts 跳過 npm 依賴生命週期腳本;保留 pi-cli/package-lock.json,才能記錄這輪解析到的依賴。建置方式對照 llama.cpp v0.6.0 建置文件;GPU 後端與 Windows 的選項另有差異,本篇先不混入。

接著下載固定模型 revision。下面會下載約 8.1GB 權重;先完成容量判斷,再執行。模型 revision 固定為 20b439426f1e997ba575eaccaf4856ac0f76f5d5,不使用會移動的 main。

curl --fail --location --retry 3 \
  "https://huggingface.co/JetBrains/Mellum2.1-12B-A2.5B-Thinking-GGUF/resolve/20b439426f1e997ba575eaccaf4856ac0f76f5d5/Mellum2.1-12B-A2.5B-Thinking-Q4_K_M.gguf" \
  --output models/Mellum2.1-12B-A2.5B-Thinking-Q4_K_M.gguf
./pi-cli/node_modules/.bin/pi --version
./llama-runtime/build/bin/llama-server --version
git -C llama-runtime rev-parse HEAD
shasum -a 256 models/Mellum2.1-12B-A2.5B-Thinking-Q4_K_M.gguf

將版號、Git commit、權重檔名和 SHA-256 摘要存成筆記。最後一行是 macOS 的檔案雜湊命令;Linux 可用 sha256sum 計算同一檔案。它是這輪的檔案識別紀錄,請另與固定 revision 的官方檔案 metadata 核對,別把自行算出的摘要當成原廠認證。

③ 啟動本機端點:先驗連線,再驗工具

./llama-runtime/build/bin/llama-server \
  -m models/Mellum2.1-12B-A2.5B-Thinking-Q4_K_M.gguf \
  --alias mellum-local --host 127.0.0.1 --port 8080 \
  --ctx-size 16384 --parallel 1 --n-gpu-layers 0 --jinja --reasoning-format deepseek \
  --temp 0.6 --top-p 0.95 --top-k 20

這個終端機保持開著。127.0.0.1 讓端點只綁本機 loopback;--n-gpu-layers 0 選 CPU 起步,速度需在你的機器量。--alias mellum-local 則讓用戶端用一致名稱請求,不必猜模型檔案路徑。參數可查 固定版本 server 文件。

另開一個終端機,回到 mellum-lab。先用 curl --fail http://127.0.0.1:8080/health 看載入狀態,再執行下列小請求,把原始回應留下:

curl --fail http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  --data '{"model":"mellum-local","messages":[{"role":"user","content":"Reply with READY."}],"max_tokens":512,"temperature":0.6}' \
  --output chat-check.json

這只驗請求有沒有到正確端點,以及回答是否完整。Thinking 可能先消耗輸出額度;若回應截斷,先看 finish_reason 和回傳內容,再調整輸出上限。不要把純文字裡的工具標籤當作已執行:工具必須由 server 解析,並由 Pi 留下執行結果。

④ Mellum 2.1 本機 Coding Agent 接上 Pi:設定只放這一輪

先建專用 profile,讓練習設定和你原有的 Pi 設定分開。將下面 JSON 存成 pi-profile/models.json;先執行 mkdir pi-profile,再用文字編輯器建立檔案。Pi 的自訂 endpoint 文件確認這條路用 openai-completions,名字雖然有 completions,對應的是聊天介面。

{
  "providers": {
    "mellum-lab": {
      "baseUrl": "http://127.0.0.1:8080/v1",
      "api": "openai-completions",
      "apiKey": "none",
      "models": [
        {
          "id": "mellum-local",
          "name": "Mellum local lab",
          "reasoning": true,
          "input": [
            "text"
          ],
          "contextWindow": 16384,
          "maxTokens": 4096,
          "compat": {
            "supportsReasoningEffort": false,
          "supportsStore": false,
          "supportsDeveloperRole": false,
          "maxTokensField": "max_tokens"
          }
        }
      ]
    }
  }
}

apiKey: none 是本機示例的假值,不是向雲端取得的金鑰。contextWindow 要與這輪 server 設定一致;maxTokens 是包含思考的總生成預算,不能把它讀成會產出這麼長的可見答案。相容性設定使用固定版 server 的 max_tokens 欄位,不傳 store、developer role 或 reasoning_effort;這些欄位不代表關閉模型思考。

⑤ 建一個兩檔 Repo:驗收答案先寫好

本例只改「去除輸入文字首尾空白」一個行為,保留大小寫轉換、內部空格與既有連字號規則。repository(Repo,程式碼資料夾與版本紀錄)放在 mellum-lab/toy-repo。先執行 mkdir toy-repo,再建立兩份檔案。

slug.mjs 是故意留了一個問題的程式:

export function slugify(text) {
  return text.toLowerCase().replaceAll(' ', '-');
}

slug.test.mjs 是固定驗收清單,Agent 全程不得修改:

import test from 'node:test';
import assert from 'node:assert/strict';
import { slugify } from './slug.mjs';

for (const [input, expected] of [
  ['Hello World', 'hello-world'],
  ['  Hello World  ', 'hello-world'],
  ['', ''],
  ['   ', ''],
  ['Keep--Dash', 'keep--dash'],
]) {
  test(JSON.stringify(input), () => {
    assert.equal(slugify(input), expected);
  });
}

先自己執行測試,再存起點。此處預期五個案例中,首尾空白與全空白兩題失敗;這是本文對 fixture 的本機驗算結果,與 Mellum 成績無關。Node.js test runner是這份驗收的執行工具。

cd toy-repo
node --test slug.test.mjs
git init
git add slug.mjs slug.test.mjs
git -c user.name="Tutorial Learner" -c user.email="learner@example.invalid" commit -m "baseline fixture"

接著先開只提供 read 的 Pi;這輪不提供 bash、edit 或 write。先在 pi-profile 資料夾執行 pwd,複製印出的完整路徑。回到 toy-repo,把下方 /absolute/path/to/mellum-lab/pi-profile 換成剛才的路徑:

export PI_CODING_AGENT_DIR="/absolute/path/to/mellum-lab/pi-profile"
../pi-cli/node_modules/.bin/pi \
  --offline --no-extensions --no-mcp --no-skills \
  --no-prompt-templates --no-context-files --no-approve \
  --provider mellum-lab --model mellum-local --tools read

貼入:請用 read 工具讀取 slug.mjs;只報告實際讀到的函式名稱,不修改檔案。你要看到 Pi 的 read 呼叫與檔案內容結果,才算第二關通過。如果只看到模型描述「我已讀取」,先停下來核對工具紀錄。可參考 本機模型工具呼叫驗收 的分層思路。

離開只讀 session,再用同樣參數把最後一段改成 --tools read,bash,edit,write,開始修補。這些開關用來減少本輪自動載入資源;--offline 抑制自動網路活動,read 工具也不限制可讀路徑。Pi 的工具仍以目前使用者權限執行,這不是作業系統沙箱。依 Pi 安全文檔,應以隔離環境承載需要硬性權限邊界的任務。這裡只放自己建立的無憑證練習檔。

只處理目前 toy-repo。先讀 slug.mjs 與 slug.test.mjs,
再執行 node --test slug.test.mjs,根據失敗定位原因。
只修 slugify 對輸入首尾空白的處理;保留既有大小寫、
內部空格與連字號行為。不修改測試、不安裝套件、
不連外、不提交 commit。完成後重跑同一測試,
報告工具錯誤、修改差異及測試結果。
若需要擴大任務範圍,先停下來說明。

這段提示是任務規格,不是強制權限政策。正確修補的一個答案是把回傳式改成 text.trim().toLowerCase().replaceAll(' ', '-')。Agent 結束後,由你在另一個終端機獨立執行下列驗收,別讓它自己改標準答案:

git diff --check
git diff -- slug.mjs slug.test.mjs
git status --short
node --test slug.test.mjs

接受條件是測試檔零差異、只有 slug.mjs 的預定行為被改、五題全過。模型說「完成」只是一則訊息;這四個檢查才是交付收據。

⑥ 故意讀錯一個檔案:練習停手、重試與回復

另開只讀 session,先給它一個明確錯誤任務:只呼叫一次 read,讀取 missing-demo.mjs。遇到錯誤就停止並轉述工具回傳,不猜內容,也不改其他檔案。這個檔案刻意不存在。你要保存原始工具錯誤、是否真的停下,以及它有沒有聲稱成功。

若停下,再發第二則提示:剛才指定錯檔;現在只讀 slug.mjs,回報實際內容。第一輪錯誤與第二輪成功分開記。若它持續重試、虛構內容或轉去別的路徑,用 Esc 中止,保留 session;不要讓錯誤靠更多自動步驟被蓋掉。這是錯誤恢復練習,不是本文已觀察到的 Mellum 失敗率。

回復也只針對自己剛建立的 fixture:先保存 git diff -- slug.mjs 的內容,再執行 git restore --source=HEAD -- slug.mjs,核對差異清空、原本兩題失敗重新出現。這個 restore 會丟棄 slug.mjs 尚未提交的修改;不要搬去有他人未保存工作的資料夾。

三個常見坑:從出錯的位置往回查

連線成功,工具卻沒動。先核對 endpoint、模型 alias、工具是否有列出,以及 Jinja 模板與解析。不要先換五個參數;把「server 收到」「回傳可解析呼叫」「Pi 有執行結果」各存一份證據。

測試全綠,但題目被改了。看測試檔是否有差異,再看未追蹤檔案。刪掉失敗案例、增加跳過條件,也可能讓測試變綠;所以測試通過要和修改範圍一起驗。

一個成功跑次被當成全面能力。官方模型卡的 Agent 評測有自己的 harness、context 與 sampling;本篇選的量化、CPU、短 context 不是那套配置。不同測試/版本不可直接互比。將同一任務重跑,記錄每次錯誤、時間與差異,才有你自己的使用證據。

常見問題:八個直接答案

1. 2.5B 活躍參數,代表只占 2.5B 的記憶體嗎?

不是。活躍參數描述每一步計算;權重檔與其他記憶體開銷另算。

2. 8GB 顯卡一定能跑完整長 context 嗎?

不能由容量標籤推定。先核對量化檔、快取與 runtime,再量自己的載入與任務。

3. 一定要把原有 Pi 設定覆蓋掉嗎?

本篇不用。專用 PI_CODING_AGENT_DIR 保存這輪 models.json,原設定另留。

4. apiKey 的 none 是不是免費雲端方案?

不是。它是本機未配置驗證端點的假值,運算在你指定的 server。

5. 模型輸出工具格式,就算讀檔成功嗎?

還要看 Pi 執行結果。名稱與參數被解析後,檔案內容才是這輪讀取證據。

6. –no-approve 能隔離檔案權限嗎?

不能。它忽略信任門控的專案設定與資源,工具仍有使用者權限。

7. 第一個任務應該做大型新專案嗎?

先選小修補。已知標準答案與可回復起點,讓你容易定位錯在模型、工具或驗收。

8. 五題全過後,下一步做什麼?

先重跑同題並保留紀錄,再增加一個邊界案例;不要同時換模型、量化與 runtime。

給新手的三個重點

先固定檔案與版本,再談速度;先讀一份檔案,再開修改工具;先保持測試不動,再接受修補。每次任務留下一份版本筆記、工具結果、Git 差異與測試輸出,出錯時才知道要從哪一層修。

接著閱讀

左右滑動查看更多推薦

下一步:交出第一份能核對的修補

今天先走完一輪:保存起點、只讀成功、修首尾空白、固定測試全過,再做一次錯檔與回復。記住模型回應+工具真的執行+固定測試通過;你學會的是怎麼接受一份程式修改。想拓展下一個任務,可到 AI 文章專區,或從 AlphaLab 課程安排完整的學習路徑。

ALPHALAB 社群

有問題?來 Telegram 聊

和 Terry、編輯、其他網友一起討論這篇文章。提問、分享觀點,回覆更即時。

加入 Telegram 討論

📩 訂閱 AlphaLab 電子報

每週最多三封:一封 Weekly 週報與最多兩封關鍵 Alpha Signal。

我們不會 spam,隨時可退訂。已訂閱?管理主題偏好(會寄登入連結到你的信箱)