summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-01 20:04:11 +0200
committerDanilo M. <danix@danix.xyz>2026-08-01 20:04:11 +0200
commite3421bd781a103d3495a8a741bc04541ada59c6d (patch)
treed1d70b0fe64889308716c783e303248aaedda3fb
parent2fae45408489594d009215c82c2ca9acdc00e394 (diff)
downloadllamachat-e3421bd781a103d3495a8a741bc04541ada59c6d.tar.gz
llamachat-e3421bd781a103d3495a8a741bc04541ada59c6d.zip
chore: release 0.3.0v0.3.0
-rw-r--r--CHANGELOG.md49
-rw-r--r--llamachat/__init__.py2
2 files changed, 44 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ddfc863..451092f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,10 +5,51 @@ All notable changes to this project are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [Unreleased]
+## [0.3.0] - 2026-08-01
+
+### Changed
+
+- `max_searches` now defaults to 2, up from 1. The empty-reply failure that
+ forced the lower cap has two causes, both now understood: the model was
+ never told its last search was spent, fixed below, and llama-server's
+ quantized KV cache degrades tool calling, which is a server setting rather
+ than something this client can control. With `f16` KV and the final-round
+ note, a question needing two searches answered 4 and 5 times out of 6 on
+ two runs, against 3 of 3 broken before. Single-search turns are solid, 6
+ of 6. Lower it back to 1 when running a quantized KV cache, or if empty
+ replies are more annoying than a second search is useful.
+
+### Fixed
+
+- A turn that used its last search no longer ends with an empty reply. The
+ final round's tool result now states that the search tool is gone and the
+ answer is due. Withdrawing the tool schema was invisible to the model,
+ which asked for another search regardless: this model's chat template
+ defines its own `<tool_call><function=...>` XML dialect, so the request
+ came back either as literal text in the reply or buried in the thinking
+ block, and in both cases the reply itself was empty. The note rides on the
+ tool result because a trailing system message is rejected outright, the
+ template raising "System message must be at the beginning". Measured on
+ the question that first showed the bug: 3 of 5 turns broken before, 5 of
+ 5 answered after.
### Added
+- Conversation titles are written by the model. Once a reply finishes in a
+ session still carrying its placeholder title, the exchange is sent back in
+ a short side request asking for a title of at most six words, and the
+ answer replaces the opening words of the question the entry was created
+ with. The trigger is the placeholder rather than the turn number, so a
+ first reply that comes back empty does not forfeit titling for the rest of
+ the session, and a one-shot window, which appends every question to the
+ same entry until New is pressed, is titled from the question that actually
+ got answered. It runs on its own thread and is silent about failure: an
+ unreachable router or an unusable reply leaves the original title in place
+ rather than raising.
+ Thinking is disabled for that request through the chat template, since a
+ reasoning model otherwise spends the whole token budget on its thoughts
+ and returns an empty answer.
+
- Web search through a SearXNG instance. The model is offered a `web_search`
tool and decides for itself when a question needs current information;
llamachat runs the query and feeds the results back. Off by default, and
@@ -22,11 +63,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Six configuration keys: `search_enabled`, `search_url`, `search_results`,
`search_snippet_chars`, `search_timeout` and `max_searches`. Searches are
capped per turn, after which the tool is withdrawn and the model must
- answer. The cap defaults to 1: a second tool call, issued once the model
- has seen the first results, comes back as literal `<tool_call>` text
- rather than a structured call, and a turn that ends on one leaves the
- reply empty. Raise it when the model and llama.cpp build handle
- follow-up calls.
+ answer.
- Searches are stored per message in a new `searches` column, so reopening a
conversation still shows what was looked up. They are deliberately kept
out of the full-text index, or web text nobody wrote would compete with
diff --git a/llamachat/__init__.py b/llamachat/__init__.py
index 9dbd5c5..04fc36e 100644
--- a/llamachat/__init__.py
+++ b/llamachat/__init__.py
@@ -12,4 +12,4 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-__version__ = "0.2.1"
+__version__ = "0.3.0"