通過 WhatsApp 將 Meta AI 用作 OpenCode 的模型後端
wa-metaai 是一個基於 WhatsApp 的 OpenAI 兼容端點,讓 opencode 等客户端可以將 Meta AI 當作模型使用。項目利用 whatsmeow 與 Meta AI 的官方機器人賬號通信,實現了工具調用模擬和流式輸出,並給出了配置方法、已知限制與賬號耐久性注意事項。
wa-metaai 是一個開源項目,它在 Meta AI 與標準 OpenAI 兼容接口之間搭建了一座橋樑。它的工作方式是將 opencode 等客户端發出的 /v1/chat/completions 請求轉發到 WhatsApp,再經由 whatsmeow 庫發送給 Meta AI 的官方機器人賬號。為了讓消息能夠被 Meta AI 識別,項目在消息 stanza 中追加了一個節點,並使用由消息密鑰通過 HKDF 派生出的 BotMessageSecret。作者對比了兩個 Go 庫後發現,Baileys 並未真正支持 bot 對話:它雖然定義了 META_AI_JID,但該號碼已經無法路由,WhatsApp 會以“找不到對應的 USync 結果”來拒絕;而 whatsmeow 提供的 types.NewMetaAIJID 正確指向 867051314767696@bot,並在發送時自動設置 bot 模式、派生 bot secret。
設置過程並不複雜,但賬號必須存在於真實的 WhatsApp 手機應用中(Android 模擬器也可以)。先用 CGO_ENABLED=1 go build -o wametaai . 編譯,然後運行 WA_PHONE=<號碼> ./wametaai。首次運行會顯示配對碼,在 WhatsApp 的“已鏈接設備”中完成綁定。會話會保存在 wametaai.db 中,之後無需再輸入配對碼。接下來只需在 opencode 的配置文件 ~/.config/opencode/opencode.json 中加入 whatsapp provider,指定 baseURL 為 http://localhost:8788/v1,並設置模型 meta-ai,即可通過 opencode run --model whatsapp/meta-ai 使用。
由於 Meta AI 沒有原生函數調用能力,項目在提示詞中注入每個工具的名稱、描述和 JSON Schema,要求模型輸出一個 fenced JSON 對象,然後解析為標準的 OpenAI tool_calls 消息。作者在 opencode 的真實代理循環中驗證過該流程:讓模型讀取 notes.txt 並説出秘密單詞,模型成功返回 pomegranate。整個系統提示詞加工具 schema 大約 3.7 萬字符(約 9k tokens),Meta AI 可以正常處理,但這也逼近 WhatsApp 單條消息約 6.5 萬字符的上限。項目目前沒有截斷保護,超長提示會直接失敗。
項目文檔列出了若干限制。工具調用依賴提示詞而非原生能力,Meta AI 有時會用散文回答而不是調用工具,導致循環卡住。流式響應實際上先將整個回覆緩衝,再一次性輸出;因為 Meta AI 的實時編輯消息在 whatsmeow 中需要手工解包。系統提示詞被摺疊成扁平對話,沒有獨立的 system role。會話狀態基於單條 WhatsApp 線程,歷史每次都會重發,Meta AI 自身的記憶也可能在不同請求間相互影響。併發請求被串行化,無法並行服務。令牌數按約 4 字符/token 估算,延遲約 7 秒。
環境變量包括 WA_PORT(默認 8788)、WA_PHONE(首次配對必需)、WA_QUIET_MS(默認 6000 毫秒靜默判定完成)、WA_GRACE_MS(默認 18000 毫秒額外等待)、WA_TIMEOUT_MS(默認 120000 毫秒硬超時)。賬號本身註冊在租用的 TextVerified 號碼上,一旦號碼被回收,賬號可能被他人重新註冊而失效;WhatsApp 也會在主設備長期離線時使鏈接設備過期。此外,非官方客户端違反 WhatsApp 服務條款,存在封號風險。