mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
🔄 feat: Add Configurable Cache Headers for Index.html (#4565)
* refactor: move o1 model check, after vision request check * feat(server): add configurable cache headers for index.html • Add environment variables to control index.html cache headers • Default to no-cache configuration for consistent app updates • Document cache control options in .env.example
This commit is contained in:
parent
a1647d76e0
commit
b939e24f67
4 changed files with 26 additions and 8 deletions
16
.env.example
16
.env.example
|
|
@ -491,3 +491,19 @@ HELP_AND_FAQ_URL=https://librechat.ai
|
||||||
|
|
||||||
# E2E_USER_EMAIL=
|
# E2E_USER_EMAIL=
|
||||||
# E2E_USER_PASSWORD=
|
# E2E_USER_PASSWORD=
|
||||||
|
|
||||||
|
#=====================================================#
|
||||||
|
# Cache Headers #
|
||||||
|
#=====================================================#
|
||||||
|
# Headers that control caching of the index.html #
|
||||||
|
# Default configuration prevents caching to ensure #
|
||||||
|
# users always get the latest version. Customize #
|
||||||
|
# only if you understand caching implications. #
|
||||||
|
|
||||||
|
# INDEX_HTML_CACHE_CONTROL=no-cache, no-store, must-revalidate
|
||||||
|
# INDEX_HTML_PRAGMA=no-cache
|
||||||
|
# INDEX_HTML_EXPIRES=0
|
||||||
|
|
||||||
|
# no-cache: Forces validation with server before using cached version
|
||||||
|
# no-store: Prevents storing the response entirely
|
||||||
|
# must-revalidate: Prevents using stale content when offline
|
||||||
|
|
@ -100,8 +100,6 @@ class OpenAIClient extends BaseClient {
|
||||||
this.options.modelOptions,
|
this.options.modelOptions,
|
||||||
);
|
);
|
||||||
|
|
||||||
this.isO1Model = /\bo1\b/i.test(this.modelOptions.model);
|
|
||||||
|
|
||||||
this.defaultVisionModel = this.options.visionModel ?? 'gpt-4-vision-preview';
|
this.defaultVisionModel = this.options.visionModel ?? 'gpt-4-vision-preview';
|
||||||
if (typeof this.options.attachments?.then === 'function') {
|
if (typeof this.options.attachments?.then === 'function') {
|
||||||
this.options.attachments.then((attachments) => this.checkVisionRequest(attachments));
|
this.options.attachments.then((attachments) => this.checkVisionRequest(attachments));
|
||||||
|
|
@ -109,6 +107,8 @@ class OpenAIClient extends BaseClient {
|
||||||
this.checkVisionRequest(this.options.attachments);
|
this.checkVisionRequest(this.options.attachments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.isO1Model = /\bo1\b/i.test(this.modelOptions.model);
|
||||||
|
|
||||||
const { OPENROUTER_API_KEY, OPENAI_FORCE_PROMPT } = process.env ?? {};
|
const { OPENROUTER_API_KEY, OPENAI_FORCE_PROMPT } = process.env ?? {};
|
||||||
if (OPENROUTER_API_KEY && !this.azure) {
|
if (OPENROUTER_API_KEY && !this.azure) {
|
||||||
this.apiKey = OPENROUTER_API_KEY;
|
this.apiKey = OPENROUTER_API_KEY;
|
||||||
|
|
|
||||||
|
|
@ -112,10 +112,16 @@ const startServer = async () => {
|
||||||
app.use('/api/tags', routes.tags);
|
app.use('/api/tags', routes.tags);
|
||||||
|
|
||||||
app.use((req, res) => {
|
app.use((req, res) => {
|
||||||
// Replace lang attribute in index.html with lang from cookies or accept-language header
|
res.set({
|
||||||
|
'Cache-Control': process.env.INDEX_CACHE_CONTROL || 'no-cache, no-store, must-revalidate',
|
||||||
|
Pragma: process.env.INDEX_PRAGMA || 'no-cache',
|
||||||
|
Expires: process.env.INDEX_EXPIRES || '0',
|
||||||
|
});
|
||||||
|
|
||||||
const lang = req.cookies.lang || req.headers['accept-language']?.split(',')[0] || 'en-US';
|
const lang = req.cookies.lang || req.headers['accept-language']?.split(',')[0] || 'en-US';
|
||||||
const saneLang = lang.replace(/"/g, '"'); // sanitize untrusted user input
|
const saneLang = lang.replace(/"/g, '"');
|
||||||
const updatedIndexHtml = indexHTML.replace(/lang="en-US"/g, `lang="${saneLang}"`);
|
const updatedIndexHtml = indexHTML.replace(/lang="en-US"/g, `lang="${saneLang}"`);
|
||||||
|
res.type('html');
|
||||||
res.send(updatedIndexHtml);
|
res.send(updatedIndexHtml);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,6 @@
|
||||||
<meta name="mobile-web-app-capable" content="yes">
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||||
<!-- Cache Busting -->
|
|
||||||
<meta http-equiv='cache-control' content="no-cache, no-store, must-revalidate">
|
|
||||||
<meta http-equiv='expires' content='0'>
|
|
||||||
<meta http-equiv='pragma' content='no-cache'>
|
|
||||||
<title>LibreChat</title>
|
<title>LibreChat</title>
|
||||||
<link
|
<link
|
||||||
rel="shortcut icon"
|
rel="shortcut icon"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue