七瀬真冬をモチーフにした自律型エージェント。ローカル LLM (Ollama/Qwen3.5 など) で動き、Discord/CLI 両対応。キャラクターとして会話しつつ、必要なときだけ安全な Web 検索や URL 取得を使って返答します。
- Adaptive Routing: lightweight router が chat/tool/react/codex/reject を判定し、単純な会話は main model 1回で返答
- ReAct fallback: 思考→ツール呼び出し→反省は必要時のみ最大2ターン実行
- 安全なツール: DuckDuckGo 検索、URL/HTML 抽出、fetch_json、sandbox 内ファイル読み取り、ローカルメモリ検索
- 会話メモリ/感情:
data/memory.jsonに出来事を蓄積、data/emotion.jsonで affection/mood/energy をユーザー別に管理 - キャラ調整:
mafuyu_ai/resources/system_prompt.txtとmafuyu_ai/resources/fewshot_messages.jsonを編集して口調や初期応答例を変更 - LLM 切り替え: デフォルトは Ollama の Qwen3.5 role-based routing。
mafuyu_ai/llm/huggingface.pyで HuggingFace/LoRA 推論にも切替可 - 実行環境: CLI (
main.py) と Discord (discord_bot.py) を同梱。Discord はメンション/DM 対応と自律発話ループあり - コーディング委任: Codex 向きの作業は自動実行せず、Codex-ready instruction として返答
Mafuyu uses role-based local LLM routing.
Default RTX 3070 profile:
| Role | Model | Purpose |
|---|---|---|
| router | qwen3.5:0.8b |
route/tool/risk JSON decision |
| main | qwen3.5:4b |
normal response and tool result synthesis |
| heavy | qwen3.5:4b |
optional complex reasoning within the RTX 3070 profile |
The RTX 3070 default keeps heavy on qwen3.5:4b to avoid CPU offload or load failures. Higher-VRAM machines can override OLLAMA_HEAVY_MODEL=qwen3.5:9b.
必要モデル:
ollama pull qwen3.5:0.8b
ollama pull qwen3.5:4b
# Optional high-VRAM override:
# ollama pull qwen3.5:9bRTX 3070 推奨 Ollama 設定:
$env:OLLAMA_NUM_PARALLEL="1"
$env:OLLAMA_MAX_LOADED_MODELS="1"
$env:OLLAMA_CONTEXT_LENGTH="4096"
ollama serveTool outputs, URL contents, search results, Discord quotes, and memories are treated as untrusted data.
Dangerous tools such as local Python execution, Codex automation, destructive file operations, and copy/move/delete operations are disabled from model output by default.
Mafuyu uses adaptive routing and early exit to reduce average inference cost.
Simple requests use the main model once. ReAct and heavy models are only used for uncertain or hard requests. Best-of-N is disabled by default and only intended for low-risk deep reasoning tasks.
- ReAct セッション:
mafuyu_ai/core/session.pyが会話を調整し、プロンプト読込と応答解析は専用モジュールへ分離 - ツールレイヤ:
mafuyu_ai/tools/でポリシー、URL/パス安全性、Web、ファイル、Codex、実行レジストリを分離 - 記憶と感情:
mafuyu_ai/core/memory.pyとemotion.pyが永続状態を管理 - LLM バックエンド:
mafuyu_ai/llm/client.pyが Ollama API、router.pyが適応ルーティング、agent_protocol.pyが旧エージェントJSONプロトコルを担当 - Discord ボット:
mafuyu_ai/interfaces/discord.pyがメンション/DMを処理。ルートのdiscord_bot.pyは互換エントリ - CLI チャット:
mafuyu_ai/interfaces/cli.pyが/clearや/exitを処理。ルートのmain.pyは互換エントリ - Codex ブリッジ:
mafuyu_ai/tools/codex.pyに明示的な特権操作として隔離し、デフォルト無効
詳しい依存方向は docs/architecture.md を参照してください。
- データ/ログ:
data/配下にmemory.json/emotion.json/logs/を自動生成。ファイル操作ツールはdata/workspace/配下に閉じ込め、Codex bridge も同じ sandbox 配下に配置
- Python 3.10+
- Ollama (RTX 3070 では Qwen3.5 0.8B router + 4B main を推奨)
- Discord Bot Token (Discord Developer Portal で取得)
- ネットワーク: Web検索/URL取得を使う場合に必要
- 追加ライブラリ:
pip install -r requirements.txtで主要依存を導入。requestsが無い場合はpip install requests
- リポジトリを取得
git clone https://github.com/MikanNigata/mafuyu-AI.git
cd mafuyu-AI- (任意) 仮想環境を作成
python -m venv .venv
./.venv/Scripts/activate # Windows の例- 依存パッケージをインストール
pip install -r requirements.txt
pip install requests # 必要なら- モデルを準備 (Ollama)
ollama pull qwen3.5:0.8b
ollama pull qwen3.5:4b
# Optional high-VRAM override:
# ollama pull qwen3.5:9b- トークンを設定
copy .env.example discord.env
# discord.env もしくは環境変数で DISCORD_TOKEN=your_token_here
# DM を許可する Discord の数値 user.id を DISCORD_ALLOWED_USER_ID に設定- 起動
- CLI:
python main.py - Discord:
python discord_bot.py
- CLI:
/clear(履歴クリア),/exit(終了) - Discord: サーバーではメンションで応答。
FREE_CHAT_CHANNELSの ID ならメンション不要。DM はDISCORD_ALLOWED_USER_IDに一致する user.id だけ許可 - 自律発話: 最後の会話から1時間以上経過かつ 0-6 時を除くとき、DM チャンネルに一言投下する場合あり
- ツール利用例:
@Mafuyu 今日の天気教えて (search_web)
@Mafuyu このURL読んで https://example.com (read_url)
@Mafuyu data/memo.txtの中身見せて (read_text)
エージェントがキーワードから必要なツールを自動選択します。
| ツール | 内容 |
|---|---|
search_web |
DuckDuckGo で上位結果を取得 |
read_url / fetch_url / fetch_json |
Webページ本文抽出 / テキスト取得 / JSON 取得 |
list_dir / read_text |
sandbox 内ファイル/ディレクトリ読み取り |
write_text |
owner DM かつ明示確認された経路だけで許可される書き込み |
search_tweets |
data/memory.db に保存されたツイートを検索 |
run_python_code |
デフォルト無効。モデル出力からは直接実行不可 |
codex_run_sync / codex_job_* |
デフォルト無効。Codex route は instruction だけ返す |
主要設定は mafuyu_ai/settings.py で変更できます。ルートの config.py は旧import向けの互換レイヤーです。
| キー | デフォルト | 説明 |
|---|---|---|
BASE_DIR |
リポジトリ直下 | ベースディレクトリ |
DATA_DIR / LOGS_DIR |
data/ / data/logs/ |
メモリやログの保存先 (自動生成) |
OLLAMA_URL |
http://localhost:11434/api/chat |
Ollama API エンドポイント |
OLLAMA_ROUTER_MODEL |
qwen3.5:0.8b |
ルーティング/リスク判定モデル |
OLLAMA_MAIN_MODEL |
qwen3.5:4b |
通常応答モデル |
OLLAMA_HEAVY_MODEL |
qwen3.5:4b |
深い推論用の任意モデル。高VRAM環境では qwen3.5:9b へ override 可能 |
REACT_MAX_TURNS |
2 |
fallback ReAct の最大ターン |
ENABLE_BEST_OF_N |
0 |
任意の Best-of-N 品質モード |
CODEX_CMD |
codex |
Codex CLI コマンド |
FETCH_MAX_CHARS |
10000 |
URL 取得時に返す最大文字数 |
FETCH_MAX_TEXT_BYTES / FETCH_MAX_JSON_BYTES / FETCH_MAX_HTML_BYTES |
524288 / 524288 / 1048576 |
URL 取得時の実受信上限。大きい応答でメモリを使い切らないための制限 |
CODEX_LOG_TAIL_LINES |
80 |
Codex ログ tail 行数 |
キャラクターや Few-shot は mafuyu_ai/resources/system_prompt.txt / mafuyu_ai/resources/fewshot_messages.json を編集。長期記憶と感情は data/memory.json / data/emotion.json に保存されます。
mafuyu-AI/
├── mafuyu_ai/
│ ├── core/ # セッション、プロンプト、記憶、感情、応答解析
│ ├── llm/ # Ollama、ルーター、推論予算、HF、agent protocol
│ ├── tools/ # ポリシー、安全境界、Web、ファイル、Codex、registry
│ ├── agent/ # 旧マルチステップagentと永続state
│ ├── interfaces/ # CLI / Discordアダプター
│ └── resources/ # system prompt、few-shot、help
├── tests/
├── docs/architecture.md
├── pyproject.toml
├── main.py # 互換CLIエントリ
└── discord_bot.py # 互換Discordエントリ
pip install -e ".[dev]"
python -m unittest discover -s tests -v
python -m compileall -q mafuyu_ai
ruff check mafuyu_ai tests *.py新しいコードは mafuyu_ai.* からimportしてください。ルート直下の旧モジュールは移行期間向けの互換レイヤーです。
MIT License