Skip to content
System One

Ying-Kai-Liao/jev-browser

Browser automation where an LLM plans and Jev decides each tactical action, executed through Playwright without feeding page snapshots to the LLM. README reports 40/42 tasks passing and roughly 5x less token context.

Ying-Kai-Liao/jev-browser on GitHub

Stars
82
Forks
13
Language
JavaScript
License
MIT
Last push
22 Sep 2026

Read from GitHub on . Counts change daily.

Reported by the author

Task accuracy
40/4240/42 correct in the latest run, 0 false "done" claimsgithub.com
Checkout time
~14sa 5-step checkout takes ~14 s end to endgithub.com
Token reduction
~5x lessmedian 5× per taskgithub.com

jev-browser splits browser automation into two roles: an LLM (Claude, over MCP) plans and says what outcome it wants one step at a time, and Jev decides the tactical details. Each round, code turns the current page into a text description, and a single roughly 300 ms Jev call answers several questions at once: which element, which action, which value, and whether the step is done, blocked, showing an error, or about to do something irreversible. Playwright then performs the chosen action, and the calling LLM never has to read a page snapshot unless it explicitly takes over.

Because Jev only returns probability distributions, yes/no, a choice among options, or a rating, it never writes free text itself; any free-form value like form text comes from the calling LLM as a candidate, and code turns low confidence or disagreement into a status the LLM can act on.

Measured against 42 tasks across 16 categories on live sites, the author reports 40 of 42 correct in the latest run with zero false “done” claims, up from 38 of 41 across two earlier runs before recent fixes. Most steps take 2 to 4 Jev calls at roughly 300 ms each, so a 5-step checkout runs in about 14 seconds end to end. Across roughly 200 rounds, the pause before irreversible actions flagged only one button: saucedemo’s “Finish” (place order). The author’s own estimate against a Playwright-MCP-style loop on the same tasks shows a median 5 times less page content reaching the LLM.

How it uses Jev

import { fileURLToPath } from "node:url";

const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
export const API_URL = process.env.JEV_API_URL || "https://api.typesafe.ai/v1/systemone";
export const MODEL = process.env.JEV_MODEL || "jev-latest";
const sleep = ms => new Promise(r => setTimeout(r, ms));

const KEY_NAMES = ["TYPESAFE_API_KEY"];
let cachedKey;

View in src/jev.mjs

Open on GitHub

More like this

Use cases this is tagged with