localagentbrowser 1.41__tar.gz → 1.52__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.
Files changed (22) hide show
  1. {localagentbrowser-1.41 → localagentbrowser-1.52}/CHANGELOG.md +181 -0
  2. {localagentbrowser-1.41/localagentbrowser.egg-info → localagentbrowser-1.52}/PKG-INFO +56 -21
  3. {localagentbrowser-1.41 → localagentbrowser-1.52}/README.md +55 -20
  4. {localagentbrowser-1.41 → localagentbrowser-1.52}/agent_browser.py +194 -27
  5. {localagentbrowser-1.41 → localagentbrowser-1.52/localagentbrowser.egg-info}/PKG-INFO +56 -21
  6. {localagentbrowser-1.41 → localagentbrowser-1.52}/pyproject.toml +1 -1
  7. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_decisions.py +147 -1
  8. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_journal.py +15 -0
  9. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_model_turns.py +25 -4
  10. {localagentbrowser-1.41 → localagentbrowser-1.52}/LICENSE +0 -0
  11. {localagentbrowser-1.41 → localagentbrowser-1.52}/MANIFEST.in +0 -0
  12. {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/SOURCES.txt +0 -0
  13. {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/dependency_links.txt +0 -0
  14. {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/entry_points.txt +0 -0
  15. {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/requires.txt +0 -0
  16. {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/top_level.txt +0 -0
  17. {localagentbrowser-1.41 → localagentbrowser-1.52}/setup.cfg +0 -0
  18. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/conftest.py +0 -0
  19. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/fakes.py +0 -0
  20. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_duplicates.py +0 -0
  21. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_main_loop.py +0 -0
  22. {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_page_text.py +0 -0
@@ -4,6 +4,187 @@ Every version of `agent_browser.py`, newest first. Each version is also a tagged
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.52] - 2026-10-16
8
+ ### Changed
9
+ - The note after each DISCOVER also says to work on parts of the objective that are not covered yet before
10
+ adding detail to parts that are. On the explanation task (how photosynthesis works), 1.51 recorded the
11
+ Calvin cycle enzyme by enzyme while the light reactions and the inputs and outputs were still missing.
12
+
13
+ Rerun: after two Calvin cycle discoveries the agent left for a page on the light reactions and recorded where
14
+ each stage happens and what the light reactions do. It still did not finish within 65 minutes: it lost about
15
+ 20 minutes reading the history and evolution sections of a long encyclopedia article twice, answering "none"
16
+ to each read-on check, and never recorded the inputs and outputs that article's first part gives.
17
+
18
+ Regression runs on 1.51 for the other kinds of task: the list task (three free, open-source alternatives to
19
+ Microsoft Office) finished in 7 turns and 15.5 minutes of model time (49.3 on 1.46), naming LibreOffice,
20
+ OnlyOffice and Apache OpenOffice, all open source; its final result wrongly says FreeOffice was "not
21
+ mentioned" in the discoveries while leaving it out.
22
+
23
+ ## [1.51] - 2026-10-16
24
+ ### Fixed
25
+ - On the repotting how-to, 1.50 sent back the model's invented steps once (part 2 still only said "follow
26
+ these 6 easy steps"), the model sent nearly the same steps again, and they went through as a confirmed
27
+ repeat. A DISCOVER far below anything real is now refused outright, and repeating it does not help: below
28
+ 40% of its word pairs on the page text shown, or with a sentence below 25%. Real discoveries in the
29
+ earlier runs scored at least 50% overall and 40% per sentence; these invented steps scored 32%, one of
30
+ them 9%. Between those levels and 70% / 35%, the one-time confirmation stays.
31
+
32
+ Rerun: the invented steps were refused, the agent read on and recorded the guide's real materials and steps,
33
+ and FINISH came on turn 7 after 28.5 minutes of model time (67.5 on 1.44). The final result has every step,
34
+ including putting the plant in the new pot, and says that no care instructions beyond the first watering
35
+ were found. Regression on the comparison task with 1.50: 8 turns and 24.9 minutes of model time (38.2 on
36
+ 1.42), all parts covered and cited, with a recommendation.
37
+
38
+ ## [1.50] - 2026-10-16
39
+ Three runs of the strict documentation objective (Playwright test agents, "do not FINISH until ... fully
40
+ validated", including "parameter schemas" the documentation does not have).
41
+ ### Changed
42
+ - `READ_MORE` with the number of the part already shown reads the next part. The model did this in most
43
+ long-page runs, meaning the next part, and refusing it cost a retry each time. On the last part it is still
44
+ refused.
45
+ - The read-on check also says to leave a page that is not about the objective: shown an unrelated "agent"
46
+ project's command reference, the model read on part after part.
47
+ ### Fixed
48
+ - After being told twice that a search was exhausted and that it could finish with the gap named, the model
49
+ tried FINISH, the finish check sent it to work on the uncovered part, and it repeated the search again (five
50
+ times in one run). Once a search is exhausted, FINISH goes through without the finish and gap checks.
51
+
52
+ Third run: FINISH on turn 10 (25.2 minutes of model time), the first time this objective has finished; earlier
53
+ versions searched for over an hour. The result has the official `npx playwright init-agents --loop=vscode`
54
+ command and the file layout from the official docs, but it is thin: the finish check was answered with
55
+ "covered by [1] covered by [2] covered by [3]" without naming the parts, one discovery was off topic, and the
56
+ result does not say that no parameter schemas were found.
57
+
58
+ ## [1.49] - 2026-10-16
59
+ A documentation task on 1.48 (create a Python virtual environment with venv, activate it on Windows and on
60
+ macOS or Linux, and install packages) garbled commands in two places.
61
+ ### Fixed
62
+ - Recording the Windows command `python -m venv C:\path\to\new\virtual\environment`, the model wrote single
63
+ backslashes in its JSON reply: `\t`, `\n` and `\r` became a tab, a newline and a carriage return, and since
64
+ the response format does not allow `\v`, the model turned `\virtual\environment` into `\real\name`. The
65
+ system prompt now asks for every backslash to be written twice, and a tab, carriage return, backspace or
66
+ form feed right before a letter is turned back into its backslash sequence when the text also has a
67
+ backslash or a drive letter (page tables keep their real tabs).
68
+ - The final result turned the recorded `.\venv\Scripts\activate` and `source venv/bin/activate` into
69
+ `.venv\Scripts\activate` and `source .venv/bin/activate`, which do not match the `python -m venv venv` it
70
+ gave first. Rule 1 of the final result now says to copy commands, code, file paths and names exactly.
71
+ Replaying that step three times on 1.48 changed the commands twice; with the rule, all three were exact.
72
+
73
+ Rerun with the backslash changes: FINISH on turn 6 (15.1 minutes of model time) with the create, activate
74
+ and install commands, the Windows path intact. It used a tutorial site rather than the official
75
+ documentation the objective named; checking conditions like that is still a weakness.
76
+
77
+ ## [1.48] - 2026-10-16
78
+ An opinion task on 1.47 (how at least three cultures or religions have viewed owls, then an opinion on why
79
+ they attract such different meanings) showed three problems.
80
+ ### Fixed
81
+ - A discovery copied two sentences from the page and added a third the page never said ("...depicted
82
+ alongside other wise figures like the prophet Samuel"); copied text lifted the whole discovery to 75%, past
83
+ the page-match check. Each sentence of 8 or more word pairs is now also scored, and one below 35% gets the
84
+ same cheap retry. Measured on the earlier runs' real discoveries, sentences scored 40-100%; invented ones
85
+ 0-41%.
86
+ - With three cultures recorded where three were asked for, the read-on check pushed the agent to keep
87
+ collecting. It now also says to choose FINISH if the discoveries already cover every part of the objective.
88
+ - The final result listed many traditions but gave no opinion, although the objective asked for one. When the
89
+ objective asks for an opinion, view or recommendation and the result has no "My view:" paragraph, a short
90
+ second call writes only that paragraph from the result.
91
+ - The report's number check treated citation ranges like "[1-4]" as numbers.
92
+
93
+ Rerun with the sentence and finish changes: FINISH on turn 11 (37.9 minutes of model time) with the views of
94
+ Greek, English and many Native American peoples from a detailed source, all discoveries matching the page. Its
95
+ three page-match checks were condensed summaries of real sentences; the model repeated each and it went
96
+ through, at 37-61 s per check. Replaying the final-result step on that run added a "My view:" paragraph.
97
+
98
+ ## [1.47] - 2026-10-16
99
+ A list task on 1.46 (three free, open-source alternatives to Microsoft Office and what each is best at)
100
+ finished on its own in 18 turns and 49 minutes of model time. LibreOffice and OnlyOffice were right, but the
101
+ third item was FreeOffice, which is free but not open source, although the agent had also recorded Apache
102
+ OpenOffice. It recorded LibreOffice four times in different words, which the wording-based duplicate check
103
+ does not catch. Both are left for future work.
104
+ ### Fixed
105
+ - The report's number check flagged the citation numbers in "[4, 5]" as unverified numbers; grouped
106
+ citations like that are now recognised along with "[4]".
107
+
108
+ ## [1.46] - 2026-10-16
109
+ ### Fixed
110
+ - The rerun of the factual question on 1.45 had another accurate discovery sent back ("Mount Kilimanjaro is
111
+ the tallest mountain in Africa and its elevation is 5,895 meters", where the page says "5,895 m"); the
112
+ rewrite dropped the height in feet. Short discoveries have only about 15 word pairs, so a few connecting
113
+ words decide their score. The page-match check now skips discoveries under 20 word pairs; the invented
114
+ steps and care routines it is meant for had 27 to 75.
115
+
116
+ Rerun: FINISH on turn 4 with the correct, cited answer in 12.0 minutes of model time (11.8 on 1.40).
117
+
118
+ ## [1.45] - 2026-10-16
119
+ ### Fixed
120
+ - The page-match check sent back an accurate discovery on the factual question, "Mount Kilimanjaro is the
121
+ tallest mountain in Africa and its height is 5,895 m (19,341 ft)", which echoed the question's "tallest"
122
+ where the page says "highest" (65% of word pairs matched). The model then recorded the parts separately,
123
+ and the run took 6 turns and 17.5 minutes of model time instead of 4 and 11.8 on 1.40. The objective's
124
+ own wording now counts as matched: that discovery scores 76%, while the invented repotting steps and care
125
+ routines still score 28-57%.
126
+
127
+ ## [1.44] - 2026-10-16
128
+ On a how-to (repotting a houseplant: what you need, the steps and care for the first two weeks), 1.43 was
129
+ shown part 2 of a guide that ended "Just follow these 6 easy steps", and recorded six steps it wrote itself;
130
+ the real ones were in part 3. It then recorded a care routine the page never gave.
131
+ ### Added
132
+ - Page-match check: a DISCOVER is compared with the page text shown so far (consecutive word pairs). Real
133
+ discoveries from earlier runs shared 64-100% of their word pairs with their page; the invented steps
134
+ shared 11-44%, and a rerun's mix of real pot-size advice and invented steps 57%. Below 70%, the DISCOVER
135
+ gets one cheap retry asking for only what the page says in the parts shown, in its own wording. Repeating
136
+ the same DISCOVER goes through (a heavy paraphrase can score low); a different one is checked again.
137
+ ### Changed
138
+ - The "page continues" line under a part says that what comes next has not been shown yet.
139
+ - The read-on check remembers parts recorded on an earlier visit to the same page.
140
+
141
+ Rerun on the same objective: at the point where 1.43 invented the steps, the agent recorded only what the
142
+ page said and read on; its discoveries hold the guide's real materials list, steps and aftercare, copied
143
+ from the page. It finished on its own on turn 24 (67.5 minutes of model time). The final result still has
144
+ flaws: it leaves out the step of putting the plant in the new pot, keeps one invented line ("water
145
+ sparingly") from a discovery made before the check was tightened mid-run, and adds an uncited line.
146
+
147
+ ## [1.43] - 2026-10-16
148
+ A comparison on 1.42 (SQLite or PostgreSQL for a small web application, then a recommendation for a hobby
149
+ project) finished on its own in 13 turns and 38 minutes of model time, with all three parts covered and
150
+ cited. Two problems showed up:
151
+ ### Fixed
152
+ - Shown a long page's outline, the model tried to jump to a section with a made-up anchor
153
+ (`NAVIGATE ...#sqlite-vs-postgresql`, then `NAVIGATE #sqlite-vs-postgresql`), using up a turn's retries.
154
+ NAVIGATE to a section of the current page is refused with a pointer to READ_MORE and the outline's part
155
+ number.
156
+ - The final result treated a case study's own workload ("sequential writes, never concurrently") as the
157
+ hobby project's, and based the recommendation on it. The final-result rules now say that a discovery about
158
+ one source's own situation describes that situation, not the objective's, and that details of the
159
+ objective's situation it does not state must not be assumed.
160
+
161
+ Replaying the final-result step on that run's discoveries: the case study is attributed to its own workload
162
+ and the recommendation is conditional on the project's write pattern. On the earlier list task the result
163
+ still gives exactly three cited items and no opinion.
164
+
165
+ ## [1.42] - 2026-10-16
166
+ A new kind of task, explaining a topic (how photosynthesis works: what goes in and out, the two stages and
167
+ where each takes place), reproduced the main weakness: on 1.41 the agent read parts 2 to 5 of a page that had
168
+ the inputs, outputs and cell locations without recording anything until a progress check fired, marked parts
169
+ of the objective "not covered" that its own discoveries covered (and the reverse), and had not finished after
170
+ 18 turns and 49 minutes of model time.
171
+ ### Added
172
+ - Read-on check: moving on to a later part of a page with nothing recorded from the part shown now gets one
173
+ cheap retry asking the model to list each fact in that part that serves the objective (or "none"), and to
174
+ DISCOVER any that are new; repeating the READ_MORE then goes through. Going back to an earlier part is left
175
+ to the re-read check, and a duplicate DISCOVER from the part counts as having weighed it.
176
+ - Discoveries are numbered: in fresh prompts, in the note after each DISCOVER ("recorded as discovery [3]"),
177
+ and in a shortened numbered list that now comes with the finish, progress and objective checks. The
178
+ part-by-part check asks for the number of the discovery covering each part ("covered by [2]").
179
+ ### Changed
180
+ - READ_MORE for the part already shown is refused (with the number of the next part) instead of showing the
181
+ same part again and costing a turn.
182
+
183
+ Rerun on the same objective: finished on turn 18 with a cited explanation covering every part (inputs and
184
+ outputs, both stages, thylakoid membrane and stroma), in 44.8 minutes of model time. The read-on check fired
185
+ five times at 25 to 44 s each; every "none" it got was correct, and it used the page outline to jump to the
186
+ relevant parts of an 11-part page.
187
+
7
188
  ## [1.41] - 2026-10-15
8
189
  ### Added
9
190
  - Published on PyPI: `pip install localagentbrowser`, then `python -m playwright install chromium` and run
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localagentbrowser
3
- Version: 1.41
3
+ Version: 1.52
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,11 @@ 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.** 89 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
60
- plus live runs on six different kinds of task (see [results](#results-on-different-kinds-of-tasks)).
59
+ - ✅ **Tested.** 112 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
60
+ plus live runs on seven different kinds of task (see [results](#results-on-different-kinds-of-tasks)).
61
+
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
+ six lessons from 30 versions of keeping a small local model on track.
61
64
 
62
65
  ## Contents
63
66
 
@@ -83,6 +86,24 @@ and tuned to work well with a **small 7B model on a CPU, no GPU required**.
83
86
  localagentbrowser
84
87
  ```
85
88
 
89
+ It asks for the objective, opens a Chromium window and starts its first turn:
90
+
91
+ ```text
92
+ 🤖 ==================================================== 🤖
93
+ 🚀 Initializing Autonomous Discovery Agent Setup...
94
+ 🎯 Define the Agent's High-Level Objective: What is the tallest mountain in Africa, and how tall is it in meters and in feet?
95
+
96
+ 🧠 [TURN 1/100] Active reasoning cycle executing...
97
+ 🔍 Scraping and preparing current environment text layout...
98
+ 💡 Agent Thoughts: I need to find out the tallest mountain in Africa and its height in meters and feet.
99
+ I should start by searching for this information.
100
+ 🎬 Chosen Action: [SEARCH] -> Parameter: tallest mountain in Africa
101
+ 🌐 Driving Playwright to cross-domain target: https://html.duckduckgo.com/html/?q=tallest+mountain+in+Africa
102
+ ```
103
+
104
+ Each turn takes from under a minute to a few minutes on a CPU (see [Performance](#performance)); the
105
+ [example run](#what-a-run-looks-like) below shows how it continues.
106
+
86
107
  When it finishes, read `research_report.md` in the folder you ran it from. Press Ctrl+C at any time to
87
108
  stop; the report is still written with everything found so far.
88
109
 
@@ -163,12 +184,16 @@ does not generalise; the [changelog](https://github.com/SnowFXXX/LocalAgentBrows
163
184
  | Kind of task | Objective (abridged) | Version | Outcome |
164
185
  |---|---|---|---|
165
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 |
166
- | Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40 | Its most detailed findings (per-client setup, seed test, agent definition files), but it keeps searching for schemas the docs do not contain and has not finished within an hour |
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 |
167
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) |
168
- | Factual question | Tallest mountain in Africa, height in meters and feet | 1.35, 1.40 | Correct, cited answer in 4 turns (about 12 min of model time) in both versions; before 1.35 it kept reading after finding it |
169
- | Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner | 1.36 | Cited comparison of performance, learning and Python's libraries, recommending Python, in 16 turns (33 min); Rust's libraries were not covered |
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 |
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 |
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) |
170
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 |
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) |
171
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 |
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 | 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 |
172
197
 
173
198
  ## How it works
174
199
 
@@ -201,8 +226,15 @@ flowchart LR
201
226
  Duplicate findings are recognised even when reworded into different lines, punctuation or order.
202
227
  - **Cheap retries.** A refused reply is corrected inside the same turn by appending a short note to the
203
228
  conversation, instead of wasting a whole turn.
204
- - **Confirm before leaving.** Leaving a page without recording anything from it triggers one check: record
205
- something, or repeat the action to leave.
229
+ - **Confirm before leaving or reading on.** Leaving a page without recording anything from it triggers one
230
+ check: record something, or repeat the action to leave. Moving on to the next part of a page works the same
231
+ way, and the model must first list what the part it is on says about the objective (or "none").
232
+ - **Findings must match the page.** A finding that shares too few word pairs with the page text shown so far
233
+ (or has a sentence that does) is sent back once, asking for only what the page says in its own words, and
234
+ one far from anything on the page is refused outright. A small model will otherwise "complete" a list from
235
+ its own knowledge when a page says "follow these 6 steps" and the steps come later.
236
+ - **Numbered findings.** Findings are numbered in the prompt and listed with every check, and the model names
237
+ the finding that covers each part of the objective ("covered by [2]") instead of just saying "covered".
206
238
  - **Knowing when it's done.** After every new finding the model is asked whether the objective is now fully
207
239
  covered, and if so to finish instead of reading on for extra details.
208
240
  - **Progress and objective checks.** After 4 turns without a new finding, and every 8 turns regardless, the
@@ -285,20 +317,23 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
285
317
 
286
318
  ## Limitations
287
319
 
288
- - **Tried on six kinds of task so far** (see [results](#results-on-different-kinds-of-tasks)): documentation
289
- research, an opinion from several sources, a factual question, a comparison, a how-to and a list. Each one
320
+ - **Tried on seven kinds of task so far** (see [results](#results-on-different-kinds-of-tasks)): documentation
321
+ research, an opinion from several sources, a factual question, a comparison, a how-to, a list and an
322
+ explanation of a topic. Each one
290
323
  exposed something that did not generalise and was fixed; other kinds of tasks may expose more.
291
- - **Reading without recording.** The model sometimes reads a long page part by part without recording the
292
- relevant parts, even with the outline in front of it. This is currently its main weakness.
324
+ - **Reading without recording.** The model used to read long pages part by part without recording the
325
+ relevant parts. Since 1.42 it must say what a part contains before reading on, which fixed this on an
326
+ explanation task; it is still the area most likely to need more work on other pages.
293
327
  - **A small model's judgement is the ceiling.** It sometimes drifts to loosely related pages, prefers
294
328
  secondary sources or stays with one source too long, and results vary with the first pages a search turns
295
329
  up; every finding is in `research_report.md` regardless.
296
- - **Very strict objectives can keep it searching.** An objective that forbids finishing until everything is
297
- "fully validated" can keep the agent looking for something the web may not contain. It is told to finish
298
- and name what it could not find after looking in several places, but a 7B model does not always judge
299
- when that point has come; the turn limit (100) and Ctrl+C still apply, and the report is always current.
300
- - **Check the citations.** The final result only uses recorded findings, but a 7B model sometimes puts the
301
- wrong number on a citation, so verify a claim against the listed findings before relying on it.
330
+ - **Very strict objectives.** An objective that forbids finishing until everything is "fully validated" used
331
+ to keep the agent looking for something the web may not contain. On 1.50 it finished such an objective in 25
332
+ minutes, but with thin findings and without naming what it could not find, so check the result against the
333
+ objective.
334
+ - **Check the citations.** The final result is told to use only recorded findings, but a 7B model sometimes
335
+ puts the wrong number on a citation, adds a line no finding supports or leaves out a step, so verify a
336
+ claim against the listed findings before relying on it.
302
337
  - **Some sites refuse automated browsers** (HTTP 403). The agent respects that and does not try to disguise
303
338
  itself; it moves on to other sources.
304
339
  - **Reading only.** The agent searches, opens pages and reads them. It does not click, fill in forms or sign in.
@@ -311,9 +346,9 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
311
346
  - [x] Include every finding in the final report, not only the model's own summary (1.29)
312
347
  - [x] Write the final result in a separate, rule-bound step and flag unsupported numbers (1.32–1.38)
313
348
  - [x] Finish as soon as the objective is covered (1.35)
314
- - [ ] Get the model to record relevant parts while it reads long pages
315
- - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
316
- - [ ] Try more kinds of objectives (six so far) and adjust the rules that don't generalise
349
+ - [x] Get the model to weigh each part of a long page before reading on (1.42)
350
+ - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely (they finish since 1.50; naming the gaps is still open)
351
+ - [ ] Try more kinds of objectives (seven so far) and adjust the rules that don't generalise
317
352
  - [ ] Make fresh prompts (the slowest kind of turn) cheaper still (31% cheaper since 1.34)
318
353
  - [ ] Interacting with pages (clicking, forms) for tasks beyond reading
319
354
 
@@ -24,8 +24,11 @@ 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.** 89 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
28
- plus live runs on six different kinds of task (see [results](#results-on-different-kinds-of-tasks)).
27
+ - ✅ **Tested.** 112 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
28
+ plus live runs on seven different kinds of task (see [results](#results-on-different-kinds-of-tasks)).
29
+
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
+ six lessons from 30 versions of keeping a small local model on track.
29
32
 
30
33
  ## Contents
31
34
 
@@ -51,6 +54,24 @@ and tuned to work well with a **small 7B model on a CPU, no GPU required**.
51
54
  localagentbrowser
52
55
  ```
53
56
 
57
+ It asks for the objective, opens a Chromium window and starts its first turn:
58
+
59
+ ```text
60
+ 🤖 ==================================================== 🤖
61
+ 🚀 Initializing Autonomous Discovery Agent Setup...
62
+ 🎯 Define the Agent's High-Level Objective: What is the tallest mountain in Africa, and how tall is it in meters and in feet?
63
+
64
+ 🧠 [TURN 1/100] Active reasoning cycle executing...
65
+ 🔍 Scraping and preparing current environment text layout...
66
+ 💡 Agent Thoughts: I need to find out the tallest mountain in Africa and its height in meters and feet.
67
+ I should start by searching for this information.
68
+ 🎬 Chosen Action: [SEARCH] -> Parameter: tallest mountain in Africa
69
+ 🌐 Driving Playwright to cross-domain target: https://html.duckduckgo.com/html/?q=tallest+mountain+in+Africa
70
+ ```
71
+
72
+ Each turn takes from under a minute to a few minutes on a CPU (see [Performance](#performance)); the
73
+ [example run](#what-a-run-looks-like) below shows how it continues.
74
+
54
75
  When it finishes, read `research_report.md` in the folder you ran it from. Press Ctrl+C at any time to
55
76
  stop; the report is still written with everything found so far.
56
77
 
@@ -131,12 +152,16 @@ does not generalise; the [changelog](https://github.com/SnowFXXX/LocalAgentBrows
131
152
  | Kind of task | Objective (abridged) | Version | Outcome |
132
153
  |---|---|---|---|
133
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 |
134
- | Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40 | Its most detailed findings (per-client setup, seed test, agent definition files), but it keeps searching for schemas the docs do not contain and has not finished within an hour |
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 |
135
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) |
136
- | Factual question | Tallest mountain in Africa, height in meters and feet | 1.35, 1.40 | Correct, cited answer in 4 turns (about 12 min of model time) in both versions; before 1.35 it kept reading after finding it |
137
- | Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner | 1.36 | Cited comparison of performance, learning and Python's libraries, recommending Python, in 16 turns (33 min); Rust's libraries were not covered |
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 |
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 |
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) |
138
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 |
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) |
139
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 |
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 | 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 |
140
165
 
141
166
  ## How it works
142
167
 
@@ -169,8 +194,15 @@ flowchart LR
169
194
  Duplicate findings are recognised even when reworded into different lines, punctuation or order.
170
195
  - **Cheap retries.** A refused reply is corrected inside the same turn by appending a short note to the
171
196
  conversation, instead of wasting a whole turn.
172
- - **Confirm before leaving.** Leaving a page without recording anything from it triggers one check: record
173
- something, or repeat the action to leave.
197
+ - **Confirm before leaving or reading on.** Leaving a page without recording anything from it triggers one
198
+ check: record something, or repeat the action to leave. Moving on to the next part of a page works the same
199
+ way, and the model must first list what the part it is on says about the objective (or "none").
200
+ - **Findings must match the page.** A finding that shares too few word pairs with the page text shown so far
201
+ (or has a sentence that does) is sent back once, asking for only what the page says in its own words, and
202
+ one far from anything on the page is refused outright. A small model will otherwise "complete" a list from
203
+ its own knowledge when a page says "follow these 6 steps" and the steps come later.
204
+ - **Numbered findings.** Findings are numbered in the prompt and listed with every check, and the model names
205
+ the finding that covers each part of the objective ("covered by [2]") instead of just saying "covered".
174
206
  - **Knowing when it's done.** After every new finding the model is asked whether the objective is now fully
175
207
  covered, and if so to finish instead of reading on for extra details.
176
208
  - **Progress and objective checks.** After 4 turns without a new finding, and every 8 turns regardless, the
@@ -253,20 +285,23 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
253
285
 
254
286
  ## Limitations
255
287
 
256
- - **Tried on six kinds of task so far** (see [results](#results-on-different-kinds-of-tasks)): documentation
257
- research, an opinion from several sources, a factual question, a comparison, a how-to and a list. Each one
288
+ - **Tried on seven kinds of task so far** (see [results](#results-on-different-kinds-of-tasks)): documentation
289
+ research, an opinion from several sources, a factual question, a comparison, a how-to, a list and an
290
+ explanation of a topic. Each one
258
291
  exposed something that did not generalise and was fixed; other kinds of tasks may expose more.
259
- - **Reading without recording.** The model sometimes reads a long page part by part without recording the
260
- relevant parts, even with the outline in front of it. This is currently its main weakness.
292
+ - **Reading without recording.** The model used to read long pages part by part without recording the
293
+ relevant parts. Since 1.42 it must say what a part contains before reading on, which fixed this on an
294
+ explanation task; it is still the area most likely to need more work on other pages.
261
295
  - **A small model's judgement is the ceiling.** It sometimes drifts to loosely related pages, prefers
262
296
  secondary sources or stays with one source too long, and results vary with the first pages a search turns
263
297
  up; every finding is in `research_report.md` regardless.
264
- - **Very strict objectives can keep it searching.** An objective that forbids finishing until everything is
265
- "fully validated" can keep the agent looking for something the web may not contain. It is told to finish
266
- and name what it could not find after looking in several places, but a 7B model does not always judge
267
- when that point has come; the turn limit (100) and Ctrl+C still apply, and the report is always current.
268
- - **Check the citations.** The final result only uses recorded findings, but a 7B model sometimes puts the
269
- wrong number on a citation, so verify a claim against the listed findings before relying on it.
298
+ - **Very strict objectives.** An objective that forbids finishing until everything is "fully validated" used
299
+ to keep the agent looking for something the web may not contain. On 1.50 it finished such an objective in 25
300
+ minutes, but with thin findings and without naming what it could not find, so check the result against the
301
+ objective.
302
+ - **Check the citations.** The final result is told to use only recorded findings, but a 7B model sometimes
303
+ puts the wrong number on a citation, adds a line no finding supports or leaves out a step, so verify a
304
+ claim against the listed findings before relying on it.
270
305
  - **Some sites refuse automated browsers** (HTTP 403). The agent respects that and does not try to disguise
271
306
  itself; it moves on to other sources.
272
307
  - **Reading only.** The agent searches, opens pages and reads them. It does not click, fill in forms or sign in.
@@ -279,9 +314,9 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
279
314
  - [x] Include every finding in the final report, not only the model's own summary (1.29)
280
315
  - [x] Write the final result in a separate, rule-bound step and flag unsupported numbers (1.32–1.38)
281
316
  - [x] Finish as soon as the objective is covered (1.35)
282
- - [ ] Get the model to record relevant parts while it reads long pages
283
- - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
284
- - [ ] Try more kinds of objectives (six so far) and adjust the rules that don't generalise
317
+ - [x] Get the model to weigh each part of a long page before reading on (1.42)
318
+ - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely (they finish since 1.50; naming the gaps is still open)
319
+ - [ ] Try more kinds of objectives (seven so far) and adjust the rules that don't generalise
285
320
  - [ ] Make fresh prompts (the slowest kind of turn) cheaper still (31% cheaper since 1.34)
286
321
  - [ ] Interacting with pages (clicking, forms) for tasks beyond reading
287
322