Skip to content

Configuration Reference

All configuration lives under the sulu_ai_platform key. Configuring the base sulu_ai bundle directly is rejected — the platform bundle derives and prepends that configuration itself.

Full tree with defaults:

# config/packages/sulu_ai_platform.yaml
sulu_ai_platform:
    base_uri: 'https://api.sulu.ai/v1/'    # The base URI for the sulu.ai platform
    api_key: ~                             # REQUIRED — API key from your platform project settings
    contact_email: ~                       # REQUIRED — address offered to editors when the platform refuses for account reasons

    webhook:
        secret: ~                          # REQUIRED — generated by sulu:ai:register-webhook

    image_loader:
        allow_insecure_https: true         # Disable TLS certificate verification when loading images
        authorization: null                # String ("Bearer <token>") or {type, value} — see below

    locale_map: {}                         # Map Sulu locales to platform locales — see below

    stores: {}                             # Named datastores exposed as Symfony AI stores

    intelligent_search:
        enabled: false                     # Enable intelligent search services, commands, and routes
        identifier: null                   # Optional intelligent search UUID (default: project default)
        example_ui:
            enabled: false                 # Expose the demo UI at /ai-search
        feedback:
            persist: true                  # Write every search and its answer to the feedback screens
            max_comment_length: 2000       # Longest comment the public feedback endpoint accepts

        ip_rate_limit:
            enabled: true                  # Per-IP rate limiting for the public search and feedback endpoints
            limit: 10                      # Allowed requests per interval and IP
            interval: 60                   # Interval in seconds

    translator:
        languages: {}                      # Enable/disable individual DeepL languages — see below

    property_type_translation_properties:  # Sub-properties of complex types to translate
        link: ['title']
        teaser_selection: ['items/*/title', 'items/*/description']

    ingestion:
        chunker: markdown                  # "markdown" (default), "section", or a service ID
        chunker_options:
            word_limit: 200                # Target max words per chunk (markdown chunker)

    text_field_types: ['text_line', 'text_area']   # Plain-text property types processed by AI features
    html_field_types: ['text_editor']              # HTML property types processed by AI features

api_key and base_uri

api_key is required and comes from your project settings on the sulu.ai platform. base_uri only needs to be changed for non-production platform environments.

contact_email

When the platform refuses a request for account reasons — rejected credentials, exhausted credits or an inactive subscription — editors see a banner with a "Contact Admin" button that opens a mail to this address. None of these conditions can be resolved from within the CMS, so the address should belong to whoever can actually fix them: typically the person at the agency who manages the sulu.ai account and its configuration — not a generic support inbox and not the editors' own IT.

contact_email: 'ai-admin@my-agency.example'

The option is required — without an address the banners would tell editors to contact an administrator with no way to do so.

webhook

The webhook secret authenticates configuration updates pushed by the sulu.ai platform (see Operations → Webhook). Generate it with:

php bin/console sulu:ai:register-webhook

The secret is displayed only once — store it immediately.

image_loader

Controls how the bundle fetches image binaries (used by the Media Metadata Generator and media-aware experts).

authorization accepts three forms:

# Direct string
image_loader:
    authorization: 'Bearer %env(IMAGE_TOKEN)%'

# Basic auth
image_loader:
    authorization:
        type: 'basic_auth'
        value: '%env(IMAGE_AUTH)%'      # Format: username:password

# Bearer token
image_loader:
    authorization:
        type: 'bearer_token'
        value: '%env(IMAGE_TOKEN)%'

Typical per-environment setup with Symfony's when@ syntax:

when@dev:
    sulu_ai_platform:
        image_loader:
            allow_insecure_https: true   # *.wip domains, self-signed certificates

when@stage:
    sulu_ai_platform:
        image_loader:
            authorization:
                type: 'basic_auth'
                value: '%env(STAGING_IMAGE_AUTH)%'

locale_map

Maps Sulu locale codes to platform locale codes, with an optional description that gives the AI language context during generation (not used for translations):

locale_map:
    de_ch:
        locale: de
        description: "German for Switzerland (formal, no dialect)"
    de_at:
        locale: de
    en_us: en        # Short form without description

Unmapped locales are passed through unchanged.

intelligent_search and ingestion

See Intelligent Search → Configuration for the full explanation of these options.

translator

translator.languages is a fixed list of DeepL-supported language codes mapped to enabled/disabled. All languages are enabled by default; disable individual ones:

translator:
    languages:
        BG: false
        TR: false

Arbitrary language codes cannot be added — the list is validated against the supported set.

text_field_types, html_field_types, property_type_translation_properties

Control which Sulu property types the full content translation processes. Add custom property types here when your project defines its own text-like field types.