Configuration is done via YAML configuration files (primary) with optional environment variable overrides.
Each service reads a config.yaml mounted into the container. Environment variables can override any YAML setting using a service-specific prefix and __ (double underscore) as the nested delimiter.
| Service | YAML file (in stack/) |
Env Prefix |
|---|---|---|
| core-service | core.config.yaml |
MUCGPT_CORE_ |
| assistant-service | assistant.config.yaml |
MUCGPT_ASSISTANT_ |
| assistant-migrations | assistant.config.yaml |
MUCGPT_ASSISTANT_ |
cd stack
cp .env.example .env
cp core.config.yaml.example core.config.yaml
cp assistant.config.yaml.example assistant.config.yaml
Configure your LLM models in core.config.yaml:
MODELS:
- type: "OPENAI"
llm_name: "<your-llm-name>"
endpoint: "<your-endpoint>"
api_key: "<your-sk>"
model_info:
auto_enrich_from_model_info_endpoint: true
max_output_tokens: 16384
max_input_tokens: 128000
description: "<description>"
input_cost_per_token: 0.00000009
output_cost_per_token: 0.00000036
supports_function_calling: true
supports_reasoning: false
supports_vision: true
litellm_provider: "<provider>"
inference_location: "<region>"
knowledge_cut_off: "2024-07-01"
See mucgpt-core-service/config.yaml.example and mucgpt-assistant-service/config.yaml.example for complete examples.
See the AI governance and compliance checks guide for the end-to-end screening flow, version lifecycle, review queue, and operational responsibilities.
The optional PROMPTS section maps prompt names used by the core service to prompts stored in langfuse. Configure each prompt under its Langfuse folder with the label to use; folder and prompt names must match Langfuse exactly. See mucgpt-core-service/config.yaml.example for the complete YAML structure.
defaults/default_instructions: general system instructions for regular chat.generation_prompts/chat_title: generates concise chat titles.generation_prompts/assistant_name: generates assistant names from prompt seeds.generation_prompts/assistant_description: generates assistant descriptions from prompt seeds.generation_prompts/assistant_systemprompt: generates assistant system prompts from prompt seeds.compliance_prompts/*: screens assistant prompts for high-risk use cases (eu-ai-act) in migration/asylum/border control, public services, employment, and education.The core service supports extracting text and structure from uploaded documents using an optional parser. Configure the document parser in core.config.yaml. By default, document parsing is disabled (PARSER_BACKEND: "none").
Currently, Xberg is the only supported parser backend. To enable it, set the parser backend to "xberg" and configure the URL and timeout:
PARSER_BACKEND: "xberg" # Default is "none"
XBERG_URL: "http://xberg-full:8000"
XBERG_TIMEOUT: 120.0
Where:
PARSER_BACKEND: Defines the parser used (none to disable, or xberg).XBERG_URL: Points to your Xberg parsing service.XBERG_TIMEOUT: Execution timeout in seconds.MUCGPT offers browser-based speech-to-text (beta): users can dictate into the chat input, and the audio is transcribed entirely inside their browser. The backend only gates the feature — no audio ever leaves the user’s browser; the resulting transcript is placed in the chat input and can be submitted through the normal chat request. It is disabled by default (TRANSCRIPTION_ENABLED: false).
To enable it, set the flag in core.config.yaml:
TRANSCRIPTION_ENABLED: true # Default is false
Or via environment variable: MUCGPT_CORE_TRANSCRIPTION_ENABLED=true
Optionally, preselect a default model for first-time users:
TRANSCRIPTION_DEFAULT_MODEL: "onnx-community/whisper-small" # Default is null (frontend built-in default)
The id must match an entry of the frontend’s model list (mucgpt-frontend/src/config/transcriptionModels.ts); unknown ids are ignored. The choice applies once — as soon as a user picks a model themselves, it is stored in their browser and later changes to the default do not affect them.
Notes for operators:
mucgpt-frontend/src/config/transcriptionModels.ts); the backend cannot define the model inventory or runtime, but it can preselect the default model ID through TRANSCRIPTION_DEFAULT_MODEL (applied on first use before the user picks a model).Alternatively, models can be configured via the MUCGPT_CORE_MODELS environment variable as a JSON array:
MUCGPT_CORE_MODELS='[
{
"type": "OPENAI",
"llm_name": "<your-llm-name>",
"endpoint": "<your-endpoint>",
"api_key": "<your-sk>",
"model_info": {
"auto_enrich_from_model_info_endpoint": true,
"max_output_tokens": "<number>",
"max_input_tokens": "<number>",
"description": "<description>"
}
}
]'
Settings are loaded in this order (highest priority wins):
init_settingsMUCGPT_CORE_* / MUCGPT_ASSISTANT_*, using __ for nested sectionsconfig.yaml mounted into each container.env file – lowest priority; values here will not override anything set in config.yaml or environment variablesThis means environment variables always override YAML values, which is useful for injecting secrets in CI/CD.
MUCGPT stores data in two layers:
mcp_tools_raw:)mucgpt:directory-tree:v1)mucgpt:assistant-compliance:v1:)Notes:
MCP.CACHE_TTL (default: 12h)LDAP.CACHE_TTL (default: 14d)COMPLIANCE_CACHE_TTL_SECONDS (default: 30m)In addition to backend storage, the frontend uses browser storage for UX state and local history:
MUCGPT-ASSISTANTS (assistant data)MUCGPT-CHAT (chat data)MUCGPT-COMMUNITY-ASSISTANTS (community assistant data)MUCGPT_PARSED_DOCUMENTS_V1)SETTINGS_TRANSCRIPTION_*)mucgpt-nemo-models-v1)XSRF-TOKEN is read by the frontend and sent as X-XSRF-TOKEN request headerNote: Browser storage is client-local and can be cleared by the user/browser.
Any YAML setting can be overridden. Nested sections use __ (double underscore):
# Top-level field
MUCGPT_CORE_VERSION=1.0.0 # → VERSION: "1.0.0"
MUCGPT_CORE_AI_ACT_COMPLIANCE_CHECK_ENABLED=false # → AI_ACT_COMPLIANCE_CHECK_ENABLED: false
# Nested field (DB section in assistant service)
MUCGPT_ASSISTANT_DB__HOST=postgres # → DB: { HOST: "postgres" }
MUCGPT_ASSISTANT_DB__PASSWORD=secret # → DB: { PASSWORD: "secret" }
# Nested field (Redis section in core service)
MUCGPT_CORE_REDIS__HOST=valkey # → REDIS: { HOST: "valkey" }
# Nested field (Langfuse section)
MUCGPT_CORE_LANGFUSE__SECRET_KEY=sk-... # → LANGFUSE: { SECRET_KEY: "sk-..." }
Top-level fields:
type: The provider type (e.g., OPENAI).llm_name: The name or identifier of your LLM model.endpoint: The API endpoint URL for the model.api_key: The API key or secret for authentication.model_info fields:
auto_enrich_from_model_info_endpoint: If true (default), missing metadata is fetched from <endpoint>/model/info (as it is available in litellm). Set to false to require manual values.max_output_tokens: Maximum number of tokens the model can generate in a response.max_input_tokens: Maximum number of tokens accepted as input.description: A human-readable description of the model.knowledge_cut_off: Optional ISO date string describing the model’s latest training data cutoff.input_cost_per_token / output_cost_per_token: Optional pricing hints per token.supports_function_calling, supports_reasoning, supports_vision: Capability flags advertised to the UI.litellm_provider: Provider identifier reported by LiteLLM.inference_location: Region or deployment location for the model.creativity_{low,medium,high}_temperature: Map abstract creativity levels to specific temperature values (0.0 - 1.0 or higher depending on model). Defaults are low=0.0, medium=0.5, high=1.0.Replace the placeholder values with your actual model configuration.
Assistants can be published to specific departments. MUCGPT reads the organization’s department tree from the configured LDAP directory, so published assistants are scoped according to that hierarchy. Configure LDAP in assistant.config.yaml under the LDAP section:
LDAP:
ENABLED: true
HOST: "ldaps://ldap.example.de"
PORT: 636
USE_SSL: true
START_TLS: false
VERIFY_SSL: true
CA_CERT_FILE: "/path/to/ca-bundle.pem"
BIND_DN: "cn=mucgpt,ou=Service Accounts,o=Example Org,c=de"
BIND_PASSWORD: "<secret>"
SEARCH_BASE: "o=Example Org,c=de"
SEARCH_FILTER: "(objectClass=organizationalUnit)"
DISPLAY_ATTRIBUTE: "ou"
PARENT_ATTRIBUTE: "lhmParentOu" # optional
ADDITIONAL_ATTRIBUTES: ["lhmOULongname", "lhmOUShortname"]
REQUIRED_ATTRIBUTES: ["lhmOULongname", "lhmOUShortname"]
IGNORED_OU_PREFIXES: ["_"]
IGNORED_OU_SUFFIXES: ["-xxx"]
IGNORED_OU_SHORTNAME_EXCEPTIONS: ["FBM", "KVR-IT"]
PAGE_SIZE: 500
CONNECT_TIMEOUT: 5.0
READ_TIMEOUT: 10.0
Individual fields can be overridden via environment variables using the MUCGPT_ASSISTANT_LDAP__ prefix:
MUCGPT_ASSISTANT_LDAP__ENABLED=true
MUCGPT_ASSISTANT_LDAP__BIND_PASSWORD=<secret>
MUCGPT_ASSISTANT_LDAP__IGNORED_OU_SHORTNAME_EXCEPTIONS=["FBM","KVR-IT"]
SEARCH_BASE defines the root of the organization tree.USE_SSL / START_TLS / VERIFY_SSL depending on your directory security requirements; set CA_CERT_FILE if your LDAP server uses a custom CA.DISPLAY_ATTRIBUTE (default ou) controls the label shown for each organizational unit; PARENT_ATTRIBUTE can be set if your LDAP schema exposes a parent reference.ADDITIONAL_ATTRIBUTES fetches extra attributes for display; REQUIRED_ATTRIBUTES are enforced and default to lhmOULongname and lhmOUShortname.IGNORED_OU_PREFIXES / _SUFFIXES let you skip placeholder OUs (by default everything starting with _ or ending with -xxx).IGNORED_OU_SHORTNAME_EXCEPTIONS allows specific OUs to bypass ignore rules when their lhmOUShortname matches one of the listed values (case-insensitive)._Hidden by adding its shortname (for example FBM) to IGNORED_OU_SHORTNAME_EXCEPTIONS.PAGE_SIZE (default 500), CONNECT_TIMEOUT (default 5s), and READ_TIMEOUT (default 10s).Authentication is performed in front of the services via the refarch API Gateway. MUCGPT only accepts access tokens that contain a specific role and forwards the department claim for authorization checks.
The SSO role is configured in each service’s config.yaml under the SSO section:
SSO:
ROLE: "lhm-ab-mucgpt-user"
Or via environment variable:
# Core service
MUCGPT_CORE_SSO__ROLE=lhm-ab-mucgpt-user
# Assistant service
MUCGPT_ASSISTANT_SSO__ROLE=lhm-ab-mucgpt-user
lhm-ab-mucgpt-user.department claim, which is combined with the LDAP organization tree to scope assistant publishing and access.Besides static tools, MUCGPT allows configuration of MCP sources, for which tools are fetched and can be called.
Configure MCP in core.config.yaml under the MCP section:
MCP:
SOURCES:
"<source_id>":
url: "http://mcpdoc-server:8088/sse"
forward_token: true
transport: "sse"
CACHE_TTL: 43200 # seconds, default: 12h
Or via environment variable:
MUCGPT_CORE_MCP__SOURCES='{"<source_id>": {"url": "...", "forward_token": true, "transport": "sse"}}'
MUCGPT_CORE_MCP__CACHE_TTL=43200
SOURCES: Map of MCP source configurations.
<source_id>: Unique id of one MCP source.
url: URL of the MCP endpoint.forward_token: If the OAuth 2.0 JWT token used for authentication should be forwarded to the MCP endpoint.transport: Transport protocol ("sse" or "streamable_http"), see https://modelcontextprotocol.io/specification/2025-06-18/basic/transportsCACHE_TTL: Time-to-live of cached MCP tools in seconds (default: 12h).See the stack README for complete Docker Compose setup instructions, including: