⚙️ Config v1.3.18
-
Added opt-in PII redaction for Agent chat messages
filters.messages.pii.actionnow acceptsredactin addition toblock(default) andauditredacttransforms only fresh, text-only interactive Agent chat submissions that carry aclientRequestId; edits, resumes, files, quotes, other endpoints, and other fields still use blocking checks- Requires a valid
CREDS_KEY: original text is stored as an encrypted, unindexed sidecar field, and changing the key makes existing originals unavailable maxCharacters(default65536) andmaxMatches(default256) bound each transformation session; custom patterns may setcategorytoemail,phone,name,credential, orcustom
-
Added an Agent tool approval "Always allow" option and per-mode approval controls
endpoints.agents.toolApproval.allowAlwaysoffers "Always allow" to stop prompting for a tool for the rest of a conversation; the default isfalseallowAlwaysMaxToolsandallowAlwaysMaxToolNameLengtheach accept integers from1through1024agentModesexposes Always ask, Always approve, Ask once per chat, and Ask once then always approve on Agent tool rows; the default isfalse, so opt in only after every replica is upgraded- Explicit administrator
askanddenyrules and hooks remain authoritative grantLookupTimeoutMsaccepts100through5000ms (example value3000)
-
Added deferred MCP OAuth sign-in
mcpServers.<name>.oauthPromptacceptson_start(default) oron_useon_usewaits for the agent's first call to one of the server's tools, but only when every tool the agent selected from it is deferred- Until a user signs in, tool search offers the tools listed in
oauthToolCatalog(each withname,description, andinputSchema); without a catalog the turn-start prompt is kept
-
Added MCP Apps controls
mcpSettings.appsrequires explicit opt-in for new MCP Apps; if omitted, legacy inline HTML stays enabled, andfalsedisables both MCP Apps and legacy inline HTMLmcpAppSandboxis a deployment-owned block that role, group, and user configuration cannot override; seturlto a dedicated origin routed to/api/mcp/sandbox- The sandbox defaults are
maxSourcesPerDirective: 32,maxSerializedLength: 4096,maxPersistedAppBytes: 1048576,maxAdmissionRequestsPerMinute: 240,maxActiveViews: 3per browser, andmaxActionPreviewChars: 16384 rateLimits.mcpApps.resourcesPerMinute(example120) andtoolCallsPerMinute(example60) set per-user fixed one-minute limits
-
Added chat pull request lookups
endpoints.agents.pullRequestsshows a conversation's pull request in the chat header and sidebar, and is on as soon as the server has a token and a repository scope; setenabled: falseto turn it offprovideracceptsgithub(default),gitlab, orbitbucket;hostselects GitHub Enterprise Server, a*.ghe.comtenant, or a self-managed GitLab hosttokenmust be an environment variable reference such as${GITHUB_PULL_REQUEST_TOKEN}, never the token itselfallowedRepositories(up to 256 entries,owner/name,owner/*, or nested GitLab group paths) limits which repositories the server's token is used for;allowAllRepositoriesisfalseby default because any user could otherwise point the token at any repository it can readoauthlets each user connect their own account, withclientIdandclientSecretas environment variable references,flowTimeoutMinutes(1through60),requestTimeoutSeconds(1through60), andretentionDays(1through3650)provider,host,oauth, andsharedCacheSlotsare read from the baselibrechat.yamlonly- Tuning keys and defaults:
cacheTtlSeconds30(5through3600),cacheMaxEntries500,cacheMaxCredentials256,maxConcurrentLookups4(1through16),batchTimeoutSeconds20,requestTimeoutSeconds10,lookupTimeoutSeconds30,maxCheckRunPages10,maxCandidatePullRequests10,maxCandidatePages1,maxHeadComparisons3(0through20) sharedCache(defaultfalse) shares results across replicas and takes effect only withUSE_REDIS;sharedCacheTimeoutMsdefaults to250andsharedCacheSlotsto65536(64through1000000)- Needs a code worker that reports its branch and
CODEAPI_BRIDGE_LANE_GIT=trueon the Code API
-
Added a
resetbalance refill mode and balance display optionsbalance.refillModeacceptsaddorreset;resetreplaces the allowance each period without rollover and requiresrefillIntervalValueto be a positive integer- Deploy reset-capable servers to every replica before selecting
reset balance.displayacceptscredits,currency(usesinterface.currency), orpercent(share of the allotment used)
-
Added ephemeral retention mode
interface.retentionModenow acceptsephemeral, which forces every chat to be temporary (always on, not user-toggleable) and applies expiry to all dataallapplies expiry to all data types while keeping chats visible in history;temporaryremains the default- Before switching from
allorephemeralback totemporary, remove retention deadlines from non-temporary data that should stop expiring langfuse.trace.temporaryChats(defaultfalse) must betruefor temporary chats, including every chat inephemeralmode, to be traced and for their feedback to be scored
-
Added account email change and passkey limits
emailChange.enabledandemailChange.tokenTTLSecondsconfigure changing the registered email in Settings > Account; omitted values fall back toALLOW_EMAIL_CHANGEand a 15-minute link (900)passkeys.perUserMaxcaps passkey enrollment per user; omitted, it falls back toMAX_PASSKEYS_PER_USER, then20rateLimits.emailChange(userMax: 3,userWindowInMinutes: 2) limits change requests per authenticated userrateLimits.emailChangeConfirm(ipMax: 20,ipWindowInMinutes: 2,userMax: 2,userWindowInMinutes: 2) bounds the unauthenticated verification link by source address and by account
-
Added bounded outbound call and password hashing settings
timeoutssets budgets in milliseconds:ragMs30000,ocrMs300000,actionsMs300000,moderationMs10000,imageFetchMs30000passwordHashing.maxWorkerssets the worker threads that hash passwords and auth tokens off the event loop; the default is one less than the CPU count, at most4speech.tts.maxInputCharslimits the text one request may synthesize (example20000); each 1,000 characters is a provider call
-
Added Chat Projects limits
projects.maxFilesdefaults to50(maximum500)projects.maxInstructionsLengthdefaults to16000characters (maximum200000)projects.maxDescriptionLengthdefaults to1000characters (maximum10000)
-
Added tool-call previews and credential write format
toolCallPreviews.enableddefaults totrue; the web client loads bounded previews of long tool outputs and arguments and loads a call in full when it is opened, while exports and share links get full contenttoolCallPreviews.outputCharsandargsCharsboth default to512credentials.writeFormatdefaults tov3(random IV per stored value); both formats are always read- During a rolling upgrade of a multi-replica deployment, set
legacyuntil every replica readsv3; a rollback to a release that predatesv3cannot read credentials saved in that format
-
Added browser telemetry and session replay flags
telemetry.rum.enabledandtelemetry.rum.sessionReplay.enabledare independent opt-ins; session replay records masked DOM and input- Collector URL, authentication, and service settings stay in
.env; YAML flags override.env, and omitting them preserves the environment settings
-
Expanded welcome screen, theme, and notification settings under
interfacelandingHeadingacceptsentity(default) orgreeting;landingFooterdefaults totruerunningChatRenamedefaults totrue; set it tofalseduring a rolling upgrade until every API replica is upgraded and old title-generation jobs have drainedthemeapplies a deployment theme to every user, either a bundled name (librechat,clickhouse) or an inline definition with RGB triplets keyed byrgb-*tokenartifactUndockingandmascotboth default totruehistoryCacheTtlMsdefaults to60000ms andhistoryCacheRecentto1replyNotificationsgates unseen-reply alerts:tabBadge,desktop, andsounddefault totrue;pollLimitdefaults to100(1through100),pollIntervalMsto30000(10000through600000), andfocusedRefreshMsto300000(60000through300000)
-
Expanded Agent run and stream controls
endpoints.agents.streamKeepaliveIntervalMsdefaults to25000ms;0disables it, and other values must be at least1000and at most3600000endpoints.agents.hostFileEditsbounds host-side skill and sandbox edits:maxEdits100,maxWorkBytes67108864,maxOccurrences100000,timeoutMs2000,maxConcurrent2per API process; over-budget calls write nothingendpoints.agents.subagentActivityconfigures live child activity:replayTtlMs300000,publicationTimeoutMs1000,retryAttempts3,retryBaseDelayMs100,recoveryDelayMs1000,memoryMaxStreams1000,memoryMaxBytes16777216backgroundTasks.completionReceiptBatchingdefaults totrue; set it tofalseduring a rolling upgrade while replicas without it still serve traffic
-
Expanded highly experimental stateful Code session controls
statefulCodeSessions.allowEnvironmentSelectiondefaults totrueand lets new chats choose from an agent's saved machine allowlist; setfalseto keep every agent on its fixed machinemaxEnvironmentChoicesdefaults to32with a supported ceiling of128environments[].configSchema.limits.defaultCommandTimeoutMssets the foreground Bash default (omit to keep30000)defaultReadFileLinessets the attachedread_filewindow (omit to keep200; range1through500)maxRequestTimeoutMssets an optional total HTTP budget per workspace tool call; enable it only after every replica recognizes the field, the Code API honorsX-LibreChat-Workspace-Queue-Wait-Ms, and a canary confirms the live proxy chain outlasts itminCommandAdmissionMsaccepts1000through300000(default reserve10000); a request budget of20000ms or less is rejected with the default reserve
-
Changed Agent capabilities and file-list defaults
- The
chaincapability is removed from the defaultendpoints.agents.capabilitieslist web_searchcontrols only LibreChat's external pipeline, not provider-native search; both requireWEB_SEARCH.USE, seeded byinterface.webSearchfileListLimitcaps rows returned whenGET /filesreceives an explicitlimitquery parameter (example100)fileConfig.clientImageResize.enablednow forces resizing on or off for everyone when set; omitted, each user decides and resizing is on by default
- The
-
Added ACL sharing lease limits
permissions.leaseTtlMsaccepts integers from1000through600000(example30000); on deployments without transactions, sharing updates hold a per-resource lease for this long between renewalspermissions.leaseWaitMsaccepts integers from0through60000(example3000) and sets how long an update waits for a contended lease before answering409
-
Added Langfuse text-prompt catalog synchronization
LANGFUSE_PROMPT_SYNC_AVAILABLEdefaults tofalse; administrators separately enable the stored Baselangfuse.promptSync.enabledsetting. Prompt access does not depend on trace enablement or sampling.LANGFUSE_PROMPT_SYNC_TIMEOUT_MSdefaults to10000per upstream request, clamped to1000–60000milliseconds.langfuse.promptSync.lockLeaseMsdefaults to300000(range60000–3600000) andmaxPagesto50(range1–1000, up to 100 prompts per page). Imports are append-only, read-only source pointers; incomplete page-capped runs restart from page 1.
-
Added profile endpoint re-derivation and admin catalog caching controls
CONFIG_REDERIVE_ENDPOINTSis off by default. Azure group, Anthropic Vertex AI, and Azure Assistants profile overrides remain stored but inert until enabled; inspect startup diagnostics first.- Vertex AI overrides can reference only environment names used by deployment YAML's own Vertex configuration, not the broader override allowlist.
- Deployment-only
endpoints.catalogModelsTtlMsdefaults to120000milliseconds (range0–3600000). Zero resolves on each read, but the separate provider model-list cache can still apply. - Admin config APIs expose scope metadata, catalog, environment-reference status, effective/resolved config, and applied/skipped write reports. Reload can return
503after local success when broadcast fails.
-
Added attachment copies for compatible attached workspaces
- Requester-owned chat uploads can be copied into
.librechat/attachmentswhen the worker supportsimport_fileandwrite_fileand file writes are not denied. endpoints.agents.workspaceAttachments.timeoutMsdefaults to10000(range1000–120000), withconcurrency: 3(range1–16). Unfinished copies are reported and retried next turn.
- Requester-owned chat uploads can be copied into
-
Updated the config version to
1.3.18 -
Tightened strict tenant authentication and migration context
- Under
TENANT_ISOLATION_STRICT=true, sign-in and account lookups reject missing or system tenant context before authentication. API failures useTENANT_CONTEXT_REQUIRED; OAuth uses its failure redirect. Preserve trusted tenant routing rather than relaxing isolation. - Deployment-wide startup checks and index work run in system scope, while resource migration writes retain each resource's tenant partition.
- Under
-
Migrated shared schemas to Zod 4
- Custom integrations composing exported schemas need compatible Zod 4 APIs. Omitted optional fields remain absent and record-key diagnostics are preserved; this library migration does not add another config version or require rewriting existing YAML.
-
Added explicit retained-file and vector-ownership cleanup boundaries
fileConfig.retainedFileCleanupdefaults tofalse; enable only after every replica and rollback target reads retained destinations.fileConfig.vectorOwnershipTrackingStartis an operator-chosen UTC cutoff after legacy writers and rollback targets are retired. Vector deletion needs complete recorded owners and insert-time proof at or after that cutoff; setting it does not repair old metadata.fileConfig.vectorDeletionConcurrencydefaults to4(integer1–16). Every recorded namespace and the unscoped namespace must be confirmed clean before removing the readable primary. Ambiguous records remain retained for verified reconciliation.