TYPO3 extension for generating llms.txt links based on the llmstxt.org specification and an on-site AI search assistant that helps visitors find information via ke_search and indexed_search.
Fixes two silent failures and rounds off the multi-site work.
The two upgrade wizards of 1.29.x were never registered on TYPO3 13.4: the
#[UpgradeWizard] attribute lives in a different namespace on v13 and v14, and an
attribute PHP cannot resolve is ignored rather than reported. If you are on 13.4
and did not find the wizards, they are there now — please run them.
An answer saved without a site was never played back. An empty site identifier
looked like "applies everywhere" and meant the opposite. It now means every
site, which is also what a new answer starts as.
Added: the "Bot Access Log" can be filtered by site like the other two modules;
in "Answers" the site is a dropdown starting at "All sites" and the language a
dropdown that follows it; a single conversation can be deleted in "Enquiries"
instead of only the whole log; "Clear log" finally asks first.
Changed: the backend modules use the standard TYPO3 record-action icons.
Select the T3X file and upload it. If you want to overwrite an existing extension installation, activate the checkbox.
Version history
Filter for TYPO3 versions
1.29.3stableLatest
September 04, 2026
TYPO3:
13 LTS14 LTS
(>=13.4.0 <=14.99.99)
Fixes two silent failures and rounds off the multi-site work.
The two upgrade wizards of 1.29.x were never registered on TYPO3 13.4: the
#[UpgradeWizard] attribute lives in a different namespace on v13 and v14, and an
attribute PHP cannot resolve is ignored rather than reported. If you are on 13.4
and did not find the wizards, they are there now — please run them.
An answer saved without a site was never played back. An empty site identifier
looked like "applies everywhere" and meant the opposite. It now means every
site, which is also what a new answer starts as.
Added: the "Bot Access Log" can be filtered by site like the other two modules;
in "Answers" the site is a dropdown starting at "All sites" and the language a
dropdown that follows it; a single conversation can be deleted in "Enquiries"
instead of only the whole log; "Clear log" finally asks first.
Changed: the backend modules use the standard TYPO3 record-action icons.
Fixes the backend modules disappearing although a valid licence is configured.
Since the subscription key can be maintained per site, and a backend request
belongs to no site, the licence was judged against whatever address the backend
happened to be open on. A staging domain, a dedicated admin domain, or simply
the second of two websites was enough to lose "Enquiries" and "Answers".
The backend and the command line now ask whether the installation holds a valid
licence at all: every key is tried, and any domain the installation serves
counts. A visitor request stays strict — it speaks for one website, and no other
site's licence can speak for it.
Also stops the daily status check from reporting the backend's own address,
which the issuing server recorded as a key in use on a domain it was not issued
for.
Multi-domain fix: a licence can now cover a second website without a new key.
The domains a subscription covers were frozen inside the key when it was
issued, so adding a domain to a licence never reached the installation. The
issuing server now publishes the current list with the daily status check,
signed separately — installations on either side of this change keep verifying
each other's answers.
The site search no longer returns pages of another site of the same
installation. ke_search and indexed_search index the whole installation and
know nothing about sites; the boundary is now drawn on the results.
The subscription key, the temperature and the agent instructions moved to the
site configuration, so two websites in one TYPO3 can be licensed separately and
address their visitors differently.
Please run the upgrade wizards (Admin Tools > Upgrade) after updating:
1. "AI Bridge: move the subscription key, temperature and instructions into the
site configuration"
2. "AI Bridge: rename the USD conversion rate and record the currency it
converts to" — assistantUsdToChfRate became assistantUsdConversionRate, with
the currency as its own setting
Until they have run, the former values keep being used; nothing stops working at
the moment of updating.
Do not use 1.29.0. It was published with the wrong field and is superseded.
llms-full.txt answered with a 404 where the route enhancer had been copied.
Configuration/Routes/RouterEnhancer.yaml is meant to be imported by reference,
and a site that does so picked up the endpoint added in 1.27.0 by itself.
Copying its content into config.yaml is just as common, and such a copy is a
snapshot: it maps llms.txt and .md, knows nothing of llms-full.txt, and the
request never reaches the page type — with nothing in the backend to suggest why.
A suffix the extension serves but the site does not map is now added to the
site's PageType enhancer while the configuration is read, taken from the shipped
file itself so the two cannot drift apart. A suffix the site already maps is left
exactly as it is, whatever it points at. A site without a PageType enhancer is
left alone entirely, since introducing one changes how every URL on that site is
built. Flush the caches after updating: the completed configuration is what gets
cached.
The Bot Access Log counts llms-full.txt separately.
Accesses to the full document were recorded under the same request type as
llms.txt, so the module could not say how often it was actually fetched — the
one number that matters for a document rendering every page of the site in a
single request. One is a table of contents a crawler reads to find its way
around, the other is the whole site at once, and how often each is asked for
says something different about the traffic.
The full document now has its own tile, its own filter option and its own badge
in the list. Both appear while llmsFullTxt is switched on: a site that does not
serve the document has nothing to count. Accesses are recorded either way, so
switching it on later does not start from zero. Entries recorded before this
version stay filed under llms.txt and are told apart by their path.
New: optional llms-full.txt (page type 1702), off by default via "llmsFullTxt".
Fixed: disabled, expired and login-protected pages no longer appear in the
search assistant, in llms.txt/llms-full.txt or in the Markdown export.
Flush caches after updating.
[BUGFIX] Backend unreachable on TYPO3 13.4 ("ModuleAccessGateInterface not found").
Module access gates are v14-only; on 13.4 the subscription-only modules are hidden
from the module menu instead. v14 is unaffected.
[CHANGE] Documentation and README language pass. Fixes statements that were wrong, not just awkward: the Administrator chapter claimed two of three tables hold personal data where all three do, the Editor chapter called backend modules
"editorial work", and the README described llms.txt as a policy file when it describes content rather than restricting access. Two README sections used Markdown definition lists that GitHub does not render. No code changes.
[CHANGE] Bugfix release. Fixes the subscription status check in the backend, doubled URLs on sites with an entry point, the false OnePager assumption in llms.txt and the Markdown export (new setting "llmsTxtOnePager"), and a chat panel that could not be
closed. Adds accessible backend badges and a translated "Web version" link.
A complete ** Installation** chapter in the documentation, from the Composer command to a working assistant: requirements, route enhancers, llms.txt per site, subscription key with a table of what each rejection reason means, the assistant's two witches, connecting Claude (getting a key, choosing a model, the settings that matter and why the temperature stays low), protecting the endpoint before going live, logging and cost tracking, a verification checklist and a troubleshooting table
Documentation release, no functional changes. The README described the backend modules under their old names ('Corrections' and 'AI Assistant Log'); they are called Answers and Enquiries, and the Bot Access Log was missing entirely. Corrected the stated TYPO3 requirement (13.4, not 13.0) and a repository link that only resolved inside a local checkout. Added what the licence check sends to the issuing server, which endpoints work without a subscription key, and a link to the rendered manual.
Initial TER release. Generates llms.txt and Markdown representations of pages according to the llmstxt.org specification, and adds an on-site AI search assistant that answers visitor questions from the ke_search or indexed_search index. Requires TYPO3 13.4 LTS or 14.x and PHP 8.2+. Derived from web-vision/ai-llms-txt (GPL-2.0-or-later). The chat widget and its backend modules require a subscription key; the llms.txt and Markdown endpoints work without one.
Buy a subscription key at:
https://www.marcelmarty.ch/#extensions
Initial TER release. Generates llms.txt and Markdown representations of pages according to the llmstxt.org specification, and adds an on-site AI search assistant that answers visitor questions from the ke_search or indexed_search index. Requires TYPO3 13.4 LTS or 14.x and PHP 8.2+. Derived from web-vision/ai-llms-txt (GPL-2.0-or-later). The chat widget and its backend modules require a subscription key; the llms.txt and Markdown endpoints work without one.
The two upgrade wizards of 1.29.x were never registered on TYPO3 13.4: the
#[UpgradeWizard] attribute lives in a different namespace on v13 and v14, and an
attribute PHP cannot resolve is ignored rather than reported. If you are on 13.4
and did not find the wizards, they are there now — please run them.
An answer saved without a site was never played back. An empty site identifier
looked like "applies everywhere" and meant the opposite. It now means every
site, which is also what a new answer starts as.
Added: the "Bot Access Log" can be filtered by site like the other two modules;
in "Answers" the site is a dropdown starting at "All sites" and the language a
dropdown that follows it; a single conversation can be deleted in "Enquiries"
instead of only the whole log; "Clear log" finally asks first.
Changed: the backend modules use the standard TYPO3 record-action icons.