Repository navigation
Expand file tree
/
Copy pathlibrechat.example.yaml
More file actions
1687 lines (1615 loc) · 89.4 KB
/
Copy pathlibrechat.example.yaml
File metadata and controls
1687 lines (1615 loc) · 89.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# For more information, see the Configuration Guide:
# https://www.librechat.ai/docs/configuration/librechat_yaml
# Configuration version (required)
version: 1.3.17
# Cache settings: Set to true to enable caching
cache: true
# Chat Projects: the ceilings a single project may reach. Every field is optional and
# defaults to the value shown, which is the behavior when the block is absent.
projects:
# Reference files that may be attached to one project (maximum 500).
maxFiles: 50
# Characters of project instructions stored and sent as guidance (maximum 200000).
maxInstructionsLength: 16000
# Characters of the project description shown in the workspace and sidebar (maximum 10000).
maxDescriptionLength: 1000
# Tool-call previews: a long conversation's tool outputs, arguments and subagent transcripts
# can run to megabytes, though their cards render collapsed. The web client asks for bounded
# previews when it loads a conversation (the start and end of each long output, arguments
# with their long strings shortened, no subagent transcripts) and loads a call in full when
# the reader opens it. Clients that do not ask, exports and share links get full content.
# Every field is optional and defaults to the value shown; enabled: false always sends the
# full payload.
# toolCallPreviews:
# enabled: true
# outputChars: 512 # characters of each output kept, half from the start and half from the end
# argsChars: 512 # characters of serialized arguments kept; JSON stays valid JSON
# Langfuse connections are managed through Settings > Langfuse when available.
# That flow verifies the credentials and stores the secret key encrypted; do not
# place a plaintext langfuse.secretKey in this file. Environment-managed central
# credentials and optional fanout routing are documented in .env.example.
#
# Self-hosted Langfuse behind an authenticating proxy or gateway can be given
# custom request headers. They are sent on every outbound Langfuse request —
# trace and media export, feedback scores, and credential verification.
# Values support ${ENV_VAR} interpolation; a header whose variable is unset is
# dropped with a warning rather than sent as a literal placeholder.
#
# These are deployment-level: trace export batches spans from every user through
# a single exporter, so unlike endpoints.custom headers they cannot carry
# per-user placeholders such as {{LIBRECHAT_USER_ID}}.
#
# Values are masked in admin config reads and in the startup config log, but
# prefer ${ENV_VAR} references over literal credentials here regardless.
#
# Scope: these are sent only when the deployment configures exactly ONE Langfuse
# origin (a self-hosted base URL, or a single tenant destination URL), and only
# to that origin. The map has no way to say which endpoint it authenticates to,
# so a deployment configuring several origins — e.g. a fanout collector plus a
# separate central host — gets a warning and no headers, rather than having a
# gateway credential sent somewhere it was not meant for.
#
# Fanout deployments additionally need collector support: the gateway forwards
# only Authorization upstream, so a tenant Langfuse behind its own proxy is not
# covered even when the collector receives these.
#
# Traces carry the internal user id as the Langfuse userId and no user or
# request metadata unless langfuse.trace opts in. userIdField picks the user
# field that becomes the trace userId (id, email, username, name, openidId,
# samlId, ldapId, googleId, githubId, discordId, appleId, facebookId); a user
# without a value for that field keeps the internal id. The two allowlists copy
# fields into trace metadata as librechat.user.<field> (the userId fields plus
# role and provider) and librechat.conversation.id, librechat.endpoint,
# librechat.endpoint.type, librechat.provider, librechat.model,
# librechat.model.label, librechat.spec.
#
# langfuse:
# headers:
# CF-Access-Client-Id: "${CF_ACCESS_CLIENT_ID}"
# CF-Access-Client-Secret: "${CF_ACCESS_CLIENT_SECRET}"
# trace:
# userIdField: email
# userMetadataFields: [email, username, role, provider]
# conversationMetadataFields: [conversationId, endpoint, model, modelLabel, spec]
# File storage configuration
# Single strategy for all file types (legacy format, still supported)
# fileStrategy: "s3"
# Maximum rows returned when GET /files receives an explicit `limit` query parameter.
# fileListLimit: 100
# Granular file storage strategies (new format - recommended)
# Allows different storage strategies for different file types
# fileStrategy:
# avatar: "s3" # Storage for user/agent avatar images
# image: "firebase" # Storage for uploaded images in chats
# document: "local" # Storage for document uploads (PDFs, text files, etc.)
# Available strategies: "local", "s3", "firebase", "azure_blob", "cloudfront"
# If not specified, defaults to "local" for all file types
# You can mix and match strategies based on your needs:
# - Use S3 for avatars for fast global access
# - Use Firebase for images with automatic optimization
# - Use local storage for documents for privacy/compliance
# - Use CloudFront for CDN-accelerated delivery (requires S3 + cloudfront config below)
# CloudFront CDN Configuration (optional)
# Use when fileStrategy: "cloudfront" or fileStrategies includes cloudfront
# Requires: AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_BUCKET_NAME
# For signed cookies and direct download URLs: CLOUDFRONT_KEY_PAIR_ID, CLOUDFRONT_PRIVATE_KEY
# cloudfront:
# domain: "https://cdn.example.com" # CloudFront domain (CNAME recommended for cookies)
# distributionId: "E1234ABCD" # Required if invalidateOnDelete is true
# invalidateOnDelete: false # Create cache invalidation on file delete
# imageSigning: "none" # "none" (public) | "cookies" (signed cookies)
# # When imageSigning: "cookies", API + CloudFront must share a parent domain.
# # Cookies are path-scoped to inline assets only:
# # /i/... private uploaded/generated images, user-scoped
# # /a/... tenant-visible avatars, tenant-scoped when tenantId is present
# # Downloads, documents, uploads, and code outputs stay outside /i and /a and
# # use backend-authorized signed URLs instead of signed cookies.
# # API: api.example.com, CloudFront CNAME: cdn.example.com, cookieDomain: ".example.com"
# cookieDomain: ".example.com" # Required for "cookies" - shared parent domain
# cookieExpiry: 1800 # Cookie lifetime in seconds (max: 604800 / 7 days, default: 1800 / 30 min)
# urlExpiry: 3600 # Signed CloudFront download URL lifetime in seconds
# # Optional multi-region S3/CloudFront layout. Default: false.
# # When enabled, new object keys include:
# # /i/r/{storageRegion}/t/{tenantId}/images/{userId}/{file} (private inline images)
# # /a/r/{storageRegion}/t/{tenantId}/avatars/{userId}/{file} (tenant-visible avatars)
# # /r/{storageRegion}/t/{tenantId}/{basePath}/{userId}/{file} (non-inline files)
# # storageRegion defaults to AWS_REGION when omitted, but only affects new keys
# # when includeRegionInPath is true. Existing files are not moved automatically.
# # LibreChat does not configure CloudFront origins, Route53, or regional routing.
# storageRegion: "us-east-2"
# includeRegionInPath: false
# # Direct-download filename/content-type overrides require the CloudFront cache/origin
# # request policy to forward and cache on response-content-disposition and
# # response-content-type query strings to S3.
# # Recommended for download paths: attach a CloudFront response headers policy
# # with X-Content-Type-Options: nosniff and CSP default-src 'none'.
# Skill sync configuration (optional)
# GitHub tokens are referenced from environment variables. Put the token in
# `.env`, then reference it here with `token: '${GITHUB_SKILLS_TOKEN}'`. Use a
# GitHub fine-grained personal access token scoped to the selected repository
# with read-only Contents and Metadata permissions.
# skillSync:
# github:
# enabled: false
# intervalMinutes: 60
# runOnStartup: true
# sources:
# - id: librechat-skills
# owner: your-org
# repo: your-skills-repo
# ref: main
# paths:
# - skills
# # Number of directory levels below each configured path to scan for
# # `SKILL.md`. Use 2 for repos shaped like `skills/<category>/<skill>`.
# skillDiscoveryDepth: 2
# token: '${GITHUB_SKILLS_TOKEN}'
# # Optional. Owns the mirrored skills under the given tenant so they are
# # created and shared within that tenant. Required for visibility when
# # tenant isolation is enabled. Omit for single-tenant deployments.
# # Treat as immutable per source id: changing (or adding/removing) the
# # tenantId later leaves previously mirrored skills in the old tenant,
# # where this source's sync can no longer see or clean them up. To move a
# # source between tenants, delete its mirrored skills in the old tenant
# # first, or use a new source id for the new tenant.
# # tenantId: your-tenant-id
# Custom interface configuration
interface:
customWelcome: 'Welcome to LibreChat! Enjoy your experience.'
# Allow renaming a running chat or one with a placeholder title (default: true).
# Set to false during a rolling upgrade, until ALL API replicas are upgraded and old
# title-generation jobs have drained. While false, rename is disabled for running chats
# and unowned placeholder titles; other actions stay available.
# runningChatRename: true
# Minimum interval between syntax-highlighting passes while streamed code changes (default: 300 ms)
# codeHighlightThrottleMs: 300
# How long a conversation's message history stays cached in the browser after leaving it (default: 60000 ms),
# and how many of the most recently left conversations keep that grace (default: 1). Older ones are refetched.
# historyCacheTtlMs: 60000
# historyCacheRecent: 1
# Deployment theme applied to every user, in both light and dark mode (default: unset).
# It is not saved to the browser, outranks REACT_APP_THEME_* colors and stored themes,
# and yields to the high-contrast modes. Either a bundled theme name (librechat, clickhouse):
# theme: clickhouse
# or an inline definition. Colors are space-separated RGB triplets keyed by rgb-* token:
# theme:
# version: 1
# name: acme
# modes:
# light:
# colors:
# rgb-surface-primary: '255 255 255'
# rgb-surface-submit: '21 21 21'
# appearance:
# controlRadius: '0.25rem'
# dark:
# colors:
# rgb-surface-primary: '31 31 28'
# rgb-surface-submit: '250 255 105'
# Enable/disable file search as a chatarea selection (default: true)
# Note: This setting does not disable the Agents File Search Capability.
# To disable the Agents Capability, see the Agents Endpoint configuration instead.
fileSearch: true
# Privacy policy settings
privacyPolicy:
externalUrl: 'https://librechat.ai/privacy-policy'
openNewTab: true
# Terms of service
termsOfService:
externalUrl: 'https://librechat.ai/tos'
openNewTab: true
modalAcceptance: true
modalTitle: 'Terms of Service for LibreChat'
modalContent: |
# Terms and Conditions for LibreChat
*Effective Date: February 18, 2024*
Welcome to LibreChat, the informational website for the open-source AI chat platform, available at https://librechat.ai. These Terms of Service ("Terms") govern your use of our website and the services we offer. By accessing or using the Website, you agree to be bound by these Terms and our Privacy Policy, accessible at https://librechat.ai//privacy.
## 1. Ownership
Upon purchasing a package from LibreChat, you are granted the right to download and use the code for accessing an admin panel for LibreChat. While you own the downloaded code, you are expressly prohibited from reselling, redistributing, or otherwise transferring the code to third parties without explicit permission from LibreChat.
## 2. User Data
We collect personal data, such as your name, email address, and payment information, as described in our Privacy Policy. This information is collected to provide and improve our services, process transactions, and communicate with you.
## 3. Non-Personal Data Collection
The Website uses cookies to enhance user experience, analyze site usage, and facilitate certain functionalities. By using the Website, you consent to the use of cookies in accordance with our Privacy Policy.
## 4. Use of the Website
You agree to use the Website only for lawful purposes and in a manner that does not infringe the rights of, restrict, or inhibit anyone else's use and enjoyment of the Website. Prohibited behavior includes harassing or causing distress or inconvenience to any person, transmitting obscene or offensive content, or disrupting the normal flow of dialogue within the Website.
## 5. Governing Law
These Terms shall be governed by and construed in accordance with the laws of the United States, without giving effect to any principles of conflicts of law.
## 6. Changes to the Terms
We reserve the right to modify these Terms at any time. We will notify users of any changes by email. Your continued use of the Website after such changes have been notified will constitute your consent to such changes.
## 7. Contact Information
If you have any questions about these Terms, please contact us at contact@librechat.ai.
By using the Website, you acknowledge that you have read these Terms of Service and agree to be bound by them.
modelSelect: true
parameters: true
presets: true
prompts:
use: true
create: true
share: false
public: false
bookmarks: true
multiConvo: true
# Allow the artifacts pane to be moved into its own browser window
# (desktop only; the mobile sheet is unaffected). Default: true.
artifactUndocking: true
agents:
use: true
create: true
share: false
public: false
# Scheduled chats are experimental and disabled unless explicitly enabled.
# A deployment with Redis-backed resumable streams can run this on every replica.
# A single-process deployment without Redis must also set
# `SCHEDULES_SINGLE_PROCESS=true`; unsafe multi-replica writes fail closed.
# Scheduled agents that can pause require both `USE_REDIS_STREAMS=true` for
# shared action state and a durable shared checkpointer for graph continuation.
# MongoDB is currently the built-in durable checkpointer (and the default).
# schedules:
# use: true
# create: true
# maxPerUser: 10
# minIntervalMinutes: 60
# autoDisableAfterFailures: 5
# # Maximum occurrences concurrently passing readiness admission per replica (1-100).
# admissionConcurrency: 20
# fireConcurrency: 5
# # Maximum MCP readiness connections opened at once by one schedule admission (1-10).
# mcpPreflightConcurrency: 3
# # Maximum wall-clock time for one MCP readiness admission (1000-600000 ms).
# mcpPreflightTimeoutMs: 300000
# # Require every schedule to be filed under a chat project. Enforced on
# # create/update AND at each fire, so turning it on stops (auto-disables)
# # schedules that predate it rather than letting their runs land loose.
# requireProject: false
# # Pin every scheduled run to ONE chat project, ignoring the user's choice.
# # Implies `requireProject`. Chat projects are user-owned, so a value set here
# # only makes sense as a per-user or per-role config override.
# # projectId: '000000000000000000000000'
peoplePicker:
users: true
groups: true
roles: true
marketplace:
use: false
fileCitations: true
# Show the thumbs up/thumbs down feedback buttons on responses (default: true)
feedback: true
# Unseen-reply alerts: what this deployment lets a reader turn on. Each field gates a
# capability; the preference itself stays per device, because notification permission and
# audio output belong to the machine the reader is sitting at. Sidebar unread dots and
# Mark as unread are not gated here, they are part of the conversation list.
# replyNotifications:
# tabBadge: true # Allow the unseen count in the tab title and favicon (default: true)
# desktop: true # Allow readers to turn on desktop notifications for replies (default: true)
# sound: true # Allow readers to turn on the reply chime (default: true)
# # How many conversations one background poll looks at (1-100, default: 100). The list's
# # own maximum page is the ceiling, so covering a deployment whose replies outpace one
# # page is not a matter of raising this.
# pollLimit: 100
# # Milliseconds between list checks while a tab is away (10000-600000, default: 30000).
# pollIntervalMs: 30000
# # Milliseconds between list refreshes while a tab is focused (60000-300000, default: 300000).
# # It renews the snapshot the unread count reads, so it cannot be slower than five minutes.
# focusedRefreshMs: 300000
# Conversation trace viewer: a waterfall of the model calls and tool spans behind
# each response, read from the deployment's Langfuse project. The control only
# appears on the requesting user's own conversations with a sampled trace, and
# needs a Langfuse release that serves the v2 Observations API.
# traceViewer:
# enabled: false
# # Traces are matched to users by the internal user id, so no trace is shown while
# # langfuse.trace.userIdField exports another user field.
# # Return observation input, output and metadata in the record inspector. Input
# # carries system prompts, agent instructions and tool definitions, which a
# # user chatting with a shared agent cannot otherwise see.
# showInputOutput: false
# # Name the tools of each tool round from the round's own record. This adds
# # requests to Langfuse per listed page, and Langfuse returns each round's full
# # input and output to serve them, though only the tool names are kept and sent
# # on; arguments and results stay behind showInputOutput. When off, a round is
# # named only where the conversation's messages can be matched to the trace.
# showToolNames: false
# # Observations read per request (1-10000); older records load on demand.
# maxRecords: 1000
# # Characters kept from each input, output and metadata value (1-1000000).
# maxContentLength: 50000
# # Trace reads one user may start per minute (1-1000).
# requestsPerMinute: 30
# # Budget for each request to Langfuse, in milliseconds (1000-300000).
# requestTimeoutMs: 10000
# Tools pinned to the prompt bar by default for all users.
# Only seeds the initial state — once a user pins/unpins a tool, their choice is kept.
# Valid tool keys: artifacts, execute_code, web_search, file_search, skills.
# Use 'mcp' (or a specific MCP server name) to pin the MCP servers dropdown.
# When omitted, tools start unpinned and the MCP dropdown keeps its default (pinned).
# defaultPinnedTools:
# - 'artifacts'
# - 'execute_code'
# - 'mcp'
# Remote Agents configuration
# Controls user permissions for remote agents with external API support
# remoteAgents:
# use: false
# create: false
# share: false
# public: false
# MCP Servers configuration example
# Shared Links configuration
# Controls user permissions for shared links (e.g. sharing conversations via link)
# sharedLinks:
# create: false
# share: true
# public: true # Allows users to toggle "share with everyone" for their links. Whether anonymous access is permitted is controlled by ALLOW_SHARED_LINKS_PUBLIC.
# snapshotFiles: true # Snapshot files referenced by a shared chat so viewers can preview/download them via the link. Enabled by default; the SHARED_LINKS_SNAPSHOT_FILES env var overrides this.
# mcpServers:
# # Poll only while MCP controls are visible, in milliseconds (0 disables polling).
# toolsRefreshInterval: 300000
# statusRefreshInterval: 30000
# Controls user permissions for MCP (Model Context Protocol) server management
# - use: Allow users to use configured MCP servers
# - create: Allow users to create and manage new MCP servers
# - share: Allow users to share MCP servers with other users
# - public: Allow users to share MCP servers publicly (with everyone)
# Creation / edit MCP server config Dialog config example
# trustCheckbox:
# label:
# en: 'I understand and I want to continue'
# de: 'Ich verstehe und möchte fortfahren'
# de-DE: 'Ich verstehe und möchte fortfahren' # You can narrow translation to regions like (de-DE or de-CH)
# subLabel:
# en: |
# Librechat hasn't reviewed this MCP server. Attackers may attempt to steal your data or trick the model into taking unintended actions, including destroying data. <a href="https://google.de" target="_blank"><strong>Learn more.</strong></a>
# de: |
# LibreChat hat diesen MCP-Server nicht überprüft. Angreifer könnten versuchen, Ihre Daten zu stehlen oder das Modell zu unbeabsichtigten Aktionen zu verleiten, einschließlich der Zerstörung von Daten. <a href="https://google.de" target="_blank"><strong>Mehr erfahren.</strong></a>
# Temporary chat retention period in hours (default: 720, min: 1, max: 8760)
# temporaryChatRetention: 1
# Regular chat retention in hours under retentionMode: "all" (min: 1, max: 8760).
# Defaults to the temporary chat retention policy when omitted.
# generalChatRetention: 2160 # 90 days, independently of temporary chats
# Existing stored deadlines are not migrated when these settings change.
# Retention mode: "temporary" (default) applies expiry only to chats users mark temporary;
# "all" applies expiry to all data types while keeping chats visible in history;
# "ephemeral" forces every chat to be temporary (always on, not user-toggleable) and applies expiry to all data.
# Before switching from "all"/"ephemeral" back to "temporary", remove retention deadlines from non-temporary data
# that should stop expiring:
# db.conversations.updateMany({ isTemporary: false, expiredAt: { $ne: null } }, { $unset: { expiredAt: 1 } })
# db.messages.updateMany({ isTemporary: false, expiredAt: { $ne: null } }, { $unset: { expiredAt: 1 } })
# MongoDB does not drop superseded indexes automatically. After upgrading, old Meili indexes
# such as "_meiliIndex_1_expiredAt_1" can be dropped from conversations/messages once the new
# "_meiliIndex_1_isTemporary_1_expiredAt_1" indexes exist.
# retentionMode: "temporary"
# Set retainAgentFiles to true to keep persistent agent resource files from expiring under
# retentionMode: "all"; non-agent files still expire.
# retainAgentFiles: false
# Example Cloudflare turnstile (optional)
#turnstile:
# siteKey: "your-site-key-here"
# options:
# language: "auto" # "auto" or an ISO 639-1 language code (e.g. en)
# size: "normal" # Options: "normal", "compact", "flexible", or "invisible"
# Example Registration Object Structure (optional)
# Changing the registered email address from Settings > Account.
# Omitted, these fall back to ALLOW_EMAIL_CHANGE and a 15-minute link.
# emailChange:
# enabled: true
# tokenTTLSeconds: 900
# Passkey (WebAuthn) enrollment limits.
# Omitted, perUserMax falls back to MAX_PASSKEYS_PER_USER, then 20.
# passkeys:
# perUserMax: 20
registration:
socialLogins: ['github', 'google', 'discord', 'openid', 'facebook', 'apple', 'saml']
# allowedDomains:
# - "gmail.com"
# How long a started social login may take to return from the provider (ms, default 600000)
# oauthStateTtlMs: 600000
# OpenID discovery retries when the provider is unreachable (overrides OPENID_DISCOVERY_RETRY_* env vars)
# openidDiscovery:
# startupAttempts: 1 # attempts before startup continues; 0 = background retries only
# retryDelayMs: 5000 # delay between startup and background attempts
# Example Balance settings
# balance:
# enabled: false
# startBalance: 20000
# autoRefillEnabled: false
# refillIntervalValue: 30 # Reset mode requires a positive integer
# refillIntervalUnit: 'days'
# refillAmount: 10000
# # Deploy reset-capable servers to every replica before selecting 'reset'.
# refillMode: 'add' # 'reset' replaces the allowance each period without rollover
# reservationTtlMs: 1800000 # How long an in-flight request's reserved credits count if never released
# display: 'credits' # credits | currency (uses interface.currency) | percent (share of the allotment used)
# Example Transactions settings
# Controls whether to save transaction records to the database
# Default is true (enabled)
#transactions:
# enabled: false
# Note: If balance.enabled is true, transactions will always be enabled
# regardless of this setting to ensure balance tracking works correctly
# Speech (STT/TTS) outbound requests to operator-provided target URLs are SSRF-guarded
# at connect time: private, loopback, link-local, and cloud-metadata targets are blocked
# by default. To point STT/TTS at a private or self-hosted service (LocalAI, a self-hosted
# Whisper server), add its host:port to `allowedAddresses` on the `stt` / `tts` section.
# SECURITY: `allowedAddresses` entries are trusted before the private-IP check. A listed
# host:port is permitted even when it resolves to a private IP, so list only hosts you fully
# control and that cannot be repointed by an attacker. Do not list attacker-controllable or
# DNS-rebindable hostnames, because doing so re-opens the private-address path this guard
# closes. Prefer a private IP literal over a hostname when exempting a private target. Entries
# must include a port (`host:port`, `private.ip:port`, or `[ipv6]:port`); do not use URLs, paths,
# CIDR ranges, bare hosts/IPs, or public IP literals.
# When a forward proxy is configured (PROXY / HTTP(S)_PROXY), it performs DNS and egress in its
# own network context, so these requests are delegated to it and it must be SSRF-enforcing; the
# connect-time guard only covers direct, non-proxied connections.
# speech:
# tts:
# openai:
# url: ''
# apiKey: '${TTS_API_KEY}'
# model: ''
# voices: ['']
# allowedAddresses:
# - 'localhost:8020'
# - '127.0.0.1:8020'
#
# stt:
# openai:
# url: ''
# apiKey: '${STT_API_KEY}'
# model: ''
# allowedAddresses:
# - 'localhost:8000'
# - '127.0.0.1:8000'
# OCR (Mistral / Mistral-compatible) outbound requests to `ocr.baseURL` are SSRF-guarded at
# connect time with the same default-deny for private targets. To point OCR at a private or
# self-hosted Mistral-compatible service, add its host:port to `allowedAddresses`. The same
# trust caveat as speech applies: a listed host:port is trusted before the private-IP check,
# so list only hosts you fully control and that cannot be repointed by an attacker. Entries
# must include a port and must not be URLs, paths, CIDR ranges, bare hosts/IPs, or public IP
# literals.
# ocr:
# baseURL: '${OCR_BASEURL}'
# apiKey: '${OCR_API_KEY}'
# allowedAddresses:
# - 'localhost:8080'
# - '127.0.0.1:8080'
# rateLimits:
# # Per-user MCP App browser-route limits. Each limit uses a fixed one-minute window.
# mcpApps:
# resourcesPerMinute: 120
# toolCallsPerMinute: 60
# # Shared account budget for all authenticated 2FA management operations.
# # Always active; successful and failed requests count. Uses Redis when enabled.
# # Minimum 3, so enable -> verify -> confirm can complete within one window.
# twoFactorManagement:
# requestsPerFiveMinutes: 7
# # Authenticated agent-event admission has its own API-key-principal bucket.
# agentEvents:
# userMax: 40
# userWindowInMinutes: 1
# fileUploads:
# ipMax: 100
# ipWindowInMinutes: 60 # Rate limit window for file uploads per IP
# userMax: 50
# userWindowInMinutes: 60 # Rate limit window for file uploads per user
# conversationsImport:
# ipMax: 100
# ipWindowInMinutes: 60 # Rate limit window for conversation imports per IP
# userMax: 50
# userWindowInMinutes: 60 # Rate limit window for conversation imports per user
# # Asking for a change of the registered email, per authenticated user.
# emailChange:
# userMax: 3
# userWindowInMinutes: 2
# # Opening a verification link. The endpoint is unauthenticated, so the source
# # address is bounded as well as the account the link names.
# emailChangeConfirm:
# ipMax: 20
# ipWindowInMinutes: 2
# userMax: 2
# userWindowInMinutes: 2
# Agent Actions domain restrictions (OpenAPI spec validation)
# SECURITY: If not configured, SSRF targets are blocked (localhost, private IPs, .internal/.local TLDs).
# Prefer `allowedAddresses` for permitting internal targets — adding a private IP to
# `allowedDomains` switches the field into strict-whitelist mode and blocks every
# public destination not also listed.
# Supports wildcards: '*.example.com' and protocol/port restrictions: 'https://api.example.com:8443'
actions:
allowedDomains:
- 'swapi.dev'
- 'librechat.ai'
- 'google.com'
# - 'http://10.225.26.25:7894' # Internal IP with protocol/port (uncomment if needed)
# `allowedAddresses` is an SSRF exemption list, NOT a strict whitelist.
# Hostname/IP + port pairs listed here bypass the default-deny block for that
# one private/loopback/link-local service. Public domains continue to work
# normally — listing private targets here does not restrict access to anything else.
#
# Entries must include a port: `host:port`, `private.ip:port`, or `[ipv6]:port`.
# Do not use URLs, paths, CIDR ranges, bare hosts/IPs, or public IP literals.
# Public IP literals are rejected at config load (the field is scoped to
# private IP space; public IPs aren't SSRF targets).
#
# NOTE on hostnames: a hostname entry trusts whatever IP that name resolves to
# on the listed port. If DNS for that name is hijacked or rotated to a different
# private IP, the exemption follows. Only list hostnames whose DNS you control.
# Prefer literal IPs when you can.
# allowedAddresses:
# - 'host.docker.internal:11434'
# - '127.0.0.1:11434'
# - '10.0.0.5:8080'
# Custom endpoint baseURL exemption list
# SECURITY: User-provided baseURLs (`baseURL: 'user_provided'`) are validated against
# the same SSRF block as Actions and MCP. If your users legitimately point at private
# services (self-hosted Ollama, internal LLM gateway, etc.), list those hostname/IP
# + port pairs here so the validator allows them through. Public destinations are
# unaffected.
#
# Entries must include a port: `host:port`, `private.ip:port`, or `[ipv6]:port`.
# Do not use URLs, paths, CIDR ranges, bare hosts/IPs, or public IP literals.
# Hostname entries trust whatever IP they resolve to on the listed port — only
# list names whose DNS you control.
# endpoints:
# allowedAddresses:
# - 'localhost:11434'
# - '127.0.0.1:11434'
# - 'ollama:11434'
# - '10.0.0.5:8080'
# MCP Server domain restrictions for remote transports (SSE, WebSocket, HTTP)
# SECURITY: If not configured, SSRF targets are blocked (localhost, private IPs, .internal/.local TLDs).
# Prefer `allowedAddresses` for permitting internal targets — adding a private host to
# `allowedDomains` switches the field into strict-whitelist mode and blocks every
# public destination not also listed.
# Supports wildcards: '*.example.com' matches 'api.example.com', 'staging.example.com', etc.
# Supports protocol/port restrictions: 'https://api.example.com:8443' restricts to specific protocol/port.
# mcpSettings:
# # New MCP Apps require explicit opt-in. If omitted, legacy inline HTML remains enabled;
# # false disables both MCP Apps and legacy inline HTML.
# apps: true
# allowedDomains:
# - 'host.docker.internal' # Docker host access (required for Docker setups)
# - 'localhost' # Local development
# - '*.example.com' # Wildcard subdomain
# - 'https://secure.api.com' # Protocol-restricted
# - 'http://internal:8080' # Protocol and port restricted
# # allowedAddresses is an SSRF exemption list (private-IP-space only).
# # Hostname/IP + port pairs listed here bypass the default-deny block for that
# # one private service; public destinations remain reachable. Useful when you
# # want default SSRF protection AND specific internal MCP servers. Entries must
# # include a port (`host:port`, `private.ip:port`, or `[ipv6]:port`) and must
# # not be URLs, paths, CIDR ranges, bare hosts/IPs, or public IP literals.
# # Hostname entries trust whatever IP they resolve to on the listed port.
# allowedAddresses:
# - 'host.docker.internal:8080'
# - '127.0.0.1:8080'
# Deployment-owned MCP App sandbox settings. These cannot be overridden by role, group, or user
# configuration. Set url to a dedicated origin routed to /api/mcp/sandbox. Defaults are shown.
# mcpAppSandbox:
# url: https://mcp-sandbox.example.com/api/mcp/sandbox
# maxSourcesPerDirective: 32
# maxSerializedLength: 4096
# maxPersistedAppBytes: 1048576
# maxAdmissionRequestsPerMinute: 240
# maxActiveViews: 3 # simultaneous interactive App views per browser
# maxActionPreviewChars: 16384 # App tool arguments and chat message preview
# Example MCP Servers Object Structure
# mcpServers:
# everything:
# # type: sse # type can optionally be omitted
# url: http://localhost:3001/sse
# # proxy: "${MCP_PROXY_URL}" # optional outbound proxy (http/https/socks/socks5)
# timeout: 60000 # 1 minute timeout for this server, this is the default timeout for MCP servers.
# coordinated-oauth:
# type: streamable-http
# url: https://mcp.example.com/mcp
# requiresOAuth: true
# # Stage rollout with coordination disabled (the default). Once EVERY replica is upgraded,
# # pause MCP traffic and drain active refreshes/callbacks on EVERY replica before changing
# # this flag. Apply the same value everywhere while paused, then resume. For rollback, drain,
# # disable everywhere, replace the replicas, then resume. Do not toggle during live traffic.
# # All coordinated replicas must use the same Redis cache.
# oauthRefreshCoordination: false
# # Peer refresh wait; capped at 30000 ms by the refresh execution budget.
# oauthRefreshWaitTimeout: 15000
# # Callback/adoption persistence wait; raise for longer publication budgets (max 840000 ms).
# oauthPersistenceWaitTimeout: 15000
# private-openid:
# type: streamable-http
# url: https://mcp.example.com/mcp
# headers:
# # Trusted operator configs automatically use the live session token and replace the
# # connection once after a 401/403. A rejected tools/call is never replayed automatically.
# # Enabled oauth or obo configuration takes precedence over this passthrough mode.
# Authorization: "Bearer {{LIBRECHAT_OPENID_ACCESS_TOKEN}}"
# # Sent only during a chat turn, merged over `headers` (these win on a duplicate name).
# # Tool discovery has no conversation to resolve them against, so it omits them entirely:
# # a `{{LIBRECHAT_BODY_*}}` placeholder here no longer hides the server's tool list.
# requestHeaders:
# X-Conversation-Id: "{{LIBRECHAT_BODY_CONVERSATIONID}}"
# puppeteer:
# type: stdio
# command: npx
# args:
# - -y
# - "@modelcontextprotocol/server-puppeteer"
# timeout: 300000 # 5 minutes timeout for this server
# filesystem:
# # type: stdio
# command: npx
# args:
# - -y
# - "@modelcontextprotocol/server-filesystem"
# - /home/user/LibreChat/
# iconPath: /home/user/LibreChat/client/public/assets/logo.svg
# mcp-obsidian:
# command: npx
# args:
# - -y
# - "mcp-obsidian"
# - /path/to/obsidian/vault
# Definition of custom endpoints
endpoints:
# assistants:
# disableBuilder: false # Disable Assistants Builder Interface by setting to `true`
# pollIntervalMs: 3000 # Polling interval for checking assistant updates
# timeoutMs: 180000 # Timeout for assistant operations
# # Should only be one or the other, either `supportedIds` or `excludedIds`
# supportedIds: ["asst_supportedAssistantId1", "asst_supportedAssistantId2"]
# # excludedIds: ["asst_excludedAssistantId"]
# # Only show assistants that the user created or that were created externally (e.g. in Assistants playground).
# # privateAssistants: false # Does not work with `supportedIds` or `excludedIds`
# # (optional) Models that support retrieval, will default to latest known OpenAI models that support the feature
# retrievalModels: ["gpt-4-turbo-preview"]
# # (optional) Assistant Capabilities available to all users. Omit the ones you wish to exclude. Defaults to list below.
# capabilities: ["code_interpreter", "retrieval", "actions", "tools", "image_vision"]
# agents:
# # Maximum provider response-body inactivity for Agent model calls. Defaults to 15 minutes;
# # each received chunk resets the timer. Set to 0 to disable the idle timeout.
# modelResponseBodyTimeoutMs: 900000
# # Maximum wait for provider response headers. Defaults to 5 minutes; 0 disables.
# modelResponseHeadersTimeoutMs: 300000
# # (optional) Default recursion depth for agents, defaults to 25
# recursionLimit: 50
# # Maximum provider error characters retained without content protection (0 hides detail).
# maxProviderErrorChars: 2000
# # (optional) Max recursion depth for agents, defaults to 25
# maxRecursionLimit: 100
# # (optional) Abort a run once a single streamed tool call's arguments exceed this many bytes.
# # Guards against runaway malformed tool-call generation. Defaults to 65536 (64 KiB); 0 disables.
# # Host-side skill/sandbox edits, not attached-worker edits. Over-budget calls write nothing.
# hostFileEdits:
# maxEdits: 100
# maxWorkBytes: 67108864 # cumulative matching/reconstruction bytes
# maxOccurrences: 100000 # cumulative occurrences across every edit/pass
# timeoutMs: 2000 # terminate an overlong worker job
# maxConcurrent: 2 # per API process; no waiting queue
# maxToolCallArgBytes: 65536
# # (optional) Abort a run once a single model generation emits more than this many stream events.
# # Defense in depth against looping provider streams. Disabled by default.
# maxDeltaEventsPerTurn: 100000
# # (optional) Per-tool overrides for maxToolCallArgBytes, keyed by tool name; 0 disables that
# # tool's guard. LibreChat ships { create_file: 131072 } so document-sized file writes are not
# # cut off; entries here merge over (and can replace) that default.
# maxToolCallArgBytesByTool:
# create_file: 131072
# # (optional) Disable the builder interface for agents
# disableBuilder: false
# # (optional) When conversation titles are generated:
# # immediate (default): generate as soon as the request is made, in parallel
# # with the response, from the user's first message (title appears within ~1-2s).
# # final: defer generation until the full response completes (legacy behavior).
# # Set under `endpoints.all` instead to apply as the global default for all endpoints.
# titleTiming: immediate
# # (optional) Generate one-line headers for blocks of Agent reasoning and tool calls.
# # Header generation is a separate model call whose usage and cost are recorded.
# activityLabel: true
# activityEndpoint: openAI
# activityModel: gpt-4.1-nano
# # activityPrompt: 'Write a short activity label...'
# # activityMaxPerRun: 20
# # activityCharLimit: 600
# # (optional) Replace the generic Thinking/Thoughts heading with a live
# # generated orientation as sufficiently long top-level reasoning evolves.
# # Enabling this sends a bounded snapshot (up to 4,000 characters) of the
# # visible reasoning to the resolved label endpoint, which may be a different provider.
# # With Langfuse tracing enabled, that snapshot is also recorded as generation input
# # unless the active redaction policy suppresses the label call.
# # reasoningLabel: true
# # reasoningLabelModel: gpt-4.1-nano # falls back to activity/title/run model
# # reasoningLabelEndpoint: openAI # falls back to activity/run endpoint
# # reasoningLabelPrompt: 'Describe the current reasoning direction...'
# # reasoningLabelMinChars: 500 # text required before the first label
# # reasoningLabelUpdateChars: 400 # new text between streaming revisions
# # reasoningLabelUpdateIntervalMs: 3000 # minimum time between streaming revisions
# # A final rewrite may run immediately after a meaningful 120-character tail.
# # reasoningLabelMaxPerRun: 8 # provider-call cap per response
# # (optional) Maximum total citations to include in agent responses, defaults to 30
# maxCitations: 30
# # (optional) Maximum citations per file to include in agent responses, defaults to 7
# maxCitationsPerFile: 7
# # (optional) Minimum relevance score for sources to be included in responses, defaults to 0.45 (45% relevance threshold)
# # Set to 0.0 to show all sources (no filtering), or higher like 0.7 for stricter filtering
# minRelevanceScore: 0.45
# # (optional) Maximum explicit subagents per agent, for both the flat list and
# # graph definitions. Defaults to 10; hard cap 50.
# maxSubagents: 20
# # (optional) Shared files during an active agent run. Each delegating agent must
# # also opt in with subagents.shareFiles. Inputs are read-only; outputs stay
# # private until explicitly published. Published files remain downloadable.
# # Live child activity, independent of the completed transcript.
# subagentActivity:
# replayTtlMs: 300000 # Increase for long silent tool calls.
# publicationTimeoutMs: 1000
# retryAttempts: 3
# retryBaseDelayMs: 100
# recoveryDelayMs: 1000
# memoryMaxStreams: 1000 # Non-Redis replay cache.
# memoryMaxBytes: 16777216
# fileSharing:
# enabled: false
# allowSiblingSharing: false # permit explicitly named sibling/descendant recipients
# maxFiles: 100 # manifest capacity, 1–1000
# maxPrivateBytes: 268435456 # aggregate private output snapshots, 256 MiB
# ttlMs: 3600000 # active manifest lifetime, at most 24 hours
# # (optional) Maximum concurrent Code API uploads per route and user. Defaults to 3.
# codeApiUploadConcurrency: 3
# # (optional) Maximum total time spent waiting on Code API rate limits. Defaults to 20000 ms.
# codeApiMaxRetryWaitMs: 20000
# # (optional) Cap the number of active accessible skills shown in the model-visible catalog.
# # Useful for large organizations where many department-specific skills may be available.
# skills:
# maxCatalogSkills: 20
# # (optional) Agent Capabilities available to all users. Omit the ones you wish to exclude. Defaults to list below.
# # web_search controls only LibreChat's external pipeline, not provider-native search.
# # Both require WEB_SEARCH.USE, seeded by interface.webSearch. See UPGRADING.md.
# capabilities: ["deferred_tools", "execute_code", "file_search", "web_search", "artifacts", "subagents", "actions", "context", "skills", "memory", "ask_user_question", "tools", "ocr"]
# # The following capabilities are opt-in and must be added explicitly:
# # "programmatic_tools", "stateful_code_sessions", "run_in_background", "tool_intents"
# # "stateful_code_sessions" is highly experimental and may change substantially.
# # (optional) Limit the workspace scopes users may select. Omit to allow all three.
# statefulCodeSessions:
# # Let new chats choose an attached machine from their agent's explicit machine allowlist.
# # On by default; only agents with a saved allowlist are affected. Set false to keep
# # every agent on its fixed machine (for example while older API replicas still run).
# allowEnvironmentSelection: true
# # Maximum additional machines per agent; default 32, supported ceiling 128.
# maxEnvironmentChoices: 32
# # Keep move-only behavior unless attach/detach is explicitly enabled.
# # Enable only after ALL API replicas run this build and advertise decision protocol 1
# # (CODE_ENVIRONMENT_DECISION_VERSION=1), then refresh clients.
# conversationMoves:
# enabled: true
# allowAttachDetach: false
# allowedEnvironments: ["user", "agent-user", "conversation"]
# # Personal BYOM enrollment. Requires allowPrincipalWorkers on a control plane.
# # Omitted values default to enabled and five registered environments per user.
# # Principal config overrides may tighten, but cannot raise, this ceiling.
# # Lowering the limit, or disabling enrollment, does not revoke existing machines.
# # This counts registered environments across control planes, not online workers.
# principalWorkers:
# enabled: true
# maxPerUser: 25
# # Route an agent to an operator-managed Code API or to a Code API whose
# # `remote-bridge` backend leases work to an outbound @librechat/code worker.
# environments:
# - id: managed-default
# name: Managed Code API
# type: managed
# baseURL: https://code.example.com/v1
# default: true
# - id: engineering-vm
# name: Engineering VM
# type: attached
# baseURL: https://code-bridge.example.com/v1
# # Pins an administrator-managed environment to one worker.
# owner: deployment
# pairing:
# workerId: engineering-vm
# tokenEnv: CODE_BRIDGE_ADMIN_TOKEN
# - id: personal-workers
# name: Personal Code Workers
# type: attached
# baseURL: https://code-bridge.example.com/v1
# # Lets authenticated users create principal-bound environments and
# # receive a one-time code for an outbound @librechat/code worker.
# # The administrator secret stays in the named environment variable.
# owner: deployment
# # Optionally expose only these bounded preferences to environment owners.
# configSchema:
# limits:
# # Maximum Bash execution budget the model may request per call.
# # Omit to preserve the historical 30-second limit. Hard cap: 300000.
# maxCommandTimeoutMs: 120000
# # Foreground Bash default when timeoutMs is omitted. Omit to keep 30000.
# # Clamped to the effective admin, worker, and verified HTTP ceilings.
# # Background calls still default to the effective maximum.
# # Programmatic Bash uses this only when timeout is omitted; explicit
# # values keep the same negotiated ceiling. Its SDK has a 1000 ms floor
# # and cannot run under a smaller ceiling; use bash_tool for those budgets.
# # defaultCommandTimeoutMs: 60000
# # Attached read_file window when max_lines is omitted. Omit to keep 200.
# # Valid range: 1–500 lines; the existing byte budget still applies.
# # defaultReadFileLines: 500
# # New strict fields require all LibreChat API replicas to be updated first.
# # Optional total HTTP budget per workspace tool call, including
# # admission, retries, worst-case execution, settlement, and delivery.
# # Do NOT enable until every LibreChat API replica recognizes this
# # strict config field, Code API honors X-LibreChat-Workspace-Queue-Wait-Ms,
# # and a non-mutating timed canary verifies the live CDN, load balancer,
# # ingress, and caller can all outlast this value. The Nginx example
# # (120s) cannot establish the live limit. Omission keeps 30s admission.
# # With 125s total, a read can queue <=90s, a default command <=85s,
# # a 90s command <=25s. With the default 10s admission reserve,
# # commands >105s cannot fit; the 120s command ceiling above requires
# # a VERIFIED total budget of at least 140s to be usable.
# # maxRequestTimeoutMs: 125000
# # Optional command admission allowance before local dispatch overhead.
# # Omission reserves 10s; valid range: 1000–300000 ms. The HTTP budget
# # must exceed this allowance plus 10s settlement/delivery grace;
# # with the 10s default, a budget of 20s or less is rejected.
# # Smaller allowances give a busy worker less time to accept the call.
# # minCommandAdmissionMs: 10000
# permissions:
# fileWrite:
# allowed: [allow, ask, deny]
# default: ask
# commandExecution:
# # Add allow to offer Full access in the chat composer. Both
# # permission categories must permit allow; defaults can stay ask.
# # Full access skips routine code prompts within the worker sandbox.
# # Explicit endpoint ask/deny rules and hooks still apply.
# allowed: [ask, deny]
# default: ask
# pairing:
# allowPrincipalWorkers: true
# tokenEnv: CODE_BRIDGE_ADMIN_TOKEN
# # (optional) Trusted origin for internal event delivery. By default, LibreChat
# # uses its own bound listener; override only for an internal TLS/front-door route.
# eventDriven:
# # selfUrl: 'https://librechat.internal'
# # (optional) Automatic conversational delivery for supported completed background tasks.
# # Enabled by default; set false to keep background tools and subagents poll-only.
# backgroundTasks:
# completionWakeups: true
# # Deliver a conversation's ready results together in one wake-up. On by default; set false
# # during a rolling upgrade while replicas from releases without it still serve traffic.
# completionReceiptBatching: true
# # Allow owners to cooperatively cancel ordinary background tools, including BYOM Bash.
# ordinaryToolCancellation: false
# # (optional) Show a conversation's pull request in the chat header. Off by default. It needs
# # a code worker built from LibreChat-AI/code-interpreter#311 or later that reports its
# # branch, with CODEAPI_BRIDGE_LANE_GIT=true set on the Code API; without both, every chat
# # simply shows no pull request. It also needs a GitHub token held on the server. Use a
# # fine-grained token limited to the repositories involved, with read-only "Pull requests",
# # "Checks" and "Contents" permissions. Without "Checks" every matched pull request fails to
# # load, and without "Contents" a chat whose branch has moved on since its last command does.
# pullRequests:
# enabled: false
# # Environment variable reference only, never the token itself.
# token: "${GITHUB_PULL_REQUEST_TOKEN}"
# # Repositories the token may be used for, as owner/name or owner/*. Required: a worker
# # reports its own repository, and only these are ever looked up with the server's token.
# allowedRepositories: ["LibreChat-AI/LibreChat"]
# # Seconds a looked-up pull request is reused before GitHub is asked again (5 to 3600).
# cacheTtlSeconds: 30
# # Results cached per credential before the oldest is evicted (10 to 100000). Raise it when many
# # repositories and branches are active at once, or fresh results are evicted and GitHub is asked again.
# cacheMaxEntries: 500
# # Credentials cached at once (1 to 10000), deployment-wide; the one idle longest is dropped
# # past it. When principals configure different values, the largest applies.
# cacheMaxCredentials: 256
# # Bounds on one lookup. A repository with many check runs reads one page of 100 per request.
# requestTimeoutSeconds: 10 # longest single GitHub request (1 to 60)
# lookupTimeoutSeconds: 30 # longest the whole lookup may take (1 to 120)
# maxCheckRunPages: 10 # pages read before checks are reported as running (1 to 50)
# maxCandidatePullRequests: 10 # pull requests listed per state when matching a reused branch (1 to 100)
# maxHeadComparisons: 3 # candidates compared with the chat's last commit (0 to 20)
# # "run_in_background" makes Code Interpreter tools eligible by default and enables per-tool MCP opt-in.
# # "tool_intents" enables live model-written labels for native tools and opted-in MCP tools.
# # (optional) Require user approval before matching tool calls. Disabled by default.
# toolApproval:
# # Opt in after all replicas have been upgraded. Agent tool rows then expose
# # Always ask, Always approve, Ask once per chat, and Ask once then always approve.
# # Explicit administrator ask/deny rules and hooks remain authoritative.
# agentModes: false
# grantLookupTimeoutMs: 3000
# enabled: true
# mode: default # default, dontAsk, or bypass
# allow: ["mcp:trusted-server:read_*"]
# deny: ["mcp:*:delete_*"] # Deny rules always take precedence
# ask: ["mcp:*:*"]
# reason: "Review {tool} before it runs."
# allowAlways: false # Offer "Always allow" to stop prompting for a tool for the rest of a conversation
# # (optional) Persist Agent runs paused for approval or Ask User. MongoDB is the durable default.
# checkpointer:
# type: mongo # mongo (default) or memory (single-process development only)
# ttl: 86400 # Approval window in seconds; defaults to 24 hours
# # (optional) Keep the user's answers to Ask User questions in the model context verbatim,
# # even after the messages that carried them were summarized or pruned. On by default.
# askUserQuestion:
# retainedAnswers:
# enabled: true
# maxTokens: 4096 # Older answers drop first past this budget; the newest is always kept
# # (optional) Authenticate machine clients for the Agent Management API.
# # Each verified OAuth client is bound server-side to one existing LibreChat
# # user and tenant; that user's normal role and Agent ACLs still apply.
# managementApi:
# auth:
# oidc:
# enabled: true
# issuer: 'https://identity.example.com/'
# audience: 'https://librechat.example.com/agents'
# # jwksUri: 'https://identity.example.com/.well-known/jwks.json'
# # Cognito M2M access tokens use client_id instead of aud. For that
# # profile, omit audience and require the access-token type and scope:
# # tokenUse: access
# # requiredScopes: ['agents-api/manage']
# clients:
# - clientId: 'machine-client-id'
# # subject: 'provider-specific-service-principal-subject'
# userId: '507f1f77bcf86cd799439011'
# tenantId: 'tenant-id'
# (optional) Custom request headers for the built-in OpenAI / Google endpoints.
# Forwarded on every request to the provider (or an AI gateway / reverse proxy