An open-source web automation framework powered by large multimodal models.
Developed under Nexus Labs
This project is based on Avenir-Web developed by the Princeton AI2 Lab.
OpenFlo enables autonomous web agents to perform tasks on any website using vision-language models. The system combines robust browser automation with intelligent action prediction to execute complex workflows.
src/openflo/: core agent implementation (OpenFloAgent)agent/: main agent logicagent.py: central agent class and execution flowconfig.py: configuration loading and validationreporting.py: result saving and summary generationevaluation.py: task success evaluation and termination logicexecutor.py: action execution logicpredictor.py: LLM interaction and action prediction
src/run_agent.py: single-process runner (demo + batch)src/config/*.toml: sample configsdata/: example data and task files
- Python
>=3.9(src/pyproject.toml) - A browser for Playwright (Chromium recommended)
- An API key for your chosen provider (OpenRouter preferred)
From the repository root:
# Create a conda environment
conda create -n openflo python=3.11
conda activate openflo
# Install the package in editable mode
pip install -e src
# Set up Playwright and install browser kernels
playwright installSet your API key in the .env file at the project root:
cp .env.example .env
# then edit .env and fill in your keyEnvironment variables take precedence over anything in [api_keys] inside the config.
Run scripts from src/ (paths in configs are written relative to src/):
cd srcIn your config (src/config/auto_mode.toml), set experiment.task_file_path, then run:
python run_agent.py -c config/auto_mode.tomlBatch mode expects a JSON array of tasks like:
[
{
"task_id": "task_001",
"confirmed_task": "Find the official API docs for X",
"website": "https://example.com/"
}
]Configs are TOML files; see src/config/auto_mode.toml.
[basic]save_file_dir: output root directorydefault_task,default_website: defaults for single-task runs
[experiment]task_file_path: JSON tasks list for batch modeoverwrite: skip or overwrite existing task output foldersmax_op,max_continuous_no_op,highlight
[model]name: model identifier (commonlyopenrouter/...)temperature,rate_limit- optional:
reasoning_model,checklist_model,completion_eval_model
[api_keys]- keys are loaded from
.env(OPENROUTER_API_KEY) - individual keys can be uncommented in the toml to override
- keys are loaded from
[playwright]headless,viewport,tracing,save_video,locale,geolocation
Each task writes to basic.save_file_dir/<task_id>/:
agent.log: per-task execution logresult.json: final summary (handled bysrc/openflo/agent/reporting.py)config.toml: resolved config snapshotall_predictions.json: recorded LLM I/O for the taskscreenshots/:screen_<step>.pngand sometimesscreen_<step>_labeled.png
The runners also write run-level logs to src/logs/.
- Missing API key: fill in
OPENROUTER_API_KEYin.env(copy from.env.example) - Playwright browser not found: run
python -m playwright install chromium - Want to watch the browser: set
playwright.headless = false - Config paths look wrong: run from
src/or pass an absolute-cconfig path
OpenFlo is built upon Avenir-Web.
This project maintains the same license as the original framework. See the LICENSE file for details.