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.