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.
- {localagentbrowser-1.41 → localagentbrowser-1.52}/CHANGELOG.md +181 -0
- {localagentbrowser-1.41/localagentbrowser.egg-info → localagentbrowser-1.52}/PKG-INFO +56 -21
- {localagentbrowser-1.41 → localagentbrowser-1.52}/README.md +55 -20
- {localagentbrowser-1.41 → localagentbrowser-1.52}/agent_browser.py +194 -27
- {localagentbrowser-1.41 → localagentbrowser-1.52/localagentbrowser.egg-info}/PKG-INFO +56 -21
- {localagentbrowser-1.41 → localagentbrowser-1.52}/pyproject.toml +1 -1
- {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_decisions.py +147 -1
- {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_journal.py +15 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_model_turns.py +25 -4
- {localagentbrowser-1.41 → localagentbrowser-1.52}/LICENSE +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/MANIFEST.in +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/SOURCES.txt +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/dependency_links.txt +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/entry_points.txt +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/requires.txt +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/localagentbrowser.egg-info/top_level.txt +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/setup.cfg +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/conftest.py +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/fakes.py +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_duplicates.py +0 -0
- {localagentbrowser-1.41 → localagentbrowser-1.52}/tests/test_main_loop.py +0 -0
- {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.
|
|
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.**
|
|
60
|
-
plus live runs on
|
|
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 |
|
|
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
|
-
|
|
|
169
|
-
|
|
|
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
|
|
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
|
|
289
|
-
research, an opinion from several sources, a factual question, a comparison, a how-to
|
|
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
|
|
292
|
-
relevant parts
|
|
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
|
|
297
|
-
|
|
298
|
-
and
|
|
299
|
-
|
|
300
|
-
- **Check the citations.** The final result only
|
|
301
|
-
wrong number on a citation,
|
|
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
|
-
- [
|
|
315
|
-
- [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
|
|
316
|
-
- [ ] Try more kinds of objectives (
|
|
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.**
|
|
28
|
-
plus live runs on
|
|
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 |
|
|
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
|
-
|
|
|
137
|
-
|
|
|
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
|
|
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
|
|
257
|
-
research, an opinion from several sources, a factual question, a comparison, a how-to
|
|
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
|
|
260
|
-
relevant parts
|
|
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
|
|
265
|
-
|
|
266
|
-
and
|
|
267
|
-
|
|
268
|
-
- **Check the citations.** The final result only
|
|
269
|
-
wrong number on a citation,
|
|
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
|
-
- [
|
|
283
|
-
- [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
|
|
284
|
-
- [ ] Try more kinds of objectives (
|
|
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
|
|