---
title: "Site settings"
manual: "LLM Foundation"
version: "0.43"
permalink: "https://docs.typo3.org/permalink/netresearch/nr-llm:administration-site-settings@0.43"
source: "Administration/SiteSettings.rst"
rendered: "2026-11-04T13:45:29+00:00"
---

# Site settings {#administration-site-settings}

A site can name the LLM configuration and the DeepL key its AI calls use. A
site that names neither uses the installation's: the default configuration
and the key in the extension configuration. [ADR-244](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-244@0.43) records
the decisions.

## Setting it up {#administration-site-settings-setup}

1.  Add the set **LLM Foundation** (`netresearch/nr-llm`) to the
    site's dependencies. Without it the settings editor does not show the two
    settings, but a value in `config/sites/<site>/settings.yaml` still
    applies.
1.  Open **Site Management > Sites**, edit the site's settings and fill
    the category **AI (LLM Foundation)**.

Only administrators can change site settings: TYPO3 13.4 and 14.3 offer the
settings editor to administrators only. In `settings.yaml` write the nested
form shown below: a dotted key such as `nrllm.configuration: x` is not read
on a site that does not depend on the set. Whoever can change
`config/sites/<site>/settings.yaml` in the project can change them as well.

**config/sites/shop/settings.yaml**

```yaml
nrllm:
  configuration: shop-writer
  deepl:
    apiKeyIdentifier: shop-deepl
```

## LLM configuration {#administration-site-settings-configuration}

`nrllm.configuration` holds the identifier of an LLM configuration. A call
that states its site runs on that configuration instead of the installation
default. What an extension chose explicitly still wins: the configuration of
a cowriter request, of a landing page template or of an extension's own
named configuration.

A configuration that does not exist, is disabled or is restricted to backend
groups makes the call fail. It does not fall back to the default, because the
site was set up not to use it.

## DeepL key {#administration-site-settings-deepl}

`nrllm.deepl.apiKeyIdentifier` holds the identifier of an nr-vault secret,
like `translators.deepl.apiKeyIdentifier` in the extension configuration.
Store the key in the vault first and enter its identifier here. Never enter
the key itself: `settings.yaml` is versioned with the project.

Translations, glossary creation and glossary deletion for that site use this
key. A Free key (ending in `:fx`) goes to the Free endpoint, any other key to
the Pro endpoint; `translators.deepl.baseUrl` still overrides both. A site
glossary created under the global key is created again in the site's DeepL
account when DeepL refuses the old glossary id with a 400 or 404 that names the
glossary; how DeepL answers an id of another account has not been measured. An
identifier the vault does not hold
makes the translation fail; it does not fall back to the global key.

Whether DeepL is offered as a translator at all is still decided by the global
key: an installation whose sites all have their own key needs a key in the
extension configuration as well, or callers that pick a translator
automatically do not pick DeepL.

## Which calls know their site {#administration-site-settings-callers}

nr-llm does not guess a site from the request. An extension states it with
`withSite()` on its option object, which selects the site's configuration
and narrows the [term lists](https://docs.typo3.org/permalink/netresearch/nr-llm:administration-term-lists-scope@0.43) that are
bound to a site. The metadata key `ProviderCallContext::METADATA_SITE` on a
call with an explicit configuration only narrows the term lists.

The site's configuration applies to `chat()`, `complete()` and
`streamChat()`, and through them to the completion and translation services
and to document analysis on a provider that reads PDF files natively.
Embeddings, vision, conversations, the image and speech services and a
rasterized PDF, whose pages go to vision, keep the installation default. A tool
run keeps its site across an approval or an input it waits for. An agent run
queued for the background worker loses it: its turns are checked against every
site's forbidden terms and not against its own required terms.
