💬 feat: Temporary Chats (#5493)

* feat: add expiredAt property to Conversation and Message models

Added `expiredAt` property to both Conversation and Message schemas.
Configured `expireAfterSeconds` index in MongoDB to automatically delete documents after a specified period.

* feat(data-provider): add isTemporary and expiredAt properties to support temporary chats

Added `isTemporary` property to TPayload and TSubmission for API calls for temporary chat.
Additionally, added `expiredAt` property to `tConversationSchema` to determine if a chat is temporary.

* feat: implement isTemporary state management

Add Recoil state for tracking temporary conversations, update event handlers to respect temporary chat status

* feat: add configuration to interfaceconfig to hide the temporary chat switch

* feat: add Temporary Chat UI with switch and modify related behaviors

- Added a Temporary Chat switch button at the end of dropdown lists in each model.
- Updated the form background color to black when Temporary Chat is enabled.
- Modified Navigation to exclude Temporary Chats from the chat list.

* fix: exclude Temporary Chats from search results

Updated the getConvosQueried query to ensure that Temporary Chats are not included in the search results.

* fix: hide bookmark button for Temporary Chats

Updated the UI to ensure that the bookmark button is not displayed when a chat is as Temporary Chat.

* chore: update isTemporary state management in ChatRoute

* chore: fix to pass the tests
This commit is contained in:
Yuichi Oneda 2025-02-06 08:11:47 -08:00 committed by GitHub
parent 5f9543f6fc
commit 8c404ae056
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 185 additions and 13 deletions

View file

@ -455,6 +455,7 @@ export const intefaceSchema = z
presets: z.boolean().optional(),
prompts: z.boolean().optional(),
agents: z.boolean().optional(),
temporaryChat: z.boolean().optional(),
})
.default({
endpointsMenu: true,
@ -466,6 +467,7 @@ export const intefaceSchema = z
bookmarks: true,
prompts: true,
agents: true,
temporaryChat: true,
});
export type TInterfaceConfig = z.infer<typeof intefaceSchema>;

View file

@ -3,7 +3,8 @@ import { EndpointURLs } from './config';
import * as s from './schemas';
export default function createPayload(submission: t.TSubmission) {
const { conversation, userMessage, endpointOption, isEdited, isContinued } = submission;
const { conversation, userMessage, endpointOption, isEdited, isContinued, isTemporary } =
submission;
const { conversationId } = s.tConvoUpdateSchema.parse(conversation);
const { endpoint, endpointType } = endpointOption as {
endpoint: s.EModelEndpoint;
@ -23,6 +24,7 @@ export default function createPayload(submission: t.TSubmission) {
...endpointOption,
isContinued: !!(isEdited && isContinued),
conversationId,
isTemporary,
};
return { server, payload };

View file

@ -590,6 +590,8 @@ export const tConversationSchema = z.object({
greeting: z.string().optional(),
spec: z.string().nullable().optional(),
iconURL: z.string().nullable().optional(),
/* temporary chat */
expiredAt: z.string().nullable().optional(),
/** @deprecated */
resendImages: z.boolean().optional(),
/** @deprecated */

View file

@ -44,6 +44,7 @@ export type TPayload = Partial<TMessage> &
isContinued: boolean;
conversationId: string | null;
messages?: TMessages;
isTemporary: boolean;
};
export type TSubmission = {
@ -53,6 +54,7 @@ export type TSubmission = {
userMessage: TMessage;
isEdited?: boolean;
isContinued?: boolean;
isTemporary: boolean;
messages: TMessage[];
isRegenerate?: boolean;
conversationId?: string;