This release makes LLM alt text generation noticeably more accurate and a lot faster.
Parallel generation
--concurrency for alter:generate so you can run parallel calls. It was up to 7.4 times faster in my tests.
kirby alter:generate --concurrency 8Haiku → Sonnet
api.model now defaults to claude-sonnet-5 (was claude-haiku-4-5). I've noticed that this new version of Sonnet is doing a much better job at writing alt texts. It's a bit more expensive but Haiku liked to drop text in images, which is a clear WCAG 1.1.1 failure.
To stay on Haiku:
'medienbaecker.alter' => [
'api.model' => 'claude-haiku-4-5',
]Removed
The legacy alter.model option. Use alter.api.model.
Fixed
- Alt text ending in a quotation lost its closing quote.
trim($text, '"\'')stripped quote characters from both ends unconditionally, soLorem "ipsum dolor sit amet"was written without the final". This mostly affected images containing a transcribed text. - Rate-limited and server errors are now retried, on every request the plugin makes. A request that keeps failing is reported without stopping the rest of the run.
- Models that emit a thinking block first threw
Unexpected API response format. Response parsing assumedcontent[0]was the text block. Settingapi.modeltoclaude-opus-5failed on every image; it now works. - Multilang: a redundant image generation per image.
translateForLanguage()looked up a cache key that could never match the one the default-language pass wrote, so it regenerated from the image instead of reusing the text it had just produced. - Multilang: the default language could be translated into itself. Kirby falls back to the default language for missing translations, so every language looked like it already had one. The default-language pass could spend a call translating German into German and get the same string back.
- The Panel offered generation for files the API cannot accept. SVGs showed a generate button that fired a request and silently did nothing. The button is now hidden for unsupported formats.