You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+27Lines changed: 27 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,6 +22,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
22
22
-**BREAKING**: Renamed the `[model]` section in `config.toml` to `[inference]` and reshaped it from a single `ollama_url` string into the providers schema described above. There is no backward-compatibility shim for the section name: if you had a custom `[model]` section, rename it to `[inference]` after upgrading; a flat `ollama_url` inside `[inference]` is migrated automatically.
23
23
- Active model selection is now strictly Option-typed end to end: when nothing is installed and nothing is persisted, Thuki refuses to dispatch requests and surfaces a "Pick a model" prompt instead of falling back to a hardcoded slug. The previous `DEFAULT_MODEL_NAME` constant has been removed.
* built-in web search with auto-search, citation audit, and progressive trace ([#312](https://github.com/quiet-node/thuki/issues/312)) ([7972b31](https://github.com/quiet-node/thuki/commit/7972b31346f5dd55e4ca396026e26fc974282e1c))
31
+
***ci:** ship Thuki Nightly as side-by-side signed install ([#336](https://github.com/quiet-node/thuki/issues/336)) ([3810dd1](https://github.com/quiet-node/thuki/commit/3810dd15cdff0c22276cd3e71c4347b6394a2253))
***history:** auto-save chats with retention and free chats ([#331](https://github.com/quiet-node/thuki/issues/331)) ([057b089](https://github.com/quiet-node/thuki/commit/057b089db4df43bc7f4560d3348550812b890717))
35
+
* move Diagnostics to Behavior tab with trace retention and folder actions ([#325](https://github.com/quiet-node/thuki/issues/325)) ([70d68ac](https://github.com/quiet-node/thuki/commit/70d68ac489515699c2a2b46d162ffbd64faa2b54))
36
+
* search language parity across retrieval and answers ([#326](https://github.com/quiet-node/thuki/issues/326)) ([9005d44](https://github.com/quiet-node/thuki/commit/9005d44ac14538d8f8dffdf74de6ad4c187ad75f))
37
+
* search resilience and citation a11y ([#327](https://github.com/quiet-node/thuki/issues/327)) ([e8e2fd7](https://github.com/quiet-node/thuki/commit/e8e2fd73b98ed8d1cea1172d4c33fe88f72c79ae))
38
+
* search trust and lawfulness package ([#323](https://github.com/quiet-node/thuki/issues/323)) ([151adf6](https://github.com/quiet-node/thuki/commit/151adf6768b4760039397d51f296f68e9064c4e1))
39
+
***settings:** Changelog tab with full release history ([#328](https://github.com/quiet-node/thuki/issues/328)) ([fd909fe](https://github.com/quiet-node/thuki/commit/fd909feda2c748136591a4629ad6ff852ef71e42))
40
+
41
+
42
+
### Bug Fixes
43
+
44
+
***ci:** make engine-gate throughput report-only instead of a blocking floor ([#321](https://github.com/quiet-node/thuki/issues/321)) ([07f1ca8](https://github.com/quiet-node/thuki/commit/07f1ca8afc9f2317395528d6e23371ec0d3e8218))
45
+
* disclose when a requested web search can't reach the web or finds nothing ([#314](https://github.com/quiet-node/thuki/issues/314)) ([2a4d749](https://github.com/quiet-node/thuki/commit/2a4d749eb519540573085ef7d035a1ac0e75cd6c))
46
+
***models:** gate browse installs to chat brains only ([07e0b35](https://github.com/quiet-node/thuki/commit/07e0b35eae8d363f3476c3f072e9494a8d397b72))
47
+
***models:** gate Browse installs to chat brains only ([#337](https://github.com/quiet-node/thuki/issues/337)) ([07e0b35](https://github.com/quiet-node/thuki/commit/07e0b35eae8d363f3476c3f072e9494a8d397b72))
48
+
***search:** disclose when a requested web search is unreachable or finds nothing ([2a4d749](https://github.com/quiet-node/thuki/commit/2a4d749eb519540573085ef7d035a1ac0e75cd6c))
49
+
* surface the 80% memory headroom rule in the model-fit warning ([#322](https://github.com/quiet-node/thuki/issues/322)) ([a9d5bb4](https://github.com/quiet-node/thuki/commit/a9d5bb4a297ae38a2b0739e28ff5ef22e746e507))
50
+
* wire Auto search learn URL to disclosure blog post ([#335](https://github.com/quiet-node/thuki/issues/335)) ([01a99e2](https://github.com/quiet-node/thuki/commit/01a99e28790f916f5ce6d850cb917aae56ef9df9))
Copy file name to clipboardExpand all lines: docs/configurations.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -194,6 +194,7 @@ The table below also lists the baked-in safety limits that govern Thuki's commun
194
194
|`MAX_GGUF_KV_COUNT`|`4096`| No | Defense-in-depth bound on a downloaded GGUF's metadata-key count. A corrupt or hostile `metadata_kv_count` could otherwise drive an unbounded scan; real models carry a few dozen entries, so 4096 never truncates legitimate metadata. | — | The most GGUF metadata key-value pairs the reasoning classifier scans when reading a downloaded model's chat template. Scanning stops at the cap. |
195
195
|`MAX_GGUF_KEY_BYTES`|`1 KiB`| No | Defense-in-depth bound on a downloaded GGUF's metadata-key length. Keys are short dotted identifiers (`tokenizer.chat_template`); capping the length stops a corrupt length field from forcing a large allocation. | — | The longest GGUF metadata key the reasoning classifier will read. A longer key stops the scan. |
196
196
|`MAX_GGUF_STRING_BYTES`|`4 MiB`| No | Defense-in-depth bound on a downloaded GGUF's string values. Real chat templates run a few KB to ~100 KB; 4 MiB never truncates one while bounding the memory a corrupt length field can demand. | — | The largest GGUF string value (the chat template or architecture) the reasoning classifier will materialize. A larger value stops the scan and the model relies on the runtime backstop instead. |
197
+
|`DENIED_PRIMARY_ARCHES`|`bert, t5, clip, …`| No | Defense-in-depth bound on attacker-influenced GGUF headers, and pin-scoped: a GGUF's `general.architecture` is editable, so a known non-chat family is refused as a primary chat model rather than handed to the engine, and an engine bump may add families that should stay out of the primary load path. Missing architecture stays soft (filename path) so an incomplete header never bricks an install. | — | Architectures that may never load as a primary chat model. A downloaded or pasted GGUF whose header reports one of these non-chat families (embedding, encoder-only, audio tokenizer) is rejected at finalize/load with a clear "not a chat model" message; a chat arch not on the list still passes. |
197
198
|`HF_API_TIMEOUT_SECS`|`15 s`| No | Protocol cap on a hung remote service so the download UI cannot stall on metadata resolution; 15 s is generous for a small metadata call over the internet. | — | How long Thuki waits for a Hugging Face API metadata call (repo file listing) to respond before giving up. Applies to resolving pasted repo ids and listing a repo's GGUF files, not to the model download itself. |
198
199
|`HF_BASE_URL`|`https://huggingface.co`| No | Single origin for model metadata and downloads. Provenance comes from the pinned repo revisions in the curated starter registry, and those pins are only meaningful against the canonical Hub; an arbitrary mirror could serve different content under the same revision ids. | — | The Hugging Face origin Thuki uses for all model metadata calls and blob downloads. Every starter in the registry pins a repo at an exact revision and carries a compiled-in sha256 digest checked after download; the digest catches truncation, bit rot, and resume corruption, while the pinned revision on the canonical Hub is what fixes which content is fetched. |
199
200
|`HF_SEARCH_LIMIT`|`30`| No | The per-page step for the in-app model browser. The "Load more" control raises the requested page size in multiples of this value, so it is a layout step rather than a user preference. | — | How many GGUF model repos the first page of an in-app Hugging Face search returns, most-downloaded first. |
Copy file name to clipboardExpand all lines: docs/models-and-providers.md
+4-2Lines changed: 4 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -128,7 +128,9 @@ In practice you rarely need to weigh any of this yourself: Discover's **Staff pi
128
128
129
129
### mmproj (vision)
130
130
131
-
A vision model needs a second file, the **multimodal projector** (`mmproj`), that turns an image into something the model can read. Thuki downloads it alongside the main model and passes it to the engine with `--mmproj`. Models with this companion show a **Vision** badge. Projector files and other non-chat helpers (draft / MTP / dspark) never appear as standalone chat downloads in Browse all: only primary text weights are listed, and a matching projector is attached automatically when you install a brain from the same repo.
131
+
A vision model needs a second file, the **multimodal projector** (`mmproj`), that turns an image into something the model can read. Thuki downloads it alongside the main model and passes it to the engine with `--mmproj`. Models with this companion show a **Vision** badge. Projector files and other non-chat helpers (draft / MTP / dspark / LoRA / embedders) never appear as standalone chat downloads in Browse all: only primary text weights with complete LFS metadata are listed, and a matching projector is attached automatically when you install a brain from the same repo. When a repo ships several projectors, Thuki ranks them like llama.cpp (shared path with the brain, then closest quant bit-width).
132
+
133
+
At install and load time Thuki also re-reads the GGUF header: CLIP/mmproj roles, embedding architectures (bert, t5, …), and other non-chat helpers are rejected as primary chat models so they never become Ready. Missing architecture stays soft (filename heuristics). The denylist is pin-scoped: an engine bump may need a list update when new non-chat families appear.
132
134
133
135
### Capabilities
134
136
@@ -164,7 +166,7 @@ First it estimates the model's **resident size** at runtime:
164
166
estimate = model file size + ~2 GB overhead
165
167
```
166
168
167
-
The ~2 GB is a baseline for the engine's runtime buffers and KV cache. (The KV cache also grows with your context window, covered separately in the context-window guide.) For a vision model, a curated Staff pick folds its projector (`mmproj`) into the size; a Browse-all or installed-Library row counts only the single GGUF file you see on the row.
169
+
The ~2 GB is a baseline for the engine's runtime buffers and KV cache. (The KV cache also grows with your context window, covered separately in the context-window guide.) For a vision model, Thuki folds the projector (`mmproj`) into the size when known: Staff picks use the curated projector size, and installedLibrary / load-gate paths use the on-disk projector blob (or the curated size when the blob length is not yet available).
168
170
169
171
Then it compares that estimate against your Mac's **total physical memory**, read straight from the system (`hw.memsize`). Apple Silicon uses unified memory shared between the CPU and GPU, so a model competes for RAM with everything else you are running:
message:"This file is a vision projector, not a chat model.\nDownload a text model GGUF; Thuki attaches the projector automatically when the repo includes one.".to_string(),
481
490
}
491
+
}elseifis_mmproj_mismatch(&lower){
492
+
// Wrong projector paired with text weights (n_embd / dim mismatch).
493
+
EngineError{
494
+
kind:EngineErrorKind::EngineStartFailed,
495
+
message:"Vision projector mismatch\nThis model's projector does not match the text weights. Re-download the model so Thuki can pick a matching mmproj, or choose another vision model.".to_string(),
496
+
}
482
497
}elseif lower.contains("unknown model architecture")
483
498
|| lower.contains("unknown architecture")
484
499
|| lower.contains("unsupported model architecture")
0 commit comments