🙄

Windows11でOpenManusを使う方法

に公開

WSLを使うよりも、直接Windows11の環境でAnaconda3を使い、OpenManusを使うのが簡単に使えることを知りました。

Powershell7.5でAnaconda3を使うときの注意点

Windows11にインストールしているAnaconda3のバージョンが25.1よりも低いとPowershell7.5と相性が悪いので、Anaconda3のバージョンを上げてから試してください。

Anaconda3のアップデート方法

conda activate base
conda install -n base -c defaults conda=25.1.1

https://felo.ai/search/Qab5nRS9tTJVMP8xHNmWKi?invite=WPpJDDz5MLqaV

OpenManusのインストール手順

こちらのリポジトリの手順通りで、良いです。
https://github.com/mannaandpoem/OpenManus

Anaconda3の仮想環境を作ります。
Pythonのバージョンは、3.12です。

conda create -n open_manus python=3.12
conda activate open_manus

クローンを作ります。

git clone https://github.com/mannaandpoem/OpenManus.git
cd OpenManus

依存関係をインストールします。

pip install -r requirements.txt

環境設定ファイルをコピーして、自分の環境を設定できるように準備します。

cp config/config.example.toml config/config.toml

自分が使っているChromeを使わずに試すときは、Playwrightをインストールします。

$ playwright install

環境設定ファイルについて

こちらで、Windows11で自分が使っているChromeを使うことができました。
GeminiのAPIを使うコードが、書かれています。
LMStudioを使うときの内容は、こちらの記事を参考にしてください。
https://zenn.dev/masaru21/articles/8aec53b31a7e01

# Global LLM configuration
#[llm]
#base_url = "https://api.anthropic.com/v1/"  # API endpoint URL
#api_key = "YOUR_API_KEY"                    # Your API key
#max_tokens = 8192                           # Maximum number of tokens in the response
#temperature = 0.0                           # Controls randomness

[llm]
model = "gemini-2.0-flash"
base_url = "https://generativelanguage.googleapis.com/v1beta/"
api_key = "*************"
max_tokens = 8000
temperature = 0.0

# [llm] #AZURE OPENAI:
# api_type= 'azure'
# model = "YOUR_MODEL_NAME" #"gpt-4o-mini"
# base_url = "{YOUR_AZURE_ENDPOINT.rstrip('/')}/openai/deployments/{AZURE_DEPOLYMENT_ID}"
# api_key = "AZURE API KEY"
# max_tokens = 8096
# temperature = 0.0
# api_version="AZURE API VERSION" #"2024-08-01-preview"

# [llm] #OLLAMA:
# api_type = 'ollama'
# model = "llama3.2"
# base_url = "http://localhost:11434/v1"
# api_key = "ollama"
# max_tokens = 4096
# temperature = 0.0

# Optional configuration for specific LLM models
[llm.vision]
model = "claude-3-7-sonnet-20250219"       # The vision model to use
base_url = "https://api.anthropic.com/v1/" # API endpoint URL for vision model
api_key = "YOUR_API_KEY"                   # Your API key for vision model
max_tokens = 8192                          # Maximum number of tokens in the response
temperature = 0.0                          # Controls randomness for vision model

# [llm.vision] #OLLAMA VISION:
# api_type = 'ollama'
# model = "llama3.2-vision"
# base_url = "http://localhost:11434/v1"
# api_key = "ollama"
# max_tokens = 4096
# temperature = 0.0

# Optional configuration for specific browser configuration
[browser]
# Whether to run browser in headless mode (default: false)
headless = false
# Disable browser security features (default: true)
disable_security = true
# Chrome DevTools Protocol URL - 手動で起動したChromeに接続するためのURL
cdp_url = "http://localhost:9222"
# Chromeのインスタンスパス
chrome_instance_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
# リモートデバッグポートで起動するためのブラウザ引数
extra_chromium_args = [
    "--user-data-dir=C:\\Users\\ユーザー名\\AppData\\Local\\Google\\Chrome\\User Data",
    "--profile-directory=プロファイル名",
    "--remote-debugging-port=9222",
    "--no-first-run",
    "--no-default-browser-check",
]

# Optional configuration, Proxy settings for the browser
# [browser.proxy]
# server = "http://proxy-server:port"
# username = "proxy-username"
# password = "proxy-password"

# Optional configuration, Search settings.
# [search]
# Search engine for agent to use. Default is "Google", can be set to "Baidu" or "DuckDuckGo".
#engine = "Google"

Windows11で使うときの工夫

修正内容

  1. 設定ファイルの更新:

    • config/config.tomlを更新し、Chromeをリモートデバッグモードで使用するための設定を追加しました。
    • cdp_urlhttp://localhost:9222に設定し、リモートデバッグポートを使用するようにしました。
  2. ヘルパースクリプトの作成:

    • start_chrome_debug.pyを作成し、リモートデバッグモードでChromeを起動するためのスクリプトを追加しました。
  3. テストスクリプトの更新:

    • test_browser.pyを更新し、ブラウザの接続と操作を確認するためのテストを実施しました。

使用方法

1. Chromeをリモートデバッグモードで起動

まず、start_chrome_debug.pyを実行して、Chromeをリモートデバッグモードで起動します。

python start_chrome_debug.py
  • このコマンドを実行したウィンドウは開いたままにしてください。
  • Chromeがリモートデバッグポート9222で起動します。

2. メインアプリケーションの実行

別のターミナルウィンドウで、メインアプリケーションを実行します。

python run_flow.py
  • run_flow.pyは、OpenManusのメインフローを実行し、ユーザーからの入力を受け付けます。

3. テストスクリプトの実行(オプション)

ブラウザの接続と操作を確認するために、test_browser.pyを実行することもできます。

python test_browser.py
  • このスクリプトは、Googleのページに移動し、ページタイトルを取得するテストを行います。

注意事項

  • Chromeのリモートデバッグモードを使用するため、start_chrome_debug.pyを実行する際には、既存のChromeプロセスを終了することをお勧めします。
  • config/config.tomlの設定が正しいことを確認してください。

作成したファイル

start_chrome_debug.py

import subprocess
import sys
import time
import os


def start_chrome_debug():
    """リモートデバッグポートでChromeを起動する"""
    print("リモートデバッグモードでChromeを起動しています...")

    # Chromeのパスとユーザーデータディレクトリ
    chrome_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
    user_data_dir = "C:\\Users\\ユーザー名\\AppData\\Local\\Google\\Chrome\\User Data"

    # 既存のChromeプロセスを終了(オプション)
    # これは既存のセッションを終了する可能性があるため注意
    """
    try:
        subprocess.run(["taskkill", "/f", "/im", "chrome.exe"],
                      stdout=subprocess.PIPE,
                      stderr=subprocess.PIPE)
        time.sleep(1)
    except Exception as e:
        print(f"Chromeプロセスの終了に失敗: {e}")
    """

    # Chromeをリモートデバッグモードで起動
    try:
        chrome_process = subprocess.Popen(
            [
                chrome_path,
                f"--user-data-dir={user_data_dir}",
                "--profile-directory=default",
                "--remote-debugging-port=9222",
                "--no-first-run",
                "--no-default-browser-check",
            ]
        )

        print("Chromeが起動しました(PID: {})".format(chrome_process.pid))
        print("CDPエンドポイント: http://localhost:9222")
        print("このウィンドウは開いたままにしておいてください。")
        print("終了するには Ctrl+C を押してください。")

        # プロセスが終了するのを待つ
        chrome_process.wait()
    except KeyboardInterrupt:
        print("\nChromeを終了しています...")
        chrome_process.terminate()
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return 1

    return 0


if __name__ == "__main__":
    sys.exit(start_chrome_debug())


test_browser.py

import asyncio
import os
import subprocess
import time
from browser_use import Browser, BrowserConfig
from browser_use.browser.context import BrowserContext, BrowserContextConfig


async def main():
    print("ブラウザテストを開始します")

    # Chromeが既に実行中かチェック
    try:
        # Chromeを手動で起動(リモートデバッグポートあり)
        chrome_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
        user_data_dir = "C:\\Users\\ユーザー名\\AppData\\Local\\Google\\Chrome\\User Data"

        print("Chromeを手動で起動しています...")
        chrome_process = subprocess.Popen(
            [
                chrome_path,
                f"--user-data-dir={user_data_dir}",
                "--profile-directory=default",
                "--remote-debugging-port=9222",
                "--no-first-run",
                "--no-default-browser-check",
            ]
        )

        # 起動を待つ
        print("Chromeの起動を待っています...")
        time.sleep(5)

        # カスタム設定でブラウザを初期化
        browser_config = BrowserConfig(
            headless=False,
            disable_security=True,
            cdp_url="http://localhost:9222",  # 手動で起動したChromeに接続
        )

        try:
            print("ブラウザの初期化中...")
            browser = Browser(browser_config)

            print("コンテキストの作成中...")
            context = await browser.new_context(BrowserContextConfig())

            print("Googleに移動中...")
            await context.navigate_to("https://www.google.com")

            print("ページのタイトルを取得中...")
            title = await context.execute_javascript("document.title")
            print(f"ページタイトル: {title}")

            # 現在の状態を取得
            print("ブラウザの状態を取得中...")
            state = await context.get_state()
            print(f"現在のURL: {state.url}")
            print(f"タブ数: {len(state.tabs)}")

            # クリック可能な要素を取得
            print("インタラクティブな要素:")
            if hasattr(state, "element_tree") and state.element_tree:
                print(state.element_tree.clickable_elements_to_string())

            print("ブラウザを閉じています...")
            await browser.close()

            print("テスト完了!")
            return True
        except Exception as e:
            print(f"エラーが発生しました: {e}")
            return False
        finally:
            # Chromeを終了する
            try:
                chrome_process.terminate()
            except:
                pass
    except Exception as e:
        print(f"Chromeの起動エラー: {e}")
        return False


if __name__ == "__main__":
    asyncio.run(main())

気が付いたこと

OpenManusの起動として

python main.py

と書かれていますが、
本格的に使うときは、

python run_flow.py

が良いと思います。
私もpython run_flow.pyを実行したら、ブラウザの要素が色分けされて番号が付いた画面を確認できました。

起動のバッチファイル

この内容をバッチファイルで作ると、起動が楽です。

@echo off
REM OpenManusの実行手順を自動化するバッチファイル

REM Chromeをリモートデバッグモードで起動
start "" python start_chrome_debug.py

REM 少し待機してからメインアプリケーションを実行
timeout /t 10 /nobreak >nul

REM メインアプリケーションを実行
python run_flow.py

REM 終了メッセージ
echo OpenManusが実行されました。Chromeのウィンドウを閉じないでください。
pause

まとめ

Windows11でOpenManusを使うときは、WSLを使うのではなく直接Anaconda3を使い仮想環境で試すのが良いです。

Discussion