Skip to main content

Configuration file reference

All configuration files for uxopian-ai are placed in the ./config/ directory on the host, mounted to /app/config inside the container. The application imports them at startup via application.yaml. This page documents every configuration key in every file.

application.yml

Controls the base URL, server port, Spring profiles, and tool settings.

KeyEnv variableDefaultDescription
app.base-urlAPP_BASE_URL(empty)Public base URL for the application (used in generated links)
server.portUXOPIAN_AI_PORT8080HTTP port uxopian-ai listens on
server.servlet.context-pathCONTEXT_PATH(empty)Optional servlet context path prefix
tools.enabledTOOLS_ENABLEDtrueSet to false to disable all tool execution
plugins.root.pathPLUGINS_ROOT_PATHplugins/Directory scanned at startup for plugin JARs
plugins.tools.enabled-tagsPLUGINS_TOOLS_ENABLED_TAGSflowerdocs,filesComma-separated whitelist of @ToolService tag values registered at startup (see Plugin system). Empty list = all tools registered.
spring.profiles.activeSPRING_PROFILES_ACTIVE(empty)Active Spring profiles. Add dev to disable auth.

Example:

app:
base-url: ${APP_BASE_URL:}

server:
port: ${UXOPIAN_AI_PORT:8080}

tools:
enabled: ${TOOLS_ENABLED:true}

opensearch.yml

OpenSearch connection settings.

KeyEnv variableDefaultDescription
opensearch.hostOPENSEARCH_HOSTlocalhostOpenSearch host
opensearch.portOPENSEARCH_PORT9200OpenSearch port
opensearch.schemeOPENSEARCH_SCHEMEhttpConnection scheme (http or https)
opensearch.usernameOPENSEARCH_USERNAME(empty)Username for authenticated OpenSearch
opensearch.passwordOPENSEARCH_PASSWORD(empty)Password for authenticated OpenSearch
opensearch.force-refresh-indexOPENSEARCH_FORCE_REFRESH_INDEXfalseForce index refresh after each write (slow; for testing only)
opensearch.index-prefixOPENSEARCH_INDEX_PREFIXuxopian-aiPrefix used in index names: {tenant}-{prefix}-{base}

Example:

opensearch:
host: ${OPENSEARCH_HOST:localhost}
port: ${OPENSEARCH_PORT:9200}
scheme: ${OPENSEARCH_SCHEME:http}
username: ${OPENSEARCH_USERNAME:}
password: ${OPENSEARCH_PASSWORD:}
force-refresh-index: ${OPENSEARCH_FORCE_REFRESH_INDEX:false}

llm-clients-config.yml

LLM provider configurations, default provider/model, and context size.

Default LLM settings

KeyEnv variableDefaultDescription
llm.default.providerLLM_DEFAULT_PROVIDERopenaiDefault LLM provider identifier
llm.default.modelLLM_DEFAULT_MODELgpt-5.1Default model name
llm.default.base-promptLLM_DEFAULT_PROMPTbasePromptDefault base prompt ID
llm.contextLLM_CONTEXT_SIZE10Number of previous requests included in each LLM call
llm.debug.enabledLLM_DEBUGfalseEnable verbose LLM request/response logging

Provider configuration structure

llm:
provider:
globals:
- provider: <provider-id>
defaultLlmModelConfName: <model-conf-name>
globalConf:
apiSecret: <api-key>
endpointUrl: <provider-url>
temperature: <float>
timeout: <duration>
maxRetries: <int>
extras:
<provider-specific-key>: <value>
llModelConfs:
- llmModelConfName: <name>
modelName: <actual-model-name>
multiModalSupported: <bool>
functionCallSupported: <bool>

Supported provider identifiers

openai, anthropic, azure-openai, bedrock, gemini, mistral-ai, huggingface, ollama, nu-extract

Provider-specific extras

ProviderExtra keysDescription
bedrockAwsRegion, AwsAccessKey, AwsSessionTokenAWS credentials and region
nu-extractmodelIdModel ID override (defaults to modelName if absent)

Azure OpenAI (azure-openai) does not use extras. The modelName field is passed as the deployment name.

Tenant overrides

llm:
provider:
tenants:
- tenantId: <tenant-id>
mergeStrategy: MERGE # MERGE | OVERWRITE | CREATE_IF_MISSING
providers:
- provider: <provider-id>
globalConf:
apiSecret: <tenant-specific-key>

prompts.yml

Prompt template definitions.

KeyDescription
prompts.backup.pathDirectory for prompt backups. Env: PROMPTS_BACKUP_PATH. Default: ./prompts/
prompts.globalsList of global prompt definitions (see structure below)
prompts.tenantsList of per-tenant prompt overrides

Prompt definition structure

- id: <unique-id>
role: SYSTEM | USER | ASSISTANT
content: |
Thymeleaf template content...
[[${variable}]]
requiresMultiModalModel: false
requiresFunctionCallingModel: false
reasoningDisabled: false
defaultLlmProvider: "" # optional: override provider for this prompt
defaultLlmModel: "" # optional: override model for this prompt

Tenant override structure

prompts:
tenants:
- tenantId: <tenant-id>
mergeStrategy: merge | replace
prompts:
- id: <prompt-id>
role: USER
content: |
Override content...

goals.yml

Goal group definitions.

KeyDescription
goals.backup.pathDirectory for goal backups. Env: GOALS_BACKUP_PATH. Default: ./goals/
goals.globalsList of global goal groups
goals.tenantsList of per-tenant goal group overrides

Goal group structure

goals:
globals:
- id: <group-id>
goals:
- promptId: <prompt-id>
filter: "true" # Thymeleaf boolean expression
index: 1 # Execution order (ascending)

Tenant override structure

goals:
tenants:
- tenantId: <tenant-id>
mergeStrategy: merge | replace
goalGroups:
- id: <group-id>
goals:
- promptId: <prompt-id>
filter: "[[${documentType == 'contract'}]]"
index: 10

metrics.yml

Micrometer metrics and actuator configuration.

KeyDescription
management.elastic.metrics.export.enabledEnable/disable OpenSearch metrics export (default: true)
management.elastic.metrics.export.hostOpenSearch URL for metrics. Default reads from opensearch.* properties.
management.elastic.metrics.export.indexIndex name for metrics (default: micrometer-metrics)
management.elastic.metrics.export.auto-create-indexAuto-create metrics index (default: true)
management.endpoints.web.exposure.includeExposed actuator endpoints. Default: health,info,loggers
management.metrics.uxopian-ai.enableEnable custom uxopian-ai metrics (default: true)
management.metrics.enable.*Standard metric groups disabled by default: application, tomcat, logback, jvm, system, http, process, disk, executor

hazelcast.yml

Hazelcast cluster configuration. Used by the gateway for session caching.

KeyEnv variableDefaultDescription
hazelcast.cluster-nameuxopian-ai-clusterHazelcast cluster name
hazelcast.kubernetes.enabledHAZELCAST_KUBERNETES_ENABLEDfalseEnable Kubernetes service discovery
hazelcast.kubernetes.service-dnsHAZELCAST_KUBERNETES_SERVICE_DNSai-standalone-headlessKubernetes headless service DNS name
hazelcast.kubernetes.namespaceHAZELCAST_KUBERNETES_NAMESPACEdefaultKubernetes namespace for discovery

alfresco

Configuration for the Alfresco plugin (loaded only when plugins.tools.enabled-tags contains alfresco).

KeyEnv variableDefaultDescription
alfresco.base-urlALFRESCO_BASE_URL(empty)Alfresco REST API v1 base URL. Required when the plugin is enabled.
alfresco.legacy-base-urlALFRESCO_LEGACY_BASE_URL(auto-derived)Base URL for Alfresco legacy Web Script endpoints (/alfresco/s/…). Auto-derived from base-url when not set: if base-url contains /alfresco-api, it is replaced with /alfresco; if base-url ends with /api, the suffix becomes /s; otherwise /s is appended. Override only if the auto-derivation does not match your deployment layout.
alfresco.cmm-enabledALFRESCO_CMM_ENABLEDfalseEnable Alfresco Custom Content Model lookup. When disabled, the LLM sees only the fallback cm:* system properties.
alfresco.common-system-propertiescm:name, cm:title, cm:description, cm:created, cm:modified, cm:creator, cm:modifierList of system properties (name, label, description, indexable, allowed values) surfaced to the LLM when CMM is disabled. Override if your tenant uses a different default schema.

Example:

alfresco:
base-url: ${ALFRESCO_BASE_URL:}
# legacy-base-url is auto-derived from base-url — set only if the derivation is wrong
# legacy-base-url: ${ALFRESCO_LEGACY_BASE_URL:}
cmm-enabled: ${ALFRESCO_CMM_ENABLED:false}
# common-system-properties: (defaults shipped with the plugin)

See Integrate with Alfresco for deployment steps.

mcp-server.yml

MCP (Model Context Protocol) boot-time configuration. Starting with 2026.0.0-ft3, MCP connections are typically managed through the admin UI (Managing MCP servers) rather than this file; the shipped mcp-server.yml is commented out.

# mcp:
# client:
# name: uxopian-ai-mcp-server
# log-requests: true
# sse:
# url: ${MCP_SSE_URL:http://localhost:8081/uxopian/ai/sse}
KeyEnv variableDescription
mcp.sse.urlMCP_SSE_URLLegacy boot-time MCP SSE endpoint URL. Prefer the admin UI for runtime management.
mcp.client.nameMCP client name presented to the server.

gateway-application.yaml

Gateway (uxopian-gateway) configuration.

KeyDescription
server.portGateway listening port (default: 8085)
app.gateway.provider-headerHeader carrying the provider ID for multi-provider setups
app.routes[].idRoute identifier (used in logs)
app.routes[].uriBackend service URI (e.g., http://uxopian-ai:8080)
app.routes[].pathAnt path pattern — incoming requests must match this to activate the route
app.routes[].prefixBase prefix prepended to all security rule paths for matching against incoming requests
app.routes[].rewritePathComma-separated regex, replacement — rewrites the request path before forwarding to the backend. Uses Java named capture groups ((?<name>...)), referenced as $\{name} in the replacement.
app.routes[].providerAuthProvider bean name (e.g., DevProvider, FlowerDocsProvider, Fast2Provider)
app.routes[].security[].pathPath pattern for security rule (relative — combined with prefix at startup)
app.routes[].security[].publicIf true, no authentication required for this path
app.routes[].security[].rolesList of required roles for this path

YAML anchors (&ANCHOR / *alias) can be used to share URI and security rule definitions across multiple routes. Define anchors at the root level (before app:).

See Configure gateway routes for a step-by-step guide to deriving path, prefix, and rewritePath values, debug logging instructions, and a full FlowerDocs example.