
こんにちは。ACS事業部の越川です。
4月1日、新卒の皆さんの配属日ですね。エンジニアとしてのキャリアをこれから積み上げていく方々に、一つおすすめしたいデバイスがあります。Raspberry Piです。
Raspberry Piは、ソフトウェア・ハードウェア・インフラの全てを一台で同時に扱えるデバイスです。Linux、ネットワーク、Docker、GPIO、センサー連携 — エンジニアに必要な基礎を手を動かしながら学べます。そして今はそこにAIエージェントを載せて常時運用する時代になりました。
この記事では、370MBのAIエージェントフレームワークを4MBに置き換えて、Raspberry Pi 5で常時運用している話を紹介します。しかもVision(画像解析)対応のパッチを自前で当てて。
NullClawとは
NullClawは、AIエージェントフレームワークOpenClawの軽量版です。Zig言語で書かれており、公称スペックは以下の通りです。
| 項目 | OpenClaw | NullClaw(公称) |
|---|---|---|
| 言語 | Node.js | Zig |
| バイナリサイズ | 約370MB | 678KB |
| 必要メモリ | 数百MB | 1MB |
| 起動時間 | 数秒 | 2ms |
エッジデバイス上でAIエージェントを動かすことを目的としており、Raspberry Pi公式のサポートもOpenClawのドキュメントに記載されています。
ただし、NullClawにはOpenClawにある一部機能が無効化されています。その一つがVision(画像解析)機能でした。
今回のVision対応パッチを適用したフォークは以下で公開しています。
なぜ移行したか
もともとOpenClaw(Node.js版)をRaspberry Pi 5のDocker上で動かしていました。しかし、以下の問題がありました。
- 発熱: Node.jsのランタイムが常にリソースを消費し、ファン付きヒートシンクでも温度が気になった
- メモリ消費: 370MBのフレームワーク+Node.jsランタイムで、8GBのRaspberry Pi 5でも余裕が少なかった
- 起動の遅さ: コンテナの再起動に数秒かかる
NullClawに移行することで、これらの問題を根本的に解決できると考えました。
検証環境
| 項目 | スペック |
|---|---|
| デバイス | Raspberry Pi 5 |
| メモリ | 8GB |
| OS | Debian 13 (trixie) / aarch64 |
| カーネル | 6.12.47+rpt-rpi-2712 |
| ストレージ | 128GB microSD |
| 冷却 | パッシブヒートシンクのみ |
| NullClawバージョン | 2026.3.8 |
| LLMモデル | OpenAI Codex / GPT-5.4 |
Vision対応パッチの実装
NullClawのソースコードをフォークし、3つのパッチを適用しました。
パッチ1: Vision機能の有効化
NullClawでは supportsVisionImpl が無効化されていました。これを true に変更し、画像入力を受け付けるようにしました。
パッチ2: content_parts シリアライズの修正
OpenAI Responses APIのフォーマット(input_text / input_image)に合わせてシリアライズ処理を修正しました。NullClaw標準のシリアライズではテキストのみを前提としており、画像データを正しくAPIに渡せなかったためです。
パッチ3: curl関連の修正
-Lフラグを追加し、HTTPリダイレクトに対応- GETバッファを20MBに拡大(画像データのダウンロードに対応)
クロスコンパイル
パッチ適用後、手元のPCでZigのクロスコンパイルを行い、aarch64-linux向けのバイナリを生成しました。
# Mac上でクロスコンパイル zig build -Dtarget=aarch64-linux # ビルド成果物をPi5へ転送 scp zig-out/bin/nullclaw pi5:~/docker/nullclaw/nullclaw-patched
Docker化と常時運用
Docker Compose構成
services: nullclaw-gateway: build: context: . dockerfile: Dockerfile.patched container_name: nullclaw-gateway restart: always ports: - "18789:18789" environment: - OPENCLAW_GATEWAY_PORT=18789 - OPENCLAW_SERVICE_MARKER=openclaw - OPENCLAW_SERVICE_KIND=gateway command: ["nullclaw", "gateway", "--port", "18789", "--bind", "lan"]
Dockerfile
FROM debian:bookworm-slim RUN apt-get update && apt-get install -y curl ca-certificates && rm -rf /var/lib/apt/lists/* COPY nullclaw-patched /usr/local/bin/nullclaw RUN chmod +x /usr/local/bin/nullclaw EXPOSE 18789 CMD ["nullclaw", "gateway", "--port", "18789", "--bind", "lan"]
OAuthトークンの自動リフレッシュ
NullClawはOpenAI CodexのOAuth認証を使用しています。トークンの有効期限は約10日間(864,000秒)ですが、安全のためcronで8時間ごとに自動リフレッシュしています。
# crontab 0 */8 * * * /home/pi/docker/nullclaw/refresh-token.sh
リフレッシュスクリプトは以下を行います。
- 現在のrefresh_tokenでOpenAI認証エンドポイントに新しいトークンを要求
- 3つの認証ファイル(
auth.json、エージェント用auth.json、auth-profiles.json)を同時に更新 - NullClawコンテナを再起動して新しいトークンを反映
- 結果をログに記録
2026-04-01 04:00:01 OK: token refreshed, expires_in=863999s 2026-04-01 04:00:12 OK: nullclaw restarted
実測値
Raspberry Pi 5上で実稼働中のコンテナから取得した実測値です。
| 項目 | OpenClaw(移行前) | NullClaw(パッチ適用後) |
|---|---|---|
| バイナリサイズ | 約370MB | 2.8MB |
| 実メモリ使用量(VmRSS) | 数百MB | 4.3MB |
| CPU使用率(アイドル時) | 数% | 0.01% |
| スレッド数 | 多数 | 8 |
| CPU温度 | ファン必要 | 34.0℃(パッシブヒートシンクのみ) |
| ロードアベレージ | — | 0.04, 0.02, 0.00 |
バイナリサイズが公称678KBに対して2.8MBなのは、Visionパッチとcurlバッファ拡張の影響です。それでもOpenClawの370MBと比べれば約1/130です。
特筆すべきはCPU温度の34.0℃です。パッシブヒートシンクのみでこの温度は、Node.js時代では考えられませんでした。
用途
現在、以下の2つの用途で常時運用しています。
- Discord Bot: 自分用のDiscordサーバーに接続し、チャットでGPT-5.4と対話できる
- LAN向けAPIゲートウェイ: ポート18789でLAN内の他デバイスからAIエージェントのAPIを呼び出せる
まとめ
大量のリソースを前提にするのではなく、最小限のリソースで最大限の価値を引き出す。これはエンジニアとしての矜持です。
NullClawは公称スペック通り、エッジデバイスでAIエージェントを動かすのに十分な性能を持っています。Visionが無効化されている制約はありましたが、ソースコードにパッチを当てることで解決できました。
Raspberry Pi 5 + NullClaw + Dockerの組み合わせは、クラウドに依存しすぎない「エンジニアの箱庭」として、日常のAI活用に十分実用的です。
ACS 事業部のご紹介
私の所属する ACS 事業部では、開発者ポータル Backstage、Azure AI Service などを活用し、Platform Engineering + AI の推進・内製化を支援しています。
www.ap-com.co.jp www.ap-com.co.jp www.ap-com.co.jp
また、GitHub パートナーとしてお客様に GitHub ソリューションの導入支援を行っています。 GitHub Copilot などのトレーニングなども行っておりますので、ご興味を持っていただけましたらぜひお声がけいただけますと幸いです。
一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。
※求人名の冒頭に【ACSD】と入っている求人が当事業部の求人です