web-nomads / wn-ai-bridge
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.
Package info
github.com/web-nomads/wn-ai-bridge
Type:typo3-cms-extension
pkg:composer/web-nomads/wn-ai-bridge
Requires
- php: ^8.2 || ^8.3 || ^8.4
- ext-sodium: *
- league/html-to-markdown: ^5.1
- typo3/cms-backend: ^13.4 || ^14.1
- typo3/cms-core: ^13.4 || ^14.1
- typo3/cms-extbase: ^13.4 || ^14.1
- typo3/cms-fluid: ^13.4 || ^14.1
- typo3/cms-seo: ^13.4 || ^14.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.70
- helhum/typo3-console: ^8.3
- helmich/typo3-typoscript-lint: ^3.1.0
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0 || ^11.0
- typo3/cms-fluid-styled-content: ^13.4 || ^14.3
- typo3/cms-tstemplate: ^13.4 || ^14.3
- typo3/coding-standards: ^0.8
- typo3/testing-framework: ^8.0 || ^9.3
Suggests
- tpwd/ke_search: Use the ke_search index as a source for the AI search assistant
- typo3/cms-indexed-search: Use the TYPO3 core indexed search index as a source for the AI search assistant
README
Makes a TYPO3 site readable for AI systems, and gives its visitors a search assistant that answers from the site's own content.
Two halves that work independently:
- Machine-readable content — an
llms.txtfile following the llmstxt.org specification, and a Markdown representation of every page. Free, no key needed. - AI search assistant — a chat widget that answers visitor questions from your search index, with links to the pages it used. Requires a subscription key.
Requirements
| TYPO3 | 13.4 LTS or 14.x |
| PHP | 8.2, 8.3 or 8.4 |
| PHP extensions | sodium (subscription key verification) |
| Optional | ke_search or indexed_search as the assistant's index |
Installation
composer require web-nomads/wn-ai-bridge
Then activate the extension and flush caches.
Nice URLs
Without route enhancers the endpoints are reachable by page type only. To get readable URLs, import the shipped route configuration:
# config/sites/<identifier>/config.yaml imports: - resource: 'EXT:wn_ai_bridge/Configuration/Routes/RouterEnhancer.yaml'
| Without enhancer | With enhancer | |
|---|---|---|
| llms.txt | /?type=1699 |
/.well-known/llms.txt and /llms.txt |
| Markdown | /?type=1701 |
append .md to any page URL |
So https://example.com/about also exists as https://example.com/about.md.
What llms.txt is for
llms.txt sits at a well-known location and tells language models what a site
is about: a short description, its structure, and links to machine-readable
versions of the content. The place is the same idea as robots.txt, the purpose
is not — it describes content rather than restricting access. This extension
generates it from your actual page tree, so it stays correct without anyone
maintaining it by hand.
Configure the metadata (topics, contact, description) per site on the AI Bridge tab of the site configuration.
AI search assistant
A floating chat widget. Switch it on in the extension configuration
(assistantEnabled) and per site in the site configuration.
Search-only (no API key) returns ranked matching pages as suggestions with links. Fast, free, and nothing leaves your server.
Hybrid (with an LLM API key in assistantApiKey) additionally lets the
model compose a short answer from the retrieved pages and cite them. Any
failure — quota, timeout, malformed response — falls back to search-only rather
than showing an error.
The assistant reads ke_search and indexed_search when they are installed,
and always keeps a dependency-free pages/tt_content fallback so it returns
something even without a search index.
Backend modules
| Module | What it is for |
|---|---|
| Enquiries | Every question asked, the answer given, the provider, token usage and cost. Filterable |
| Answers | Question/answer pairs the assistant uses as its own knowledge |
| Bot Access Log | Which AI crawlers requested llms.txt and the Markdown endpoints |
Answers is the local learning source. An entry is played back verbatim when a new question matches it in meaning — term overlap plus string similarity, not exact wording. Weaker matches are handed to the model as binding hints. Entries come from three places: written by an editor, taken over from a logged answer in Enquiries, or captured from a correction a visitor made in the chat, which arrives as "pending" and is only used once approved.
Subscription
The assistant and its two modules are subscription features. Enter the key in the Subscription key field of the extension configuration. The key is encrypted and signed; it carries the domains it is valid for, an expiry date and the enabled features.
| Functions | Needs a key |
|---|---|
| Chat widget, Enquiries, Answers | yes |
| llms.txt, Markdown endpoints, Bot Access Log | no |
Important:
Without a valid key the widget stays hidden and the two modules disappear.
Everything else keeps working.
Order your subscription key:
DE: https://www.marcelmarty.ch/#extensions
EN: https://www.marcelmarty.ch/en/#extensions
Email me for a 14-day free trial licence.
What the licence check sends
Once a day the extension asks the issuing server whether the subscription is still active, sending the subscription id, this installation's hostname and a random nonce. No visitor data is involved — no IP addresses, no questions, no page content. The signed answer is what carries a renewal to the installation, so a renewed subscription takes effect without anyone pasting a new key, and a revoked one stops working without waiting for its expiry date.
An unreachable server changes nothing: the date inside the key decides, and only an explicitly signed "revoked" switches the features off.
Leave subscriptionKey empty and nothing is ever sent.
See Documentation/Administrator for the full description, including what is reported when an installation looks manipulated.
Configuration
Extension configuration (Admin Tools → Settings → Extension Configuration) covers the assistant, the LLM provider, rate limiting and the subscription key. Per-site settings live on the AI Bridge and AI Search Assistant tabs of the site configuration.
Two things worth setting before going live with the assistant:
- Enable the rate limiter (
rateLimiterEnabled). The assistant endpoint is reachable without authentication and every request can cost money. - Set a spending limit in your LLM provider account as an independent second net.
Documentation
The full manual is rendered at
docs.typo3.org,
and its source lives in Documentation/.
Development
composer install composer test # unit tests composer stan # PHPStan level 6 composer cs:check # coding standards, --dry-run composer cs:fix # apply them composer ci # all of the above composer release # build the TER archive
composer release writes wn_ai_bridge_<version>.zip next to the extension
folder and refuses to build if the version in ext_emconf.php and
composer.json disagree, if ext_emconf.php would not land at the archive
root, or if anything generated would be packed.
Contributing
Issues and pull requests are welcome at github.com/web-nomads/wn-ai-bridge.
For a pull request: follow the TYPO3 coding standards (composer cs:fix), add
tests for behaviour you change, and keep composer ci green.
Credits
This extension started as a fork of web-vision/ai-llms-txt by web-vision, which provides the llms.txt generation according to the llmstxt.org specification. The AI search assistant, the Markdown endpoints and the subscription handling were added here.
Licence
GPL-2.0-or-later, the same licence as the original — see LICENSE.