AIスキル実装の裏側:OpenClawで秘書を育てる

AIスキル実装の裏側:OpenClawで秘書を育てる

「このメール、対応済みにして」

そう言うだけで、AIアシスタントがメールを処理してくれる。

「次の予定を教えて」と聞けば、カレンダーから情報を引き出してくれる。

こういう「秘書的なAI」を作るとき、どう設計して、どう実装していくのか。

今回は、OpenClawというAIフレームワークで「Gmail Watcher V2」を構築した経験をもとに、スキル実装の裏側を解説する。

OpenClawとは

OpenClawは、AIアシスタントを自分好みにカスタマイズできるフレームワークだ。

特徴:
スキルベース: 機能ごとに「スキル」として実装
セッション管理: チャット履歴やタスクを記録
拡張性: 既存スキルを組み合わせて新しい機能を作れる

公式サイト: https://openclaw.ai

私は OpenClaw 上で「Gmail Watcher V2」というスキルを構築した。これは「重要メールを逃さないための自動監視システム」だ。

スキル設計の考え方

スキルを作るとき、最初に考えるべきは「どこまで自動化するか」だ。

Gmail Watcher V2 の場合:

自動化する範囲

  • メール受信の検知
  • 重要度の判定(High / Hold / Digest / Ignore)
  • Telegram通知の送信
  • 再通知(未対応メールのリマインド)

人間が判断する範囲

  • 「対応済み」「不要」「後で」の選択
  • タスク化するかどうか
  • 返信内容

完全自動化すると、誤判定で重要なメールを見逃すリスクがある。だから「判定は自動、最終判断は人間」という設計にした。

段階的な機能追加

スキルを一度に完璧に作ろうとしない。段階的に機能を追加していく。

Phase 1: 基本機能

  • Gmail API連携
  • 未読メール取得
  • 重要度判定(4段階)
  • Telegram通知

ここまでで「とりあえず動く」状態を作る。

Phase 2: 再通知機能

  • 未対応メールの再通知(High: 1時間後、Hold: 3時間後)
  • ホワイトリスト対応(岩野圭佑さんなど重要送信元)
  • スヌーズ機能

「見落とし防止」を強化した。

Phase 3: インラインボタン

  • 「✅ 対応済み」「🗑️ 不要」「⏰ 後で」ボタン
  • ボタン押下時の即時フィードバック
  • 元のメッセージ編集

「操作性の改善」に注力した。

Phase 4: 自動タスク化(予定)

  • 高信頼度メールを自動でタスク登録
  • 期限抽出(「3日後までに」などの表現を解析)
  • カレンダー統合

「完全自動化」に向けた拡張。

実装の工夫

1. データベース設計

CREATE TABLE emails (
    message_id TEXT PRIMARY KEY,
    subject TEXT,
    sender_email TEXT,
    classification TEXT,  -- high / hold / digest / ignore
    notification_status TEXT,  -- pending / sent / ignored
    handled_status TEXT,  -- unhandled / handled / ignored
    last_notified_at TEXT,
    created_at TEXT
);

ポイント:
notification_statushandled_status を分離
notification_status は「通知の状態」
handled_status は「対応の状態」

これにより、「通知は送ったが未対応」「通知不要だが処理済み」などの状態を正確に管理できる。

2. 既存メールの再処理防止

def is_already_processed(self, message_id):
    c.execute('SELECT id FROM emails WHERE message_id = ?', (message_id,))
    result = c.fetchone()

    if result:
        # 既存メールは無条件でスキップ
        return True

    return False

フィルター変更後も、既存メールは二度と処理しない。これにより「再通知スパム」を防ぐ。

3. ボタン押下の即時フィードバック

def edit_telegram_message(email_id, action):
    # 押されたボタンだけ無効化
    if action == 'handled':
        buttons = [
            {"text": "✓ 処理済み", "callback_data": "noop"},  # 無効化
            {"text": "🗑️ 不要", "callback_data": f"gmail_ignore:{email_id}"},
            {"text": "⏰ 後で", "callback_data": f"gmail_snooze:{email_id}"}
        ]

    # メッセージ編集
    subprocess.run(['openclaw', 'message', 'edit', '--buttons', json.dumps([buttons])], ...)

ボタンを押したら即座に「✓ 処理済み」に変わる。二度押しを防ぎ、操作感を向上させる。

デバッグの工夫

1. ログを丁寧に残す

self.log(f"  ✅ 再通知送信: {email['subject'][:40]}")
self.log(f"  ❌ 再通知失敗: {e}")

何が起きたかを即座に把握できるように、ログを詳細に残す。

2. テストモード

python3 gmail_watcher.py --check --silent

--silent オプションで、重要な通知だけを出力する。デバッグ時の雑音を減らす。

3. cronによる定期実行

{
  "schedule": {"kind": "every", "everyMs": 300000},
  "payload": {
    "kind": "systemEvent",
    "text": "cd /path/to/gmail-watcher && python3 gmail_watcher.py --check"
  }
}

5分ごとに自動実行し、動作を継続的に確認する。

AIと一緒に実装するコツ

1. 方針を明確に伝える

「ボタンを押したら即座に見た目を変えて」と具体的に指示する。曖昧な指示は誤解を招く。

2. 段階的に確認する

一度に全部を実装せず、機能ごとに確認しながら進める。

3. エラーは即座に共有する

「こういうエラーが出た」とログを貼り付けることで、AIが原因を特定しやすくなる。

スキル作成の楽しさ

スキルを作っていると、「自分専用の秘書を育てている」感覚になる。

最初は「メールを取得するだけ」だったのが、
– 重要度を判定できるようになり
– 再通知で見落としを防ぐようになり
– ボタン操作で即座に反応するようになり
– 将来的には自動タスク化までできるようになる

段階的に「できること」が増えていく過程が、本当に楽しい。

まとめ

OpenClaw でスキルを作るときのポイント:

  • 段階的に機能追加 → 一度に完璧を目指さない
  • データベース設計を丁寧に → 状態管理が命
  • 既存データの再処理を防ぐ → バグの温床を排除
  • AIと一緒に実装 → 方針を決めて、コードはAIに任せる

「自分専用の秘書を育てる」感覚で、スキルを作っていく。

これが、OpenClawでのスキル実装の醍醐味だ。


関連記事:
岩盤浴で寝落ちしてる間にAIが全自動でシステム構築した話
メール通知スパム問題をAIと一緒に3時間で解決した話
Gmail Watcher V2 実装の全記録