WhatsApp経由でMeta AIをOpenCodeから使う
wa-metaaiは、WhatsAppを経由してMeta AIをOpenAI互換エンドポイントとして公開するプロジェクト。opencodeなどのクライアントからMeta AIをモデルとして利用でき、ツール呼び出しのエミュレーションやストリーミングにも対応。セットアップ方法、制限、アカウントの耐久性について解説する。
wa-metaaiは、Meta AIとOpenAI互換インターフェースの間をつなぐオープンソースプロジェクトです。opencodeなどのクライアントが送る /v1/chat/completions リクエストをWhatsAppへ転送し、whatsmeowライブラリを介してMeta AIの公式ボットアカウントに届けます。Meta AIがメッセージを認識できるよう、スタンザにノードを追加し、メッセージ秘密鍵からHKDFで導出したBotMessageSecretを使用します。作者は2つのGoライブラリを比較し、Baileysはボット対応が不完全で、従来のMETA_AI_JIDはルーティング不能になっていることを指摘。whatsmeowの types.NewMetaAIJID(867051314767696@bot)が正しく、送信時にボットモードとボット秘密鍵を自動設定します。
セットアップはそれほど複雑ではありませんが、アカウントは実際のWhatsAppモバイルアプリ(Androidエミュレータでも可)に存在している必要があります。CGO_ENABLED=1 go build -o wametaai . でビルドし、WA_PHONE=<番号> ./wametaai を実行します。初回起動時にペアリングコードが表示されるので、WhatsAppの「リンク済みデバイス」から電話番号でリンクします。セッションはwametaai.dbに保存され、次回以降はコード不要です。その後、opencodeの設定ファイル ~/.config/opencode/opencode.json にwhatsappプロバイダーを追加し、http://localhost:8788/v1 を指定すれば、opencode run --model whatsapp/meta-ai で利用できます。
Meta AIにはネイティブの関数呼び出しがないため、このプロジェクトはプロンプトにツール名・説明・JSON Schemaを埋め込み、1つのフェンス付きJSONオブジェクトを出力させます。それを解析して標準的なOpenAI tool_callsメッセージに変換します。作者はopencodeの実際のエージェントループで、notes.txtを読んで秘密の単語を答えるタスクを検証し、「pomegranate」という正しい回答を得ました。このときのシステムプロンプトとツールスキーマは約37,000文字(約9kトークン)で、Meta AIは問題なく処理しました。ただし、WhatsAppの1メッセージあたりの上限は約65,000文字であり、現在は切り詰めガードがないため、過大なプロンプトは失敗します。
制限事項としては、ツール呼び出しがプロンプト依存で、Meta AIが散文で答えてしまうとループが停止すること、ストリーミングがバッファリング後に1チャンクとして出力されること、システムプロンプトがフラットな履歴に折り込まれること、1つの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の利用規約に反し、番号のBANリスクがあります。