Contents
タスク自動化の基本概念:エージェントチェーンと DAG 設計
タスク自動化を 「エージェントチェーン」 と 「DAG」 で表現すると、以下のようなメリットが得られます。
| メリット | 内容 |
|---|---|
| 依存関係の可視化 | 各タスク(ノード)とその前後関係(エッジ)が一目で分かるため、設計ミスを防げる。 |
| 並列実行の最適化 | DAG では循環が無いため、依存しないノードは同時に走らせることができ、処理時間を短縮できる。 |
| 障害切り分けが容易 | エージェントごとに独立したログ・リトライ設定が可能なので、失敗箇所の特定がシンプルになる。 |
この手法は Qiita 記事「AI タスク自動化のベストプラクティス」でも推奨されています(リンク先は 2025 年 12 月時点で有効です)。
実務で使えるタスク例①:株価・為替アラート+LINE 通知
1. YAML 定義サンプル
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
name: stock_forex_alert description: 株価と為替の変動を監視し、閾値超過時に LINE にプッシュ通知する agents: - name: fetch_stock type: http config: url: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=NI225&interval=5min&apikey=${STOCK_API_KEY} method: GET - name: fetch_forex type: http config: url: https://v6.exchangerate-api.com/v6/${FOREX_API_KEY}/latest/USD method: GET - name: evaluate type: python script: | import json, sys stock = json.loads(sys.stdin.readline()) forex = json.loads(sys.stdin.readline()) alerts = [] # 株価変動率(例:最新の終値と1時間前の終値を比較) latest = float(list(stock["Time Series (5min)"].values())[0]["4. close"]) hour_ago = float(list(stock["Time Series (5min)"].values())[12]["4. close"]) if abs((latest - hour_ago) / hour_ago * 100) > 2: alerts.append(f"株価変動 {abs(latest-hour_ago):.2f} ({(latest-hour_ago)/hour_ago*100:.2f}%)") # 為替変動率(USD/JPY) jpy = forex["conversion_rates"]["JPY"] if abs(jpy - ${PREV_JPY}) > 1.5: alerts.append(f"為替変動 {jpy:.2f} 円 (前回比 {jpy-${PREV_JPY']:.2f})") print(json.dumps({"alerts": alerts})) - name: notify_line type: webhook config: url: https://notify-api.line.me/api/notify headers: Authorization: "Bearer ${LINE_ACCESS_TOKEN}" steps: - uses: fetch_stock id: stock_res - uses: fetch_forex id: forex_res - uses: evaluate inputs: - ${stock_res.body} - ${forex_res.body} id: eval_res - if: "${eval_res.output.alerts | length > 0}" then: - uses: notify_line with: payload: | { "message": "${eval_res.output.alerts.join('\\n')}" } |
2. 設定手順とデバッグポイント
| 手順 | 内容 | 注意点 |
|---|---|---|
| API キー取得 | Alpha Vantage(株価)・ExchangeRate‑API(為替)・LINE Notify のトークンを取得し、環境変数 STOCK_API_KEY, FOREX_API_KEY, LINE_ACCESS_TOKEN に格納。 |
無料プランはレートリミットがあるので、実運用時は間隔調整が必須。 |
| 前回為替レート保存 | ${PREV_JPY} には前回取得した JPY/USD を永続ストレージ(例:ローカルファイル prev_jpy.txt)から読み込む設定を追加すると安全。 |
ファイルが無い場合は初期値として現在レートを書き出すロジックを組み込む。 |
| dry‑run デバッグ | openclaw run stock_forex_alert.yaml --dry-run --log-level debug で各ステップの入出力を確認。 |
HTTP ステータスが 401/403 のときはヘッダー・クエリ文字列のスペルミスが原因になることが多い。 |
| ログ取得 | 実行結果は ~/.openclaw/logs に JSON 形式で保存され、失敗時は --log-file ./run.log オプションで外部に出力できる。 |
ログは機密情報を含む可能性があるため、保管場所のアクセス制御を徹底する。 |
実務で使えるタスク例②:Google カレンダー & タスクリストから業務サマリー作成
1. YAML 定義サンプル
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
name: daily_summary description: 本日の Google カレンダーと Tasks を集計し、メールで送信する agents: - name: fetch_calendar type: google_api config: scope: https://www.googleapis.com/auth/calendar.readonly calendar_id: primary time_range: "today" - name: fetch_tasks type: google_api config: scope: https://www.googleapis.com/auth/tasks.readonly tasklist_id: "@default" time_range: "today" - name: build_report type: python script: | import json, datetime, sys cal = json.loads(sys.stdin.readline()) tasks = json.loads(sys.stdin.readline()) lines = [] for ev in cal.get("items", []): start = ev["start"].get("dateTime") or ev["start"].get("date") lines.append(f"📅 {ev['summary']} ({start})") for t in tasks.get("items", []): lines.append(f"✅ {t['title']}") today = datetime.date.today().isoformat() report = "\n".join(lines) or "本日の予定はありません。" print(json.dumps({"subject": f"{today} の業務サマリー", "body": report})) - name: send_mail type: smtp config: host: smtp.gmail.com port: 587 username: "${GMAIL_USER}" password: "${GMAIL_PASS}" steps: - uses: fetch_calendar id: cal_res - uses: fetch_tasks id: task_res - uses: build_report inputs: - ${cal_res.body} - ${task_res.body} id: report_res - uses: send_mail with: to: "${REPORT_RECIPIENT}" subject: "{{ report_res.output.subject }}" body: "{{ report_res.output.body }}" |
2. Google API のセットアップ手順
- Google Cloud プロジェクト作成 → 「OAuth 同意画面」で「外部」ユーザーを選択し、必要情報(アプリ名・サポートメール)を入力。
- API 有効化 →
Calendar APIとTasks APIをそれぞれ有効にする。 - 認証情報作成 → 「OAuth クライアント ID」→「デスクトップ アプリ」を選択し、生成された
client_secret.jsonをプロジェクトルートに配置。 - 初回実行時にブラウザが起動し、Google アカウントで認可するとトークンがローカルに保存され、以降は自動的にリフレッシュされる。
3. デバッグのポイント
| 現象 | 原因例 | 解決策 |
|---|---|---|
fetch_calendar が空配列 |
タイムゾーンが UTC に固定されている | time_range: "today" はローカルタイムゾーンを基準にするため、環境変数 TZ を設定(例:export TZ=Asia/Tokyo)。 |
SMTP 認証失敗 (535) |
2 段階認証が有効なままパスワードだけを使用 | Google アカウントで「アプリ パスワード」を作成し、.env に GMAIL_PASS として設定。 |
OAuth エラー invalid_grant |
保存されたトークンが期限切れまたは削除されている | openclaw auth google --reset で再認証を実施。 |
実務で使えるタスク例③:ローカルファイル整理・ブラウザ操作・Slack 通知
1. ワークフロー全体像
| ステップ | 内容 | 必要な権限 |
|---|---|---|
| ファイル整理 | ~/Downloads 内の画像と PDF をサブフォルダへ自動振り分け |
ファイルシステムへの読み書き権限 |
| ブラウザ操作 | 社内ポータルにログインし、レポートページを PDF 出力(ヘッドレス Chrome) | chromedriver と Chrome の実行権限 |
| Slack 通知 | 生成した PDF を特定チャンネルへアップロードし、完了メッセージを送信 | Slack Bot Token (xoxb-…) |
2. YAML 定義例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
name: file_browser_slack_flow description: ダウンロードフォルダ整理 → 社内レポート取得 → Slack に結果通知 agents: - name: move_files type: python script: | import pathlib, shutil, sys src = pathlib.Path("/home/user/Downloads") for p in src.iterdir(): if p.suffix.lower() in {".png", ".jpg", ".jpeg"}: dst = src / "images" elif p.suffix.lower() == ".pdf": dst = src / "pdfs" else: continue dst.mkdir(exist_ok=True) shutil.move(str(p), str(dst / p.name)) print("move_done") - name: browse_report type: selenium config: driver_path: "/usr/local/bin/chromedriver" headless: true script: | from selenium import webdriver from selenium.webdriver.common.by import By import time, os, sys options = webdriver.ChromeOptions() options.add_argument("--headless") driver = webdriver.Chrome(executable_path="${driver_path}", options=options) driver.get("https://portal.example.com/login") driver.find_element(By.NAME, "username").send_keys("${PORTAL_USER}") driver.find_element(By.NAME, "password").send_keys("${PORTAL_PASS}") driver.find_element(By.ID, "loginBtn").click() time.sleep(2) # ログイン完了待ち driver.get("https://portal.example.com/report") time.sleep(3) pdf_path = "/tmp/portal_report.pdf" # Chrome の印刷ダイアログを直接操作できないため、DevTools の Page.printToPDF を利用 result = driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True}) with open(pdf_path, "wb") as f: f.write(bytes.fromhex(result["data"])) driver.quit() print(pdf_path) - name: notify_slack type: webhook config: url: https://slack.com/api/files.upload headers: Authorization: "Bearer ${SLACK_BOT_TOKEN}" steps: - uses: move_files id: move_res - uses: browse_report id: pdf_res - uses: notify_slack with: payload: | { "channels": "#automation", "initial_comment": "ファイル整理とレポート取得が完了しました。", "file": "@${pdf_res.output}" } |
3. 権限・シークレット管理のベストプラクティス
- 環境変数は OS のシークレットストア(macOS Keychain、Linux Secret Service)に保存し、
openclaw run時に自動注入。 chromedriverは実行権限 (chmod +x) を付与した上で、バージョンが Chrome 本体と合致しているか公式サイトで必ず確認すること。- Slack のファイルアップロードは Bot Token が必要です。トークンは
files:writeスコープを付与し、期限切れにならないように定期的にローテーションすることが推奨されます。
導入手順・ベストプラクティス・トラブルシューティング
1. インストールとバージョン確認
|
1 2 3 4 5 6 7 8 9 10 |
# 仮想環境作成(必須) python -m venv .openclaw_env source .openclaw_env/bin/activate # Windows: .\.openclaw_env\Scripts\activate # OpenClaw 本体のインストール pip install --upgrade openclaw==2.4.0 # バージョン表示 openclaw --version # 期待出力: 2.4.0 |
2. API キー・シークレットの登録
| 手段 | 設定例 |
|---|---|
.env ファイル (開発時) |
OPENCLAW_API_KEY=xxxxxSTOCK_API_KEY=yyyyy |
| GitHub Actions の Secrets | secrets.OPENCLAW_API_KEY へ格納し、workflow 内で ${{ secrets.OPENCLAW_API_KEY }} を使用。 |
| HashiCorp Vault | vault kv get secret/openclaw/api_key → 環境変数にエクスポート |
注意:YAML ファイル内にはプレースホルダー (
${VAR_NAME}) だけを書き、実際の値がコードベースに残らないようにしてください。
3. 共通エラーパターンと対処法
| エラー | 原因例 | 解決策 |
|---|---|---|
PermissionError: [Errno 13] |
実行ユーザーが対象ディレクトリへ書き込み不可 | chmod u+w /path/to/dir または sudo chown $USER /path/to/dir |
KeyError: 'OPENCLAW_API_KEY' |
.env がロードされていない、または名前ミス |
pip install python-dotenv && export $(cat .env | xargs) |
HTTPError 401 (Google API) |
OAuth トークン期限切れ、スコープ不足 | openclaw auth google --reset → 再認可し、必要スコープを明示的に付与。 |
WebDriverException: unknown error: Chrome failed to start |
chromedriver と Chrome のバージョン不一致 |
公式サイトから対象 Chrome バージョンに合わせた chromedriver を再取得。 |
4. ロギング・監査の実装例
|
1 2 3 |
# 実行時に JSON 形式でログを保存 openclaw run all_in_one_demo.yaml --log-file ./logs/run_$(date +%F_%H%M).json --log-level debug |
- JSON ログは検索・可視化が容易なため、SIEM ツールや ELK Stack へ流すと運用監査が楽になります。
- 失敗タスクだけを抽出したい場合は
jq '.tasks[] | select(.status=="failed")'といったフィルタリングが有効です。
まとめ
- OpenClaw v2.4 はエージェントチェーンと DAG によるタスク設計を標準装備し、ローカル環境だけで高度な自動化が可能です。
- 「エージェントチェーン + DAG」という構造化手法は依存関係の可視化・並列実行・障害切り分けに優れ、Qiita のベストプラクティスとも合致します。
- 本稿で紹介した 3 つの実務例(株価/為替アラート、Google カレンダーサマリー、ファイル整理+ブラウザ操作+Slack 通知)はすべて YAML 1 ファイルで完結し、
openclaw runコマンドだけでデプロイ可能です。 - 導入時は 仮想環境の利用 → API キー・シークレットの安全な管理 → ロギングとリトライ設定 を徹底すれば、障害耐性とセキュリティを同時に確保できます。
ぜひ公式ドキュメントと GitHub リポジトリ(openclaw/openclaw)を参照しつつ、上記テンプレートを自社の業務フローに合わせてカスタマイズしてください。
本稿は 2026 年 4 月現在の情報を元に作成しています。バージョンや外部サービスの仕様が変わる可能性がありますので、最新リリースノートと各 API の公式ドキュメントをご確認ください。