v0.12.0
Highlights
Editors get a prompt-snippet library. The new Snippets module manages small named prompt fragments — podcast personas, tones of voice, target audiences, image styles, layout hints — with free-form tags and optional metadata JSON. Consuming extensions query them by tag and compose them into their prompts through a small API (findActiveByTag(), findByUids(), PromptSnippetComposer). Snippets are deliberately not prompt templates: templates are complete prompts with model parameters, snippets are building blocks (ADR-031).
The cost picture is finally complete. Image generation, text-to-speech and transcription calls used to record little more than a request count; the Analytics module, cost widgets and per-user budget windows systematically missed their spend. They now record real units (images, characters, audio seconds), token usage straight from gpt-image responses, the model id, and an estimated cost via a documented OpenAI price catalog with a model-row-first cascade. Usage rows link both model_uid and configuration_uid, so per-model and per-configuration breakdowns work across all call types (ADR-032).
Specialized models are first-class citizens. New model capabilities image, text_to_speech and transcription bring image/TTS/transcription models into the model registry; the specialized services resolve their default model from active registry records, guarded by a per-service vocabulary check so an OpenAI default can never reach the FAL endpoint and vice versa (ADR-033). On top of that, resolveModelForConfiguration() and getConfigurationSystemPrompt() make Configuration records the stable indirection layer for image and speech calls too: administrators swap models and maintain prompt preambles centrally, without touching any consumer.
Long-running calls stop dying at the global timeout. The services' configured timeout now actually reaches the wire through nr-vault's new per-request withTimeout() wither, and the image-generation default rose to 300 seconds — large gpt-image-2 renders routinely need more than the typical instance-wide 180s. ImageGenerationOptions also accepts any WIDTHxHEIGHT for gpt-image models (divisible by 16, aspect 1:3–3:1, max 3840x2160).
Truthful tooling. Name-style nr-vault identifiers work as API keys (they were misread as legacy plaintext, silently degrading model discovery to a stale catalog and even breaking provider-record saves). Model discovery no longer filters out tts/whisper/dall-e models, ships a current fallback catalog, logs failures, and visibly flags when the form shows the built-in catalog instead of live API data. Vault audit entries name the actual model and purpose — "OpenAI Images API call (gpt-image-2, generate)" instead of a generic label.
Compatibility
- nr-vault
^0.10.0is now required — the secure-client integration relies on the current API surface (per-requestwithTimeout(), header-placement options). Older nr-vault versions are not supported. - New DB tables/columns:
tx_nrllm_promptsnippet; usage-table aggregation now keys onmodel_idas well. Run the database analyzer /extension:setupafter upgrading. - No breaking PHP API changes for existing consumers; all new resolution APIs are additive.