Worker environment
The worker runs the generation outside the web request. It needs the message routed to an asynchronous transport, bounded outbound HTTP calls, and the rendering binaries.
Messenger routing
Job submission dispatches a
Netresearch\. Route
it to an asynchronous transport (the doctrine transport in the dev setup) so the
HTTP request that created the job returns immediately and the
worker does the long-running work:
use Netresearch\NrRepurpose\Queue\Message\GenerateArtifactsMessage;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['messenger']['routing'][GenerateArtifactsMessage::class] = 'doctrine';
$GLOBALS['TYPO3_CONF_VARS']['SYS']['messenger']['routing']['*'] = 'default';
Note
TYPO3 v14.3 Core has no retry/failure transport. The message handler therefore catches a hard failure, marks the job failed, and does not rethrow — otherwise the message would be lost with no record. See ADR-001: Asynchronous Generation via Symfony Messenger.
HTTP timeouts
The generator worker makes outbound calls to the configured AI providers
(script, TTS, image). TYPO3's shared Guzzle client defaults to
timeout = 0 (no read timeout), so a stalled provider response would hang
the worker. Bound it:
$GLOBALS['TYPO3_CONF_VARS']['HTTP']['timeout'] = 300;
$GLOBALS['TYPO3_CONF_VARS']['HTTP']['connect_timeout'] = 15;
Since nr-llm 0. the specialized image/TTS calls carry their own
per-request timeout (image default 300 s), so a long-running image generation
is not cut off by a shorter global value; the global timeout still governs the
chat calls. Source-URL fetches and the social webhook set their own limits per
request (30 seconds for a web page, 120 for a PDF, 15 for the webhook) and do
not depend on this value (see A URL job fails with "Source is larger than …" or "Source did not arrive within …").
Renderer environment
The HTML-to-PNG renderer shells out to node running the bundled
render., which launches Chromium. node, ffmpeg and ffprobe
are expected on PATH; these defaults are baked into the service
definitions and need no scalars in a standard install.
The renderer passes the Chromium path to render. itself, in the child
process's CHROMIUM_ variable. The path is the $chromium
argument of
Netresearch\, default
/usr/. The worker does not need to export CHROMIUM_.
For a Chromium binary at another path, set the argument in your site's
Services.:
Netresearch\NrRepurpose\Rendering\PlaywrightHtmlToImageRenderer:
arguments:
$chromiumPath: '/usr/lib/chromium/chromium'
Chromium sandbox
The rendered HTML carries text the language model wrote from the source.
render. disables JavaScript and blocks every network request, and the
diagram body is reduced to static markup before it is rendered. With the
extension setting chromium on, Chromium also runs with its sandbox,
so a fault in its HTML or CSS handling stays confined to a process without
access to the worker's files and credentials.
The sandbox needs unprivileged user namespaces or Chromium's setuid sandbox
helper on the host that runs the worker. A container started with Docker's
default seccomp profile does not provide them, and Chromium refuses to start
as root with its sandbox; every render then fails with HTML render failed
and the cause (No usable sandbox! or `Running as root without
--`) is in the TYPO3 log. The setting is therefore
off by default. Turn it on where the worker runs as an unprivileged user on a
host or in a container that allows user namespaces, and check one Schaubild
after the change.