[Add] browser-use and main.py
This commit is contained in:
parent
08e64bdf45
commit
96914d44ac
221 changed files with 30952 additions and 1 deletions
123
browser-use/examples/integrations/discord/discord_api.py
Normal file
123
browser-use/examples/integrations/discord/discord_api.py
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
import os
|
||||
import sys
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
from langchain_core.language_models.chat_models import BaseChatModel
|
||||
|
||||
from browser_use import BrowserConfig
|
||||
from browser_use.agent.service import Agent, Browser
|
||||
|
||||
|
||||
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)}')
|
||||
72
browser-use/examples/integrations/discord/discord_example.py
Normal file
72
browser-use/examples/integrations/discord/discord_example.py
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
"""
|
||||
This examples requires you to have a Discord bot token and the bot already added to a server.
|
||||
|
||||
Five Steps to create and invite a Discord bot:
|
||||
|
||||
1. Create a Discord Application:
|
||||
* Go to the Discord Developer Portal: https://discord.com/developers/applications
|
||||
* Log in to the Discord website.
|
||||
* Click on "New Application".
|
||||
* Give the application a name and click "Create".
|
||||
2. Configure the Bot:
|
||||
* Navigate to the "Bot" tab on the left side of the screen.
|
||||
* Make sure "Public Bot" is ticked if you want others to invite your bot.
|
||||
* Generate your bot token by clicking on "Reset Token", Copy the token and save it securely.
|
||||
* Do not share the bot token. Treat it like a password. If the token is leaked, regenerate it.
|
||||
3. Enable Privileged Intents:
|
||||
* Scroll down to the "Privileged Gateway Intents" section.
|
||||
* Enable the necessary intents (e.g., "Server Members Intent" and "Message Content Intent").
|
||||
--> Note: Enabling privileged intents for bots in over 100 guilds requires bot verification. You may need to contact Discord support to enable privileged intents for verified bots.
|
||||
4. Generate Invite URL:
|
||||
* Go to "OAuth2" tab and "OAuth2 URL Generator" section.
|
||||
* Under "scopes", tick the "bot" checkbox.
|
||||
* Tick the permissions required for your bot to function under “Bot Permissions”.
|
||||
* e.g. "Send Messages", "Send Messages in Threads", "Read Message History", "Mention Everyone".
|
||||
* Copy the generated URL under the "GENERATED URL" section at the bottom.
|
||||
5. Invite the Bot:
|
||||
* Paste the URL into your browser.
|
||||
* Choose a server to invite the bot to.
|
||||
* Click “Authorize”.
|
||||
--> Note: The person adding the bot needs "Manage Server" permissions.
|
||||
6. Run the code below to start the bot with your bot token.
|
||||
7. Write e.g. "/bu what's the weather in Tokyo?" to start a browser-use task and get a response inside the Discord channel.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
from langchain_google_genai import ChatGoogleGenerativeAI
|
||||
from pydantic import SecretStr
|
||||
|
||||
from browser_use import BrowserConfig
|
||||
from examples.integrations.discord.discord_api import DiscordBot
|
||||
|
||||
# load credentials from environment variables
|
||||
bot_token = os.getenv('DISCORD_BOT_TOKEN')
|
||||
if not bot_token:
|
||||
raise ValueError('Discord bot token not found in .env file.')
|
||||
|
||||
api_key = os.getenv('GOOGLE_API_KEY')
|
||||
if not api_key:
|
||||
raise ValueError('GOOGLE_API_KEY is not set')
|
||||
|
||||
llm = ChatGoogleGenerativeAI(model='gemini-2.0-flash-exp', api_key=SecretStr(api_key))
|
||||
|
||||
bot = DiscordBot(
|
||||
llm=llm, # required; instance of BaseChatModel
|
||||
prefix='$bu', # optional; prefix of messages to trigger browser-use, defaults to "$bu"
|
||||
ack=True, # optional; whether to acknowledge task receipt with a message, defaults to False
|
||||
browser_config=BrowserConfig(
|
||||
headless=False
|
||||
), # optional; useful for changing headless mode or other browser configs, defaults to headless mode
|
||||
)
|
||||
|
||||
bot.run(
|
||||
token=bot_token, # required; Discord bot token
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue