From 8d5c4b563da5225c4dbd2a44c7635c49a16d5ab1 Mon Sep 17 00:00:00 2001 From: Agando Date: Mon, 2 Nov 2026 20:46:18 +0100 Subject: feat(newos4): configurable tool budgets, per-model defaults, real tool telemetry Closes STEER-20261102-201234-7200 (read_file capped at 6000 while the schema promised 32000). Budgets (module-aiassist.js + new modules/core/model-profiles.js): - one resolver, precedence: call arg -> loop profile -> model profile -> ai-config -> code default. Keys: read-page-chars, read-result-chars, tool-context-budget, fetch-chars. - model classes tiny/small/mid/large keyed by id then by size token; `mid` reproduces the old numbers so nothing moves for a mid model. - _clipToolResult now clips the `content` field, never the serialised JSON envelope: clipping the envelope deleted truncated/next_offset, so a 16k page lost its continuation pointer (the reported symptom). - read_file's schema no longer promises a number the model class may not give. Telemetry: - _recordToolCall keeps sizes, duration, ok and a 120-char arg preview instead of the whole payload; ai-stats prints calls / ok% / avg ms / KB / truncation from localStorage webx11_tool_stats. Server (api/proxy-api.py): - /api/extract honours max_chars (default 12000, cap 100000) and returns content_chars + truncated; the bs4 branch is no longer uncapped while the regex fallback was silently cut at 10 000. BEHAVIOUR CHANGE: num_ctx for a model with no explicit setting now follows the class default (16384 -> 65536 for cloud/large, 8192 for tiny). Cloud models bill on tokens used, so cost is unchanged; local models get a bigger KV cache. Two build traps, both now documented in AGENTS.md: - model-profiles.js must be the FIRST entry in CORE_FILES and must export the MODEL_PROFILES global (a TDZ typeof throws; without the global every budget silently falls back to the code default). - a budget key needs the setter branch AND the constructor loader at module-aiassist.js:49 - persisting without restoring looks fine until reload. Verified: test-tool-context-bound 23/23 (RED before: E1-E4 + TypeError on _toolLimit); live bundle read_page 32000 / result 12000 / budget 48000 / fetch 12000 and _ctxTokens 65536 for gemma4:31b-cloud; /api/extract 28970 -> 500 chars with truncated true; ai-config write+restore probe 6/6. --- help.html | 3 +- main.html | 6 +- modules-index.json | 4 +- modules/core/core-bundle.js | 205 ++++++++++++++++++++++++++++---- modules/core/model-profiles.js | 43 +++++++ modules/core/module-aiassist.js | 151 ++++++++++++++++++++--- modules/core/module-loader.js | 2 +- modules/core/ollama-manager.js | 58 +++++++-- modules/test/test-tool-context-bound.js | 46 +++++++ scripts/rebuild-bundles.py | 2 + 10 files changed, 462 insertions(+), 58 deletions(-) create mode 100644 modules/core/model-profiles.js diff --git a/help.html b/help.html index b2caf27..faf7af6 100644 --- a/help.html +++ b/help.html @@ -539,7 +539,8 @@ diff a.txt b.txt ai-denyDeny pending destructive actionai-deny ai-stopCancel running AI requestai-stop ai-compressManually compress conversation contextai-compress - ai-configView/set AI loop config (max-turns, max-context, max-context-tokens, confirm-timeout(0=disabled), chat-lock-timeout, skill-debounce, trivial-optimization)ai-config max-turns 12 + ai-configView/set AI loop config (max-turns, max-context, max-context-tokens, confirm-timeout(0=disabled), chat-lock-timeout, skill-debounce, trivial-optimization, temperature, top-p, max-tokens, thinking) and AI tool budgets in characters (read-page-chars, read-result-chars, tool-context-budget, fetch-chars — each 500-200000; read-page-chars/read-result-chars use the model default when unset)ai-config max-turns 12 + ai-statsPer-tool telemetry for this browser (localStorage webx11_tool_stats): calls, ok %, avg duration, KB returned, truncation rate — for finding which tools flood the AI contextai-stats debugToggle AI debug mode (ext module)debug debug-aiToggle AI tool-call debug paneldebug-ai debug-ai-lastShow last AI response (content, tool calls, errors)debug-ai-last diff --git a/main.html b/main.html index a785d7c..5681c10 100644 --- a/main.html +++ b/main.html @@ -1349,13 +1349,13 @@ - + - + - +