A title call that could not survive a model that thinks
Reported: chat names never regenerate after the first reply. They were regenerating; the request was being made and the answer thrown away. `complete()` returns `message.content` verbatim, and a model that emits `<think>` inline puts its thinking in exactly the field the title is read from. So the title came back as "<think>Okay, the user wants a short title for" -- or, once the too-long guard caught that, as the first prompt trimmed, which is indistinguishable from titling never having run. That is what was being seen. Underneath it, `max_tokens: 24`. Ample for six words, and nowhere near enough for a model that reasons first: the budget goes on thinking and the content field comes back empty or holding an unclosed tag. Too small is not a shorter title, it is no title at all. Both fixed: the reply goes through `reasoning.strip_reasoning`, and the budget is `TITLE_MAX_TOKENS` with room to think. Reproduced first against the four shapes an endpoint actually answers with -- three of them were broken -- and the tests are written from those. What I did *not* do is ask for a low reasoning effort on the call, which would make it much cheaper and was the obvious move. `reasoning_effort` and `chat_template_kwargs` appear only where somebody has opted in, so that a provider strict about unknown parameters sees exactly the request it always did. An LLMError here is caught and turned into a fallback title -- so a 400 would be titling silently switching itself off, which is the failure this commit exists to fix. The token budget makes the room instead. The shipped prompt now asks for a leading emoji, as requested. Asked for rather than assumed: a model that ignores it gives a title without one, and an administrator who does not want them clears the word. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1211,13 +1211,18 @@ BUILTIN: tuple[Fragment, ...] = (
|
||||
group=GROUP_TASKS,
|
||||
order=400,
|
||||
variables=("question", "answer"),
|
||||
hint="A separate one-message request, not part of any chat. Clear it to "
|
||||
"stop asking a model for titles: chats are then named from their first "
|
||||
"message, and no request is made at all.",
|
||||
hint="A separate one-message request, not part of any chat, made once "
|
||||
"the first reply has finished so the title can describe the exchange "
|
||||
"rather than only the question. Clear it to stop asking a model for "
|
||||
"titles: chats are then named from their first message, and no request "
|
||||
"is made at all. The emoji is asked for rather than assumed — it makes "
|
||||
"a sidebar of twenty chats scannable — and a model that ignores the "
|
||||
"instruction simply gives a title without one.",
|
||||
default=(
|
||||
"Summarise this exchange as a title of at most six words. Reply with the "
|
||||
"title alone: no quotes, no punctuation at the end, no preamble. Use the "
|
||||
"language of the exchange.\n"
|
||||
"Summarise this exchange as a title of at most six words, beginning with "
|
||||
"a single emoji that fits it. Reply with the title alone: no quotes, no "
|
||||
"punctuation at the end, no preamble, no explanation. Use the language of "
|
||||
"the exchange.\n"
|
||||
"\n"
|
||||
"User: {{question}}\n"
|
||||
"\n"
|
||||
|
||||
Reference in New Issue
Block a user