chore: import upstream snapshot with attribution
Test Browser Use CLI Install / uv pip install (ubuntu-latest) (push) Failing after 1s
Test Browser Use CLI Install / uvx browser-use from local wheel (push) Failing after 1s
Test Browser Use CLI Install / uvx browser-use[cli] from PyPI (push) Failing after 1s
package / pip-install-on-macos-latest-py-3.11 (push) Has been skipped
package / pip-install-on-macos-latest-py-3.13 (push) Has been skipped
package / pip-install-on-ubuntu-latest-py-3.11 (push) Has been skipped
package / pip-install-on-windows-latest-py-3.13 (push) Has been skipped
cloud_evals / trigger_cloud_eval_image_build (push) Failing after 1s
docker / build_publish_image (push) Failing after 1s
Test Browser Use CLI Install / browser-use skill sync (push) Failing after 1s
lint / code-style (push) Failing after 0s
lint / type-checker (push) Failing after 1s
package / pip-build (push) Failing after 1s
lint / syntax-errors (push) Failing after 3s
package / pip-install-on-ubuntu-latest-py-3.13 (push) Has been skipped
package / pip-install-on-windows-latest-py-3.11 (push) Has been skipped
test / ${{ matrix.test_filename }} (push) Has been skipped
test / evaluate-tasks (push) Has been skipped
test / setup-chromium (push) Failing after 2s
test / find_tests (push) Failing after 2s
Test Browser Use CLI Install / uv pip install (windows-latest) (push) Has been cancelled
Test Browser Use CLI Install / uv pip install (macos-latest) (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 12:02:32 +08:00
commit 4cd2d4af2b
475 changed files with 121829 additions and 0 deletions
@@ -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 # type: ignore
from discord.ext import commands # type: ignore
from browser_use.agent.service import Agent
from browser_use.browser import BrowserProfile, BrowserSession
from browser_use.llm import BaseChatModel
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_profile (BrowserProfile, optional): Browser profile settings.
Defaults to headless mode
Usage:
```python
from browser_use 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_profile: BrowserProfile = BrowserProfile(headless=True),
):
self.llm = llm
self.prefix = prefix.strip()
self.ack = ack
self.browser_profile = browser_profile
# Define intents.
intents = discord.Intents.default() # type: ignore
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_session = BrowserSession(browser_profile=self.browser_profile)
agent = Agent(task=(task), llm=self.llm, browser_session=browser_session)
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)}')
@@ -0,0 +1,71 @@
"""
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 browser_use.browser import BrowserProfile
from browser_use.llm import ChatGoogle
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 = ChatGoogle(model='gemini-2.0-flash-exp', api_key=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_profile=BrowserProfile(
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
)