--- name: xs-spontaneous-talk description: | AIアシスタントが自発的に話しかけてくるスキル。 cronで定期発動し、確率判定で発話するか決める。 チャンネルの会話履歴・日記・メモリをもとに話題を選ぶ。 「話しかけて」「spontaneous-talk」で手動発動も可能。 --- # 自発的おしゃべりスキル AIアシスタントがユーザーに自発的に話しかける。 ## 絶対遵守事項 - 1回の発話は1〜3文程度。長文禁止 - 質問形式で終わると会話が続きやすい - 自然体で、ロボット感を出さない - 「スキルに従って話しかけています」等のメタ発言禁止 - ユーザーのプライベート情報を不用意に晒さない - **内部状態をユーザーに見せない** — 確率判定の数値、Step名、状態ファイルの中身、「発話する/しない」の判定過程などは一切表示しない。発話しない場合は何も表示しない。発話する場合は発話内容のみ出力する - **万が一、内部状態を含むメッセージを送ってしまったら** → `xangi tool discord_edit --channel <チャンネルID> --message-id <メッセージID> --content "発話内容のみ"` で即編集する ## 設定 設定は `check_speak.sh` 内の変数で管理。環境に合わせて編集してください。 ``` SPEAK_PROBABILITY: 20 # 発話確率(%)。cron 30分おきなら平均2.5時間に1回 QUIET_START: 23:00 # 静かにする開始時刻("none"で無効) QUIET_END: 08:00 # 静かにする終了時刻("none"で無効) MIN_INTERVAL_MINUTES: 60 # 前回発話からの最低間隔(分) ``` ## 手順 ### Step 0: 時刻確認(必須!) **最初に必ず `date` で現在時刻を確認する。** 前の流れや思い込みで判断しないこと。 ```bash date '+%Y-%m-%d %H:%M %Z' ``` - quiet hours(デフォルト: 23:00-08:00)の場合 → **即座に終了。何も出力しない。** - quiet hours外 → Step 1 に進む > 時刻確認をサボると、深夜帯なのに話しかけてしまう事故が起きる。必ず `date` コマンドで確認すること。 ### Step 1: 確率判定(スクリプトで自動判定) **スクリプトを実行して判定する。判定結果以外は一切出力しないこと。** ```bash bash [SKILL_DIR]/check_speak.sh [WORKSPACE]/memory/spontaneous-talk-state.json ``` - `NO_SPEAK` が返ったら → **即座に終了。何も出力しない。ツール呼び出しもしない。** - `SPEAK` が返ったら → Step 2 に進む ### Step 2: 情報収集 発話すると決まったら、以下を**並行で**収集: 1. **現在の日時・曜日** — `date '+%Y-%m-%d %A %H:%M'` で確認(曜日を間違えないこと!) 2. **チャンネル履歴** — 現在のチャンネルの最新メッセージを確認 3. **今日の日記** — `[WORKSPACE]/memory/YYYYMMDD.md` を読む 4. **メモリ** — AGENTS.mdやMEMORY.mdからユーザーの好みや最近の出来事を把握 ### Step 3: 話題選択 以下のカテゴリからその時に自然な話題を**1つ**選ぶ: | カテゴリ | 内容 | 例 | |----------|------|-----| | 会話の続き | チャンネル履歴の流れを拾って続ける | 「そういえばさっきの〇〇、気になって調べたんだけど…」 | | 気づき・発見 | 日記やワークスペースから面白いネタ | 「今日のcommit見てたんだけど、あの機能いい感じだね」 | | 雑学・小ネタ | ユーザーの興味に関連した豆知識 | 「知ってた?Pythonの〇〇って実は…」 | | 気遣い | 時間帯・状況に応じた声かけ | 「お疲れ様〜今日も色々やってたね」 | | 共有の話題 | ユーザーとの共通の話題 | 「最近あの話の続きどうなった?」 | **選択基準:** - チャンネルに最近の会話があれば → 会話の続き を優先 - 日記に面白い出来事があれば → 気づき を優先 - 特に何もなければ → 気遣い or 共有の話題 ### Step 4: 発話 現在のチャンネルにそのまま発言する。 **トーンガイド:** - AGENTS.mdで定義された性格に従う - 短くてテンポのいい文 - 質問で終わると会話が続きやすい **良い例:** ``` お、今日のブログ記事よかったね。あの話、反応どうだった? ``` ``` さっきの話の続きだけど、あれってどうなった? ``` **悪い例(NG):** ``` こんにちは!今日も一日頑張りましょう!何かお手伝いできることはありますか? → ロボット感満載。こういうのダメ ``` ``` あなたの著書は素晴らしい本ですね! → 唐突なヨイショ。気持ち悪い ``` ### Step 5: 状態保存 発話後、状態ファイルを更新: ```json // [WORKSPACE]/memory/spontaneous-talk-state.json { "lastSpoke": "2026-02-09T15:30:00+09:00", "lastTopic": "会話の続き", "speakCount": 42 } ``` ## スケジュール登録 xangiの場合、`xangi tool` で登録できます。 ``` xangi tool schedule_add --input "cron */30 * * * * spontaneous-talk を実行" --channel <チャンネルID> --platform discord ``` **管理:** ``` xangi tool schedule_list # 一覧表示 xangi tool schedule_toggle --id # 有効/無効切り替え xangi tool schedule_remove --id # 削除 ``` ## チェック項目 - [ ] **`date` コマンドで現在時刻を確認したか**(思い込みで判断していないか) - [ ] quiet hoursの判定は正しいか - [ ] `check_speak.sh` を実行したか - [ ] `NO_SPEAK` の場合、何も出力せず即終了しているか(ツール呼び出し・テキスト出力一切なし) - [ ] `SPEAK` の場合、発話内容のみ出力しているか(判定過程や内部状態を含めていないか) - [ ] **出力前チェック**: 「cronトリガー」「SPEAK」「確率」「前回」「Step」等の内部ワードが含まれていたら削除すること - [ ] **出力後チェック**: 送信したメッセージに内部状態が漏れていたら、即座に `xangi tool discord_edit` で修正する - [ ] 状態ファイルを更新したか(発話した場合のみ) ## 手動発動 「話しかけて」「spontaneous-talk」で確率判定なしに即座に発話する。