mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-08-04 14:57:42 +00:00
fix: cap shared-link expiry at source conversation and enforce retention on assistant saves
getSharedLinkExpiration starts a brand-new retention window when the source conversation still has an active expiration, letting a share outlive the conversation whose messages it embeds. Cap the share at the earlier of the source expiration and a freshly created window, and fall back to the source expiration when window creation fails. The Assistants chat path saved messages via recordMessage, which bypasses retention, while saveConvo forced the conversation temporary. In ephemeral mode the conversation expired but its messages persisted with no expiredAt. Route saveUserMessage, saveAssistantMessage and syncMessages through saveMessage so messages inherit the same forced retention as the conversation.
This commit is contained in:
parent
b9eaca23dd
commit
775a4ef935
4 changed files with 231 additions and 37 deletions
|
|
@ -8,7 +8,7 @@ const {
|
|||
AnnotationTypes,
|
||||
defaultOrderQuery,
|
||||
} = require('librechat-data-provider');
|
||||
const { recordMessage, getMessages, spendTokens, saveConvo } = require('~/models');
|
||||
const { saveMessage, getMessages, spendTokens, saveConvo } = require('~/models');
|
||||
const { retrieveAndProcessFile } = require('~/server/services/Files/process');
|
||||
|
||||
/**
|
||||
|
|
@ -90,16 +90,17 @@ async function saveUserMessage(req, params) {
|
|||
convo.file_ids = params.file_ids;
|
||||
}
|
||||
|
||||
const message = await recordMessage(userMessage);
|
||||
await saveConvo(
|
||||
{
|
||||
userId: req?.user?.id,
|
||||
isTemporary: req?.body?.isTemporary,
|
||||
interfaceConfig: req?.config?.interfaceConfig,
|
||||
},
|
||||
convo,
|
||||
{ context: 'api/server/services/Threads/manage.js #saveUserMessage' },
|
||||
);
|
||||
const retentionContext = {
|
||||
userId: req?.user?.id,
|
||||
isTemporary: req?.body?.isTemporary,
|
||||
interfaceConfig: req?.config?.interfaceConfig,
|
||||
};
|
||||
const message = await saveMessage(retentionContext, userMessage, {
|
||||
context: 'api/server/services/Threads/manage.js #saveUserMessage',
|
||||
});
|
||||
await saveConvo(retentionContext, convo, {
|
||||
context: 'api/server/services/Threads/manage.js #saveUserMessage',
|
||||
});
|
||||
return message;
|
||||
}
|
||||
|
||||
|
|
@ -128,31 +129,36 @@ async function saveUserMessage(req, params) {
|
|||
async function saveAssistantMessage(req, params) {
|
||||
// const tokenCount = // TODO: need to count each content part
|
||||
|
||||
const message = await recordMessage({
|
||||
user: params.user,
|
||||
endpoint: params.endpoint,
|
||||
messageId: params.messageId,
|
||||
conversationId: params.conversationId,
|
||||
parentMessageId: params.parentMessageId,
|
||||
thread_id: params.thread_id,
|
||||
/* For messages, use the assistant_id instead of model */
|
||||
model: params.assistant_id,
|
||||
content: params.content,
|
||||
sender: 'Assistant',
|
||||
isCreatedByUser: false,
|
||||
text: params.text,
|
||||
unfinished: false,
|
||||
// tokenCount,
|
||||
iconURL: params.iconURL,
|
||||
spec: params.spec,
|
||||
});
|
||||
const retentionContext = {
|
||||
userId: req?.user?.id,
|
||||
isTemporary: req?.body?.isTemporary,
|
||||
interfaceConfig: req?.config?.interfaceConfig,
|
||||
};
|
||||
const message = await saveMessage(
|
||||
retentionContext,
|
||||
{
|
||||
user: params.user,
|
||||
endpoint: params.endpoint,
|
||||
messageId: params.messageId,
|
||||
conversationId: params.conversationId,
|
||||
parentMessageId: params.parentMessageId,
|
||||
thread_id: params.thread_id,
|
||||
/* For messages, use the assistant_id instead of model */
|
||||
model: params.assistant_id,
|
||||
content: params.content,
|
||||
sender: 'Assistant',
|
||||
isCreatedByUser: false,
|
||||
text: params.text,
|
||||
unfinished: false,
|
||||
// tokenCount,
|
||||
iconURL: params.iconURL,
|
||||
spec: params.spec,
|
||||
},
|
||||
{ context: 'api/server/services/Threads/manage.js #saveAssistantMessage' },
|
||||
);
|
||||
|
||||
await saveConvo(
|
||||
{
|
||||
userId: req?.user?.id,
|
||||
isTemporary: req?.body?.isTemporary,
|
||||
interfaceConfig: req?.config?.interfaceConfig,
|
||||
},
|
||||
retentionContext,
|
||||
{
|
||||
endpoint: params.endpoint,
|
||||
conversationId: params.conversationId,
|
||||
|
|
@ -236,7 +242,17 @@ async function syncMessages({
|
|||
* @param {dbMessage} params.apiMessage
|
||||
*/
|
||||
const processNewMessage = async ({ dbMessage, apiMessage }) => {
|
||||
recordPromises.push(recordMessage({ ...dbMessage, user: openai.req.user.id }));
|
||||
recordPromises.push(
|
||||
saveMessage(
|
||||
{
|
||||
userId: openai.req?.user?.id,
|
||||
isTemporary: openai.req?.body?.isTemporary,
|
||||
interfaceConfig: openai.req?.config?.interfaceConfig,
|
||||
},
|
||||
{ ...dbMessage, user: openai.req.user.id },
|
||||
{ context: 'api/server/services/Threads/manage.js #syncMessages' },
|
||||
),
|
||||
);
|
||||
|
||||
if (!apiMessage.id.includes('msg_')) {
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue