OpenAB — 在本機用 ACP 串接 Claude Code + Discord 完整教學
你有沒有想過,Claude Code 關掉終端機就下線了,但你的團隊半夜還在 Discord 問問題?
OpenAB 解決的就是這件事——它是一個用 Rust 寫的橋接服務,把 Discord 訊息透過 ACP(Agent Client Protocol)轉給 Claude Code,讓 AI 變成一個 always-on 的 Discord Bot。每個 thread 獨立一組 process,Mac 關了也沒差,Docker 裡面跑著就好。
ACP 是什麼?為什麼需要它?
先講一個類比。你可以把 ACP 想成是 AI Agent 世界的 USB-C——一個統一的接頭標準。不管你的 Agent 是 Claude Code、Codex 還是 Kiro,只要支援 ACP(JSON-RPC 2.0 over stdio),就能透過 OpenAB 接上 Discord。
Claude Code 本身有 Discord Plugin,但那是「Claude 把 Discord 當 UI」。OpenAB 反過來——是「Discord 把 CLI Agent 當後端」。差別在哪?Plugin 綁死一個 session,所有 thread 共用同一個腦袋;OpenAB 每個 thread 獨立 spawn 一組 CLI process,互不干擾,而且可以隨時換 Agent 後端。
想像一下:團隊裡有人想用 Claude 寫 Java,有人想用 Kiro 跑 spec-driven development,改一行 config 就搞定。
三層 Process 架構
OpenAB 啟動後會形成三層結構。最外層是 OpenAB 本體,負責監聽 Discord Gateway WebSocket 和管理 session pool。中間層是 claude-agent-acp,一個 Node.js 程式,把 ACP 的 JSON-RPC 翻譯成 Claude Code 呼叫。最內層就是 Claude Code 本體,實際執行 coding 任務。
每當有人在 Discord 開一個新 thread,OpenAB 就 spawn 一整組中間層 + 內層,完全隔離。預設最多 5 個同時跑的 session,閒置 24 小時後自動清理。
這種架構的好處是穩定性——一個 thread 炸了不會影響其他人。壞處是吃資源,每個 thread 都是一組完整的 process。
安裝全流程
整個安裝分四大步驟:裝 Rust toolchain → 裝社群 ACP Bridge → clone 並建置 OpenAB → 設定 Discord Bot。
Rust 的部分一行搞定:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh。ACP Bridge 用 npm 裝:npm install -g @agentclientprotocol/claude-agent-acp。注意舊套件名 @zed-industries/claude-code-acp 已經棄用了。
建置 OpenAB 就是標準的 Rust cargo build:clone repo 之後跑 cargo build --release,binary 會出現在 ./target/release/openab。
關鍵步驟來了:你需要建一個獨立的 .claude-acp 設定目錄。為什麼?因為 OpenAB 跑的 Claude Code 需要獨立的設定檔——bypassPermissions 模式(headless 環境必須)、獨立的認證 token、甚至可以放一份自訂的 CLAUDE.md 來定義 bot 的人格。
認證這步最容易忘:.claude-acp 是獨立的 config 目錄,**必須單獨跑 CLAUDE_CONFIG_DIR=~/.claude-acp claude auth login**。沒做這步的話,Discord 端只會看到「(no response)」,debug 半天找不到原因。
設定檔長什麼樣
config.toml 就三個區塊。[discord] 放 Bot Token 和允許的頻道 ID。[agent] 指定要跑的 CLI 命令和工作目錄,這裡用 env 把 CLAUDE_CONFIG_DIR 指向你的 .claude-acp。[pool] 控制最多幾個 session、閒置多久清理。
還有個有趣的 [reactions] 區塊——可以設定 bot 在不同狀態顯示不同 emoji:排隊中 👀、思考中 🤔、寫 code 👨💻、完成 🆗、出錯 😱。小細節,但在 Discord 裡能讓團隊知道 agent 跑到哪了。
換 Agent 後端
這是 OpenAB 最靈活的地方。改 config.toml 的 [agent] 區塊就能切換:Claude Code 用 claude-agent-acp,Kiro CLI 改成 kiro-cli 加上 ["acp", "--trust-all-tools"] 參數,Codex 用 codex-acp,Gemini 用 gemini --acp 加上 API Key。重啟 OpenAB 就生效。
這意味著你的 Discord bot 不是綁死在某個 AI 上的——今天覺得 Claude 寫 Python 比較順,明天想試 Kiro 的 spec-driven 流程,都是改一行的事。
語音和圖片怎麼辦?
OpenAB 本身只處理純文字。但可以加一個獨立的 Discord Bot 專門監聽語音和圖片附件,搭配本地的 Whisper API(Docker 跑 openai-whisper 的 medium 模型)做語音轉文字,圖片則下載到本地讓 Claude Code 用 Read 工具讀取。
流程是:使用者上傳語音 → Discord Bot → Whisper API 轉文字 → 存 JSON 到 /tmp/discord_inbox/ → 使用者再傳一則文字觸發 Claude Code → Claude 自動檢查 inbox → 讀取轉錄結果回應。
有個小限制:因為 OpenAB 的整合方式,使用者上傳語音或圖片後需要再傳一則文字訊息來觸發回應。不算優雅,但能用。
注意事項
幾個一定要知道的坑。第一,claude-agent-acp 是社群維護的橋接層,Claude Code 官方在 GitHub #6686 明確標記「不規劃」原生 ACP 支援,穩定性沒有官方保證。第二,OpenAB 收到 CLI 的權限請求一律自動批准(allow_always),agent 在工作目錄裡有完整讀寫權限,千萬不要指向含機密的目錄。第三,目前是單一 replica 架構(PVC 是 ReadWriteOnce),沒辦法水平擴展。
Bot Token 絕對不要寫死在 config.toml 裡,用 .env 加環境變數的方式引入,權限設 600。
整個 OpenAB 的設計思路可以用兩條線理解:怎麼連和怎麼管。連的部分是 ACP 協定統一了 Agent 接口,不管後端是誰都能插上去;管的部分是 session pool 搭配 thread 隔離,讓一個 bot 同時服務多個人而不互相干擾。掌握這兩條線,其他細節都是配置問題。
參考來源:OpenAB GitHub
參考來源:Agent Client Protocol (ACP)










