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_status と handled_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 実装の全記録