mirror of
https://github.com/browser-use/browser-use
synced 2026-04-22 17:45:09 +02:00
118 lines
3.7 KiB
Python
118 lines
3.7 KiB
Python
import discord
|
|
from discord.ext import commands
|
|
from dotenv import load_dotenv
|
|
from langchain_core.language_models.chat_models import BaseChatModel
|
|
|
|
from browser_use import BrowserConfig
|
|
from browser_use.agent.service import Agent, Browser
|
|
|
|
load_dotenv()
|
|
|
|
|
|
class DiscordBot(commands.Bot):
|
|
"""Discord bot implementation for Browser-Use tasks.
|
|
|
|
This bot allows users to run browser automation tasks through Discord messages.
|
|
Processes tasks asynchronously and sends the result back to the user in response to the message.
|
|
Messages must start with the configured prefix (default: "$bu") followed by the task description.
|
|
|
|
Args:
|
|
llm (BaseChatModel): Language model instance to use for task processing
|
|
prefix (str, optional): Command prefix for triggering browser tasks. Defaults to "$bu"
|
|
ack (bool, optional): Whether to acknowledge task receipt with a message. Defaults to False
|
|
browser_config (BrowserConfig, optional): Browser configuration settings.
|
|
Defaults to headless mode
|
|
|
|
Usage:
|
|
```python
|
|
from langchain_openai import ChatOpenAI
|
|
|
|
llm = ChatOpenAI()
|
|
bot = DiscordBot(llm=llm, prefix='$bu', ack=True)
|
|
bot.run('YOUR_DISCORD_TOKEN')
|
|
```
|
|
|
|
Discord Usage:
|
|
Send messages starting with the prefix:
|
|
"$bu search for python tutorials"
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
llm: BaseChatModel,
|
|
prefix: str = '$bu',
|
|
ack: bool = False,
|
|
browser_config: BrowserConfig = BrowserConfig(headless=True),
|
|
):
|
|
self.llm = llm
|
|
self.prefix = prefix.strip()
|
|
self.ack = ack
|
|
self.browser_config = browser_config
|
|
|
|
# Define intents.
|
|
intents = discord.Intents.default()
|
|
intents.message_content = True # Enable message content intent
|
|
intents.members = True # Enable members intent for user info
|
|
|
|
# Initialize the bot with a command prefix and intents.
|
|
super().__init__(command_prefix='!', intents=intents) # You may not need prefix, just here for flexibility
|
|
|
|
# self.tree = app_commands.CommandTree(self) # Initialize command tree for slash commands.
|
|
|
|
async def on_ready(self):
|
|
"""Called when the bot is ready."""
|
|
try:
|
|
print(f'We have logged in as {self.user}')
|
|
cmds = await self.tree.sync() # Sync the command tree with discord
|
|
|
|
except Exception as e:
|
|
print(f'Error during bot startup: {e}')
|
|
|
|
async def on_message(self, message):
|
|
"""Called when a message is received."""
|
|
try:
|
|
if message.author == self.user: # Ignore the bot's messages
|
|
return
|
|
if message.content.strip().startswith(f'{self.prefix} '):
|
|
if self.ack:
|
|
try:
|
|
await message.reply(
|
|
'Starting browser use task...',
|
|
mention_author=True, # Don't ping the user
|
|
)
|
|
except Exception as e:
|
|
print(f'Error sending start message: {e}')
|
|
|
|
try:
|
|
agent_message = await self.run_agent(message.content.replace(f'{self.prefix} ', '').strip())
|
|
await message.channel.send(content=f'{agent_message}', reference=message, mention_author=True)
|
|
except Exception as e:
|
|
await message.channel.send(
|
|
content=f'Error during task execution: {str(e)}',
|
|
reference=message,
|
|
mention_author=True,
|
|
)
|
|
|
|
except Exception as e:
|
|
print(f'Error in message handling: {e}')
|
|
|
|
# await self.process_commands(message) # Needed to process bot commands
|
|
|
|
async def run_agent(self, task: str) -> str:
|
|
try:
|
|
browser = Browser(config=self.browser_config)
|
|
agent = Agent(task=(task), llm=self.llm, browser=browser)
|
|
result = await agent.run()
|
|
|
|
agent_message = None
|
|
if result.is_done():
|
|
agent_message = result.history[-1].result[0].extracted_content
|
|
|
|
if agent_message is None:
|
|
agent_message = 'Oops! Something went wrong while running Browser-Use.'
|
|
|
|
return agent_message
|
|
|
|
except Exception as e:
|
|
raise Exception(f'Browser-use task failed: {str(e)}')
|