Notte

Notte provides all the essential tools for building and deploying AI agents that interact seamlessly with the web. This integration connects Notte with Steel's infrastructure, allowing for seamless automation of web tasks and workflows in the cloud.

link icon Try in Playground

This guide shows how to use Notte with Steel to run a simple task in a live cloud browser, then shut everything down safely.

Requirements

  • Steel API key

  • Notte API key

  • Python 3.11+

Step 1: Project Setup

Create a virtual environment and a minimal project:

python3 -m venv .venv && \
source .venv/bin/activate && \
mkdir notte-steel && cd notte-steel && \
touch main.py .env

Step 2: Install Dependencies

pip install steel-sdk notte-sdk python-dotenv

Step 3: Environment Variables

Create a .env file with your API keys and a default task:

STEEL_API_KEY=your-steel-api-key-here
NOTTE_API_KEY=your-notte-api-key-here
TASK="Go to Wikipedia and search for machine learning"

Step 4: Initialize Steel & Notte, then Connect via CDP

Set up Steel, load env vars, and prepare to start the Notte agent.

# main.py
import os
import time
import asyncio
from dotenv import load_dotenv
from steel import Steel
from notte_sdk import NotteClient

load_dotenv(override=True)

STEEL_API_KEY = os.getenv("STEEL_API_KEY") or "your-steel-api-key-here"
NOTTE_API_KEY = os.getenv("NOTTE_API_KEY") or "your-notte-api-key-here"
TASK = os.getenv("TASK") or "Go to Wikipedia and search for machine learning"

client = Steel(steel_api_key=STEEL_API_KEY)
notte = NotteClient(api_key=NOTTE_API_KEY)

Step 5: Run a Notte Agent Task

Create a Steel session, connect Notte via CDP, run your task, and print the result.

async def main():
    print("๐Ÿš€ Steel + Notte Assistant")
    print("=" * 60)

    if STEEL_API_KEY == "your-steel-api-key-here":
        print("โš ๏ธ  Please set STEEL_API_KEY in your .env (https://app.steel.dev/settings/api-keys)")
        return

    if NOTTE_API_KEY == "your-notte-api-key-here":
        print("โš ๏ธ  Please set NOTTE_API_KEY in your .env (https://notte.cc)")
        return

    session = None
    try:
        print("\nCreating Steel session...")
        session = client.sessions.create()
        print(f"View live session at: {session.session_viewer_url}")

        cdp_url = f"{session.websocket_url}&apiKey={STEEL_API_KEY}"

        start_time = time.time()
        print(f"๐ŸŽฏ Executing task: {TASK}")
        print("=" * 60)

        # Attach Notte to the live Steel browser via CDP
        with notte.Session(cdp_url=cdp_url) as browser:
            agent = notte.Agent(session=browser, max_steps=5)
            response = agent.run(task=TASK)

            duration = f"{(time.time() - start_time):.1f}"
            print("\n" + "=" * 60)
            print("๐ŸŽ‰ TASK EXECUTION COMPLETED")
            print("=" * 60)
            print(f"โฑ๏ธ  Duration: {duration} seconds")
            print(f"๐ŸŽฏ Task: {TASK}")
            if response:
                print(f"๐Ÿ“‹ Result:\n{response.answer}")
            print("=" * 60)

    except Exception as e:
        print(f"โŒ Task execution failed: {e}")
    finally:
        if session:
            print("Releasing Steel session...")
            client.sessions.release(session.id)
            print(f"Session completed. View replay at {session.session_viewer_url}")

if __name__ == "__main__":
    asyncio.run(main())

Run It

npm run start

Youโ€™ll see a session viewer URL in your console, open it to watch the automation live.

Full Example

Complete main.py you can paste and run:

"""
AI-powered browser automation using notte-sdk with Steel browsers.
https://github.com/steel-dev/steel-cookbook/tree/main/examples/steel-notte-starter
"""

import os
import time
import asyncio
from dotenv import load_dotenv
from steel import Steel
from notte_sdk import NotteClient

load_dotenv(override=True)

# Replace with your own API keys
STEEL_API_KEY = os.getenv("STEEL_API_KEY") or "your-steel-api-key-here"
NOTTE_API_KEY = os.getenv("NOTTE_API_KEY") or "your-notte-api-key-here"

# Replace with your own task
TASK = os.getenv("TASK") or "Go to Wikipedia and search for machine learning"

async def main():
    print("๐Ÿš€ Steel + Notte Assistant")
    print("=" * 60)

    if STEEL_API_KEY == "your-steel-api-key-here":
        print("โš ๏ธ  WARNING: Please replace 'your-steel-api-key-here' with your actual Steel API key")
        print("   Get your API key at: https://app.steel.dev/settings/api-keys")
        return

    if NOTTE_API_KEY == "your-notte-api-key-here":
        print("โš ๏ธ  WARNING: Please replace 'your-notte-api-key-here' with your actual Notte API key")
        print("   Get your API key at: https://notte.cc")
        return

    client = Steel(steel_api_key=STEEL_API_KEY)
    notte = NotteClient(api_key=NOTTE_API_KEY)

    session = None
    try:
        print("\nCreating Steel session...")
        session = client.sessions.create()
        print("โœ… Steel browser session started!")
        print(f"View live session at: {session.session_viewer_url}")

        cdp_url = f"{session.websocket_url}&apiKey={STEEL_API_KEY}"

        start_time = time.time()
        print(f"๐ŸŽฏ Executing task: {TASK}")
        print("=" * 60)

        with notte.Session(cdp_url=cdp_url) as browser:
            agent = notte.Agent(session=browser, max_steps=5)
            response = agent.run(task=TASK)

            duration = f"{(time.time() - start_time):.1f}"

            print("\n" + "=" * 60)
            print("๐ŸŽ‰ TASK EXECUTION COMPLETED")
            print("=" * 60)
            print(f"โฑ๏ธ  Duration: {duration} seconds")
            print(f"๐ŸŽฏ Task: {TASK}")
            if response:
                print(f"๐Ÿ“‹ Result:\n{response.answer}")
            print("=" * 60)

    except Exception as e:
        print(f"โŒ Failed to run: {e}")
    finally:
        if session:
            print("Releasing Steel session...")
            client.sessions.release(session.id)
            print(f"Session completed. View replay at {session.session_viewer_url}")

if __name__ == "__main__":
    asyncio.run(main())

Next Steps