localagentbrowser 1.47__tar.gz → 1.53__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {localagentbrowser-1.47 → localagentbrowser-1.53}/CHANGELOG.md +124 -1
- {localagentbrowser-1.47 → localagentbrowser-1.53}/MANIFEST.in +2 -1
- {localagentbrowser-1.47/localagentbrowser.egg-info → localagentbrowser-1.53}/PKG-INFO +69 -20
- {localagentbrowser-1.47 → localagentbrowser-1.53}/README.md +68 -19
- {localagentbrowser-1.47 → localagentbrowser-1.53}/agent_browser.py +221 -46
- {localagentbrowser-1.47 → localagentbrowser-1.53/localagentbrowser.egg-info}/PKG-INFO +69 -20
- {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/SOURCES.txt +5 -1
- {localagentbrowser-1.47 → localagentbrowser-1.53}/pyproject.toml +1 -1
- localagentbrowser-1.53/tests/test_checklist.py +90 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_decisions.py +36 -15
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_journal.py +17 -1
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_main_loop.py +21 -6
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_model_turns.py +13 -0
- localagentbrowser-1.53/tests/test_regression.py +104 -0
- localagentbrowser-1.53/tools/live_test.py +68 -0
- localagentbrowser-1.53/tools/regression.py +386 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/LICENSE +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/dependency_links.txt +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/entry_points.txt +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/requires.txt +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/top_level.txt +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/setup.cfg +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/conftest.py +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/fakes.py +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_duplicates.py +0 -0
- {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_page_text.py +0 -0
|
@@ -1,9 +1,132 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
Every version of `agent_browser.py`, newest first. Each version is also a tagged commit (`v1.11` … `v1.
|
|
3
|
+
Every version of `agent_browser.py`, newest first. Each version is also a tagged commit (`v1.11` … `v1.53`).
|
|
4
4
|
Timings are from live runs on the development machine (Intel i5-9500, 6 cores, no GPU, Qwen2.5-7B-Instruct
|
|
5
5
|
Q4_K_M in LM Studio), where reading the prompt takes about 90% of every model call.
|
|
6
6
|
|
|
7
|
+
## [1.53] - 2026-10-17
|
|
8
|
+
### Added
|
|
9
|
+
- Regression suite (`tools/regression.py`): seven objectives, one of each kind of task tested so far, run one
|
|
10
|
+
after the other with a time limit each and scored the same way (finished or not, turns, model time, checklist
|
|
11
|
+
progress, checks fired, and word checks for missing answers, missed conditions, uncited paragraphs, numbers
|
|
12
|
+
missing from the findings and a missing opinion), with a comparison to an earlier run. Single runs had been
|
|
13
|
+
flattering: on 1.52 the suite finished only 2 of 7 tasks within their limits, including tasks earlier single
|
|
14
|
+
runs had finished. Refused actions in the journal now name the check that refused them, so the suite can count
|
|
15
|
+
each check, and the live test runner times every model call and saves the model's full replies.
|
|
16
|
+
- Objective checklist. The 1.52 suite showed the main failure: every check asked the model to split the
|
|
17
|
+
objective into parts again, from memory, and the split drifted. On the list task it blocked its own FINISH
|
|
18
|
+
over "migration strategies", which the objective never asked for (an idea from a page it had read), and never
|
|
19
|
+
looked for a third suite; on the comparison it added "data types" and never covered "many simultaneous users".
|
|
20
|
+
Now one short call at the start splits the objective into a fixed checklist; asked on its own, the model split
|
|
21
|
+
all seven test objectives cleanly and kept their conditions. Each DISCOVER names the items it serves
|
|
22
|
+
(`checklist_items` in the reply), the checklist with its discoveries is in fresh prompts and in the note after
|
|
23
|
+
each discovery, the finish, progress and objective checks go through its items ("do not add other parts"),
|
|
24
|
+
the read-on check names the items still open, the final result covers every item or says it was not found,
|
|
25
|
+
and the report lists the checklist. The split call uses the same system prompt as turn 1, so LM Studio's cache
|
|
26
|
+
of it still applies there (without that, turn 1 took 128 s instead of about 40).
|
|
27
|
+
### Fixed
|
|
28
|
+
- The report flagged the numbers of numbered headings ("#### 1. Setup") as numbers missing from the findings.
|
|
29
|
+
|
|
30
|
+
Regression run against 1.52 (model minutes in brackets): 5 of 7 tasks finished instead of 2, and the total model
|
|
31
|
+
time fell from 254 to 200 minutes. The list (30.1, was a 45-minute time limit), comparison (39.0, every part
|
|
32
|
+
covered), explanation (12.9, was 60 without finishing) and opinion (38.1) tasks now finish; the factual question
|
|
33
|
+
still does (13.6, was 11.9). What is not better: the list names WPS Office, which is not open source; the
|
|
34
|
+
explanation finished from a single overview paragraph that the model claimed covered all four items, without
|
|
35
|
+
oxygen or water; the how-to found the materials and steps but not the aftercare before its time limit; and the
|
|
36
|
+
documentation task now went to python.org, as asked, but worked through the items one search at a time and hit
|
|
37
|
+
its 30-minute limit before the last one (it had finished in 15 minutes on 1.52, from a tutorial site).
|
|
38
|
+
|
|
39
|
+
## [1.52] - 2026-10-16
|
|
40
|
+
### Changed
|
|
41
|
+
- The note after each DISCOVER also says to work on parts of the objective that are not covered yet before
|
|
42
|
+
adding detail to parts that are. On the explanation task (how photosynthesis works), 1.51 recorded the
|
|
43
|
+
Calvin cycle enzyme by enzyme while the light reactions and the inputs and outputs were still missing.
|
|
44
|
+
|
|
45
|
+
Rerun: after two Calvin cycle discoveries the agent left for a page on the light reactions and recorded where
|
|
46
|
+
each stage happens and what the light reactions do. It still did not finish within 65 minutes: it lost about
|
|
47
|
+
20 minutes reading the history and evolution sections of a long encyclopedia article twice, answering "none"
|
|
48
|
+
to each read-on check, and never recorded the inputs and outputs that article's first part gives.
|
|
49
|
+
|
|
50
|
+
Regression runs on 1.51 for the other kinds of task: the list task (three free, open-source alternatives to
|
|
51
|
+
Microsoft Office) finished in 7 turns and 15.5 minutes of model time (49.3 on 1.46), naming LibreOffice,
|
|
52
|
+
OnlyOffice and Apache OpenOffice, all open source; its final result wrongly says FreeOffice was "not
|
|
53
|
+
mentioned" in the discoveries while leaving it out.
|
|
54
|
+
|
|
55
|
+
## [1.51] - 2026-10-16
|
|
56
|
+
### Fixed
|
|
57
|
+
- On the repotting how-to, 1.50 sent back the model's invented steps once (part 2 still only said "follow
|
|
58
|
+
these 6 easy steps"), the model sent nearly the same steps again, and they went through as a confirmed
|
|
59
|
+
repeat. A DISCOVER far below anything real is now refused outright, and repeating it does not help: below
|
|
60
|
+
40% of its word pairs on the page text shown, or with a sentence below 25%. Real discoveries in the
|
|
61
|
+
earlier runs scored at least 50% overall and 40% per sentence; these invented steps scored 32%, one of
|
|
62
|
+
them 9%. Between those levels and 70% / 35%, the one-time confirmation stays.
|
|
63
|
+
|
|
64
|
+
Rerun: the invented steps were refused, the agent read on and recorded the guide's real materials and steps,
|
|
65
|
+
and FINISH came on turn 7 after 28.5 minutes of model time (67.5 on 1.44). The final result has every step,
|
|
66
|
+
including putting the plant in the new pot, and says that no care instructions beyond the first watering
|
|
67
|
+
were found. Regression on the comparison task with 1.50: 8 turns and 24.9 minutes of model time (38.2 on
|
|
68
|
+
1.42), all parts covered and cited, with a recommendation.
|
|
69
|
+
|
|
70
|
+
## [1.50] - 2026-10-16
|
|
71
|
+
Three runs of the strict documentation objective (Playwright test agents, "do not FINISH until ... fully
|
|
72
|
+
validated", including "parameter schemas" the documentation does not have).
|
|
73
|
+
### Changed
|
|
74
|
+
- `READ_MORE` with the number of the part already shown reads the next part. The model did this in most
|
|
75
|
+
long-page runs, meaning the next part, and refusing it cost a retry each time. On the last part it is still
|
|
76
|
+
refused.
|
|
77
|
+
- The read-on check also says to leave a page that is not about the objective: shown an unrelated "agent"
|
|
78
|
+
project's command reference, the model read on part after part.
|
|
79
|
+
### Fixed
|
|
80
|
+
- After being told twice that a search was exhausted and that it could finish with the gap named, the model
|
|
81
|
+
tried FINISH, the finish check sent it to work on the uncovered part, and it repeated the search again (five
|
|
82
|
+
times in one run). Once a search is exhausted, FINISH goes through without the finish and gap checks.
|
|
83
|
+
|
|
84
|
+
Third run: FINISH on turn 10 (25.2 minutes of model time), the first time this objective has finished; earlier
|
|
85
|
+
versions searched for over an hour. The result has the official `npx playwright init-agents --loop=vscode`
|
|
86
|
+
command and the file layout from the official docs, but it is thin: the finish check was answered with
|
|
87
|
+
"covered by [1] covered by [2] covered by [3]" without naming the parts, one discovery was off topic, and the
|
|
88
|
+
result does not say that no parameter schemas were found.
|
|
89
|
+
|
|
90
|
+
## [1.49] - 2026-10-16
|
|
91
|
+
A documentation task on 1.48 (create a Python virtual environment with venv, activate it on Windows and on
|
|
92
|
+
macOS or Linux, and install packages) garbled commands in two places.
|
|
93
|
+
### Fixed
|
|
94
|
+
- Recording the Windows command `python -m venv C:\path\to\new\virtual\environment`, the model wrote single
|
|
95
|
+
backslashes in its JSON reply: `\t`, `\n` and `\r` became a tab, a newline and a carriage return, and since
|
|
96
|
+
the response format does not allow `\v`, the model turned `\virtual\environment` into `\real\name`. The
|
|
97
|
+
system prompt now asks for every backslash to be written twice, and a tab, carriage return, backspace or
|
|
98
|
+
form feed right before a letter is turned back into its backslash sequence when the text also has a
|
|
99
|
+
backslash or a drive letter (page tables keep their real tabs).
|
|
100
|
+
- The final result turned the recorded `.\venv\Scripts\activate` and `source venv/bin/activate` into
|
|
101
|
+
`.venv\Scripts\activate` and `source .venv/bin/activate`, which do not match the `python -m venv venv` it
|
|
102
|
+
gave first. Rule 1 of the final result now says to copy commands, code, file paths and names exactly.
|
|
103
|
+
Replaying that step three times on 1.48 changed the commands twice; with the rule, all three were exact.
|
|
104
|
+
|
|
105
|
+
Rerun with the backslash changes: FINISH on turn 6 (15.1 minutes of model time) with the create, activate
|
|
106
|
+
and install commands, the Windows path intact. It used a tutorial site rather than the official
|
|
107
|
+
documentation the objective named; checking conditions like that is still a weakness.
|
|
108
|
+
|
|
109
|
+
## [1.48] - 2026-10-16
|
|
110
|
+
An opinion task on 1.47 (how at least three cultures or religions have viewed owls, then an opinion on why
|
|
111
|
+
they attract such different meanings) showed three problems.
|
|
112
|
+
### Fixed
|
|
113
|
+
- A discovery copied two sentences from the page and added a third the page never said ("...depicted
|
|
114
|
+
alongside other wise figures like the prophet Samuel"); copied text lifted the whole discovery to 75%, past
|
|
115
|
+
the page-match check. Each sentence of 8 or more word pairs is now also scored, and one below 35% gets the
|
|
116
|
+
same cheap retry. Measured on the earlier runs' real discoveries, sentences scored 40-100%; invented ones
|
|
117
|
+
0-41%.
|
|
118
|
+
- With three cultures recorded where three were asked for, the read-on check pushed the agent to keep
|
|
119
|
+
collecting. It now also says to choose FINISH if the discoveries already cover every part of the objective.
|
|
120
|
+
- The final result listed many traditions but gave no opinion, although the objective asked for one. When the
|
|
121
|
+
objective asks for an opinion, view or recommendation and the result has no "My view:" paragraph, a short
|
|
122
|
+
second call writes only that paragraph from the result.
|
|
123
|
+
- The report's number check treated citation ranges like "[1-4]" as numbers.
|
|
124
|
+
|
|
125
|
+
Rerun with the sentence and finish changes: FINISH on turn 11 (37.9 minutes of model time) with the views of
|
|
126
|
+
Greek, English and many Native American peoples from a detailed source, all discoveries matching the page. Its
|
|
127
|
+
three page-match checks were condensed summaries of real sentences; the model repeated each and it went
|
|
128
|
+
through, at 37-61 s per check. Replaying the final-result step on that run added a "My view:" paragraph.
|
|
129
|
+
|
|
7
130
|
## [1.47] - 2026-10-16
|
|
8
131
|
A list task on 1.46 (three free, open-source alternatives to Microsoft Office and what each is best at)
|
|
9
132
|
finished on its own in 18 turns and 49 minutes of model time. LibreOffice and OnlyOffice were right, but the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: localagentbrowser
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.53
|
|
4
4
|
Summary: An autonomous web agent driven by a local LLM (LM Studio) and Playwright. Runs entirely on your own machine.
|
|
5
5
|
Author: SnowFX
|
|
6
6
|
License-Expression: MIT
|
|
@@ -56,8 +56,8 @@ and tuned to work well with a **small 7B model on a CPU, no GPU required**.
|
|
|
56
56
|
- ⚡ **Built for slow hardware.** It reuses LM Studio's prompt cache, so most turns process only what changed.
|
|
57
57
|
- 📝 **A readable report every time.** `research_report.md` holds the final result and every finding with its
|
|
58
58
|
source, written however the run ends; `research_log.txt` keeps every action and reason.
|
|
59
|
-
- ✅ **Tested.**
|
|
60
|
-
plus live runs on seven different kinds of task
|
|
59
|
+
- ✅ **Tested.** 136 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
|
|
60
|
+
plus a [regression suite](#regression-suite) of live runs on seven different kinds of task.
|
|
61
61
|
|
|
62
62
|
📖 **The story behind it:** [Teaching a 7B model on a CPU to finish what it starts](https://dev.to/snowfxxx/teaching-a-7b-model-on-a-cpu-to-finish-what-it-starts-1amc),
|
|
63
63
|
six lessons from 30 versions of keeping a small local model on track.
|
|
@@ -184,15 +184,32 @@ does not generalise; the [changelog](https://github.com/SnowFXXX/LocalAgentBrows
|
|
|
184
184
|
| Kind of task | Objective (abridged) | Version | Outcome |
|
|
185
185
|
|---|---|---|---|
|
|
186
186
|
| Documentation research | Setup commands and file layout for Playwright's test agents | 1.27 | Finished on its own in 13 turns (~36 min) with commands, roles and file layout |
|
|
187
|
-
| Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40 |
|
|
187
|
+
| Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40, 1.50 | 1.38–1.40: its most detailed findings (per-client setup, seed test, agent definition files), but it kept searching for schemas the docs do not contain and did not finish within an hour. 1.50: finished in 10 turns (25 min) with the official init command and file layout, but with thin findings and without saying the schemas were not found |
|
|
188
188
|
| Opinion from several sources | How spiritual traditions view cats, then form an opinion | 1.30 | Six traditions from two sources and a stated opinion, in 18 turns (37 min of model time) |
|
|
189
|
+
| Opinion from several sources | How at least three cultures or religions have viewed owls, then an opinion on why | 1.47–1.48 | Greek, English and many Native American views from one detailed source in 11 turns (38 min); 1.48 adds the opinion the result had left out and catches an invented sentence in a discovery |
|
|
189
190
|
| Factual question | Tallest mountain in Africa, height in meters and feet | 1.35, 1.40, 1.46 | Correct, cited answer in 4 turns (about 12 min of model time) in all three versions; before 1.35 it kept reading after finding it |
|
|
190
|
-
| Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min) |
|
|
191
|
+
| Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42, 1.50 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min); on 1.50 in 8 turns (25 min) |
|
|
191
192
|
| List of items | Three free, open-source Photoshop alternatives and the strengths of each | 1.37–1.38 | GIMP, Krita and Darktable with their strengths, all cited, in 9 turns (24 min); 1.37 listed a fourth and added an unrequested opinion, which 1.38 fixes |
|
|
192
|
-
| List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words |
|
|
193
|
+
| List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46, 1.51 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words; on 1.51: LibreOffice, OnlyOffice and Apache OpenOffice, all open source, in 7 turns (16 min) |
|
|
193
194
|
| Step-by-step how-to | Make a sourdough starter, with quantities and what to do each day | 1.36–1.37 | A clear plan in 7 turns (19 min), but it invented the first water amount; 1.37 stops guessing and flags unsupported numbers, and the agent then went looking for the missing details |
|
|
194
|
-
| Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44
|
|
195
|
-
| Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min |
|
|
195
|
+
| Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44, 1.51 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44 recorded the guide's real steps but took 68 min and its result left one out. 1.51: every step from the page, in 7 turns (29 min), and it says that no care instructions beyond the first watering were found |
|
|
196
|
+
| Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42, 1.52 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min. 1.52 recorded both stages and where each takes place, but did not finish within 65 min: it read the history sections of a long encyclopedia article twice and never recorded the inputs and outputs |
|
|
197
|
+
|
|
198
|
+
### Regression suite
|
|
199
|
+
|
|
200
|
+
Since 1.53, every change is measured on the same seven objectives, one of each kind above, run one after the other
|
|
201
|
+
with a time limit each (`tools/regression.py`, see [Testing](#testing)). Single runs vary with the pages a search
|
|
202
|
+
turns up, so the suite compares versions on all seven at once:
|
|
203
|
+
|
|
204
|
+
| Task | 1.52 | 1.53 (objective checklist) |
|
|
205
|
+
|---|---|---|
|
|
206
|
+
| Factual question | Finished, 12 min | Finished, 14 min |
|
|
207
|
+
| List of three office suites | Time limit (45 min) | Finished, 30 min; but one of the three (WPS Office) is not open source |
|
|
208
|
+
| Comparison and recommendation | Time limit (45 min) | Finished, 39 min, every part covered |
|
|
209
|
+
| How-to (repotting) | Time limit (45 min) | Time limit (45 min); materials and steps found, aftercare not |
|
|
210
|
+
| Explanation (photosynthesis) | Time limit (60 min) | Finished, 13 min, but thin: one finding, no oxygen or water |
|
|
211
|
+
| Opinion (owls) | Time limit (45 min) | Finished, 38 min, four cultures and an opinion |
|
|
212
|
+
| Documentation (venv, official docs) | Finished, 15 min, from a tutorial site | Time limit (30 min); create and activate found, from python.org |
|
|
196
213
|
|
|
197
214
|
## How it works
|
|
198
215
|
|
|
@@ -229,8 +246,14 @@ flowchart LR
|
|
|
229
246
|
check: record something, or repeat the action to leave. Moving on to the next part of a page works the same
|
|
230
247
|
way, and the model must first list what the part it is on says about the objective (or "none").
|
|
231
248
|
- **Findings must match the page.** A finding that shares too few word pairs with the page text shown so far
|
|
232
|
-
is sent back once, asking for only what the page says in its own words
|
|
233
|
-
|
|
249
|
+
(or has a sentence that does) is sent back once, asking for only what the page says in its own words, and
|
|
250
|
+
one far from anything on the page is refused outright. A small model will otherwise "complete" a list from
|
|
251
|
+
its own knowledge when a page says "follow these 6 steps" and the steps come later.
|
|
252
|
+
- **An objective checklist.** At the start, one short model call splits the objective into a fixed checklist of
|
|
253
|
+
what the result must contain, keeping conditions like "free, open-source" or "three". Each finding names the
|
|
254
|
+
items it serves, the checklist with its findings is in every prompt, and every check goes through these items
|
|
255
|
+
instead of asking the model to split the objective again from memory, which drifted: it once blocked its own
|
|
256
|
+
finish over "migration strategies", which the objective never asked for.
|
|
234
257
|
- **Numbered findings.** Findings are numbered in the prompt and listed with every check, and the model names
|
|
235
258
|
the finding that covers each part of the objective ("covered by [2]") instead of just saying "covered".
|
|
236
259
|
- **Knowing when it's done.** After every new finding the model is asked whether the objective is now fully
|
|
@@ -283,8 +306,9 @@ Measured on an Intel i5-9500 (6 cores, no GPU) with Qwen2.5-7B-Instruct Q4_K_M a
|
|
|
283
306
|
| Fresh prompt after the context budget is reached | 160–380 s (longest with long pages) |
|
|
284
307
|
| Writing the final result (once, at the end) | 50–190 s, depending on how much was found |
|
|
285
308
|
|
|
286
|
-
Whole runs
|
|
287
|
-
|
|
309
|
+
Whole runs vary with the pages a search turns up. In the results table, a factual question takes about 12
|
|
310
|
+
minutes of model time, a list of three items 16 to 49, a comparison 25 to 38 and an explanation 45 or more. A
|
|
311
|
+
GPU or a smaller model will be much faster.
|
|
288
312
|
|
|
289
313
|
## FAQ
|
|
290
314
|
|
|
@@ -319,16 +343,25 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
|
|
|
319
343
|
research, an opinion from several sources, a factual question, a comparison, a how-to, a list and an
|
|
320
344
|
explanation of a topic. Each one
|
|
321
345
|
exposed something that did not generalise and was fixed; other kinds of tasks may expose more.
|
|
322
|
-
- **Reading
|
|
323
|
-
relevant parts
|
|
324
|
-
explanation task
|
|
346
|
+
- **Reading long pages and knowing when it has enough.** The model used to read long pages part by part
|
|
347
|
+
without recording the relevant parts; since 1.42 it must say what a part contains before reading on. On 1.52
|
|
348
|
+
the explanation task still lost about 20 minutes reading unrelated sections of a long article and did not
|
|
349
|
+
finish. On 1.53, with the objective checklist, it finished in 13 minutes, but from a single overview paragraph
|
|
350
|
+
that left out oxygen and water: the model can now claim one finding covers every item. Judging whether a
|
|
351
|
+
finding really covers an item is the weakest area.
|
|
352
|
+
- **Conditions in the objective.** A small model tends to drop conditions such as "open source" or "using the
|
|
353
|
+
official documentation": a list of open-source office suites once included FreeOffice (free but not open
|
|
354
|
+
source), and a task that asked for the official Python documentation used a tutorial site. The objective
|
|
355
|
+
checklist keeps the conditions in view (the documentation task went to python.org on 1.53), but on the same
|
|
356
|
+
run the list task still named WPS Office, which is not open source. Check the result against any conditions
|
|
357
|
+
you set.
|
|
325
358
|
- **A small model's judgement is the ceiling.** It sometimes drifts to loosely related pages, prefers
|
|
326
359
|
secondary sources or stays with one source too long, and results vary with the first pages a search turns
|
|
327
360
|
up; every finding is in `research_report.md` regardless.
|
|
328
|
-
- **Very strict objectives
|
|
329
|
-
|
|
330
|
-
and
|
|
331
|
-
|
|
361
|
+
- **Very strict objectives.** An objective that forbids finishing until everything is "fully validated" used
|
|
362
|
+
to keep the agent looking for something the web may not contain. On 1.50 it finished such an objective in 25
|
|
363
|
+
minutes, but with thin findings and without naming what it could not find, so check the result against the
|
|
364
|
+
objective.
|
|
332
365
|
- **Check the citations.** The final result is told to use only recorded findings, but a 7B model sometimes
|
|
333
366
|
puts the wrong number on a citation, adds a line no finding supports or leaves out a step, so verify a
|
|
334
367
|
claim against the listed findings before relying on it.
|
|
@@ -345,7 +378,10 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
|
|
|
345
378
|
- [x] Write the final result in a separate, rule-bound step and flag unsupported numbers (1.32–1.38)
|
|
346
379
|
- [x] Finish as soon as the objective is covered (1.35)
|
|
347
380
|
- [x] Get the model to weigh each part of a long page before reading on (1.42)
|
|
348
|
-
- [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
|
|
381
|
+
- [ ] Let very strict objectives end with the gaps named instead of searching indefinitely (they finish since 1.50; naming the gaps is still open)
|
|
382
|
+
- [x] Measure every change on a regression suite of seven kinds of task (1.53)
|
|
383
|
+
- [x] Keep a fixed checklist of the objective's parts instead of re-splitting it at every check (1.53)
|
|
384
|
+
- [ ] Check that a finding really covers its checklist item, including conditions like "open source"
|
|
349
385
|
- [ ] Try more kinds of objectives (seven so far) and adjust the rules that don't generalise
|
|
350
386
|
- [ ] Make fresh prompts (the slowest kind of turn) cheaper still (31% cheaper since 1.34)
|
|
351
387
|
- [ ] Interacting with pages (clicking, forms) for tasks beyond reading
|
|
@@ -370,6 +406,19 @@ call:
|
|
|
370
406
|
python tools/live_test.py "Your objective here" --minutes 25
|
|
371
407
|
```
|
|
372
408
|
|
|
409
|
+
To measure a change on all seven kinds of task (about four hours on a CPU), compared with an earlier run:
|
|
410
|
+
|
|
411
|
+
```bash
|
|
412
|
+
python tools/regression.py --baseline regression_runs/<earlier run>/summary.json
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
Each run gets a folder in `regression_runs/` with every task's report, journal, console output and prompt
|
|
416
|
+
trace, and a `summary.md` that is updated after each task: whether it finished, turns, model time, how many
|
|
417
|
+
checklist items got findings, which checks fired, and problems found by simple word checks (missing answers,
|
|
418
|
+
missed conditions such as a non-open-source item, uncited paragraphs, numbers missing from the findings, a
|
|
419
|
+
missing opinion). `--suite all` adds five more tasks, `--only` runs some of them, and `--rescore` scores an
|
|
420
|
+
earlier run again without the model.
|
|
421
|
+
|
|
373
422
|
## Contributing
|
|
374
423
|
|
|
375
424
|
Contributions are welcome! See [CONTRIBUTING.md](https://github.com/SnowFXXX/LocalAgentBrowser/blob/main/CONTRIBUTING.md) for setup and guidelines, and please follow
|
|
@@ -24,8 +24,8 @@ and tuned to work well with a **small 7B model on a CPU, no GPU required**.
|
|
|
24
24
|
- ⚡ **Built for slow hardware.** It reuses LM Studio's prompt cache, so most turns process only what changed.
|
|
25
25
|
- 📝 **A readable report every time.** `research_report.md` holds the final result and every finding with its
|
|
26
26
|
source, written however the run ends; `research_log.txt` keeps every action and reason.
|
|
27
|
-
- ✅ **Tested.**
|
|
28
|
-
plus live runs on seven different kinds of task
|
|
27
|
+
- ✅ **Tested.** 136 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
|
|
28
|
+
plus a [regression suite](#regression-suite) of live runs on seven different kinds of task.
|
|
29
29
|
|
|
30
30
|
📖 **The story behind it:** [Teaching a 7B model on a CPU to finish what it starts](https://dev.to/snowfxxx/teaching-a-7b-model-on-a-cpu-to-finish-what-it-starts-1amc),
|
|
31
31
|
six lessons from 30 versions of keeping a small local model on track.
|
|
@@ -152,15 +152,32 @@ does not generalise; the [changelog](https://github.com/SnowFXXX/LocalAgentBrows
|
|
|
152
152
|
| Kind of task | Objective (abridged) | Version | Outcome |
|
|
153
153
|
|---|---|---|---|
|
|
154
154
|
| Documentation research | Setup commands and file layout for Playwright's test agents | 1.27 | Finished on its own in 13 turns (~36 min) with commands, roles and file layout |
|
|
155
|
-
| Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40 |
|
|
155
|
+
| Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40, 1.50 | 1.38–1.40: its most detailed findings (per-client setup, seed test, agent definition files), but it kept searching for schemas the docs do not contain and did not finish within an hour. 1.50: finished in 10 turns (25 min) with the official init command and file layout, but with thin findings and without saying the schemas were not found |
|
|
156
156
|
| Opinion from several sources | How spiritual traditions view cats, then form an opinion | 1.30 | Six traditions from two sources and a stated opinion, in 18 turns (37 min of model time) |
|
|
157
|
+
| Opinion from several sources | How at least three cultures or religions have viewed owls, then an opinion on why | 1.47–1.48 | Greek, English and many Native American views from one detailed source in 11 turns (38 min); 1.48 adds the opinion the result had left out and catches an invented sentence in a discovery |
|
|
157
158
|
| Factual question | Tallest mountain in Africa, height in meters and feet | 1.35, 1.40, 1.46 | Correct, cited answer in 4 turns (about 12 min of model time) in all three versions; before 1.35 it kept reading after finding it |
|
|
158
|
-
| Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min) |
|
|
159
|
+
| Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42, 1.50 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min); on 1.50 in 8 turns (25 min) |
|
|
159
160
|
| List of items | Three free, open-source Photoshop alternatives and the strengths of each | 1.37–1.38 | GIMP, Krita and Darktable with their strengths, all cited, in 9 turns (24 min); 1.37 listed a fourth and added an unrequested opinion, which 1.38 fixes |
|
|
160
|
-
| List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words |
|
|
161
|
+
| List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46, 1.51 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words; on 1.51: LibreOffice, OnlyOffice and Apache OpenOffice, all open source, in 7 turns (16 min) |
|
|
161
162
|
| Step-by-step how-to | Make a sourdough starter, with quantities and what to do each day | 1.36–1.37 | A clear plan in 7 turns (19 min), but it invented the first water amount; 1.37 stops guessing and flags unsupported numbers, and the agent then went looking for the missing details |
|
|
162
|
-
| Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44
|
|
163
|
-
| Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min |
|
|
163
|
+
| Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44, 1.51 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44 recorded the guide's real steps but took 68 min and its result left one out. 1.51: every step from the page, in 7 turns (29 min), and it says that no care instructions beyond the first watering were found |
|
|
164
|
+
| Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42, 1.52 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min. 1.52 recorded both stages and where each takes place, but did not finish within 65 min: it read the history sections of a long encyclopedia article twice and never recorded the inputs and outputs |
|
|
165
|
+
|
|
166
|
+
### Regression suite
|
|
167
|
+
|
|
168
|
+
Since 1.53, every change is measured on the same seven objectives, one of each kind above, run one after the other
|
|
169
|
+
with a time limit each (`tools/regression.py`, see [Testing](#testing)). Single runs vary with the pages a search
|
|
170
|
+
turns up, so the suite compares versions on all seven at once:
|
|
171
|
+
|
|
172
|
+
| Task | 1.52 | 1.53 (objective checklist) |
|
|
173
|
+
|---|---|---|
|
|
174
|
+
| Factual question | Finished, 12 min | Finished, 14 min |
|
|
175
|
+
| List of three office suites | Time limit (45 min) | Finished, 30 min; but one of the three (WPS Office) is not open source |
|
|
176
|
+
| Comparison and recommendation | Time limit (45 min) | Finished, 39 min, every part covered |
|
|
177
|
+
| How-to (repotting) | Time limit (45 min) | Time limit (45 min); materials and steps found, aftercare not |
|
|
178
|
+
| Explanation (photosynthesis) | Time limit (60 min) | Finished, 13 min, but thin: one finding, no oxygen or water |
|
|
179
|
+
| Opinion (owls) | Time limit (45 min) | Finished, 38 min, four cultures and an opinion |
|
|
180
|
+
| Documentation (venv, official docs) | Finished, 15 min, from a tutorial site | Time limit (30 min); create and activate found, from python.org |
|
|
164
181
|
|
|
165
182
|
## How it works
|
|
166
183
|
|
|
@@ -197,8 +214,14 @@ flowchart LR
|
|
|
197
214
|
check: record something, or repeat the action to leave. Moving on to the next part of a page works the same
|
|
198
215
|
way, and the model must first list what the part it is on says about the objective (or "none").
|
|
199
216
|
- **Findings must match the page.** A finding that shares too few word pairs with the page text shown so far
|
|
200
|
-
is sent back once, asking for only what the page says in its own words
|
|
201
|
-
|
|
217
|
+
(or has a sentence that does) is sent back once, asking for only what the page says in its own words, and
|
|
218
|
+
one far from anything on the page is refused outright. A small model will otherwise "complete" a list from
|
|
219
|
+
its own knowledge when a page says "follow these 6 steps" and the steps come later.
|
|
220
|
+
- **An objective checklist.** At the start, one short model call splits the objective into a fixed checklist of
|
|
221
|
+
what the result must contain, keeping conditions like "free, open-source" or "three". Each finding names the
|
|
222
|
+
items it serves, the checklist with its findings is in every prompt, and every check goes through these items
|
|
223
|
+
instead of asking the model to split the objective again from memory, which drifted: it once blocked its own
|
|
224
|
+
finish over "migration strategies", which the objective never asked for.
|
|
202
225
|
- **Numbered findings.** Findings are numbered in the prompt and listed with every check, and the model names
|
|
203
226
|
the finding that covers each part of the objective ("covered by [2]") instead of just saying "covered".
|
|
204
227
|
- **Knowing when it's done.** After every new finding the model is asked whether the objective is now fully
|
|
@@ -251,8 +274,9 @@ Measured on an Intel i5-9500 (6 cores, no GPU) with Qwen2.5-7B-Instruct Q4_K_M a
|
|
|
251
274
|
| Fresh prompt after the context budget is reached | 160–380 s (longest with long pages) |
|
|
252
275
|
| Writing the final result (once, at the end) | 50–190 s, depending on how much was found |
|
|
253
276
|
|
|
254
|
-
Whole runs
|
|
255
|
-
|
|
277
|
+
Whole runs vary with the pages a search turns up. In the results table, a factual question takes about 12
|
|
278
|
+
minutes of model time, a list of three items 16 to 49, a comparison 25 to 38 and an explanation 45 or more. A
|
|
279
|
+
GPU or a smaller model will be much faster.
|
|
256
280
|
|
|
257
281
|
## FAQ
|
|
258
282
|
|
|
@@ -287,16 +311,25 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
|
|
|
287
311
|
research, an opinion from several sources, a factual question, a comparison, a how-to, a list and an
|
|
288
312
|
explanation of a topic. Each one
|
|
289
313
|
exposed something that did not generalise and was fixed; other kinds of tasks may expose more.
|
|
290
|
-
- **Reading
|
|
291
|
-
relevant parts
|
|
292
|
-
explanation task
|
|
314
|
+
- **Reading long pages and knowing when it has enough.** The model used to read long pages part by part
|
|
315
|
+
without recording the relevant parts; since 1.42 it must say what a part contains before reading on. On 1.52
|
|
316
|
+
the explanation task still lost about 20 minutes reading unrelated sections of a long article and did not
|
|
317
|
+
finish. On 1.53, with the objective checklist, it finished in 13 minutes, but from a single overview paragraph
|
|
318
|
+
that left out oxygen and water: the model can now claim one finding covers every item. Judging whether a
|
|
319
|
+
finding really covers an item is the weakest area.
|
|
320
|
+
- **Conditions in the objective.** A small model tends to drop conditions such as "open source" or "using the
|
|
321
|
+
official documentation": a list of open-source office suites once included FreeOffice (free but not open
|
|
322
|
+
source), and a task that asked for the official Python documentation used a tutorial site. The objective
|
|
323
|
+
checklist keeps the conditions in view (the documentation task went to python.org on 1.53), but on the same
|
|
324
|
+
run the list task still named WPS Office, which is not open source. Check the result against any conditions
|
|
325
|
+
you set.
|
|
293
326
|
- **A small model's judgement is the ceiling.** It sometimes drifts to loosely related pages, prefers
|
|
294
327
|
secondary sources or stays with one source too long, and results vary with the first pages a search turns
|
|
295
328
|
up; every finding is in `research_report.md` regardless.
|
|
296
|
-
- **Very strict objectives
|
|
297
|
-
|
|
298
|
-
and
|
|
299
|
-
|
|
329
|
+
- **Very strict objectives.** An objective that forbids finishing until everything is "fully validated" used
|
|
330
|
+
to keep the agent looking for something the web may not contain. On 1.50 it finished such an objective in 25
|
|
331
|
+
minutes, but with thin findings and without naming what it could not find, so check the result against the
|
|
332
|
+
objective.
|
|
300
333
|
- **Check the citations.** The final result is told to use only recorded findings, but a 7B model sometimes
|
|
301
334
|
puts the wrong number on a citation, adds a line no finding supports or leaves out a step, so verify a
|
|
302
335
|
claim against the listed findings before relying on it.
|
|
@@ -313,7 +346,10 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
|
|
|
313
346
|
- [x] Write the final result in a separate, rule-bound step and flag unsupported numbers (1.32–1.38)
|
|
314
347
|
- [x] Finish as soon as the objective is covered (1.35)
|
|
315
348
|
- [x] Get the model to weigh each part of a long page before reading on (1.42)
|
|
316
|
-
- [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
|
|
349
|
+
- [ ] Let very strict objectives end with the gaps named instead of searching indefinitely (they finish since 1.50; naming the gaps is still open)
|
|
350
|
+
- [x] Measure every change on a regression suite of seven kinds of task (1.53)
|
|
351
|
+
- [x] Keep a fixed checklist of the objective's parts instead of re-splitting it at every check (1.53)
|
|
352
|
+
- [ ] Check that a finding really covers its checklist item, including conditions like "open source"
|
|
317
353
|
- [ ] Try more kinds of objectives (seven so far) and adjust the rules that don't generalise
|
|
318
354
|
- [ ] Make fresh prompts (the slowest kind of turn) cheaper still (31% cheaper since 1.34)
|
|
319
355
|
- [ ] Interacting with pages (clicking, forms) for tasks beyond reading
|
|
@@ -338,6 +374,19 @@ call:
|
|
|
338
374
|
python tools/live_test.py "Your objective here" --minutes 25
|
|
339
375
|
```
|
|
340
376
|
|
|
377
|
+
To measure a change on all seven kinds of task (about four hours on a CPU), compared with an earlier run:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
python tools/regression.py --baseline regression_runs/<earlier run>/summary.json
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Each run gets a folder in `regression_runs/` with every task's report, journal, console output and prompt
|
|
384
|
+
trace, and a `summary.md` that is updated after each task: whether it finished, turns, model time, how many
|
|
385
|
+
checklist items got findings, which checks fired, and problems found by simple word checks (missing answers,
|
|
386
|
+
missed conditions such as a non-open-source item, uncited paragraphs, numbers missing from the findings, a
|
|
387
|
+
missing opinion). `--suite all` adds five more tasks, `--only` runs some of them, and `--rescore` scores an
|
|
388
|
+
earlier run again without the model.
|
|
389
|
+
|
|
341
390
|
## Contributing
|
|
342
391
|
|
|
343
392
|
Contributions are welcome! See [CONTRIBUTING.md](https://github.com/SnowFXXX/LocalAgentBrowser/blob/main/CONTRIBUTING.md) for setup and guidelines, and please follow
|