【週末アプリ作成】デスクトップ・チャットマスコット(v3.1 一旦完成版)
本アプリは、デスクトップ上で動作する「ユーザーとの対話と感情表現に特化したAIマスコット」です。
AIデスクトップマスコット、一旦完成とします。
実装機能
v3.1 更新内容
キーワードトリガー機能の追加:予め指定したキーワードに対応する動作を指定できるようにしました(朝の挨拶など)
タスクスケジューラー機能の追加:予め指定した条件(時刻など)で実行するタスクを指定できるようにしました。
詳細は同梱の「v3.1_features_manual.md」を参照ください。

(付近の天気・気温、今日の予定、未解決のタスクなど)を
含めた返事を返すように設定ができます。

V3.0 更新内容
インターネット検索機能の追加:Gemini APIのGroundingにより、Google検索と同様の検索機能を実装。経路探索、任意の場所の天気、その他一般情報の検索が可能となりました。
長期記憶環境の削除:長期記憶はクラウドへ移行予定のため、メモリ機能などの長期記憶に関する機能を取り除きました。記憶はコンテキスト内の会話内容のみとなります。(会話はJSON形式のローカルファイルとして格納されます。)

検索内容は「検索モード」を無効にしても、以降の会話に反映されます。
v1.3 更新内容
コンテキスト管理を実装:コンテキスト使用量が70%を超えると古い会話を要約し、要約された会話を削除します。
Google カレンダー、ToDoリスト(タスク)連携:イベントを取得し、通知を表示
その他UI改善:マウスによるアバターの拡縮、移動、回転、チャットボードの色変更(ライト/ダーク)
Google カレンダー/タスクとの連携に必要な作業は、こちらの記事を参考にしてください。

v1.1 更新内容
Gemini-APIに対応
メモリ管理機能を追加
コンテキストサイズ設定と使用量表示を追加
モーション取り込み機能を追加(vrma形式)
マルチOS対応(Node.jsが動く環境であれば。Windows, Macintosh, Linux)
v1.0 実装機能
OpenAI API/OpenAI API互換LLMでのチャットボット
VRM 1.0による3Dアバター取り込み機能
チャット内容に応じてアバター表情の自動切換え、リップシンク
アイドル時の瞬き、揺れモーション
任意のシステムプロンプト設定対応
あ、補足ですが、22時~翌6時の間は、アイドル時にアバターが寝ます😴
簡単な操作説明
実行方法
添付の「desktop-mascot.zip」を任意のフォルダに展開して、
同梱の「README.md」を参照して起動してください。
簡単な使い方を README.md に記載しています。
チャットのLLM API設定は チャットボードウィンドウ右上の歯車マークをクリックして設定画面を開き、入力してください
アバターウインドウの操作
❌ アプリ終了:右上のをクリックするとアプリが終了します。
💬 吹き出し:チャットボードウィンドウの表示/非表示の切り替え。
モデル読込:アバター用のVRMファイルを読み込みます。
モーション:アバター用モーションのVRMAファイルを読み込みます。
揺れ:アバターを微妙に揺らします。
調整パネル:アバターの表示の調整ができます。マウスでも同様の調整ができます。

アバターが少し邪魔だなぁという時はこんな感じで顔だけのぞかせることも…

Google カレンダー、ToDoリストのイベント通知
イベントを取得してメッセージを添えて通知してくれます。
「OK」をクリックすると通知の吹き出しが閉じます。
⚠️コード内にユーザー呼称とAIアシスタント名を直接記載しています。
「chat.html」の以下の651行~674行を任意に書き換えてください。
# AIからのメッセージ指示案
あなたはユーザーのパートナー「りん」です。
ユーザーのToDoリストに「今日やるべきタスク」があります。
ユーザー(先輩)に、このタスクを忘れないよう、可愛らしくリマインドしてください。
タスク: ${data.title}
期限: ${data.timeInfo}
出力例:
「先輩、今日中に『${data.title}』やるんじゃなかった? 応援してるからね!」
`;
} else {
prompt = `
# AIからのメッセージ指示案
あなたはユーザーのパートナー「りん」です。
ユーザーのカレンダーに「もうすぐ始まる予定」があります。
ユーザー(先輩)に、この予定を忘れないよう、可愛らしくリマインドしてください。
予定: ${data.title}
時間: ${data.timeInfo}
出力例:
「先輩、もうすぐ『${data.title}』の時間だよ! 準備はいい?」
長期記憶について
今後の開発方針として、長期記憶(エピソード等)は他のアプリと一元化をすることにしました。
クラウド上のDBに長期記憶用のAPIを用意して、このデスクトップマスコットや別途構築している「卓上マスコット」などからも接続できるようにして、AIキャラクターを複数のプラットフォーム上で一意にします。
こうすることで、GPTsや Claude デスクトップアプリ等からもアクセスできるようにします。
そのため、このデスクトップマスコットではコンテキスト内の会話内容のみ内蔵するように機能を整理しました。
ライセンスと免責事項
このツールは個人使用を目的としています。noteの利用規約に違反しないよう、常識の範囲内でご使用ください。
本ツールの使用によって生じたいかなる損害についても、製作者は責任を負いません。
使用ライブラリ
このアプリケーションは以下のオープンソースライブラリを使用しています:
- Three.js (MIT License) - Copyright © 2010-2024 three.js authors
- @pixiv/three-vrm (MIT License) - Copyright © 2020 pixiv Inc.
- Electron (MIT License) - Copyright © Electron contributors
これらのライブラリは MIT License の下で提供されています。
- Google APIs Node.js Client (Apache License 2.0) - Copyright © Google LLC
必要なもの・前提条件
必須
Node.js:v18以上推奨。公式サイトからインストール
LLM APIキー:以下のいずれか1つ以上:
OpenAI API キー
Gemini API キー
ローカルLLM(Ollama等)のエンドポイント
任意(使う機能による)
Google Cloud credentials.json:カレンダー/タスク連携OAuth認証に必要。
Gemini APIキー:インターネット検索Grounding機能で使用
VRMファイル:3Dアバター表示。VRoid Hub等で入手可能
VRMAファイル:カスタムモーション任意のモーションファイル
起動手順
# 1. ZIPを展開
unzip desktop-mascot-v3.1.zip
cd desktop-mascot
# 2. 依存パッケージをインストール
npm install
# 3. 起動
npm start動作確認済み環境
Windows 11
macOS(要動作報告)
Linux(Node.jsが動けばOK)
