Yay!(イェイ)でキャラ付けしたAIエージェントが自動で会話する実験プロジェクト。
- 通信:
yaylibv2(fork同期済み・Python SDK) - 通常DM会話エンジン: 独立Hermes profile + Yay platform plugin
- 初回DM・追いDM・投稿生成:
YAY_LLM_*で選ぶOpenAI互換backend - 安全装置: PolicyEngine・durable Outbox・日次/rolling-hour上限・送信前フィルタ・全ログ
yay_agent/
config.py # .env / persona / 上限 / ターゲット性別 / メディア / ダッシュボード
qwen.py # QwenChat クライアント(aiohttp・リトライ付き)
store.py # SQLite: 会話状態・Outbox・上限予約・backoff
policy.py # 全送信共通の本文・PII・日次上限ポリシー
send_service.py # 唯一の外向き送信境界: Policy + Outbox + Yay API
safety.py # 送信フィルタ(URL/電話/住所/メール禁止・長さ制限)
brain.py # プロンプト生成・返信/初回メッセージ作成・記憶更新(JSON出力)
scout.py # タイムライン監視・候補収集・性別取得(読み取り専用)
media.py # Yay CDN限定のprivateメディア保存・URL dedupe
media_sync.py # DM相手の全履歴backfill・投稿watermark差分同期
dashboard.py # 状況確認・手動DM送信(aiohttp)
engagement.py # 成果帰属・匿名特徴量・Wilson区間・保守的variant選択
runner.py # DM / 24時間追いDM / outbound / 投稿 / 公開返信 / 新着全投稿いいねのoneshot処理
__main__.py # CLI
hermes_plugin/ # Yay platform adapter(受信ledger・Shadow/Live・API lock)
personas/sample.json # キャラ設定のサンプル(PERSONA環境変数で切替)
data/ # SQLite・セッションキャッシュ・保存メディア(gitignore対象)
cp .env.example .env
# YAY_EMAIL / YAY_PASSWORD / LLM API key を設定
python -m venv .venv
source .venv/bin/activate
pip install -e .# 稼働状態
systemctl --user status hermes-gateway-yay.service
systemctl --user status yay-agent-dashboard.service
# 現在のmode
hermes config get gateway.platforms.yay.extra.mode
# 緊急rollback: まずShadowへ戻してから専用gatewayをplanned reload
hermes config set gateway.platforms.yay.extra.mode shadow
systemctl --user reload hermes-gateway-yay.service- Yay入力に渡すToolsetは
yay-topic-searchと読み取り専用yay-lookupのみ。映画・邦ロック・音楽以外の公開検索と、書き込み操作はコードで拒否する - 個人memory、terminal、file、browser、汎用web、外部送信Toolはmodelへ渡さない
shadowは下書きをdata/hermes_yay.sqlite3へ保存するだけで送信しないliveはHermes最終出力をSendServiceへ渡す。LLM自身には送信Toolを与えない- 通常返信は、会話終了・拒否・謝罪修復を除き「短い反応+返しやすい足場(質問1つまたは比較して返せる自分の話)」にする
- 生成文の
。は中央policyへ渡す前に除去する。正規化後に空になる出力は拒否し、URL・PII・長さ・idempotency検査は維持
Hermes gatewayがlive中は、以下の実送信コマンドを並行実行しない。
source .venv/bin/activate
# 下書きのみ(送信しない)
python -m yay_agent tick-reply --dry-run
python -m yay_agent tick-followup --dry-run --limit 1
python -m yay_agent tick-outbound --dry-run --limit 1
python -m yay_agent tick-post --dry-run
python -m yay_agent tick-timeline-reply --dry-run --limit 1
python -m yay_agent tick-timeline-like --dry-run
# 送信せず、DM・公開投稿の成果だけを更新
python -m yay_agent tick-engagement
# Legacy実送信(通常運用では使わない)
python -m yay_agent tick-reply
python -m yay_agent tick-followup --limit 1
python -m yay_agent tick-outbound --limit 1
python -m yay_agent tick-post
python -m yay_agent tick-timeline-reply --limit 1
python -m yay_agent tick-timeline-like --batch-limit 50 --page-limit 3
# ダッシュボード(状況確認・効果測定・手動DM送信)
python -m yay_agent dashboard --port 8666| 変数 | 既定 | 意味 |
|---|---|---|
YAY_EMAIL / YAY_PASSWORD |
- | Yay!アカウント |
YAY_LLM_API_KEY / YAY_LLM_BASE_URL / YAY_LLM_MODEL |
- | OpenAI互換LLM backend |
AGENT_MODE |
draft |
draft=下書きのみ / live=実送信 |
TARGET_GENDER |
1 |
1=女性のみ / 0=男性のみ |
OUTBOUND_HOURLY_LIMIT / OUTBOUND_DAILY_LIMIT |
30 / 300 | 初回DMのhard cap |
REPLY_DAILY_LIMIT |
0 | DM返信の日次上限(0=無制限) |
POST_HOURLY_LIMIT / POST_DAILY_LIMIT |
1 / 4 | 投稿のhard cap |
POST_REPLY_HOURLY_LIMIT / POST_REPLY_DAILY_LIMIT |
6 / 40 | 公開返信のhard cap |
SAVE_MEDIA |
0 | 画像・動画を保存するか |
PERSONA |
sample.json |
キャラ設定ファイル |
DASHBOARD_HOST / DASHBOARD_PORT |
127.0.0.1 / 8666 | ダッシュボード待受 |
python -m pytest -qMIT