Notte is a web browser for LLM agents. It transforms the internet into an agent-friendly environment, turning websites into structured, navigable maps described in natural language. By using natural language commands, Notte minimizes hallucinations, reduces token usage, and lowers costs and latency. It handles the browser complexity so your LLM policies can focus on what they do best: conversational reasoning and planning.
- Language-first web navigation, no DOM/HTML parsing required
- Treats the web as a structured, natural language action map
- Reinforcement learning style action space and controls
Requires Python 3.11+
pip install notte
playwright install --with-deps chromium
Notte uses language models to parse and structure web pages into a structured action space. To get started, you need to provide at least one API key for a supported language model provider. These keys can be configured in .env
file and loaded into your environment;
os.environ["OPENAI_API_KEY"] = "your-api-key"
# or any other provider(s) you have keys for
By default, Notte supports the following providers:
- Cerebras fastest, 60K tpm rate limit, wait-list keys
- Anthropic 40K tpm rate limit
- OpenAI 30k tpm rate limit
- Groq fast, 6K tpm rate limit
As a reinforcement learning environment to get full navigation control;
from notte.env import NotteEnv
# setting fast language model provider keys
os.environ['ANTHROPIC_API_KEY'] = "your-api-key"
async with NotteEnv(headless=False) as env:
# observe a webpage, and take a random action
obs = await env.observe("https://www.google.com/travel/flights")
obs = await env.step(obs.space.sample(role="link").id)
The observation object contains all you need about the current state of a page (url, screenshot, list of available actions, etc.);
> obs = env.observe("https://www.google.com/travel/flights")
> print(obs.actions.markdown()) # list of available actions
# Flight Search
* I1: Enters departure location (departureLocation: str = "San Francisco")
* I3: Selects departure date (departureDate: date)
* I6: Selects trip type (tripType: str = "round-trip", allowed=["round-trip", "one-way", "multi-city"])
* B3: Search flights options with current filters
# Website Navigation
* B5: Opens Google apps menu
* L28: Navigates to Google homepage
# User Preferences
* B26: Open menu to change language settings
...
You can also scrape data from the page using the scrape
function;
...
async with NotteEnv(headless=False) as env:
...
obs = await env.scrape()
print(obs.data) # data extracted from the page (if any)
# Flight Search inputs
- Where from?: Paris
- Where to?: London
- Departure: Tue, Jan 14
# Flight Search Results
20 of 284 results returned.
They are ranked based on price and convenience
| Airline | Departure | Arrival | Duration | Stops | Price |
|---------------|------------|----------|------------|-----------|-------|
| easyJet | 10:15 AM | 10:35 AM | 1 hr 20 min| Nonstop | $62 |
| Air France | 4:10 PM | 4:35 PM | 1 hr 25 min| Nonstop | $120 |
Or alternatively, you can use Notte conversationally with an LLM agent:
$ python examples/agent.py --goal "subscribe to notte.cc newsletter with ap@agpinto.com"
🌌 Use Notte as a backend environment for a web-based LLM agent. In this example, you integrate your own LLM policy, manage the interaction flow, handle errors, and define rewards, all while letting Notte handle webpages parsing/understanding and browser interactions.
We offer managed cloud browser sessions with the following premium add-ons:
- Authentication: Built-in auth for secure workflows.
- Caching: Fast responses with intelligent caching.
- Action Permissions: Control over sensitive actions.
Request access to a set of API keys on notte.cc
Then integrate with the SDK;
from notte.sdk import NotteClient
url = "https://www.google.com/flights"
with NotteClient(api_key="your-api-key") as env:
# Navigate to the page and observe its state
obs = env.observe(url=url)
# Interact with the page - type "Paris" into input field I1
obs = env.step(action_id="I1", params="Paris")
# Print the current state of the page
- Web Driver Support: Compatible with any web driver. Defaults to Playwright.
- LLM Integration: Use any LLM as a policy engine with quick prompt tuning.
- Multi-Step Actions: Navigate and act across multiple steps.
- Extensible: Simple to integrate and customize.
If you supply multiple keys in your .env
file, Notte uses a llamux configuration to intelligently select the best model for each invocation. This approach helps avoid rate limits, optimize cost-performance balance, and enhance your experience. You can add more providers or adjust rate limits by modifying the config file
Setup your local working environment;
poetry env use 3.11 && poetry shell
poetry install --with dev
poetry run playwright install
pre-commit install
Find an issue, fork, open a PR, and merge :)
Notte is released under the Apache 2.0 license