mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-19 09:50:15 +01:00
🧠 feat: Prompt caching switch, prompt query params; refactor: static cache, prompt/markdown styling, trim copied code, switch new chat to convo URL (#3784)
* refactor: Update staticCache to use oneDayInSeconds for sMaxAge and maxAge * refactor: role updates * style: first pass cursor * style: Update nested list styles in style.css * feat: setIsSubmitting to true in message handler to prevent edge case where submitting turns false during message stream * feat: Add logic to redirect to conversation page after creating a new conversation * refactor: Trim code string before copying in CodeBlock component * feat: configSchema bookmarks and presets defaults * feat: Update loadDefaultInterface to handle undefined config * refactor: use for compression check * feat: first pass, query params * fix: styling issues for prompt cards * feat: anthropic prompt caching UI switch * chore: Update static file cache control defaults/comments in .env.example * ci: fix tests * ci: fix tests * chore: use "submitting" class server error connection suspense fallback
This commit is contained in:
parent
bd701c197e
commit
5694ad4e55
31 changed files with 519 additions and 112 deletions
|
|
@ -3,6 +3,7 @@ export { default as useUserKey } from './useUserKey';
|
|||
export { default as useDebounce } from './useDebounce';
|
||||
export { default as useTextarea } from './useTextarea';
|
||||
export { default as useCombobox } from './useCombobox';
|
||||
export { default as useQueryParams } from './useQueryParams';
|
||||
export { default as useHandleKeyUp } from './useHandleKeyUp';
|
||||
export { default as useRequiresKey } from './useRequiresKey';
|
||||
export { default as useMultipleKeys } from './useMultipleKeys';
|
||||
|
|
|
|||
66
client/src/hooks/Input/useQueryParams.ts
Normal file
66
client/src/hooks/Input/useQueryParams.ts
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
import { useEffect, useRef } from 'react';
|
||||
import { useSearchParams } from 'react-router-dom';
|
||||
import { useChatFormContext } from '~/Providers';
|
||||
|
||||
export default function useQueryParams({
|
||||
textAreaRef,
|
||||
}: {
|
||||
textAreaRef: React.RefObject<HTMLTextAreaElement>;
|
||||
}) {
|
||||
const methods = useChatFormContext();
|
||||
const [searchParams] = useSearchParams();
|
||||
const attemptsRef = useRef(0);
|
||||
const processedRef = useRef(false);
|
||||
const maxAttempts = 50; // 5 seconds maximum (50 * 100ms)
|
||||
|
||||
useEffect(() => {
|
||||
const promptParam = searchParams.get('prompt');
|
||||
if (!promptParam) {
|
||||
return;
|
||||
}
|
||||
|
||||
const decodedPrompt = decodeURIComponent(promptParam);
|
||||
|
||||
const intervalId = setInterval(() => {
|
||||
// If already processed or max attempts reached, clear interval and stop
|
||||
if (processedRef.current || attemptsRef.current >= maxAttempts) {
|
||||
clearInterval(intervalId);
|
||||
if (attemptsRef.current >= maxAttempts) {
|
||||
console.warn('Max attempts reached, failed to process prompt');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
attemptsRef.current += 1;
|
||||
|
||||
if (textAreaRef.current) {
|
||||
const currentText = methods.getValues('text');
|
||||
|
||||
// Only update if the textarea is empty
|
||||
if (!currentText) {
|
||||
methods.setValue('text', decodedPrompt, { shouldValidate: true });
|
||||
textAreaRef.current.focus();
|
||||
textAreaRef.current.setSelectionRange(decodedPrompt.length, decodedPrompt.length);
|
||||
|
||||
// Remove the 'prompt' parameter from the URL
|
||||
searchParams.delete('prompt');
|
||||
const newUrl = `${window.location.pathname}${
|
||||
searchParams.toString() ? `?${searchParams.toString()}` : ''
|
||||
}`;
|
||||
window.history.replaceState({}, '', newUrl);
|
||||
|
||||
processedRef.current = true;
|
||||
console.log('Prompt processed successfully');
|
||||
}
|
||||
|
||||
clearInterval(intervalId);
|
||||
}
|
||||
}, 100); // Check every 100ms
|
||||
|
||||
// Clean up the interval on unmount
|
||||
return () => {
|
||||
clearInterval(intervalId);
|
||||
console.log('Cleanup: interval cleared');
|
||||
};
|
||||
}, [searchParams, methods, textAreaRef]);
|
||||
}
|
||||
|
|
@ -86,6 +86,7 @@ export default function useEventHandlers({
|
|||
isRegenerate = false,
|
||||
} = submission;
|
||||
const text = data ?? '';
|
||||
setIsSubmitting(true);
|
||||
if (text.length > 0) {
|
||||
announcePolite({
|
||||
message: text,
|
||||
|
|
@ -118,7 +119,7 @@ export default function useEventHandlers({
|
|||
]);
|
||||
}
|
||||
},
|
||||
[setMessages, announcePolite],
|
||||
[setMessages, announcePolite, setIsSubmitting],
|
||||
);
|
||||
|
||||
const cancelHandler = useCallback(
|
||||
|
|
@ -387,6 +388,10 @@ export default function useEventHandlers({
|
|||
}
|
||||
|
||||
if (setConversation && isAddedRequest !== true) {
|
||||
if (window.location.pathname === '/c/new') {
|
||||
window.history.pushState({}, '', '/c/' + conversation.conversationId);
|
||||
}
|
||||
|
||||
setConversation((prevState) => {
|
||||
const update = {
|
||||
...prevState,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue