dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness plugin that gives the agent eyes: capture a screen, measure drift, and check written expectations against the image with an embedding score.
Eyes for an agent inside DeepSeek Harness: capture a URL or a local HTML file, measure how much the screen drifted, and test written expectations against the image in the same 768-dimensional embedding space.
Every verdict comes with its score. "The screen is fine" without a number is the sentence this plugin exists to prevent.
One plugin line, two surfaces:
| Who | How | What you get |
|---|---|---|
| the agent | olhos_verificar tool | for each expectation: cosine score, confirmed or not, the capture path, and (opt-in) drift against the last reference |
| you, in the chat | /olhos ... | capture and compare, keep a good reference, or find an old capture by meaning |
npm install -g pnpm
npx @deepseek-ai/dsh plugin --profile web add github:songjongdevsecops/dsh-olhos
Restart the harness: the bundle layer is read at boot. Then check the loaded line:
npx @deepseek-ai/dsh --profile web --dump-config | grep -A6 olhos
Expected shape:
- id: olhos
name: dsh-olhos
config:
capturas: temporarios/olhos
limiar: 0.7344
navegador: casa
The package declares dsh.bundle.patch, so dsh plugin add appends dsh-olhos
to dsh.profile.bundles in the profile manifest. That line is the only
activation.
Update: re-run the add command and restart. Uninstall:
npx @deepseek-ai/dsh plugin --profile web remove dsh-olhos, then restart.
^22.19.0 || >=24.0.0 (the range DeepSeek Harness supports).PATH; the harness uses it to manage profile plugins.npx @deepseek-ai/dsh web.PATH, with websocket-client for the capture script:
python3 -m pip install websocket-client.navegador: casa)
attaches to http://127.0.0.1:9222, so start the browser with
--remote-debugging-port=9222. With navegador: proprio the plugin launches
its own disposable headless browser (OLHOS_CHROME, default google-chrome)
instead.OLHOS_GEMMA_RAIZ at it (default ~/workspaces/tools/embeddinggemma). The
directory must contain venv/bin/python, src/embeddinggemma.py,
src/vetores.py, and the model cache under modelos/. Its own install script
builds the CPU environment (torch, sentence-transformers) and downloads the
1.5 GB model.The plugin does not bundle the embedding engine. Without that checkout a
capture still works, but no score can be produced, and olhos_verificar fails
with a message naming OLHOS_GEMMA_RAIZ.
The shell scripts (.sh) and Python companions run on Linux and macOS. On
Windows, use WSL or Git Bash with Python 3 available.
Ask the agent to check something visible. It calls the tool with a target and one expectation per line:
Use olhos_verificar on http://127.0.0.1:3080/ with the expectations
"the panel shows three session cards" and "the error message is visible".
The tool answers with a score per expectation and a verdict:
limiar 0.7344
| expectation | score | verdict |
| the panel shows three session cards | 0.7225 | not found |
| the error message is visible | 0.6254 | not found |
0/2 confirmed. Lowest score 0.6254. Capture: temporarios/olhos/.../20261013-163453.png
The threshold is strict: a score must be greater than the threshold to confirm. Scores below it are reported as not found, which is the deliberate precision-over-recall bias described under Limits.
In the chat:
/olhos http://127.0.0.1:3080/ # capture and drift against the last reference
/olhos http://127.0.0.1:3080/ "three cards" "error" # also test these expectations
/olhos marcar http://127.0.0.1:3080/ # capture now and store it as the good reference
/olhos ultima http://127.0.0.1:3080/ # drift only, no new capture
/olhos achar "login screen with an error" # find an old capture by meaning
/olhos ajuda
Expectations should be short, concrete and visible. "The panel shows three session cards" works; "the layout is nice" does not.
A threshold passed to the tool (limiar) is stored for that target in
limiar.json and used on the following calls.
Every path is configurable and the defaults derive from your home directory, so
nothing is tied to a specific machine. Override by environment variable or by the
config of the olhos line in your profile patch. A patch replaces the whole
config of the line, so restate every key you want to keep.
| Config key | Default | Meaning |
|---|---|---|
capturas | temporarios/olhos inside the package | where captures, references and per-target limiar.json live. A relative path resolves inside the package; use an absolute path to keep captures across plugin updates |
limiar | 0.7344 | cosine threshold for written expectations. Calibrated, not portable |
navegador | casa | casa attaches to Chrome on CDP 9222; proprio launches a disposable headless browser |
| Environment variable | Default | Meaning |
|---|---|---|
OLHOS_GEMMA_RAIZ | ~/workspaces/tools/embeddinggemma | engine checkout used by olhos.py |
OLHOS_CDP | http://127.0.0.1:9222 | CDP endpoint |
OLHOS_CHROME | google-chrome | browser binary for navegador: proprio |
OLHOS_PERFIL | <package>/temporarios/<date>-olhos/chrome-perfil | profile directory for the disposable browser |
OLHOS_LIMIAR | 0.7344 | default when the engine scripts are called directly |
OLHOS_LARGURA, OLHOS_ALTURA | 1440, 900 | capture viewport |
Profile patch example (~/.dsh/profiles/web/cordis.patch.yml):
- id: olhos
config:
capturas: '/home/you/.dsh/olhos'
limiar: 0.7344
navegador: casa
From a clone of the repository:
node --test tests/
scripts/olhos.sh selftest
node --test needs only Node.js: 20 tests covering the tool and command
registration, the bundle contract, the strict threshold decision and the
per-target key.
scripts/olhos.sh selftest needs the engine virtualenv installed (not the model
weights) and checks the threshold math without loading the model.
To verify the install, check the --dump-config output above and ask the agent
to run olhos_verificar against a page that is open in your browser.
The default threshold and the warnings below come from a calibration run on this plugin: 20 written expectations, 22 captures, 440 labeled pairs, EmbeddingGemma, 768 dimensions.
| Measure | Result |
|---|---|
| expectations, all pairs | 390/440 = 88.6% agreement at 0.7344 |
| calibration split (12 expectations) | 224/264 = 84.9%, 0 false positives, 40 false negatives |
| validation split (8 expectations) | 166/176 = 94.3%, 0 false positives, 10 false negatives |
| whole-screen drift, 10 meaningful changes | 1/10 caught |
| whole-screen drift, 3 deliberate breakages | 1/3 caught |
| whole-screen drift, 10 cosmetic changes | 1/10 flagged |
| pixel-difference baseline, same set | 10/10 and 3/3 caught, but 7/10 cosmetics flagged |
The threshold is the highest negative score (max(negativos)): no false
expectation passes it, which is why false positives are zero. The price is false
negatives: true statements whose score falls below the threshold are reported as
not found. In a live verification on the calibration page, the panel really had the
three cards and scored 0.7225, below 0.7344.
The drift margin on that set is negative: the two groups overlap. A whole-screen cosine flagged a header path change and missed the three cards disappearing. That is why drift is opt-in and never a verdict on its own.
scripts/olhos.sh calibrar --positivos <file.jsonl> --negativos <file.jsonl>
and put the result in the target's limiar.json./olhos achar reads an index, it does not build one. The command expects a
collection named olhos-telas-gemma-v1 in the engine's indices/ directory.
Building that index is outside this plugin.motor EmbeddingGemma não encontrado: set OLHOS_GEMMA_RAIZ to a checkout
with venv/bin/python, src/ and modelos/, then restart the harness.ModuleNotFoundError: websocket: python3 -m pip install websocket-client.http://127.0.0.1:9222, or set navegador: proprio to let the plugin launch
its own browser.