By Göran Sandahl -

Introducing Opperator: A composable agent to automate tasks on the web

We've built Opperator - a proof of concept agent for automating web tasks from code. It runs completely in the background without supervision, optimized for declaring tasks and consuming results programmatically. We've packaged it as a container with a REST API for seamless integration into existing infrastructure and applications.

Demo

Here's a demo of Opperator running parallel tasks via its REST API interface and a small UI:

Opperator Demo

Features

Motivation

Most agents today require direct human supervision, making them impractical for tasks where the time investment outweighs the benefits. In the case of automating web tasks, having to be an assisant to the assistant kind of beats the purpose!

Building fully autonomous agents also pushes us to explore some challenging problems around AI reliability: How do we optimize calls so they work, figure out model resilience, deployment, observability and control. Because the key with autonomy is that it just needs to work.

We also believe there are many atomic tasks that can become valuable to automate if the process is simple, reliable and easily integrated into existing services.

Example tasks

For example, we may want to test our login flow after a deployment:

After we have deployed a change, go to platform.opper.ai, log in and create a new api key. Report completion as a structured JSON object with status as a boolean and the api key as a string, so that I can catch any issues with our login flow and raise an alert

Or maybe list the top 3 pages visited blog posts of ours every day and push to our discord channel:

Go to our Google Analytics and report back our top 3 pages for the last 24 hours. Report completion as a structured JSON object with page title, url and count so that I can put it in our dashboard

Or maybe issue a notification in our Discord channel when a new AI related story is trending on hackernews:

Go to hackernews frontpage and identify any AI related stories. Report completion as a structured JSON object with story title, url and score so that I have it reported in our Discord channel

Automating tasks like this could be very valuable, especially when their benefits compound over time. AI can help tackle tasks that would otherwise be impractical to invest human effort into.

Source code

Full code is available on GitHub

How to use

Note! To run Opperator, you'll need an API key from Opper. See our Free Tier if you are interested in testing it out.

A container for the willing

The repo features a docker compose file for manually building a container. It is also available on Github Container Registry, so you can run it with:

docker run --rm -ti \
  -e OPPER_API_KEY=op-<your-api-key> \
  -p 8000:8000 \
  ghcr.io/opper-ai/opper-webagent:latest

The container will start a REST API on port 8000, and you can interact with it like this:

# Execute a web task (returns session id)
curl -X POST http://localhost:8000/run \
  -H "Content-Type: application/json" \
  -d '{
    "goal": "Go to https://opper.ai and check the pricing",
    "response_schema": {
      "type": "object",
      "properties": {
        "has_free_tier": {"type": "boolean"},
        "pricing_details": {"type": "string"}
      },
      "required": ["has_free_tier", "pricing_details"]
    }
  }'

# Stream status updates
curl -N http://localhost:8000/status-stream/<session_id>

There is also a simple web ui running on http://localhost:8000/ that you can use to run tasks.

To run the interface in the demo video you need to clone the repo, run the container as per instructions above, followed by:

uv run examples/multi/app.py

See the README for additional instructions.

A library for the brave

While the container and the REST API is probably the easiest way to get started, it wraps the same Python library that you can use to interact with the agent.

from opper_webagent import run

# Example: Verify blog post existence
result = run(
    goal="Go to https://opper.ai and verify that there is a blog post covering DeepSeek-R1 there",
    response_schema={
        "type": "object",
        "properties": {
            "is_posted": {"type": "boolean"},
            "post_title": {"type": "string"}
        }
    },
    callback=lambda action, details, screenshot: print(f"Action: {action}, Details: {details}")
)

Conclusion

With Opperator, we're exploring the boundaries of agent autonomy and composability. By treating agents as independent workers rather than assistants, we enable scalable automation without direct supervision. The low implementation cost and ease of integration make this approach particularly promising.

Try it out

The Opper free tier includes $10 monthly credit for inference and tracing, perfect for exploring Opperator's capabilities. To get going sign up to the Opper platform, issue an API key and see detailed instructions in the GitHub repository.