メインコンテンツへ移動
AIチュートリアル

macOSでjev-chat-jarvisを使ってWeChatの意図を識別し、リスクを評価して返信を生成する

このチュートリアルでは、jev-chat-jarvisの仕組み、macOSへのインストール方法、権限とモデルの設定、日常的な使い方、高度なカスタマイズ方法を紹介します。WeChatへのコード注入、データベースの読み取り、メッセージの自動送信を行わずに、チャット対応を支援できます。

macOSでjev-chat-jarvisを使いWeChatの意図を識別、リスク評価、返信生成

プロジェクト概要

jev-chat-jarvis は macOS 向けの WeChat メッセージ支援ツールです。WeChat に相手からのメッセージであることを確認できるテキストが表示されると、画面内容の読み取りとローカルモデルによるメッセージ分析を行い、その文の本当の意図、0 から 9 までのリスクレベル、行動の提案、候補返信を表示します。

このツールは読み取り専用で動作し、WeChat へのインジェクション、フック、データベースの復号は行わず、メッセージを自動送信することもありません。ユーザーはフローティングパネルで候補内容をコピーするか、「入力」をクリックして文字列を WeChat の入力欄に入れられます。最終的な送信はユーザーが手動で行います。

主な機能

  • 意図とリスクの分析:8 種類の意図をゼロショットで識別し、リスクレベルと行動の提案を提示します。プロジェクト README では、22 件の中国語回帰サンプルを基準に、意図識別率を 86.4% としています。
  • 候補返信の生成:10 種類の話し方を内蔵し、それぞれについて慎重な候補とリラックスした候補を生成してから、ローカルモデルで順位付けします。
  • 並行処理:メッセージ判定と候補生成を同時に開始できます。README による M1 Pro の参考処理時間は、意図が約 1.5 秒、候補が約 1.5~2 秒です。実際の速度はデバイスとサービスによって異なります。
  • YOLO 検出ボックス:オプションで WeChat ウィンドウ内に OCR で検出したメッセージを表示し、相手のメッセージと自分のメッセージを区別して、信頼度も表示できます。
  • ネイティブフローティングパネル:現在のチャット、分析状態、処理待ちメッセージ、コンテキスト、意図、認識率、リスクレベル、行動の提案、候補返信を表示します。

インストールと初回起動

方法 1:macOS アプリをダウンロード

すぐに使用したい場合は、Releases から macOS 圧縮ファイルをダウンロードし、解凍後に .app を「アプリケーション」へドラッグします。アプリは公証を受けていないため、初回起動時は Finder でアプリを右クリックして「開く」を選択してください。直接ダブルクリックしないでください。

macOS に「壊れているため開けません。ゴミ箱に移動する必要があります」と表示される場合、通常はブラウザーでダウンロードした圧縮ファイルに隔離属性が付いています。すぐにアプリを削除せず、ターミナルで次を実行してください。

macOS アプリの破損警告
sudo xattr -r -d com.apple.quarantine /Applications/jev-jarvis.app

アプリ名が変更されている場合(例:jev-jarvis 2.app)は、コマンド内のパスを実際のパスに置き換えてください。

方法 2:ソースコードから実行

ソースコードから実行する前に、WeChat が起動していること、またターミナルまたは起動するアプリに画面収録権限があることを確認してください。プロジェクトディレクトリに移動して、次を実行します。

./start.command

プロジェクトは uv で Python 環境を管理します。システムに利用可能な uv がない場合、2 つの起動入口はいずれも公式インストールスクリプトのダウンロードと実行を試みます。失敗した場合は、既存の Homebrew も試します。インストールと起動のログは次にあります。

~/Library/Logs/jev-jarvis.log

macOS の権限を付与

初回起動時、案内に従って「システム設定 > プライバシーとセキュリティ」で jev-chat-jarvis に「画面収録」権限を付与し、その後アプリを終了して再起動すると権限が有効になります。

「入力」機能には「アクセシビリティ」権限も必要です。初めて「入力」をクリックすると、通常はシステムの許可ダイアログが表示されます。v0.3.1 以前のバージョンでは、python3.12 にも対応する権限を付与する必要があります。

これらの権限は WeChat ウィンドウの内容の読み取り、入力コントロールの特定、入力操作の実行に使用されます。ツールがメッセージを自動送信することを意味するものではありません。

モデルとキーの設定

プロジェクトには判定層と生成層があり、どちらの層もキーを入力せずに使用できます。

  • 判定層:TypeSafe Jev のキーを設定しない場合、ローカルの decider-2b モデルを使用します。初回ダウンロードには約 7 GB 必要です。
  • 生成層:パッケージ版アプリには共有キーが内蔵されているため、個人キーを設定しなくても候補返信を生成できます。

グラフィカル設定を使用

フローティングウィンドウ右上の歯車アイコンをクリックするか、メニューバーの「J > モデル設定…」から設定ウィンドウを開きます。設定画面では、Jev、OpenAI 互換、Anthropic 互換の 3 種類のサービスについて、エンドポイント、キー、モデルを編集できます。

「モデル一覧を取得」をクリックすると、サービスの /models API からモデルを読み込めます。API が対応していない場合やリクエストに失敗した場合は、手動で入力することもできます。モデルを選択したら「接続テスト」をクリックできます。テストでは未保存の設定を使って固定の挨拶文を送信します。WeChat の内容は読み取りませんが、少額のサービス料金が発生する可能性があります。

設定を保存した後は、アプリを終了して再起動する必要があります。現在の実行中に設定が即時切り替わることはありません。設定ウィンドウが編集するデフォルトファイルは次のとおりです。

$XDG_CONFIG_HOME/jev-jarvis/env

XDG_CONFIG_HOME が設定されていない場合の実際のパスは次のとおりです。

~/.config/jev-jarvis/env

環境ファイルを手動で作成

ターミナルで設定ファイルを作成することもできます。

mkdir -p ~/.config/jev-jarvis
cat > ~/.config/jev-jarvis/env <<'ENV'
# 判定層(任意):未入力の場合はローカルの decider-2b を使用
export TYPESAFE_API_KEY=""

# 生成層:任意の OpenAI 互換エンドポイント
export OPENAI_API_KEY="sk-あなたのkey"
export OPENAI_BASE_URL="https://api.deepseek.com"
export OPENAI_MODEL="deepseek-chat"
# 一部のモデルでは思考モードを無効にする必要があります
# export OPENAI_EXTRA_BODY='{"enable_thinking":false}'
ENV
chmod 600 ~/.config/jev-jarvis/env

設定の優先順位は、環境変数がユーザー env ファイルより優先され、ユーザー env ファイルがプロジェクトの .env より優先されます。生成層では OpenAI の設定が Anthropic の設定より優先され、どちらも設定されていない場合に限り内蔵の共有キーを使用します。

サービス選択時の注意事項

  • DeepSeek では deepseek-chat を使用できます。README では、実測で比較的高速な選択肢として記載されています。
  • 智譜では glm-4-flash を使用でき、プロジェクトがサポートする設定グループに対応する変数を入力します。
  • ローカルの Ollama では http://localhost:11434/v1 を入力し、キーには ollama、モデルには例えば qwen2.5:7b を使用できます。
  • thinking モデルはできるだけ使用しないでください。README では、思考プロセスによって max_tokens を使い切り、候補返信が空になる可能性があると注意しています。DeepSeek を使用する場合は deepseek-chat を選択してください。

初回使用

「壊れているため開けません」エラーダイアログ

アプリを起動して WeChat を開いた後、WeChat のチャットウィンドウを使用できる状態に保ちます。ツールはウィンドウ内容と Vision OCR を通じてチャット領域を読み取ります。システム画面を直接キャプチャしないため、フローティングパネルが OCR に影響することはありません。

相手からの明確なテキストメッセージを認識すると、パネルには現在のチャットと分析状態、処理中のメッセージとコンテキスト、意図、認識率、リスクレベル、行動の提案、話し方ごとに分類された候補返信が順番に表示されます。

各候補の左側にはローカルで算出された順位付け確率が表示され、右側には「コピー」と「入力」が表示されます。「コピー」は手動で貼り付ける際に便利です。「入力」をクリックすると文字列が WeChat の入力欄に書き込まれますが、送信ボタンを自動でクリックすることはありません。

使用例

例えば、相手が「この依頼、今日フォローしておいて」と送信すると、ツールはメッセージを判定層に渡して認識し、リスク結果に基づいて行動の提案を提示します。その後、生成層が複数のトーンの候補返信を並行生成し、ローカルで順位付けして並べ替えます。コンテキストに応じて 1 つ選び、「コピー」または「入力」をクリックした後、自分で確認して送信できます。

メッセージの方向を判定できない場合、例えばテキストが左右にまたがっていたり、中央に位置していたりする場合、パネルは「方向未確認」と表示し、返信対象にはしません。明確に相手のメッセージと識別された場合にのみ、判定と生成が開始されます。

高度な使用方法

YOLO 検出ボックスを有効化

起動時に環境変数で検出ボックスを有効にできます。

JEV_BOXES=1

起動後は、メニューバーから「YOLO 検出ボックス」を切り替えることもできます。検出ボックスは約 1 秒ごとに更新されます。青い実線はアクセシビリティ API が特定した入力コントロールを示し、オレンジ色の破線はスクリーンショットの境界から推測した入力領域を示します。破線は、書き込み可能なコントロールを確実に取得できたことを意味しません。

話し方をカスタマイズ

JEV_TONES で話し方を追加または上書きできます。各話し方は | で区切り、「名前=説明」の形式を使用します。例:

export JEV_TONES='サボりの達人=ベテランのサボり手のように、仕事をきれいに押し返しつつ失礼にならない'

説明には必要なトーンと、どのようなスタイルにしてはいけないかを明確に記述してください。変更後はアプリを再起動する必要があります。設定ウィンドウでは現在、JEV_TONES、JEV_BOXES、OPENAI_EXTRA_BODY は変更できません。

層別セルフテストとトラブルシューティング

ソースコードから実行する場合、認識、判定、生成、回帰の各フローを個別にテストできます。

uv run python src/perception.py
uv run python src/judge.py "この依頼、今日フォローしておいて"
uv run python src/judge_zh_test.py
uv run python src/generate.py --check
uv run python -B -m unittest discover -s tests
uv run python probe/bootstrap_regression.py

このうち、生成層の --check は認証情報の解析のみを確認するもので、実際の接続テストとは異なります。サービスがテキストを生成できることを確認するには、設定ウィンドウの「接続テスト」を使用してください。

ログの確認とディスク容量の解放

起動後の最初のメッセージ処理が遅い場合、通常はローカルモデルのウォームアップが原因です。直近のログは次で確認できます。

tail -40 ~/Library/Logs/jev-jarvis.log

ログには段階ごとの処理時間が含まれますが、メッセージ本文は含まれません。問題を報告する際に開発者へ提供するのに適しています。

ローカル判定モデルのキャッシュは約 7 GB を使用し、場所は次のとおりです。

~/.cache/huggingface/hub/models--Mapika--decider-2b

削除すると、次回ローカル判定を使用する際に再ダウンロードされます。Python 仮想環境は次にあります。

~/Library/Application Support/jev-jarvis/venv

アプリを削除しても、この環境は自動的に削除されません。必要に応じて手動で削除してください。

「入力」機能の制限

ツールはまず macOS のアクセシビリティ API を通じて書き込み、読み戻して確認します。一部の WeChat バージョンで入力コントロールが提供されない場合は、視覚的な互換経路を試します。ウィンドウ、入力領域、タイトルを再確認し、WeChat をアクティブにして入力領域をクリックし、テキストを入力した後、OCR で照合します。

視覚的な互換経路を使用すると、ツールがマウスを動かす場合があります。入力中はキーボード、マウスを操作したり、チャットを切り替えたりしないでください。クリップボードや Cmd+V は使用せず、送信キーを自動で押すこともありません。改行とタブはスペースに変換されます。

既存の下書きが検出されると、互換経路は停止し、「コピー」を手動で使用するよう案内します。ウィンドウ、フォーカス、セッションに変化があった場合も停止します。視覚的な境界や OCR が誤判定する可能性があるため、使用前に現在のチャットと入力欄の内容を確認してください。

既知の制限

  • 画像やスタンプの内容は読み取れません。引用返信は通常のテキストとして処理されます。公式アカウントのカードがメッセージとして分析される場合があります。
  • WeChat の全画面レイアウトや WeChat のバージョン変更により認識に失敗する場合があります。関連するレイアウト定数は src/perception.py の先頭にあります。
  • 複数ウィンドウの環境では、メインウィンドウの「微信」または「WeChat」を優先して認識します。
  • 方向が明確に確認された相手のメッセージだけが返信処理を開始します。方向を確認できないメッセージはスキップされます。
  • ダークテーマ、複数ディスプレイ、異なる WeChat バージョンにおける視覚的な互換入力経路については、引き続き検証が必要です。

プライバシーと利用上の注意

このプロジェクトは、自分のデバイスと自分のアカウント上の画面内容を読み取ることを目的としており、インジェクション、フック、WeChatデータベースの復号、メッセージの自動送信は行いません。必ず自分のデバイスでのみ使用し、WeChatソフトウェア使用許諾契約を遵守してください。WeChatのアップデートによりレイアウト認識が機能しなくなる可能性があります。問題が発生した場合は、まずログを確認し、その後プロジェクトのissueで報告してください。

まとめ

jev-chat-jarvisは、画面OCR、ローカルでの意図判定、リスク分類、返信候補の生成、ネイティブのフローティングパネルを組み合わせたツールです。WeChatのメッセージをすばやく理解し、返信の負担を軽減したいmacOSユーザーに適しています。インストール時は、Gatekeeper、画面収録、アクセシビリティの権限設定が重要です。使用時は、プライバシー、速度、コストに応じて、ローカルモデル、OpenAI互換サービス、Anthropic互換サービスから選択し、必ず送信前に内容を手動で確認してください。