Canopy-R3 Browser Verified

Experimental Canopy browser action scorer plus an opt-in exact-label tool and Chromium executor. This release preserves the best contrastive checkpoint; the new improvement is deterministic execution reliability, not new training. It is a separate browser release, not a replacement for the v8 generalist.

Measured results (2026-09-08)

Evaluation Previous This runtime
Matched DOM mutation checks 5/16 16/16
Original explicit-label browser checks 37/37 37/37
Fresh explicit-label checks, seed offset 100000 Not run 37/37

Each 37-case set contains 36 local rendered fixtures and one public example.com to IANA navigation. The literal commands bypass neural inference. The mutation test repeats eight cases with natural mouse motion on/off. Successful refusal counts for removed, replaced, renamed, hidden, disabled or ambiguous targets; these are not successful task completions.

The unchanged learned scorer previously achieved 108/144 fresh synthetic and 110/144 regression cases, and 25/37 and 21/37 in two browser sets. Broad ordinary label grounding remained weak. A subsequent training experiment regressed and is deliberately excluded; see evaluation/rejected_training.md.

Use from a downloaded snapshot

Use Python 3.11. Dependencies are recorded in requirements.txt from the tested CUDA environment; install a platform-appropriate PyTorch build when needed. Install dependencies, then python -m playwright install chromium. Run from the snapshot root with PYTHONPATH=.:miniswardbower.

import asyncio
from pathlib import Path
from miniswardbower.agents.tiny_navigator import TinyNavigator
from miniswardbower.browser.controller import BrowserController
from miniswardbower.core.config import ModelConfig, BrowserConfig
from miniswardbower.core.memory_ledger import MemoryLedger

async def main():
    nav = TinyNavigator(ModelConfig(
        canopy_checkpoint_path=Path('model.safetensors'),
        navigator_mode='literal_verified',
        grounding_threshold=0.5, grounding_margin=0.01,
        device='cpu',  # use cuda for learned scoring on a CUDA machine
    ))
    nav.load_model()
    assert nav._model_loaded, 'Model failed to load'
    browser = BrowserController(BrowserConfig(headless=False))
    await browser.start()
    try:
        await browser.goto('https://example.com')
        tree = await browser.get_pruned_tree()
        batch = nav.predict_action_batch(MemoryLedger('Open Learn more.'), tree)
        print(batch.model_dump(mode='json'))
        for action in batch.actions:
            await browser.execute_action(action, tree)
        print(browser.page.url)
    finally:
        await browser.stop()

asyncio.run(main())

Supported exact commands include Open LABEL., Click LABEL., Enter "VALUE" into LABEL., and Extract the text from LABEL.. Matching is case-insensitive with whitespace normalization and requires one visible, enabled eligible element. Unsupported grammar uses the learned pairwise scorer; set navigator_mode='pairwise' to evaluate that scorer without literal rules. The default library configuration remains hybrid; explicitly select this mode. The weights are bfloat16 storage, not packed ternary. Use the bundled custom Canopy classes; this is not an AutoModel remote-code package.

Verification

python miniswardbower/evals/test_dynamic_targets.py /tmp/dynamic.json --check
python miniswardbower/evals/test_pairwise_grounding.py
python miniswardbower/evals/test_browsing_sequence.py

The package includes tokenizer assets, source, calibration, SHA-256 manifest, and raw evaluation receipts. Persistent DOM node identities prevent mark reuse from silently redirecting old actions. Stale observations raise an error and require observing/planning again. Fast targeted clicks use Playwright locators.

Limits

No claim of general autonomous browsing, multi-page research completion, visual recognition of unlabeled icons, or universal 100% accuracy. Shadow DOM is not covered. A page can still mutate after a validation check; this is not an atomic transaction or protection against hostile page scripts. These tests do not establish the cause of the earlier intermittent locator timeout. Only Chromium was validated here; no new Lightpanda speed or RAM claim is made.

Downloads last month

-

Downloads are not tracked for this model. How to track
Safetensors
Model size
0.3B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for psikosen/canopy-258m-r3-browser-verified

Finetuned
(1)
this model