Skip to content

2.3.0

Latest

Choose a tag to compare

@medienbaecker medienbaecker released this 07 Aug 07:40

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 8

Haiku → 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, so Lorem "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 assumed content[0] was the text block. Setting api.model to claude-opus-5 failed 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.