feat: add queryhook layer and invalidation so we keep tokens fresh during conversation turns

This commit is contained in:
Dustin Healy 2025-08-21 01:38:34 -07:00
parent 637bbd2e29
commit c1b0f13360
2 changed files with 58 additions and 1 deletions

View file

@ -32,6 +32,20 @@ import type {
} from 'librechat-data-provider';
import type { ConversationCursorData } from '~/utils/convos';
import { findConversationInInfinite } from '~/utils';
type TConversationCosts = {
conversationId: string;
totals: {
prompt: { usd: number; tokenCount: number };
completion: { usd: number; tokenCount: number };
total: { usd: number; tokenCount: number };
};
perMessage: Array<{
messageId: string;
tokenType: 'prompt' | 'completion';
tokenCount: number;
usd: number;
}>;
};
export const useGetPresetsQuery = (
config?: UseQueryOptions<TPreset[]>,
@ -76,6 +90,25 @@ export const useGetConvoIdQuery = (
);
};
export const useGetConversationCosts = (
conversationId: string,
config?: UseQueryOptions<TConversationCosts>,
): QueryObserverResult<TConversationCosts> => {
return useQuery<TConversationCosts>(
[QueryKeys.conversation, conversationId, 'costs'],
() => {
return dataService.getConversationCosts(conversationId) as unknown as TConversationCosts;
},
{
refetchOnWindowFocus: false,
refetchOnReconnect: false,
refetchOnMount: false,
enabled: !!conversationId && conversationId !== 'new',
...config,
},
);
};
export const useConversationsInfiniteQuery = (
params: ConversationListParams,
config?: UseInfiniteQueryOptions<ConversationListResponse, unknown>,

View file

@ -232,8 +232,14 @@ export default function useEventHandlers({
},
]);
}
if (userMessage?.conversationId) {
queryClient.invalidateQueries({
queryKey: [QueryKeys.conversation, userMessage.conversationId, 'costs'],
});
}
},
[setMessages, announcePolite, setIsSubmitting],
[setMessages, announcePolite, setIsSubmitting, queryClient],
);
const cancelHandler = useCallback(
@ -275,6 +281,12 @@ export default function useEventHandlers({
});
}
if (convoUpdate?.conversationId) {
queryClient.invalidateQueries({
queryKey: [QueryKeys.conversation, convoUpdate.conversationId, 'costs'],
});
}
setIsSubmitting(false);
},
[setMessages, setConversation, genTitle, isAddedRequest, queryClient, setIsSubmitting],
@ -341,6 +353,12 @@ export default function useEventHandlers({
if (resetLatestMessage) {
resetLatestMessage();
}
if (conversationId) {
queryClient.invalidateQueries({
queryKey: [QueryKeys.conversation, conversationId, 'costs'],
});
}
},
[
queryClient,
@ -527,6 +545,12 @@ export default function useEventHandlers({
);
}
if (conversation.conversationId) {
queryClient.invalidateQueries({
queryKey: [QueryKeys.conversation, conversation.conversationId, 'costs'],
});
}
if (isNewConvo && submissionConvo.conversationId) {
removeConvoFromAllQueries(queryClient, submissionConvo.conversationId);
}