mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 00:40:14 +01:00
✨ feat: Enhance token usage computation with improved message handling and context management
This commit is contained in:
parent
e0610b0d14
commit
0420ed2e68
3 changed files with 27 additions and 7 deletions
|
|
@ -806,7 +806,6 @@ class BaseClient {
|
||||||
user,
|
user,
|
||||||
);
|
);
|
||||||
this.savedMessageIds.add(responseMessage.messageId);
|
this.savedMessageIds.add(responseMessage.messageId);
|
||||||
delete responseMessage.tokenCount;
|
|
||||||
return responseMessage;
|
return responseMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -240,6 +240,8 @@ class AgentClient extends BaseClient {
|
||||||
Object.assign(
|
Object.assign(
|
||||||
{
|
{
|
||||||
endpoint: this.options.endpoint,
|
endpoint: this.options.endpoint,
|
||||||
|
endpointType: this.options.endpointType,
|
||||||
|
model: this.options.agent?.model_parameters?.model,
|
||||||
agent_id: this.options.agent.id,
|
agent_id: this.options.agent.id,
|
||||||
modelLabel: this.options.modelLabel,
|
modelLabel: this.options.modelLabel,
|
||||||
maxContextTokens: this.options.maxContextTokens,
|
maxContextTokens: this.options.maxContextTokens,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import { useEffect, useMemo } from 'react';
|
import { useEffect, useMemo } from 'react';
|
||||||
|
import { useParams } from 'react-router-dom';
|
||||||
import { useSetAtom, useAtomValue } from 'jotai';
|
import { useSetAtom, useAtomValue } from 'jotai';
|
||||||
import type { TMessage } from 'librechat-data-provider';
|
|
||||||
import { getModelMaxTokens } from 'librechat-data-provider';
|
import { getModelMaxTokens } from 'librechat-data-provider';
|
||||||
|
import type { TMessage } from 'librechat-data-provider';
|
||||||
import { tokenUsageAtom, type TokenUsage } from '~/store/tokenUsage';
|
import { tokenUsageAtom, type TokenUsage } from '~/store/tokenUsage';
|
||||||
import { useGetMessagesByConvoId } from '~/data-provider';
|
import { useGetMessagesByConvoId } from '~/data-provider';
|
||||||
import { useChatContext } from '~/Providers';
|
import { useChatContext } from '~/Providers';
|
||||||
|
|
@ -14,19 +15,37 @@ export function useTokenUsageComputation() {
|
||||||
const { conversation } = useChatContext();
|
const { conversation } = useChatContext();
|
||||||
const conversationId = conversation?.conversationId ?? '';
|
const conversationId = conversation?.conversationId ?? '';
|
||||||
const setTokenUsage = useSetAtom(tokenUsageAtom);
|
const setTokenUsage = useSetAtom(tokenUsageAtom);
|
||||||
|
const { conversationId: paramId } = useParams();
|
||||||
|
|
||||||
|
// Determine the query key to use - same logic as useChatHelpers
|
||||||
|
const queryParam = paramId === 'new' ? paramId : conversationId || paramId || '';
|
||||||
|
|
||||||
// Use the query hook to get reactive messages
|
// Use the query hook to get reactive messages
|
||||||
const { data: messages } = useGetMessagesByConvoId(conversationId, {
|
// Subscribe to both the paramId-based key and conversationId-based key
|
||||||
enabled: !!conversationId && conversationId !== 'new',
|
const { data: messages } = useGetMessagesByConvoId(queryParam, {
|
||||||
|
enabled: !!queryParam,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Also subscribe to the actual conversationId if different from queryParam
|
||||||
|
// This ensures we get updates when conversation transitions from 'new' to actual ID
|
||||||
|
const { data: messagesById } = useGetMessagesByConvoId(conversationId, {
|
||||||
|
enabled: !!conversationId && conversationId !== 'new' && conversationId !== queryParam,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Use whichever has more messages (handles transition from new -> actual ID)
|
||||||
|
const effectiveMessages = useMemo(() => {
|
||||||
|
const msgArray = messages ?? [];
|
||||||
|
const msgByIdArray = messagesById ?? [];
|
||||||
|
return msgByIdArray.length > msgArray.length ? msgByIdArray : msgArray;
|
||||||
|
}, [messages, messagesById]);
|
||||||
|
|
||||||
// Compute token usage whenever messages change
|
// Compute token usage whenever messages change
|
||||||
const tokenData = useMemo(() => {
|
const tokenData = useMemo(() => {
|
||||||
let inputTokens = 0;
|
let inputTokens = 0;
|
||||||
let outputTokens = 0;
|
let outputTokens = 0;
|
||||||
|
|
||||||
if (messages && Array.isArray(messages)) {
|
if (effectiveMessages && Array.isArray(effectiveMessages)) {
|
||||||
for (const msg of messages as TMessage[]) {
|
for (const msg of effectiveMessages as TMessage[]) {
|
||||||
const count = msg.tokenCount ?? 0;
|
const count = msg.tokenCount ?? 0;
|
||||||
if (msg.isCreatedByUser) {
|
if (msg.isCreatedByUser) {
|
||||||
inputTokens += count;
|
inputTokens += count;
|
||||||
|
|
@ -54,7 +73,7 @@ export function useTokenUsageComputation() {
|
||||||
maxContext,
|
maxContext,
|
||||||
};
|
};
|
||||||
}, [
|
}, [
|
||||||
messages,
|
effectiveMessages,
|
||||||
conversation?.maxContextTokens,
|
conversation?.maxContextTokens,
|
||||||
conversation?.model,
|
conversation?.model,
|
||||||
conversation?.endpoint,
|
conversation?.endpoint,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue