作品
MaidAI
ローカル LLM で動く会話 AI「梨乃」を、デスクトップに常駐させるクライアントです。会話するだけでなく、頼まれた操作も実行します。実行の前に必ず人の承認を通し、記録を残すところが、いちばんのこだわりです。
使用技術:
- Python
- Electron
- ローカル LLM

梨乃にできること
- 会話
- ローカル LLM で応答します。クラウドの API に会話を預けず、手元の環境で動かすことを前提にしています。キャラクター設定を持たせ、画面の隅から話しかけてきます。
- 音声
- 音声での入力と読み上げに対応しています。読み上げは、音声と口の動きを合わせて表示します。
- 生活通知
- 予定や日々の通知を、梨乃が声をかける形で知らせます。
- 操作
- 配信ソフト、スマートホーム機器、カメラ、パソコンの操作を、ツールとして呼び出せます。
仕組み
デスクトップのクライアントが画面と入力を受け持ち、会話、エージェント、ツールは別の部分に分けています。部分どうしはイベントバスでつなぎ、機能を足しても他の部分を書き換えずに済むようにしています。
表示
- デスクトップクライアント梨乃の表示、吹き出し、入力(Electron)
会話
- 会話サービスローカル LLM、キャラクター設定
- イベントバス各部分をつなぐ
判断と承認
- エージェント頼まれた操作を計画
- 承認実行の前に人が確認
- 監査承認と結果を記録
ツール
- 配信
- スマートホーム
- カメラ
- パソコン
技術スタック
- デスクトップ
- Electron で作っています。梨乃は three.js と @pixiv/three-vrm で VRM モデルを描画し、VRMA のアニメーションを再生します。ビルドは esbuild と electron-builder です。
- バックエンド
- Python です。FastAPI(uvicorn)と WebSocket で、クライアントと各サービスをつなぎます。
- エージェント
- Microsoft Agent Framework と MCP(Model Context Protocol)で、ツールの呼び出しを組み立てます。
- イベントとデータ
- イベントは NATS で流し、Python と TypeScript の両方から扱います。イベントの形は JSON Schema で定義しています。データは PostgreSQL に保存し、SQLAlchemy と Alembic(マイグレーション)で管理します。
- 音声
- 音声認識に faster-whisper、読み上げ音声の時刻合わせ(口の動き)に stable-ts を使っています。
- 機器との連携
- 配信ソフト、スマートホーム機器、カレンダー、カメラ映像につなぎ、パソコンの操作(音量など)も扱います。
- 起動と検証
- 起動の管理は PySide6 のランチャーで行い、WSL の開発環境とつなぎます。検証は pytest と Node のテストです。
安全の考え方
操作は、梨乃が提案する段階と、実行する段階を分けています。実行の前に、何をするのかを平易な文で示して承認を求め、承認と結果を監査の記録に残します。
開発の進め方
開発は WSL の dev 環境で行い、普段使いの環境とは分けています。仕様と手順は YouTrack に集めています。
実装やレビューは AI エージェントに役割を分けて任せ、要件の判断と受け入れは自分で行います。ローカル LLM の制約(コンテキストの長さや GPU への収まり)も見ながら、任せる範囲を絞っています。