Adding article summaries to the digest prompt pushed the call past its 180s
timeout, because the model's reasoning grew with the input: 7,830 reasoning
tokens against a 5,722-character briefing.
GLM-5.3 and GLM-5.3-Flash use FORCED thinking and cannot have it disabled --
`thinking = {type = "disabled"}` returns HTTP 500, and the undocumented
`chat_template_kwargs.enable_thinking = false` only suppressed about 73% of it.
The supported control is `reasoning_effort`, taking low/high/max, and it must be
sent NESTED inside `extra_body`: LiteLLM validates top-level parameters against
a per-provider allowlist and rejects it outright with
"UnsupportedParamsError: zai does not support parameters: ['reasoning_effort']".
Measured on a real 28-story payload, with max as a control to prove the
parameter was genuinely routed rather than swallowed:
(none) 195s 7,830 reasoning 5,722 char briefing
low 20s 7 reasoning 3,648 char briefing, 7 paragraphs
high 117s 4,277 reasoning 4,730 char briefing, 8 paragraphs
`low` covers every theme in the digest -- world, US, Ohio, Cincinnati, Kentucky,
Australia -- and keeps the concrete detail the summaries exist to supply.
Separately, the reply is now plain prose. The JSON envelope carried exactly one
field and bought nothing but a failure mode: an unescaped quote inside the value
made json.loads throw and a complete briefing was lost to the templated list.
It was intermittent -- the same prompt at temperature 0 parsed on one run and
not the next -- which is worse than a reliable failure, because nobody goes
looking. `extract_briefing` still tolerates a code fence or a stray envelope,
including a malformed one, but neither is required. The INPUT stays JSON data;
that is what stops a headline reading as an instruction.
Today's digest regenerated: 28 stories, 3,651-character briefing.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015xPLgmcXCc9JjVwmQF63eM