RailsでPythonのbrowser-useを使う方法
RailsアプリケーションからPythonスクリプトを呼び出して
browser-useを使う方法を解説します。
概要
概要としては、Railsアプリケーションが置かれている
ルートディレクトリ下にPythonの仮想環境を作成。
Railsのrakeタスクから呼び出して実行する流れです。
前提条件
- Ruby 3.4.2
- Rails 8.0.2
- Python 3.13.2
- Gemini
Python3がすでにインストールされている前提でお話しします。
今回Geminiを使っています。
事前にGoogle AI StudioからAPIキーを取得し、credentialsに記述しておいてください。
セットアップ手順
まずはPythonの環境をセットアップしていきます
Pythonの仮想環境作成
Pythonはvenvという仮想環境を作ってプラグインなどのインストールを行うようです。
Rails でいう venv(Pythonの仮想環境)に相当するのは、Bundler(と Gemfile)による依存管理 + rbenv や rvm によるRubyバージョンの切り分けです。
ChatGPTより
$ python3 -m venv venv
$ source venv/bin/activate
browser-useのインストール
仮想環境に入った状態でインストールします。
# 仮想環境にbrowser-useなどのPythonパッケージをインストール
$ pip install browser-use requests playwright
# Playwright に必要なブラウザ(Chromium など)をインストール
$ python -m playwright install
requests: PythonでHTTP通信を行うためのライブラリです
playwright: browser-useが内部的に使っているため必要となるブラウザ操作ライブラリです。
browser-useを使う
今回は/script配下のPythonスクリプトを、
lib/tasksに置いたRakeタスクから呼びだして実行します。
my_app
├── app
├── lib
│ └── tasks
| └──sample.rake
└── script
└── sample.py
Pythonスクリプトを書く
こちらでは実際にbrowser-useを使って検索するスクリプトを書いていきます。
なお、今回のコードは実際の実装で書いたコードではありません。
このコードでの動作確認は行っておりませんのでご注意ください。
from langchain_google_genai import ChatGoogleGenerativeAI
from browser_use import Agent
import asyncio
async def main():
agent = Agent(
task="Googleで東京の最新の天気予報を調べて教えてください",
llm=ChatGoogleGenerativeAI(model="gemini-2.0-flash-exp"),
)
result = await agent.run()
print(result)
asyncio.run(main())
rakeタスクを書く
本題のRails側から呼び出して実行する方法です。
rakeタスク内でPythonスクリプトを実行します。
require "open3"
namespace :sample do
desc '今日の天気を調べる'
task fetch: :environment do
gemini_api_key = Rails.application.credentials.dig(:gemini, :api_key)
script_path = Rails.root.join("script", "sample.py")
# Pythonスクリプト実行
cmd = ["venv/bin/python", script_path.to_s]
env = { "GEMINI_API_KEY" => gemini_api_key }
stdout, stderr, status = Open3.capture3(env, *cmd)
if status.success?
puts "#{stdout.strip}"
else
puts "#{status}"
end
end
end
順番に解説します。
gemini_api_key = Rails.application.credentials.dig(:gemini, :api_key)
script_path = Rails.root.join("script", "sample.py")
ここで事前にcredentialsに登録しておいたAPIキーを呼び出します。
今回はGeminiなのでgemini_api_keyとしました。
script_pathにはPythonファイルのパスをしてしています。
cmd = ["venv/bin/python", script_path.to_s]
env = { "GEMINI_API_KEY" => gemini_api_key }
stdout, stderr, status = Open3.capture3(env, *cmd)
Open3でコマンドを実行し、Pythonスクリプトを動かします。
capture3を使っているのは、このあとの実行結果を表示させるためなので、
ここは用途に合わせて使い分けてください。
if status.success?
puts "#{stdout.strip}"
else
puts "#{status}"
end
実行結果を表示しています。
おまけ
Pythonの環境のためにvenvを使っており、おそらくルートディレクトリ下にvenvディレクトリが作られているかと思います。
これはGitHubなどのリモートリポジトリにはあげないほうが良いそうなので、
代わりに以下の方法でrequirements.txtを作成してあげてください。
$ pip freeze > requirements.txt
Discussion