Currently I have this code
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
:brief: Run multiple browser-use agents in parallel
"""
import asyncio
import os
from browser_use import Agent, Browser, BrowserConfig, Controller
from browser_use.browser.context import BrowserContext, BrowserContextConfig
from langchain_openai import ChatOpenAI
async def main():
controller = Controller()
llm = ChatOpenAI(model="gpt-4o", api_key=os.getenv("OPENAI_API_KEY"))
browser_config = BrowserConfig(
chrome_instance_path="/path/to/chrome",
headless=False,
disable_security=True,
extra_chromium_args=[
"--no-first-run",
"--no-default-browser-check",
"--disable-extensions",
"--new-window",
],
)
browser = Browser(config=browser_config)
context1 = BrowserContext(browser=browser)
context2 = BrowserContext(browser=browser)
agent = Agent(
task="Go to amazon and search for toys without logging in",
llm=llm,
controller=controller,
browser=browser,
browser_context=context1,
)
agent2 = Agent(
task="Go to Google and find the latest news",
llm=llm,
controller=controller,
browser=browser,
browser_context=context2,
)
await asyncio.gather(agent.run(), agent2.run())
if __name__ == "__main__":
asyncio.run(main())
But, it does not truly run in parellel. I was considering using ProcessPoolExecutor
but not sure how to mix concurrent.futures
and asyncio
cleanly. Essentially, the approach should be to create 2 different browser instances so that the agents can work in tandem.
Currently I have this code
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
:brief: Run multiple browser-use agents in parallel
"""
import asyncio
import os
from browser_use import Agent, Browser, BrowserConfig, Controller
from browser_use.browser.context import BrowserContext, BrowserContextConfig
from langchain_openai import ChatOpenAI
async def main():
controller = Controller()
llm = ChatOpenAI(model="gpt-4o", api_key=os.getenv("OPENAI_API_KEY"))
browser_config = BrowserConfig(
chrome_instance_path="/path/to/chrome",
headless=False,
disable_security=True,
extra_chromium_args=[
"--no-first-run",
"--no-default-browser-check",
"--disable-extensions",
"--new-window",
],
)
browser = Browser(config=browser_config)
context1 = BrowserContext(browser=browser)
context2 = BrowserContext(browser=browser)
agent = Agent(
task="Go to amazon and search for toys without logging in",
llm=llm,
controller=controller,
browser=browser,
browser_context=context1,
)
agent2 = Agent(
task="Go to Google and find the latest news",
llm=llm,
controller=controller,
browser=browser,
browser_context=context2,
)
await asyncio.gather(agent.run(), agent2.run())
if __name__ == "__main__":
asyncio.run(main())
But, it does not truly run in parellel. I was considering using ProcessPoolExecutor
but not sure how to mix concurrent.futures
and asyncio
cleanly. Essentially, the approach should be to create 2 different browser instances so that the agents can work in tandem.
1 Answer
Reset to default 0I found a simple reference implementation in the source code of browser-use. Essentially, we need to create a global browser object and share it amongst the various agents. They can be run in parallel using asyncio.gather
.
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import asyncio
from langchain_openai import ChatOpenAI
from browser_use.agent.service import Agent
from browser_use.browser.browser import Browser, BrowserConfig
from browser_use.browser.context import BrowserContextConfig
browser = Browser(
config=BrowserConfig(
disable_security=True,
headless=False,
new_context_config=BrowserContextConfig(save_recording_path='./tmp/recordings'),
)
)
llm = ChatOpenAI(model='gpt-4o')
async def main():
agents = [
Agent(task=task, llm=llm, browser=browser)
for task in [
'Search Google for weather in Tokyo',
'Check Reddit front page title',
'Look up Bitcoin price on Coinbase',
'Find NASA image of the day',
# 'Check top story on CNN',
# 'Search latest SpaceX launch date',
# 'Look up population of Paris',
# 'Find current time in Sydney',
# 'Check who won last Super Bowl',
# 'Search trending topics on Twitter',
]
]
await asyncio.gather(*[agent.run() for agent in agents])
await browser.close()
if __name__ == '__main__':
asyncio.run(main())