Name | notte JSON |
Version |
1.7.0
JSON |
| download |
home_page | None |
Summary | Notte, the full-stack web AI agent framework |
upload_time | 2025-09-11 01:49:18 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.11 |
license | None |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Rapidly build reliable web automation agents
<div align="center">
<p>
The web agent framework built for <strong>speed</strong>, <strong>cost-efficiency</strong>, <strong>scale</strong>, and <strong>reliability</strong> <br/>
→ Read more at: <a href="https://github.com/nottelabs/open-operator-evals" target="_blank" rel="noopener noreferrer">open-operator-evals</a> • <a href="https://x.com/nottecore?ref=github" target="_blank" rel="noopener noreferrer">X</a> • <a href="https://www.linkedin.com/company/nottelabsinc/?ref=github" target="_blank" rel="noopener noreferrer">LinkedIn</a> • <a href="https://notte.cc?ref=github" target="_blank" rel="noopener noreferrer">Landing</a> • <a href="https://console.notte.cc/?ref=github" target="_blank" rel="noopener noreferrer">Console</a>
</p>
</div>
<p align="center">
<img src="docs/logo/bgd.png" alt="Notte Logo" width="100%">
</p>
[](https://github.com/nottelabs/notte/stargazers)
[](https://spdx.org/licenses/SSPL-1.0.html)
[](https://www.python.org/downloads/)
[](https://pypi.org/project/notte/)
[](https://pepy.tech/projects/notte)
---
# What is Notte?
Notte provides all the essential tools for building and deploying AI agents that interact seamlessly with the web. Our full-stack framework combines AI agents with traditional scripting for maximum efficiency - letting you script deterministic parts and use AI only when needed, cutting costs by 50%+ while improving reliability. We allow you to develop, deploy, and scale your own agents and web automations, all with a single API. Read more in our documentation [here](https://docs.notte.cc) 🔥
**Opensource Core:**
- **[Run web agents](#using-python-sdk-recommended)** → Give AI agents natural language tasks to complete on websites
- **[Structured Output](#structured-output)** → Get data in your exact format with Pydantic models
- **[Site Interactions](#scraping)** → Observe website states, scrape data and execute actions using Playwright compatible primitives and natural language commands
**API service (Recommended)**
- **[Stealth Browser Sessions](#session-features)** → Browser instances with built-in CAPTCHA solving, proxies, and anti-detection
- **[Hybrid Workflows](#workflows)** → Combine scripting and AI agents to reduce costs and improve reliability
- **[Secrets Vaults](#agent-vault)** → Enterprise-grade credential management to store emails, passwords, MFA tokens, SSO, etc.
- **[Digital Personas](#agent-persona)** → Create digital identities with unique emails, phones, and automated 2FA for account creation workflows
# Quickstart
```
pip install notte
patchright install --with-deps chromium
```
### Run in local mode
Use the following script to spinup an agent using opensource features (you'll need your own LLM API keys):
```python
import notte
from dotenv import load_dotenv
load_dotenv()
with notte.Session(headless=False) as session:
agent = notte.Agent(session=session, reasoning_model='gemini/gemini-2.5-flash', max_steps=30)
response = agent.run(task="doom scroll cat memes on google images")
```
### Using Python SDK (Recommended)
We also provide an effortless API that hosts the browser sessions for you - and provide plenty of premium features. To run the agent you'll need to first sign up on the [Notte Console](https://console.notte.cc) and create a free Notte API key 🔑
```python
from notte_sdk import NotteClient
import os
client = NotteClient(api_key=os.getenv("NOTTE_API_KEY"))
with client.Session(headless=False) as session:
agent = client.Agent(session=session, reasoning_model='gemini/gemini-2.5-flash', max_steps=30)
response = agent.run(task="doom scroll cat memes on google images")
```
Our setup allows you to experiment locally, then drop-in replace the import and prefix `notte` objects with `cli` to switch to SDK and get hosted browser sessions plus access to premium features!
# Benchmarks
| Rank | Provider | Agent Self-Report | LLM Evaluation | Time per Task | Task Reliability |
| ---- | ----------------------------------------------------------- | ----------------- | -------------- | ------------- | ---------------- |
| 🏆 | [Notte](https://github.com/nottelabs/notte) | **86.2%** | **79.0%** | **47s** | **96.6%** |
| 2️⃣ | [Browser-Use](https://github.com/browser-use/browser-use) | 77.3% | 60.2% | 113s | 83.3% |
| 3️⃣ | [Convergence](https://github.com/convergence-ai/proxy-lite) | 38.4% | 31.4% | 83s | 50% |
Read the full story here: [https://github.com/nottelabs/open-operator-evals](https://github.com/nottelabs/open-operator-evals)
# Agent features
## Structured output
Structured output is a feature of the agent's run function that allows you to specify a Pydantic model as the `response_format` parameter. The agent will return data in the specified structure.
```python
from notte_sdk import NotteClient
from pydantic import BaseModel
from typing import List
class HackerNewsPost(BaseModel):
title: str
url: str
points: int
author: str
comments_count: int
class TopPosts(BaseModel):
posts: List[HackerNewsPost]
client = NotteClient()
with client.Session(headless=False, browser_type="firefox") as session:
agent = client.Agent(session=session, reasoning_model='gemini/gemini-2.5-flash', max_steps=15)
response = agent.run(
task="Go to Hacker News (news.ycombinator.com) and extract the top 5 posts with their titles, URLs, points, authors, and comment counts.",
response_format=TopPosts,
)
print(response.answer)
```
## Agent vault
Vaults are tools you can attach to your Agent instance to securely store and manage credentials. The agent automatically uses these credentials when needed.
```python
from notte_sdk import NotteClient
client = NotteClient()
with client.Vault() as vault, client.Session(headless=False) as session:
vault.add_credentials(
url="https://x.com",
username="your-email",
password="your-password",
)
agent = client.Agent(session=session, vault=vault, max_steps=10)
response = agent.run(
task="go to twitter; login and go to my messages",
)
print(response.answer)
```
## Agent persona
Personas are tools you can attach to your Agent instance to provide digital identities with unique email addresses, phone numbers, and automated 2FA handling.
```python
from notte_sdk import NotteClient
client = NotteClient()
with client.Persona(create_phone_number=False) as persona:
with client.Session(browser_type="firefox", headless=False) as session:
agent = client.Agent(session=session, persona=persona, max_steps=15)
response = agent.run(
task="Open the Google form and RSVP yes with your name",
url="https://forms.google.com/your-form-url",
)
print(response.answer)
```
# Session features
## Stealth
Stealth features include automatic CAPTCHA solving and proxy configuration to enhance automation reliability and anonymity.
```python
from notte_sdk import NotteClient
from notte_sdk.types import NotteProxy, ExternalProxy
client = NotteClient()
# Built-in proxies with CAPTCHA solving
with client.Session(
solve_captchas=True,
proxies=True, # US-based proxy
browser_type="firefox",
headless=False
) as session:
agent = client.Agent(session=session, max_steps=5)
response = agent.run(
task="Try to solve the CAPTCHA using internal tools",
url="https://www.google.com/recaptcha/api2/demo"
)
# Custom proxy configuration
proxy_settings = ExternalProxy(
server="http://your-proxy-server:port",
username="your-username",
password="your-password",
)
with client.Session(proxies=[proxy_settings]) as session:
agent = client.Agent(session=session, max_steps=5)
response = agent.run(task="Navigate to a website")
```
## File download / upload
File Storage allows you to upload files to a session and download files that agents retrieve during their work. Files are session-scoped and persist beyond the session lifecycle.
```python
from notte_sdk import NotteClient
client = NotteClient()
storage = client.FileStorage()
# Upload files before agent execution
storage.upload("/path/to/document.pdf")
# Create session with storage attached
with client.Session(storage=storage) as session:
agent = client.Agent(session=session, max_steps=5)
response = agent.run(
task="Upload the PDF document to the website and download the cat picture",
url="https://example.com/upload"
)
# Download files that the agent downloaded
downloaded_files = storage.list(type="downloads")
for file_name in downloaded_files:
storage.download(file_name=file_name, local_dir="./results")
```
## Cookies / Auth Sessions
Cookies provide a flexible way to authenticate your sessions. While we recommend using the secure vault for credential management, cookies offer an alternative approach for certain use cases.
```python
from notte_sdk import NotteClient
import json
client = NotteClient()
# Upload cookies for authentication
cookies = [
{
"name": "sb-db-auth-token",
"value": "base64-cookie-value",
"domain": "github.com",
"path": "/",
"expires": 9778363203.913704,
"httpOnly": False,
"secure": False,
"sameSite": "Lax"
}
]
with client.Session() as session:
session.set_cookies(cookies=cookies) # or cookie_file="path/to/cookies.json"
agent = client.Agent(session=session, max_steps=5)
response = agent.run(
task="go to nottelabs/notte get repo info",
)
# Get cookies from the session
cookies_resp = session.get_cookies()
with open("cookies.json", "w") as f:
json.dump(cookies_resp, f)
```
## CDP Browser compatibility
You can plug in any browser session provider you want and use our agent on top. Use external headless browser providers via CDP to benefit from Notte's agentic capabilities with any CDP-compatible browser.
```python
from notte_sdk import NotteClient
client = NotteClient()
cdp_url = "wss://your-external-cdp-url"
with client.Session(cdp_url=cdp_url) as session:
agent = client.Agent(session=session)
response = agent.run(task="extract pricing plans from https://www.notte.cc/")
```
# Workflows
Notte's close compatibility with Playwright allows you to mix web automation primitives with agents for specific parts that require reasoning and adaptability. This hybrid approach cuts LLM costs and is much faster by using scripting for deterministic parts and agents only when needed.
```python
from notte_sdk import NotteClient
client = NotteClient()
with client.Session(headless=False, perception_type="fast") as session:
# Script execution for deterministic navigation
session.execute({"type": "goto", "url": "https://www.quince.com/women/organic-stretch-cotton-chino-short"})
session.observe()
# Agent for reasoning-based selection
agent = client.Agent(session=session)
agent.run(task="just select the ivory color in size 6 option")
# Script execution for deterministic actions
session.execute({"type": "click", "selector": "internal:role=button[name=\"ADD TO CART\"i]"})
session.execute({"type": "click", "selector": "internal:role=button[name=\"CHECKOUT\"i]"})
```
# Agent fallback for Workflows
Workflows are a powerful way to combine scripting and agents to reduce costs and improve reliability. However, deterministic parts of the workflow can still fail. To gracefully handle these failures with agents, you can use the `AgentFallback` class:
```python
import notte
with notte.Session() as session:
_ = session.execute({"type": "goto", "value": "https://shop.notte.cc/"})
_ = session.observe()
with notte.AgentFallback(session, "Go to cart"):
# Force execution failure -> trigger an agent fallback to gracefully fix the issue
res = session.execute(type="click", id="INVALID_ACTION_ID")
```
# Scraping
For fast data extraction, we provide a dedicated scraping endpoint that automatically creates and manages sessions. You can pass custom instructions for structured outputs and enable stealth mode.
```python
from notte_sdk import NotteClient
from pydantic import BaseModel
client = NotteClient()
# Simple scraping
response = client.scrape(
url="https://notte.cc",
scrape_links=True,
only_main_content=True
)
# Structured scraping with custom instructions
class Article(BaseModel):
title: str
content: str
date: str
response = client.scrape(
url="https://example.com/blog",
response_format=Article,
instructions="Extract only the title, date and content of the articles"
)
```
Or directly with cURL
```bash
curl -X POST 'https://api.notte.cc/scrape' \
-H 'Authorization: Bearer <NOTTE-API-KEY>' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://notte.cc",
"only_main_content": false,
}'
```
**Search:** We've built a cool demo of an LLM leveraging the scraping endpoint in an MCP server to make real-time search in an LLM chatbot - works like a charm! Available here: [https://search.notte.cc/](https://search.notte.cc/)
# License
This project is licensed under the Server Side Public License v1.
See the [LICENSE](LICENSE) file for details.
# Citation
If you use notte in your research or project, please cite:
```bibtex
@software{notte2025,
author = {Pinto, Andrea and Giordano, Lucas and {nottelabs-team}},
title = {Notte: Software suite for internet-native agentic systems},
url = {https://github.com/nottelabs/notte},
year = {2025},
publisher = {GitHub},
license = {SSPL-1.0}
version = {1.4.4},
}
```
Copyright © 2025 Notte Labs, Inc.
Raw data
{
"_id": null,
"home_page": null,
"name": "notte",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": null,
"author": null,
"author_email": "Notte Team <hello@notte.cc>",
"download_url": "https://files.pythonhosted.org/packages/9e/d2/a5da61b8d39ff93c63ba429d47386ae24e4576635d0295243a0096eda65b/notte-1.7.0.tar.gz",
"platform": null,
"description": "# Rapidly build reliable web automation agents\n\n<div align=\"center\">\n <p>\n The web agent framework built for <strong>speed</strong>, <strong>cost-efficiency</strong>, <strong>scale</strong>, and <strong>reliability</strong> <br/>\n \u2192 Read more at: <a href=\"https://github.com/nottelabs/open-operator-evals\" target=\"_blank\" rel=\"noopener noreferrer\">open-operator-evals</a> \u2022 <a href=\"https://x.com/nottecore?ref=github\" target=\"_blank\" rel=\"noopener noreferrer\">X</a> \u2022 <a href=\"https://www.linkedin.com/company/nottelabsinc/?ref=github\" target=\"_blank\" rel=\"noopener noreferrer\">LinkedIn</a> \u2022 <a href=\"https://notte.cc?ref=github\" target=\"_blank\" rel=\"noopener noreferrer\">Landing</a> \u2022 <a href=\"https://console.notte.cc/?ref=github\" target=\"_blank\" rel=\"noopener noreferrer\">Console</a>\n </p>\n</div>\n\n<p align=\"center\">\n <img src=\"docs/logo/bgd.png\" alt=\"Notte Logo\" width=\"100%\">\n</p>\n\n[](https://github.com/nottelabs/notte/stargazers)\n[](https://spdx.org/licenses/SSPL-1.0.html)\n[](https://www.python.org/downloads/)\n[](https://pypi.org/project/notte/)\n[](https://pepy.tech/projects/notte)\n\n---\n\n# What is Notte?\n\nNotte provides all the essential tools for building and deploying AI agents that interact seamlessly with the web. Our full-stack framework combines AI agents with traditional scripting for maximum efficiency - letting you script deterministic parts and use AI only when needed, cutting costs by 50%+ while improving reliability. We allow you to develop, deploy, and scale your own agents and web automations, all with a single API. Read more in our documentation [here](https://docs.notte.cc) \ud83d\udd25\n\n**Opensource Core:**\n- **[Run web agents](#using-python-sdk-recommended)** \u2192 Give AI agents natural language tasks to complete on websites\n- **[Structured Output](#structured-output)** \u2192 Get data in your exact format with Pydantic models\n- **[Site Interactions](#scraping)** \u2192 Observe website states, scrape data and execute actions using Playwright compatible primitives and natural language commands\n\n**API service (Recommended)**\n- **[Stealth Browser Sessions](#session-features)** \u2192 Browser instances with built-in CAPTCHA solving, proxies, and anti-detection\n- **[Hybrid Workflows](#workflows)** \u2192 Combine scripting and AI agents to reduce costs and improve reliability\n- **[Secrets Vaults](#agent-vault)** \u2192 Enterprise-grade credential management to store emails, passwords, MFA tokens, SSO, etc.\n- **[Digital Personas](#agent-persona)** \u2192 Create digital identities with unique emails, phones, and automated 2FA for account creation workflows\n\n# Quickstart\n\n```\npip install notte\npatchright install --with-deps chromium\n```\n\n### Run in local mode\n\nUse the following script to spinup an agent using opensource features (you'll need your own LLM API keys):\n\n```python\nimport notte\nfrom dotenv import load_dotenv\nload_dotenv()\n\nwith notte.Session(headless=False) as session:\n agent = notte.Agent(session=session, reasoning_model='gemini/gemini-2.5-flash', max_steps=30)\n response = agent.run(task=\"doom scroll cat memes on google images\")\n```\n\n### Using Python SDK (Recommended)\n\nWe also provide an effortless API that hosts the browser sessions for you - and provide plenty of premium features. To run the agent you'll need to first sign up on the [Notte Console](https://console.notte.cc) and create a free Notte API key \ud83d\udd11\n\n```python\nfrom notte_sdk import NotteClient\nimport os\n\nclient = NotteClient(api_key=os.getenv(\"NOTTE_API_KEY\"))\n\nwith client.Session(headless=False) as session:\n agent = client.Agent(session=session, reasoning_model='gemini/gemini-2.5-flash', max_steps=30)\n response = agent.run(task=\"doom scroll cat memes on google images\")\n```\n\nOur setup allows you to experiment locally, then drop-in replace the import and prefix `notte` objects with `cli` to switch to SDK and get hosted browser sessions plus access to premium features!\n\n# Benchmarks\n\n| Rank | Provider | Agent Self-Report | LLM Evaluation | Time per Task | Task Reliability |\n| ---- | ----------------------------------------------------------- | ----------------- | -------------- | ------------- | ---------------- |\n| \ud83c\udfc6 | [Notte](https://github.com/nottelabs/notte) | **86.2%** | **79.0%** | **47s** | **96.6%** |\n| 2\ufe0f\u20e3 | [Browser-Use](https://github.com/browser-use/browser-use) | 77.3% | 60.2% | 113s | 83.3% |\n| 3\ufe0f\u20e3 | [Convergence](https://github.com/convergence-ai/proxy-lite) | 38.4% | 31.4% | 83s | 50% |\n\nRead the full story here: [https://github.com/nottelabs/open-operator-evals](https://github.com/nottelabs/open-operator-evals)\n\n# Agent features\n\n## Structured output\n\nStructured output is a feature of the agent's run function that allows you to specify a Pydantic model as the `response_format` parameter. The agent will return data in the specified structure.\n\n```python\nfrom notte_sdk import NotteClient\nfrom pydantic import BaseModel\nfrom typing import List\n\nclass HackerNewsPost(BaseModel):\n title: str\n url: str\n points: int\n author: str\n comments_count: int\n\nclass TopPosts(BaseModel):\n posts: List[HackerNewsPost]\n\nclient = NotteClient()\nwith client.Session(headless=False, browser_type=\"firefox\") as session:\n agent = client.Agent(session=session, reasoning_model='gemini/gemini-2.5-flash', max_steps=15)\n response = agent.run(\n task=\"Go to Hacker News (news.ycombinator.com) and extract the top 5 posts with their titles, URLs, points, authors, and comment counts.\",\n response_format=TopPosts,\n )\nprint(response.answer)\n```\n\n## Agent vault\nVaults are tools you can attach to your Agent instance to securely store and manage credentials. The agent automatically uses these credentials when needed.\n\n```python\nfrom notte_sdk import NotteClient\n\nclient = NotteClient()\n\nwith client.Vault() as vault, client.Session(headless=False) as session:\n vault.add_credentials(\n url=\"https://x.com\",\n username=\"your-email\",\n password=\"your-password\",\n )\n agent = client.Agent(session=session, vault=vault, max_steps=10)\n response = agent.run(\n task=\"go to twitter; login and go to my messages\",\n )\nprint(response.answer)\n```\n\n## Agent persona\n\nPersonas are tools you can attach to your Agent instance to provide digital identities with unique email addresses, phone numbers, and automated 2FA handling.\n\n```python\nfrom notte_sdk import NotteClient\n\nclient = NotteClient()\n\nwith client.Persona(create_phone_number=False) as persona:\n with client.Session(browser_type=\"firefox\", headless=False) as session:\n agent = client.Agent(session=session, persona=persona, max_steps=15)\n response = agent.run(\n task=\"Open the Google form and RSVP yes with your name\",\n url=\"https://forms.google.com/your-form-url\",\n )\nprint(response.answer)\n```\n\n# Session features\n\n## Stealth\n\nStealth features include automatic CAPTCHA solving and proxy configuration to enhance automation reliability and anonymity.\n\n```python\nfrom notte_sdk import NotteClient\nfrom notte_sdk.types import NotteProxy, ExternalProxy\n\nclient = NotteClient()\n\n# Built-in proxies with CAPTCHA solving\nwith client.Session(\n solve_captchas=True,\n proxies=True, # US-based proxy\n browser_type=\"firefox\",\n headless=False\n) as session:\n agent = client.Agent(session=session, max_steps=5)\n response = agent.run(\n task=\"Try to solve the CAPTCHA using internal tools\",\n url=\"https://www.google.com/recaptcha/api2/demo\"\n )\n\n# Custom proxy configuration\nproxy_settings = ExternalProxy(\n server=\"http://your-proxy-server:port\",\n username=\"your-username\",\n password=\"your-password\",\n)\n\nwith client.Session(proxies=[proxy_settings]) as session:\n agent = client.Agent(session=session, max_steps=5)\n response = agent.run(task=\"Navigate to a website\")\n```\n\n## File download / upload\n\nFile Storage allows you to upload files to a session and download files that agents retrieve during their work. Files are session-scoped and persist beyond the session lifecycle.\n\n```python\nfrom notte_sdk import NotteClient\n\nclient = NotteClient()\nstorage = client.FileStorage()\n\n# Upload files before agent execution\nstorage.upload(\"/path/to/document.pdf\")\n\n# Create session with storage attached\nwith client.Session(storage=storage) as session:\n agent = client.Agent(session=session, max_steps=5)\n response = agent.run(\n task=\"Upload the PDF document to the website and download the cat picture\",\n url=\"https://example.com/upload\"\n )\n\n# Download files that the agent downloaded\ndownloaded_files = storage.list(type=\"downloads\")\nfor file_name in downloaded_files:\n storage.download(file_name=file_name, local_dir=\"./results\")\n```\n\n## Cookies / Auth Sessions\n\nCookies provide a flexible way to authenticate your sessions. While we recommend using the secure vault for credential management, cookies offer an alternative approach for certain use cases.\n\n```python\nfrom notte_sdk import NotteClient\nimport json\n\nclient = NotteClient()\n\n# Upload cookies for authentication\ncookies = [\n {\n \"name\": \"sb-db-auth-token\",\n \"value\": \"base64-cookie-value\",\n \"domain\": \"github.com\",\n \"path\": \"/\",\n \"expires\": 9778363203.913704,\n \"httpOnly\": False,\n \"secure\": False,\n \"sameSite\": \"Lax\"\n }\n]\n\nwith client.Session() as session:\n session.set_cookies(cookies=cookies) # or cookie_file=\"path/to/cookies.json\"\n \n agent = client.Agent(session=session, max_steps=5)\n response = agent.run(\n task=\"go to nottelabs/notte get repo info\",\n )\n \n # Get cookies from the session\n cookies_resp = session.get_cookies()\n with open(\"cookies.json\", \"w\") as f:\n json.dump(cookies_resp, f)\n```\n\n## CDP Browser compatibility\n\nYou can plug in any browser session provider you want and use our agent on top. Use external headless browser providers via CDP to benefit from Notte's agentic capabilities with any CDP-compatible browser.\n\n```python\nfrom notte_sdk import NotteClient\n\nclient = NotteClient()\ncdp_url = \"wss://your-external-cdp-url\"\n\nwith client.Session(cdp_url=cdp_url) as session:\n agent = client.Agent(session=session)\n response = agent.run(task=\"extract pricing plans from https://www.notte.cc/\")\n```\n\n# Workflows\n\nNotte's close compatibility with Playwright allows you to mix web automation primitives with agents for specific parts that require reasoning and adaptability. This hybrid approach cuts LLM costs and is much faster by using scripting for deterministic parts and agents only when needed.\n\n```python\nfrom notte_sdk import NotteClient\n\nclient = NotteClient()\n\nwith client.Session(headless=False, perception_type=\"fast\") as session:\n # Script execution for deterministic navigation\n session.execute({\"type\": \"goto\", \"url\": \"https://www.quince.com/women/organic-stretch-cotton-chino-short\"})\n session.observe()\n\n # Agent for reasoning-based selection\n agent = client.Agent(session=session)\n agent.run(task=\"just select the ivory color in size 6 option\")\n\n # Script execution for deterministic actions\n session.execute({\"type\": \"click\", \"selector\": \"internal:role=button[name=\\\"ADD TO CART\\\"i]\"})\n session.execute({\"type\": \"click\", \"selector\": \"internal:role=button[name=\\\"CHECKOUT\\\"i]\"})\n```\n\n# Agent fallback for Workflows\n\nWorkflows are a powerful way to combine scripting and agents to reduce costs and improve reliability. However, deterministic parts of the workflow can still fail. To gracefully handle these failures with agents, you can use the `AgentFallback` class: \n\n```python\nimport notte\n\nwith notte.Session() as session:\n _ = session.execute({\"type\": \"goto\", \"value\": \"https://shop.notte.cc/\"})\n _ = session.observe()\n\n with notte.AgentFallback(session, \"Go to cart\"):\n # Force execution failure -> trigger an agent fallback to gracefully fix the issue\n res = session.execute(type=\"click\", id=\"INVALID_ACTION_ID\")\n```\n\n# Scraping\n\nFor fast data extraction, we provide a dedicated scraping endpoint that automatically creates and manages sessions. You can pass custom instructions for structured outputs and enable stealth mode.\n\n```python\nfrom notte_sdk import NotteClient\nfrom pydantic import BaseModel\n\nclient = NotteClient()\n\n# Simple scraping\nresponse = client.scrape(\n url=\"https://notte.cc\",\n scrape_links=True,\n only_main_content=True\n)\n\n# Structured scraping with custom instructions\nclass Article(BaseModel):\n title: str\n content: str\n date: str\n\nresponse = client.scrape(\n url=\"https://example.com/blog\",\n response_format=Article,\n instructions=\"Extract only the title, date and content of the articles\"\n)\n```\n\nOr directly with cURL\n```bash\ncurl -X POST 'https://api.notte.cc/scrape' \\\n -H 'Authorization: Bearer <NOTTE-API-KEY>' \\\n -H 'Content-Type: application/json' \\\n -d '{\n \"url\": \"https://notte.cc\",\n \"only_main_content\": false,\n }'\n```\n\n\n**Search:** We've built a cool demo of an LLM leveraging the scraping endpoint in an MCP server to make real-time search in an LLM chatbot - works like a charm! Available here: [https://search.notte.cc/](https://search.notte.cc/)\n\n# License\n\nThis project is licensed under the Server Side Public License v1.\nSee the [LICENSE](LICENSE) file for details.\n\n# Citation\n\nIf you use notte in your research or project, please cite:\n\n```bibtex\n@software{notte2025,\n author = {Pinto, Andrea and Giordano, Lucas and {nottelabs-team}},\n title = {Notte: Software suite for internet-native agentic systems},\n url = {https://github.com/nottelabs/notte},\n year = {2025},\n publisher = {GitHub},\n license = {SSPL-1.0}\n version = {1.4.4},\n}\n```\n\nCopyright \u00a9 2025 Notte Labs, Inc.\n",
"bugtrack_url": null,
"license": null,
"summary": "Notte, the full-stack web AI agent framework",
"version": "1.7.0",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "33bce9b2e37f217b7bac702b0b63bcd697e15cca7da41dc648fc15c27ab7ac4d",
"md5": "1683aeee1e421bdbacef8fcd7bbf8f4b",
"sha256": "735afe70532f23e7ffb9d6bbbdb03b8f01c032a3ec99d457dc6fd154b8d537ae"
},
"downloads": -1,
"filename": "notte-1.7.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1683aeee1e421bdbacef8fcd7bbf8f4b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 17027,
"upload_time": "2025-09-11T01:49:07",
"upload_time_iso_8601": "2025-09-11T01:49:07.222896Z",
"url": "https://files.pythonhosted.org/packages/33/bc/e9b2e37f217b7bac702b0b63bcd697e15cca7da41dc648fc15c27ab7ac4d/notte-1.7.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9ed2a5da61b8d39ff93c63ba429d47386ae24e4576635d0295243a0096eda65b",
"md5": "1576fc37ef18f90aefde9ea4aa9bdf0d",
"sha256": "289cbc98b3bb1b9ed6ef6693c82d8f467f285b61a9ab42affdc5210159095136"
},
"downloads": -1,
"filename": "notte-1.7.0.tar.gz",
"has_sig": false,
"md5_digest": "1576fc37ef18f90aefde9ea4aa9bdf0d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 55977424,
"upload_time": "2025-09-11T01:49:18",
"upload_time_iso_8601": "2025-09-11T01:49:18.887411Z",
"url": "https://files.pythonhosted.org/packages/9e/d2/a5da61b8d39ff93c63ba429d47386ae24e4576635d0295243a0096eda65b/notte-1.7.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-11 01:49:18",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "notte"
}