aboutsummaryrefslogtreecommitdiffstats
path: root/CHANGELOG.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-07-31 19:09:44 +0200
committerDanilo M. <danix@danix.xyz>2026-07-31 19:09:44 +0200
commit0e35416128e38f158af49935262ecbf8dbf585e6 (patch)
tree2af059613853634dc8968ad700e98651bb383514 /CHANGELOG.md
parent283fc9ae0371f4d318a539f021a4b88e05fac190 (diff)
downloadllamachat-0e35416128e38f158af49935262ecbf8dbf585e6.tar.gz
llamachat-0e35416128e38f158af49935262ecbf8dbf585e6.zip
fix: cap searches at one per turn
A second tool call in the same turn, issued after the model has seen the first set of results, does not arrive as a tool_calls delta. It comes back as literal <tool_call><function=web_search> text inside reasoning_content, with finish_reason stop, no tool_calls and empty content. There is no structured call for the loop to act on, so the turn ends and the user is shown a blank reply. Reproduced 3/3 with Qwen3.5-9B through the router; the first call of a turn parses correctly every time, so this is specific to a call that follows a tool result. A retry with the tool withdrawn was tried and rejected: it produced an answer only some of the time and could surface the raw XML in the reply, which is worse than the blank it replaces. Capping at one search avoids reaching the broken state at all. Empty replies drop from 3/3 to about 1/3 and the XML no longer leaks, but the failure is not eliminated. Raise max_searches once the chat template parses follow-up calls. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'CHANGELOG.md')
-rw-r--r--CHANGELOG.md6
1 files changed, 5 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b3aad6..ddfc863 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,7 +22,11 @@ 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.
+ 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.
- 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