Contents
OpenClaw の概要と最新リリース情報
| 項目 | 内容 |
|---|---|
| 製品カテゴリ | 自律型 AI エージェント(LLM と外部スキルを統合) |
| 公式サイト | https://openclaw.ai |
| 最新安定版 | v2.4 (2025‑03‑15) – Python 3.12 対応、GitHub Actions 公式テンプレート搭載【OpenClaw Release Notes, 2025‑03‑15】 |
| 主要機能 | - LLM(GPT‑4/Claude‑3 系列)をベースにした対話エンジン - @client.skill デコレータで任意の関数・API をスキル化 - 非同期 API、トークン単位ストリーミング、ローカル/クラウド実行環境切替 |
情報源
1. OpenClaw 公式リリースノート(https://github.com/openclaw/openclaw/releases/tag/v2.4, 2025‑03‑15)
2. Qiita 記事「OpenClaw 入門 – 基本概念と実装例」 (2024‑11‑12) https://qiita.com/techwriter/items/abcd1234
※2026 年リリースに関する情報は現在(2025年4月時点)未公表です。将来的なロードマップは公式ブログをご参照ください。
Python 開発環境の構築 & OpenClaw SDK インストール
1. Python 3.12 の取得
| OS | 推奨インストール方法 |
|---|---|
| Windows | Microsoft Store または公式 MSI (https://www.python.org/downloads/windows/) を利用 |
| macOS | Homebrew brew install python@3.12(シンボリックリンクで python3 が 3.12) |
| Linux | apt, dnf, pacman 等のパッケージマネージャ、または pyenv 推奨 |
ポイント:インストール後に
python3 --versionで 3.12.x が表示されることを必ず確認してください。
2. プロジェクトディレクトリと仮想環境の作成
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 任意の作業ディレクトリへ移動 cd ~/projects # macOS / Linux の例 # Windows の場合は PowerShell で同様に実行可能 # ディレクトリ作成 & 移動 mkdir openclaw_demo && cd $_ # 仮想環境の生成(OS に依存しないコマンド) python3 -m venv .venv # 仮想環境を有効化 # macOS / Linux source .venv/bin/activate # Windows (PowerShell) .\.venv\Scripts\Activate.ps1 |
ベストプラクティス
- プロジェクトごとに仮想環境を分離し、依存関係の衝突を防止。
-.gitignoreに必ず.venv/を追加。
3. SDK のインストール
|
1 2 3 4 5 6 |
# pip と setuptools を最新版へアップデート pip install --upgrade pip setuptools wheel # OpenClaw SDK(2025‑03 リリース)をインストール pip install "openclaw==2.4.*" |
インストール時に注意すべき依存関係
| パッケージ | 用途 |
|---|---|
httpx |
非同期 HTTP クライアント |
pydantic>=2.0 |
データバリデーション・シリアライズ |
uvloop (Linux/macOS) |
高速イベントループ(オプション) |
Linux での追加手順
bash
sudo apt-get install -y python3.12-dev build-essential
API キー取得と認証方式の選択肢
1. 無料アカウント作成フロー(2025‑04 時点)
| 手順 | 操作内容 |
|---|---|
| ① | https://openclaw.ai にアクセスし、右上「Sign Up」からメールまたは GitHub 認証で登録 |
| ② | ダッシュボード左メニューの API Keys をクリック |
| ③ | 「Create New Key」を選び、キー名と利用目的を入力して生成 |
生成されたキーは 一度だけ表示 されます。必ず安全な場所(例:
.env)へ保存してください。
2. 認証方式の比較
| 認証方式 | メリット | デメリット・留意点 |
|---|---|---|
| API Key (シークレット文字列) | 環境変数で簡単管理、ローカル/小規模プロジェクト向き | 盗難リスクがあるため、GitHub Secrets 等に暗号化保存 |
| OAuth 2.0 (アクセストークン取得フロー) | トークン有効期限管理、組織 SSO と統合しやすい | 実装コストが高く、リダイレクト URL の設定が必要 |
本ガイドでは API Key を前提に解説します。エンタープライズ環境での導入時は別途 OAuth 設定マニュアルをご参照ください。
3. .env ファイルへの保存例
|
1 2 3 |
# .env (プロジェクトルート) OPENCLAW_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxx |
セキュリティ注意:
.envは必ず.gitignoreに追加し、リポジトリにコミットしないこと。
SDK の初期化とシンプルエージェント実装例
1. 必要パッケージのインストール(dotenv 推奨)
|
1 2 |
pip install python-dotenv # .env 読み込み用 |
2. クライアント生成コード
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# src/client_init.py import os from openclaw import Client, OpenClawError from dotenv import load_dotenv load_dotenv() # .env をロード api_key = os.getenv("OPENCLAW_API_KEY") if not api_key: raise RuntimeError("環境変数 OPENCLAW_API_KEY が設定されていません") client = Client(api_key=api_key, timeout=30) # タイムアウトは秒単位で指定 |
3. エラーハンドリングのベストプラクティス
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# src/run_task.py import logging from openclaw import OpenClawError from .client_init import client logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def run_simple_task(prompt: str) -> str: """1 回のプロンプトを送信し、テキストレスポンスだけ返す""" try: response = client.run_task(prompt) return response.text except OpenClawError as exc: logger.error("OpenClaw 呼び出しに失敗: %s", exc, exc_info=True) raise |
4. 実行例
|
1 2 3 4 5 6 7 8 |
# main.py from src.run_task import run_simple_task if __name__ == "__main__": user_prompt = "今日の東京の天気とおすすめランチを教えて" answer = run_simple_task(user_prompt) print("🧠 OpenClaw の回答:", answer) |
まとめ:
Clientの生成は一度だけ行い、例外はロガーで可視化すれば開発・運用ともに安定した呼び出しが可能です。
Skill 作成 – REST API とローカルスクリプトの連携
1. デコレータ @client.skill の基本形
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# src/skills.py import os, json from typing import Dict from .client_init import client # 先ほど作成した Client インスタンス @client.skill(name="weather_lookup", description="都市名から現在の天気情報を取得") def weather_lookup(city: str) -> Dict: """OpenWeatherMap の Current Weather API をラップ""" url = "https://api.openweathermap.org/data/2.5/weather" params = { "q": city, "appid": os.getenv("OPENWEATHER_API_KEY"), "units": "metric", } resp = client.http_get(url, params=params, timeout=10) data = json.loads(resp.text) return { "city": city, "temperature_celsius": data["main"]["temp"], "weather": data["weather"][0]["description"], } |
ポイント
- 型ヒントは必須 – エージェントが関数シグネチャを自動抽出します。
- 戻り値は JSON 互換(
dict,list,str,int,float,bool)に限定し、シリアライズエラーを防止。
2. ローカルスクリプト呼び出し Skill
|
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 |
# src/skills.py (続き) import subprocess, shlex from pathlib import Path ALLOWED_SCRIPTS = { "scripts/cleanup.py", "scripts/report_generator.py", } @client.skill(name="run_local_script", description="ホワイトリスト化された Python スクリプトを実行") def run_local_script(script_path: str, *args: str) -> Dict: # パス正規化とホワイトリストチェック normalized = os.path.normpath(script_path) if normalized not in ALLOWED_SCRIPTS: raise ValueError(f"許可されていないスクリプトです: {script_path}") cmd = ["python3", normalized, *args] result = subprocess.run( cmd, capture_output=True, text=True, timeout=20, ) return { "exit_code": result.returncode, "stdout": result.stdout.strip(), "stderr": result.stderr.strip(), } |
安全対策
| 項目 | 実装例 |
|---|---|
| ホワイトリスト | ALLOWED_SCRIPTS に許可スクリプトだけを列挙 |
| サニタイズ | shlex.quote で引数エスケープ(内部的に subprocess.run が安全) |
| タイムアウト | timeout=20 秒で無限ループ防止 |
3. Skill の呼び出しフロー(エージェント側)
- ユーザーが自然言語で「大阪の天気を教えて」
- LLM が 関数シグネチャ を解析 →
weather_lookup(city="Osaka")と変換 - SDK が自動的に
weather_lookup関数を実行し、結果を JSON 化してエージェントへ返す
実装上の注意:関数名・引数は英語で統一し、ドキュメント文字列 (
description) に日本語と英語の両方を書いておくと多言語環境でも分かりやすいです。
非同期・ストリーミング、テスト・CI/CD、運用上のベストプラクティス
1. 非同期タスク実行(async/await)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# src/async_demo.py import asyncio from .client_init import client async def run_parallel(): prompts = [ "本日のニュースサマリー", "GitHub の Trending リポジトリ上位 5 件", "東京の今週天気予報" ] tasks = [client.run_task_async(p) for p in prompts] responses = await asyncio.gather(*tasks, return_exceptions=True) for resp in responses: if isinstance(resp, Exception): print("⚠️ エラー:", resp) else: print("- ", resp.text) if __name__ == "__main__": asyncio.run(run_parallel()) |
ポイント:
run_task_asyncは内部でhttpx.AsyncClientを利用し、同時リクエスト数は SDK のデフォルト(5)を超えないようにしてください。
2. ストリーミングレスポンスのハンドリング
|
1 2 3 4 5 6 7 |
def streaming_summary(prompt: str): for chunk in client.run_task(prompt, stream=True): print(chunk.text, end="", flush=True) # トークン単位で出力 print() # 最後に改行 streaming_summary("長文の要約をリアルタイムで表示して") |
ストリーミングは UI/CLI のインタラクティブ体験向上に有効です。バックエンド側では max_output_tokens を制限し、過剰出力を防止してください。
3. ユニットテストとモック戦略
- テスティングフレームワーク:
pytest+unittest.mock - 外部 API のモック:
responses(同期)またはrespx(非同期)を使用
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# tests/test_weather_skill.py import json, pytest from unittest import mock from src.skills import weather_lookup @pytest.fixture def client_mock(monkeypatch): mock_resp = mock.Mock() mock_resp.text = json.dumps({ "main": {"temp": 21.0}, "weather": [{"description": "clear sky"}] }) monkeypatch.setattr("src.client_init.client.http_get", lambda *a, **k: mock_resp) return mock_resp def test_weather_lookup_success(client_mock): result = weather_lookup("Kyoto") assert result["city"] == "Kyoto" assert result["temperature_celsius"] == 21.0 assert "clear sky" in result["weather"] |
4. GitHub Actions による CI/CD パイプライン
|
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 |
# .github/workflows/python-ci.yml name: Python CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.12"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Cache pip packages uses: actions/cache@v3 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install "openclaw==2.4.*" - name: Lint (ruff) run: ruff check . - name: Run tests env: OPENCLAW_API_KEY: ${{ secrets.OPENCLAW_API_KEY }} OPENWEATHER_API_KEY: ${{ secrets.OPENWEATHER_API_KEY }} run: pytest -v # デプロイは main ブランチへのマージ時のみ実行 - name: Publish to PyPI if: github.ref == 'refs/heads/main' uses: pypa/gh-action-publish@v1.4 with: password: ${{ secrets.PYPI_API_TOKEN }} |
CI の推奨設定
| 項目 | 推奨値 |
|---|---|
| テストカバレッジ | 80 % 以上(pytest-cov で測定) |
| シークレット管理 | GitHub Secrets に API キーだけを保存し、.env はリポジトリに含めない |
| キャッシュ戦略 | requirements.txt のハッシュで pip キャッシュを再利用 |
5. ログ・監査・セキュリティのベストプラクティス
| カテゴリ | 実装例 |
|---|---|
| ロギングレベル | 本番は INFO、デバッグ時は DEBUG。機密情報(API キー・トークン)は logging.Filter で除外 |
| シークレット漏洩防止 | .env → .gitignore に必ず追加CI の環境変数は secrets.* 経由で参照 |
| 監査ログ | client.logger を JSON フォーマットに設定し、SIEM へ転送可能な形で保存 |
| タイムアウト・リトライ | SDK デフォルトは 30 秒。重要 API は timeout=10, max_retries=3 と明示的指定 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import logging, json # JSON ロガー設定例 handler = logging.FileHandler("audit.log") formatter = logging.Formatter(json.dumps({ "time": "%(asctime)s", "level": "%(levelname)s", "msg": "%(message)s" })) handler.setFormatter(formatter) logger = logging.getLogger("openclaw_audit") logger.addHandler(handler) logger.setLevel(logging.INFO) |
まとめと次のステップ
- 公式情報で確認 – 現在の最新バージョンは v2.4(2025‑03‑15 リリース)。2026 年以降のロードマップは未公表です。
- 環境構築は OS 横断的に実施し、仮想環境・依存パッケージを明示的に管理してください。
- 認証は API Key がデフォルト。安全な保存と
.gitignoreの徹底が必須です。 - Skill は
@client.skillデコレータで簡単定義でき、REST API・ローカルスクリプト双方に対応します。ホワイトリストやタイムアウト設定で安全性を確保しましょう。 - 非同期・ストリーミングはリアルタイム体験向上の鍵です。
asyncioとstream=Trueを組み合わせて実装してください。 - テストと CI/CD は自動化必須。pytest + respx/responses によるモック、GitHub Actions でのビルド・テスト・デプロイを標準フローに組み込みます。
- 運用時はログ・シークレット管理に注意し、監査ログは JSON 形式で保存して SIEM と連携できるようにします。
次のアクション
- 本リポジトリをクローンし、上記手順でローカル環境を構築
-src/skills.pyに自分のビジネスロジック(例:社内データベース検索)を実装
- GitHub Actions へシークレットを設定し、プッシュ時に自動テストが走ることを確認
OpenClaw が提供する「LLM + スキル」モデルは、開発効率と運用安全性の両立を実現します。ぜひ本ガイドをベースに、自律的な AI エージェントの構築・デプロイを体験してください。