Skip to content

Commit 4e2cf3b

Browse files
🕐 feat: Configurable Retention Period for Temporary Chats (danny-avila#8056)
* feat: Add configurable retention period for temporary chats * Addressing eslint errors * Fix: failing test due to missing registration * Update: variable name and use hours instead of days for chat retention * Addressing comments * chore: fix import order in Conversation.js * chore: import order in Message.js * chore: fix import order in config.ts * chore: move common methods to packages/api to reduce potential for circular dependencies * refactor: update temp chat retention config type to Partial<TCustomConfig> * refactor: remove unused config variable from AppService and update loadCustomConfig tests with logger mock * refactor: handle model undefined edge case by moving Session model initialization inside methods --------- Co-authored-by: Rakshit Tiwari <[email protected]>
1 parent 22b224c commit 4e2cf3b

35 files changed

+368
-131
lines changed

api/cache/banViolation.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
const { logger } = require('@librechat/data-schemas');
2+
const { isEnabled, math } = require('@librechat/api');
23
const { ViolationTypes } = require('librechat-data-provider');
3-
const { isEnabled, math, removePorts } = require('~/server/utils');
44
const { deleteAllUserSessions } = require('~/models');
5+
const { removePorts } = require('~/server/utils');
56
const getLogStores = require('./getLogStores');
67

78
const { BAN_VIOLATIONS, BAN_INTERVAL } = process.env ?? {};

api/cache/getLogStores.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { Keyv } = require('keyv');
2+
const { isEnabled, math } = require('@librechat/api');
23
const { CacheKeys, ViolationTypes, Time } = require('librechat-data-provider');
34
const { logFile, violationFile } = require('./keyvFiles');
4-
const { isEnabled, math } = require('~/server/utils');
55
const keyvRedis = require('./keyvRedis');
66
const keyvMongo = require('./keyvMongo');
77

api/models/Conversation.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const { logger } = require('@librechat/data-schemas');
2+
const { createTempChatExpirationDate } = require('@librechat/api');
3+
const getCustomConfig = require('~/server/services/Config/loadCustomConfig');
24
const { getMessages, deleteMessages } = require('./Message');
35
const { Conversation } = require('~/db/models');
46

@@ -98,10 +100,15 @@ module.exports = {
98100
update.conversationId = newConversationId;
99101
}
100102

101-
if (req.body.isTemporary) {
102-
const expiredAt = new Date();
103-
expiredAt.setDate(expiredAt.getDate() + 30);
104-
update.expiredAt = expiredAt;
103+
if (req?.body?.isTemporary) {
104+
try {
105+
const customConfig = await getCustomConfig();
106+
update.expiredAt = createTempChatExpirationDate(customConfig);
107+
} catch (err) {
108+
logger.error('Error creating temporary chat expiration date:', err);
109+
logger.info(`---\`saveConvo\` context: ${metadata?.context}`);
110+
update.expiredAt = null;
111+
}
105112
} else {
106113
update.expiredAt = null;
107114
}

api/models/Message.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
const { z } = require('zod');
22
const { logger } = require('@librechat/data-schemas');
3+
const { createTempChatExpirationDate } = require('@librechat/api');
4+
const getCustomConfig = require('~/server/services/Config/loadCustomConfig');
35
const { Message } = require('~/db/models');
46

57
const idSchema = z.string().uuid();
@@ -54,9 +56,14 @@ async function saveMessage(req, params, metadata) {
5456
};
5557

5658
if (req?.body?.isTemporary) {
57-
const expiredAt = new Date();
58-
expiredAt.setDate(expiredAt.getDate() + 30);
59-
update.expiredAt = expiredAt;
59+
try {
60+
const customConfig = await getCustomConfig();
61+
update.expiredAt = createTempChatExpirationDate(customConfig);
62+
} catch (err) {
63+
logger.error('Error creating temporary chat expiration date:', err);
64+
logger.info(`---\`saveMessage\` context: ${metadata?.context}`);
65+
update.expiredAt = null;
66+
}
6067
} else {
6168
update.expiredAt = null;
6269
}

api/server/controllers/AuthController.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
const cookies = require('cookie');
22
const jwt = require('jsonwebtoken');
33
const openIdClient = require('openid-client');
4+
const { isEnabled } = require('@librechat/api');
45
const { logger } = require('@librechat/data-schemas');
56
const {
6-
registerUser,
7-
resetPassword,
8-
setAuthTokens,
97
requestPasswordReset,
108
setOpenIDAuthTokens,
9+
resetPassword,
10+
setAuthTokens,
11+
registerUser,
1112
} = require('~/server/services/AuthService');
1213
const { findUser, getUserById, deleteAllUserSessions, findSession } = require('~/models');
1314
const { getOpenIdConfig } = require('~/strategies');
14-
const { isEnabled } = require('~/server/utils');
1515

1616
const registrationController = async (req, res) => {
1717
try {

api/server/controllers/EditController.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const { sendEvent } = require('@librechat/api');
2+
const { logger } = require('@librechat/data-schemas');
13
const { getResponseSender } = require('librechat-data-provider');
24
const {
35
handleAbortError,
@@ -10,9 +12,8 @@ const {
1012
clientRegistry,
1113
requestDataMap,
1214
} = require('~/server/cleanup');
13-
const { sendMessage, createOnProgress } = require('~/server/utils');
15+
const { createOnProgress } = require('~/server/utils');
1416
const { saveMessage } = require('~/models');
15-
const { logger } = require('~/config');
1617

1718
const EditController = async (req, res, next, initializeClient) => {
1819
let {
@@ -198,7 +199,7 @@ const EditController = async (req, res, next, initializeClient) => {
198199
const finalUserMessage = reqDataContext.userMessage;
199200
const finalResponseMessage = { ...response };
200201

201-
sendMessage(res, {
202+
sendEvent(res, {
202203
final: true,
203204
conversation,
204205
title: conversation.title,

api/server/controllers/agents/errors.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// errorHandler.js
2-
const { logger } = require('~/config');
3-
const getLogStores = require('~/cache/getLogStores');
2+
const { logger } = require('@librechat/data-schemas');
43
const { CacheKeys, ViolationTypes } = require('librechat-data-provider');
4+
const { sendResponse } = require('~/server/middleware/error');
55
const { recordUsage } = require('~/server/services/Threads');
66
const { getConvo } = require('~/models/Conversation');
7-
const { sendResponse } = require('~/server/utils');
7+
const getLogStores = require('~/cache/getLogStores');
88

99
/**
1010
* @typedef {Object} ErrorHandlerContext
@@ -75,7 +75,7 @@ const createErrorHandler = ({ req, res, getContext, originPath = '/assistants/ch
7575
} else if (/Files.*are invalid/.test(error.message)) {
7676
const errorMessage = `Files are invalid, or may not have uploaded yet.${
7777
endpoint === 'azureAssistants'
78-
? ' If using Azure OpenAI, files are only available in the region of the assistant\'s model at the time of upload.'
78+
? " If using Azure OpenAI, files are only available in the region of the assistant's model at the time of upload."
7979
: ''
8080
}`;
8181
return sendResponse(req, res, messageData, errorMessage);

api/server/controllers/agents/request.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
const { sendEvent } = require('@librechat/api');
2+
const { logger } = require('@librechat/data-schemas');
13
const { Constants } = require('librechat-data-provider');
24
const {
35
handleAbortError,
46
createAbortController,
57
cleanupAbortController,
68
} = require('~/server/middleware');
79
const { disposeClient, clientRegistry, requestDataMap } = require('~/server/cleanup');
8-
const { sendMessage } = require('~/server/utils');
910
const { saveMessage } = require('~/models');
10-
const { logger } = require('~/config');
1111

1212
const AgentController = async (req, res, next, initializeClient, addTitle) => {
1313
let {
@@ -206,7 +206,7 @@ const AgentController = async (req, res, next, initializeClient, addTitle) => {
206206
// Create a new response object with minimal copies
207207
const finalResponse = { ...response };
208208

209-
sendMessage(res, {
209+
sendEvent(res, {
210210
final: true,
211211
conversation,
212212
title: conversation.title,

api/server/controllers/assistants/chatV1.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
const { v4 } = require('uuid');
2+
const { sleep } = require('@librechat/agents');
3+
const { sendEvent } = require('@librechat/api');
4+
const { logger } = require('@librechat/data-schemas');
25
const {
36
Time,
47
Constants,
@@ -19,20 +22,20 @@ const {
1922
addThreadMetadata,
2023
saveAssistantMessage,
2124
} = require('~/server/services/Threads');
22-
const { sendResponse, sendMessage, sleep, countTokens } = require('~/server/utils');
2325
const { runAssistant, createOnTextProgress } = require('~/server/services/AssistantService');
2426
const validateAuthor = require('~/server/middleware/assistants/validateAuthor');
2527
const { formatMessage, createVisionPrompt } = require('~/app/clients/prompts');
2628
const { createRun, StreamRunManager } = require('~/server/services/Runs');
2729
const { addTitle } = require('~/server/services/Endpoints/assistants');
2830
const { createRunBody } = require('~/server/services/createRunBody');
31+
const { sendResponse } = require('~/server/middleware/error');
2932
const { getTransactions } = require('~/models/Transaction');
3033
const { checkBalance } = require('~/models/balanceMethods');
3134
const { getConvo } = require('~/models/Conversation');
3235
const getLogStores = require('~/cache/getLogStores');
36+
const { countTokens } = require('~/server/utils');
3337
const { getModelMaxTokens } = require('~/utils');
3438
const { getOpenAIClient } = require('./helpers');
35-
const { logger } = require('~/config');
3639

3740
/**
3841
* @route POST /
@@ -471,7 +474,7 @@ const chatV1 = async (req, res) => {
471474
await Promise.all(promises);
472475

473476
const sendInitialResponse = () => {
474-
sendMessage(res, {
477+
sendEvent(res, {
475478
sync: true,
476479
conversationId,
477480
// messages: previousMessages,
@@ -587,7 +590,7 @@ const chatV1 = async (req, res) => {
587590
iconURL: endpointOption.iconURL,
588591
};
589592

590-
sendMessage(res, {
593+
sendEvent(res, {
591594
final: true,
592595
conversation,
593596
requestMessage: {

api/server/controllers/assistants/chatV2.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
const { v4 } = require('uuid');
2+
const { sleep } = require('@librechat/agents');
3+
const { sendEvent } = require('@librechat/api');
4+
const { logger } = require('@librechat/data-schemas');
25
const {
36
Time,
47
Constants,
@@ -22,15 +25,14 @@ const { createErrorHandler } = require('~/server/controllers/assistants/errors')
2225
const validateAuthor = require('~/server/middleware/assistants/validateAuthor');
2326
const { createRun, StreamRunManager } = require('~/server/services/Runs');
2427
const { addTitle } = require('~/server/services/Endpoints/assistants');
25-
const { sendMessage, sleep, countTokens } = require('~/server/utils');
2628
const { createRunBody } = require('~/server/services/createRunBody');
2729
const { getTransactions } = require('~/models/Transaction');
2830
const { checkBalance } = require('~/models/balanceMethods');
2931
const { getConvo } = require('~/models/Conversation');
3032
const getLogStores = require('~/cache/getLogStores');
33+
const { countTokens } = require('~/server/utils');
3134
const { getModelMaxTokens } = require('~/utils');
3235
const { getOpenAIClient } = require('./helpers');
33-
const { logger } = require('~/config');
3436

3537
/**
3638
* @route POST /
@@ -309,7 +311,7 @@ const chatV2 = async (req, res) => {
309311
await Promise.all(promises);
310312

311313
const sendInitialResponse = () => {
312-
sendMessage(res, {
314+
sendEvent(res, {
313315
sync: true,
314316
conversationId,
315317
// messages: previousMessages,
@@ -432,7 +434,7 @@ const chatV2 = async (req, res) => {
432434
iconURL: endpointOption.iconURL,
433435
};
434436

435-
sendMessage(res, {
437+
sendEvent(res, {
436438
final: true,
437439
conversation,
438440
requestMessage: {

0 commit comments

Comments
 (0)