|
|
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 |
|
|
|
|
|
|
|
|
intents = discord.Intents.default() |
|
|
intents.message_content = True |
|
|
intents.members = True |
|
|
|
|
|
|
|
|
super().__init__( |
|
|
command_prefix='!', intents=intents |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
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() |
|
|
|
|
|
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: |
|
|
return |
|
|
if message.content.strip().startswith(f'{self.prefix} '): |
|
|
if self.ack: |
|
|
try: |
|
|
await message.reply( |
|
|
'Starting browser use task...', |
|
|
mention_author=True, |
|
|
) |
|
|
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}') |
|
|
|
|
|
|
|
|
|
|
|
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)}') |
|
|
|